Ver código fonte

Merge remote-tracking branch 'origin/master'

“lqy 6 dias atrás
pai
commit
bdd1a26e1c

+ 5 - 0
mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java

@@ -63,6 +63,11 @@ public class BoyangController {
             log.info("info:{},重复回调,不做处理",info);
         }else {
             eventList.put(info, System.currentTimeMillis());
+            //签署开始回写签署详情地址
+            if ("SIGN_FLOW_START".equals(callBackDesc)) {
+                String signPreUrl = UtilMap.getString(callBackProcessVO, "signPreUrl");
+                boyangService.start(processInstanceId,signPreUrl);
+            }
             //签署完成回写审批单
             if ("SIGN_FLOW_FINISH".equals(callBackDesc)) {
                 boyangService.signed(processInstanceId,signFlowId);

+ 2 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java

@@ -12,4 +12,6 @@ public interface BoyangService {
     void signed(String processInstanceId,String signFlowId);
 
     McR getOrganization(String name);
+
+    void start(String processInstanceId, String signPreUrl);
 }

+ 117 - 31
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -7,9 +7,7 @@ import com.malk.boyang.utils.HTTPHelper;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDConf;
 import com.malk.server.dingtalk.DDR_New;
-import com.malk.service.dingtalk.DDClient;
-import com.malk.service.dingtalk.DDClient_Storage;
-import com.malk.service.dingtalk.DDClient_Workflow;
+import com.malk.service.dingtalk.*;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
@@ -20,8 +18,10 @@ import okio.Sink;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.codec.digest.HmacAlgorithms;
 import org.apache.commons.codec.digest.HmacUtils;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.io.*;
@@ -36,9 +36,15 @@ public class BoyangServiceImpl implements BoyangService {
     @Autowired
     private DDClient ddClient;
 
+    @Autowired
+    private DDConf ddConf;
+
     @Autowired
     private DDClient_Workflow ddClient_workflow;
 
+    @Autowired
+    private DDClient_Personnel ddClient_personnel;
+
     @Value("${dingtalk.downloadPath}")
     private String downloadPath;
 
@@ -58,6 +64,7 @@ public class BoyangServiceImpl implements BoyangService {
     final static String projectId = "1000004";// 应用ID
     final static String secret = "96Uh7CR83NkN3TA6";// 应用密钥
     final static String businessTypeCode = "889726e889ab84fea3514748d6df565c";// 钉钉对接测试业务模板
+    final static String organizationCode = "b60a9c18b8cc4ecc80e30f36b4267a68";// 宁波博洋家纺集团有限公司
     final static String host = "http://122.227.225.202:9011/";// 接口调用域名
     final static String intranet_host = "http://11.0.11.62/";// 接口调用域名(内网)
 
@@ -75,6 +82,7 @@ public class BoyangServiceImpl implements BoyangService {
         String remark = "";
         String url = "https://aflow.dingtalk.com/dingtalk/web/query/pchomepage.htm?from=oflow&op=true&corpid=ding76a1e955807327f7f5bf40eda33b7ba0#/plainapproval?procInstId="+processInstanceId;
         List<String> sealTypeCodeList = new ArrayList<>();
+        List<Map> companyList = new ArrayList<>();
 
 
         for (Map formComponentValue : formComponentValues) {
@@ -100,8 +108,8 @@ public class BoyangServiceImpl implements BoyangService {
                     String fileQty = UtilMap.getString(formComponentValue, "value");
                     break;
                 case "DDMultiSelectField_1L3KU3TLX6PS0"://印章所属公司
-                    String companyStr = UtilMap.getString(formComponentValue, "value");
-                    List<Map> companyList = (List<Map>) JSONObject.parse(companyStr);
+                    String companyStr = UtilMap.getString(formComponentValue, "extValue");
+                    companyList = (List<Map>) JSONObject.parse(companyStr);
                     break;
                 case "DDMultiSelectField_1FW3TFDTJ6V40"://印章类型
                     String yzlxStr = UtilMap.getString(formComponentValue, "value");
@@ -150,6 +158,57 @@ public class BoyangServiceImpl implements BoyangService {
             }
         }
 
+        //查询钉钉用户信息
+        String name = "";
+        String mobile = "";
+        String originatorUserId = UtilMap.getString(result, "originatorUserId");
+
+        List<Map> employeeInfos = ddClient_personnel.getEmployeeInfos(ddClient.getAccessToken(), Arrays.asList(originatorUserId), ddConf.getAgentId(), Arrays.asList("sys00-name", "sys00-mobile"));
+        Map employeeInfo = employeeInfos.get(0);
+
+        List<Map> fieldDataList = UtilMap.getList(employeeInfo, "field_data_list");
+
+        for (Map fieldData : fieldDataList) {
+            String fieldCode = UtilMap.getString(fieldData, "field_code");
+            List<Map> fieldValueList = UtilMap.getList(fieldData, "field_value_list");
+
+            switch (fieldCode){
+                case "sys00-name":
+                    name = UtilMap.getString(fieldValueList.get(0),"value");
+                    break;
+                case "sys00-mobile":
+                    mobile = UtilMap.getString(fieldValueList.get(0),"value").replace("+86-","");
+                    break;
+                default:break;
+            }
+        }
+
+        String eqbUserCode = "";
+
+        //查询钉钉用户在e签宝是否存在
+        Map body = new HashMap();
+        body.put("name", name);
+        body.put("mobile", mobile);
+        List<Map> eqbUsers = (List<Map>) eqbPost(host + "manage/v1/innerUsers/detail", body);
+        if (!eqbUsers.isEmpty()){
+            Map eqbUser = eqbUsers.get(0);
+
+            eqbUserCode = UtilMap.getString(eqbUser, "userCode");
+        }else {
+            //新增e签宝用户
+            Map eqbUser = new HashMap();
+            eqbUser.put("name", name);
+            eqbUser.put("mobile", mobile);
+            eqbUser.put("customAccountNo", mobile);
+            eqbUser.put("mainOrganizationCode", organizationCode);//默认组织账号
+
+            Map map1 = (Map) eqbPost(host + "manage/v1/innerUsers/create",Arrays.asList(eqbUser));
+
+            List<Map> successData = UtilMap.getList(map1, "successData");
+
+            eqbUserCode = UtilMap.getString(successData.get(0), "userCode");
+        }
+
         // 创建主Map
         Map<String, Object> requestMap = new HashMap<>();
 
@@ -158,7 +217,7 @@ public class BoyangServiceImpl implements BoyangService {
         requestMap.put("businessNo", processInstanceId);
         requestMap.put("businessTypeCode", businessTypeCode);
         requestMap.put("remark", remark);
-        requestMap.put("redirectUrl", url);
+//        requestMap.put("redirectUrl", url);
 
         // 2. manualConfig 嵌套对象
         Map<String, Object> manualConfig = new HashMap<>();
@@ -174,12 +233,12 @@ public class BoyangServiceImpl implements BoyangService {
 
         // 3. initiatorInfo 嵌套对象
         Map<String, Object> initiatorInfo = new HashMap<>();
-        initiatorInfo.put("userCode", "wozy");
-        initiatorInfo.put("customAccountNo", "");
+        initiatorInfo.put("userCode", eqbUserCode);
+        /*initiatorInfo.put("customAccountNo", "");
         initiatorInfo.put("departmentCode", "");
         initiatorInfo.put("customDepartmentNo", "");
-        initiatorInfo.put("organizationCode", "b60a9c18b8cc4ecc80e30f36b4267a68");
-        initiatorInfo.put("customOrgNo", "");
+        initiatorInfo.put("organizationCode", "");
+        initiatorInfo.put("customOrgNo", "");*/
 
         requestMap.put("initiatorInfo", initiatorInfo);
 
@@ -201,16 +260,19 @@ public class BoyangServiceImpl implements BoyangService {
         // 5. signerInfos 列表
         List<Map<String, Object>> signerInfos = new ArrayList<>();
 
-        Map<String, Object> signer = new HashMap<>();
-        signer.put("userType", "1");
-        signer.put("userCode", "wozy");
-        signer.put("organizationCode", "b60a9c18b8cc4ecc80e30f36b4267a68");
-        signer.put("signNode", 1);
-        signer.put("signMode", "0");
-        signer.put("signOrder", 1);
-//        signer.put("sealTypeCode", String.join(",",sealTypeCodeList));
+        for (int i = 0; i < companyList.size(); i++) {
+            Map<String, Object> signer = new HashMap<>();
+            signer.put("userType", "1");
+            signer.put("userCode", "wangze");
+            signer.put("organizationCode", UtilMap.getString(companyList.get(i),"key"));
+            signer.put("signNode", 1);
+            signer.put("signMode", "0");
+            signer.put("signOrder", i + 1);
+//            signer.put("sealTypeCode", String.join(",",sealTypeCodeList));
+
+            signerInfos.add(signer);
+        }
 
-        signerInfos.add(signer);
         requestMap.put("signerInfos", signerInfos);
 
         // 打印结果(可选)
@@ -228,14 +290,18 @@ public class BoyangServiceImpl implements BoyangService {
 
         String newSigningAreaPageUrl = signingAreaPageUrl.replace(intranet_host,host);
 
-        comment(processInstanceId,"344749020127590108","签署区设置地址:"+newSigningAreaPageUrl,null);
+        comment(processInstanceId,originatorUserId,"签署区设置地址:"+newSigningAreaPageUrl,null);
 
         return McR.success();
     }
 
+    @Async
     @Override
     public void signed(String processInstanceId,String signFlowId) {
         try {
+            Map result = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), processInstanceId);
+            String originatorUserId = UtilMap.getString(result, "originatorUserId");
+
             // 获取签署流程进度详情
             Map data = (Map) eqbGet(host + "/esign-signs/v1/signFlow/signDetail?signFlowId=" + signFlowId);
             List<Map> signFiles = UtilMap.getList(data, "signFiles");
@@ -260,17 +326,19 @@ public class BoyangServiceImpl implements BoyangService {
                 //todo 签署后文件上传到钉盘
                 Map dentry = uploadDdFile(spaceId, parentDentryUuid, downloadPath + signedFileName, operatorUnionId);
                 //todo 审批单添加评论
-                comment(processInstanceId,operator,"接口测试 "+ fileName + "已签署",Arrays.asList(dentry));
+                comment(processInstanceId,originatorUserId,"接口测试 "+ fileName + "已签署",Arrays.asList(dentry));
             }
         } catch (Exception e) {
-            e.printStackTrace();
-            String msg = MessageFormat.format("请求签名鉴权方式调用接口出现异常: {0}", e.getMessage());
-            System.out.println(msg);
+            throw new RuntimeException(e);
         }
     }
 
     @Override
     public McR getOrganization(String name) {
+        if (Strings.isBlank(name)){
+            return McR.success(new ArrayList<>());
+        }
+
         Map body = new HashMap();
         body.put("name",name);
         List<Map> data = (List<Map>) eqbPost(host + "manage/v1/innerOrganizations/detail",body);
@@ -278,19 +346,37 @@ public class BoyangServiceImpl implements BoyangService {
         List<Map> options = new ArrayList<>();
 
         for (Map datum : data) {
-            String organizationName = UtilMap.getString(datum, "name");
-            String organizationCode = UtilMap.getString(datum, "organizationCode");
+            String organizationType = UtilMap.getString(datum, "organizationType");
 
-            Map option = new HashMap();
-            option.put("label",organizationName);
-            option.put("value",organizationCode);
+            if ("COMPANY".equals(organizationType)){
+                String organizationName = UtilMap.getString(datum, "name");
+                String organizationCode = UtilMap.getString(datum, "organizationCode");
 
-            options.add(option);
+                Map option = new HashMap();
+                option.put("label",organizationName);
+                option.put("value",organizationCode);
+
+                options.add(option);
+            }
         }
 
         return McR.success(options);
     }
 
+    @Override
+    public void start(String processInstanceId, String signPreUrl) {
+        try {
+            Map result = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), processInstanceId);
+            String originatorUserId = UtilMap.getString(result, "originatorUserId");
+
+            //审批单添加评论
+            String signPreUrl2 = signPreUrl.replace(intranet_host, host);
+            comment(processInstanceId,originatorUserId,"签署预览地址:" + signPreUrl2,null);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     //下载钉钉OA审批单附件
     private void downloadDdFile(String processInstanceId,String fileId,String downloadPath){
         try {
@@ -534,7 +620,7 @@ public class BoyangServiceImpl implements BoyangService {
     }
 
     //e签宝-post请求(application/json)
-    private Object eqbPost(String url,Map body){
+    private Object eqbPost(String url,Object body){
         try {
             // 请求Body体数据
             String reqBodyData = JSONObject.toJSONString(body);

+ 1 - 1
mjava-boyang/src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId:
+  agentId: 4111300995
   appKey: dingt4kem6twzlqehm58
   appSecret: ZgE_XOfccVlSOcbw3cN0Ad_dJFqBB_PfPPmqJzGTgKXPu5tsh17KibxG7WEB6_hc
   corpId:

+ 3 - 3
mjava-boyang/src/main/resources/application-prod.yml

@@ -13,15 +13,15 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId:
+  agentId: 4111300995
   appKey: dingt4kem6twzlqehm58
   appSecret: ZgE_XOfccVlSOcbw3cN0Ad_dJFqBB_PfPPmqJzGTgKXPu5tsh17KibxG7WEB6_hc
   corpId:
   aesKey:
   token:
-  operator: 065965353428672133 #潘麒卿
+  operator: "065965353428672133" #潘麒卿
   operatorUnionId: AfZv5MOJ80W2STOhUbbOcAiEiE #潘麒卿
-  downloadPath: d:\\
+  downloadPath: /home/server/boyang/file/
   spaceId: 27829762189 #钉盘-e签宝
   parentDentryUuid: y20BglGWO23pGpLOsaALnnz98A7depqY #钉盘-e签宝-签署后文件
 

+ 46 - 4
mjava-boyang/src/test/java/com/malk/boyang/EqbTest.java

@@ -11,10 +11,7 @@ import java.nio.file.Path;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 import com.malk.boyang.service.BoyangService;
 import com.malk.boyang.utils.HTTPHelper;
@@ -543,5 +540,50 @@ public class EqbTest {
         }
     }
 
+    @Test
+    public void test11(){
+        Map eqbUser = new HashMap();
+        eqbUser.put("name", "张三");
+        eqbUser.put("mobile", "15900010001");
+        eqbUser.put("customAccountNo", "15900010001");
+        eqbUser.put("mainOrganizationCode", "b60a9c18b8cc4ecc80e30f36b4267a68");//默认组织账号
+
+        Map map = (Map) eqbPost2(host + "/manage/v1/innerUsers/create", Arrays.asList(eqbUser));
+
+        System.out.println(map);
+    }
+
+
+    //e签宝-post请求(application/json)
+    private Object eqbPost2(String url,Object body){
+        try {
+            // 请求Body体数据
+            String reqBodyData = JSONObject.toJSONString(body);
+
+            // 计算请求签名值
+            String reqSignature = sign(reqBodyData, secret);
+
+            // 构建请求头
+            LinkedHashMap<String, String> header = new LinkedHashMap<>();
+
+            // 构建待签名字符串
+            header.put("X-timevale-project-id", projectId);
+            header.put("X-timevale-signature", reqSignature);
+            header.put("Accept", "*/*");
+            header.put("Content-Type", "application/json; charset=UTF-8");
+
+            String resultStr = HTTPHelper.sendPOST(url, reqBodyData, header, "UTF-8");
+
+            Map result = (Map) JSONObject.parse(resultStr);
+
+
+            Object data = result.get("data");
+
+            return data;
+        }catch (Exception e){
+            throw new RuntimeException(e);
+        }
+    }
+
 
 }

+ 18 - 8
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java

@@ -94,7 +94,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             List<List<String>> formInstanceIdListList = new ArrayList<>();//实例id集合,每100条
 
             DDR_New ddrNew = new DDR_New();
-            int pageSize = 100;
+            int pageSize = 50;
             int pageNumber = 0;
             do {
                 pageNumber++;
@@ -298,7 +298,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             //更新看板更新记录
             ydClient.operateData(YDParam.builder()
                     .formInstId(formInstId)
-                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t", "异常", System.currentTimeMillis())))
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t, textareaField_mir0zmpo", "异常", System.currentTimeMillis(),e.getMessage())))
                     .build(), YDConf.FORM_OPERATION.update);
 
             throw new RuntimeException(e);
@@ -332,7 +332,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             List<List<String>> formInstanceIdListList = new ArrayList<>();//实例id集合,每100条
 
             DDR_New ddrNew = new DDR_New();
-            int pageSize = 100;
+            int pageSize = 50;
             int pageNumber = 0;
             do {
                 pageNumber++;
@@ -369,7 +369,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
 
             billQuery.setLimit(limit);
             billQuery.setFormId("STK_Inventory");
-            billQuery.setFieldKeys("FMaterialID.FNumber,FMaterialID.FName,FMaterialID.FSpecification,FMaterialID.F_QUXZ_Assistant,FMaterialID.FSTOREURNOM,FMaterialID.FSTOREURNUM,FStockId,FStockId.FName,FLot,FLot.FName,FStockUnitId,FStockUnitId.FName,FBaseQty,FStockStatusId.FName");
+            billQuery.setFieldKeys("FMaterialID.FNumber,FMaterialID.FName,FMaterialID.FSpecification,FMaterialID.F_QUXZ_Assistant,FMaterialID.FSTOREURNOM,FMaterialID.FSTOREURNUM,FMaterialID.FZJ,FStockId,FStockId.FName,FLot,FLot.FName,FStockUnitId,FStockUnitId.FName,FBaseQty,FStockStatusId.FName");
             List<Map> filterString = new ArrayList<>();
             //仓库等于成品仓或组装半成品仓
             filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockName","338","成品仓,组装半成品仓","","","0"));//仓库名称 IN XX
@@ -398,6 +398,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
                 String FMaterialName = UtilMap.getString(map,"FMaterialID.FName");//物料名称
                 String FMaterialSpecification = UtilMap.getString(map,"FMaterialID.FSpecification");//物料规格
                 String FQUXZAssistant = Objects.nonNull(map.get("FMaterialID.F_QUXZ_Assistant")) ? UtilMap.getString(map,"FMaterialID.F_QUXZ_Assistant") : "--";//所属系列
+                String Fzj = UtilMap.getString(map,"FMaterialID.FZJ");//组件
                 String FStockName = UtilMap.getString(map,"FStockId.FName");//仓库名称
                 String FLotName = UtilMap.getString(map,"FLot.FName");//批号
                 String FStockUnitName = UtilMap.getString(map,"FStockUnitId.FName");//库存主单位
@@ -407,12 +408,21 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
                 Double FSTOREURNOM = UtilMap.getDouble(map, "FMaterialID.FSTOREURNOM");
                 Double FSTOREURNUM = UtilMap.getDouble(map, "FMaterialID.FSTOREURNUM");
 
+                if ("组装半成品仓".equals(FStockName)){
+                    if (FMaterialName.contains("组件") && !FMaterialName.contains("面板") && !FMaterialName.contains("包装")){
+
+                    }else {
+                        continue;
+                    }
+                }
+
                 Double FQty = FBaseQty * FSTOREURNOM / FSTOREURNUM;//库存量(主单位)
 
                 formData.put("textField_mfarr0ei",FMaterialNumber);
                 formData.put("textField_mfarr0en",FMaterialName);
                 formData.put("textField_mfarr0eo",FMaterialSpecification);
                 formData.put("textField_mflwgj61", FQUXZAssistant);
+                formData.put("textField_mipr1qrc", Fzj);
                 formData.put("textField_mfarr0et",FStockName);
                 formData.put("textField_mfarr0eu",FLotName);
                 formData.put("textField_mfarr0ev",FStockUnitName);
@@ -519,7 +529,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             //更新看板更新记录
             ydClient.operateData(YDParam.builder()
                     .formInstId(formInstId)
-                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t", "异常", System.currentTimeMillis())))
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t, textareaField_mir0zmpo", "异常", System.currentTimeMillis(),e.getMessage())))
                     .build(), YDConf.FORM_OPERATION.update);
 
             throw new RuntimeException(e);
@@ -627,7 +637,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             //更新看板更新记录
             ydClient.operateData(YDParam.builder()
                     .formInstId(formInstId)
-                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t", "异常", System.currentTimeMillis())))
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t, textareaField_mir0zmpo", "异常", System.currentTimeMillis(),e.getMessage())))
                     .build(), YDConf.FORM_OPERATION.update);
 
             throw new RuntimeException(e);
@@ -775,7 +785,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
     public void syncDLVNotice(String userId) {
         MDC.put("MDC_KEY_PID","1002");
 
-        log.info("开始同步生产退料明细");
+        log.info("开始同步发货通知单");
 
         //创建看板更新记录
         if (Strings.isBlank(userId)){
@@ -900,7 +910,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
             //更新看板更新记录
             ydClient.operateData(YDParam.builder()
                     .formInstId(formInstId)
-                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t", "异常", System.currentTimeMillis())))
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mhsjnn2r, dateField_mhsjnn2t, textareaField_mir0zmpo", "异常", System.currentTimeMillis(),e.getMessage())))
                     .build(), YDConf.FORM_OPERATION.update);
 
             throw new RuntimeException(e);

+ 13 - 0
mjava-jinlun/pom.xml

@@ -51,6 +51,19 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.32</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.2</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 21 - 0
mjava-jinlun/src/main/java/com/malk/jinlun/controller/JinlunController.java

@@ -5,6 +5,7 @@ import com.malk.server.common.McR;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.Map;
 
 @RestController
@@ -72,4 +73,24 @@ public class JinlunController {
 
         return McR.success();
     }
+
+    /**
+     *
+     * 查询客户回款对账明细
+     * @param startDate
+     * @param endDate
+     * @param customerName
+     * @return
+     */
+    @GetMapping("/getCustomerDzmx")
+    public McR getCustomerDzmx(String startDate, String endDate, String customerName){
+        return jinlunService.getCustomerDzmx(startDate,endDate,customerName);
+//        return null;
+    }
+
+    @GetMapping("/getCustomerWqqk")
+    public McR getCustomerWqqk(String startDate, String customerName){
+        return jinlunService.getCustomerWqqk(startDate,customerName);
+//        return null;
+    }
 }

+ 16 - 0
mjava-jinlun/src/main/java/com/malk/jinlun/mapper/JinlunMapper.java

@@ -0,0 +1,16 @@
+package com.malk.jinlun.mapper;
+
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface JinlunMapper {
+    //查询客户对账明细
+    List<Map> getCustomerDzmx(@Param("start_date") String start_date,@Param("end_date") String end_date,@Param("customer") String customer);
+
+    Map getCustomerWqqk(@Param("start_date") String start_date,@Param("customer") String customer);
+}

+ 4 - 0
mjava-jinlun/src/main/java/com/malk/jinlun/service/JinlunService.java

@@ -14,4 +14,8 @@ public interface JinlunService {
     McR addSaleOrder(Map map);
 
     McR createTbProject(Map map);
+
+    McR getCustomerDzmx(String startDate, String endDate, String customerName);
+
+    McR getCustomerWqqk(String startDate, String customerName);
 }

+ 18 - 0
mjava-jinlun/src/main/java/com/malk/jinlun/service/impl/JinlunServiceImpl.java

@@ -10,6 +10,7 @@ import com.kingdee.bos.webapi.entity.RepoRet;
 import com.kingdee.bos.webapi.sdk.K3CloudApi;
 import com.malk.jinlun.config.KDWebApiConf;
 import com.malk.jinlun.entity.*;
+import com.malk.jinlun.mapper.JinlunMapper;
 import com.malk.jinlun.service.CpClient;
 import com.malk.jinlun.service.JinlunService;
 import com.malk.server.common.McR;
@@ -47,6 +48,9 @@ public class JinlunServiceImpl implements JinlunService {
     @Autowired
     private TBConf tbConf;
 
+    @Autowired
+    private JinlunMapper jinlunMapper;
+
     private final Object $lock = new Object[0];
 
     private static final Long EXPIRES_IN = 7200000L;
@@ -599,6 +603,20 @@ public class JinlunServiceImpl implements JinlunService {
         return McR.success(id);
     }
 
+    @Override
+    public McR getCustomerDzmx(String startDate, String endDate, String customerName) {
+        List<Map> customerDzmx = jinlunMapper.getCustomerDzmx(startDate, endDate, customerName);
+
+        return McR.success(customerDzmx);
+    }
+
+    @Override
+    public McR getCustomerWqqk(String startDate, String customerName) {
+        Map customerWqqk = jinlunMapper.getCustomerWqqk(startDate, customerName);
+
+        return McR.success(customerWqqk);
+    }
+
     private IdentifyInfo initIden(){
         //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
         //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。

+ 7 - 0
mjava-jinlun/src/main/resources/application-dev.yml

@@ -3,6 +3,13 @@ server:
   servlet:
     context-path: /jinlun
 
+spring:
+  datasource:
+    url: jdbc:mysql://192.168.0.12:3306/cloudpivot?serverTimezone=GMT%2B8
+    username: root
+    password: test123456!@#$%
+    driver-class-name: com.mysql.cj.jdbc.Driver
+
 enable:
   scheduling: false
 logging:

+ 7 - 0
mjava-jinlun/src/main/resources/application-prod.yml

@@ -3,6 +3,13 @@ server:
   servlet:
     context-path: /jinlun
 
+spring:
+  datasource:
+    url: jdbc:mysql://192.168.0.12:3306/cloudpivot?serverTimezone=GMT%2B8
+    username: root
+    password: test123456!@#$%
+    driver-class-name: com.mysql.cj.jdbc.Driver
+
 enable:
   scheduling: true
 logging:

+ 81 - 0
mjava-jinlun/src/main/resources/mapper/JinlunMapper.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.malk.jinlun.mapper.JinlunMapper">
+
+
+    <select id="getCustomerDzmx" resultType="java.util.Map">
+        SELECT
+            客户, 单据编号, 业务日期, 性能, 规格, 数量, 重量, 计价单价, 税率, 价税合计, 回款金额, NULL AS "往期欠款", 备注
+        FROM (
+                 -- 暂估应收数据
+                 SELECT
+                     t1.ShortText1760602119316 AS "客户",
+                     t1.ShortText1760602123650 AS "单据编号",
+                     t1.Date1760602205733 AS "业务日期",
+                     t2.Text1760602314150 AS "性能",
+                     t2.Text1760602292846 AS "规格",
+                     t2.Number1762915279108 AS "数量",
+                     t2.Number1762915289424 AS "重量",
+                     t2.Number1760602330651 AS "计价单价",
+                     t2.Number1760602343876 AS "税率",
+                     t2.Number1760602359012 AS "价税合计",
+                     NULL AS "回款金额",
+                     t2.Text1760602391849 AS "备注"
+                 FROM i940k_ysd t1
+                          LEFT JOIN i940k_sheet1760602277185 t2 ON t1.id = t2.parentId
+                 WHERE t1.ShortText1760602147441 = '暂估应收'
+                   AND t1.ShortText1760602123650 NOT LIKE '%-%'
+                   AND t1.Date1760602205733 between #{start_date} and #{end_date}
+                   AND t1.ShortText1760602119316 = #{customer}
+
+                 UNION ALL
+
+                 -- 回款数据
+                 SELECT
+                     t1.ShortText1760585132200 AS "客户",
+                     t1.ShortText1760585125989 AS "单据编号",
+                     t1.Date1760585187315 AS "业务日期",
+                     NULL AS "性能",
+                     NULL AS "规格",
+                     NULL AS "数量",
+                     NULL AS "重量",
+                     NULL AS "计价单价",
+                     NULL AS "税率",
+                     NULL AS "价税合计",
+                     t2.Number1760585242849 AS "回款金额",
+                     t2.ShortText1760585258640 AS "备注"
+                 FROM i940k_skd t1
+                          LEFT JOIN i940k_sheet1760585205663 t2 ON t1.id = t2.parentId
+                 WHERE t1.Date1760585187315 between #{start_date} and #{end_date}
+                   AND t1.ShortText1760585132200 = #{customer}
+                 -- 多个客户时用:AND FIND_IN_SET(t1.ShortText1760585132200, @target_customers) > 0
+             ) data
+        ORDER BY 业务日期,单据编号,性能  -- 同一天内应收行在前,回款行在后
+    </select>
+    <select id="getCustomerWqqk" resultType="java.util.Map">
+        SELECT
+        COALESCE(receivable.amount, 0) AS '往期应付',
+        COALESCE(paid.amount, 0) AS '往期已付',
+        COALESCE(receivable.amount, 0) - COALESCE(paid.amount, 0) AS '往期欠款'
+        FROM
+        (SELECT 1 AS dummy) AS base
+        LEFT JOIN (
+        SELECT SUM(t2.Number1760602359012) AS amount
+        FROM i940k_ysd t1
+        LEFT JOIN i940k_sheet1760602277185 t2 ON t1.id = t2.parentId
+        WHERE t1.ShortText1760602147441 = '暂估应收'
+        AND t1.ShortText1760602123650 NOT LIKE '%-%'
+        AND t1.Date1760602205733 &lt; #{start_date}
+        AND t1.ShortText1760602119316 = #{customer}
+        ) AS receivable ON 1=1
+        LEFT JOIN (
+        SELECT SUM(t2.Number1760585242849) AS amount
+        FROM i940k_skd t1
+        LEFT JOIN i940k_sheet1760585205663 t2 ON t1.id = t2.parentId
+        WHERE t1.Date1760585187315 &lt; #{start_date}
+        AND t1.ShortText1760585132200 = #{customer}
+        ) AS paid ON 1=1
+    </select>
+</mapper>
+

+ 13 - 0
mjava-jinlun/src/test/java/com/malk/jinlun/DdTest.java

@@ -14,6 +14,7 @@ import com.malk.jinlun.entity.*;
 import com.malk.jinlun.service.CpClient;
 import com.malk.jinlun.service.JinlunService;
 import com.malk.jinlun.service.JinlunTaskService;
+import com.malk.server.common.McR;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import com.malk.utils.UtilToken;
@@ -330,6 +331,18 @@ public class DdTest {
         jinlunTaskService.syncXingneng();
     }
 
+    @Test
+    public void test13() {
+        McR customerDzmx = jinlunService.getCustomerDzmx("2025-06-01", "2025-12-30", "ASTAR CO., LTD.");
+        System.out.println(customerDzmx);
+    }
+
+    @Test
+    public void test14() {
+        McR customerWqqk = jinlunService.getCustomerWqqk("2025-06-01", "ASTAR CO., LTD.");
+        System.out.println(customerWqqk);
+    }
+
     private IdentifyInfo initIden(){
         //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
         //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。