2 Commits 7b9636f0a2 ... aaabee0f93

Author SHA1 Message Date
  wzy aaabee0f93 卡倍亿同步出库单调整 1 month ago
  wzy 7372559fc0 逸耀同步签到数据 1 month ago

+ 5 - 70
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/controller/KabeiyiController.java

@@ -1,18 +1,12 @@
 package com.malk.kabeiyi.controller;
 
 import com.malk.kabeiyi.service.KabeiyiService;
-import com.malk.server.aliwork.YDConf;
-import com.malk.server.aliwork.YDParam;
-import com.malk.server.common.McException;
 import com.malk.server.common.McR;
-import com.malk.server.dingtalk.DDR_New;
-import com.malk.service.aliwork.YDClient;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Workflow;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
@@ -95,11 +89,11 @@ public class KabeiyiController {
         return kabeiyiService.ocr(downloadUrl,name,type);
     }
 
-    //每天0点定时同步发货单信息
-//    @Scheduled(cron = "0 0 0 * * ?")
-    @GetMapping("getDeliveryInfo")
-    public McR getDeliveryInfo(){
-        return kabeiyiService.getDeliveryInfo();
+    //每天0点定时同步出库单信息
+    @Scheduled(cron = "0 30 15 * * ?")
+    @GetMapping("getSaleoutInfo")
+    public McR getSaleoutInfo(){
+        return kabeiyiService.getSaleoutInfo();
     }
 
     //新增一张凭证
@@ -108,63 +102,4 @@ public class KabeiyiController {
         kabeiyiService.addVoucher(map);
         return McR.success();
     }
-
-    @Autowired
-    private YDClient ydClient;
-    /*@GetMapping("deleteAllData")
-    public McR deleteAllData(){
-        MDC.put("MDC_KEY_PID","1019");
-        DDR_New ddrNew;
-        int pageNumber = 1;
-        int pageSize = 100;
-        String formUuid = "FORM-809458EB6D524CF5AE1A91A3492D8B1BZIMN";
-        List<String> errorList = new ArrayList<>();
-        do {
-            ddrNew = ydClient.queryData(YDParam.builder()
-                    .formUuid(formUuid)
-                    .pageNumber(pageNumber)
-                    .pageSize(pageSize).build(), YDConf.FORM_QUERY.retrieve_search_form_id);
-
-            List<String> list =(List<String>) ddrNew.getData();
-
-            int i=1;
-            boolean flag = false;
-            while (i<=5 && !flag){
-                try {
-                    ydClient.operateData(YDParam.builder()
-                            .formUuid(formUuid)
-                            .asynchronousExecution(false)
-                            .formInstanceIdList(list)
-                            .build(),YDConf.FORM_OPERATION.delete_batch);
-                    flag = true;
-                }catch (McException e){
-                    if (e.getMessage().contains("The request has failed due to a temporary failure of the server.")){
-                        log.info("请求失败,尝试次数:{}",i);
-                        i++;
-                        try {
-                            Thread.sleep(3000);
-                        } catch (InterruptedException ex) {
-                            throw new RuntimeException(ex);
-                        }
-                    }else {
-                        log.info("删除失败 失败原因:{}" , e.getMessage());
-                        errorList.addAll(list);
-                        flag = true;
-                    }
-                }catch (Exception e){
-                    log.info("删除失败 失败原因:{}" , e.getMessage());
-                    errorList.addAll(list);
-                    flag = true;
-                }
-            }
-            if (i>5){
-                log.info("删除失败,重试次数过多");
-            }
-
-        }while (ddrNew.getTotalCount() > 0);
-        log.info("失败列表:{}",errorList);
-        return McR.success();
-    }*/
-
-
 }

+ 3 - 2
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/KabeiyiService.java

@@ -2,7 +2,6 @@ package com.malk.kabeiyi.service;
 
 import com.malk.server.common.McR;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
 
 import java.util.Map;
 
@@ -33,9 +32,11 @@ public interface KabeiyiService {
     McR addPlanApproval(Map map);
 
     @Async
-    McR getDeliveryInfo();
+    McR getSaleoutInfo();
 
     McR testInnerTable();
 
     void addVoucher(Map map);
+
+    String getWeekRange(String dateStr);
 }

+ 232 - 88
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/KabeiyiServiceImpl.java

@@ -14,7 +14,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.malk.core.McProject;
 import com.malk.kabeiyi.service.KabeiyiService;
 import com.malk.kabeiyi.util.RecognizeAllText;
-import com.malk.kabeiyi.util.U8Util;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McException;
@@ -44,8 +43,12 @@ import java.io.InputStream;
 import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -564,7 +567,7 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
     @Override
     @Async
-    public McR getDeliveryInfo() {
+    public McR getSaleoutInfo() {
         //现在时间戳
         long beginTime = System.currentTimeMillis();
 
@@ -603,15 +606,19 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         DateTime beginOfMonth = DateUtil.beginOfMonth(DateUtil.lastMonth());
         String beginOfMonthString = beginOfMonth.toString("yyyy-MM-dd");
 
-        /*String beginOfMonthString = "2024-12-22";
+        /*String beginOfMonthString = "2025-06-12";
 
-        String yesterday = "2024-12-22";*/
+        String yesterday = "2025-06-12";*/
         for (Integer dsSequence : factory.keySet()) {
-            /*if (dsSequence != 8){
+            /*if (dsSequence == 2){
                 continue;
             }*/
+
             List<String> errorCodes = new ArrayList<>();
 
+            //存放存货名称、编码
+            Map<String,String> inventory = new HashMap<>();
+
             Map<String,Object> param = new HashMap<>();
             param.put("from_account",fromAccount);
             param.put("to_account",toAccount);
@@ -639,7 +646,7 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 //查询单个出库单详情
                 String id = getString(saleout.get("code"));
 
-                /*if (!id.equals("0000008087")){
+                /*if (!id.equals("00000044856")){
                     continue;
                 }*/
 
@@ -693,6 +700,8 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 formData.put("textField_m18nvp8c",getString(saleout2.get("businesscode")));//业务单号
                 formData.put("textField_m5nnwiv1", getString(saleout2.get("warehousename")));//仓库名称
                 formData.put("dateField_m18nvp7x",DateUtil.parseDate(getString(saleout2.get("date"))).getTime());//单据日期
+                formData.put("textField_mbu5nao3",getWeekRange(getString(saleout2.get("date"))));//发货周
+                formData.put("textField_mbu5nao5",saleout2.get("date").toString().substring(0,4));//年份
                 formData.put("dateField_m5nnwiuw",Objects.nonNull(saleout2.get("auditdate")) ?  DateUtil.parseDate(getString(saleout2.get("auditdate"))).getTime() : null);//审核日期
                 formData.put("textField_m18nvp7y",getString(saleout2.get("customername")));//客户名称
                 formData.put("textField_m18nvp7z",getString(saleout2.get("departmentname")));//部门
@@ -704,6 +713,9 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 formData.put("numberField_m18wkih7",dsSequence);//数据源序号
                 formData.put("selectField_m7b8j9uj","实发");//类型
 
+                AtomicReference<Double> totalQuantity = new AtomicReference<>(0d);
+                AtomicReference<Double> totalCost = new AtomicReference<>(0d);
+
                 List<Map> entry = (List<Map>) saleout2.get("entry");
 
                 //collect拆分成五个list  每个list长度为500
@@ -717,8 +729,13 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                     errorCodes.add(id + "出库明细超过2500");
                 }
 
+                //是否退线
+                boolean isReject = false;
+
                 //出库明细
-                List list1 = collectList.get(0).stream().map(item -> {
+                List<Map> list1 = new ArrayList();
+
+                for (Map item : collectList.get(0)) {
                     if (Objects.isNull(formData.get("textField_m219zpzf"))){
                         formData.put("textField_m219zpzf",getString(item.get("free1")));//客户码  出库主表没有客户码,取明细的客户码
                     }
@@ -728,120 +745,192 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
                     Map detail = new HashMap();
                     detail.put("textField_m22mkwzk", getString(item.get("define29")));//客户存货码
-                    detail.put("textField_m5qdxf7r", getString(item.get("inventorycode")));//存货编码
-//                    detail.put("textField_m18nvp8e", inventory_name);//存货名称
-
+                    detail.put("textField_mbu5naoj", getString(item.get("inventorycode")));//存货编码
+                    detail.put("textField_mc1emzfr",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                     detail.put("textField_m21b1bhg", getString(item.get("free2")));//产品颜色
+                    detail.put("textField_mbu5naoa", getString(item.get("define28")));//条码
                     detail.put("textField_m18nvp8f", getString(item.get("cmassunitname")));//单位
-                    detail.put("numberField_m18nvp8h", getString(item.get("quantity")));//发货数量
-                    detail.put("textField_m5oztcmx", getString(item.get("define25")));//包装方式
-                    detail.put("textField_m5oztcmy", getString(item.get("define30")));//工艺号
-                    detail.put("textareaField_m5oztcmz", getString(item.get("define31")));//备注
 
+                    if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                        if (getString((item.get("quantity"))).contains("-")){
+                            isReject = true;
+                            break;
+                        }else {
+                            detail.put("numberField_m18nvp8h", getString(item.get("quantity")));//发货数量
+                        }
+                    }else {
+                        continue;
+                    }
+
+                    totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
 
-                    /*detail.put("numberField_m18nvp8j", getString(item.get("price")));//未税单价
-                    detail.put("numberField_m18nvp8l", getString(item.get("money")));//未税总价
-                    detail.put("numberField_m18nvp8k", getString(item.get("taxprice")));//含税单价
-                    detail.put("numberField_m18nvp8m", getString(item.get("sum")));//含税总价
-                    detail.put("numberField_m18nvp8n", getString(item.get("taxrate")));//税率
-                    detail.put("numberField_m18nvp8o", getString(item.get("tax")));//总税价*/
+                    if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                        detail.put("numberField_m18nvp8k", getString(item.get("price")));//单价
+                    }
 
-                    return detail;
-                }).collect(Collectors.toList());
+                    if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                        detail.put("numberField_m18nvp8m", getString(item.get("cost")));//金额
+
+                        totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                    }
+
+                    list1.add(detail);
+                }
 
                 List<Map> list2 = new ArrayList<>();
                 if (collectList.size() > 1){
-                    list2 = collectList.get(1).stream().map(item -> {
+                    for (Map item : collectList.get(1)) {
                         Map detail = new HashMap();
                         detail.put("textField_m2j0wj8o", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m2j0wj8p", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naol", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzft",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m2j0wj8q", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naoc", getString(item.get("define28")));//条码
                         detail.put("textField_m2j0wj8r", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m2j0wj8s", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcn3", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcn2", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcng", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m2j0wj8t", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m2j0wj8u", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m2j0wj8v", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m2j0wj8w", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m2j0wj8x", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m2j0wj8y", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m2j0wj8s", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m2j0wj8v", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m2j0wj8w", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }
+
+                        list2.add(detail);
+                    }
                 }
+
                 List<Map> list3 = new ArrayList<>();
                 if (collectList.size() > 2){
-                    list3 = collectList.get(2).stream().map(item -> {
+                    for (Map item : collectList.get(2)) {
                         Map detail = new HashMap();
                         detail.put("textField_m2j0wj93", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m2j0wj94", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naon", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzfv",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m2j0wj95", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naoe", getString(item.get("define28")));//条码
                         detail.put("textField_m2j0wj96", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m2j0wj97", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcn7", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcn6", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcni", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m2j0wj98", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m2j0wj99", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m2j0wj9a", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m2j0wj9b", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m2j0wj9c", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m2j0wj9d", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m2j0wj97", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m2j0wj9a", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m2j0wj9b", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }
+
+                        list3.add(detail);
+                    }
                 }
 
                 List<Map> list4 = new ArrayList<>();
                 if (collectList.size() > 3){
-                    list4 = collectList.get(3).stream().map(item -> {
+                    for (Map item : collectList.get(3)) {
                         Map detail = new HashMap();
                         detail.put("textField_m4cfhc70", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m4cfhc71", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naop", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzfx",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m4cfhc72", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naog", getString(item.get("define28")));//条码
                         detail.put("textField_m4cfhc73", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m4cfhc74", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcnb", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcna", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcnk", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m4cfhc75", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m4cfhc76", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m4cfhc77", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m4cfhc78", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m4cfhc79", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m4cfhc7a", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m4cfhc74", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m4cfhc77", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m4cfhc78", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }
+
+                        list4.add(detail);
+                    }
                 }
 
                 List<Map> list5 = new ArrayList<>();
                 if (collectList.size() > 4){
-                    list5 = collectList.get(4).stream().map(item -> {
+                    for (Map item : collectList.get(4)) {
                         Map detail = new HashMap();
                         detail.put("textField_m4cfhc7f", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m4cfhc7g", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naor", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzfz",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m4cfhc7h", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naoi", getString(item.get("define28")));//条码
                         detail.put("textField_m4cfhc7i", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m4cfhc7j", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcnf", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcne", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcnm", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m4cfhc7k", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m4cfhc7l", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m4cfhc7m", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m4cfhc7n", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m4cfhc7o", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m4cfhc7p", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m4cfhc7j", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m4cfhc7m", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m4cfhc7n", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }
+
+                        list5.add(detail);
+                    }
+                }
+
+                if (isReject){
+                    continue;
                 }
 
                 formData.put("tableField_m18nvp82",list1);
@@ -850,6 +939,9 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 formData.put("tableField_m4cfhc7c",list4);
                 formData.put("tableField_m4cfhc7r",list5);
 
+                formData.put("numberField_mbu92ncy",totalQuantity.get());//发货数量合计
+                formData.put("numberField_mbu92nd0",totalCost.get());//发货金额合计
+
                 //精准匹配
                 List<Map> jsonString = new ArrayList<>();
                 jsonString.add(UtilMap.map("key, value, type, operator, componentName", "textField_m18nvp87",getString(saleout2.get("code")),"TEXT","eq","TextField"));
@@ -882,14 +974,14 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                             flag = true;
                         }
                     }catch (Exception e){
-                        log.error("发货单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , e.getMessage());
+                        log.error("出库单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , e.getMessage());
                         errorCodes.add(id);
                         flag = true;
                     }
                 }
                 if (i>5){
                     errorCodes.add(id);
-                    log.error("发货单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , "重试次数过多");
+                    log.error("出库单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , "重试次数过多");
                 }
             }
 
@@ -924,6 +1016,30 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         return McR.success();
     }
 
+    public String getInventoryName(String inventoryCode,int dsSequence,Map<String,String> inventory){
+        if (inventory.containsKey(inventoryCode)){
+            return inventory.get(inventoryCode);
+        }
+
+        Map<String, Object> param3 = new HashMap<>();
+        param3.put("from_account", fromAccount);
+        param3.put("to_account", fromAccount);
+        param3.put("app_key", u8AppKey);
+        param3.put("token", getU8Token());
+        param3.put("id", inventoryCode);
+        param3.put("ds_sequence", dsSequence);
+
+        Map<String,Object> map3 = get("https://api.yonyouup.com/api/inventory/get", param3, null);
+
+        Map inventoryInfo = (Map) map3.get("inventory");
+
+        String inventoryName = getString(inventoryInfo.get("name"));
+
+        inventory.put(inventoryCode,inventoryName);
+
+        return inventoryName;
+    }
+
     @Override
     public McR testInnerTable() {
         MDC.put("MDC_KEY_PID","1019");
@@ -1689,4 +1805,32 @@ public class KabeiyiServiceImpl implements KabeiyiService {
             return accessToken;
         }
     }
+
+    @Override
+    public String getWeekRange(String dateStr) {
+        //获取所属周(每周六-下周五)
+        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(dateStr, inputFormatter);
+
+        LocalDate startOfWeek;
+
+        // 获取该周的周六(开始日期)
+        startOfWeek = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.SATURDAY));
+
+        // 获取该周的周五(结束日期)
+        LocalDate endOfWeek = startOfWeek.plusDays(6);
+
+        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("MM.dd");
+
+        return startOfWeek.format(outputFormatter) + "-" + endOfWeek.format(outputFormatter);
+    }
+
+    public boolean isNumber(String str) {
+        try {
+            Double.parseDouble(str);
+            return true;
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
 }

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

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: prod
   servlet:
     multipart:
       max-file-size: 100MB

+ 76 - 0
mjava-kabeiyi/src/test/java/com/malk/kabeiyi/DdTest.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.malk.kabeiyi.service.KabeiyiService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Workflow;
@@ -40,6 +42,7 @@ public class DdTest {
     private YDClient ydClient;
 
 
+
     @Test
     public void test(){
         LocalDateTime now=LocalDateTime.now();
@@ -167,4 +170,77 @@ public class DdTest {
             }
         }
     }
+
+    //批量删除表单所有数据
+    @Test
+    public void deleteAllData(){
+        MDC.put("MDC_KEY_PID","1019");
+
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 50;
+        String formUuid = "FORM-809458EB6D524CF5AE1A91A3492D8B1BZIMN";
+        List<String> errorList = new ArrayList<>();
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid(formUuid)
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize).build(), YDConf.FORM_QUERY.retrieve_search_form_id);
+
+            List<String> list =(List<String>) ddrNew.getData();
+
+            int i=1;
+            boolean flag = false;
+            while (i<=5 && !flag){
+                try {
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid(formUuid)
+                            .asynchronousExecution(false)
+                            .formInstanceIdList(list)
+                            .build(),YDConf.FORM_OPERATION.delete_batch);
+                    flag = true;
+                    Thread.sleep(3000);
+                }catch (McException e){
+                    if (e.getMessage().contains("The request has failed due to a temporary failure of the server.")){
+                        log.info("请求失败,尝试次数:{}",i);
+                        i++;
+                        try {
+                            Thread.sleep(3000);
+                        } catch (InterruptedException ex) {
+                            throw new RuntimeException(ex);
+                        }
+                    }else {
+                        log.info("删除失败 失败原因:{}" , e.getMessage());
+                        errorList.addAll(list);
+                        flag = true;
+                    }
+                }catch (Exception e){
+                    log.info("删除失败 失败原因:{}" , e.getMessage());
+                    errorList.addAll(list);
+                    flag = true;
+                }
+            }
+            if (i>5){
+                log.info("删除失败,重试次数过多");
+            }
+
+        }while (ddrNew.getTotalCount() > 0);
+
+        log.info("失败列表:{}",errorList);
+    }
+
+    @Test
+    public void test6(){
+        System.out.println("2025-06-13 "+ kabeiyiService.getWeekRange("2025-06-13"));
+
+        System.out.println("2025-06-14 "+ kabeiyiService.getWeekRange("2025-06-14"));
+        System.out.println("2025-06-15 "+ kabeiyiService.getWeekRange("2025-06-15"));
+        System.out.println("2025-06-16 "+ kabeiyiService.getWeekRange("2025-06-16"));
+        System.out.println("2025-06-17 "+ kabeiyiService.getWeekRange("2025-06-17"));
+        System.out.println("2025-06-18 "+ kabeiyiService.getWeekRange("2025-06-18"));
+        System.out.println("2025-06-19 "+ kabeiyiService.getWeekRange("2025-06-19"));
+        System.out.println("2025-06-20 "+ kabeiyiService.getWeekRange("2025-06-20"));
+
+        System.out.println("2025-06-21 "+ kabeiyiService.getWeekRange("2025-06-21"));
+    }
 }

+ 1 - 1
mjava-yiyao/pom.xml

@@ -42,7 +42,7 @@
     </dependencies>
 
     <build>
-        <finalName>boyang</finalName>
+        <finalName>yiyao</finalName>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>

+ 102 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/controller/CallBackController.java

@@ -0,0 +1,102 @@
+package com.malk.yiyao.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.controller.DDCallbackController;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.crypto.DingCallbackCrypto;
+import com.malk.service.dingtalk.DDClient_Event;
+import com.malk.yiyao.service.YiyaoService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RestController
+@Component
+@RequestMapping("/aa")
+public class CallBackController extends DDCallbackController {
+    @Autowired
+    private DDConf ddConf;
+
+    @Autowired
+    private DDClient_Event ddClient_event;
+
+    @Autowired
+    private YiyaoService yiyaoService;
+
+    /**
+     * 钉钉审批回调: [依赖包方案已弃用]
+     * -
+     * DingCallbackCrypto 方案: 官网案例 DingCallbackCrypto 不在钉钉架包, 需要单独引用
+     * 在钉钉开放平台重新保存回调地址后, 所有的注册事件会被关闭:: 通过代码注册不成功; 官方回复, 要么使用调用注册的方式 要么是后台的方式, 二选一
+     */
+    @SneakyThrows
+    public Map<String, String> invokeCallback(@RequestParam(value = "signature", required = false) String signature,
+                                              @RequestParam(value = "timestamp", required = false) String timestamp,
+                                              @RequestParam(value = "nonce", required = false) String nonce,
+                                              @RequestBody(required = false) JSONObject json) {
+        log.info("signature:{}",signature);
+        log.info("timestamp:{}",timestamp);
+        log.info("nonce:{}",nonce);
+        log.info("json:{}",json);
+
+        DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(ddConf.getToken(), ddConf.getAesKey(), ddConf.getAppKey());
+        final String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, json.getString("encrypt"));
+        JSONObject eventJson = JSON.parseObject(decryptMsg);
+        Map success = callbackCrypto.getEncryptedMap(DDConf.CALLBACK_RESPONSE, System.currentTimeMillis(), DingCallbackCrypto.Utils.getRandomStr(8));
+
+        String eventType = eventJson.getString("EventType");
+        if (DDConf.CALLBACK_CHECK.equals(eventType)) {
+            log.info("----- [DD]验证注册 -----");
+            return success;
+        }
+        if ("check_in".equals(eventType)) {
+            String eventId = eventJson.getString("eventId");//事件id
+
+            log.info("[DD]签到回调, {}", eventJson);
+
+            // 检查回调事件是否已经处理过,如果是,则忽略该回调
+            if (isCallbackProcessed(eventId)) {
+                log.info("----- [DD]该签到回调事件已处理过 忽略该回调 -----");
+                return success;
+            }else {
+                // 将回调事件和当前时间戳添加到已处理集合中
+                long currentTime = System.currentTimeMillis();
+                eventList.put(eventId, currentTime);
+            }
+
+            yiyaoService.getCheckInData(eventJson);
+
+            return success;
+        }
+        log.info("----- [DD]已注册, 未处理的其它回调 -----, {}", eventJson);
+        return success;
+    }
+
+    //保存10s内已处理的回调事件
+    private Map<String, Long> eventList = new HashMap<>();
+
+    /**
+     * 检查该回调事件在10s内是否处理过,应对钉钉瞬间重复回调
+     *
+     * @param eventId 回调事件id
+     * @return 是否处理过
+     */
+    private boolean isCallbackProcessed(String eventId) {
+        // 清理超过10s的回调事件
+        long currentTime = System.currentTimeMillis();
+        long expirationTime = currentTime - TimeUnit.MINUTES.toMillis(10);
+        eventList.entrySet().removeIf(entry -> entry.getValue() < expirationTime);
+
+        return eventList.containsKey(eventId);
+    }
+
+}

+ 3 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/YiyaoService.java

@@ -1,5 +1,6 @@
 package com.malk.yiyao.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.malk.server.common.McR;
 
 public interface YiyaoService {
@@ -20,4 +21,6 @@ public interface YiyaoService {
     McR updateYiyao8();
 
     McR updateYiyao9();
+
+    void getCheckInData(JSONObject eventJson);
 }

+ 69 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/impl/YiyaoServiceImpl.java

@@ -18,6 +18,7 @@ import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -1471,6 +1472,63 @@ public class YiyaoServiceImpl implements YiyaoService {
         return McR.success();
     }
 
+    @Override
+    public void getCheckInData(JSONObject eventJson) {
+        String timeStamp = eventJson.getString("timeStamp");//签到时间戳
+
+        timeStamp = roundToNearestThousand(Long.parseLong(timeStamp)) + "";
+
+        String staffId = eventJson.getString("StaffId");//签到人userId
+
+        //获取签到数据
+        Map body = new HashMap();
+        body.put("cursor",0);
+        body.put("size",100);
+        body.put("start_time",timeStamp);
+        body.put("end_time",timeStamp);
+        body.put("userid_list",staffId);
+
+
+
+        //查询用户详情
+        DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", staffId), DDR_New.class);
+
+        Map result1 = (Map) ddrNew1.getResult();
+
+        String userName = UtilMap.getString(result1, "name");
+
+        //查询用户考勤数据
+        DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/checkin/record/get", null, ddClient.initTokenParams(), body, DDR_New.class);
+
+        Map result = (Map) ddrNew.getResult();
+
+        List list = UtilMap.getList(result, "page_list");
+
+        if (!list.isEmpty()){
+            Map formData = new HashMap();
+
+            Map checkInData = (Map) list.get(0);
+
+            Long checkinTime = UtilMap.getLong(checkInData, "checkin_time");
+            String detailPlace = UtilMap.getString(checkInData, "detail_place");
+            String remark = UtilMap.getString(checkInData,"remark");
+
+            formData.put("employeeField_mbypt8ro",Arrays.asList(staffId));//签到人
+            formData.put("textField_mbyq1cji",userName);//签到人-文本
+            formData.put("dateField_mbrb3qfy",checkinTime);//签到时间
+            formData.put("textField_mbrb3qfx",detailPlace);//签到地点
+            formData.put("textareaField_mbypt8rp",remark);//备注
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+            String formattedDate = sdf.format(Long.parseLong(timeStamp));
+            formData.put("textField_mbrbdyl4","签到人:" +userName + ",签到时间:" + formattedDate + ",签到地点:" + detailPlace);//标题
+
+            ydClient.operateData(YDParam.builder()
+                    .formUuid("FORM-D4389CDAD1704F959E9D38CB64927AD8PKCH")
+                    .formDataJson(JSONObject.toJSONString(formData))
+                    .build(),YDConf.FORM_OPERATION.create);
+        }
+    }
+
 
     private List<Map> getYdDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
         List<Map> list = new ArrayList<>();
@@ -1488,4 +1546,15 @@ public class YiyaoServiceImpl implements YiyaoService {
         }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
         return list;
     }
+
+    public long roundToNearestThousand(long timestamp) {
+        // 将时间戳除以1000,得到秒级部分(带毫秒的小数部分)
+        double seconds = timestamp / 1000.0;
+
+        // 对秒级部分的个位数进行四舍五入(即对毫秒的千位四舍五入)
+        long roundedSeconds = Math.round(seconds);
+
+        // 将四舍五入后的秒级部分转换回毫秒时间戳
+        return roundedSeconds * 1000;
+    }
 }

+ 6 - 6
mjava-yiyao/src/main/resources/application-dev.yml

@@ -13,12 +13,12 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 2691784047
-  appKey: dinghbynhnd2dbgypmsa
-  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
-  corpId: dingcc1b1ffad0d5ca1d
-  aesKey:
-  token:
+  agentId: 3914874648
+  appKey: dingyedbqoqricilvyog
+  appSecret: CAPT0hNRO5y-rHp81fmzMHz4LXYJhzkHqG1kh1L6OdM_LQPANR9IOoLtJrNLPVCc
+  corpId: dingf11f7d6ff834577b
+  aesKey: UqJRA1RTxarywiIWOK76BN8BSLfAN4gTDo6nEco4sqG
+  token: CpR7AsWa026FQV5VBNU5YrO5
 
 aliwork:
   appType: APP_HJJ3X3QN4WEWDHU2BJR2

+ 8 - 9
mjava-yiyao/src/main/resources/application-prod.yml

@@ -13,15 +13,14 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 3749205961
-  appKey: dingdcxnvojhmwi1lau0
-  appSecret: K0dfunjkLVQKzEN6KXbjdUxcVAX5_hyc0rTNzrj4MugXKc-dkn0erpAxzhSeGPVC
-  corpId:
-  aesKey:
-  token:
-  operator: 344749020127590108
+  agentId: 3914874648
+  appKey: dingyedbqoqricilvyog
+  appSecret: CAPT0hNRO5y-rHp81fmzMHz4LXYJhzkHqG1kh1L6OdM_LQPANR9IOoLtJrNLPVCc
+  corpId: dingf11f7d6ff834577b
+  aesKey: UqJRA1RTxarywiIWOK76BN8BSLfAN4gTDo6nEco4sqG
+  token: CpR7AsWa026FQV5VBNU5YrO5
 
 aliwork:
-  appType: APP_TTZS5KICGVVQNZ3RS8T4
-  systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
+  appType: APP_HJJ3X3QN4WEWDHU2BJR2
+  systemToken: 7X866C81QPIHJKBFFM1QW4S8BV1U3U4MFO5RLY1