Explorar el Código

Merge branch 'master' of https://mc.cloudpure.cn/mjava/cont

wzy hace 2 meses
padre
commit
8ff806cf5a
Se han modificado 66 ficheros con 6321 adiciones y 52 borrados
  1. 95 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/controller/HeiHuOrderController.java
  2. 12 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/entity/ImageField.java
  3. 78 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/entity/Order.java
  4. 50 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/entity/TableField.java
  5. 26 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/schedule/ScheduleTask.java
  6. 44 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/HeiHuOrderService.java
  7. 1007 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/Impl/HeiHuOrderServiceImpl.java
  8. 465 0
      mjava-fenggefushi/src/main/java/com/malk/fenggefushi/test/test.java
  9. 88 0
      mjava-fenggefushi/src/main/resources/application-dev.yml
  10. 77 0
      mjava-fenggefushi/src/main/resources/application-prod.yml
  11. 3 0
      mjava-fenggefushi/src/main/resources/application.yml
  12. 21 10
      mjava-huagao/src/main/java/com/malk/huagao/controller/KdYdCustomerController.java
  13. 1 1
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/YdHuaGaoServiceImpl.java
  14. 75 0
      mjava-junengtai/src/main/java/com/malk/junengtai/controller/PurchaseController.java
  15. 50 0
      mjava-junengtai/src/main/java/com/malk/junengtai/schedule/Schedule.java
  16. 303 0
      mjava-junengtai/src/main/java/com/malk/junengtai/service/Impl/PurchaseServiceImpl.java
  17. 27 0
      mjava-junengtai/src/main/java/com/malk/junengtai/service/PurchaseService.java
  18. 85 0
      mjava-junengtai/src/main/java/com/malk/junengtai/test/test.java
  19. 88 0
      mjava-junengtai/src/main/resources/application-dev.yml
  20. 76 0
      mjava-junengtai/src/main/resources/application-prod.yml
  21. 3 0
      mjava-junengtai/src/main/resources/application.yml
  22. 39 1
      mjava-lilin/src/main/java/com/malk/lilin/Controller/LiLinController.java
  23. 27 36
      mjava-lilin/src/main/java/com/malk/lilin/Service/impl/LiLinServiceImpl.java
  24. 1 1
      mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java
  25. 1 1
      mjava-mc/src/main/resources/application.yml
  26. 111 0
      mjava-ounuo/pom.xml
  27. 70 0
      mjava-ounuo/src/main/java/com/malk/tuosi/MjavaOunuoApplication.java
  28. 70 0
      mjava-ounuo/src/main/java/com/malk/tuosi/controller/TBController.java
  29. 179 0
      mjava-ounuo/src/main/java/com/malk/tuosi/controller/TaskController.java
  30. 25 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/AnnualSeasonalSample.java
  31. 27 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/ConfirmDesignYear.java
  32. 27 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/DesigndeparttMonthConfirm.java
  33. 29 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/EmployeeWeeklyTasks.java
  34. 25 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/NewprocessImplementation.java
  35. 31 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/Task.java
  36. 30 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/YearPersonalConfirm.java
  37. 9 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/AnnualSeasonalSampleMapper.java
  38. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/ConfirmDesignYearMapper.java
  39. 9 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/DesigndeparttMonthConfirmMapper.java
  40. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/EmployeeWeeklyTasksMapper.java
  41. 9 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/NewprocessImplementationMapper.java
  42. 16 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/TaskMapper.java
  43. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/YearPersonalConfirmMapper.java
  44. 958 0
      mjava-ounuo/src/main/java/com/malk/tuosi/schedule/ScheduleTask.java
  45. 7 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/AnnualSeasonalSampleService.java
  46. 7 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/ConfirmDesignYearService.java
  47. 8 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/DesigndeparttMonthConfirmService.java
  48. 7 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/EmployeeWeeklyTasksService.java
  49. 7 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/NewprocessImplementationService.java
  50. 32 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/TBService.java
  51. 10 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/TaskService.java
  52. 7 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/YearPersonalConfirmService.java
  53. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/AnnualSeasonalSampleServiceImpl.java
  54. 14 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/ConfirmDesignYearServiceImpl.java
  55. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/DesigndeparttMonthConfirmServiceImpl.java
  56. 12 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/EmployeeWeeklyTasksServiceImpl.java
  57. 14 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/NewprocessImplementationServiceImpl.java
  58. 18 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TaskServiceImpl.java
  59. 806 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TbServiceImpl.java
  60. 9 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/YearPersonalConfirmServiceImpl.java
  61. 263 0
      mjava-ounuo/src/main/java/com/malk/tuosi/test/test.java
  62. 114 0
      mjava-ounuo/src/main/resources/application-dev.yml
  63. 99 0
      mjava-ounuo/src/main/resources/application-prod.yml
  64. 3 0
      mjava-ounuo/src/main/resources/application.yml
  65. 13 0
      mjava-ounuo/src/test/java/com/malk/tuosi/MjavaOunuoApplicationTests.java
  66. 439 2
      pom.xml

+ 95 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/controller/HeiHuOrderController.java

@@ -0,0 +1,95 @@
+package com.malk.fenggefushi.controller;
+
+import com.malk.fenggefushi.service.HeiHuOrderService;
+import com.malk.server.common.McR;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.framework.qual.PostconditionAnnotation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@Slf4j
+@RequestMapping("/HeiHuOrder")
+public class HeiHuOrderController {
+    @Autowired
+    private HeiHuOrderService huOrderService;
+
+    /*=======================会用到的接口========================*/
+
+    /*TODO:获取黑湖工单登录token*/
+    @SneakyThrows
+    @PostMapping("/getToken")
+    McR HeiHuAccessToken(){
+        log.info("------------获取到黑湖工单的token------------");
+        return McR.success(huOrderService.HeiHuAccessToken());
+    }
+
+    /*TODO:【采购订单】发起宜搭审批流程*/
+    @SneakyThrows
+    @PostMapping("/startYidaProcurementAproval")
+    McR startYidaProcurementAproval(@RequestParam String OrderNo, @RequestParam String FormUuType){
+        log.info("-----------开始抓取黑湖采购工单,准备发起宜搭审批流程---------");
+        return McR.success(huOrderService.startYidaProcurementAproval(OrderNo,FormUuType));
+    }
+
+    /*TODO:采购订单创建触发*/
+    @SneakyThrows
+    @PostMapping("/Procurement")
+    McR Procurement(@RequestBody Map body){
+        log.info("【接收到黑湖采购工单创建请求】");
+        return McR.success(huOrderService.Procurement(body));
+    }
+
+    /*TODO:销售订单修改*/
+    @SneakyThrows
+    @PostMapping("/salesUpdate")
+    McR salesUpdate(@RequestBody Map body){
+        log.info("[接收到销售订单审批单修改],{}",body);
+        return McR.success(huOrderService.salesUpdate(body));
+    }
+
+    /*todo:销售订单创建触发*/
+    @SneakyThrows
+    @PostMapping("/salesAproval")
+    McR salesAproval(@RequestBody Map body){
+        log.info("【接收到黑湖销售工单创建请求】,{}",body);
+        return McR.success(huOrderService.salesAproval(body));
+    }
+
+    /*todo:销售订单不单独走审批,存入销售订单流程档案*/
+    @SneakyThrows
+    @PostMapping("/startYidaSalesAproval")
+    McR startYidaSalesAproval(@RequestParam String OrderNo,@RequestParam String fromUuid) {
+        return McR.success(huOrderService.StartYidaAproval(OrderNo,fromUuid));
+    }
+
+    /*todo:查询产品颜色接口*/
+    @SneakyThrows
+    @PostMapping("/getProductColor")
+    McR getProductColor(@RequestParam List list){
+        return McR.success(huOrderService.getProductColor(list));
+    }
+
+
+
+    /*todo:销售订单审批结束后同步黑湖工单状态*/
+    @SneakyThrows
+    @PostMapping("/SyncOrderStatus")
+    McR SyncOrderStatus(@RequestParam String formInstanceId,@RequestParam String Approvalresult){
+        log.info("-----------【开始回传销售订单状态】----------");
+        return McR.success(huOrderService.SyncOrderStatus(formInstanceId,Approvalresult));
+    }
+
+    /*todo:采购订单审批结束同步黑湖工单状态*/
+    @SneakyThrows
+    @PostMapping("/SyncPurchaseOrderStatus")
+    McR SyncPurchaseOrderStatus(@RequestParam String formInstanceId,@RequestParam String Approvalresult){
+        log.info("------------【开始回传采购订单状态】--------");
+        return McR.success(huOrderService.SyncPurchaseOrderStatus(formInstanceId,Approvalresult));
+    }
+
+}

+ 12 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/entity/ImageField.java

@@ -0,0 +1,12 @@
+package com.malk.fenggefushi.entity;
+
+import lombok.Data;
+
+@Data
+public class ImageField {
+    private String name;
+    private String previewUrl;
+    private String downloadUrl;
+    private Long size;
+    private String url;
+}

+ 78 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/entity/Order.java

@@ -0,0 +1,78 @@
+package com.malk.fenggefushi.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Order {
+
+    @JsonProperty("orderCode")
+    private String orderCode;//1、订单编码
+
+    @JsonProperty("customer")
+    private String customer;//2、客户
+
+    @JsonProperty("orderDate")
+    private Long orderDate;//3、下单日期
+
+    @JsonProperty("plannedDeliveryDate")
+    private Long plannedDeliveryDate;//4、计划交货日期
+
+    @JsonProperty("contractNumber")
+    private String contractNumber;//5、合同号
+
+    @JsonProperty("salesperson")
+    private List<String> salesperson;//6、业务员
+
+    @JsonProperty("orderDiscount")
+    private Integer orderDiscount;//7、整单折扣
+
+    @JsonProperty("orderType")
+    private String orderType;//8、订单类型
+
+    @JsonProperty("tableField")
+    private List<TableField> tableField;//销售明细
+
+    @JsonProperty("estimatedAccessoryUnitPrice")
+    private String estimatedAccessoryUnitPrice;//1、辅料预估单价
+
+    @JsonProperty("relatedPrePurchaseOrderId")
+    private String relatedPrePurchaseOrderId;//2、对应预采购单号
+
+    @JsonProperty("qualityApproval")
+    private String qualityApproval;//3、品质确认
+
+    @JsonProperty("itemCycle")
+    private String itemCycle;//4、物料周期
+
+    @JsonProperty("productPhoto")
+    private List<ImageField> productPhoto;//5、产品照片
+
+    @JsonProperty("notes")
+    private String notes;//6、备注
+
+    @JsonProperty("customerName")
+    private String customerName;//7、客户名称
+
+    @JsonProperty("craftType")
+    private String craftType;//8、工艺类型
+
+    @JsonProperty("productCategory")
+    private String productCategory;//9、产品类型
+
+    @JsonProperty("department")
+    private String department;//10、部门
+
+    @JsonProperty("season")
+    private String season;//11、季节
+
+    @JsonProperty("brand")
+    private String brand;//12、品牌
+
+    @JsonProperty("plannedOrderQty")
+    private Integer plannedOrderQty;//13、预计下单量
+
+
+}

+ 50 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/entity/TableField.java

@@ -0,0 +1,50 @@
+package com.malk.fenggefushi.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TableField {
+
+    @JsonProperty("productCode")
+    private String productCode;//产品编号
+
+    @JsonProperty("productName")
+    private String productName;//产品名称
+
+    @JsonProperty("productSpec")
+    private String productSpec;//产品规格
+
+    @JsonProperty("productOriginType")
+    private String productOriginType;//产品属性
+
+    @JsonProperty("productStockQty")
+    private Integer productStockQty;//库存数量
+
+    @JsonProperty("qty")
+    private Integer qty;//数量
+
+    @JsonProperty("productUnitName")
+    private String productUnitName;//单位
+
+    @JsonProperty("unitPrice")
+    private Integer unitPrice;//单价
+
+    @JsonProperty("amount")
+    private Integer amount;//报价金额
+
+    @JsonProperty("discount")
+    private Integer discount;//折扣
+
+    @JsonProperty("taxInclusiveAmount")
+    private Integer taxInclusiveAmount;//含税金额
+
+    @JsonProperty("taxRate")
+    private Integer taxRate;//税率
+
+    @JsonProperty("arrivalPlanTime")
+    private Long arrivalPlanTime;//产品交货日期
+
+}

+ 26 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/schedule/ScheduleTask.java

@@ -0,0 +1,26 @@
+package com.malk.fenggefushi.schedule;
+
+import com.malk.fenggefushi.service.HeiHuOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class ScheduleTask {
+    @Autowired
+    private HeiHuOrderService huOrderService;
+
+    /*每5分钟定时*/
+    //销售订单
+
+
+}

+ 44 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/HeiHuOrderService.java

@@ -0,0 +1,44 @@
+package com.malk.fenggefushi.service;
+
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.malk.server.common.McR;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+public interface HeiHuOrderService {
+    /*获取登录黑湖工单token*/
+    McR HeiHuAccessToken() throws JacksonException;
+
+    /*发起宜搭审批流程:销售订单*/
+    McR StartYidaAproval(@RequestParam String OrderNo,@RequestParam String formUuid) throws JacksonException;
+
+    /*根据客户名字搜索userid*/
+    String getDDToken(@RequestParam String Name);
+
+    /*发起宜搭审批流程:采购订单*/
+    McR startYidaProcurementAproval(@RequestParam String OrderNo,@RequestParam String FromUuType) throws JsonProcessingException;
+
+    /*回传销售订单状态*/
+    McR SyncOrderStatus(@RequestParam  String formInstanceId,@RequestParam String Approvalresult) throws JsonProcessingException;
+
+    /*回传采购订单状态*/
+    McR SyncPurchaseOrderStatus(@RequestParam String formInstanceId,@RequestParam String Approvalresult) throws JsonProcessingException;
+
+    /*【新】销售订单*/
+    McR salesAproval(Map body) throws JacksonException;
+
+    /*【新】采购订单*/
+    McR Procurement(Map body) throws JacksonException;
+
+    /*销售订单修改*/
+    McR salesUpdate(Map body) throws JacksonException;
+
+    /*查询产品颜色*/
+    String getProductColor(@RequestParam List list) throws JacksonException;
+
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1007 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/Impl/HeiHuOrderServiceImpl.java


+ 465 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/test/test.java

@@ -0,0 +1,465 @@
+package com.malk.fenggefushi.test;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.malk.fenggefushi.service.HeiHuOrderService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.Na;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+@RestController
+@Slf4j
+@RequestMapping("/test")
+public class test {
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private YDService ydService;
+    @Autowired
+    private DDConf ddConf;
+    @Autowired
+    private HeiHuOrderService huOrderService;
+
+    @PostMapping("/test1")
+    McR test1(){
+        System.out.println("接口正常!");
+        return McR.success("接口正常!");
+    }
+
+    //测试程序发起下拉单选是否生效
+    @GetMapping("/test76")
+    McR test76(){
+        HashMap formdata = new HashMap();
+        formdata.put("selectField_mg5y3rcr","贸易公司订单");
+
+        // 图片/附件字段 - 使用完整的结构化格式
+        List<Map<String, Object>> imageAttachments = new ArrayList<>();
+        Map<String, Object> imageInfo = new HashMap<>();
+        imageInfo.put("name", "CWC-1758612192087.png");
+        imageInfo.put("downloadUrl", "https://filebase-prod-oss.blacklake.cn/CWC-1758612192087.png");
+        imageInfo.put("previewUrl", "https://filebase-prod-oss.blacklake.cn/CWC-1758612192087.png");
+        imageInfo.put("url", "https://filebase-prod-oss.blacklake.cn/CWC-1758612192087.png");
+        imageInfo.put("ext", "png");
+        imageAttachments.add(imageInfo);
+        formdata.put("imageField_mfqgmwde",imageAttachments);
+        
+        String string = ydClient.operateData(YDParam.builder()
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .formUuid("FORM-472F0C1BD8DF41FA965A0B4525779B67S421")
+                .userId("3320511511-1158713155")
+                .formDataJson(JSON.toJSONString(formdata))
+                .build(), YDConf.FORM_OPERATION.start).toString();
+        return McR.success(string);
+    }
+
+    //根据员工名字匹配员工id
+    String getDDToken(@RequestParam String Name){
+        HashMap body = new HashMap();
+        body.put("appKey","dingie28nalt6tcnzizl");
+        body.put("appSecret","Ss7na86M_BWPEXhKffiQDA-8jXvuBhBklfD8C-ot7xGwiDKfFMIf9y00mXYutfCB");
+        String s = UtilHttp.doPost("https://api.dingtalk.com/v1.0/oauth2/accessToken", null, null, body);
+        String accessToken  = JSONObject.parseObject(s).getString("accessToken");
+
+        HashMap header = new HashMap();
+        header.put("x-acs-dingtalk-access-token",accessToken);
+        HashMap bodyy = new HashMap();
+        bodyy.put("queryWord", Name);
+        bodyy.put("offset",0);
+        bodyy.put("size",10);
+        String s1 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/users/search", header, null, bodyy);
+        List<String> list = JSONObject.parseObject(s1).getJSONArray("list").toJavaList(String.class);
+        String userId = "";
+        if(list!= null && !list.isEmpty()){
+            userId = list.get(0);
+        }
+        return userId;
+    }
+
+    //创建宜搭普通表单
+    @PostMapping("/test77")
+    McR test77(){
+        HashMap formdata = new HashMap();
+        formdata.put("textField_mgq90lwf","1");
+        formdata.put("dateField_mgq90lwg","1760457600");
+        String dd = ydClient.operateData(YDParam.builder()
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .formUuid("FORM-1693380A673E498C827CD0A4C2D8214CIK90")
+                .userId("3320511511-1158713155")
+                .formDataJson(JSON.toJSONString(formdata))
+                .build(), YDConf.FORM_OPERATION.create).toString();
+        return McR.success(dd);
+    }
+
+    @PostMapping("/test78")
+    McR test78(){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        // 获取当前日期的零点时间
+        LocalDateTime todayMidnight = LocalDate.now().atStartOfDay();
+        String formattedToday = todayMidnight.format(formatter);
+
+        System.out.println("今天零点时间: " + formattedToday);
+        return McR.success();
+    }
+
+    @SneakyThrows
+    @PostMapping("/test79")
+    McR test79(){
+        HashMap header = new HashMap();
+        header.put("X-AUTH",huOrderService.HeiHuAccessToken().getData().toString());
+        header.put("Content-Type","application/json");
+        HashMap body = new HashMap();
+        body.put("orderCode","PO20250235");
+        /*TODO:对json进行处理*/
+        String jsonString  = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//todo:查询采购订单
+        List<String> orderNoList = new ArrayList<>();//存在这个orderList里面
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode rootNode = objectMapper.readTree(jsonString);
+        JsonNode dataNode = rootNode.get("data");
+        String orderNumber = "";
+        if (dataNode != null && dataNode.isArray()) {
+            for (JsonNode item : dataNode) {
+                JsonNode orderNoNode = item.get("orderCode");
+                JsonNode saleOrders = item.get("relationSaleOrders");
+                System.out.println("关联销售订单号:"+ saleOrders);
+                System.out.println("采购订单编号:" + orderNoNode);
+                if (saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0) {
+                    orderNumber = saleOrders.get(0).asText();
+                    System.out.println("关联销售订单号(字符串):" + orderNumber);
+                }
+
+                //采购订单编号
+                if (orderNoNode != null) {
+                    String purchaseOrderNo = orderNoNode.asText();
+                    System.out.println("采购订单编号(字符串):" + purchaseOrderNo);
+                }
+            }
+        }
+        System.out.println(orderNoList);
+        return McR.success();
+    }
+
+    @SneakyThrows
+    @PostMapping("/test80")
+    McR test80(){
+        HashMap header = new HashMap();
+        header.put("X-AUTH",huOrderService.HeiHuAccessToken().getData().toString());
+        header.put("Content-Type","application/json");
+        HashMap body = new HashMap();
+        body.put("orderNo","882698-1107444");
+        /*TODO:对json进行处理*/
+        String jsonString  = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body);//todo:查询采购订单
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode rootNode = objectMapper.readTree(jsonString);
+        JsonNode dataNode = rootNode.get("data");
+        if (dataNode != null && dataNode.isArray()) {
+            for (JsonNode item : dataNode) {
+                JsonNode customFieldValues = item.get("customFieldValues");
+                System.out.println("自定义字段列表:"+ customFieldValues);
+                if (customFieldValues != null && customFieldValues.isArray()) {
+                    for (JsonNode field : customFieldValues) {
+                        JsonNode fieldIdNode = field.get("fieldId");
+                        // 查找fieldId为47771的字段
+                        if (fieldIdNode != null && fieldIdNode.asInt() == 47771) {
+                            JsonNode valueNode = field.get("value");
+                            if (valueNode != null) {
+                                String value = valueNode.asText();
+                                System.out.println("fieldId为47771的value值:" + value);
+                                // 找到后可以跳出内层循环
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return McR.success();
+    }
+
+    @SneakyThrows
+    @PostMapping("/test81")
+    McR test81(){
+        HashMap head = new HashMap();
+        head.put("X-AUTH",huOrderService.HeiHuAccessToken().getData().toString());
+        head.put("Content-Type","application/json");
+        HashMap body = new HashMap();
+        body.put("orderNo","3300--");//订单编号
+        String s = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", head, null, body);
+        JSONObject jsonObject = JSONObject.parseObject(s);
+        JSONArray products = jsonObject.getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");
+        for (int i = 0; i < products.size(); i++) {
+            JSONObject detail = products.getJSONObject(i);
+            String customFieldValues = detail.getString("customFieldValues");
+            System.out.println("自定义字段:" + customFieldValues);
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode jsonArray = mapper.readTree(customFieldValues);
+            for (JsonNode node : jsonArray) {
+                if (node.get("fieldId").asInt() == 47919) {
+                    String value = node.get("value").asText();
+                    System.out.println("找到的 value: " + value); // 输出: CNY
+                    break;
+                }
+            }
+        }
+
+        return McR.success();
+    }
+
+    @SneakyThrows
+    @PostMapping("/getPurchaseList")
+    McR getPurchaseList(){
+        log.info("开始查询宜搭采购订单汇总表");
+        String formUuid = "FORM-56E11C4FAB6E4FB594169BB779736FF0ZG91";
+        YDParam ydParam = YDParam.builder().formUuid(formUuid).build();
+        ydParam.setPageSize(1);
+        long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
+        List<Map> datalist = new ArrayList<>();
+        ydParam.setCurrentPage(1);
+        ydParam.setPageSize(100);
+        int totalPages = (int)Math.ceil((double) totalCount / ydParam.getPageSize());
+
+        for (int page = 1;page <= totalPages;page++){
+            ydParam.setCurrentPage(page);
+            datalist.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
+        }
+        int i =0;
+        String jsonStr = "";
+        Map<String, String> orderMap = new HashMap<>();//格式:采购订单/关联销售订单
+        for(Map li : datalist){
+            i++;
+//            log.info("{}/{}",i,datalist.size());
+            jsonStr = li.get("formData").toString();
+            String orderNum = new ObjectMapper().readTree(jsonStr).get("textField_mgq932hi").asText();
+            String relatedOrderNum = new ObjectMapper().readTree(jsonStr).get("textField_mhyh7ues").asText();
+            orderMap.put(orderNum, relatedOrderNum);
+        }
+        return McR.success(orderMap);
+    }
+
+    @PostMapping("/updateTable")
+    McR updateTable(){
+        HashMap map = new HashMap();
+        ArrayList<Map> list = new ArrayList<>();
+        HashMap map1 = new HashMap();
+        map1.put("textField_mi2tln2x","测试1");
+        map1.put("numberField_mi2tln2y",1);
+        list.add(map1);
+        map.put("tableField_mi2tln2w",list);
+        ydService.operateData(YDParam.builder()
+                .appType(ydConf.getAppType())
+                .systemToken(ydConf.getSystemToken())
+                .formInstanceId("FINST-B7D66XA1ODP09SY6N5AB47TE5JAZ2YB5XT2IMNU")
+                .updateFormDataJson(JSONObject.toJSONString(map))
+                .build(),YDConf.FORM_OPERATION.update);
+        return McR.success();
+    }
+
+    @PostMapping("/test82")
+    McR test82(){
+
+        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+                .appType("APP_Q6XXLRDPRA0DDRMF3VL4")
+                .systemToken("BVG665B18O0Z0EXND3DCR44WX4MC22YQOFQFMCT6")
+                .formUuid("FORM-472F0C1BD8DF41FA965A0B4525779B67S421")
+                .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mfqgmwcw", "S20250070")))
+                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+        ArrayList<Map<String, Object>> productlist = new ArrayList<>();
+        Map<String, Object> firstData = dataList.get(0);
+        Map<String, Object> formData = (Map<String, Object>) firstData.get("formData");
+        List<Map<String, Object>> tableData = (List<Map<String, Object>>) formData.get("tableField_mfqgmwe0");
+        for (Map<String, Object> row : tableData) {
+            Map<String, Object> productMap = new HashMap<>();
+            // 提取需要的字段
+            productMap.put("qty", row.get("numberField_mfqgmwe6"));           // 数量:12
+            productMap.put("unitPrice", row.get("numberField_mfqgmwe9"));     // 单价:1.2
+            productMap.put("productCode", row.get("textField_mfqgmwe1"));     // 产品编号:CP202503171676
+            productMap.put("productName", row.get("textField_mfqgmwe2"));     // 产品名称:10856磨毛纱卡(轻水洗)(SF)
+            productlist.add(productMap);
+        }
+        System.out.println("结果是:" + productlist);
+        return McR.success();
+    }
+
+    @PostMapping("/test83")
+    McR test83(){
+        ArrayList<Map<String, Object>> originalList = new ArrayList<>();
+        Map<String, Object> productMap = new HashMap<>();
+        productMap.put("qty", 12);           // 数量:12
+        productMap.put("unitPrice", 1.2);     // 单价:1.2
+        productMap.put("productCode", "CP202503171676");     // 产品编号:CP202503171676
+        productMap.put("productName", "10856磨毛纱卡(轻水洗)(SF)");     // 产品名称:10856磨毛纱卡(轻水洗)(SF)
+        originalList.add(productMap);
+        Map<String, Object> productMap1 = new HashMap<>();
+        productMap1.put("qty", 1);           // 数量:12
+        productMap1.put("unitPrice", 6.3);     // 单价:6.3
+        productMap1.put("productCode", "CP202503171676");     // 产品编号:CP202503171676
+        productMap1.put("productName", "纱卡(轻水洗)");     // 产品名称:纱卡(轻水洗)
+        originalList.add(productMap1);
+        System.out.println("更新前数据:" + originalList);
+
+
+        ArrayList<Map<String, Object>> updatedList  = new ArrayList<>();
+        Map<String, Object> productMap_B = new HashMap<>();
+        productMap_B.put("qty", 10);           // 数量:12
+        productMap_B.put("unitPrice", 1.2);     // 单价:1.2
+        productMap_B.put("productCode", "CP202503171676");     // 产品编号:CP202503171676
+        productMap_B.put("productName", "10856磨毛纱卡(轻水洗)(SF)");     // 产品名称:10856磨毛纱卡(轻水洗)(SF)
+        updatedList.add(productMap_B);
+        Map<String, Object> productMap_B1 = new HashMap<>();
+        productMap_B1.put("qty", 2);           // 数量:12
+        productMap_B1.put("unitPrice", 6.3);     // 单价:1.2
+        productMap_B1.put("productCode", "CP202503171676");     // 产品编号:CP202503171676
+        productMap_B1.put("productName", "纱卡(轻水洗)");     // 产品名称:10856磨毛纱卡(轻水洗)(SF)
+        updatedList.add(productMap_B1);
+        System.out.println("更新后数据:" + updatedList);
+
+        List<Map<String, Object>> changedProducts = new ArrayList<>();
+        // 遍历数据,找出发生改变的产品
+        for (int i = 0; i < updatedList.size(); i++) {
+            Map<String, Object> updatedProduct = updatedList.get(i);
+            Map<String, Object> originalProduct = originalList.get(i);
+
+            // 检查数量或单价是否发生变化
+            if (!updatedProduct.get("qty").equals(originalProduct.get("qty")) ||
+                    !updatedProduct.get("unitPrice").equals(originalProduct.get("unitPrice"))) {
+
+                Map<String, Object> changedProduct = new HashMap<>();
+                changedProduct.put("productCode", updatedProduct.get("productCode"));
+                changedProduct.put("productName", updatedProduct.get("productName"));
+                changedProduct.put("qty_old", originalProduct.get("qty"));
+                changedProduct.put("unitPrice_old", originalProduct.get("unitPrice"));
+
+                changedProducts.add(changedProduct);
+            }
+        }
+        System.out.println("变化的值:" + changedProducts);
+        return McR.success();
+    }
+
+    @PostMapping("/test84")
+    McR test84(){
+        String formInstanceId_bqb= "";
+        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+                .appType("APP_Q6XXLRDPRA0DDRMF3VL4")
+                .systemToken("BVG665B18O0Z0EXND3DCR44WX4MC22YQOFQFMCT6")
+                .formUuid("FORM-A98E291B02DA400B84C05BAEF735F8AFUBQP")
+                .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mi2twkgd", "F3D66D91MEL0EV3TO3YUB6FYUS5S3IC9453IMJ9S")))
+                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+        if(dataList != null && dataList.size() > 0){
+            for(Map M : dataList){
+                formInstanceId_bqb = M.get("formInstanceId").toString();
+            }
+        }
+        System.out.println(formInstanceId_bqb);
+        return McR.success();
+    }
+
+    /*采购订单修改流程发起*/
+    @PostMapping("/test85")
+    McR test85(){
+        HashMap formdata = new HashMap();
+        formdata.put("textField_mfqia327",System.currentTimeMillis());
+        formdata.put("textField_mfqia328","东莞市元伊纺织有限公司");//供应商变更后的值
+        String gys = "如东知品服饰有限公司";//供应商变更前的值
+        formdata.put("textareaField_mjghnmvv","{\"textField_mfqia328\":\"<article class=\\\"4ever-xarticle\\\"><p style=\\\"text-align:left;text-indent:0;margin-left:0;margin-top:0;margin-bottom:0\\\"><span style=\\\"color:#FE0300\\\">" + gys + "</span></p></article>\"}");
+        ArrayList<Map> list = new ArrayList<>();
+        HashMap map1 = new HashMap();
+        map1.put("textField_mjsamf3j","童装");
+        map1.put("textField_mjsamf3k",null);
+        map1.put("textField_mjsamf3l","A款");
+        map1.put("textField_mjsamf3m",null);
+        map1.put("textField_mjsamf3n","1");
+        map1.put("numberField_mjsamf3o",1);
+        map1.put("numberField_mjsamf3p",1);
+        map1.put("numberField_mjsamf3q",1);
+        map1.put("textField_mjsamf3r",null);
+        map1.put("textField_mjsamf3s",null);
+        map1.put("numberField_mjsamf3t",1);
+        map1.put("numberField_mjsamf3u",1);
+        map1.put("numberField_mjsamf3v",1);
+        list.add(map1);
+        formdata.put("tableField_mjsamf3w",list);
+        ArrayList<Map> list_AAA = new ArrayList<>();
+        HashMap map2 = new HashMap();
+        map2.put("textField_mhsj6gtn","1");
+        map2.put("textField_mhsj6gto","1");
+        map2.put("textField_mhsj6gtp","1");
+        map2.put("textField_mhsj6gtq","1");
+        map2.put("textField_mhsj6gtr","1");
+        map2.put("numberField_mhsj6gts",1);
+        map2.put("numberField_mhsj6gtt",1);
+        map2.put("numberField_mhsj6gtu",1);
+        map2.put("textField_mhtxft3p","1");
+        map2.put("textField_mhsj6gtv","1");
+        map2.put("numberField_mhsj6gtw",1);
+        map2.put("numberField_mhtxft3q",1);
+        map2.put("numberField_mhsj6gtx",1);
+        list_AAA.add(map2);
+        formdata.put("tableField_mhsj6gtm",list_AAA);
+        ydClient.operateData(YDParam.builder()
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .formUuid("FORM-7EB4796C4B054EEAA1B0FD52FC54C8387ZUN")
+                .userId("3320511511-1158713155")
+                .formDataJson(JSON.toJSONString(formdata))
+                .build(), YDConf.FORM_OPERATION.start).toString();
+        return McR.success();
+    }
+
+    /*条件查询宜搭数据*/
+    @PostMapping("/test86")
+    McR test86(){
+        List<Map> list  = (List<Map>) ydClient.queryData(YDParam.builder()
+                        .formUuid("FORM-472F0C1BD8DF41FA965A0B4525779B67S421")
+                        .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
+                                "textField_mfqgmwcw", "S20260003", "订单编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
+                        .build()
+                ,YDConf.FORM_QUERY.retrieve_list).getData();
+        log.info("[销售订单流程档案数据],{}",list);
+        String formInstanceId = (String) list.get(0).get("formInstanceId");
+        log.info("[销售订单流程的实例ID],{}",formInstanceId);
+        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        List<Map<String, Object>> table = (List<Map<String, Object>>) data.get("tableField_mfqgmwe0");
+        for (Map<String, Object> row : table) {
+            System.out.println("客户: " + data.get("textField_mfqgmwcx"));
+            System.out.println("订单号: " + data.get("textField_mfqgmwcw"));
+            System.out.println("款号: " + row.get("textField_mfqgmwe1"));
+            System.out.println("产品描述: " + row.get("textField_mfqgmwe2"));
+            System.out.println("颜色: " + row.get("textField_mk0jz9i1"));
+            System.out.println("数量: " + row.get("numberField_mfqgmwe6"));
+            System.out.println("销售单价: " + row.get("numberField_mfqgmwe8"));
+            System.out.println("销售金额: " + row.get("numberField_mfqgmweb") );
+            System.out.println("币别: " + row.get("textField_mk0xio3b")  );
+            System.out.println("-----------------------------");
+        }
+        return McR.success();
+    }
+
+
+
+}

+ 88 - 0
mjava-fenggefushi/src/main/resources/application-dev.yml

@@ -0,0 +1,88 @@
+# 环境配置
+server:
+  port: 9033
+  servlet:
+    context-path: /api/fengge
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+#      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: ounuo_user
+    password: OUNUO123!
+    url: jdbc:mysql://ounuo.raresoft.net:33306/TASK
+  jpa:
+    hibernate:
+      ddl-auto: none
+    show-sql: true
+    database: oracle
+  hikari:
+    pool-name: DateHikariCP
+    minimum-idle: 0
+    maximum-pool-size: 10
+    idle-timeout: 30000
+    max-lifetime: 120000          # 小于数据库超时大于业务执行返回时间[hikari默认30m, mysql默认10m]
+    connection-timeout: 30000     # 数据库连接超时时间,默认30秒,即30000
+
+
+
+  #    # 主库
+#    primary:
+#      username: root
+#      password: mu123
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#    # 从库
+#    slave:
+#      username: root
+#      password: mu123
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#  jpa:
+#    hibernate:
+#      ddl-auto: none      # JPA对表没有任何操作
+#    show-sql: true
+#    database: ORACLE
+#    database-platform: org.hibernate.dialect.Oracle12cDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk 钉钉
+dingtalk:
+  agentId: 4023219667
+  appKey: dingie28nalt6tcnzizl
+  appSecret: Ss7na86M_BWPEXhKffiQDA-8jXvuBhBklfD8C-ot7xGwiDKfFMIf9y00mXYutfCB
+  corpId: ding9b4b07dc53a2d53b35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: 3320511511-1158713155   # OA管理员账号:鲜明阳 [0开头需要转一下字符串]
+
+# aliwork 宜搭
+aliwork:
+  appType: APP_Q6XXLRDPRA0DDRMF3VL4
+  systemToken: BVG665B18O0Z0EXND3DCR44WX4MC22YQOFQFMCT6
+
+# MyBatis配置
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  type-aliases-package: com.malk.tuosi.entity
+  configuration:
+    map-underscore-to-camel-case: true
+
+#定时器
+enable:
+  scheduling: true

+ 77 - 0
mjava-fenggefushi/src/main/resources/application-prod.yml

@@ -0,0 +1,77 @@
+# 环境配置
+server:
+  port: 7878
+  servlet:
+    context-path: /api/fengge
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    hikari:
+    #      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: ounuo_user
+    password: OUNUO123!
+    url: jdbc:mysql://ounuo.raresoft.net:33306/TASK
+
+
+  #    # 主库
+  #    primary:
+  #      username: root
+  #      password: mu123
+  #      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  #    # 从库
+  #    slave:
+  #      username: root
+  #      password: mu123
+  #      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: ORACLE
+    database-platform: org.hibernate.dialect.Oracle12cDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk 钉钉
+dingtalk:
+  agentId: 4023219667
+  appKey: dingie28nalt6tcnzizl
+  appSecret: Ss7na86M_BWPEXhKffiQDA-8jXvuBhBklfD8C-ot7xGwiDKfFMIf9y00mXYutfCB
+  corpId: ding9b4b07dc53a2d53b35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: 3320511511-1158713155   # OA管理员账号:鲜明阳 [0开头需要转一下字符串]
+
+# aliwork 宜搭
+aliwork:
+  appType: APP_Q6XXLRDPRA0DDRMF3VL4
+  systemToken: BVG665B18O0Z0EXND3DCR44WX4MC22YQOFQFMCT6
+
+
+# MyBatis配置
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  type-aliases-package: com.malk.tuosi.entity
+  configuration:
+    map-underscore-to-camel-case: true
+
+#定时器
+enable:
+  scheduling: true

+ 3 - 0
mjava-fenggefushi/src/main/resources/application.yml

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

+ 21 - 10
mjava-huagao/src/main/java/com/malk/huagao/controller/KdYdCustomerController.java

@@ -10,6 +10,9 @@ import com.malk.server.aliwork.YDParam;
 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_Contacts;
+import com.malk.service.dingtalk.DDClient_Workflow;
 import com.malk.utils.UtilMap;
 import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,11 +42,19 @@ public class KdYdCustomerController {
     private YdHuaGaoService ydHuaGaoService;
     @Autowired
     private IKdYdZpService kdYdZpService;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+    @Autowired
+    private DDClient ddClient;
 @Autowired
 private YDClient ydClient;
     @PostMapping("/test30")
     McR test13(@RequestBody Map data) {
         MDC.put("MDC_KEY_PID","1003");
+//        Map userInfoByMobile1 = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), "yzsyzid2");
+//        if (userInfoByMobile1 != null && userInfoByMobile1.containsKey("mobile")) {
+//            mobile = String.valueOf(userInfoByMobile1.get("mobile"));
+//        }
 //        String ins = String.valueOf(data.get("formInstId"));
 //
 //
@@ -59,16 +70,16 @@ private YDClient ydClient;
 //                .formInstanceIdList((List<String>) ddrNew.getData())
 //                .build(), YDConf.FORM_OPERATION.delete_batch);
 
-        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
-                .formInstId("FINST-DZ966471VB228QLYJ6WXG6I7YGV631VYLW0KMBQE")
-                .build(), YDConf.FORM_QUERY.retrieve_id);
-//
-//        if (ddrNew == null || ddrNew.getFormData() == null) {
-//            throw new RuntimeException("未找到订单信息");
-//        }
-//
-        Map formData1 = ddrNew.getFormData();
-        System.out.println("======"+formData1);
+//        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+//                .formInstId("FINST-DZ966471VB228QLYJ6WXG6I7YGV631VYLW0KMBQE")
+//                .build(), YDConf.FORM_QUERY.retrieve_id);
+////
+////        if (ddrNew == null || ddrNew.getFormData() == null) {
+////            throw new RuntimeException("未找到订单信息");
+////        }
+////
+//        Map formData1 = ddrNew.getFormData();
+//        System.out.println("======"+formData1);
 
 //        String ddje = UtilMap.getString(formData1, "numberField_mjm9k35k");
 //        String dddate = UtilMap.getString(formData1, "dateField_mjm9k35j");

+ 1 - 1
mjava-huagao/src/main/java/com/malk/huagao/service/impl/YdHuaGaoServiceImpl.java

@@ -830,7 +830,7 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
         log.info("定时同步-物料单");
         // 查询需要删除的数据
         LambdaQueryWrapper<KdYdMaterial> materialdel = new LambdaQueryWrapper<>();
-        materialdel.eq(KdYdMaterial::getOperationType, "3")  // 修正:使用 materialdel 而不是 materialqw
+        materialdel.eq(KdYdMaterial::getOperationType, "3")
                 .eq(KdYdMaterial::getSyncStatus, "0");
         List<KdYdMaterial> kdYdMaterialdels = kdYdMaterialMapper.selectList(materialdel);
 

+ 75 - 0
mjava-junengtai/src/main/java/com/malk/junengtai/controller/PurchaseController.java

@@ -0,0 +1,75 @@
+package com.malk.junengtai.controller;
+
+import com.malk.junengtai.service.PurchaseService;
+import com.malk.server.common.McException;
+import com.malk.server.common.McR;
+import com.malk.utils.UtilMap;
+import com.malk.utils.UtilServlet;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+@RestController
+@Slf4j
+@RequestMapping("/Purchase")
+public class PurchaseController {
+    @Autowired
+    private PurchaseService purchaseService;
+
+    /*todo:手动同步档案表*/
+    @SneakyThrows
+    @PostMapping("/synchronizedArchiveTable")
+    McR synchronizedArchiveTable(@RequestParam String name){
+        return McR.success(purchaseService.synchronizedArchiveTable(name));
+    }
+
+    /*todo:组件信息手动同步接口*/
+    @SneakyThrows
+    @PostMapping("/componentInfo")
+    McR ComponentInformation(){
+        log.info("----------开始全量同步组件信息----------");
+        purchaseService.ComponentInformation();
+        log.info("-----------组件信息已同步完成-----------");
+        return McR.success();
+    }
+
+    /*todo:供应商信息同步接口*/
+    @SneakyThrows
+    @PostMapping("/supplierInfo")
+    McR supplierInformation(){
+        log.info("---------开始全量同步供应商信息---------");
+        purchaseService.supplierInformation();
+        log.info("---------供应商信息同步完成-------------");
+        return McR.success();
+    }
+
+    /*todo:查询库存信息接口*/
+    @SneakyThrows
+    @PostMapping("/queryInventory")
+    McR queryInventory(@RequestBody Map<String,String> body){
+        return McR.success(purchaseService.queryInventory(body));
+    }
+
+    /*todo:创建采购订单接口*/
+    @SneakyThrows
+    @PostMapping("/purchaseOrder")
+    McR purchaseOrder(HttpServletRequest request){
+        Map<String, ?> data = UtilServlet.getParamMap(request);
+        log.info("采购订单, {}", data);
+        McException.assertParamException_Null(data, "instanceId");
+        return purchaseService.purchaseOrder(UtilMap.getString(data,"instanceId"));
+    }
+
+    /*todo:拣货单接口*/
+    @SneakyThrows
+    @PostMapping("/pickingList")
+    McR pickingList(@RequestBody Map<String,String> body){
+        log.info("开始查询拣货单明细");
+        return McR.success(purchaseService.pickingList(body));
+    }
+
+}

+ 50 - 0
mjava-junengtai/src/main/java/com/malk/junengtai/schedule/Schedule.java

@@ -0,0 +1,50 @@
+package com.malk.junengtai.schedule;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.malk.junengtai.service.PurchaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class Schedule {
+    @Autowired
+    private PurchaseService purchaseService;
+
+    /*组件信息定时器*/
+    @Scheduled(cron = "0 0 22 * * ?")
+    public void purchaseList(){
+        log.info("开始同步组件信息");
+        try {
+            purchaseService.ComponentInformation();
+            System.out.println("同步组件信息完成");
+        } catch (JacksonException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /*供应商信息定时器*/
+    @Scheduled(cron = "0 0 23 * * ?")
+    public void supplierInformation(){
+        log.info("开始同步供应商信息");
+        try {
+            purchaseService.supplierInformation();
+            System.out.println("同步供应商信息完成");
+        } catch (JacksonException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+
+
+}

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

@@ -0,0 +1,303 @@
+package com.malk.junengtai.service.Impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.malk.junengtai.service.PurchaseService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Service
+public class PurchaseServiceImpl implements PurchaseService {
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDConf ddConf;
+
+    @Override
+    public McR synchronizedArchiveTable(String name) throws JacksonException {
+        if(name.equals("组件信息")){
+            log.info("开始同步组件信息");
+            ComponentInformation();
+        } else if (name.equals("供应商信息")) {
+            log.info("开始同步供应商信息");
+            supplierInformation();
+        }
+        return McR.success();
+    }
+
+    @Override
+    public McR ComponentInformation() throws JacksonException {
+        HashMap head = new HashMap();
+        head.put("Authorization","ccd9220f-db1d-4aa1-aa1d-8a2c9180f801");
+
+        HashMap<String,Object> body = new HashMap();
+        List<Map<String, String>> partsList = new ArrayList<>();
+
+        Map<String, String> part1 = new HashMap<>();
+        part1.put("PartNumber", "SSF0009");
+        partsList.add(part1);
+
+        body.put("Parts", partsList);
+
+        String dd = UtilHttp.doPost("http://192.168.3.80:10001/api/public/GetAllParts", head, null, body);
+
+        ObjectMapper objectMapper  = new ObjectMapper();
+        JsonNode rootNode = objectMapper.readTree(dd);
+        JsonNode partsNode = rootNode.get("parts");
+        List<Map<String, String>> List = new ArrayList<>();
+        Map<String, Map<String, String>> partsMap = new ConcurrentHashMap<>();
+        if (partsNode != null && partsNode.isArray()) {
+            for (JsonNode partNode : partsNode) {
+                Map<String, String> partData = new HashMap<>();
+                partData.put("partNumber", partNode.get("partNumber").asText());
+                partData.put("description", partNode.get("description").asText());
+                partData.put("unit", partNode.get("unit").asText());
+                partData.put("module",partNode.get("module").isNull() ? "" : partNode.get("module").asText());
+                partData.put("spec",partNode.get("spec").isNull() ? "" : partNode.get("spec").asText());
+                partData.put("mark",partNode.get("mark").isNull() ? "" : partNode.get("mark").asText());
+                partData.put("createDate",partNode.get("createDate").isNull() ? "" : partNode.get("createDate").asText());
+                List.add(partData);
+                partsMap.put(partNode.get("partNumber").asText(), partData);
+            }
+        }
+        System.out.println("\n=== 遍历所有零件 ===个数:"+List.size());
+        int i = 0;
+        for (Map<String, String> part : List) {
+            i++;
+            System.out.println(i +"/" + List.size() + "   零件编号: " + part.get("partNumber") +
+                    ", 描述: " + part.get("description") +
+                    ", 单位: " + part.get("unit") +", 型号: " + part.get("module") + ", 规格: " + part.get("spec") + ", 牌号:" + part.get("mark"));
+            String createDate = part.get("createDate").toString();
+            LocalDate today = LocalDate.now(); // 获取当前日期(基于系统默认时区)
+            String dateString = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            System.out.println("当前时间:" + dateString);
+            if(part.get("createDate").toString().equals(dateString)){
+                //TODO:向宜搭插入数据
+                String sc = "textField_logkj6a6, textField_logkj6ai, textField_logkj6aj, textField_mh4k26k6, textField_mh4k26k5, textField_mh4k26k7";//组件号 组件名称 单位 型号 规格 牌号
+                String partNumber = part.get("partNumber").toString()!= null?part.get("partNumber").toString():"数据库此字段为空";
+                String description = part.get("description").toString()!=null?part.get("description").toString():"数据库此字段为空";
+                String unit = part.get("unit").toString()!=null?part.get("unit").toString():"数据库此字段为空";
+                String module = part.get("module").toString()!=null?part.get("module").toString():"数据库此字段为空";
+                String spec = part.get("spec").toString()!=null?part.get("spec").toString():"数据库此字段为空";
+                String mark = part.get("mark").toString()!=null?part.get("mark").toString():"数据库此字段为空";
+                List<Map> conditions = Arrays.asList(  YDConf.searchCondition_TextFiled("textField_logkj6a6", part.get("partNumber"), "eq"));
+                List<Map> list  = (List<Map>) ydClient.queryData(YDParam.builder()
+                                .formUuid("FORM-4D1B011EF0CC4CB8A5272BE0B5C4D073FKK8")
+                                .searchCondition(JSONObject.toJSONString(conditions))
+                                .build()
+                        ,YDConf.FORM_QUERY.retrieve_list).getData();
+                Map formData = UtilMap.map(sc,partNumber,description,unit,module,spec,mark);
+                if(!list.isEmpty()){
+                    ydClient.operateData(YDParam.builder()
+                            .formInstanceId(UtilMap.getString(list.get(0),"formInstanceId"))
+                            .updateFormDataJson(JSONObject.toJSONString(formData))
+                            .build(),YDConf.FORM_OPERATION.update);
+                }else{
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-4D1B011EF0CC4CB8A5272BE0B5C4D073FKK8")
+                            .formDataJson(JSONObject.toJSONString(formData))
+                            .build(), YDConf.FORM_OPERATION.create).toString();
+                }
+            }
+
+
+        }
+        return McR.success();
+    }
+
+    @Override
+    public McR supplierInformation() throws JacksonException {
+        HashMap head = new HashMap();
+        head.put("Authorization","ccd9220f-db1d-4aa1-aa1d-8a2c9180f801");
+
+        HashMap<String,Object> body = new HashMap();
+        ArrayList<Map<String,String>> partsList = new ArrayList<>();
+
+        HashMap<String, Object> part1 = new HashMap<>();
+        part1.put("supplierCode","");
+        part1.put("name","");
+
+        body.put("suppliers",partsList);
+
+        String dd = UtilHttp.doPost("http://192.168.3.80:10001/api/public/GetAllSuppliers", head, null, body);
+
+        ObjectMapper objectMapper  = new ObjectMapper();
+        JsonNode rootNode = objectMapper.readTree(dd);
+        JsonNode partsNode = rootNode.get("suppliers");
+        List<Map<String, String>> List = new ArrayList<>();
+        Map<String, Map<String, String>> partsMap = new ConcurrentHashMap<>();
+        if (partsNode != null && partsNode.isArray()) {
+            for (JsonNode partNode : partsNode) {
+                Map<String, String> partData = new HashMap<>();
+                partData.put("supplierCode", partNode.get("supplierCode").asText());
+                partData.put("name", partNode.get("name").asText());
+
+                List.add(partData);
+                partsMap.put(partNode.get("supplierCode").asText(), partData);
+            }
+        }
+        System.out.println("\n=== 遍历所有供应商 ===个数:"+List.size());
+        int i = 0;
+        for (Map<String, String> part : List) {
+            i++;
+            System.out.println(i +"/" + List.size() + "   供应商编码: " + part.get("supplierCode") +
+                    ", 供应商名称: " + part.get("name"));
+            //TODO:向宜搭插入数据
+            String sc = "textField_loggfrvk, textField_loggfrvp";//供应商编码 供应商名称
+            String supplierCode = part.get("supplierCode").toString()!= null?part.get("supplierCode").toString():"数据库此字段为空";
+            String name = part.get("name").toString()!=null?part.get("name").toString():"数据库此字段为空";
+            List<Map> conditions = Arrays.asList(  YDConf.searchCondition_TextFiled("textField_loggfrvk", part.get("supplierCode"), "eq"));
+            List<Map> list  = (List<Map>) ydClient.queryData(YDParam.builder()
+                            .formUuid("FORM-A9A0154249F940268F7313DDEC33925CFNPI")
+                            .searchCondition(JSONObject.toJSONString(conditions))
+                            .build()
+                    ,YDConf.FORM_QUERY.retrieve_list).getData();
+            Map formData = UtilMap.map(sc,supplierCode,name);
+            if(!list.isEmpty()){
+                ydClient.operateData(YDParam.builder()
+                        .formInstanceId(UtilMap.getString(list.get(0),"formInstanceId"))
+                        .updateFormDataJson(JSONObject.toJSONString(formData))
+                        .build(),YDConf.FORM_OPERATION.update);
+            }else{
+                ydClient.operateData(YDParam.builder()
+                        .formUuid("FORM-A9A0154249F940268F7313DDEC33925CFNPI")
+                        .formDataJson(JSONObject.toJSONString(formData))
+                        .build(), YDConf.FORM_OPERATION.create).toString();
+            }
+
+        }
+
+        return McR.success();
+    }
+
+    @Override
+    public McR queryInventory(Map<String,String> boddy) throws JacksonException {
+        HashMap header = new HashMap();
+        header.put("Authorization","ccd9220f-db1d-4aa1-aa1d-8a2c9180f801");
+        HashMap body = new HashMap();
+        body.put("PartNumber",boddy.get("PartNumber").toString());
+        String dd = UtilHttp.doPost("http://192.168.3.80:10001/api/public/GetPartLocationInfos", header, null, body);
+
+        HashMap map = new HashMap();
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode rootNode = mapper.readTree(dd);
+        JsonNode warehouses = rootNode.path("waresehouses");
+        String warehouseName,partLocationName = "";//仓库:warehouseName   库位:partLocationName
+        double partLocationBalance;//库存余额:partLocationBalance
+        for (JsonNode warehouse : warehouses) {
+            warehouseName = warehouse.path("warehouseName").asText();
+            JsonNode partLocations = warehouse.path("partLocations");
+            for (JsonNode location : partLocations) {
+                partLocationName = location.path("partLocationName").asText();
+                partLocationBalance = location.path("partLocationBalance").asDouble();
+                map.put("warehouseName",warehouseName);
+                map.put("partLocationName",partLocationName);
+                map.put("partLocationBalance",partLocationBalance);
+            }
+        }
+        return McR.success(map);
+    }
+
+    @Override
+    public McR purchaseOrder(String instanceId) throws JacksonException {
+        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(instanceId)
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        System.out.println(data);
+        HashMap header = new HashMap();
+        header.put("Authorization","ccd9220f-db1d-4aa1-aa1d-8a2c9180f801");
+        //创建主map
+        HashMap purchaseOrder  = new HashMap();
+        purchaseOrder.put("PurchaseOrderNumber",data.get("serialNumberField_mk21zzwk").toString());//采购订单编号
+        purchaseOrder.put("SupplierCode",data.get("textField_mhd2mu8c").toString());//供应商编码
+        purchaseOrder.put("OrderType",data.get("textField_mhd2mu8d").toString());//订单类型
+        purchaseOrder.put("Warehouse",data.get("selectField_mhd3jyfb").toString());//仓库
+        purchaseOrder.put("BusinessContactOrderNumber","");//采购合同编码
+        purchaseOrder.put("OurReference","");//我方联系人
+        purchaseOrder.put("GoodsLabel","");//行货物标签(不传)
+        purchaseOrder.put("Currency","元");//货币
+        // 创建Rows数组
+        List<Map<String, Object>> rows = new ArrayList<>();
+        List<Map> jsonString = (List<Map>)data.get("tableField_logke6sx");
+        for (Map map : jsonString){
+            HashMap rowItem = new HashMap();
+            rowItem.put("PartNumber",map.get("textField_logkj6au").toString());//组件号
+
+            String purchaseNum = new BigDecimal(map.get("numberField_logke6t1").toString())
+                    .setScale(2,BigDecimal.ROUND_HALF_UP).toString();
+            rowItem.put("OrderedQuantity",purchaseNum);//采购数量
+
+            String price = new BigDecimal(map.get("numberField_mh9x8r54").toString())
+                    .setScale(2,BigDecimal.ROUND_HALF_UP).toString();
+            rowItem.put("Price",price);//单价
+
+            rowItem.put("Unit",map.get("selectField_logkj6ak").toString().equals("") ? "" : map.get("selectField_logkj6ak").toString());//单位
+
+            long time = (long)data.get("dateField_loglna5u");
+            String utc = convertTimestampToDateString(time, "UTC", "yyyy-MM-dd");
+            rowItem.put("RequirementDate",utc);//交货日期
+
+            String vat = new BigDecimal(map.get("numberField_mhj15z8w").toString())
+                    .setScale(2,BigDecimal.ROUND_HALF_UP).toString();
+            rowItem.put("Vat",vat);
+
+            rows.add(rowItem);
+        }
+        purchaseOrder.put("Rows", rows);
+        System.out.println(purchaseOrder);
+        //调用接口
+        String dd = UtilHttp.doPost("http://192.168.3.80:10001/api/public/CreatePurchaseOrder", header, null, purchaseOrder);
+        System.out.println(dd);
+        return McR.success(dd);
+    }
+
+    @Override
+    public Map pickingList(Map<String,String> boddy) throws JacksonException {
+        HashMap header = new HashMap();
+        header.put("Authorization","ccd9220f-db1d-4aa1-aa1d-8a2c9180f801");
+        HashMap body = new HashMap();
+        body.put("PLNumber",boddy.get("PLNumber").toString());
+        String dd = UtilHttp.doPost("http://192.168.3.80:10001/api/public/GetPickingListInfos", header, null, body);
+        ObjectMapper mapper =new ObjectMapper();
+        Map node =mapper.readValue(dd,Map.class);
+        System.out.println("返回值:"+node);
+        return node;
+    }
+
+    public  String convertTimestampToDateString(long timestamp, String timeZone, String pattern) {
+        // 将时间戳转换为Instant
+        Instant instant = Instant.ofEpochMilli(timestamp);
+        // 将Instant转换为指定时区的日期
+        LocalDate date = instant.atZone(ZoneId.of(timeZone)).toLocalDate();
+        date = date.plusDays(1);
+        // 创建一个DateTimeFormatter来格式化日期
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+        // 格式化LocalDate为字符串
+        String formattedDate = date.format(formatter);
+        // 返回格式化后的日期字符串
+        return formattedDate;
+    }
+
+}

+ 27 - 0
mjava-junengtai/src/main/java/com/malk/junengtai/service/PurchaseService.java

@@ -0,0 +1,27 @@
+package com.malk.junengtai.service;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.malk.server.common.McR;
+
+import java.util.Map;
+
+public interface PurchaseService {
+
+    /*手动同步档案表数据*/
+    McR synchronizedArchiveTable(String name) throws JacksonException;
+
+    /*同步组件信息*/
+    McR ComponentInformation() throws JacksonException;
+
+    /*供应商信息*/
+    McR supplierInformation() throws  JacksonException;
+
+    /*查询库存信息*/
+    McR queryInventory(Map<String,String> body) throws JacksonException;
+
+    /*创建采购订单接口*/
+    McR purchaseOrder(String instanceId) throws  JacksonException;
+
+    /*查询拣货单接口*/
+    Map pickingList(Map<String,String> body) throws JacksonException;
+}

+ 85 - 0
mjava-junengtai/src/main/java/com/malk/junengtai/test/test.java

@@ -0,0 +1,85 @@
+package com.malk.junengtai.test;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@Slf4j
+@RequestMapping("/test")
+public class test {
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+
+    @PostMapping("/test1")
+    McR test1(){
+        System.out.println("接口正常!");
+        return McR.success("接口正常!");
+    }
+
+    /*批量修改数据*/
+    @PostMapping("/test2")
+    McR test2(){
+        //1、查询所有的收票数据
+        String instanceId = "FORM-27421C0D0ACA41DFB85D05A9878161B1SDCE";
+        YDParam ydParam = YDParam.builder().formUuid(instanceId).build();
+        ydParam.setPageSize(1);
+        long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getTotalCount();
+        System.out.println(totalCount);
+
+        List<Map> dataList = new ArrayList<>();
+        ydParam.setCurrentPage(1);
+        ydParam.setPageSize(100);
+        for (int page = 1; page <= (Math.ceil(totalCount / 100 )!=0?Math.ceil(totalCount / 100 + 1):1); page++) {
+            ydParam.setCurrentPage(page);
+            dataList.addAll((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData());
+        }
+        //2、遍历收票数据
+        int i = 0;
+        for(Map li: dataList){
+            i ++ ;
+            String currentInstanceId = (String) li.get("formInstanceId");
+            System.out.println(currentInstanceId);
+            //3、遍历子表单,求和明细数据
+            Map data =ydClient.queryData(YDParam.builder().formInstId(currentInstanceId)
+                    .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                    .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            Double A_total = 0.0;
+            List<Map> jsonString = (List<Map>)data.get("tableField_m8oaxbru");
+            for (Map map1 : jsonString) {
+                Object o = map1.get("numberField_m8oaxbry");
+                System.out.println(o);
+                double d = ((Number) o).doubleValue();
+                System.out.println(d);
+                A_total = A_total + d;
+            }
+            System.out.println("总金额:" + A_total);
+            //4、更新发票汇总字段
+            ydClient.operateData(YDParam.builder()
+                    .appType(ydConf.getAppType())
+                    .systemToken(ydConf.getSystemToken())
+                    .formInstanceId(currentInstanceId)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mkax9d6k",A_total)))
+                    .build(), YDConf.FORM_OPERATION.update);
+            log.info("{}/{}",i,dataList.size());
+        }
+        return McR.success();
+    }
+
+}

+ 88 - 0
mjava-junengtai/src/main/resources/application-dev.yml

@@ -0,0 +1,88 @@
+# 环境配置
+server:
+  port: 8086
+  servlet:
+    context-path: /api/junengtai
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+#      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: ounuo_user
+    password: OUNUO123!
+    url: jdbc:mysql://ounuo.raresoft.net:33306/TASK
+  jpa:
+    hibernate:
+      ddl-auto: none
+    show-sql: true
+    database: oracle
+  hikari:
+    pool-name: DateHikariCP
+    minimum-idle: 0
+    maximum-pool-size: 10
+    idle-timeout: 30000
+    max-lifetime: 120000          # 小于数据库超时大于业务执行返回时间[hikari默认30m, mysql默认10m]
+    connection-timeout: 30000     # 数据库连接超时时间,默认30秒,即30000
+
+
+
+  #    # 主库
+#    primary:
+#      username: root
+#      password: mu123
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#    # 从库
+#    slave:
+#      username: root
+#      password: mu123
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#  jpa:
+#    hibernate:
+#      ddl-auto: none      # JPA对表没有任何操作
+#    show-sql: true
+#    database: ORACLE
+#    database-platform: org.hibernate.dialect.Oracle12cDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk 钉钉
+dingtalk:
+  agentId: 4074144499
+  appKey: ding21enhh8fzggqyuwu
+  appSecret: PemxcBGHaEa083YRQt_q2jjGIYBATmw9ddXr6bYtFEkuBHTdqOD5NbYDj12b9-ua
+  corpId: dingfa48ac9cae50fe6ba1320dcb25e91351
+  aesKey:
+  token:
+  operator: 33205115111170152911   # OA管理员账号:鲜明阳 [0开头需要转一下字符串]
+
+# aliwork 宜搭
+aliwork:
+  appType: APP_NJPKQLYOZNQ7P3JNCW6T
+  systemToken: S4E66I8119TYN5WO6MISKDTDJV5C2FWX24FFM0I
+
+# MyBatis配置
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  type-aliases-package: com.malk.junengtai.entity
+  configuration:
+    map-underscore-to-camel-case: true
+
+#定时器
+enable:
+  scheduling: true

+ 76 - 0
mjava-junengtai/src/main/resources/application-prod.yml

@@ -0,0 +1,76 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api/junengtai
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    hikari:
+    #      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: ounuo_user
+    password: OUNUO123!
+    url: jdbc:mysql://ounuo.raresoft.net:33306/TASK
+
+
+  #    # 主库
+  #    primary:
+  #      username: root
+  #      password: mu123
+  #      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  #    # 从库
+  #    slave:
+  #      username: root
+  #      password: mu123
+  #      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: ORACLE
+    database-platform: org.hibernate.dialect.Oracle12cDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk 钉钉
+dingtalk:
+  agentId: 4074144499
+  appKey: ding21enhh8fzggqyuwu
+  appSecret: PemxcBGHaEa083YRQt_q2jjGIYBATmw9ddXr6bYtFEkuBHTdqOD5NbYDj12b9-ua
+  corpId: dingfa48ac9cae50fe6ba1320dcb25e91351
+  aesKey:
+  token:
+  operator: 33205115111170152911   # OA管理员账号:鲜明阳 [0开头需要转一下字符串]
+
+# aliwork 宜搭
+aliwork:
+  appType: APP_NJPKQLYOZNQ7P3JNCW6T
+  systemToken: S4E66I8119TYN5WO6MISKDTDJV5C2FWX24FFM0I
+
+# MyBatis配置
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  type-aliases-package: com.malk.junengtai.entity
+  configuration:
+    map-underscore-to-camel-case: true
+
+#定时器
+enable:
+  scheduling: true

+ 3 - 0
mjava-junengtai/src/main/resources/application.yml

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

+ 39 - 1
mjava-lilin/src/main/java/com/malk/lilin/Controller/LiLinController.java

@@ -2,13 +2,22 @@ package com.malk.lilin.Controller;
 
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.malk.lilin.Service.LiLinService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
 import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -19,9 +28,38 @@ import java.util.Objects;
 public class LiLinController {
     @Autowired
     private LiLinService liLinService;
-
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDService ydService;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDConf ddConf;
     @GetMapping("/test")
     public McR test() {
+//        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
+//                .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
+//                .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
+//                        new YDSearch("selectField_ma0w9yrb", "已审批已付款", "SelectField",
+//                                YDSearch.Type.RADIO_FIELD, YDSearch.Operator.EQ),
+//                        new YDSearch("radioField_mimhsd0h", "否", "是否创建付款通知",
+//                                YDSearch.Type.RADIO_FIELD, YDSearch.Operator.EQ)
+//                )))
+//                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+//        for (Map item : list) {
+//            boolean processSuccess = false;
+//            String formInstanceId = null;
+//            String mainInstructionId = null;
+//
+//            try {
+////                formInstanceId = UtilMap.getString(item, "formInstanceId");
+//                ydClient.operateData(YDParam.builder()
+//                        .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
+//                        .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mimhsd0h", "是")))
+//                        .build(), YDConf.FORM_OPERATION.multi_update);
+//            }
+//        }
         return McR.success();
     }
 

+ 27 - 36
mjava-lilin/src/main/java/com/malk/lilin/Service/impl/LiLinServiceImpl.java

@@ -919,7 +919,7 @@ public class LiLinServiceImpl implements LiLinService {
                 log.info("开始对账单同步,accountNo: {}", accountNo);
 
                 // 准备时间范围
-                String dayFromId = LocalDate.now().minusDays(12).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+                String dayFromId = LocalDate.now().minusDays(8).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                 String dayToId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
 
                 // 构建 POST 请求体
@@ -1455,25 +1455,19 @@ public class LiLinServiceImpl implements LiLinService {
                                 "已审批已付款",
                                 "SelectField",
                                 YDSearch.Type.RADIO_FIELD,
-                                YDSearch.Operator.EQ)
-//                        new YDSearch("radioField_mimhsd0h", "否", "是否创建付款通知", YDSearch.Type.RADIO_FIELD, YDSearch.Operator.EQ)
+                                YDSearch.Operator.EQ),
+                        new YDSearch("radioField_mimhsd0h", "否", "是否创建付款通知", YDSearch.Type.RADIO_FIELD, YDSearch.Operator.EQ)
                 )))
                 .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
-//        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
-//                .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
-//                .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
-//                        new YDSearch("textField_m9ze3rjg",
-//                                "CGFK20251027560",
-//                                "电子凭证号",
-//                                YDSearch.Type.TEXT_FIELD,
-//                                YDSearch.Operator.EQ)
-//                )))
-//                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+
         if (list == null || list.isEmpty()) {
             log.info("没有找到需要处理的单据");
             return McR.success("无待处理数据");
         }
 
+        int successCount = 0;
+        int failCount = 0;
+
         for (Map item : list) {
             try {
                 String formInstanceId = getStringValue(item, "formInstanceId");
@@ -1483,13 +1477,6 @@ public class LiLinServiceImpl implements LiLinService {
                     continue;
                 }
                 Map data = (Map) item.get("formData");
-                // 获取源表单详情
-//                Map data = (Map) ydClient.queryData(YDParam.builder()
-//                        .formInstId(formInstanceId)
-//                        .appType(ydConf.getAppType())
-//                        .systemToken(ydConf.getSystemToken())
-//                        .userId(ddConf.getOperator())
-//                        .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
 
                 if (data == null) {
                     log.warn("formInstanceId={} 的 formData 为空,跳过", formInstanceId);
@@ -1513,6 +1500,8 @@ public class LiLinServiceImpl implements LiLinService {
 //                 如果目标表单中已存在该流水号,则跳过,不再新增
                 if (list1 != null && !list1.isEmpty()) {
                     log.info("已存在重复数据,跳过插入:mainInstructionId={}", mainInstructionId);
+                    updateSourceBillStatus(formInstanceId, "是");
+                    successCount++;
                     continue;
                 }
 
@@ -1598,31 +1587,23 @@ public class LiLinServiceImpl implements LiLinService {
                 formData.put("textField_mdsk7rlm", mainInstructionId); // 主流水号用于去重
                 formData.put("employeeField_m8yf6gkl", Arrays.asList("275412081437800471"));
 
-                // 执行新增
-//                ydClient.operateData(YDParam.builder()
-//                        .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
-//                        .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
-//                        .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
-//                        .noExecuteExpression(false)
-////                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mdsk7rlm", mainInstructionId)))
-//                        .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
-//                                "textField_mdsk7rlm", mainInstructionId, "付款通知单流水号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
-//                        .formDataJson(JSONObject.toJSONString(formData))
-//                        .build(), YDConf.FORM_OPERATION.upsert);
                 try {
-//                    ydClient.operateData(YDParam.builder()
-//                            .formInstId(formInstanceId)
-//                            .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mimhsd0h","是")))
-//                            .build(), YDConf.FORM_OPERATION.update);
+
                     ydClient.operateData(YDParam.builder()
                             .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
                             .formDataJson(JSON.toJSONString(formData))
 //                        .userId("275412081437800471")
                             .build(), YDConf.FORM_OPERATION.create);
+                    ydClient.operateData(YDParam.builder()
+                            .formInstId(formInstanceId)
+                            .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mimhsd0h","是")))
+                            .build(), YDConf.FORM_OPERATION.update);
 
                     log.info("成功插入新数据:mainInstructionId={}, 付款类型={}", mainInstructionId, fklx);
+                    successCount++;
                 } catch (Exception e) {
                     log.info("处理单据异常:mainInstructionId={}, error={}", mainInstructionId, e.getMessage(), e);
+                    failCount++;
                 }
 
 
@@ -1699,7 +1680,17 @@ public class LiLinServiceImpl implements LiLinService {
         }
         return McR.success();
     }
-
+    private void updateSourceBillStatus(String formInstanceId, String status) {
+        try {
+            ydClient.operateData(YDParam.builder()
+                    .formInstId(formInstanceId)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("radioField_mimhsd0h", status)))
+                    .build(), YDConf.FORM_OPERATION.update);
+        } catch (Exception e) {
+            log.error("更新源单据状态失败:formInstanceId={}", formInstanceId, e);
+            throw e; // 抛出异常让上层处理
+        }
+    }
     private Object getAss(String title, String id) {
         return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_RPH7R3LF3SMXLRDY1ZJW", "FORM-754586D31BF6414586E5C20DB3774A7320CV", "receipt", id, title, "");
     }

+ 1 - 1
mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java

@@ -702,7 +702,7 @@ public class McYdServiceImpl implements McYdService {
                     .formDataJson(JSON.toJSONString(UtilMap.map(data.get("processKey").toString()+", "+data.get("empKey").toString()+", "+data.get("titleKey").toString(),
                             data.get("processInstanceId").toString(),UtilMap.getList(data, "userIds"),title)))
                     .useLatestVersion(true)
-                    .build(), YDConf.FORM_OPERATION.upsert_v2);
+                    .build(), YDConf.FORM_OPERATION.upsert);//upsert_v2
             if (UtilMap.getBoolean(data, "isNotice")) {
 //                data.put("content", names.stream().collect(Collectors.joining(",")) + UtilMap.getString(data, "content"));
                 String appUrl = data.get("appUrl").toString();

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

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

+ 111 - 0
mjava-ounuo/pom.xml

@@ -0,0 +1,111 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.malk</groupId>
+    <artifactId>ounuo</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>mjava-ounuo</name>
+    <description>mjava-ounuo</description>
+
+    <!-- ✅ 使用统一的 parent -->
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version>
+        <relativePath/>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.14.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.3</version>
+        </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>
+        <!-- ppExt: 钉钉 Stream 回调 -->
+        <dependency>
+            <groupId>com.dingtalk.open</groupId>
+            <artifactId>dingtalk-stream</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+        <!-- MyBatis Starter -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+        <!-- MyBatisPlus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.1</version>
+        </dependency>
+        <!-- Lombok(简化实体类) -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- MySQL驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.28</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20231013</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>ounuo</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 70 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/MjavaOunuoApplication.java

@@ -0,0 +1,70 @@
+package com.malk.tuosi;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.open.app.api.GenericEventListener;
+import com.dingtalk.open.app.api.OpenDingTalkStreamClientBuilder;
+import com.dingtalk.open.app.api.message.GenericOpenDingTalkEvent;
+import com.dingtalk.open.app.api.security.AuthClientCredential;
+import com.dingtalk.open.app.stream.protocol.event.EventAckStatus;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+
+
+
+import java.rmi.RemoteException;
+
+//@EnableJpaAuditing
+@Slf4j
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+public class MjavaOunuoApplication {
+
+    public static void main(String... args) throws RemoteException {
+
+       
+        SpringApplication.run(MjavaOunuoApplication.class, args);
+        System.out.println("Ounuo_SpringBoot项目启动----------");
+    }
+
+    /// ppExt: 钉钉 Stream 接入: 仅需要 dingtalk-stream 依赖, 但点击注册不会回传, 应用发布后注册的事件才会回调 --
+    @Bean
+    public void init() {
+        log.info("starting dingtalk stream client...}");
+        try {
+            OpenDingTalkStreamClientBuilder
+                    .custom()
+//                .credential(new AuthClientCredential("${app.appKey}", "${app.appSecret}"))
+                    .credential(new AuthClientCredential("dinghhozexm92tupobfo", "-zYNwc4j9hssiP0mTNbSe0D9v9ejh4OIaHnx_EhVZWJbwnatvgtNiSFPIwAg9AGb"))
+                    //注册事件监听
+                    .registerAllEventListener(new GenericEventListener() {
+                        public EventAckStatus onEvent(GenericOpenDingTalkEvent event) {
+                            try {
+                                //事件唯一Id
+                                String eventId = event.getEventId();
+                                //事件类型
+                                String eventType = event.getEventType();
+                                //事件产生时间
+                                Long bornTime = event.getEventBornTime();
+                                //获取事件体
+                                JSONObject bizData = event.getData();
+                                //处理事件
+//                            process(bizData);
+                                log.error("receive event, eventId={}, eventType={}, bornTime={}, data={}", eventId, eventType, bornTime, bizData);
+                                return EventAckStatus.SUCCESS;
+                            } catch (Exception e) {
+                                //消费失败
+                                log.error("process event error, eventId={}, eventType={}, bornTime={}, data={}", event.getEventId(), event.getEventType(), event.getEventBornTime(), event.getData(), e);
+                                return EventAckStatus.LATER;
+                            }
+                        }
+                    })
+                    .build().start();
+        } catch (Exception e) {
+            log.error("start dingtalk stream client error", e);
+        }
+    }
+
+}

+ 70 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/controller/TBController.java

@@ -0,0 +1,70 @@
+package com.malk.tuosi.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.malk.server.common.McR;
+import com.malk.tuosi.service.TBService;
+import com.malk.tuosi.service.impl.TbServiceImpl;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/TBConstructionLog")
+public class TBController {
+    @Autowired
+    private TBService tbService;
+
+    /*TODO:TB获取应用授权token*/
+    @SneakyThrows
+    @PostMapping("/GetAppToken")
+    McR AppAccessToken() throws JsonProcessingException {
+        log.info("---------获取到token---------");
+        return tbService.AppAccessToken();
+    }
+
+    /*TODO:钉钉获取应用token*/
+    @PostMapping("/GetDingToken")
+    McR AccessToken() throws JsonProcessingException{
+        log.info("---------获取到dingtoken-------");
+        return tbService.Accesstoken();
+    }
+
+    /*TODO:TB事件订阅接口*/
+    @PostMapping("/tbTaskUpdate")
+    McR tbTaskUpdate(@RequestBody Map body) throws JsonProcessingException{
+        return McR.success(tbService.tbTaskUpdate(body));
+    }
+
+    /*TODO:钉盘文件上传*/
+    @PostMapping("/uploadKnowledge")
+    McR uploadKnowledge(@RequestParam  String pathName, @RequestParam String fileName,@RequestParam String fileType) throws JsonProcessingException{
+        return McR.success(tbService.uploadKnowledge(pathName,fileName,fileType));
+    }
+
+    /*TODO:版线组位置附件上传CRM*/
+    @PostMapping("/tbCallbackCRM")
+    McR tbCallbackCRM(@RequestBody Map body) throws JsonProcessingException{
+        return McR.success(tbService.tbCallbackCRM(body));
+    }
+
+    /*TODO:OA回传TB*/
+    @PostMapping("/oaCallbackTB")
+    McR oaCallbackTB(@RequestBody Map body) throws  JsonProcessingException{
+        return McR.success(tbService.oaCallbackTB(body));
+    }
+
+    /*TODO:Teambition userId 查询钉钉 userId*/
+
+    @PostMapping("/TBtoDinguserId")
+    McR TBtoDinguserId(@RequestParam List list) throws JsonProcessingException{
+        return McR.success(tbService.TBtoDinguserId(list));
+    }
+
+
+
+}

+ 179 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/controller/TaskController.java

@@ -0,0 +1,179 @@
+package com.malk.tuosi.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.malk.server.common.McR;
+import com.malk.tuosi.entity.Task;
+import com.malk.tuosi.mapper.TaskMapper;
+import com.malk.tuosi.service.TBService;
+import com.malk.tuosi.service.TaskService;
+import com.malk.utils.UtilHttp;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.StreamSupport;
+
+@Slf4j
+@RestController
+@RequestMapping("/datasync")
+public class TaskController {
+    @Autowired
+    private TaskMapper taskMapper;
+    @Autowired
+    private TBService tbService;
+
+    @SneakyThrows
+    @PostMapping("/addTask")
+    McR addTask(){
+        /*todo:查询任务详情*/
+        //1、计数项目任务
+        HashMap header = new HashMap();
+        header.put("x-operator-id","622ee3450cf3bb5e1a486f1f");
+        McR Token = tbService.AppAccessToken();
+        Object token = Token.getData();
+        header.put("Authorization","Bearer " + token);
+        header.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+        header.put("X-Tenant-Type","organization");
+        String projectId = "6878b323386fac7ab9dbe5e9";
+        String doGet = UtilHttp.doGet("https://open.teambition.com/api/v3/project/" + projectId + "/task/count", (Map) header, (Map) null);
+        Matcher m = Pattern.compile("\"result\":(\\d+)").matcher(doGet);
+        int result = m.find() ? Integer.parseInt(m.group(1)) : 0;//1450
+        //2、查询项目任务
+        HashMap param = new HashMap();
+        param.put("pageSize",100);
+        ArrayList list = new ArrayList();//分页标全部存在list
+
+        String pageToken = "";//初始值
+        for (int i=0;i<result/100 + 1;i++){
+            ArrayList<String> allIds = new ArrayList<>();//todo:->>>>>>>>>全部任务id存在allIds
+            param.put("pageToken",pageToken);
+            String doGet1 = UtilHttp.doGet("https://open.teambition.com/api/v3/project/" + projectId + "/task/query", header, param);
+            List<String> batchIds = extractIdsFromJson(doGet1);//提取当前批次的id
+            allIds.addAll(batchIds);//添加到总列表
+            ObjectMapper mapper = new ObjectMapper();
+            String nextPageToken = mapper.readTree(doGet1).get("nextPageToken").asText();
+            if (nextPageToken != null && !nextPageToken.trim().isEmpty()) {
+                // 不为空,使用nextPageToken
+                list.add(nextPageToken);
+                pageToken = nextPageToken;
+            }else {
+                // 为空,不进行处理
+            }
+
+            /*todo:100条数据处理*/
+            //3、查询任务详情
+            int k =0;
+            ArrayList errorList = new ArrayList();
+            for (int j = 0; j < allIds.size(); j++) {
+                k++;
+                HashMap params = new HashMap();
+                params.put("taskId", allIds.get(j));
+                String doGet2 = UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", header, params);
+                String crmId = "";            //CRM编码--->343513
+                String renWuName = "";        //品名--->530GX16迎凤富贵--河南盈乐
+                String company = "";          // 客户名称--->华美食品(河北)有限公司
+                String draftStatus = "";      // 设计类别--->确认稿
+                String customerType = "";     // 文件来源(公司)--->客户
+                String levelOneDesign = "";   // 设计等级--->一级设计
+                String tfsId = new ObjectMapper().readTree(doGet2).get("result").get(0).get("tfsId").asText();//任务状态ID
+                renWuName = new ObjectMapper().readTree(doGet2).get("result").get(0).get("content").asText();//任务名称--->品名
+                String title = StreamSupport.stream(new ObjectMapper().readTree(doGet2)
+                                .get("result").get(0).get("customfields").spliterator(), false)
+                        .filter(field -> "689d4ebf343c05fe73700c93".equals(field.get("cfId").asText()))
+                        .findFirst()
+                        .map(field -> field.get("value").get(0).get("title").asText())
+                        .orElse(null);//CRM单据ID--->CRM编码
+                JSONArray customfields = JSON.parseObject(doGet2).getJSONArray("result").getJSONObject(0).getJSONArray("customfields");
+                for (int p = 0; p < customfields.size(); p++) {
+                    JSONObject field = customfields.getJSONObject(p);
+                    String cfId = field.getString("cfId");
+                    JSONArray valueArray = field.getJSONArray("value");
+                    if (valueArray != null && !valueArray.isEmpty()) {
+                        String value = valueArray.getJSONObject(0).getString("title");
+                        //根据cfId匹配
+                        switch (cfId){
+                            case "687df3b60ae1530fa2704499":
+                                company = value;
+                                break;
+                            case "687e0308e3f7ce8174a19cfc":
+                                draftStatus = value;
+                                break;
+                            case "687df8813d5081f8c81cf375":
+                                customerType = value;
+                                break;
+                            case "691c29c1f8cbae320a1c8e75":
+                                levelOneDesign = value;
+                                break;
+                            case "68f980e6a24e799a9c7a226a":
+                                crmId = value;
+                                break;
+                        }
+                    }
+                }
+                /*todo:给实体赋值*/
+                /*打印进度*/
+                log.info("进度:{}/{}",k,result);
+                Task task = new Task();
+                task.setTaskId(crmId);//CRM编码
+                task.setTaskName(renWuName);//任务名称
+                task.setCustomerName(company);//客户名称
+                task.setDesignCategory(draftStatus);//设计类别
+                task.setFileSource(customerType);//文件来源(公司)
+                task.setDesignLevel(levelOneDesign);//设计等级
+                /*todo:插入数据库*/
+                int insert = taskMapper.insert(task);
+                Map<String, Object> response = new HashMap<>();
+                if(insert > 0){
+                    response.put("success", true);
+                    response.put("message", "用户创建成功");
+                    response.put("data", "");
+                    log.info("任务创建成功,任务ID:{},任务名称:{}", task.getTaskId(),task.getTaskName());
+                }else {
+                    log.info("任务创建失败,任务ID:{},任务名称:{}",task.getTaskId(),task.getTaskName());
+                    errorList.add(task.getTaskId() + "---" + task.getTaskName());//插入数据失败的统计
+                }
+            }
+
+            if(errorList.size() >0){
+                System.out.println("插入任务列表失败集合:" + errorList);
+            }
+        }
+
+        return McR.success();
+    }
+
+    /*额外方法:从项目任务查询的100条任务提取result中所有的id*/
+    private static List<String> extractIdsFromJson(String jsonString) throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode rootNode = mapper.readTree(jsonString);
+        JsonNode resultArray = rootNode.get("result");
+
+        // 预分配100容量(每批大约100条数据)
+        List<String> ids = new ArrayList<>(100);
+
+        if (resultArray != null && resultArray.isArray()) {
+            for (JsonNode item : resultArray) {
+                if (item.has("id")) {
+                    String id = item.get("id").asText();
+                    ids.add(id);
+                }
+            }
+        }
+        return ids;
+    }
+
+
+}

+ 25 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/AnnualSeasonalSample.java

@@ -0,0 +1,25 @@
+package com.malk.tuosi.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AnnualSeasonalSample {
+    /*任务id*/
+    private String taskId;
+    /*任务名称*/
+    private String taskName;
+    /*客户*/
+    private String customer;
+    /*设计等级*/
+    private String designLevel;
+    /*设计类别*/
+    private String designType;
+}

+ 27 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/ConfirmDesignYear.java

@@ -0,0 +1,27 @@
+package com.malk.tuosi.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+//@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+//@TableName("ConfirmDesignYear")
+public class ConfirmDesignYear {
+    /*任务id*/
+    private String taskId;
+    /*任务名称*/
+    private String taskName;
+    /*设计等级*/
+    private String designLevel;
+    /*任务类型*/
+    private String taskType;
+}

+ 27 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/DesigndeparttMonthConfirm.java

@@ -0,0 +1,27 @@
+package com.malk.tuosi.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DesigndeparttMonthConfirm {
+    /*任务id*/
+    private String taskId;
+    /*任务名称*/
+    private String taskName;
+    /*客户*/
+    private String customer;
+    /*设计等级*/
+    private String designLevel;
+    /*设计类别*/
+    private String designType;
+    /*截止时间*/
+    private String dateLineEnd;
+}

+ 29 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/EmployeeWeeklyTasks.java

@@ -0,0 +1,29 @@
+package com.malk.tuosi.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class EmployeeWeeklyTasks {
+    /*任务id*/
+    private String taskId;
+    /*任务名称*/
+    private String taskName;
+    /*负责人*/
+    private String manager;
+    /*开始时间*/
+    private String timeStart;
+    /*结束时间*/
+    private String timeEnd;
+    /*任务类型*/
+    private String taskType;
+    /*任务状态*/
+    private String status;
+}

+ 25 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/NewprocessImplementation.java

@@ -0,0 +1,25 @@
+package com.malk.tuosi.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewprocessImplementation {
+    /*任务id*/
+    private String taskId;
+    /*任务名称*/
+    private String taskName;
+    /*客户*/
+    private String customer;
+    /*设计等级*/
+    private String designLevel;
+    /*设计类别*/
+    private String designType;
+}

+ 31 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/Task.java

@@ -0,0 +1,31 @@
+package com.malk.tuosi.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("task_total")
+public class Task {
+    /*CRM编码-对应数据库 task_id*/
+    private String taskId;
+    /*品名-对应数据库 task_name*/
+    private String taskName;
+    /*客户名称-对应数据库 customer_name*/
+    private String customerName;
+    /*设计类别-对应数据库 design_category*/
+    private String designCategory;
+    /*文件来源(公司)-对应数据库 file_source*/
+    private String  fileSource;
+    /*设计等级-对应数据库 design_level*/
+    private String designLevel;
+}

+ 30 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/YearPersonalConfirm.java

@@ -0,0 +1,30 @@
+package com.malk.tuosi.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.xmlbeans.impl.tool.StreamInstanceValidator;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class YearPersonalConfirm {
+    /*任务id*/
+    private String taskId;
+    /*任务名称(品名)*/
+    private String taskName;
+    /*设计人员*/
+    private String designPerson;
+    /*系数*/
+    private Integer coefficient;
+    /*客户名称*/
+    private String customerName;
+    /*设计等级*/
+    private String designLevel;
+    /*完成时间*/
+    private String deadline;
+}

+ 9 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/AnnualSeasonalSampleMapper.java

@@ -0,0 +1,9 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.AnnualSeasonalSample;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AnnualSeasonalSampleMapper extends BaseMapper<AnnualSeasonalSample> {
+}

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/ConfirmDesignYearMapper.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.ConfirmDesignYear;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户数据访问接口
+ * 注意:使用@Mapper注解,Spring Boot会自动扫描
+ */
+@Mapper
+public interface ConfirmDesignYearMapper extends BaseMapper<ConfirmDesignYear> {
+}

+ 9 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/DesigndeparttMonthConfirmMapper.java

@@ -0,0 +1,9 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.DesigndeparttMonthConfirm;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DesigndeparttMonthConfirmMapper extends BaseMapper<DesigndeparttMonthConfirm> {
+}

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/EmployeeWeeklyTasksMapper.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.EmployeeWeeklyTasks;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户数据访问接口
+ * 注意:使用@Mapper注解,Spring Boot会自动扫描
+ */
+@Mapper
+public interface EmployeeWeeklyTasksMapper extends BaseMapper<EmployeeWeeklyTasks> {
+}

+ 9 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/NewprocessImplementationMapper.java

@@ -0,0 +1,9 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.NewprocessImplementation;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface NewprocessImplementationMapper extends BaseMapper<NewprocessImplementation> {
+}

+ 16 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/TaskMapper.java

@@ -0,0 +1,16 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.Task;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 用户数据访问接口
+ * 注意:使用@Mapper注解,Spring Boot会自动扫描
+ */
+@Mapper
+public interface TaskMapper extends BaseMapper<Task> {
+}

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/YearPersonalConfirmMapper.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.YearPersonalConfirm;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户数据访问接口
+ * 注意:使用@Mapper注解,Spring Boot会自动扫描
+ */
+@Mapper
+public interface YearPersonalConfirmMapper extends BaseMapper<YearPersonalConfirm> {
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 958 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/schedule/ScheduleTask.java


+ 7 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/AnnualSeasonalSampleService.java

@@ -0,0 +1,7 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.AnnualSeasonalSample;
+
+public interface AnnualSeasonalSampleService extends IService<AnnualSeasonalSample> {
+}

+ 7 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/ConfirmDesignYearService.java

@@ -0,0 +1,7 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.ConfirmDesignYear;
+
+public interface ConfirmDesignYearService extends IService<ConfirmDesignYear> {
+}

+ 8 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/DesigndeparttMonthConfirmService.java

@@ -0,0 +1,8 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.DesigndeparttMonthConfirm;
+
+public interface DesigndeparttMonthConfirmService extends IService<DesigndeparttMonthConfirm> {
+
+}

+ 7 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/EmployeeWeeklyTasksService.java

@@ -0,0 +1,7 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.EmployeeWeeklyTasks;
+
+public interface EmployeeWeeklyTasksService extends IService<EmployeeWeeklyTasks> {
+}

+ 7 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/NewprocessImplementationService.java

@@ -0,0 +1,7 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.NewprocessImplementation;
+
+public interface NewprocessImplementationService extends IService<NewprocessImplementation> {
+}

+ 32 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/TBService.java

@@ -0,0 +1,32 @@
+package com.malk.tuosi.service;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.malk.server.common.McR;
+
+import java.util.List;
+import java.util.Map;
+
+public interface TBService {
+    /*TODO:获取apptoken*/
+    McR AppAccessToken() throws JsonProcessingException;
+
+    /*TODO:获取dingtoken*/
+    McR Accesstoken() throws JsonProcessingException;
+
+   /*TODO:接收TB推送的数据*/
+    McR tbTaskUpdate(Map body) throws JsonProcessingException;
+
+    /*TODO:钉盘文件上传接口*/
+    McR uploadKnowledge(String pathName,String fileName,String fileType) throws JsonProcessingException;
+
+    /*TODO:TB回传CRM*/
+    McR tbCallbackCRM(Map body) throws JsonProcessingException;
+
+    /*TODO:OA回传TB*/
+    McR oaCallbackTB(Map body) throws  JsonProcessingException;
+
+    /*TODO:Teambition userId 查询钉钉 userId*/
+    String TBtoDinguserId(List list) throws JsonProcessingException;
+
+}

+ 10 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/TaskService.java

@@ -0,0 +1,10 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.Task;
+
+import java.util.List;
+
+public interface TaskService extends IService<Task> {
+
+}

+ 7 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/YearPersonalConfirmService.java

@@ -0,0 +1,7 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.YearPersonalConfirm;
+
+public interface YearPersonalConfirmService extends IService<YearPersonalConfirm> {
+}

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/AnnualSeasonalSampleServiceImpl.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.AnnualSeasonalSample;
+import com.malk.tuosi.mapper.AnnualSeasonalSampleMapper;
+import com.malk.tuosi.service.AnnualSeasonalSampleService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class AnnualSeasonalSampleServiceImpl extends ServiceImpl<AnnualSeasonalSampleMapper, AnnualSeasonalSample> implements AnnualSeasonalSampleService {
+}

+ 14 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/ConfirmDesignYearServiceImpl.java

@@ -0,0 +1,14 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.ConfirmDesignYear;
+import com.malk.tuosi.mapper.ConfirmDesignYearMapper;
+import com.malk.tuosi.service.ConfirmDesignYearService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class ConfirmDesignYearServiceImpl extends ServiceImpl<ConfirmDesignYearMapper, ConfirmDesignYear> implements ConfirmDesignYearService {
+
+}

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/DesigndeparttMonthConfirmServiceImpl.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.DesigndeparttMonthConfirm;
+import com.malk.tuosi.mapper.DesigndeparttMonthConfirmMapper;
+import com.malk.tuosi.service.DesigndeparttMonthConfirmService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class DesigndeparttMonthConfirmServiceImpl extends ServiceImpl<DesigndeparttMonthConfirmMapper, DesigndeparttMonthConfirm> implements DesigndeparttMonthConfirmService {
+}

+ 12 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/EmployeeWeeklyTasksServiceImpl.java

@@ -0,0 +1,12 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.EmployeeWeeklyTasks;
+import com.malk.tuosi.mapper.EmployeeWeeklyTasksMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class EmployeeWeeklyTasksServiceImpl extends ServiceImpl<EmployeeWeeklyTasksMapper,EmployeeWeeklyTasks> {
+}

+ 14 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/NewprocessImplementationServiceImpl.java

@@ -0,0 +1,14 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.mapper.NewprocessImplementationMapper;
+import com.malk.tuosi.service.NewprocessImplementationService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import com.malk.tuosi.entity.NewprocessImplementation;
+
+@Slf4j
+@Service
+public class NewprocessImplementationServiceImpl extends ServiceImpl<NewprocessImplementationMapper,NewprocessImplementation> implements NewprocessImplementationService {
+
+}

+ 18 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TaskServiceImpl.java

@@ -0,0 +1,18 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.Task;
+import com.malk.tuosi.mapper.TaskMapper;
+import com.malk.tuosi.service.TaskService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class TaskServiceImpl extends ServiceImpl<TaskMapper,Task> implements TaskService {
+}
+
+

+ 806 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TbServiceImpl.java

@@ -0,0 +1,806 @@
+package com.malk.tuosi.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.malk.server.common.McException;
+import com.malk.server.common.McR;
+import com.malk.server.common.VenR;
+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_Extension;
+import com.malk.tuosi.service.TBService;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import com.sun.crypto.provider.PBEWithMD5AndDESCipher;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.io.*;
+import java.net.*;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.net.URL;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class TbServiceImpl implements TBService {
+
+
+    /*TODO:TB获取应用token*/
+    @Override
+    public McR AppAccessToken() throws JsonProcessingException {
+        HashMap body = new HashMap();
+        body.put("appId","6874ba11d22c73565fd8af9d");
+        body.put("appSecret","4JBgPwpctG27SuZrVVeCrXoiVCjie9ID");
+        String doPost = UtilHttp.doPost("https://open.teambition.com/api/appToken",null,null,body);
+        // 使用 Fastjson 解析 JSON
+        JSONObject jsonObject = JSONObject.parseObject(doPost);
+        String appToken = jsonObject.getString("appToken");
+        log.info("Toke:{}",appToken);
+        return McR.success(appToken);
+    }
+
+    /*TODO:钉钉获取应用token*/
+    public McR Accesstoken() throws JsonProcessingException{
+        HashMap params = new HashMap();
+        params.put("appkey","dingtjgevp4t9vnlmpbj");
+        params.put("appsecret","Q3CzrNIj4HjON8buv4zClgpf-A0cW5uDRB5UtMHJHAHuQDj-g1nmq-h7EeYe_i5a");
+        String doGet = UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", null, params);
+        JSONObject jsonObject = JSONObject.parseObject(doGet);
+        String accessToken = jsonObject.getString("access_token");
+        log.info("accessToken:{}",accessToken);
+        return McR.success(accessToken);
+    }
+
+    /*TODO:接收TB推送的数据*/
+    @SneakyThrows
+    @Override
+    public McR tbTaskUpdate(Map body) throws JsonProcessingException {
+        String s = JSON.toJSONString(body);
+        JSONObject jsonObject = JSON.parseObject(s);
+        String event = jsonObject.getString("event");
+        //一层过滤:过滤事件[任务自定义字段更新事件]
+        if (event.equals("v3.task.customfield.update")){
+            JSONObject data = jsonObject.getJSONObject("data");
+            System.out.println(data);
+            //二层过滤:过滤任务字段[只允许work类型字段类型生效]】
+            String customfieldId = data.getString("customfieldId");//自定义字段ID
+            // 1、版线组附件:6889f02fc74205217edfa65b 2、3D效果图:689d9834591915184b095e5f  3、白盒视频:6889c49443cbd3a23c9dc55f
+            //todo:版线组附件回传CRM
+            if(customfieldId.equals("6889f02fc74205217edfa65b") && data.getString("customfieldOldValue").equals("[]")){
+                log.info("第一次上传,版线组附件为空");
+                tbCallbackCRM(data);
+            }
+            String customfieldType = data.getString("customfieldType");//自定义字段类型
+            String taskId = data.getString("taskId");//任务id
+            if(customfieldType.equals("work")){
+                /*TODO:查询任务详情,字段值,获取metaString*/
+                HashMap head = new HashMap();
+                McR accessToken = AppAccessToken();
+                Object tokenData = accessToken.getData();
+                head.put("Authorization","Bearer " + tokenData);
+                head.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+                head.put("X-Tenant-Type","organization");
+
+                HashMap param = new HashMap();
+                param.put("taskId",taskId);
+                String doGet = UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", head, param);//查询任务详情
+                ObjectMapper objectMapper = new ObjectMapper();
+                JsonNode rootNode = objectMapper.readTree(doGet);
+                for(JsonNode resultNode : rootNode.path("result")){
+                    String content = resultNode.path("content").asText();//任务名称
+                    String customerName = "";//客户简称
+                    String manager = "";//节点负责人
+                    String designTime = "";//设计完成时间
+                    for(JsonNode customField : resultNode.path("customfields")) {
+                        String cfId = customField.path("cfId").asText();
+                        if ("68c23d6fee5aa63b8da58878".equals(cfId)) {
+                            JsonNode valueArray = customField.path("value");
+                            if (valueArray.isArray() && valueArray.size() > 0) {
+                                String dateTimeStr = valueArray.get(0).path("title").asText();
+                                // 解析UTC时间
+                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+                                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+                                Date date = sdf.parse(dateTimeStr);
+                                // 直接格式化为本地时间(不需要加8小时)
+                                SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+                                designTime = outputFormat.format(date);
+                            }
+                        }
+                    }
+                    for(JsonNode customField : resultNode.path("customfields")){
+                        String cfId = customField.path("cfId").asText();
+                        if ("687df3b60ae1530fa2704499".equals(cfId)) {
+                            // 获取 value 数组中的第一个元素的 title
+                            JsonNode valueArray = customField.path("value");
+                            if (valueArray.isArray() && valueArray.size() > 0) {
+                                customerName = valueArray.get(0).path("title").asText();//客户简称
+                            }
+                        }else if ("66bb1a56f7e230ed6843796e".equals(cfId)){
+                            JsonNode valueArray = customField.path("value");
+                            if (valueArray.isArray() && valueArray.size() > 0) {
+                                manager = valueArray.get(0).path("title").asText();//节点负责人
+                            }
+                        } else if ("68c23d6fee5aa63b8da58878".equals(cfId)) {
+                            JsonNode valueArray = customField.path("value");
+                            if (valueArray.isArray() && valueArray.size() > 0) {
+                                String dateTimeStr = valueArray.get(0).path("title").asText();
+                                // 解析UTC时间
+                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+                                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+                                Date date = sdf.parse(dateTimeStr);
+                                // 加上8小时(转换为北京时间)
+                                Calendar calendar = Calendar.getInstance();
+                                calendar.setTime(date);
+                                calendar.add(Calendar.HOUR_OF_DAY, 8);
+                                // 格式化为 "yyyy-MM-dd HH:mm"
+                                SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+                                designTime = outputFormat.format(calendar.getTime());//设计完成时间
+                            }
+                        }
+                        if(customfieldId.equals(cfId)){
+                            String writeValueAsString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(customField);
+                            //解析metaString中的resourceId(附件可能会上传多个,所以得遍历customfield里面的值)
+                            ObjectMapper mapper = new ObjectMapper();
+                            JsonNode node = mapper.readTree(writeValueAsString);
+                            JsonNode valueArray =  node.path("value");
+                            //检查value数组是否存在&不为空
+                            if(valueArray.isArray() && valueArray.size() > 0){
+                                List<String> allResourceIds = new ArrayList<>();
+                                List<String> allFileNames = new ArrayList<>();
+                                //遍历所有的value节点,收集resourceId和文件名title
+                                String resourceId = "";
+                                for (int i=0;i<valueArray.size();i++){
+                                    JsonNode valueNode = valueArray.get(i);
+                                    String metaString = valueNode.path("metaString").asText();
+                                    String title = valueNode.path("title").asText();
+
+                                    JsonNode metaJson = objectMapper.readTree(metaString);
+                                    resourceId = metaJson.path("resourceId").asText();
+                                    allResourceIds.add(resourceId);
+                                    allFileNames.add(title);
+                                }
+                                if(!allResourceIds.isEmpty()){
+                                    //根据resourceId获取文件详情 POST https://open.teambition.com/api/v3/file/query/by-resource-ids
+                                    HashMap haader = new HashMap();
+                                    haader.put("Content-Type", "application/json");
+                                    haader.put("Authorization", "Bearer " + tokenData);
+                                    haader.put("x-operator-id", "622ee3450cf3bb5e1a486f1f");
+                                    haader.put("X-Tenant-Id", "61a8c26719c3b5ffe9c4cffb");
+                                    haader.put("X-Tenant-Type", "organization");
+
+                                    HashMap boody = new HashMap();
+                                    boody.put("resourceIds",allResourceIds);
+                                    boody.put("needSign",true);
+
+                                    String fileDownloadResponse = UtilHttp.doPost("https://open.teambition.com/api/v3/file/query/by-resource-ids", haader, null, boody);
+
+                                    JSONObject response = JSON.parseObject(fileDownloadResponse);
+                                    JSONArray resultArray = response.getJSONArray("result");
+
+                                    if(resultArray != null && resultArray.size() > 0){
+                                        //todo:3D效果图放在新图案  白盒视频放在白盒库
+                                        String basedir = "";
+                                        String fileType = "";//附件类型:新图案(199256463063)、白盒(199256765924)
+                                        if(customfieldId.equals("689d9834591915184b095e5f")){
+                                            basedir = "C:/downloads/附件存储/新图案";
+                                            fileType = "199256463063";
+                                        }else if(customfieldId.equals("6889c49443cbd3a23c9dc55f")){
+                                            basedir = "C:/downloads/附件存储/白盒库";
+                                            fileType = "199256765924";
+                                        }else {
+                                            basedir = "C:/downloads/附件存储/其它";
+                                        }
+                                        List<String> successDownloads = new ArrayList<>();
+                                        List<String> failedDownloads = new ArrayList<>();
+                                        //遍历所有结果,下载每个文件(只需要拿到最新的内容即可)
+                                        for (int i=0;i< resultArray.size();i++) {
+                                            JSONObject fileObject = resultArray.getJSONObject(i);
+                                            String downloadUrl = fileObject.getString("downloadUrl");
+                                            //文件名称:设计完成时间-任务名称-客户简称-节点负责人-附件名称
+                                            String fileName = designTime + "_" + content + "_" + customerName + "_" + manager + "_" + fileObject.getString("fileName");
+                                                try {
+                                                    String savePath = downloadFile(downloadUrl, basedir, fileName);
+                                                    successDownloads.add(fileName + "->" + savePath);
+                                                    System.out.println("[文件本地存储成功][" + i + "]=====>" + fileName + "保存路径:" + savePath);
+                                                    /*TODO:钉盘文件存储一份*/
+                                                    System.out.println("[开始上传文件到钉盘]");
+                                                    uploadKnowledge(savePath, fileName,fileType);
+                                                } catch (IOException e) {
+                                                    failedDownloads.add(fileName + "->" + e.getMessage());
+                                                    System.out.println("[文件下载失败][" + i + "]=====>" + fileName + "错误信息:" + e.getMessage());
+                                                }
+                                        }
+
+                                    }else {
+                                        System.out.println("[警告]未找到任何文件下载信息");
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else if (event.equals("v3.task.create")) {
+            JSONObject data = jsonObject.getJSONObject("data");
+            String sfcId = data.getString("sfcId");
+            if (sfcId.equals("6878b3c0669d175c3c6bc679") || sfcId.equals("6878b3ceb5ffcf500365d17a") || sfcId.equals("6878b3d8f40485da4c5f99a2")
+                || sfcId.equals("6878b39a27ae5f3cac355fb9") || sfcId.equals("6878b3a4090e6872fd6b78c6") || sfcId.equals("6878b3ad9e17ac8a027c6d37")
+                || sfcId.equals("68999dc2d1cb63e672e0b503") || sfcId.equals("68999dcf3071884859cacb87") || sfcId.equals("6878b3b60d49d89e7955726f")
+                || sfcId.equals("68999dd990de390188d8bee6")){
+                String taskId = data.getString("taskId");
+                HashMap header = new HashMap();
+                header.put("x-operator-id","622ee3450cf3bb5e1a486f1f");//xmy
+                McR Token = AppAccessToken();
+                Object token = Token.getData();
+                header.put("Authorization","Bearer " + token);
+                header.put("X-Tenant-type","organization");
+                header.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+                HashMap body_AAA = new HashMap();
+                String nodeId = null;
+                switch (sfcId){
+                    case "6878b3c0669d175c3c6bc679" :
+                        nodeId = "6875ba31ff8968791e009dad";
+                        break;
+                    case "6878b3ceb5ffcf500365d17a" :
+                        nodeId = "6875c12442b4476582041a90";
+                        break;
+                    case "6878b3d8f40485da4c5f99a2" :
+                        nodeId = "6875c736476bc6384b458cfa";
+                        break;
+                    case "6878b39a27ae5f3cac355fb9" :
+                        nodeId = "6875f3cf4b7eb5199098892c";
+                        break;
+                    case "6878b3a4090e6872fd6b78c6" :
+                        nodeId = "6875f5e40a12fb0d64feb1e2";
+                        break;
+                    case "6878b3ad9e17ac8a027c6d37" :
+                        nodeId = "6875f78e43d815a435aa9308";
+                        break;
+                    case "68999dc2d1cb63e672e0b503" :
+                        nodeId = "6880881feac3a8e8f6e3aead";
+                        break;
+                    case "68999dcf3071884859cacb87" :
+                        nodeId = "68808b96767bd365b1b7b6f5";
+                        break;
+                    case "6878b3b60d49d89e7955726f" :
+                        nodeId = "6874c857ad8265662925a6ae";
+                        break;
+                    case "68999dd990de390188d8bee6":
+                        nodeId = "6880912c9c778244636507f8";
+                        break;
+                }
+                body_AAA.put("nodeId",nodeId);
+                String doPut = UtilHttp.doPut(
+                        "https://open.teambition.com/api/v3/task/" + taskId + "/node/complete",
+                        header,
+                        null,
+                        body_AAA);
+                log.info("[创建任务自动更新确认流程]");
+            }
+        }else if (event.equals("v3.task.node.status.update")) {
+            /*群卡片推送*/
+            JSONObject data = jsonObject.getJSONObject("data");
+            String nodeId = data.get("nodeId").toString();
+            String taskId = data.get("taskId").toString();
+            if(("6875f58cf512415e5944c64c".equals(nodeId) || "6878a073eaa6f6ff736a5575".equals(nodeId)) && data.get("status").equals("finish")){//主管确认(1)  6875f58cf512415e5944c64c   主管确认(2)6878a073eaa6f6ff736a5575
+                /*设计单主管确认节点*/
+                List<String> allResourceIds = new ArrayList<>();//存储文件的ids
+                List<String>  downloadUrls= new ArrayList<>();//存储文件下载地址(原来的)
+                List<String> newdownloadUrls = new ArrayList<>();//卡片存储文件地址(新的)
+                /*所有的字段信息定义*/
+                String content = "";//todo:任务名称
+                List<String> involveMembers = new ArrayList<>();//todo:负责人
+                String businessManager = "";//todo:业务经理
+                String businessPerson = "";//todo:业务人员
+                String customerName = "";//todo:客户名称
+                String downloadUrl = "";
+                String valueAsString = "";//todo:文件下载地址(jsonString)
+
+                HashMap head = new HashMap();
+                McR accessToken = AppAccessToken();
+                Object tokenData = accessToken.getData();
+                head.put("Authorization","Bearer " + tokenData);
+                head.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+                head.put("X-Tenant-Type","organization");
+                HashMap param = new HashMap();
+                param.put("taskId",taskId);
+                String doGet = UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", head, param);//查询任务详情
+                ObjectMapper objectMapper = new ObjectMapper();
+                JsonNode rootNode = objectMapper.readTree(doGet);
+                JsonNode result = rootNode.path("result");
+                for(JsonNode resultNode : rootNode.path("result")){
+                    content = resultNode.path("content").asText();//todo:任务名称
+
+                    JsonNode customFields = resultNode.path("customfields");
+                    if (customFields.isArray()) {
+                        for (JsonNode field : customFields) {
+                            String cfId = field.path("cfId").asText();
+                            // 检查是否有 value 数组
+                            JsonNode valueArray = field.path("value");
+                            if (!valueArray.isArray() || valueArray.size() == 0) {
+                                continue;
+                            }
+                            // 获取第一个 value 对象
+                            JsonNode firstValue = valueArray.get(0);
+                            switch (cfId) {
+                                case "687df458b9c2f9f90865c13b": // todo:业务经理
+                                    businessManager = firstValue.path("title").asText();
+                                    System.out.println("业务经理: " + businessManager);
+                                    break;
+
+                                case "688191972ab6c4f412ea2bb9": // todo:业务人员
+                                    businessPerson = firstValue.path("title").asText();
+                                    System.out.println("业务人员: " + businessPerson);
+                                    break;
+
+                                case "687df3b60ae1530fa2704499": // todo:客户名称
+                                    customerName = firstValue.path("title").asText();
+                                    System.out.println("客户名称: " + customerName);
+                                    break;
+
+                                case "689d9834591915184b095e5f": // todo:附件 metaString
+                                    JsonNode valueArray1 = field.path("value");
+                                    if (valueArray1.isArray()) {
+                                        for (JsonNode attachment : valueArray) {
+                                            String metaString = attachment.path("metaString").asText();
+                                            String title = attachment.path("title").asText();
+                                            String director = title.substring(title.lastIndexOf("-") + 1, title.lastIndexOf("."));
+                                            involveMembers.add(director);
+                                            if (!metaString.isEmpty()) {
+                                                ObjectMapper mapper = new ObjectMapper();
+                                                JsonNode metaJson = mapper.readTree(metaString);
+                                                String resourceId = metaJson.path("resourceId").asText();
+                                                allResourceIds.add(resourceId);
+                                            }
+                                        }
+                                    }
+                                    HashMap haader = new HashMap();
+                                    haader.put("Content-Type", "application/json");
+                                    haader.put("Authorization", "Bearer " + tokenData);
+                                    haader.put("x-operator-id", "622ee3450cf3bb5e1a486f1f");
+                                    haader.put("X-Tenant-Id", "61a8c26719c3b5ffe9c4cffb");
+                                    haader.put("X-Tenant-Type", "organization");
+
+                                    HashMap boody = new HashMap();
+                                    boody.put("resourceIds",allResourceIds);
+                                    boody.put("needSign",true);
+
+                                    String fileDownloadResponse = UtilHttp.doPost("https://open.teambition.com/api/v3/file/query/by-resource-ids", haader, null, boody);
+                                    JSONObject response = JSON.parseObject(fileDownloadResponse);
+                                    JSONArray resultArray = response.getJSONArray("result");
+                                    for (int i=0;i< resultArray.size();i++) {
+                                        JSONObject fileObject = resultArray.getJSONObject(i);
+                                        downloadUrl = fileObject.getString("downloadUrl");
+                                        downloadUrls.add(downloadUrl);
+                                    }
+                                    System.out.println("下载地址" + downloadUrls);//原下载地址
+
+                                    //todo:把照片存在file目录下
+
+                                    if(resultArray != null && resultArray.size()>0){
+                                        String basedir = "file";
+                                        ArrayList successDownloads = new ArrayList();
+                                        ArrayList faileDownloads = new ArrayList();
+                                        for (int i=0;i<resultArray.size();i++){
+                                            JSONObject fileObject = resultArray.getJSONObject(i);//新下载地址
+                                            String downloadUrl1 = fileObject.getString("downloadUrl");
+                                            long millisTimestamp = System.currentTimeMillis();//当前时间戳
+                                            String fileName = millisTimestamp + "_" + fileObject.getString("fileName");
+                                            try{
+                                                String savePath = downloadFile(downloadUrl1,basedir,fileName);//TODO;存储图片至file目录下
+                                                successDownloads.add(fileName + "->" + savePath);
+                                                System.out.println("文件存储成功["+i+"]=====>"+fileName+"保存路径:"+savePath);
+                                                String newsavepath = "http://ounuo.raresoft.net:7880/file/"+fileName;
+                                                newdownloadUrls.add(newsavepath);
+                                            }catch (IOException e){
+                                                faileDownloads.add(fileName+"->"+e.getMessage());
+                                                System.out.println("文件下载失败["+i+"]=====>"+fileName+"错误信息:"+e.getMessage());
+                                            }
+                                        }
+                                    }
+
+                                    ObjectMapper mapper = new ObjectMapper();
+                                    // 使用Stream API创建List<Map<String, String>>
+                                    List<Map<String, String>> res = newdownloadUrls.stream()
+                                            .map(url -> {
+                                                Map<String, String> map = new LinkedHashMap<>(); // 保持顺序
+                                                map.put("arr", url);
+                                                return map;
+                                            })
+                                            .collect(Collectors.toList());
+                                    valueAsString = mapper.writeValueAsString(res);
+                                    System.out.println("格式化后的下载地址:" + valueAsString);
+                                    break;
+                            }
+                        }
+                    }
+                    System.out.println(); // 空行分隔
+                }
+                //组装数据卡片推送
+                // 业务经理=宁学刚推送至“郝总—节令—设计对接”cid2niI2sTPksK5PHpfrLgCPQ==   业务经理=姜华推送至“姜华—流通—设计对接”cid+J9H07847VNwIYiLpNay0Q==  业务经理=谷晨丹推送至“谷晨丹—烘焙—设计对接”cidqXtqGAN+Es7L/5m3uaZzSg==  业务经理=赵宇娟推送至"赵宇娟—烘焙—设计对接"cidaUtMTIjDHM60UXFfHegKtg==
+                JSONObject cardData = new JSONObject();
+                cardData.put("name_task", content);
+                cardData.put("designer", String.join(",", involveMembers));
+                cardData.put("name_person", businessManager + "," + businessPerson);
+                cardData.put("name_customer", customerName);
+                cardData.put("arr_picture", valueAsString);//todo:里面的每个需要转成jsonString类型
+                cardData.put("link","https://www.teambition.com/project/6878b323386fac7ab9dbe5e9/tasks/view/6878b323cc336006f34d1d22/task/"+taskId);
+                JSONObject message = new JSONObject();
+                message.put("cardData", cardData);
+                message.put("outTrackId", String.valueOf(System.currentTimeMillis()));
+                if("宁学刚".equals(businessManager)){
+                    message.put("openSpaceId", "dtv1.card//IM_GROUP.cid2niI2sTPksK5PHpfrLgCPQ==");
+                } else if ("姜华".equals(businessManager)) {
+                    message.put("openSpaceId", "dtv1.card//IM_GROUP.cid+J9H07847VNwIYiLpNay0Q==");
+                }else if ("赵宇娟".equals(businessManager)) {
+                    message.put("openSpaceId", "dtv1.card//IM_GROUP.cidaUtMTIjDHM60UXFfHegKtg==");
+                } else if ("陈晶".equals(businessManager) || "郝俊秀".equals(businessManager)) {
+                    message.put("openSpaceId", "dtv1.card//IM_GROUP.cidTppONwRCrkshRlCt28O+NA==");
+                }
+//                message.put("openSpaceId", "dtv1.card//IM_GROUP.cidTppONwRCrkshRlCt28O+NA==");//正式群id:cidTppONwRCrkshRlCt28O+NA==   测试群id:cidKoVDKhvynnj+73h0uxSJBA==
+                message.put("cardTemplateId", "160b26bf-d699-49fc-a6dc-9cd20eed7750.schema");
+                message.put("robotCode", "dinghhozexm92tupobfo");
+//                message.put("link","https://www.teambition.com/project/6878b323386fac7ab9dbe5e9/tasks/view/6878b323cc336006f34d1d22/task/" + taskId);
+                createAndDeliverCard(message);//调用卡片推送
+            }
+        }
+         return McR.success();
+    }
+
+    /*TODO:钉盘文件上传*/
+    @SneakyThrows
+    @Override
+    public McR uploadKnowledge(String pathName,String fileName,String fileType) throws JsonProcessingException {
+        /*TODO:step1:获取上传文件需要的resourceUrls和headers参数值*/
+        HashMap head = new HashMap();
+        McR accessToken = Accesstoken();
+        Object tokenData = accessToken.getData();
+        head.put("x-acs-dingtalk-access-token",tokenData);
+
+        HashMap params = new HashMap();
+        params.put("unionId","Vwt6seFpRYYCh1yj2BBTCwiEiE");
+
+        HashMap body = new HashMap();
+        body.put("protocol","HEADER_SIGNATURE");//默认
+        body.put("multipart",false);//5G以下文件,设为false
+        DDR_New deptDDR  = (DDR_New) UtilHttp.doPost("https://api.dingtalk.com/v1.0/storage/spaces/27116552652/files/uploadInfos/query", head, params, body, DDR_New.class);
+        Map headerSignatureInfo = deptDDR.getHeaderSignatureInfo();
+        /*TODO:step2:使用OSS的header加签方式上传文件*/
+        List<String> resourceUrls = (List<String>) headerSignatureInfo.get("resourceUrls");
+        //从接口中获取到resourceUrl
+        String resourceUrl = resourceUrls.get(0);
+        //从接口中获取到headers
+        Map<String, String> headers = (Map<String, String>) headerSignatureInfo.get("headers");
+        URL url = new URL(resourceUrl);
+        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+        if (headers != null) {
+            for (Map.Entry<String, String> entry : headers.entrySet()) {
+                connection.setRequestProperty(entry.getKey(), entry.getValue());
+            }
+        }
+        connection.setDoOutput(true);
+        connection.setRequestMethod("PUT");
+        connection.setUseCaches(false);
+        connection.setReadTimeout(10000);
+        connection.setConnectTimeout(10000);
+        connection.connect();
+        OutputStream out = connection.getOutputStream();
+        InputStream is = new FileInputStream(new File(pathName));
+        byte[] b =new byte[1024];
+        int temp;
+        while ((temp=is.read(b))!=-1){
+            out.write(b,0,temp);
+        }
+        out.flush();
+        out.close();
+        int responseCode = connection.getResponseCode();
+        connection.disconnect();
+        if (responseCode == 200) {
+            System.out.println("上传成功");
+        } else {
+            System.out.println("上传失败");
+        }
+        /*TODO:step3:调用提交文件接口,完成文件上传*/
+        HashMap param = new HashMap();
+        param.put("unionId","Vwt6seFpRYYCh1yj2BBTCwiEiE");
+
+        HashMap boddy = new HashMap();
+        String uploadKey = deptDDR.getUploadKey();
+        boddy.put("uploadKey",uploadKey);//添加文件唯一标识uploadKey
+        boddy.put("name",fileName);//文件的名称,带后缀
+        boddy.put("parentId",fileType);//父目录Id====> 白盒库:199256765924    新图案:199256463063
+
+        HashMap header = new HashMap();
+        header.put("x-acs-dingtalk-access-token",tokenData);
+        String post = UtilHttp.doPost("https://api.dingtalk.com/v1.0/storage/spaces/27116552652/files/commit", header, param, boddy);
+        return McR.success(post);
+    }
+
+    /*TODO:版线组位置附件上传CRM*/
+    @Override
+    public McR tbCallbackCRM(Map body) throws JsonProcessingException {
+        String s = JSON.toJSONString(body);
+        //解析参数拿到taskIda
+        JSONObject object = JSON.parseObject(s);
+        String taskId = object.getString("taskId");//任务id
+        String customfieldId = object.getString("customfieldId");//自定义字段id
+        //获取回传CRM中的crmid  metaString(若有)
+        HashMap head = new HashMap();
+        McR accessToken = AppAccessToken();
+        Object tokenData = accessToken.getData();
+        head.put("Authorization","Bearer " + tokenData);
+        head.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+        head.put("X-Tenant-Type","organization");
+        HashMap param = new HashMap();
+        param.put("taskId",taskId);
+        String doGet = UtilHttp.doGet("https://open.teambition.com/api/v3/task/query", head, param);
+        JSONObject responseJson = JSON.parseObject(doGet);
+        JSONArray resultArray = responseJson.getJSONArray("result");
+        String crmid = null;
+        String metaString = null;
+        String resourceId = null;
+        List<String> resourceIds_AAA = new ArrayList<>();
+        if(resultArray != null && !resultArray.isEmpty()){
+            JSONObject task = resultArray.getJSONObject(0);
+            JSONArray customFields = task.getJSONArray("customfields");
+            if(customFields != null){
+                for (int i = 0; i < customFields.size(); i++) {
+                    JSONObject field = customFields.getJSONObject(i);
+                    String cfId = field.getString("cfId");
+                    if("689d4ebf343c05fe73700c93".equals(cfId)){//CRM单据ID
+                        JSONArray valueArray = field.getJSONArray("value");
+                        if(valueArray != null && !valueArray.isEmpty()){
+                            JSONObject firstValue = valueArray.getJSONObject(0);
+                            crmid = firstValue.getString("title");
+                        }
+                    }
+
+                    if("6889f02fc74205217edfa65b".equals(cfId)){//版线位置附件
+                        JSONArray array = field.getJSONArray("value");
+                        if(array != null && !array.isEmpty()){
+                            for (int j = 0; j < array.size(); j++) {
+                                JSONObject firstValue1 = array.getJSONObject(j);
+                                metaString =firstValue1.getString("metaString");
+                                JSONObject jsonObject = JSON.parseObject(metaString);
+                                resourceId  = jsonObject.getString("resourceId");
+                            }
+                            resourceIds_AAA.add(resourceId);
+                        }
+                    }
+
+                }
+            }
+        }
+        //获取当前变更时间 202x-0x-xx xx:xx:xx
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String jssj = now.format(formatter);
+        //获取文件downloadurl(若有) 1、查询任务详情(拿到metaString)  2、获取文件下载URL
+        String done = null;
+        if(!metaString.isEmpty()){
+            HashMap header = new HashMap();
+            McR Token = AppAccessToken();
+            Object token = Token.getData();
+            header.put("Authorization","Bearer " + token);
+            header.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+            header.put("X-Tenant-Type","organization");
+            HashMap bodyy = new HashMap();
+            bodyy.put("needSign",true);
+            bodyy.put("resourceIds",resourceIds_AAA);
+            String post = UtilHttp.doPost("https://open.teambition.com/api/v3/file/query/by-resource-ids", header, null, bodyy);
+            String downloadURL = JSON.parseObject(post).getJSONArray("result").getJSONObject(0).getString("downloadUrl");
+            //获取文件名称
+            String fileName = JSON.parseObject(post).getJSONArray("result").getJSONObject(0).getString("fileName");
+            //TODO:调用TB回传CRM接口
+            //构建请求头
+            HashMap headers = new HashMap();
+            headers.put("crmuserid","620131c2fe8d7eb6b8dfbf76");//tb的userid(固定是张昆)
+            headers.put("TargetSystem","CRM");//固定值
+            //构建params参数
+            HashMap params = new HashMap();
+            params.put("crmid",crmid);
+            params.put("jssj",jssj);
+            params.put("bxwz",downloadURL);
+            params.put("bxwzsname",fileName);
+            //构建body参数
+            HashMap bodys = new HashMap();
+            bodys.put("params",params);
+            done = UtilHttp.doPost("http://ounuo.ip.raresoft.net:8888/api/dd/selfchange", headers, null, bodys);
+        }
+
+        return McR.success(done);
+    }
+
+    @Autowired
+    private DDConf ddConf;
+    @Autowired
+    private DDClient ddClient;
+
+    @Override
+    public McR oaCallbackTB(Map body) throws JsonProcessingException {
+        //获取单个审批实例详情
+        HashMap params_AAA = new HashMap();
+        params_AAA.put("appkey","dingi61ncsi1zjo7eosp");
+        params_AAA.put("appsecret","unvpxWgDeYEokuUlD-4iyDh0NdRH3NRKE1OkDF8VPQwyYi0Nuo_uXTWBYxnKYJaI");
+        String doGet = UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", null, params_AAA);
+        JSONObject jsonObject_AAA = JSONObject.parseObject(doGet);
+        String accessToken = jsonObject_AAA.getString("access_token");
+
+        HashMap head_AAA = new HashMap();
+        head_AAA.put("x-acs-dingtalk-access-token",accessToken);
+        HashMap params = new HashMap();
+        String InstanceId = body.get("InstanceId").toString();
+        params.put("processInstanceId",InstanceId);
+        String s = UtilHttp.doGet("https://api.dingtalk.com/v1.0/workflow/processInstances", head_AAA, params);
+        JSONObject jsonObject = JSON.parseObject(s);
+        JSONObject jsonObject1 = jsonObject.getJSONObject("result");
+        JSONArray jsonArray = jsonObject1.getJSONArray("operationRecords");
+        String remark = "";
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject2 = jsonArray.getJSONObject(i);
+            String type = jsonObject2.getString("type");
+            String s1 = jsonObject2.getString("remark");
+            if (type.equals("ADD_REMARK") && s1.contains("发起审批的 Teambition 任务")){
+                remark = jsonObject2.getString("remark");
+            }
+        }
+        //截取remark中()的内容
+        String remarkStr111 = remark.substring(remark.indexOf("(") + 1, remark.indexOf(")"));
+        String remarkStr222 = "";
+        try {
+            remarkStr222 = URLDecoder.decode(remarkStr111, "UTF-8");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        String remarkStr333 = "";
+        try {
+            remarkStr333 = URLDecoder.decode(remarkStr222, "UTF-8");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        //获取链接中的tasks/后?前的参数
+        String strStart = "tasks/";
+        String endStart = "?isDingtalkHeaderHidden";
+        String taskId = remarkStr333.substring(remarkStr333.indexOf(strStart) + 6, remarkStr333.lastIndexOf(endStart));
+        //更新任务
+        double value = 0;
+        String name = "";
+        JSONArray array = jsonObject1.getJSONArray("formComponentValues");
+        for (int j=0;j<array.size();j++){
+            JSONObject object = array.getJSONObject(j);
+            name = object.getString("name");
+            if(name.equals("版费总价")){
+                value = object.getDoubleValue("value");
+            }
+        }
+        HashMap head = new HashMap();
+        head.put("x-operator-id","622ee3450cf3bb5e1a486f1f");
+        McR Token = AppAccessToken();
+        Object tok = Token.getData();
+        head.put("Authorization","Bearer " + tok);
+        head.put("X-Tenant-type","organization");
+        head.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+        String finalName = name;
+        double finalValue = value;
+        HashMap<String,Object> bodyy =  new HashMap<String,Object>(){{
+           put("customfieldName", finalName);
+           put("value",Collections.singletonList(
+                   new HashMap<String,String>() {{
+                       put("title", String.valueOf(finalValue));
+                   }}
+           ));
+        }};
+        String s1 = UtilHttp.doPost("https://open.teambition.com/api/v3/task/" + taskId + "/customfield/update", head, null, bodyy);
+        return McR.success(s1);
+    }
+
+    @Override
+    public String TBtoDinguserId(List list) throws JsonProcessingException {
+        System.out.println(list);
+        HashMap header = new HashMap();
+        McR accessToken = AppAccessToken();
+        Object tokenData = accessToken.getData();
+        header.put("Authorization","Bearer " + tokenData);
+        header.put("X-Tenant-type","organization");
+        header.put("X-Tenant-Id","61a8c26719c3b5ffe9c4cffb");
+        HashMap param = new HashMap();
+        param.put("tbUserIds",list);
+        String s = UtilHttp.doGet("https://open.teambition.com/api/idmap/dingtalk/getDingUserId", header, param);
+        ObjectMapper objectMapper = new ObjectMapper();
+        var rootNode = objectMapper.readTree(s);
+        List<String> userIdList  = objectMapper.convertValue(
+                        rootNode.get("result"),
+                        new TypeReference<List<Map<String, String>>>() {
+                        }
+                )
+                .stream()
+                .map(map -> map.get("dingtalkUserId"))
+                .collect(Collectors.toList());
+        //开始处理userid查询用户名称
+        HashMap params = new HashMap();
+        McR Token = Accesstoken();
+        Object Data = Token.getData();
+        params.put("access_token",Data);
+        HashMap body = new HashMap();
+        List<String> nameList  = new ArrayList<>();
+        String result = "";
+        for (String str : userIdList){
+            body.put("userid",str);
+            String doPost = UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, params, body);
+            ObjectMapper objectmapper = new ObjectMapper();
+            String username = objectMapper.readTree(doPost)
+                    .path("result")
+                    .path("name")
+                    .asText();
+            nameList.add(username);
+            result = nameList.stream()
+                    .collect(Collectors.joining(","));
+        }
+        return result;
+    }
+
+    //文件存储方法
+    /**
+     * 下载文件到本地(自定义文件名)
+     * param fileUrl 文件下载URL
+     * param baseDir 基础存储目录
+     * param customFileName 自定义文件名(不含扩展名)
+     * return 下载后的文件绝对路径
+*/    public static String downloadFile(String fileUrl,String baseDir,String customFileName) throws IOException{
+        // 创建基础目录
+        File baseDirectory = new File(baseDir);
+        if (!baseDirectory.exists()) {
+            baseDirectory.mkdirs();
+        }
+
+        // 完整的保存路径
+        String savePath = new File(baseDir, customFileName).getAbsolutePath();
+
+        // 下载文件
+        URL url = new URL(fileUrl);
+        URLConnection connection = url.openConnection();
+        try (InputStream in = connection.getInputStream();
+             FileOutputStream out = new FileOutputStream(savePath)) {
+
+            byte[] buffer = new byte[4096];
+            int bytesRead;
+            while ((bytesRead = in.read(buffer)) != -1) {
+                out.write(buffer, 0, bytesRead);
+            }
+        }
+        return savePath;
+    }
+
+
+    @Autowired
+    private DDClient_Extension ddClientExtension;
+    /*群消息卡片推送*/
+    public McR createAndDeliverCard(@RequestBody JSONObject param){
+        log.info("推送消息:{}",param);
+        McException.assertParamException_Null(param,"cardData","outTrackId","openSpaceId","robotCode","cardTemplateId");
+        Map<String,Object> data = new HashMap();
+        data.put("imGroupOpenDeliverModel", UtilMap.map("robotCode",param.getString("robotCode")));
+        data.put("imGroupOpenSpaceModel",UtilMap.map("supportForward",true));
+        if(param.containsKey("extInfo")){
+            data.putAll(param.getJSONObject("extInfo"));
+        }
+        Map map = ddClientExtension.createAndDeliverCards(ddClient.getAccessToken(),param.getString("cardTemplateId"),param.getString("outTrackId"),
+                UtilMap.map("cardParamMap",param.getJSONObject("cardData")),param.getString("openSpaceId"),data);
+        return McR.success(map);
+    }
+
+}

+ 9 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/YearPersonalConfirmServiceImpl.java

@@ -0,0 +1,9 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.YearPersonalConfirm;
+import com.malk.tuosi.mapper.YearPersonalConfirmMapper;
+import com.malk.tuosi.service.YearPersonalConfirmService;
+
+public class YearPersonalConfirmServiceImpl extends ServiceImpl<YearPersonalConfirmMapper, YearPersonalConfirm> implements YearPersonalConfirmService {
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 263 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/test/test.java


+ 114 - 0
mjava-ounuo/src/main/resources/application-dev.yml

@@ -0,0 +1,114 @@
+# 环境配置
+server:
+  port: 8082
+  servlet:
+    context-path: /api/ounuo
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+#spring:
+#  # database
+#  datasource:
+##      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    username: ounuo_user
+#    password: OUNUO123!
+#    url: jdbc:mysql://ounuo.raresoft.net:33306/TASK
+#  jpa:
+#    hibernate:
+#      ddl-auto: none
+#    show-sql: true
+#    database: oracle
+#  hikari:
+#    pool-name: DateHikariCP
+#    minimum-idle: 0
+#    maximum-pool-size: 10
+#    idle-timeout: 30000
+#    max-lifetime: 120000          # 小于数据库超时大于业务执行返回时间[hikari默认30m, mysql默认10m]
+#    connection-timeout: 30000     # 数据库连接超时时间,默认30秒,即30000
+
+spring:
+  datasource:
+    url: jdbc:mysql://47.110.74.198:3306/ounuo?useSSL=false&serverTimezone=Asia/Shanghai
+    username: root
+    password: cp-root@2022++
+    hikari:
+      # 检测连接是否有效的 SQL(每次从连接池获取连接时执行)
+      connection-test-query: SELECT 1
+      # 或使用更标准的 JDBC4 isValid()(推荐)
+      # connection-test-query 不需要设置,Hikari 默认用 isValid()
+
+      # 连接最大存活时间(必须 < MySQL 的 wait_timeout,建议 30 分钟)
+      max-lifetime: 1800000  # 30分钟
+
+      # 空闲连接超时(小于 max-lifetime)
+      idle-timeout: 600000   # 10分钟
+
+      # 从连接池获取连接的超时时间
+      connection-timeout: 30000 # 30秒
+
+      # 最小空闲连接数
+      minimum-idle: 5
+
+
+
+  #    # 主库
+#    primary:
+#      username: root
+#      password: mu123
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#    # 从库
+#    slave:
+#      username: root
+#      password: mu123
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#  jpa:
+#    hibernate:
+#      ddl-auto: none      # JPA对表没有任何操作
+#    show-sql: true
+#    database: ORACLE
+#    database-platform: org.hibernate.dialect.Oracle12cDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+  level:
+    com.malk.*: debug
+
+# dingtalk 钉钉
+dingtalk:
+  agentId: 4115325431
+  appKey: dinghhozexm92tupobfo
+  appSecret: -zYNwc4j9hssiP0mTNbSe0D9v9ejh4OIaHnx_EhVZWJbwnatvgtNiSFPIwAg9AGb
+  corpId: ding2af339267563330e4ac5d6980864d335
+  aesKey:
+  token:
+  operator: 332051151139376769   # OA管理员账号:鲜明阳 [0开头需要转一下字符串]
+
+# aliwork 宜搭
+aliwork:
+  appType: APP_VCTRP6227CC8368NDOID
+  systemToken: 5H9662C1X8XJLFFCE841M5VBEBQ73DM5IBPULPI3
+
+# MyBatisplus配置
+mybatis-plus:
+  mapper-locations: classpath:mapper/*.xml  # mapper.xml存放路径
+  type-aliases-package: com.malk.tuosi.entity  # 实体类包路径
+  configuration:
+    # 开启下划线转驼峰(默认就是true,但明确配置一下)
+    map-underscore-to-camel-case: true
+
+#定时器
+enable:
+  scheduling: true

+ 99 - 0
mjava-ounuo/src/main/resources/application-prod.yml

@@ -0,0 +1,99 @@
+# 环境配置
+server:
+  port: 7879
+  servlet:
+    context-path: /api/ounuo
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+#spring:
+#  # database
+#  datasource:
+#    hikari:
+#    #      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    username: ounuo_user
+#    password: OUNUO123!
+#    url: jdbc:mysql://ounuo.raresoft.net:33306/TASK
+
+spring:
+  datasource:
+    url: jdbc:mysql://47.110.74.198:3306/ounuo?useSSL=false&serverTimezone=Asia/Shanghai
+    username: root
+    password: cp-root@2022++
+    hikari:
+      # 检测连接是否有效的 SQL(每次从连接池获取连接时执行)
+      connection-test-query: SELECT 1
+      # 或使用更标准的 JDBC4 isValid()(推荐)
+      # connection-test-query 不需要设置,Hikari 默认用 isValid()
+
+      # 连接最大存活时间(必须 < MySQL 的 wait_timeout,建议 30 分钟)
+      max-lifetime: 1800000  # 30分钟
+
+      # 空闲连接超时(小于 max-lifetime)
+      idle-timeout: 600000   # 10分钟
+
+      # 从连接池获取连接的超时时间
+      connection-timeout: 30000 # 30秒
+
+      # 最小空闲连接数
+      minimum-idle: 5
+
+
+  #    # 主库
+  #    primary:
+  #      username: root
+  #      password: mu123
+  #      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  #    # 从库
+  #    slave:
+  #      username: root
+  #      password: mu123
+  #      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: ORACLE
+    database-platform: org.hibernate.dialect.Oracle12cDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk 钉钉
+dingtalk:
+  agentId: 4115325431
+  appKey: dinghhozexm92tupobfo
+  appSecret: -zYNwc4j9hssiP0mTNbSe0D9v9ejh4OIaHnx_EhVZWJbwnatvgtNiSFPIwAg9AGb
+  corpId: ding2af339267563330e4ac5d6980864d335
+  aesKey:
+  token:
+  operator: 332051151139376769   # OA管理员账号:鲜明阳 [0开头需要转一下字符串]
+
+# aliwork 宜搭
+aliwork:
+  appType: APP_VCTRP6227CC8368NDOID
+  systemToken: 5H9662C1X8XJLFFCE841M5VBEBQ73DM5IBPULPI3
+
+# MyBatisplus配置
+mybatis-plus:
+  mapper-locations: classpath:mapper/*.xml  # mapper.xml存放路径
+  type-aliases-package: com.malk.tuosi.entity  # 实体类包路径
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 打印SQL日志(可选)
+
+#定时器
+enable:
+  scheduling: true

+ 3 - 0
mjava-ounuo/src/main/resources/application.yml

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

+ 13 - 0
mjava-ounuo/src/test/java/com/malk/tuosi/MjavaOunuoApplicationTests.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MjavaOunuoApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 439 - 2
pom.xml

@@ -5,11 +5,448 @@
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>com.malk</groupId>
-    <artifactId>cont</artifactId>
-    <packaging>pom</packaging>
+    <artifactId>java-mcli</artifactId>
     <version>1.0-SNAPSHOT</version>
+
     <modules>
+
+        <module>mjava-ounuo</module>
+
     </modules>
+    <packaging>pom</packaging>
+
+    <name>cont</name>
+    <description>mjava framework</description>
+
+    <!-- 版本管理 Management -->
+    <properties>
+        <!-- mjava版本: 修改mjava pom配置 -->
+        <mjava.version>0.0.3</mjava.version>
+        <!-- 全局配置 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <!-- 公共依赖 -->
+        <spring-boot-dependencies.version>2.2.13.RELEASE</spring-boot-dependencies.version>
+        <junit.verson>4.12</junit.verson>
+        <lombok.version>1.18.8</lombok.version>
+        <validation-api.version>2.0.1.Final</validation-api.version>
+        <fastjson.version>1.2.83</fastjson.version>
+        <commons-lang3.version>3.10</commons-lang3.version>
+        <guava.version>30.1.1-jre</guava.version>
+        <hutool-all.version>5.6.0</hutool-all.version>
+        <spring-boot-starter-data-jpa.version>2.1.3.RELEASE</spring-boot-starter-data-jpa.version>
+        <querydsl-apt.version>4.2.1</querydsl-apt.version>
+        <querydsl-jpa.version>4.2.1</querydsl-jpa.version>
+        <spring-boot-starter-jdbc.version>2.2.13.RELEASE</spring-boot-starter-jdbc.version>
+        <easyexcel.version>2.2.7</easyexcel.version>
+        <java-jwt.version>3.4.0</java-jwt.version>
+        <!-- 数据库连接 [仅mysql为全局依赖] -->
+        <mysql-connector-java.version>8.0.22</mysql-connector-java.version>
+        <mssql-jdbc.version>6.4.0.jre8</mssql-jdbc.version>
+        <ojdbc6.version>11.2.0.4</ojdbc6.version>
+        <mongo-java-driver.version>3.12.7</mongo-java-driver.version>
+        <spring-boot-starter-data-mongodb.version>2.2.13.RELEASE</spring-boot-starter-data-mongodb.version>
+        <!-- jsp [非全局依赖] -->
+        <tomcat-embed-jasper.version>9.0.41</tomcat-embed-jasper.version>
+        <jstl.version>1.2</jstl.version>
+        <javax.servlet-api.version>4.0.1</javax.servlet-api.version>
+        <javax.servlet.jsp-api.version>2.3.1</javax.servlet.jsp-api.version>
+        <!-- jwt [非全局依赖] -->
+        <!-- swagger3: todo -->
+        <springfox-boot-starter.version>3.0.0</springfox-boot-starter.version>
+        <!-- 网页转pdf [非全局依赖] -->
+        <flying-saucer-pdf-itext5.version>9.0.3</flying-saucer-pdf-itext5.version>
+        <!-- 腾讯云[发票识别] [非全局依赖] -->
+        <tencentcloud-sdk-java.version>3.1.778</tencentcloud-sdk-java.version>
+        <!-- 不执行单元测试,也不编译测试类 -->
+        <skipTests>true</skipTests>
+        <!-- 不执行单元测试,但会编译测试类,并在target/test-classes目录下生成相应的class -->
+        <maven.test.skip>true</maven.test.skip>
+    </properties>
+
+    <!-- 依赖声明 & 版本 -->
+    <dependencyManagement>
+        <dependencies>
+            <!-- SpringBoot 依赖 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot-dependencies.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <!-- 单元测试 -->
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.verson}</version>
+                <scope>test</scope>
+            </dependency>
+
+
+            <!-- lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+            <!-- validation 参数校验 -->
+            <dependency>
+                <groupId>javax.validation</groupId>
+                <artifactId>validation-api</artifactId>
+                <version>${validation-api.version}</version>
+            </dependency>
+
+            <!-- 阿里巴巴 json -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>2.8.9</version> <!-- 确保使用最新版本 -->
+            </dependency>
+
+            <!-- 通用的工具类集 -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+            <!-- ppExt: 23.10.26 钉钉新方式以Steam接入, HTTP形式commonsc-codec在升级之后,其内部做了一个validateCharacter校验. 使用 guava 替代-->
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <!-- 国产工具集 -->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool-all.version}</version>
+            </dependency>
+
+            <!-- data-jpa 数据库操作 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-jpa</artifactId>
+                <version>${spring-boot-starter-data-jpa.version}</version>
+            </dependency>
+
+            <!-- QueryDSL 4.x 支持-->
+            <dependency>
+                <groupId>com.querydsl</groupId>
+                <artifactId>querydsl-apt</artifactId>
+                <scope>provided</scope>
+                <version>${querydsl-apt.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.querydsl</groupId>
+                <artifactId>querydsl-jpa</artifactId>
+                <version>${querydsl-jpa.version}</version>
+            </dependency>
+
+            <!-- AOP多数据源切换 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-jdbc</artifactId>
+                <version>${spring-boot-starter-jdbc.version}</version>
+            </dependency>
+
+            <!-- easyExcel 优化 poi [不影响单独引入poi, 会冲突] -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+
+            <!-- jwt [teambition] -->
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>${java-jwt.version}</version>
+            </dependency>
+
+            <!-- mySql 驱动 -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql-connector-java.version}</version>
+            </dependency>
+
+            <!-- sqlserver依赖 -->
+            <dependency>
+                <groupId>com.microsoft.sqlserver</groupId>
+                <artifactId>mssql-jdbc</artifactId>
+                <scope>runtime</scope>
+                <version>${mssql-jdbc.version}</version>
+            </dependency>
+
+            <!-- Oracle 依赖 -->
+            <dependency>
+                <groupId>com.oracle.database.jdbc</groupId>
+                <artifactId>ojdbc6</artifactId>
+                <version>${ojdbc6.version}</version>
+            </dependency>
+
+            <!-- MongoDB 驱动 -->
+            <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongo-java-driver</artifactId>
+                <version>${mongo-java-driver.version}</version>
+            </dependency>
+            <!-- MongoDB jpa 操作 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-mongodb</artifactId>
+                <version>${spring-boot-starter-data-mongodb.version}</version>
+            </dependency>
+
+            <!-- url转pdf -->
+            <dependency>
+                <groupId>org.xhtmlrenderer</groupId>
+                <artifactId>flying-saucer-pdf-itext5</artifactId>
+                <version>${flying-saucer-pdf-itext5.version}</version>
+            </dependency>
+
+            <!-- jsp: tomcat-embed-jasper 需要添加到子项目内 -->
+            <dependency>
+                <groupId>org.apache.tomcat.embed</groupId>
+                <artifactId>tomcat-embed-jasper</artifactId>
+                <version>${tomcat-embed-jasper.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>jstl</artifactId>
+                <version>${jstl.version}</version>
+            </dependency>
+            <!-- servlet -->
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>javax.servlet-api</artifactId>
+                <version>${javax.servlet-api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet.jsp</groupId>
+                <artifactId>javax.servlet.jsp-api</artifactId>
+                <version>${javax.servlet.jsp-api.version}</version>
+            </dependency>
+
+            <!-- 腾讯云 -->
+            <dependency>
+                <groupId>com.tencentcloudapi</groupId>
+                <artifactId>tencentcloud-sdk-java</artifactId>
+                <version>${tencentcloud-sdk-java.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <!-- 子项目需要与 mjava 相同的依赖, 否则调试可运行, 打包后会运行报错. 为了避免重复引入 pom, 将 mjava 依赖直接在全局 pom 引入 -->
+    <dependencies>
+        <!-- spring boot -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- spring-boot-devtools [热部署] -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
+        </dependency>
+        <!-- 单元测试 -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20231013</version>
+        </dependency>
+
+        <!-- validation 参数校验 -->
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+
+        <!-- 阿里巴巴 json -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- 通用的工具类集 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <!-- 国产工具集 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <!-- data-jpa 数据库操作 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <!-- QueryDSL 4.x 支持-->
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-jpa</artifactId>
+        </dependency>
+
+        <!-- AOP多数据源切换 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
+        <!-- easyExcel 优化 poi [不影响单独引入poi, 会冲突] -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+
+        <!-- jwt [teambition] -->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+        </dependency>
+
+        <!-- mySql 驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.json-simple</groupId>
+            <artifactId>json-simple</artifactId>
+            <version>1.1</version>
+        </dependency>
+
+        <!-- Oracle 依赖 -->
+        <!--        <dependency>-->
+        <!--            <groupId>com.oracle.database.jdbc</groupId>-->
+        <!--            <artifactId>ojdbc6</artifactId>-->
+        <!--        </dependency>-->
+
+        <!-- sqlserver 依赖 -->
+        <!--        <dependency>-->
+        <!--            <groupId>com.microsoft.sqlserver</groupId>-->
+        <!--            <artifactId>mssql-jdbc</artifactId>-->
+        <!--            <scope>runtime</scope>-->
+        <!--        </dependency>-->
+
+
+        <!-- MongoDB 驱动 -->
+        <!--        <dependency>-->
+        <!--            <groupId>org.mongodb</groupId>-->
+        <!--            <artifactId>mongo-java-driver</artifactId>-->
+        <!--        </dependency>-->
+        <!-- MongoDB jpa 操作 -->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
+        <!--            <version>${spring-boot-starter-data-mongodb.version}</version>-->
+        <!--        </dependency>-->
+
+        <!-- url转pdf -->
+        <!--        <dependency>-->
+        <!--            <groupId>org.xhtmlrenderer</groupId>-->
+        <!--            <artifactId>flying-saucer-pdf-itext5</artifactId>-->
+        <!--        </dependency>-->
+
+        <!-- jsp: tomcat-embed-jasper 需要在子项目内引用才有效 -->
+        <!--        <dependency>-->
+        <!--            <groupId>javax.servlet</groupId>-->
+        <!--            <artifactId>jstl</artifactId>-->
+        <!--        </dependency>-->
+        <!-- servlet -->
+        <!--        <dependency>-->
+        <!--            <groupId>javax.servlet</groupId>-->
+        <!--            <artifactId>javax.servlet-api</artifactId>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>javax.servlet.jsp</groupId>-->
+        <!--            <artifactId>javax.servlet.jsp-api</artifactId>-->
+        <!--        </dependency>-->
 
+        <!-- 腾讯云 [go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version.] -->
+        <!--        <dependency>-->
+        <!--            <groupId>com.tencentcloudapi</groupId>-->
+        <!--            <artifactId>tencentcloud-sdk-java</artifactId>-->
+        <!--        </dependency>-->
+    </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <!-- jva使用了未经检查或不安全的操作,编译会有打印,通过插件显示具体报错警告位置, 如 T, Map, List 也会报警告 -->
+                    <compilerArgument>-Xlint:unchecked</compilerArgument>
+                </configuration>
+            </plugin>
+            <!-- QueryDSL 插件: 因为QueryDsl是类型安全的,所以还需要加上Maven APT plugin,使用 APT 自动生成Q类 -->
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>target/generated-sources/java</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>