瀏覽代碼

Merge remote-tracking branch 'origin/master'

“lqy 1 月之前
父節點
當前提交
dbffa858ba

+ 142 - 106
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/Impl/HeiHuOrderServiceImpl.java

@@ -1153,6 +1153,8 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                             body_A.put("orderNo",orderNumber);
                             String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
                             JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
+
+                            boolean isSample = false;//销售订单若为样品订单则不发起钉钉流程
                             for(int i=0;i<array.size();i++){
                                 JSONObject data = array.getJSONObject(i);
                                 customerName = data.getString("customerCode");//客户
@@ -1172,125 +1174,160 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                         JsonNode valueNode = field.get("value");
                                         if(valueNode != null){
                                             estimatedPrice = valueNode.asDouble();//辅料预估单价
-                                            break;
+                                        }
+                                    }
+                                    else if(fieldIdNode != null && fieldIdNode.asInt() == 47771){
+                                        JsonNode valueNode = field.get("value");
+                                        if("样品订单".equals(valueNode.asText())){
+                                            isSample = true;
                                         }
                                     }
                                 }
                             }
 
-                            JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
-
-                            if(products_A != null) {
-                                for (int i = 0; i < products_A.size(); i++) {
-                                    JSONObject detail = products_A.getJSONObject(i);
-                                    HashMap row = new HashMap();
-                                    row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
-                                    row.put("textField_ml6g7k5e", customerName);//todo:客户
-                                    row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
-
-                                    styleNumber = detail.getString("productCode");//款号
-                                    row.put("textField_ml7c3yhq", styleNumber);//todo:款号
-
-                                    productDescription = detail.getString("productName");//产品描述
-                                    row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
-
-                                    JSONArray array1 = detail.getJSONArray("customFieldValues");
-                                    color = array1.stream()
-                                            .map(obj -> (JSONObject) obj)
-                                            .filter(item -> item.getIntValue("fieldId") == 82259)
-                                            .map(item -> item.getString("value"))
-                                            .findFirst()
-                                            .orElse(null);
-                                    ArrayList colorList = new ArrayList();
-                                    colorList.add(color);
-                                    String color_AAA = null;
-                                    try {
-                                        color_AAA = getProductColor(colorList);
-                                    } catch (JacksonException e) {
-                                        throw new RuntimeException(e);
-                                    }
-                                    row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
-
-                                    number = detail.getDoubleValue("qty");//数量
-                                    row.put("numberField_ml7c3yht", number);//todo:数量
-
-                                    unitPrice = detail.getDoubleValue("unitPrice");//销售单价
-                                    row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
-
-                                    salesAmount = number * unitPrice;//销售金额
-                                    row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
-                                    String customFieldValues = detail.getString("customFieldValues");
-                                    ObjectMapper mapper = new ObjectMapper();
-                                    JsonNode jsonarray = null;
-                                    try {
-                                        jsonarray = mapper.readTree(customFieldValues);
-                                    } catch (JsonProcessingException e) {
-                                        throw new RuntimeException(e);
-                                    }
-                                    for (JsonNode node : jsonarray) {
-                                        if (node.get("fieldId").asInt() == 47919) {
-                                            currency = node.get("value").asText();
-                                        } else if (node.get("fieldId").asInt() == 165251) {
-                                            USDrate = node.get("value").asDouble();
-
-                                        } else if (node.get("fieldId").asInt() == 161783) {
-                                            flygcb = node.get("value").asDouble();
+                            if (!isSample){
+                                JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
+
+                                if(products_A != null) {
+                                    for (int i = 0; i < products_A.size(); i++) {
+                                        JSONObject detail = products_A.getJSONObject(i);
+                                        HashMap row = new HashMap();
+                                        row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
+                                        row.put("textField_ml6g7k5e", customerName);//todo:客户
+                                        row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
+
+                                        styleNumber = detail.getString("productCode");//款号
+                                        row.put("textField_ml7c3yhq", styleNumber);//todo:款号
+
+                                        productDescription = detail.getString("productName");//产品描述
+                                        row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
+
+                                        JSONArray array1 = detail.getJSONArray("customFieldValues");
+                                        color = array1.stream()
+                                                .map(obj -> (JSONObject) obj)
+                                                .filter(item -> item.getIntValue("fieldId") == 82259)
+                                                .map(item -> item.getString("value"))
+                                                .findFirst()
+                                                .orElse(null);
+                                        ArrayList colorList = new ArrayList();
+                                        colorList.add(color);
+                                        String color_AAA = null;
+                                        try {
+                                            color_AAA = getProductColor(colorList);
+                                        } catch (JacksonException e) {
+                                            throw new RuntimeException(e);
                                         }
-                                    }
-                                    row.put("textField_ml7c3yhw", currency);//todo:币别
-                                    row.put("numberField_ml86221y", USDrate);//todo:美金汇率
-                                    row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
-                                    if(currency.equals("USD")){
-                                        saletotalAmount = salesAmount * USDrate;
-                                    }else {
-                                        saletotalAmount = salesAmount;
-                                    }
-                                    row.put("numberField_ml862220",saletotalAmount);
-                                    //下面是采购订单的明细数据
-                                    row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
-                                    for(int j=0;j<products.size();j++){
-                                        if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
-                                            //找到对应的采购一行数据
-                                            row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
-                                            row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
-                                            row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
+                                        row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
+
+                                        number = detail.getDoubleValue("qty");//数量
+                                        row.put("numberField_ml7c3yht", number);//todo:数量
+
+                                        unitPrice = detail.getDoubleValue("unitPrice");//销售单价
+                                        row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
+
+                                        salesAmount = number * unitPrice;//销售金额
+                                        row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
+                                        String customFieldValues = detail.getString("customFieldValues");
+                                        ObjectMapper mapper = new ObjectMapper();
+                                        JsonNode jsonarray = null;
+                                        try {
+                                            jsonarray = mapper.readTree(customFieldValues);
+                                        } catch (JsonProcessingException e) {
+                                            throw new RuntimeException(e);
+                                        }
+                                        for (JsonNode node : jsonarray) {
+                                            if (node.get("fieldId").asInt() == 47919) {
+                                                currency = node.get("value").asText();
+                                            } else if (node.get("fieldId").asInt() == 165251) {
+                                                USDrate = node.get("value").asDouble();
+
+                                            } else if (node.get("fieldId").asInt() == 161783) {
+                                                flygcb = node.get("value").asDouble();
+                                            }
+                                        }
+                                        row.put("textField_ml7c3yhw", currency);//todo:币别
+                                        row.put("numberField_ml86221y", USDrate);//todo:美金汇率
+                                        row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
+                                        if(currency.equals("USD")){
+                                            saletotalAmount = salesAmount * USDrate;
+                                        }else {
+                                            saletotalAmount = salesAmount;
+                                        }
+                                        row.put("numberField_ml862220",saletotalAmount);
+                                        //下面是采购订单的明细数据
+                                        row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
+                                        for(int j=0;j<products.size();j++){
+                                            if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
+                                                //找到对应的采购一行数据
+                                                row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
+                                                row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
+                                                row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
+                                            }
                                         }
-                                    }
 
-                                    // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
-                                    Map<String, String> rowMap = new HashMap<>();
-                                    for (Object key : row.keySet()) {
-                                        Object value = row.get(key);
-                                        rowMap.put(key.toString(), value != null ? value.toString() : "");
-                                    }
-                                    currentOrderRows.add(rowMap);
+                                        // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
+                                        Map<String, String> rowMap = new HashMap<>();
+                                        for (Object key : row.keySet()) {
+                                            Object value = row.get(key);
+                                            rowMap.put(key.toString(), value != null ? value.toString() : "");
+                                        }
+                                        currentOrderRows.add(rowMap);
 
-                                    // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
-                                    orderTotalSalesAmount += saletotalAmount;
-                                    orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
-                                    orderTotalFlygcb += flygcb;
+                                        // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
+                                        orderTotalSalesAmount += saletotalAmount;
+                                        orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
+                                        orderTotalFlygcb += flygcb;
+                                    }
                                 }
-                            }
-
-                            // ========== 修改点6:计算当前订单的毛利率 ==========
-                            double mlv = 0.0;
-                            if (orderTotalSalesAmount > 0) {
-                                mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
-                            }
 
-                            System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
+                                // ========== 修改点6:计算当前订单的毛利率 ==========
+                                double mlv = 0.0;
+                                if (orderTotalSalesAmount > 0) {
+                                    mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
+                                }
 
-                            // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
-                            if (mlv >= 0.15) {
-                                // 高毛利率订单
-                                tabledataHigh.addAll(currentOrderRows);
-                                System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
+                                System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
+
+                                // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
+                                if (mlv >= 0.15) {
+                                    // 高毛利率订单
+                                    tabledataHigh.addAll(currentOrderRows);
+                                    System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
+                                } else {
+                                    // 低毛利率订单
+                                    tabledataLow.addAll(currentOrderRows);
+                                    System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
+                                }
                             } else {
-                                // 低毛利率订单
-                                tabledataLow.addAll(currentOrderRows);
-                                System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
+                                try {
+                                    HashMap body1 = new HashMap();
+                                    body1.put("orderCode",orderCode);//订单编号:orderCode
+                                    body1.put("vendorCode",dataArray.getJSONObject(0).getString("vendorCode"));//供应商编码:gysnumber
+                                    String aa = dataArray.getJSONObject(0).getLong("purchaseTime").toString();
+                                    String purchaseTime = Instant.ofEpochMilli(Long.parseLong(aa))
+                                            .atZone(ZoneId.of("Asia/Shanghai"))
+                                            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                                    body1.put("purchaseTime",purchaseTime);//采购日期:purchaseTime
+                                    String bb = dataArray.getJSONObject(0).getLong("planArrivalTime").toString();
+                                    String planArrivalTime = Instant.ofEpochMilli(Long.parseLong(bb))
+                                            .atZone(ZoneId.of("Asia/Shanghai"))
+                                            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                                    body1.put("planArrivalTime",planArrivalTime);//计划到货日期:planArrivalTime
+                                    ArrayList<Map<String,String>> customFiled = new ArrayList();
+                                    HashMap field = new HashMap();
+                                    field.put("name","采购订单钉钉审批状态");
+                                    field.put("value","审批完成");//审批状态
+                                    customFiled.add(field);
+                                    body1.put("purchaseOrderCustomFieldsValue",customFiled);
+                                    UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/update", header, null, body1);
+                                    log.info("---------【回传,{},采购订单状态完成】-----------",dataArray.getJSONObject(0).getString("orderCode"));
+                                } catch (Exception e) {
+                                    log.info("样品订单的采购订单自动通过审批失败,采购订单编号为:{}",orderCode);
+                                    e.printStackTrace();
+                                }
                             }
                         }
+
                         List<Map<String, Object>> oldList = new ArrayList<>();
                         if (type.equals(targetValueUpdate)){
                             oldIds.forEach(h->{
@@ -1426,7 +1463,7 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
             body.put("status", status);
 
             String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//查询采购订单
-            log.info("header:",header.toString());
+            log.info("header:{}",header.toString());
             System.out.println("header:" + header.toString());
             ObjectMapper mapper = new ObjectMapper();
             Map<String, Object> response = mapper.readValue(doPost, Map.class);
@@ -1440,7 +1477,6 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
             List<Map<String, Object>> mapList = (List<Map<String, Object>>) response.get("data");
             if (ObjectUtil.isNotNull(mapList) && mapList.size() > 0){
                 dataList.addAll(mapList);
-
                 hasMoreData = mapList.size() >= pageSize;
             } else {
                 hasMoreData = false;

+ 6 - 7
mjava-huagao/src/main/java/com/malk/huagao/service/impl/EqbServiceImpl.java

@@ -503,7 +503,6 @@ public class EqbServiceImpl implements EqbService {
         double xsze = UtilMap.getDouble(formData, "numberField_mjb71qac");//销售总额
         String fkfs = UtilMap.getString(formData, "textField_mjb886fw");//付款方式
         String jfnsrsbh = UtilMap.getString(formData, "textField_mjb71q9w");//甲方纳税人识别号
-        String spyx = UtilMap.getString(formData, "textField_mjb71q9y");//收票邮箱
         String jfdb = UtilMap.getString(formData, "textField_mjb886fx");//甲方代表
         String yfdb = UtilMap.getString(formData, "textField_mj8dt3fj");//乙方代表
 
@@ -534,11 +533,6 @@ public class EqbServiceImpl implements EqbService {
         jxsComponent5.put("componentKey", "jfnsrsbh");
         jxsComponent5.put("componentValue", jfnsrsbh);
 
-        //收票邮箱
-        Map jxsComponent6 = new HashMap();
-        jxsComponent6.put("componentKey", "spyx");
-        jxsComponent6.put("componentValue", spyx);
-
         //甲方代表
         Map jxsComponent7 = new HashMap();
         jxsComponent7.put("componentKey", "jfdb");
@@ -584,18 +578,23 @@ public class EqbServiceImpl implements EqbService {
         jxsComponent11.put("componentKey", "jf3");
         jxsComponent11.put("componentValue", jf);
 
+        //日期
+        Map jxsComponent12 = new HashMap();
+        jxsComponent12.put("componentKey", "rq");
+        jxsComponent12.put("componentValue", System.currentTimeMillis());
+
 
         components.add(jxsComponent);
         components.add(jxsComponent2);
         components.add(jxsComponent3);
         components.add(jxsComponent4);
         components.add(jxsComponent5);
-        components.add(jxsComponent6);
         components.add(jxsComponent7);
         components.add(jxsComponent8);
         components.add(jxsComponent9);
         components.add(jxsComponent10);
         components.add(jxsComponent11);
+        components.add(jxsComponent12);
 
         // 构建请求Body体
         reqBodyObj.put("docTemplateId", qtkh_templateId);

+ 2 - 2
mjava-huagao/src/test/java/com/malk/huagao/EqbTest.java

@@ -71,7 +71,7 @@ public class EqbTest {
         //正式环境模板id 采购订单模板:a0827f8946994ebfbed7f44e6b8a6ed8
 
         //步骤4:制作含动态表格控件的HTML模板 访问【获取制作合同模板页面】接口返回的创建文件模板页面链接(docTemplateCreateUrl参数值),并在页面中拖动【动态表格】控件来制作模板,若链接失效,调用【获取编辑合同模板页面】接口
-//        getDocTemplateEditUrl(appId,appKey,host,"6a23f76742d74b858cdc2259a5d5c32f");
+        getDocTemplateEditUrl(appId,appKey,host,"8b7fef2257bc4093ada330dbf7c874c5");
 
 
         //步骤5:获取 HTML 模板中控件ID和控件Key
@@ -98,7 +98,7 @@ public class EqbTest {
 
 //        getOrgUserInfo(appId,appKey,host,"00739a62731c498a8ecf477bf79efc54");
 
-        getOrgMember(appId,appKey,host,"a5ec8fb7d8cc4276bd486824df0ec640");
+//        getOrgMember(appId,appKey,host,"a5ec8fb7d8cc4276bd486824df0ec640");
 
 
         //获取签署地址

+ 1 - 1
mjava-junengtai/src/main/java/com/malk/junengtai/service/Impl/PurchaseServiceImpl.java

@@ -151,7 +151,7 @@ public class PurchaseServiceImpl implements PurchaseService {
                 Map<String, String> partData = new HashMap<>();
                 partData.put("supplierCode", partNode.get("supplierCode").asText());
                 partData.put("name", partNode.get("name").asText());
-
+                partData.put("createDate",partNode.get("createDate").isNull() ? "" : partNode.get("createDate").asText());
                 List.add(partData);
                 partsMap.put(partNode.get("supplierCode").asText(), partData);
             }

+ 1 - 1
mjava-junengtai/src/main/resources/application.yml

@@ -1,3 +1,3 @@
 spring:
   profiles:
-    active: dev
+    active: prod

+ 146 - 34
mjava-siku/src/main/java/com/malk/siku/service/impl/SikuServiceImpl.java

@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 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.FileOutputStream;
@@ -59,13 +60,14 @@ public class SikuServiceImpl implements SikuService {
         }else {
             //供应商
             String hzlx = UtilMap.getString(formData, "radioField_mketkvw7");
+            String freeType = UtilMap.getString(formData, "radioField_mmyoc59n");//free类别
 
             partner.put("parentBizCode", "GYS");//所属分类业务编码
-            partner.put("name", "Free".equals(hzlx) ? UtilMap.getString(formData,"textField_mkkixdd6") : UtilMap.getString(formData,"textField_mketkvv0"));//往来单位中文名
+            partner.put("name", "个人".equals(freeType) ? UtilMap.getString(formData,"textField_mkkixdd6") : UtilMap.getString(formData,"textField_mketkvv0"));//往来单位中文名
             partner.put("partnerType", "供应商");//往来关系,可选值为:"供应商"、"客户"、"供应商,客户"(既是供应商又是客户的情况下以中文逗号分隔(供应商在前))
-            partner.put("partnerProperty", "Free".equals(hzlx) ? "个体工商户" : "公司");//往来性质,可选值为:"公司"、"个体工商户"
+            partner.put("partnerProperty", "个人".equals(freeType) ? "个体工商户" : "公司");//往来性质,可选值为:"公司"、"个体工商户"
             partner.put("businessCode", UtilMap.getString(formData,"serialNumberField_mketkvw4"));//往来单位编码,不超过50个字符
-            partner.put("taxNumber", "Free".equals(hzlx) ? "" : UtilMap.getString(formData,"textField_mketkvxo"));//税务登记号,不超过200个字符
+            partner.put("taxNumber", "个人".equals(freeType) ? "" : UtilMap.getString(formData,"textField_mketkvxo"));//税务登记号,不超过200个字符
             partner.put("readOnly", false);//是否只读,默认false。如果为true,那么在每刻系统中往来单位的所有信息(如权限范围、收款账户等)均无法修改。(接口更新操作不受限制)
             partner.put("reMark", "");//往来单位备注
             partner.put("enabled", "启用".equals(UtilMap.getString(formData,"radioField_mketkvw8")));//是否启用(true:启用;false:禁用)。若该参数为空,新增则默认为true,更新则保持系统内状态。
@@ -138,9 +140,10 @@ public class SikuServiceImpl implements SikuService {
         application.put("bizCode", UtilMap.getString(formData,"serialNumberField_mknspz75"));//外部系统中的开票申请单业务编码。必须系统内唯一,用于判断开票申请单是否已导入。
 
         application.put("clientBizCode",UtilMap.getString(formData,"textField_mkxpe3fj"));//收票方bizCode(客户的业务编码(云票系统内维护的))与收票方开票信息字段二选一必填
+        application.put("clientLegalEntityBizCode",UtilMap.getString(formData,"textField_mkddjwys"));//收票方抬头code,如果不传默认第一个(云票系统内维护的)
 
-//        application.put("submitterBizCode","18857526310");//提交人工号,单据状态为审批中时必填  todo 暂时固定 周漂
-//        application.put("applicantBizCode","18857526310");//开票申请人工号 todo 暂时固定 周漂
+        application.put("submitterBizCode","18857526310");//提交人工号,单据状态为审批中时必填  todo 暂时固定 周漂
+        application.put("applicantBizCode","18857526310");//开票申请人工号 todo 暂时固定 周漂
 
         /*Map clientLegalEntityOaDto = new HashMap();//收票方开票信息(不在云票系统内维护的)与收票方bizCode(客户的业务编码)二选一必填且优先级高于收票方bizCode(客户的业务编码)(也就是当两字段都有值时,忽略客户的业务编码)
         clientLegalEntityOaDto.put("invoiceTitle",UtilMap.getString(formData,"selectField_mkxmix7e"));//名称
@@ -150,7 +153,7 @@ public class SikuServiceImpl implements SikuService {
 
         application.put("clientLegalEntityOaDto",clientLegalEntityOaDto);*/
 
-        application.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mm2wj87x"));//公司主体code(后续传税号)
+        application.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mn4dhy5g"));//公司主体code(后续传税号)
         application.put("estimatedDate",System.currentTimeMillis());//预计开票时间
         String fplx = UtilMap.getString(formData, "selectField_mkdnuvem");//发票类型
         String estimatedInvoiceType = "";
@@ -168,11 +171,12 @@ public class SikuServiceImpl implements SikuService {
 
         application.put("phoneNumber",UtilMap.getString(formData,"textField_mkdo0azf"));//收票人电话
         application.put("email",UtilMap.getString(formData,"textField_mkdo0azn"));//收票邮箱
+        application.put("autoSendMail",true);//是否自动发送邮件/短信,若传true且填写正确的收票邮箱/手机号,则在开票申请单完全开票后自动发邮件/短信。不填写收票邮箱/短信或传false时,将不会自动交付电子发票。
         application.put("applicationComment",UtilMap.getString(formData,"textareaField_mkdo0aze"));//开票备注
 
         Map item = new HashMap();
         item.put("productBizCode","1001");//产品bizcode
-        item.put("invoiceName",UtilMap.getString(formData,"textField_mkgarw4d"));//开票名称
+        item.put("invoiceName",UtilMap.getString(formData,"textField_mn4ajusx"));//开票名称
         item.put("taxPercent",UtilMap.getDouble(formData,"numberField_mkgkboht")/100);//税率
         item.put("forexName","CNY");//币种
         item.put("exchangeRate",1);//外汇汇率
@@ -246,11 +250,12 @@ public class SikuServiceImpl implements SikuService {
         } return estimatedInvoiceType;
     }
 
+    @Async
     @Override
     public void invoiceWriteBack2(Map map) {
         //获取发票信息
         Map calloutParams = UtilMap.getMap(map, "calloutParams");
-        String serviceType = UtilMap.getString(map, "serviceType");
+        String serviceType = UtilMap.getString(calloutParams, "serviceType");
         Map bizData = UtilMap.getMap(calloutParams, "bizData");
 
         if ("INVOICE_VAT_INVOICED_NOTIFY_AR".equals(serviceType)){
@@ -264,11 +269,11 @@ public class SikuServiceImpl implements SikuService {
             String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号
 
             //回写宜搭
-            Map formData = new HashMap();
-            formData.put("radioField_mkxripcc","开票成功");
-            formData.put("textField_mkxripc6",invoiceNumber);
-            formData.put("textField_mm3aixk0",downloadPageUrl);
-            formData.put("textareaField_mmlzqvn0","");
+            Map updateFormData = new HashMap();
+            updateFormData.put("radioField_mkxripcc","开票成功");
+            updateFormData.put("textField_mkxripc6",invoiceNumber);
+            updateFormData.put("textField_mm3aixk0",downloadPageUrl);
+            updateFormData.put("textareaField_mmlzqvn0","");
 
             if (Strings.isNotBlank(pdfUrl)){
                 String fileName = invoiceNumber + ".pdf";
@@ -284,27 +289,42 @@ public class SikuServiceImpl implements SikuService {
                 attachmentField.put("previewUrl",previewUri);
                 attachmentField.put("url",downloadUri);
                 attachmentField.put("ext","pdf");
-                formData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
+                updateFormData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
             }
 
-            ydClient.operateData(YDParam.builder()
+            Map data = ((List<Map>)ydClient.queryData(YDParam.builder()
                     .formInstanceId(bizCode)
                     .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh)))
                     .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
-                    .formDataJson(JSONObject.toJSONString(formData))
-                    .build(), YDConf.FORM_OPERATION.upsert);
+                    .build(), YDConf.FORM_QUERY.retrieve_list).getData()).get(0);
+
+            String formInstanceId = UtilMap.getString(data, "formInstanceId");
+
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(formInstanceId)
+                    .updateFormDataJson(JSONObject.toJSONString(updateFormData))
+                    .build(), YDConf.FORM_OPERATION.update);
 
         }else if ("INVOICE_APPLICATION_VAT_FAIL_NOTIFY_AR".equals(serviceType)){
             //开票失败后回调
-
             String invoiceErrorMsg = UtilMap.getString(bizData, "invoiceErrorMsg");
 
             String bizCode = UtilMap.getString(bizData, "bizCode");
 
-        }
 
+            Map data = ((List<Map>)ydClient.queryData(YDParam.builder()
+                    .formInstanceId(bizCode)
+                    .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",bizCode)))
+                    .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
+                    .build(), YDConf.FORM_QUERY.retrieve_list).getData()).get(0);
 
+            String formInstanceId = UtilMap.getString(data, "formInstanceId");
 
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(formInstanceId)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mkxripcc, textareaField_mmlzqvn0","开票失败",invoiceErrorMsg)))
+                    .build(), YDConf.FORM_OPERATION.update);
+        }
 
     }
 
@@ -679,13 +699,18 @@ public class SikuServiceImpl implements SikuService {
         customerObj.put("contacts",contacts);//联系人列表
 
         List<Map> invoiceTitles = new ArrayList<>();
-        Map invoiceTitle = new HashMap();
-        invoiceTitle.put("invoiceTitle",UtilMap.getString(formData,"textField_mkddjwyr"));//发票抬头
-        invoiceTitle.put("dutyParagraph",UtilMap.getString(formData,"textField_mkddjwys"));//税号
-        invoiceTitle.put("bizCode",UtilMap.getString(formData,"textField_mkddjwys"));//业务编码
-        invoiceTitle.put("bankBranchName",UtilMap.getString(formData,"textField_mkddjwyt"));//开户行
-        invoiceTitle.put("account",UtilMap.getString(formData,"textField_mkddjwyu"));//银行账户
-        invoiceTitles.add(invoiceTitle);
+
+        List<Map> invoiceList = UtilMap.getList(formData, "tableField_mn496ozf");
+        for (Map invoice : invoiceList) {
+            Map invoiceTitle = new HashMap();
+            invoiceTitle.put("invoiceTitle",UtilMap.getString(invoice,"textField_mkddjwyr"));//发票抬头
+            invoiceTitle.put("dutyParagraph",UtilMap.getString(invoice,"textField_mkddjwys"));//税号
+            invoiceTitle.put("bizCode",UtilMap.getString(invoice,"textField_mkddjwys"));//业务编码
+            invoiceTitle.put("bankBranchName",UtilMap.getString(invoice,"textField_mkddjwyt"));//开户行
+            invoiceTitle.put("account",UtilMap.getString(invoice,"textField_mkddjwyu"));//银行账户
+            invoiceTitles.add(invoiceTitle);
+        }
+
         customerObj.put("invoiceTitles",invoiceTitles);//发票抬头列表
 
         MkYpUtil.saveClient(Arrays.asList(customerObj));
@@ -693,6 +718,7 @@ public class SikuServiceImpl implements SikuService {
         return McR.success();
     }
 
+    @Async
     @Override
     public void invoiceWriteBack(Map map) {
         Map calloutParams = UtilMap.getMap(map, "calloutParams");
@@ -740,6 +766,7 @@ public class SikuServiceImpl implements SikuService {
 
     }
 
+    @Async
     @Override
     public void invoiceWriteBack3(Map map) {
         String formCode = UtilMap.getString(map, "formCode");
@@ -755,7 +782,7 @@ public class SikuServiceImpl implements SikuService {
         String[] split = formCode.split("-");
 
         String bh = split[0];//采购需求编号/直接采购单编号
-        String uuid = split[1];//子表uuid
+        int index = Integer.parseInt(split[1]);//子表索引
 
         Map formData = UtilMap.getMap(map, "formData");
 
@@ -778,12 +805,47 @@ public class SikuServiceImpl implements SikuService {
 
             Map ydFormData = UtilMap.getMap(data.get(0), "formData");
 
-            List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
+            String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
 
-            for (Map detail : detailList) {
-                if (uuid.equals(UtilMap.getString(detail, "textField_mmvhqm0q"))){
-                    detail.put("selectField_mmvhqm0p","已付款");
-                    break;
+            if ("常规需求".equals(type)){
+                List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
+
+                for (Map detail : detailList) {
+                    if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
+                        Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij5e");//结算成本
+                        Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6l");//已付款金额
+                        String fkzt = UtilMap.getString(detail, "selectField_mmvhqm0p");//付款状态
+                        if (yfkje + amt == jscb){
+                            detail.put("selectField_mmvhqm0p","全部付款");
+                        }else if (yfkje + amt < jscb && yfkje + amt > 0  && !"部分退款".equals(fkzt)){
+                            detail.put("selectField_mmvhqm0p","部分付款");
+                        }
+
+                        detail.put("numberField_mmvqom6l",yfkje + amt);
+
+                        break;
+                    }
+                }
+            }else {
+                List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
+
+                for (Map detail : detailList) {
+                    if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
+
+                        Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij6p");//结算成本
+                        Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqs9h6");//已付款金额
+                        String fkzt = UtilMap.getString(detail, "selectField_mkkmij6a");//付款状态
+
+                        if (yfkje + amt == jscb){
+                            detail.put("selectField_mkkmij6a","全部付款");
+                        }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
+                            detail.put("selectField_mkkmij6a","部分付款");
+                        }
+
+                        detail.put("numberField_mmvqom6l",yfkje + amt);
+
+                        break;
+                    }
                 }
             }
 
@@ -793,7 +855,7 @@ public class SikuServiceImpl implements SikuService {
 
             ydClient.operateData(YDParam.builder()
                     .formInstanceId(formInstanceId)
-                    .updateFormDataJson(JSONObject.toJSONString(ydFormData  ))
+                    .updateFormDataJson(JSONObject.toJSONString(ydFormData))
                     .build(), YDConf.FORM_OPERATION.update);
         }else {
             //直接采购结算单
@@ -804,9 +866,59 @@ public class SikuServiceImpl implements SikuService {
 
             String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
 
+            Map ydFormData = UtilMap.getMap(data.get(0), "formData");
+
+            String type = UtilMap.getString(ydFormData, "radioField_mkkmij3b");
+
+            if ("常规采购".equals(type)){
+                List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
+
+                for (Map detail : detailList) {
+                    if (index == UtilMap.getInt(detail, "numberField_mn36ykxx")){
+                        Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij5e");//结算成本
+                        Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6k");//已付款金额
+                        String fkzt = UtilMap.getString(detail, "selectField_mmvhtdy0");//付款状态
+                        if (yfkje + amt == jscb){
+                            detail.put("selectField_mmvhtdy0","全部付款");
+                        }else if (yfkje + amt < jscb && yfkje + amt > 0  && !"部分退款".equals(fkzt)){
+                            detail.put("selectField_mmvhtdy0","部分付款");
+                        }
+
+                        detail.put("numberField_mmvqom6k",yfkje + amt);
+
+                        break;
+                    }
+                }
+            }else {
+                List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij61");
+
+                for (Map detail : detailList) {
+                    if (index == UtilMap.getInt(detail, "numberField_mn36ykxz")){
+
+                        Double jscb = UtilMap.getDouble(detail, "numberField_mkkmij6p");//结算成本
+                        Double yfkje = UtilMap.getDouble(detail, "numberField_mmvqom6l");//已付款金额
+                        String fkzt = UtilMap.getString(detail, "selectField_mkkmij6a");//付款状态
+
+                        if (yfkje + amt == jscb){
+                            detail.put("selectField_mkkmij6a","全部付款");
+                        }else if (yfkje + amt < jscb && yfkje + amt > 0 && !"部分退款".equals(fkzt)){
+                            detail.put("selectField_mkkmij6a","部分付款");
+                        }
+
+                        detail.put("numberField_mmvqom6l",yfkje + amt);
+
+                        break;
+                    }
+                }
+            }
+
+            Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
+
+            ydFormData.put("numberField_mkf2qumf",yzf + amt);
+
             ydClient.operateData(YDParam.builder()
                     .formInstanceId(formInstanceId)
-                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mkf2qumf",amt)))
+                    .updateFormDataJson(JSONObject.toJSONString(ydFormData))
                     .build(), YDConf.FORM_OPERATION.update);
         }
 

+ 49 - 0
mjava-zhongche/pom.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.malk.zhongche</groupId>
+    <artifactId>mjava-zhongche</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 17 - 0
mjava-zhongche/src/main/java/com/malk/zhongche/ZhongcheApplication.java

@@ -0,0 +1,17 @@
+package com.malk.zhongche;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class ZhongcheApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(ZhongcheApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 28 - 0
mjava-zhongche/src/main/resources/application-dev.yml

@@ -0,0 +1,28 @@
+server:
+  port: 9038
+  servlet:
+    context-path: /api/zhongche
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/zhongche/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId:
+  appKey:
+  appSecret:
+  corpId:
+  aesKey:
+  token:
+  operator:
+
+aliwork:
+  appType: APP_SL9V2KUH6GBEISLNXXTJ
+  systemToken: HOE66T71Z9H2PLVHM6EU85Q7H2AJ2YV2GRKKMWL1
+
+

+ 28 - 0
mjava-zhongche/src/main/resources/application-prod.yml

@@ -0,0 +1,28 @@
+server:
+  port: 9038
+  servlet:
+    context-path: /api/zhongche
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/zhongche/log/
+  level:
+    com.malk.*: info
+
+# dingtalk
+dingtalk:
+  agentId:
+  appKey:
+  appSecret:
+  corpId:
+  aesKey:
+  token:
+  operator:
+
+aliwork:
+  appType:
+  systemToken:
+
+

+ 15 - 0
mjava-zhongche/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: autos

+ 61 - 0
mjava-zhongche/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>