瀏覽代碼

绩效考核

fyz 2 月之前
父節點
當前提交
adcd579c37

+ 60 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/controller/AccessController.java

@@ -0,0 +1,60 @@
+package com.malk.lanyun.controller;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.lanyun.entity.Budget;
+import com.malk.lanyun.listener.BudgetListener;
+import com.malk.lanyun.listener.BudgetListenerForProject;
+import com.malk.lanyun.service.WorkService;
+import com.malk.server.common.McException;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * 宜搭传入预算文件解析
+ * @author floe
+ * @date 2024/12/2 21:14
+ */
+
+@Slf4j
+@RestController
+@RequestMapping("/access/")
+public class AccessController {
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private WorkService workService;
+
+    /**
+     * 定额确认单更新定额档案——服务注册
+     * @param formInstanceId
+     * @return
+     */
+    @PostMapping("updateProject")
+    public McR updateProject(@RequestParam("formInstanceId") String formInstanceId) {
+        log.info("定额确认单更新定额档案,入参: {} ", formInstanceId);
+        workService.updateProject(formInstanceId);
+        return McR.success();
+    }
+
+    /**
+     * 定额确认后自动发起考核评审——连接器
+     * @param data
+     * @return
+     */
+    @PostMapping("startAssessReview")
+    public McR startAssessReview(@RequestBody Map data) {
+        log.info("定额确认单更新定额档案,入参: {} ", data);
+        workService.startAssessReview(data);
+        return McR.success();
+    }
+}

+ 13 - 3
mjava-lanyun/src/main/java/com/malk/lanyun/schedule/WorkTask.java

@@ -18,11 +18,21 @@ public class WorkTask {
     WorkService workService;
 
     /**
-     * 每月1日凌晨4点跑批NC生产成本
+     * 每月21日凌晨3点发起考核确认单
      */
     @Scheduled(cron = "0 0 3 21 * ?")
-    void productCosts() {
-        log.info("开始跑批更新NC生产成本");
+    void startAssessment() {
+        log.info("发起考核确认单");
         workService.startAssessment();
     }
+
+
+    /**
+     * 每月1日凌晨4点开始跑批考核定额档案表
+     */
+    @Scheduled(cron = "0 0 1 21 * ?")
+    void quotaArchive() {
+        log.info("开始跑批考核定额档案表");
+        workService.quotaArchive();
+    }
 }

+ 17 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/WorkService.java

@@ -37,4 +37,21 @@ public interface WorkService {
      * 定时跑批定额档案表
      */
     void quotaArchive();
+
+    /**
+     * 定时跑批定额档案表
+     */
+    void updateProject(String formInstanceId);
+
+
+    /**
+     * 定时自动发起考核确认单
+     */
+    void startQuotaConfirm();
+
+    /**
+     * 考核确认后自动发起考核评审
+     * @param data
+     */
+    void startAssessReview(Map data);
 }

+ 21 - 2
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/SyncAssetsImpl.java

@@ -19,10 +19,13 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.time.chrono.ChronoLocalDate;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 
 
@@ -67,6 +70,8 @@ public class SyncAssetsImpl implements SyncAssetsService {
                     float metValue = UtilMap.getFloat((Map) formMap,"numberField_lu2ejqd4");
                     //月折旧额
                     float depreciation = UtilMap.getFloat((Map) formMap,"numberField_lu2eb47d");
+                    //原值
+                    float yz = UtilMap.getFloat((Map) formMap,"numberField_lty0oyv8");
                     //已计提期数
                     long count = UtilMap.getInt((Map) formMap,"numberField_lutjo2dt");
                     long toMonth = DateUtil.beginOfMonth(new Date()).getTime();
@@ -88,13 +93,27 @@ public class SyncAssetsImpl implements SyncAssetsService {
                                     //折旧截止日
                                     long endTime = Long.parseLong(formMap.get("dateField_lty0oyva").toString());
                                     String endDate = DateUtil.date(endTime).toString("yyyy-MM");
-                                    long parseTime = DateUtil.beginOfMonth(DateUtil.parse(endDate, "yyyy-MM")).getTime();
+//                                    long parseTime = DateUtil.beginOfMonth(DateUtil.parse(endDate, "yyyy-MM")).getTime();
+                                    Instant instant = Instant.ofEpochMilli(endTime);
+                                    ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
+
+                                    // 下个月最后一天
+                                    ZonedDateTime nextMonthLastDay = zonedDateTime
+                                            .plusMonths(1)
+                                            .with(TemporalAdjusters.lastDayOfMonth())
+                                            .toLocalDate()
+                                            .atTime(23, 59, 59, 999000000)
+                                            .atZone(ZoneId.systemDefault());
+
+                                    long parseTime = nextMonthLastDay.toInstant().toEpochMilli();
                                     if (toMonth <= parseTime){
                                         dateBetween = new DateBetween(DateUtil.date(buyTime),DateUtil.date(toMonth));
                                         count = dateBetween.betweenMonth(true) - 1;
+                                        depreciation = depreciation * count;
+                                        updateDepreciation = (yz - depreciation) >0 ? (yz - depreciation) : 0;
                                     }
                                 }
-//                                map.put("numberField_lu2ejqd4",updateDepreciation);
+                                map.put("numberField_lu2ejqd4",updateDepreciation);
                                 map.put("numberField_lutjo2dt",count);
                             }
                         }

+ 332 - 30
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/WorkServiceImpl.java

@@ -41,6 +41,28 @@ public class WorkServiceImpl implements WorkService {
 
     @Autowired
     private DDClient_Personnel ddClientPersonnel;
+
+    //结算账期枚举
+    private static final Map<String, Object> SETTLEMENT_PERIOD = new HashMap<>();
+
+    static {
+        SETTLEMENT_PERIOD.put("月结", 30);
+        SETTLEMENT_PERIOD.put("双月结", 60);
+        SETTLEMENT_PERIOD.put("季结", 90);
+        SETTLEMENT_PERIOD.put("半年结", 180);
+    }
+
+    //回款账期枚举
+    private static final Map<String, Object> PAYMENT_TERM = new HashMap<>();
+
+    static {
+        PAYMENT_TERM.put("即时支付", 0);
+        PAYMENT_TERM.put("10天", 10);
+        PAYMENT_TERM.put("30天", 30);
+        PAYMENT_TERM.put("45天", 45);
+        PAYMENT_TERM.put("60天", 60);
+        PAYMENT_TERM.put("90天", 90);
+    }
     private YDParam.YDParamBuilder _initLYParam() {
         return YDParam.builder()
                 .appType("APP_ERBDTFS82HOVBPL3NFH0")
@@ -519,6 +541,7 @@ public class WorkServiceImpl implements WorkService {
                     String xmdfzr = e.get("employeeField_lw1usgpt_id").toString();
                     JSONArray xmdfzrArray = JSONArray.parseArray(xmdfzr);
                     dataMap.put("employeeField_mfo3dvpt",xmdfzrArray.get(0));
+                    dataMap.put("textField_mgolsje0",xmdfzrArray.get(0));
                 }
 
                 if (ObjectUtil.isNotNull(e.get("employeeField_lrpswhaj_id"))){
@@ -526,6 +549,7 @@ public class WorkServiceImpl implements WorkService {
                     String yyjl = e.get("employeeField_lrpswhaj_id").toString();
                     JSONArray yyjlArray = JSONArray.parseArray(yyjl);
                     dataMap.put("employeeField_mfo3dvq2",yyjlArray.get(0));
+                    dataMap.put("textField_mgolsje1",yyjlArray.get(0));
                 }
                 sonList.add(dataMap);
             }
@@ -547,9 +571,9 @@ public class WorkServiceImpl implements WorkService {
         String formatLastMonth = lastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM"));
         String formatNowMonth = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
         // 获取月份的第一天
-        LocalDateTime firstDay = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        LocalDateTime firstDay = LocalDateTime.now().plusMonths(-2).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
         // 获取月份的最后一天
-        LocalDateTime lastDay =  LocalDateTime.now().withDayOfMonth(LocalDate.now().lengthOfMonth())
+        LocalDateTime lastDay =  LocalDateTime.now().plusMonths(-2).withDayOfMonth(LocalDate.now().plusMonths(-1).lengthOfMonth())
                 .withHour(23).withMinute(59).withSecond(59).withNano(999999999);
         // 转换回时间戳
         long firstDayTimestamp = firstDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
@@ -638,13 +662,13 @@ public class WorkServiceImpl implements WorkService {
                 .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_m0dkzhwp",dateList)))
                 .build());
 
-        Map<String, Map<String, Object>> costCollect = productionCostList.stream().collect(
+        Map<String, Map<String, HashMap<String, Object>>> costCollect = productionCostList.stream().collect(
                 Collectors.groupingBy(
                         //第一层根据项目
-                        map ->  map.get("textField_mbk7mt4q").toString(),
+                        map -> map.get("textField_mbk7mt4q").toString(),
                         Collectors.groupingBy(
                                 //第二层根据科目
-                                map ->  map.get("textField_m0dkzhwv").toString(),
+                                map -> map.get("textField_m0dkzhwv").toString(),
                                 Collectors.collectingAndThen(
                                         Collectors.toList(),
                                         list -> {
@@ -653,7 +677,7 @@ public class WorkServiceImpl implements WorkService {
                                                     .mapToDouble(map -> ((Number) Double.parseDouble(!map.get("numberField_m0dkzhx1_value").toString().isEmpty() ? map.get("numberField_m0dkzhx1_value").toString() : "0.0")).doubleValue())
                                                     .sum();
                                             return new HashMap<String, Object>() {{
-                                                put("numberField_mfenmehs", cost);
+                                                put("cost", cost);
                                             }};
                                         }
                                 )
@@ -758,9 +782,9 @@ public class WorkServiceImpl implements WorkService {
                 ));
 
         // 获取上月份的第一天
-        firstDay = LocalDateTime.now().plusMonths(-1).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        firstDay = LocalDateTime.now().plusMonths(-3).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
         // 获取上月份的最后一天
-        lastDay =  LocalDateTime.now().plusMonths(-1).withDayOfMonth(LocalDate.now().plusMonths(-1).lengthOfMonth())
+        lastDay =  LocalDateTime.now().plusMonths(-3).withDayOfMonth(LocalDate.now().plusMonths(-1).lengthOfMonth())
                 .withHour(23).withMinute(59).withSecond(59).withNano(999999999);
         // 转换回时间戳
         firstDayTimestamp = firstDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
@@ -796,9 +820,9 @@ public class WorkServiceImpl implements WorkService {
                 ));
 
         // 获取上上月份的第一天
-        firstDay = LocalDateTime.now().plusMonths(-2).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        firstDay = LocalDateTime.now().plusMonths(-4).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
         // 获取上上月份的最后一天
-        lastDay =  LocalDateTime.now().plusMonths(-2).withDayOfMonth(LocalDate.now().lengthOfMonth())
+        lastDay =  LocalDateTime.now().plusMonths(-4).withDayOfMonth(LocalDate.now().plusMonths(-4).lengthOfMonth())
                 .withHour(23).withMinute(59).withSecond(59).withNano(999999999);
         firstDayTimestamp = firstDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
         lastDayTimestamp = lastDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
@@ -838,16 +862,22 @@ public class WorkServiceImpl implements WorkService {
             String code = e.get("textField_ltxrn8h1").toString();
             List<Map<String,Object>> objects = new ArrayList<>();
             Map<String, Object> map = UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle",
-                    "APP_TKO2FYGFQYQQMQFUTUU5", "FORM-EA91EECA918848EA9EFFA87107B60BD0SLXX", "receipt",
+                    "APP_ERBDTFS82HOVBPL3NFH0", "FORM-97BA6C6C8C50416A9E5854F2F4B5C3F3R4WC", "receipt",
                     e.get("formInstanceId"), name, code);
             objects.add(map);
-            Map<String, Object> dataMap = UtilMap.map("associationFormField_mfo3dvqa, textField_mfenmegp",
-                    objects, e.get("textField_ltxrn8h1"));
+            Map<String, Object> dataMap = UtilMap.map("associationFormField_mfo3dvqa, textField_mfenmegp, " +
+                            "dateField_mfo3dvpr, radioField_mfo5qdfc, selectField_mfo51ygd, selectField_mfp86vfw, " +
+                            "textField_mfenmegj, textField_mfo6i24e, textField_mgizxcry, numberField_mfo3dvq0, " +
+                            "numberField_mfo3dvpy",
+                    objects, code,LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(),
+                    "项目点负责人","否","否",name,formatNowMonth,name,UtilMap.getDouble(e,"numberField_lrhjdu5l"),
+                    UtilMap.getDouble(e,"numberField_lrpvi1wf"));
             if (ObjectUtil.isNotNull(e.get("employeeField_lw1usgpt_id"))){
                 //项目点负责人
                 String xmdfzr = e.get("employeeField_lw1usgpt_id").toString();
                 JSONArray xmdfzrArray = JSONArray.parseArray(xmdfzr);
                 dataMap.put("employeeField_mfo3dvpt",xmdfzrArray.get(0));
+                dataMap.put("textField_mgoljmhh",xmdfzrArray.get(0));
             }
 
             if (ObjectUtil.isNotNull(e.get("employeeField_lrpswhaj_id"))){
@@ -855,6 +885,7 @@ public class WorkServiceImpl implements WorkService {
                 String yyjl = e.get("employeeField_lrpswhaj_id").toString();
                 JSONArray yyjlArray = JSONArray.parseArray(yyjl);
                 dataMap.put("employeeField_mfo3dvq2",yyjlArray.get(0));
+                dataMap.put("textField_mgolu3w2",yyjlArray.get(0));
             }
             List<Map> sonList = ydService.queryDetails(YDParam.builder().
                     appType("APP_ERBDTFS82HOVBPL3NFH0")
@@ -867,13 +898,13 @@ public class WorkServiceImpl implements WorkService {
             List<Map> sonFilterList = sonList.stream().filter(m -> formatNowMonth.equals(m.get("textField_luh0k82j"))).collect(Collectors.toList());
             sonFilterList.forEach(s->{
                 //人工定额
-                double person = Double.parseDouble(ObjectUtil.isNotNull(s.get("numberField_lrru2tnt_value")) && !s.get("numberField_lrru2tnt_value").toString().isEmpty() ? s.get("numberField_lrru2tnt_value").toString() : "0.0");
+                double person = UtilMap.getDouble(s,"numberField_lrru2tnt_value");
                 //物料定额
-                double cost = Double.parseDouble(ObjectUtil.isNotNull(s.get("numberField_lrru2tnu_value")) && !s.get("numberField_lrru2tnu_value").toString().isEmpty() ? s.get("numberField_lrru2tnu_value").toString() : "0.0");
+                double cost = UtilMap.getDouble(s,"numberField_lrru2tnu_value");
                 //收入定额
-                double income = Double.parseDouble(ObjectUtil.isNotNull(s.get("numberField_lrru2tns_value")) && !s.get("numberField_lrru2tns_value").toString().isEmpty() ? s.get("numberField_lrru2tns_value").toString() : "0.0");
+                double income = UtilMap.getDouble(s,"numberField_lrru2tns_value");
                 //回款金额
-                double back = Double.parseDouble(ObjectUtil.isNotNull(s.get("numberField_lrru2to3_value")) && !s.get("numberField_lrru2to3_value").toString().isEmpty() ? s.get("numberField_lrru2to3_value").toString() : "0.0");
+                double back = UtilMap.getDouble(s,"numberField_lrru2to3_value");
                 //工资定额分项
                 dataMap.put("numberField_mfenmehp",person);
                 //物料定额
@@ -884,10 +915,10 @@ public class WorkServiceImpl implements WorkService {
                 dataMap.put("numberField_mfenmek8",back);
             });
             //项目点档案子表上月
-            List<Map> sonLastMonthList = sonList.stream().filter(m -> formatLastMonth.equals(m.get("tableField_lrru2tnq"))).collect(Collectors.toList());
+            List<Map> sonLastMonthList = sonList.stream().filter(m -> formatLastMonth.equals(m.get("textField_luh0k82j"))).collect(Collectors.toList());
             sonLastMonthList.forEach(s->{
                 //开票金额
-                double open = Double.parseDouble(ObjectUtil.isNotNull(s.get("numberField_lrru2to2_value")) && !s.get("numberField_lrru2to2_value").toString().isEmpty() ? s.get("numberField_lrru2to2_value").toString() : "0.0");
+                double open = UtilMap.getDouble(s,"numberField_lrru2to2_value");
                 //开票金额
                 dataMap.put("numberField_mfenmejr",open);
             });
@@ -899,35 +930,41 @@ public class WorkServiceImpl implements WorkService {
             });
 
             //遍历部门成本
+            dataMap.put("numberField_mfenmei2",0.0);
+            dataMap.put("numberField_mfenmeil",0.0);
+            dataMap.put("numberField_mfenmeio",0.0);
             costCollect.forEach((k0,v0)->{
                 if (k0.equals(name)){
                     v0.forEach((k1,v1)->{
                         if ("生产成本-业务外包费".equals(k1)){
                             //劳务所临时工费用
-                            dataMap.put("numberField_mfenmei2",v1);
+                            dataMap.put("numberField_mfenmei2",v1.get("cost"));
                         }else if ("生产成本-租赁费".equals(k1)){
                             //租赁
-                            dataMap.put("numberField_mfenmeil",v1);
+                            dataMap.put("numberField_mfenmeil",v1.get("cost"));
                         }else if ("生产成本-折旧".equals(k1)) {
                             //折旧
-                            dataMap.put("numberField_mfenmeio", v1);
+                            dataMap.put("numberField_mfenmeio", v1.get("cost"));
                         }
                     });
                 }
             });
             //劳防用品
+            dataMap.put("numberField_mfenmeim",0.0);
             workCloCost.forEach((k,v)->{
                 if (k.equals(name)){
-                    dataMap.put("numberField_mfenmeim",v);
+                    dataMap.put("numberField_mfenmeim",v.get("cost"));
                 }
             });
             //物耗(非工作服)
+            dataMap.put("numberField_mfenmeii",0.0);
             workNoCloCost.forEach((k,v)->{
                 if (k.equals(name)){
                     dataMap.put("numberField_mfenmeii",v.get("cost"));
                 }
             });
             //设备维修
+            dataMap.put("numberField_mfenmeij",0.0);
             repairBillCost.forEach((k,v)->{
                 if (k.equals(code)){
                     dataMap.put("numberField_mfenmeij",v.get("cost"));
@@ -936,22 +973,33 @@ public class WorkServiceImpl implements WorkService {
 
             double bzwhcb = Double.parseDouble(ObjectUtil.isNotNull(e.get("numberField_lrn2oy4q_value")) && !e.get("numberField_lrn2oy4q_value").toString().isEmpty() ? e.get("numberField_lrn2oy4q_value").toString() : "0.0");
             if (bzwhcb == 0){
-                dataMap.put("numberField_mfenmekv",3);
-                dataMap.put("numberField_mfenmel9",2);
+                dataMap.put("numberField_mfenmekv",3);//7-入库
+                dataMap.put("numberField_mfenmel3",3);//7-出库
+                dataMap.put("numberField_mfenmel9",2);//7-自盘
+            }else {
+                dataMap.put("numberField_mfenmekv",0);//7-入库
+                dataMap.put("numberField_mfenmel3",0);//7-出库
+                dataMap.put("numberField_mfenmel9",0);//7-自盘
             }
 
             //上月小业主开票
             lastOpens.forEach((k,v)->{
-                if (k.equals(name)){
+                dataMap.put("numberField_mfenmelh",0.0);
+                if (k.equals(code)){
                     dataMap.put("numberField_mfenmelh",v.get("open"));
                 }
             });
             //上上月小业主开票
             lastLastOpens.forEach((k,v)->{
-                if (k.equals(name)){
+                dataMap.put("numberField_mfenmelg",0.0);
+                if (k.equals(code)){
                     dataMap.put("numberField_mfenmelg",v.get("open"));
                 }
             });
+            //结算帐期
+            dataMap.put("textField_mfenmejo",SETTLEMENT_PERIOD.get(e.get("selectField_mejp7y3y").toString()));
+            //回款账期
+            dataMap.put("textField_mfenmejq",PAYMENT_TERM.get(e.get("selectField_lt590fk8").toString()));
 
 
             //公式字段计算
@@ -1007,10 +1055,10 @@ public class WorkServiceImpl implements WorkService {
             dataMap.put("numberField_mfenmejs", UtilMap.getDouble(dataMap,"numberField_mfenmejr")
                     -  UtilMap.getDouble(dataMap,"numberField_mfenmejp"));
             //开票状态
-            if (ObjectUtil.isNotNull(dataMap.get("numberField_mfenmejr")) && Double.parseDouble(dataMap.get("numberField_mfenmejr").toString()) > 0){
-                dataMap.put("radioField_mfenmek0","已开票");
+            if (UtilMap.getDouble(dataMap,"numberField_mfenmejr") > 0){
+                dataMap.put("textField_mgohy54u","已开票");
             }else {
-                dataMap.put("radioField_mfenmek0","未开票");
+                dataMap.put("textField_mgohy54u","未开票");
             }
             //增长金额
             dataMap.put("numberField_mfenmeli", UtilMap.getDouble(dataMap,"numberField_mfenmelh")
@@ -1022,6 +1070,7 @@ public class WorkServiceImpl implements WorkService {
                 dataMap.put("numberField_mfenmelj", UtilMap.getDouble(dataMap,"numberField_mfenmeli")
                         / UtilMap.getDouble(dataMap,"numberField_mfenmelg"));
             }
+            UtilMap.map("numberField_mfenmehq, numberField_mfenmehr, numberField_mfenmehy, numberField_mfenmei0",0,0,0,0);
             ydClient.operateData(YDParam.builder()
                     .appType("APP_TKO2FYGFQYQQMQFUTUU5")
                     .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
@@ -1032,4 +1081,257 @@ public class WorkServiceImpl implements WorkService {
                     .build(), YDConf.FORM_OPERATION.upsert);
         });
     }
+
+    @Override
+    public void updateProject(String formInstanceId) {
+        Map formData = ydClient.queryData(YDParam.builder()
+                        .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                        .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                        .formInstanceId(formInstanceId)
+                        .useLatestVersion(true)
+                        .build(),
+                YDConf.FORM_QUERY.retrieve_id).getFormData();
+        List<Map> sonList = ydService.queryDetails(YDParam.builder().
+                appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                .formInstanceId(formInstanceId)
+                .formUuid("FORM-EA91EECA918848EA9EFFA87107B60BD0SLXX")
+                .tableFieldId("tableField_mfo51ygb")
+                .build());
+
+        String[] dateList = getMonthStartEndTimestamps(formData.get("dateField_mfo3dvpr").toString());
+        //定额档案表
+        List<Map> quotaList = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                .formUuid("FORM-C17DA3AEA3064A3D9CA118BBB3116BF6NLUB")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_mfo3dvpr",dateList)))
+                .build());
+
+        sonList.forEach(s->{
+            String code = s.get("textField_mfenmegp").toString();
+            String xmdemp = s.get("employeeField_mfo3dvpt").toString();
+            JSONArray xmdArray = JSONArray.parseArray(xmdemp);
+
+            String qyemp = s.get("employeeField_mfo3dvq2").toString();
+            JSONArray qyArray = JSONArray.parseArray(qyemp);
+
+            quotaList.forEach(q->{
+                if (code.equals(q.get("textField_mfenmegp"))){
+                    ydClient.operateData(YDParam.builder()
+                            .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                            .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                            .formInstanceId(q.get("formInstanceId").toString())
+                            .useLatestVersion(true)
+                            //项目是否参与考核  项目负责人是否参与考核  项目负责人userid  区域负责人userid
+                            .updateFormDataJson(JSON.toJSONString(UtilMap.map("selectField_mfo51ygd, selectField_mfp86vfw, " +
+                                            "textField_mgoljmhh, textField_mgolu3w2, employeeField_mfo3dvpt, employeeField_mfo3dvq2",
+                                    s.get("selectField_mfo51ygd"),s.get("selectField_mfp86vfw"),xmdArray.get(0),qyArray.get(0),xmdArray.get(0),qyArray.get(0))))
+                            .build(), YDConf.FORM_OPERATION.update);
+                }
+            });
+        });
+    }
+
+    @Override
+    public void startQuotaConfirm() {
+        LocalDate currentDate = LocalDate.now();
+        String formatNowMonth = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+
+        // 获取月份的第一天
+        LocalDateTime firstDay = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        // 获取月份的最后一天
+        LocalDateTime lastDay =  LocalDateTime.now().withDayOfMonth(LocalDate.now().plusMonths(-1).lengthOfMonth())
+                .withHour(23).withMinute(59).withSecond(59).withNano(999999999);
+        // 转换回时间戳
+        long firstDayTimestamp = firstDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        long lastDayTimestamp = lastDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+
+        List<String> dateList = new ArrayList<>();
+        dateList.add(String.valueOf(firstDayTimestamp));
+        dateList.add(String.valueOf(lastDayTimestamp));
+        //定额档案表数据
+        List<Map> quatoList = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                .formUuid("FORM-C17DA3AEA3064A3D9CA118BBB3116BF6NLUB")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_mfo3dvpr, selectField_mfo51ygd", dateList,"是")))
+                .build());
+
+        List<Map> list1 = new ArrayList<>();
+        List<Map> list2 = new ArrayList<>();
+        List<Map> list3 = new ArrayList<>();
+        List<Map> list4 = new ArrayList<>();
+        List<Map> list5 = new ArrayList<>();
+        List<Map> list6 = new ArrayList<>();
+        quatoList.forEach(q->{
+
+            JSONArray jsonArray = JSONArray.parseArray(JSON.parse(q.get("associationFormField_mfo3dvqa_id").toString()).toString());
+            Map<String, Object> map1 = UtilMap.map("associationFormField_mfo3dvqa, textField_mfenmegp, employeeField_mfo3dvpt, employeeField_mfo3dvq2, " +
+                            "numberField_mfo3dvpy, numberField_mfo3dvq0, numberField_mfenmehp, numberField_mfenmeht, numberField_mfenmehx, " +
+                            "numberField_mfenmei2, numberField_mfenmei5, numberField_mfenmehq, numberField_mfenmehu, numberField_mfenmehy, " +
+                            "numberField_mfenmei1, numberField_mfenmei6, numberField_mfenmehr, numberField_mfenmehv, numberField_mfenmehz, " +
+                            "numberField_mfenmei3, numberField_mfenmei7, numberField_mfenmehs, numberField_mfenmehw, numberField_mfenmei0, " +
+                            "numberField_mfenmei4, numberField_mglm20mo, numberField_mglm20mp, numberField_mfenmelq",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"),
+                    q.get("numberField_mfo3dvpy"), q.get("numberField_mfo3dvq0"), q.get("numberField_mfenmehp"), q.get("numberField_mfenmeht"), q.get("numberField_mfenmehx"),
+                    q.get("numberField_mfenmei2"), q.get("numberField_mfenmei5"), q.get("numberField_mfenmehq"), q.get("numberField_mfenmehu"), q.get("numberField_mfenmehy"),
+                    q.get("numberField_mfenmei1"), q.get("numberField_mfenmei6"), q.get("numberField_mfenmehr"), q.get("numberField_mfenmehv"), q.get("numberField_mfenmehz"),
+                    q.get("numberField_mfenmei3"), q.get("numberField_mfenmei7"), q.get("numberField_mfenmehs"), q.get("numberField_mfenmehw"), q.get("numberField_mfenmei0"),
+                    q.get("numberField_mfenmei4"), q.get("numberField_mglm20mo"), q.get("numberField_mglm20mp"), q.get("numberField_mfenmelq"));
+            list1.add(map1);
+
+            Map<String, Object> map2 = UtilMap.map("associationFormField_mfp5hush, textField_mfp5husg, employeeField_mfp5husf, employeeField_mfp5huse, " +
+                            "numberField_mfenmeih, numberField_mfenmeii, numberField_mfenmeik, numberField_mfenmeij, numberField_mfenmeil, " +
+                            "numberField_mfo3dvq6, numberField_mfenmeim, numberField_mfo3dvq8, numberField_mfenmeio, numberField_mfenmeip, " +
+                            "numberField_mfenmeir, numberField_mfenmeis, numberField_mfenmeit, numberField_mfenmelr, textareaField_mfo3dvq9",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"),
+                    q.get("numberField_mfenmeih"), q.get("numberField_mfenmeii"), q.get("numberField_mfenmeik"), q.get("numberField_mfenmeij"), q.get("numberField_mfenmeil"),
+                    q.get("numberField_mfo3dvq6"), q.get("numberField_mfenmeim"), q.get("numberField_mfo3dvq8"), q.get("numberField_mfenmeio"), q.get("numberField_mfenmeip"),
+                    q.get("numberField_mfenmeir"), q.get("numberField_mfenmeis"), q.get("numberField_mfenmeit"), q.get("numberField_mfenmelr"), q.get("textareaField_mfo3dvq9"));
+
+            list2.add(map2);
+
+            Map<String, Object> map3 = UtilMap.map("associationFormField_mfp5husq, textField_mfp5husp, employeeField_mfp5huso, employeeField_mfp5husn, " +
+                            "textField_mfenmejo, textField_mfenmejq, numberField_mfenmejp, numberField_mfenmejr, numberField_mfenmejs, " +
+                            "numberField_mfenmels, textField_mgm3bkiz, numberField_mfenmelt, numberField_mfenmek8, numberField_mfenmek9",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"),
+                    q.get("textField_mfenmejo"), q.get("textField_mfenmejq"), q.get("numberField_mfenmejp"), q.get("numberField_mfenmejr"), q.get("numberField_mfenmejs"),
+                    q.get("numberField_mfenmels"), q.get("textField_mgm3bkiz"), q.get("numberField_mfenmelt"), q.get("numberField_mfenmek8"), q.get("numberField_mfenmek9"));
+
+            list3.add(map3);
+
+            Map<String, Object> map4 = UtilMap.map("associationFormField_mfp5hut1, textField_mfp5hut0, employeeField_mfp5husz, employeeField_mfp5husy, " +
+                            "numberField_mfenmej6, numberField_mfenmekv, numberField_mfenmel1, numberField_mfenmel3, numberField_mfenmel9, " +
+                            "numberField_mfenmel2, numberField_mfenmela, numberField_mfenmelb, numberField_mfenmelc, numberField_mfenmeld, " +
+                            "numberField_mfenmele, numberField_mfenmelf, numberField_mfo3dvry, numberField_mfo3dvs0, numberField_mfo3dvs2, " +
+                            "numberField_mfo3dvs5, numberField_mfenmell",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"),
+                    q.get("numberField_mfenmej6"), q.get("numberField_mfenmekv"), q.get("numberField_mfenmel1"), q.get("numberField_mfenmel3"), q.get("numberField_mfenmel9"),
+                    q.get("numberField_mfenmel2"), q.get("numberField_mfenmela"), q.get("numberField_mfenmelb"), q.get("numberField_mfenmelc"), q.get("numberField_mfenmeld"),
+                    q.get("numberField_mfenmele"), q.get("numberField_mfenmelf"), q.get("numberField_mfo3dvry"), q.get("numberField_mfo3dvs0"), q.get("numberField_mfo3dvs2"),
+                    q.get("numberField_mfo3dvs5"), q.get("numberField_mfenmell"));
+            list4.add(map4);
+
+            Map<String, Object> map5 = UtilMap.map("associationFormField_mgokjmx5, textField_mgokjmx6, employeeField_mgokjmx7, employeeField_mgokjmx8",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"));
+            list5.add(map5);
+
+            Map<String, Object> map6 = UtilMap.map("associationFormField_mgokjmyd, textField_mgokjmye, employeeField_mgokjmyf, employeeField_mgokjmyg",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"));
+            list6.add(map6);
+        });
+
+        /*发起流程*/
+        ydClient.operateData(YDParam.builder().userId("026150181237-1254068060")
+                .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                .formUuid("FORM-D07E4A40ED364508B4B1A7DDADF68DE5ZWMJ")
+                .useLatestVersion(true)
+                .formDataJson(JSON.toJSONString(UtilMap.map("dateField_mfo3dvpr, tableField_mfov2zgj, " +
+                                "tableField_mfp5hus9, tableField_mfp5husi, tableField_mfp5hust, tableField_mgokjmxq, " +
+                                "tableField_mgokjmyi, textField_mglzsfn2",
+                        firstDayTimestamp,list1,list2,list3,list4,list5,list6,formatNowMonth)))
+                .build(), YDConf.FORM_OPERATION.start);
+    }
+
+    @Override
+    public void startAssessReview(Map data) {
+        String formInstanceId = data.get("formInstanceId").toString();
+        Map formData = ydClient.queryData(YDParam.builder()
+                        .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                        .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                        .formInstanceId(formInstanceId)
+                        .useLatestVersion(true)
+                        .build(),
+                YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        String formatDate = formData.get("textField_mglzsfn2").toString();
+        //定额档案表数据
+        List<Map> quatoList = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                .formUuid("FORM-C17DA3AEA3064A3D9CA118BBB3116BF6NLUB")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mfo6i24e, selectField_mfo51ygd, radioField_mfo5qdfc", formatDate,"是","项目点负责人")))
+                .build());
+
+        List<Map> list1 = new ArrayList<>();
+        List<Map> list2 = new ArrayList<>();
+        quatoList.forEach(q->{
+            List<Map<String,Object>> objects = new ArrayList<>();
+            Map<String, Object> map = UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle",
+                    "APP_TKO2FYGFQYQQMQFUTUU5", "FORM-C17DA3AEA3064A3D9CA118BBB3116BF6NLUB", "receipt",
+                    q.get("formInstanceId"), q.get("serialNumberField_mfo3dvpv"), "");
+            objects.add(map);
+            JSONArray jsonArray = JSONArray.parseArray(JSON.parse(q.get("associationFormField_mfo3dvqa_id").toString()).toString());
+            Map<String, Object> map1 = UtilMap.map("associationFormField_mfo3dvqa, textField_mgojzrla, employeeField_mfo3dvpt, employeeField_mfo3dvq2, " +
+                            "numberField_mfo3dvqi, numberField_mfenmelq, numberField_mfenmelr, numberField_mfenmels, numberField_mfo5c8jj, " +
+                            "numberField_mfenmelu, numberField_mfenmej6, numberField_mfenmekv, numberField_mfo5qddy, associationFormField_mfo5c8je, " +
+                            "numberField_mfo5qde1, numberField_mfo5qdf8, numberField_mfo5qdfb, numberField_mfo3dvt9",
+                    jsonArray, q.get("textField_mfenmegp"), q.get("textField_mgoljmhh"), q.get("textField_mgolu3w2"),
+                    q.get("numberField_mfo3dvqi"), q.get("numberField_mfenmelq"), q.get("numberField_mfenmelr"), q.get("numberField_mfenmels"), q.get("numberField_mfenmelt"),
+                    q.get("numberField_mfenmelu"), q.get("numberField_mfenmej6"),
+                    //7
+                    UtilMap.getDouble(q,"numberField_mfenmekv")
+                            +UtilMap.getDouble(q,"numberField_mfenmel1")
+                            +UtilMap.getDouble(q,"numberField_mfenmel3")
+                            +UtilMap.getDouble(q,"numberField_mfenmel9")
+                            +UtilMap.getDouble(q,"numberField_mfenmel2"),
+                    //8+9+10+11
+                    UtilMap.getDouble(q,"numberField_mfenmela")
+                            +UtilMap.getDouble(q,"numberField_mfenmelb")
+                            +UtilMap.getDouble(q,"numberField_mfenmelc")
+                            +UtilMap.getDouble(q,"numberField_mfenmeld"), objects,
+                    //12+13
+                    UtilMap.getDouble(q,"numberField_mfenmele")
+                            +UtilMap.getDouble(q,"numberField_mfenmelf")
+                    //14
+                    , q.get("numberField_mfenmell"), q.get("numberField_mfo3dvqi"), q.get("numberField_mfo3dvt9"));
+
+            list1.add(map1);
+        });
+        /*发起流程*/
+        ydClient.operateData(YDParam.builder().userId("026150181237-1254068060")
+                .appType("APP_TKO2FYGFQYQQMQFUTUU5")
+                .systemToken("2IF66SC1XCSY45IUBXA0X9WYE09G3W8GGNEFM7T4")
+                .formUuid("FORM-7F298A42E1BE4E4CA392B8BDE3AFA789TWDB")
+                .formDataJson(JSON.toJSONString(UtilMap.map("dateField_mfo3dvpr, tableField_mfo51ygb, radioField_mfo5qdfc, textField_mfo6i24e",
+                        formData.get("dateField_mfo3dvpr"),list1,"项目点负责人",formatDate)))
+                .build(), YDConf.FORM_OPERATION.start);
+    }
+
+    public static String[] getMonthStartEndTimestamps(String timestampStr) {
+        try {
+            long timestamp = Long.parseLong(timestampStr);
+
+            // 如果时间戳是秒级的,转换为毫秒
+            if (timestampStr.length() <= 10) {
+                timestamp *= 1000;
+            }
+
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(timestamp);
+
+            // 当月第一天
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+            long firstDay = calendar.getTimeInMillis();
+
+            // 当月最后一天
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+            calendar.set(Calendar.HOUR_OF_DAY, 23);
+            calendar.set(Calendar.MINUTE, 59);
+            calendar.set(Calendar.SECOND, 59);
+            calendar.set(Calendar.MILLISECOND, 999);
+            long lastDay = calendar.getTimeInMillis();
+
+            return new String[]{String.valueOf(firstDay), String.valueOf(lastDay)};
+
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException("无效的时间戳格式: " + timestampStr);
+        }
+    }
 }