Bläddra i källkod

电子签自动落印代码调整,采购服务合同会签推送

fyz 3 veckor sedan
förälder
incheckning
d6304ee8c9

+ 17 - 2
mjava-sdzl/src/main/java/com/malk/sdzl/controller/ECController.java

@@ -6,6 +6,7 @@ package com.malk.sdzl.controller;
 
 import com.malk.sdzl.entity.commission.master.*;
 import com.malk.sdzl.service.CommissionService;
+import com.malk.sdzl.service.EqbService;
 import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 import com.malk.server.common.McREnum;
@@ -26,7 +27,8 @@ import java.util.Map;
 @RestController
 @RequestMapping
 public class ECController {
-
+    @Autowired
+    private EqbService eqbService;
     @Autowired
     private YDService ydService;
     @Autowired
@@ -44,7 +46,20 @@ public class ECController {
         Object result = commissionService.startProjectCountersign(projectCountersign);
         return McR.success(result);
     }
-
+    /**
+     * 上传合同并发起签署,完整路径需加上server.servlet.context-path。
+     * 表单模式通过JSON传入formUuid和formInstanceId,前者匹配参与方字段配置,后者查询宜搭实例。
+     * 根据各方编号查询相对方登记信息生成signers;签署配置沿用服务层默认值。
+     * 下载并上传宜搭附件,全部就绪后合并发起一次签署。
+     * 也支持原有fileName方式,直接读取服务器配置目录内的文件。
+     *
+     * @param params 上传及签署参数,字段约定见EqbService.uploadFile
+     * @return McR业务结果;调用方应检查success及code,成功后读取data.signFlowId
+     */
+    @PostMapping("/uploadFile")
+    public McR uploadFile(@RequestBody Map<String, Object> params) {
+        return eqbService.uploadFile(params);
+    }
     @PostMapping(value = "startSettlementBook")
     McR startSettlementBook(@RequestBody SettlementBook settlementBook , HttpServletRequest request) {
         log.info("开始执行共享经济结算书申请单流程发起操作");

+ 13 - 0
mjava-sdzl/src/main/java/com/malk/sdzl/entity/dto/YqbSupplierFormPushRequest.java

@@ -12,4 +12,17 @@ public class YqbSupplierFormPushRequest implements Serializable {
 
     /** 宜搭供应商表单实例 ID。 */
     private String formInstanceId;
+
+    /**
+     * 推送类型:新增或变更。新增时不传 oldItemCode;变更时 oldItemCode 必填。
+     */
+    private String type;
+
+    /**
+     * 变更前的供应商辅助选项编码;type 为“变更”时必填。
+     */
+    private String oldItemCode;
+
+    public static final String TYPE_ADD = "新增";
+    public static final String TYPE_CHANGE = "变更";
 }

+ 40 - 37
mjava-sdzl/src/main/java/com/malk/sdzl/service/Impl/EqbServiceImpl.java

@@ -54,7 +54,7 @@ public class EqbServiceImpl implements EqbService {
     private static final long FILE_STATUS_POLL_INTERVAL_MILLIS = 3000;
     private static final long FILE_STATUS_POLL_TIMEOUT_MILLIS = 90000;
     private static final String TEMPORARY_URL_ATTACHMENT_FIELD = "attachmentField_mrkcwgh7";
-    private static final String DIRECT_URL_ATTACHMENT_FIELD = "attachmentField_msv7rz7m";
+    private static final String DIRECT_URL_ATTACHMENT_FIELD = "attachmentField_mr1tqpgz";
     private static final List<String> FORM_SIGNER_PARTIES =
             Collections.unmodifiableList(Arrays.asList("甲方", "乙方"));
     private static final String OUR_PARTY = "乙方";
@@ -220,7 +220,7 @@ public class EqbServiceImpl implements EqbService {
                 FormAttachment attachment = attachments.get(i);
                 stage = "下载附件:" + attachment.fileName;
                 String downloadUrl = attachment.downloadUrl;
-                if (TEMPORARY_URL_ATTACHMENT_FIELD.equals(attachment.fieldId)) {
+                if (DIRECT_URL_ATTACHMENT_FIELD.equals(attachment.fieldId)) {
                     // 宜搭原生附件需先换取临时免登地址,第二个组件直接使用其下载地址。
                     downloadUrl = ydClient.convertTemporaryUrl(downloadUrl, appType, systemToken);
                     if (!hasText(downloadUrl)) {
@@ -262,15 +262,15 @@ public class EqbServiceImpl implements EqbService {
                 fileResult.put("signFlowId", signFlowId);
                 fileResult.put("status", "SIGN_FLOW_CREATED");
             }
-            ydClient.operateData(YDParam.builder()
-                    .appType(appType)
-                    .systemToken(systemToken)
-//                    .formInstanceId(request.getInstanceId())
-                    .formUuid("FORM-3C73F8BB960244DE841E2DFD6B0A2818V7H5")
-//                    .useLatestVersion(true)
-                    .formDataJson(JSON.toJSONString(UtilMap.map("textField_mte3s2rf, textField_mte6b6fs, radioField_mte6b6fw",
-                            signFlowId, formInstance, "否")))
-                    .build(), YDConf.FORM_OPERATION.create);
+//            ydClient.operateData(YDParam.builder()
+//                    .appType(appType)
+//                    .systemToken(systemToken)
+////                    .formInstanceId(request.getInstanceId())
+//                    .formUuid("FORM-3C73F8BB960244DE841E2DFD6B0A2818V7H5")
+////                    .useLatestVersion(true)
+//                    .formDataJson(JSON.toJSONString(UtilMap.map("textField_mte3s2rf, textField_mte6b6fs, radioField_mte6b6fw",
+//                            signFlowId, formInstance, "否")))
+//                    .build(), YDConf.FORM_OPERATION.create);
             return McR.success(resultData);
         } catch (Exception e) {
             LOG.error("宜搭附件处理失败,阶段:{}", stage, e);
@@ -366,8 +366,8 @@ public class EqbServiceImpl implements EqbService {
     protected JSONArray buildFormSigners(String formUuid, Map formData) {
 
         JSONArray signers = new JSONArray();
-        String jName = UtilMap.getString(formData,"textField_mtwp487f");
-        String jPhone = UtilMap.getString(formData,"textField_mtwp487g");
+        String jName = UtilMap.getString(formData,"textField_e6og3c9");
+        String jPhone = UtilMap.getString(formData,"textField_ismg45u");
         String yName = UtilMap.getString(formData,"textField_mtwp487i");
         String yPhone = UtilMap.getString(formData,"textField_mtwp487h");
         for (Map<String, String> party : extractFormPartyNumbers(formUuid, formData)) {
@@ -375,29 +375,29 @@ public class EqbServiceImpl implements EqbService {
             boolean isOurParty = OUR_PARTY.equals(partyName);
             String signerName = "甲方".equals(partyName) ? jName : yName;
             String signerPhone = "甲方".equals(partyName) ? jPhone : yPhone;
-            List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
-                    .appType(appType)
-                    .systemToken(systemToken)
-                    .formUuid("FORM-B7DBC8CA2A284FDC9F38E814CC043B17DIMN")
-                    .searchFieldJson(JSON.toJSONString(UtilMap.map("serialNumberField_mrlipwdo", party.get("partyNumber"))))
-                    .build());
-            // 同一编号不能任取一条,避免登记信息缺失或重复时绑定错误签署主体。
-            if (dataList == null) {
-                throw new IllegalStateException(partyName + "相对方登记查询未返回数据");
-            }
-            if (dataList.isEmpty()) {
-                throw new IllegalArgumentException(partyName + "编号未查到相对方登记记录");
-            }
-            if (dataList.size() != 1 || dataList.get(0) == null) {
-                throw new IllegalArgumentException(partyName + "编号必须对应唯一一条相对方登记记录");
-            }
-            Map data = dataList.get(0);
-            String type = requirePartyText(data, "radioField_ms4kbtdz", partyName, "相对方类型");
-            String name = requirePartyText(data, "textField_mrlipwdn", partyName, "名称");
-            String idCardNum = requirePartyText(data, "textField_mrlipwdt", partyName, "证件号码");
+//            List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+//                    .appType(appType)
+//                    .systemToken(systemToken)
+//                    .formUuid("FORM-B7DBC8CA2A284FDC9F38E814CC043B17DIMN")
+//                    .searchFieldJson(JSON.toJSONString(UtilMap.map("serialNumberField_mrlipwdo", party.get("partyNumber"))))
+//                    .build());
+//            // 同一编号不能任取一条,避免登记信息缺失或重复时绑定错误签署主体。
+//            if (dataList == null) {
+//                throw new IllegalStateException(partyName + "相对方登记查询未返回数据");
+//            }
+//            if (dataList.isEmpty()) {
+//                throw new IllegalArgumentException(partyName + "编号未查到相对方登记记录");
+//            }
+//            if (dataList.size() != 1 || dataList.get(0) == null) {
+//                throw new IllegalArgumentException(partyName + "编号必须对应唯一一条相对方登记记录");
+//            }
+//            Map data = dataList.get(0);
+//            String type = requirePartyText(data, "radioField_ms4kbtdz", partyName, "相对方类型");
+//            String name = requirePartyText(data, "textField_mrlipwdn", partyName, "名称");
+//            String idCardNum = requirePartyText(data, "textField_mrlipwdt", partyName, "证件号码");
 //            String legalPerson = requirePartyText(data, "textField_ms4js5qb", partyName, "法人代表");
             JSONObject signer = new JSONObject();
-            if ("相对方登记自然人".equals(type)) {
+            if ("甲方".equals(partyName)) {
                 signer.put("signerType", 0);
                 JSONObject psnInfo = new JSONObject();
 //                psnInfo.put("psnName", name);
@@ -413,9 +413,9 @@ public class EqbServiceImpl implements EqbService {
                 signer.put("signerType", 1);
                 JSONObject orgInfo = new JSONObject();
                 orgInfo.put("orgIDCardType", "CRED_ORG_USCC");
-                orgInfo.put("orgIDCardNum", idCardNum);
+                orgInfo.put("orgIDCardNum", "91310106MAEC5CTQ0A");
                 JSONObject orgSignerInfo = new JSONObject();
-                orgSignerInfo.put("orgName", name);
+                orgSignerInfo.put("orgName", "上海深度智联科技有限公司");
                 orgSignerInfo.put("orgInfo", orgInfo);
                 if (!isOurParty) {
                     JSONObject psnInfo = new JSONObject();
@@ -444,6 +444,9 @@ public class EqbServiceImpl implements EqbService {
         }
         JSONObject field = new JSONObject();
         field.put("normalSignFieldConfig", fieldConfig);
+        if (isOurParty){
+
+        }
         field.put(INTERNAL_SIGN_KEYWORD, getSignKeyword(partyName));
         return field;
     }
@@ -1176,7 +1179,7 @@ public class EqbServiceImpl implements EqbService {
             }
             // 连接及发送请求后扣除已耗时间,读取响应时继续使用剩余预算。
             connection.setReadTimeout(remainingRequestMillis(deadline));
-            String responseMessage = connection.getResponseMessage();
+             String responseMessage = connection.getResponseMessage();
             int status = connection.getResponseCode();
             if (status < 200 || status >= 300) {
                 throw new IOException("HTTP状态码:" + status);

+ 23 - 0
mjava-sdzl/src/main/java/com/malk/sdzl/service/Impl/YqbSupplierFormPushServiceImpl.java

@@ -64,6 +64,7 @@ public class YqbSupplierFormPushServiceImpl implements YqbSupplierFormPushServic
     @Override
     public YqbSupplierFormPushResult pushByFormInstance(YqbSupplierFormPushRequest request) {
         String formInstanceId = validateAndGetFormInstanceId(request);
+        String type = validateAndGetType(request);
         validateYidaConfig();
 
         DDR_New<?> form = ydClient.queryData(YDParam.builder()
@@ -91,6 +92,9 @@ public class YqbSupplierFormPushServiceImpl implements YqbSupplierFormPushServic
 
         supplierRequest.setPayAccountIds(payAccountId);
         supplierRequest.setInvoiceTitleIds(invoiceTitleId);
+        if (YqbSupplierFormPushRequest.TYPE_CHANGE.equals(type)) {
+            supplierRequest.setOldItemCode(requiredOldItemCode(request));
+        }
         YqbApiResponse<Object> supplierResponse = yqbOptionPushService.pushOne(supplierRequest);
         ensureSuccess(supplierResponse, "新增供应商");
 
@@ -211,6 +215,25 @@ public class YqbSupplierFormPushServiceImpl implements YqbSupplierFormPushServic
         return request.getFormInstanceId().trim();
     }
 
+    private String validateAndGetType(YqbSupplierFormPushRequest request) {
+        if (request == null || isBlank(request.getType())) {
+            throw new IllegalArgumentException("type不能为空,取值仅支持“新增”或“变更”");
+        }
+        String type = request.getType().trim();
+        if (!YqbSupplierFormPushRequest.TYPE_ADD.equals(type)
+                && !YqbSupplierFormPushRequest.TYPE_CHANGE.equals(type)) {
+            throw new IllegalArgumentException("type取值仅支持“新增”或“变更”");
+        }
+        return type;
+    }
+
+    private String requiredOldItemCode(YqbSupplierFormPushRequest request) {
+        if (isBlank(request.getOldItemCode())) {
+            throw new IllegalArgumentException("type为“变更”时,oldItemCode不能为空");
+        }
+        return request.getOldItemCode().trim();
+    }
+
     private void validateYidaConfig() {
         if (isBlank(appType) || isBlank(systemToken)) {
             throw new IllegalStateException("未配置aliwork.appType或aliwork.systemToken");

+ 2 - 2
mjava-sdzl/src/main/resources/application-prod.yml

@@ -77,5 +77,5 @@ eqb:
   psnName: 方煜浙
   psnIDCardNum: 332624199910200013
   psnIDCardType: CRED_PSN_CH_IDCARD
-  appId: 5112105688
-  appKey: d41e3ebbc5ba045927bdd9d10862d392
+  appId: 5112101376
+  appKey: 2fc3aacccffb60bda557e945d22f92a5

+ 54 - 0
mjava-sdzl/src/main/resources/json/party-fields.json

@@ -0,0 +1,54 @@
+[
+  {
+    "formName": "共享经济立项合同会签单",
+    "formUuid": "FORM-EF6D9A68B60E44519B2B141F58DD476EEFIQ",
+    "formType": "process",
+    "parties": {
+      "甲方": [
+        {
+          "fieldId": "textField_e6og3c9",
+          "label": "甲方编号",
+          "comp": "TextField",
+          "subform": false
+        }
+      ],
+      "乙方": [
+        {
+          "fieldId": "textField_e6og3c9",
+          "label": "乙方编号",
+          "comp": "TextField",
+          "subform": false
+        }
+      ],
+      "丙方": null,
+      "丁方": null
+    },
+    "allFieldCount": 119
+  },
+  {
+    "formName": "装饰装修及展柜定制年度框架合同",
+    "formUuid": "FORM-7B78FEDB2F384D488F6F86FD20F3BF100G1T",
+    "formType": "process",
+    "parties": {
+      "甲方": [
+        {
+          "fieldId": "textField_mtffom9w",
+          "label": "甲方编号",
+          "comp": "TextField",
+          "subform": false
+        }
+      ],
+      "乙方": [
+        {
+          "fieldId": "textField_mtffom9x",
+          "label": "乙方编号",
+          "comp": "TextField",
+          "subform": false
+        }
+      ],
+      "丙方": null,
+      "丁方": null
+    },
+    "allFieldCount": 121
+  }
+]