package weaver.aiyh_pcn.fadada.util; import aiyh.utils.Util; import aiyh.utils.entity.ApiConfigMainDTO; import aiyh.utils.httpUtil.ResponeVo; import aiyh.utils.mapUtil.ParaMap; import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; import aiyh.utils.zwl.common.ToolUtil; import com.api.aiyh_pcn.fadada.dao.FaDDContractMapping; import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; import com.api.aiyh_pcn.fadada.service.impl.FaDDContractService; import com.api.aiyh_pcn.fadada.util.FaDDRequestUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.weaver.general.TimeUtil; import org.h2.util.StringUtils; import weaver.aiyh_pcn.fadada.entity.FileInfo; import weaver.conn.RecordSet; import weaver.file.ImageFileManager; import weaver.formmode.data.ModeDataIdUpdate; import weaver.formmode.setup.ModeRightInfo; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author EBU7-dev1-ayh * @create 2021/11/3 0003 16:50 * heton gonjvlei */ public class FaddContractUtil { private String workflowId; private String requestId; private String mainTableName; private String tableName; private String customerNo; private String contractField; private String queueSigned; private final String contractInfoTable = "uf_contract_info"; private String customerNoField; private List> detailMaps; private Map mainMap; private FaDDContractMapping faDDContractMapping = new FaDDContractMapping(); private FaDDContractService faDDContractService = new FaDDContractService(); private final ToolUtil toolUtil = new ToolUtil(); public FaddContractUtil() { } public FaddContractUtil(String workflowId, String requestId, String mainTableName, String tableName, String customerNo, String customerNoField, String contractField, String queueSigned, List> detailMaps, Map mainMap) { this.workflowId = workflowId; this.requestId = requestId; this.mainTableName = mainTableName; this.tableName = tableName; this.customerNo = customerNo; this.customerNoField = customerNoField; this.contractField = contractField; this.queueSigned = queueSigned; this.detailMaps = detailMaps; this.mainMap = mainMap; } /** * 创建合同 */ public void createContract(Map mainMap) { // 查询配置参数 FaDaDaConfigDTO faDaDaConfigDTO = faDDContractMapping.queryConfig(workflowId, 2); // 查询api配置参数 ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfig(Util.null2String(faDaDaConfigDTO.getParamsConfig())); RecordSet rs = new RecordSet(); List fileInfos = this.contractHandle(this.contractField); List contractNoIds = new ArrayList<>(); List fileNoIds = new ArrayList<>(); List fileName = new ArrayList<>(); if (fileInfos.size() == 0) { toolUtil.writeErrorLog("fileInfos 为空"); } // 多文件的时候会遍历文件去创建合同问文件,但是一个流程只创建一次,一次可能回有多份文件需要创建为合同文件 for (FileInfo fileInfo : fileInfos) { // 发起合同创建 ResponeVo contract = FaDDRequestUtils.createContract(fileInfo, apiConfigMainDTO.getApiUrl()); Map result; try { Map entityMap = contract.getEntityMap(); if (!"200".equals(String.valueOf(entityMap.get("code")))) { toolUtil.writeErrorLog("创建合同失败,错误信息:" + entityMap.get("message")); throw new RuntimeException("创建合同失败!"); } result = (Map) entityMap.get("data"); contractNoIds.add(Util.null2String(result.get("contractNo"))); fileNoIds.add(Util.null2String(result.get("fileNo"))); fileName.add(fileInfo.getImagefilename()); } catch (JsonProcessingException e) { toolUtil.writeErrorLog(e.toString()); throw new RuntimeException("创建合同失败!"); } } // 创建合同文件成功之后收集合同编号,文件编号和合同文件的名字 String joinContract = String.join(",", contractNoIds); String joinFileNoIds = String.join(",", fileNoIds); String joinFileName = String.join(",", fileName); /* TODO 主表创建字段 contract_no(合同编号)、file_no(文件编号)、file_name(文件名称) TODO 明细表添加字段,signed_status(合同方签署状态) */ // 将合同的基本信息更新到流程主表中保存 Map updateMap = ParaMap.create().put("contract_no", joinContract) .put("file_no", joinFileNoIds) .put("file_name", joinFileName); PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(this.mainTableName, updateMap, Util.createPrepWhereImpl().whereAnd("id").whereEqual(mainMap.get("id"))); toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); // 将合同信息和流程表信息保存到自定义的建模表中 updateMap.put("workflow_type", workflowId); updateMap.put("workflow_request_id", requestId); updateMap.put("workflow_main_table", mainTableName); updateMap.put("workflow_detail_table", tableName); // 1表示创建 2表示等待对方签署,3表示等待本方签署,4表示完成 updateMap.put("contract_status", 1); // 对方应该签署的数量 updateMap.put("should_signed_num", detailMaps.size()); // 现在已经签署的数量 updateMap.put("signed_num", 0); updateMap.put("signed_type", 3); updateMap.put("main_id", String.valueOf(mainMap.get("id"))); updateMap.put("queue_signed", "true".equals(queueSigned) ? 1 : 0); updateMap.put("single_contract_file_num", contractNoIds.size()); // 如果需要控制签署规则 if (faDaDaConfigDTO.getSignedType() == 1) { // 需要控制签署规则 if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOwn()) { // 只需要本方签署 updateMap.put("contract_status", 3); // 对方应该签署的数量 updateMap.put("should_signed_num", 0); // 现在已经签署的数量 updateMap.put("signed_num", 0); updateMap.put("queue_signed", 0); updateMap.put("signed_type", 1); } if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { updateMap.put("signed_type", 2); } } // 查询合同信息中,是否存在该信息,如果存在着更新,不存在则插入 String query = "select * from " + contractInfoTable + " where workflow_request_id = ?"; rs.executeQuery(query, requestId); String formModeId = "52"; if (rs.next()) { sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, updateMap, Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); // 权限重构 ModeRightInfo mri = new ModeRightInfo(); int dataId = rs.getInt("id"); toolUtil.writeDebuggerLog("id:" + dataId); mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), dataId); } else { ModeDataIdUpdate mdu = ModeDataIdUpdate.getInstance(); int dataId = mdu.getModeDataNewId(contractInfoTable, Util.getIntValue(formModeId, -1), 1, 0, TimeUtil.getCurrentDateString(), TimeUtil.getOnlyCurrentTimeString()); sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, updateMap, Util.createPrepWhereImpl().whereAnd("id").whereEqual(dataId)); toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); ModeRightInfo mri = new ModeRightInfo(); mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), dataId); } } /** * 处理合同创建数据 * * @param contractField * @return */ public List contractHandle(String contractField) { String fileIds = Util.null2String(this.mainMap.get(contractField)); // 如果没有合同字段的数据,则返回一个空的 if ("".equals(fileIds)) { return new ArrayList<>(); } List fileInfos = faDDContractMapping.queryImgFileIdByDocIds(fileIds); String customer = customerNo; // 查询创建合同的企业编号 if (StringUtils.isNullOrEmpty(customerNo)) { toolUtil.writeErrorLog("创建合同失败,失败原因:customerNo 为空!"); } // 处理数据信息 for (FileInfo fileInfo : fileInfos) { InputStream inputStreamById = ImageFileManager.getInputStreamById(fileInfo.getImagefileid()); fileInfo.setFile(inputStreamById); String imagefilename = fileInfo.getImagefilename(); if (imagefilename == null) { return new ArrayList<>(); } fileInfo.setContractExtension(imagefilename.substring(imagefilename.lastIndexOf("."))); fileInfo.setContractTitle(imagefilename); fileInfo.setCustomerNo(Util.null2String(customer)); if (StringUtils.isNullOrEmpty(fileInfo.getCustomerNo())) { toolUtil.writeErrorLog("创建合同失败,失败原因,customer!"); // fileInfo.setCustomerNo(Util.null2String(detail.get("companyno"))); } fileInfo.setUploadType(1); } return fileInfos; } /** * 签署合同 */ public void signedContract(Map mainMap) { // 获取配置表信息 FaDaDaConfigDTO faDaDaConfigDTO = faDDContractMapping.queryConfig(workflowId, 3); // 查询接口配置树形结构 ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfigTree(faDaDaConfigDTO.getParamsConfig()); // 查询签署数据 List> dataArr = faDDContractService.getDataArr(requestId, workflowId, mainTableName, tableName); // 处理数据 List> maps = faDDContractService.objectAndListHandle(apiConfigMainDTO.getDetails(), dataArr); if (maps == null) { toolUtil.writeErrorLog("签署合同错误,错误原因:maps为null!"); throw new RuntimeException("签署合同错误,错误原因:maps为null!"); } if (maps.size() == 0) { return; } RecordSet rs = new RecordSet(); Map update = new HashMap<>(); // 顺序签署合同 if ("true".equals(queueSigned)) { Map map = maps.get(0); if (faDaDaConfigDTO.getSignedType() == 1) { // 需要控制签署规则 if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { // 只需要对方签署 map.put("autoArchive", 1); } // 双方签署 } signedRequest(map, apiConfigMainDTO); // 将合同签署信息更新到合同信息表中 update.put("contract_status", 2); // update.put("single_signed_num",0); PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, update, Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); update.clear(); // 更新明细表合同信息 TODO 明细表添加字段,signed_status(合同方签署状态) // 签署状态,1 已发送待签署,2 已签蜀 update.put("signed_status", 1); sqlResult = Util.createSqlBuilder().updateSql(tableName, update, Util.createPrepWhereImpl().whereAnd("id").whereEqual(String.valueOf(map.get("id")))); rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); return; } // 不是顺序签署 for (Map map : maps) { if (faDaDaConfigDTO.getSignedType() == 1) { // 需要控制签署规则 if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { // 只需要对方签署 map.put("autoArchive", 1); } // 双方签署 } signedRequest(map, apiConfigMainDTO); } // 将合同签署信息更新到合同信息表中 update.put("contract_status", 2); PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, update, Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); } /** * 合同签署发送请求 * * @param map * @param apiConfigMainDTO */ private void signedRequest(Map map, ApiConfigMainDTO apiConfigMainDTO) { String contractNos = Util.null2String(map.get("contractNo")); String[] split = contractNos.split(","); // RecordSet rs = new RecordSet(); for (String s : split) { map.put("contractNo", s); ResponeVo responeVo = FaDDRequestUtils.signedContract(map, apiConfigMainDTO.getApiUrl()); Map response = null; try { response = responeVo.getEntityMap(); } catch (JsonProcessingException e) { e.printStackTrace(); } if (!"200".equals(response.get("code"))) { toolUtil.writeErrorLog("法大大接口签署合同失败!"); throw new RuntimeException("法大大接口签署合同失败!"); } } } @Override public String toString() { return "FaddContractUtil{" + "workflowId='" + workflowId + '\'' + ", requestId='" + requestId + '\'' + ", mainTableName='" + mainTableName + '\'' + ", tableName='" + tableName + '\'' + ", customerNo='" + customerNo + '\'' + ", contractField='" + contractField + '\'' + ", queueSigned='" + queueSigned + '\'' + ", contractInfoTable='" + contractInfoTable + '\'' + ", customerNoField='" + customerNoField + '\'' + ", detailMaps=" + detailMaps + ", mainMap=" + mainMap + '}'; } public String getWorkflowId() { return workflowId; } public void setWorkflowId(String workflowId) { this.workflowId = workflowId; } public String getRequestId() { return requestId; } public void setRequestId(String requestId) { this.requestId = requestId; } public String getMainTableName() { return mainTableName; } public void setMainTableName(String mainTableName) { this.mainTableName = mainTableName; } public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } }