pruple_boy 9 hónapja%!(EXTRA string=óta)
szülő
commit
47db041124

+ 32 - 28
mjava-aiwei/src/main/java/com/malk/aiwei/controller/TBxYDController.java

@@ -5,9 +5,8 @@ package com.malk.aiwei.controller;
  */
  */
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.malk.aiwei.server.YDSearch;
 import com.malk.aiwei.service.AWClint;
 import com.malk.aiwei.service.AWClint;
+import com.malk.aiwei.service.AWYDClient;
 import com.malk.delegate.McDelegate;
 import com.malk.delegate.McDelegate;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.aliwork.YDParam;
@@ -27,7 +26,10 @@ import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 
 @Slf4j
 @Slf4j
 @RestController
 @RestController
@@ -261,17 +263,6 @@ public class TBxYDController {
 
 
     /// todo workspace/sync //手动触发, 知识库权限矩阵同步
     /// todo workspace/sync //手动触发, 知识库权限矩阵同步
 
 
-    /**
-     * 提供verifier数据读取服务
-     */
-    @GetMapping("verifier/sync")
-    McR syncVerifier(String projectCode) {
-
-        List<Map> dataList = awClint.syncVerifier(projectCode);
-        log.info("syncVerifier, {}, {}", projectCode, dataList.size());
-        return McR.success(dataList);
-    }
-
     /**
     /**
      * 知识库版本管理
      * 知识库版本管理
      */
      */
@@ -291,11 +282,8 @@ public class TBxYDController {
      */
      */
     @GetMapping("product/list")
     @GetMapping("product/list")
     Map getProductList(@RequestParam Map param) {
     Map getProductList(@RequestParam Map param) {
-        System.out.println(JSONObject.toJSONString(param));
-//        String projectId="65f2855b5a2065ad7ad7d084";
         String projectId = UtilMap.getString(param, "projectId");
         String projectId = UtilMap.getString(param, "projectId");
         String q = UtilMap.getString(param, "q");
         String q = UtilMap.getString(param, "q");
-        String objectId = UtilMap.getString(param, "objectId");
         List result = awClint.getProductList(projectId, q);
         List result = awClint.getProductList(projectId, q);
         return UtilMap.map("options", result);
         return UtilMap.map("options", result);
     }
     }
@@ -305,8 +293,6 @@ public class TBxYDController {
      */
      */
     @GetMapping("product/version")
     @GetMapping("product/version")
     Map getProductVersionList(@RequestParam Map param) {
     Map getProductVersionList(@RequestParam Map param) {
-        System.out.println(JSONObject.toJSONString(param));
-//        String projectId="65f2855b5a2065ad7ad7d084";
         String projectId = UtilMap.getString(param, "projectId");
         String projectId = UtilMap.getString(param, "projectId");
         String q = UtilMap.getString(param, "q");
         String q = UtilMap.getString(param, "q");
         String objectId = UtilMap.getString(param, "objectId");
         String objectId = UtilMap.getString(param, "objectId");
@@ -314,14 +300,32 @@ public class TBxYDController {
         return UtilMap.map("options", result);
         return UtilMap.map("options", result);
     }
     }
 
 
+    /************************************* 宜搭结构化 *************************************/
+
+
+    @Autowired
+    private AWYDClient awydClient;
+
+    /**
+     * 提供verifier数据读取服务
+     */
+    @GetMapping("verifier/sync")
+    McR syncVerifier(String projectCode) {
+
+        List<Map> dataList = awydClient.syncVerifier(projectCode);
+        log.info("syncVerifier, {}, {}", projectCode, dataList.size());
+        return McR.success(dataList);
+    }
+
+
     /**
     /**
      * 导出
      * 导出
      */
      */
     @PostMapping("export")
     @PostMapping("export")
     void export(@RequestBody Map data, HttpServletResponse response) {
     void export(@RequestBody Map data, HttpServletResponse response) {
-        List<Map> dataList = UtilMap.getList(data,"dataList");
-        String fileName = UtilMap.getString(data,"fileName");
-        String tempFileName = UtilMap.getString(data,"tempFileName");
+        List<Map> dataList = UtilMap.getList(data, "dataList");
+        String fileName = UtilMap.getString(data, "fileName");
+        String tempFileName = UtilMap.getString(data, "tempFileName");
         UtilExcel.exportMapAndListByTemplate(response, dataList, Map.class, fileName, tempFileName);
         UtilExcel.exportMapAndListByTemplate(response, dataList, Map.class, fileName, tempFileName);
     }
     }
 
 
@@ -330,12 +334,12 @@ public class TBxYDController {
      */
      */
     @PostMapping("beforeImportData")
     @PostMapping("beforeImportData")
     McR beforeImportData(@RequestBody Map data, HttpServletResponse response) {
     McR beforeImportData(@RequestBody Map data, HttpServletResponse response) {
-        Map result=awClint.checkImportData(data);
-        Boolean flag=UtilMap.getBoolean(result,"flag");
-        List<Map> resultData = UtilMap.getList(result,"data");
-        if(flag){
+        Map result = awydClient.checkImportData(data);
+        Boolean flag = UtilMap.getBoolean(result, "flag");
+        List<Map> resultData = UtilMap.getList(result, "data");
+        if (flag) {
             return McR.success(resultData);
             return McR.success(resultData);
-        }else{
+        } else {
             String fileName = "异常";
             String fileName = "异常";
             String tempFileName = "templates_xqwh_result.xlsx";
             String tempFileName = "templates_xqwh_result.xlsx";
             UtilExcel.exportMapAndListByTemplate(response, resultData, Map.class, fileName, tempFileName);
             UtilExcel.exportMapAndListByTemplate(response, resultData, Map.class, fileName, tempFileName);
@@ -379,7 +383,7 @@ public class TBxYDController {
     @Autowired
     @Autowired
     private McDelegate mcDelegate;
     private McDelegate mcDelegate;
 
 
-    @PostMapping("test")
+    @GetMapping("test")
     McR test(HttpServletRequest request) {
     McR test(HttpServletRequest request) {
 
 
         Map<String, ?> data = UtilServlet.getParamMap(request);
         Map<String, ?> data = UtilServlet.getParamMap(request);

+ 16 - 8
mjava-aiwei/src/main/java/com/malk/aiwei/service/AWClint.java

@@ -100,19 +100,27 @@ public interface AWClint {
     void approveVersion(String taskId, String pCode);
     void approveVersion(String taskId, String pCode);
 
 
     /**
     /**
-     * 提供verifier数据读取服务
+     * 获取主数据中产品列表
      */
      */
-    List<Map> syncVerifier(String projectCode);
+    List<Map> getProductList(String projectId, String q);
 
 
-    void test();
+    /**
+     * 获取主数据中产品版本
+     */
+    List<Map> getProductList(String projectId, String q, String taskId);
 
 
-    void tmp();
+    /**
+     * 选择产品\版本后, 回调更新对应原文本字段, 兼容之前字段逻辑
+     */
+    void custFieldUpdate(JSONObject data);
 
 
-    List<Map> getProductList(String projectId,String q);
+    /**
+     * 检查项导出, 全部检查项左关联已提交数据
+     */
+    void exportCheckList(String pCode, String proType);
 
 
-    List<Map> getProductList(String projectId,String q,String taskId);
 
 
-    void custFieldUpdate(JSONObject data);
+    void test();
 
 
-    Map checkImportData(Map data);
+    void tmp();
 }
 }

+ 16 - 0
mjava-aiwei/src/main/java/com/malk/aiwei/service/AWYDClient.java

@@ -0,0 +1,16 @@
+package com.malk.aiwei.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface AWYDClient {
+
+    /**
+     * 提供verifier数据读取服务
+     */
+    List<Map> syncVerifier(String projectCode);
+
+    /************************************* 0906 产品需求导入逻辑变革, 弃用保留 *************************************/
+
+    Map checkImportData(Map data);
+}

+ 85 - 249
mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWImplClient.java

@@ -27,11 +27,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Service
 @Service
@@ -1723,39 +1719,29 @@ public class AWImplClient implements AWClint {
         }
         }
     }
     }
 
 
-
     /**
     /**
-     * 提供verifier数据读取服务
+     * 获取主数据中产品列表
      */
      */
-    @Override
-    public List<Map> syncVerifier(String projectCode) {
-        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
-                .formUuid("FORM-23B67983E91C4ED3B063F9B629D6E964SGHH")
-                .searchCondition(JSON.toJSONString(UtilMap.map("textField_lt6xd8lm", projectCode)))
-                .build());
-
-        return dataList.stream().map(item -> {
-            return item;
-        }).collect(Collectors.toList());
-    }
-
     @Override
     @Override
     public List<Map> getProductList(String projectId, String q) {
     public List<Map> getProductList(String projectId, String q) {
-        // 获取主数据中产品列表
         return getProductData(projectId, q, "textField_lhsxurnt", null);
         return getProductData(projectId, q, "textField_lhsxurnt", null);
-
     }
     }
 
 
+    /**
+     * 获取主数据中产品版本
+     */
     @Override
     @Override
     public List<Map> getProductList(String projectId, String q, String taskId) {
     public List<Map> getProductList(String projectId, String q, String taskId) {
         Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_PRODUCT);
         Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_PRODUCT);
 //        Map rTask = UtilMap.getMap(taskData, "task");
 //        Map rTask = UtilMap.getMap(taskData, "task");
         String tCode = UtilMap.getString(taskData, AWServer.TASK_PRODUCT);
         String tCode = UtilMap.getString(taskData, AWServer.TASK_PRODUCT);
         McException.assertAccessException(StringUtils.isBlank(tCode), "请先选择产品型号!");
         McException.assertAccessException(StringUtils.isBlank(tCode), "请先选择产品型号!");
-        // 获取主数据中产品版本
         return getProductData(projectId, q, "textField_lo2ludkv", tCode);
         return getProductData(projectId, q, "textField_lo2ludkv", tCode);
     }
     }
 
 
+    /**
+     * 选择产品\版本后, 回调更新对应原文本字段, 兼容之前字段逻辑
+     */
     @Override
     @Override
     public void custFieldUpdate(JSONObject data) {
     public void custFieldUpdate(JSONObject data) {
         List<Map> list = tbClient.queryTaskDetail(data.getString("taskId"), "", "");
         List<Map> list = tbClient.queryTaskDetail(data.getString("taskId"), "", "");
@@ -1783,233 +1769,7 @@ public class AWImplClient implements AWClint {
         }
         }
     }
     }
 
 
-    @Override
-    public Map checkImportData(Map data) {
-        List<Map> dataList=UtilMap.getList(data,"dataList");
-        String charter = UtilMap.getString(data,"charter");
-        // 根据charter查询需求库
-        List<Map> list=ydService.queryFormData_all(YDParam.builder()
-                .appType("APP_YQY0OH7953OKBTM57PLL")
-                .systemToken("PGC66MB1H2RLXMFQ7XKW4BC3BDFJ2UDM909XL18")
-                .formUuid("FORM-7A52930D0E834522AD65A4CFE2C0818F1KQO")
-                .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_lth2h04b",charter))).build());
-        Map<String,Map> charterMap=new HashMap();
-        Map<String,String> instIdList=new HashMap<>();
-        for (int j = 0; j < list.size(); j++) {
-            Map item=list.get(j);
-            instIdList.put(UtilMap.getString(item,"textField_lt2d2x79"),UtilMap.getString(item,"instanceId"));
-            String no = getCode(UtilMap.getString(item,"textField_lt2d2x79"));
-            charterMap.put(no,item);
-            list.get(j).put("id",no);
-        }
-        Boolean flag=true;
-        Map noList=new HashMap();
-        // 数据校验
-        for (int i = 0; i < dataList.size(); i++) {
-            String errmsg="";
-            Map item=dataList.get(i);
-            String category=UtilMap.getString(item,"selectField_lronu2g3");
-            if(StringUtils.isBlank(category)){
-                errmsg=errmsg+"需求大类不能为空;";
-            }else{
-                category = category.split("(")[1].replace(")", "");
-                String no = noCP(UtilMap.getString(item,"textField_lt2d2x79"), category);
-                String fno = noCP(UtilMap.getString(item,"textField_m0afm8pd"), category);
-                if (!isValidVersion(no)) {
-                    errmsg = errmsg + "需求编号格式错误;";
-                }
-                if (noList.containsKey(category + no)) {
-                    errmsg = errmsg + "需求编号重复;";
-                }
-                noList.put(category + no,category + no);
-                int cj = getSize(no);
-                if (cj == 1) {
-                    dataList.get(i).put("textField_m0afm8pd","");
-                } else {
-                    if (!isValidVersion(fno)) {
-                        errmsg = errmsg + "父需求编号格式错误;";
-                    }
-                    if (cj - 1 != getSize(fno)) {
-                        errmsg = errmsg + "父需求编号层级错误;";
-                    }
-                    if (StringUtils.isNotBlank(fno) && !noList.containsKey(category+fno)) {
-                        // 导入数据前父需求编号不存在
-                        if(!charterMap.containsKey(getCode(UtilMap.getString(item,"textField_m0afm8pd")))){
-                            errmsg = errmsg + "父需求编号数据不存在;";
-                        }
-                    }
-                }
-                if (fno == no) {
-                    errmsg = errmsg + "需求编号于父需求编号不能相同;";
-                }
-                dataList.get(i).put("selectField_lr4y2xcj",cj + "级");
-                if(String.valueOf(item.get("multiSelectField_lw678e43")).length()>0){
-                    List multi=UtilMap.getList(item,"multiSelectField_lw678e43");
-                    dataList.get(i).put("multiSelectField_lw678e43_str",multi==null||multi.size()<1?"":String.join(",",multi));
-                }
-            }
-            if(errmsg!=""){
-                dataList.get(i).put("result",errmsg);
-                flag=false;
-            }
-        }
-        if(flag){
-            for (int i = 0; i < dataList.size(); i++) {
-                Map item=dataList.get(i);
-                String no=UtilMap.getString(item,"textField_lt2d2x79");
-                String codeNo=getCode(no);
-                if(charterMap.containsKey(codeNo)){
-                    dataList.get(i).put("associationFormField_lvy7yjq8",getAss(no,instIdList.get(no)));
-                    dataList.get(i).put("textField_lyqprdyf",codeNo); // 序号
-                }else{
-                    // 新增
-                    String category=UtilMap.getString(item,"selectField_lronu2g3");
-                    String categoryNew = category.split("(")[1].replace(")", "");
-                    no = noCP(UtilMap.getString(item,"textField_lt2d2x79"), categoryNew);
-                    String fno = "";
-                    int level = getSize(no);
-                    dataList.get(i).put("selectField_lr4y2xcj",level + "级");
-                    // 根据层级查询序号
-                    String noNew="";
-                    // 处理结果
-                    if(level>1){
-                        fno=getCodeNo(categoryNew,noCP(UtilMap.getString(item,"textField_m0afm8pd"), categoryNew));
-                    }
-                    Map reMap=getMaxValue(list,level + "级",category,fno);
-                    if(reMap!=null){
-                        String id=UtilMap.getString(reMap,"id");
-                        noNew=incrementLastPart(id);
-                    }else{
-                        noNew=level==1?categoryNew+"001":fno+".1";
-                    }
-                    codeNo=noNew;
-                    fno=getFnoValue(list,fno);
-                    String nowTime= LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMddHHmmssS"));
-                    dataList.get(i).put("textField_lt2d2x79",noNew+"_"+nowTime);
-                    dataList.get(i).put("textField_m0afm8pd",fno);
-                    dataList.get(i).put("textField_lyqprdyf",codeNo); // 序号
-                    // 拼装数据并新增需求
-                    Map mapNew=dataList.get(i);
-                    mapNew.put("textField_lth2h04b",charter);
-                    mapNew.put("radioField_lroozhse","是");
-                    mapNew.put("textField_m0m3dyk4",fno);
-                    mapNew.put("textField_lyqpt99s",codeNo);
-                    mapNew.put("radioField_m0ow50wn","是"); // 是否草稿
-                    String id=(String) ydClient.operateData(YDParam.builder().appType("APP_YQY0OH7953OKBTM57PLL")
-                            .systemToken("PGC66MB1H2RLXMFQ7XKW4BC3BDFJ2UDM909XL18")
-                            .formUuid("FORM-7A52930D0E834522AD65A4CFE2C0818F1KQO")
-                            .formDataJson(JSONObject.toJSONString(mapNew))
-                            .build(), YDConf.FORM_OPERATION.create);
-                    dataList.get(i).put("associationFormField_lvy7yjq8",getAss(noNew+"_"+nowTime,id));
-                    mapNew.put("instanceId",id);
-                    mapNew.put("id",codeNo);
-                    list.add(mapNew);
-                }
-            }
-        }
-        return UtilMap.map("data, flag", dataList,flag);
-    }
-
-    private static String incrementLastPart(String input) {
-        // 查找最后一个点号的位置
-        int lastDotIndex = input.lastIndexOf('.');
-        // 如果没有点号,则整个字符串都需要加1
-        if (lastDotIndex == -1) {
-            String q=input.substring(0,input.length()-3);
-            String h=input.substring(input.length()-3);
-            return q+String.format("%03d",Integer.parseInt(h)+1);
-        }
-        // 分割字符串
-        String prefix = input.substring(0, lastDotIndex + 1);
-        String lastPart = input.substring(lastDotIndex + 1);
-        // 对最后一部分加1
-        String incrementedLastPart = incrementPart(lastPart);
-        // 返回拼接后的结果
-        return prefix + incrementedLastPart;
-    }
-
-    private static String incrementPart(String part) {
-        // 将字符串转换为整数并加1
-        int number = Integer.parseInt(part);
-        number++;
-        // 将整数转换回字符串
-        return String.valueOf(number);
-    }
-
-    private static String getCodeNo(String category,String no){
-        int dotIndex = no.indexOf('.');
-        String beforeDot = dotIndex == -1 ? no : no.substring(0, dotIndex);
-        String afterDot = dotIndex == -1 ? "" : no.substring(dotIndex);
-        // 对第一部分进行补零
-        String paddedBeforeDot = String.format("%03d", Integer.parseInt(beforeDot));
-        return category+paddedBeforeDot + afterDot;
-    }
-
-    private String getFnoValue(List<Map> list, String fno){
-        if(StringUtils.isBlank(fno)){
-            return "";
-        }
-        List<Map> list1=list.stream()
-                .filter(map -> UtilMap.getString(map, "textField_lt2d2x79").contains(fno+"_")).collect(Collectors.toList()); // 父编号查询编号
-        if(list1!=null&&list1.size()>0){
-            return UtilMap.getString(list1.get(0),"textField_lt2d2x79");
-        }
-        return "";
-    }
-
-    private Map getMaxValue(List<Map> list, String level, String category,String fno){
-        // 查找符合条件的最大 id
-        List<Map> list1=list.stream()
-                .filter(map -> UtilMap.getString(map, "selectField_lr4y2xcj").equals(level)) // 层级
-                .filter(map -> UtilMap.getString(map, "textField_lt2d2x79").contains(fno)) // 父编号查询编号
-                .filter(map -> UtilMap.getString(map, "selectField_lronu2g3").equals(category)).collect(Collectors.toList()); // 前缀
-        Optional<Map> maxMap = list1.stream()
-                .max(Comparator.comparing(map -> UtilMap.getString(map,"id")));
-        return maxMap.orElse(null);
-    }
-
-    private Object getAss(String title,String id){
-        return Arrays.asList(UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle","APP_YQY0OH7953OKBTM57PLL","FORM-7A52930D0E834522AD65A4CFE2C0818F1KQO","receipt",id,title,""));
-    }
-
-    private static int getSize(String value) {
-        return value.split("\\.").length;
-    }
-
-    private Boolean isValidVersion(String version) {
-        Pattern pattern = Pattern.compile("^([0-9]{1,3}(\\.[0-9]{1,3}){0,2})$");
-        Matcher matcher = pattern.matcher(version);
-        return matcher.matches();
-    }
-
-    private String noCP(String value, String category) {
-        if (value.contains(category)) {
-            return getCode(value).replace(category, "").replaceAll("^0+", "");
-        } else {
-            return value;
-        }
-    }
-
-    private String getCode(String pCode) {
-        if (!pCode.contains("_")) {
-            return pCode;
-        }
-        if (isNumeric(pCode.split("_")[0])) {
-            // 时间_序号
-            return pCode.split("_")[1];
-        } else if (isNumeric(pCode.split("_")[1])) {
-            // 序号_时间
-            return pCode.split("_")[0];
-        }
-        return pCode;
-    }
-
-    private boolean isNumeric(String str) {
-        Pattern pattern = Pattern.compile("^\\d+$");
-        Matcher matcher = pattern.matcher(str);
-        return matcher.matches();
-    }
-
+    /// 获取产品主数据
     private List<Map> getProductData(String projectId, String q, String qKey, String tCode) {
     private List<Map> getProductData(String projectId, String q, String qKey, String tCode) {
         // 校验项目号
         // 校验项目号
         YDSearch ytbProjectId = new YDSearch("textField_lqxtykce", projectId, "TB项目编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ);
         YDSearch ytbProjectId = new YDSearch("textField_lqxtykce", projectId, "TB项目编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ);
@@ -2047,11 +1807,87 @@ public class AWImplClient implements AWClint {
     }
     }
 
 
 
 
+    /**
+     * 检查项导出, 全部检查项左关联已提交数据 [ ppExt 已提交数据作为查询条件, 只能筛选已提交数据, 因此提供全量导出 ]
+     */
+    @Override
+    public void exportCheckList(String pCode, String proType) {
+        List<Map> checkedList = _getCheckedList(pCode);
+
+
+        // 查询全部检查项提交数据
+        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                .formUuid(_matchFormUuid("CHECK"))
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("multiSelectField_ltwjre9s, radioField_lrnddfq6", Arrays.asList(proType), "启用")))
+                .dynamicOrder(JSON.toJSONString(UtilMap.map("selectField_lrncf4hk", "+")))
+                .build());
+        // 匹配已提交检查项生数据
+        List<Map> unionList = new ArrayList<>();
+        for (Map check : dataList) {
+            // 任务编号一致, 检查项唯一标识一致
+            List<Map> match = checkedList.stream().filter(item ->
+            {
+                Map unique = (Map) UtilMap.getList(UtilMap.getMap(item, "main"), "associationFormField_lrrnem5r_id").get(0);
+                return item.get("selectField_lqxuswzd").equals(check.get("selectField_lrncf4hk")) && check.get("textField_lrnd3h0r").equals(unique.get("title"));
+            }).collect(Collectors.toList());
+            // 多条重复提交如何处理
+            if (match.size() > 0) {
+                // match 匹配已提交件数据, match.main 为已提交数据主表内容
+                match.forEach(item -> {
+                    check.put("match", item);
+                    unionList.add(check);
+                });
+            } else {
+                unionList.add(check);
+            }
+        }
+        log.info("检查项数据: {}", unionList.size());
+    }
+
+
+    /// 查询项目已提交全部检查项数据
+    List<Map> _getCheckedList(String pCode) {
+        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                .formUuid(_matchFormUuid("RECORD"))
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lqxuswze", pCode)))
+                .build());
+        dataList = dataList.stream().filter(item -> pCode.equals(item.get("selectField_lqxuswze"))).collect(Collectors.toList());
+
+        List<Map> checkedList = new ArrayList<>();
+        for (Map record : dataList) {
+            // 检查项清单[明细默认只返回前50]
+            List<Map> details = UtilMap.getList(record, "tableField_lqxxgj4s");
+            if (details.size() == YDConf.PAGE_SIZE_DETAILS) {
+                details = ydService.queryDetails(YDParam.builder()
+                        .formUuid(_matchFormUuid("RECORD"))
+                        .formInstanceId(UtilMap.getString(record, "instanceId"))
+                        .tableFieldId("tableField_lqxxgj4s")
+                        .build());
+                // 过滤空数据, 无检查项目关联数据
+                details = details.stream().filter(item -> ObjectUtil.isNotNull(item) && StringUtils.isNotBlank(UtilMap.getString(item, "associationFormField_lrrnem5r_id")))
+                        .map(item -> {
+                            // 合并主笔数据
+                            item.put("main", record);
+                            item.put("associationFormField_lrrnem5r", JSON.parse(String.valueOf(JSON.parse(UtilMap.getString(item, "associationFormField_lrrnem5r_id")))));
+                            return item;
+                        }).collect(Collectors.toList());
+            }
+            checkedList.addAll(details);
+            log.info("检查项清单, {}", details.size());
+        }
+        return checkedList;
+    }
+
+
     /************************************* ------------------- *************************************/
     /************************************* ------------------- *************************************/
 
 
     @Override
     @Override
     public void test() {
     public void test() {
-        approveVersion("659a681d44ade3345fdc0d39", "99999");
+
+
+        exportCheckList("A2453", "产品开发项目");
+
+//        approveVersion("659a681d44ade3345fdc0d39", "99999");
         //
         //
         //        String pCode = "99999";
         //        String pCode = "99999";
         //        String pCode = "A240407DryRun";
         //        String pCode = "A240407DryRun";

+ 277 - 0
mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWYDImplClient.java

@@ -0,0 +1,277 @@
+package com.malk.aiwei.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.aiwei.service.AWYDClient;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class AWYDImplClient implements AWYDClient {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private YDService ydService;
+
+    /**
+     * 提供verifier数据读取服务
+     */
+    @Override
+    public List<Map> syncVerifier(String projectCode) {
+        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                .formUuid("FORM-23B67983E91C4ED3B063F9B629D6E964SGHH")
+                .searchCondition(JSON.toJSONString(UtilMap.map("textField_lt6xd8lm", projectCode)))
+                .build());
+
+        return dataList.stream().map(item -> {
+            return item;
+        }).collect(Collectors.toList());
+    }
+
+
+    /************************************* 0906 产品需求导入逻辑变革, 弃用保留 *************************************/
+    
+    @Override
+    public Map checkImportData(Map data) {
+        List<Map> dataList = UtilMap.getList(data, "dataList");
+        String charter = UtilMap.getString(data, "charter");
+        // 根据charter查询需求库
+        List<Map> list = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_YQY0OH7953OKBTM57PLL")
+                .systemToken("PGC66MB1H2RLXMFQ7XKW4BC3BDFJ2UDM909XL18")
+                .formUuid("FORM-7A52930D0E834522AD65A4CFE2C0818F1KQO")
+                .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_lth2h04b", charter))).build());
+        Map<String, Map> charterMap = new HashMap();
+        Map<String, String> instIdList = new HashMap<>();
+        for (int j = 0; j < list.size(); j++) {
+            Map item = list.get(j);
+            instIdList.put(UtilMap.getString(item, "textField_lt2d2x79"), UtilMap.getString(item, "instanceId"));
+            String no = getCode(UtilMap.getString(item, "textField_lt2d2x79"));
+            charterMap.put(no, item);
+            list.get(j).put("id", no);
+        }
+        Boolean flag = true;
+        Map noList = new HashMap();
+        // 数据校验
+        for (int i = 0; i < dataList.size(); i++) {
+            String errmsg = "";
+            Map item = dataList.get(i);
+            String category = UtilMap.getString(item, "selectField_lronu2g3");
+            if (StringUtils.isBlank(category)) {
+                errmsg = errmsg + "需求大类不能为空;";
+            } else {
+                category = category.split("(")[1].replace(")", "");
+                String no = noCP(UtilMap.getString(item, "textField_lt2d2x79"), category);
+                String fno = noCP(UtilMap.getString(item, "textField_m0afm8pd"), category);
+                if (!isValidVersion(no)) {
+                    errmsg = errmsg + "需求编号格式错误;";
+                }
+                if (noList.containsKey(category + no)) {
+                    errmsg = errmsg + "需求编号重复;";
+                }
+                noList.put(category + no, category + no);
+                int cj = getSize(no);
+                if (cj == 1) {
+                    dataList.get(i).put("textField_m0afm8pd", "");
+                } else {
+                    if (!isValidVersion(fno)) {
+                        errmsg = errmsg + "父需求编号格式错误;";
+                    }
+                    if (cj - 1 != getSize(fno)) {
+                        errmsg = errmsg + "父需求编号层级错误;";
+                    }
+                    if (StringUtils.isNotBlank(fno) && !noList.containsKey(category + fno)) {
+                        // 导入数据前父需求编号不存在
+                        if (!charterMap.containsKey(getCode(UtilMap.getString(item, "textField_m0afm8pd")))) {
+                            errmsg = errmsg + "父需求编号数据不存在;";
+                        }
+                    }
+                }
+                if (fno == no) {
+                    errmsg = errmsg + "需求编号于父需求编号不能相同;";
+                }
+                dataList.get(i).put("selectField_lr4y2xcj", cj + "级");
+                if (String.valueOf(item.get("multiSelectField_lw678e43")).length() > 0) {
+                    List multi = UtilMap.getList(item, "multiSelectField_lw678e43");
+                    dataList.get(i).put("multiSelectField_lw678e43_str", multi == null || multi.size() < 1 ? "" : String.join(",", multi));
+                }
+            }
+            if (errmsg != "") {
+                dataList.get(i).put("result", errmsg);
+                flag = false;
+            }
+        }
+        if (flag) {
+            for (int i = 0; i < dataList.size(); i++) {
+                Map item = dataList.get(i);
+                String no = UtilMap.getString(item, "textField_lt2d2x79");
+                String codeNo = getCode(no);
+                if (charterMap.containsKey(codeNo)) {
+                    dataList.get(i).put("associationFormField_lvy7yjq8", getAss(no, instIdList.get(no)));
+                    dataList.get(i).put("textField_lyqprdyf", codeNo); // 序号
+                } else {
+                    // 新增
+                    String category = UtilMap.getString(item, "selectField_lronu2g3");
+                    String categoryNew = category.split("(")[1].replace(")", "");
+                    no = noCP(UtilMap.getString(item, "textField_lt2d2x79"), categoryNew);
+                    String fno = "";
+                    int level = getSize(no);
+                    dataList.get(i).put("selectField_lr4y2xcj", level + "级");
+                    // 根据层级查询序号
+                    String noNew = "";
+                    // 处理结果
+                    if (level > 1) {
+                        fno = getCodeNo(categoryNew, noCP(UtilMap.getString(item, "textField_m0afm8pd"), categoryNew));
+                    }
+                    Map reMap = getMaxValue(list, level + "级", category, fno);
+                    if (reMap != null) {
+                        String id = UtilMap.getString(reMap, "id");
+                        noNew = incrementLastPart(id);
+                    } else {
+                        noNew = level == 1 ? categoryNew + "001" : fno + ".1";
+                    }
+                    codeNo = noNew;
+                    fno = getFnoValue(list, fno);
+                    String nowTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMddHHmmssS"));
+                    dataList.get(i).put("textField_lt2d2x79", noNew + "_" + nowTime);
+                    dataList.get(i).put("textField_m0afm8pd", fno);
+                    dataList.get(i).put("textField_lyqprdyf", codeNo); // 序号
+                    // 拼装数据并新增需求
+                    Map mapNew = dataList.get(i);
+                    mapNew.put("textField_lth2h04b", charter);
+                    mapNew.put("radioField_lroozhse", "是");
+                    mapNew.put("textField_m0m3dyk4", fno);
+                    mapNew.put("textField_lyqpt99s", codeNo);
+                    mapNew.put("radioField_m0ow50wn", "是"); // 是否草稿
+                    String id = (String) ydClient.operateData(YDParam.builder().appType("APP_YQY0OH7953OKBTM57PLL")
+                            .systemToken("PGC66MB1H2RLXMFQ7XKW4BC3BDFJ2UDM909XL18")
+                            .formUuid("FORM-7A52930D0E834522AD65A4CFE2C0818F1KQO")
+                            .formDataJson(JSONObject.toJSONString(mapNew))
+                            .build(), YDConf.FORM_OPERATION.create);
+                    dataList.get(i).put("associationFormField_lvy7yjq8", getAss(noNew + "_" + nowTime, id));
+                    mapNew.put("instanceId", id);
+                    mapNew.put("id", codeNo);
+                    list.add(mapNew);
+                }
+            }
+        }
+        return UtilMap.map("data, flag", dataList, flag);
+    }
+
+    private static String incrementLastPart(String input) {
+        // 查找最后一个点号的位置
+        int lastDotIndex = input.lastIndexOf('.');
+        // 如果没有点号,则整个字符串都需要加1
+        if (lastDotIndex == -1) {
+            String q = input.substring(0, input.length() - 3);
+            String h = input.substring(input.length() - 3);
+            return q + String.format("%03d", Integer.parseInt(h) + 1);
+        }
+        // 分割字符串
+        String prefix = input.substring(0, lastDotIndex + 1);
+        String lastPart = input.substring(lastDotIndex + 1);
+        // 对最后一部分加1
+        String incrementedLastPart = incrementPart(lastPart);
+        // 返回拼接后的结果
+        return prefix + incrementedLastPart;
+    }
+
+    private static String incrementPart(String part) {
+        // 将字符串转换为整数并加1
+        int number = Integer.parseInt(part);
+        number++;
+        // 将整数转换回字符串
+        return String.valueOf(number);
+    }
+
+    private static String getCodeNo(String category, String no) {
+        int dotIndex = no.indexOf('.');
+        String beforeDot = dotIndex == -1 ? no : no.substring(0, dotIndex);
+        String afterDot = dotIndex == -1 ? "" : no.substring(dotIndex);
+        // 对第一部分进行补零
+        String paddedBeforeDot = String.format("%03d", Integer.parseInt(beforeDot));
+        return category + paddedBeforeDot + afterDot;
+    }
+
+    private String getFnoValue(List<Map> list, String fno) {
+        if (StringUtils.isBlank(fno)) {
+            return "";
+        }
+        List<Map> list1 = list.stream()
+                .filter(map -> UtilMap.getString(map, "textField_lt2d2x79").contains(fno + "_")).collect(Collectors.toList()); // 父编号查询编号
+        if (list1 != null && list1.size() > 0) {
+            return UtilMap.getString(list1.get(0), "textField_lt2d2x79");
+        }
+        return "";
+    }
+
+    private Map getMaxValue(List<Map> list, String level, String category, String fno) {
+        // 查找符合条件的最大 id
+        List<Map> list1 = list.stream()
+                .filter(map -> UtilMap.getString(map, "selectField_lr4y2xcj").equals(level)) // 层级
+                .filter(map -> UtilMap.getString(map, "textField_lt2d2x79").contains(fno)) // 父编号查询编号
+                .filter(map -> UtilMap.getString(map, "selectField_lronu2g3").equals(category)).collect(Collectors.toList()); // 前缀
+        Optional<Map> maxMap = list1.stream()
+                .max(Comparator.comparing(map -> UtilMap.getString(map, "id")));
+        return maxMap.orElse(null);
+    }
+
+    private Object getAss(String title, String id) {
+        return Arrays.asList(UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_YQY0OH7953OKBTM57PLL", "FORM-7A52930D0E834522AD65A4CFE2C0818F1KQO", "receipt", id, title, ""));
+    }
+
+    private static int getSize(String value) {
+        return value.split("\\.").length;
+    }
+
+    private Boolean isValidVersion(String version) {
+        Pattern pattern = Pattern.compile("^([0-9]{1,3}(\\.[0-9]{1,3}){0,2})$");
+        Matcher matcher = pattern.matcher(version);
+        return matcher.matches();
+    }
+
+    private String noCP(String value, String category) {
+        if (value.contains(category)) {
+            return getCode(value).replace(category, "").replaceAll("^0+", "");
+        } else {
+            return value;
+        }
+    }
+
+    private String getCode(String pCode) {
+        if (!pCode.contains("_")) {
+            return pCode;
+        }
+        if (isNumeric(pCode.split("_")[0])) {
+            // 时间_序号
+            return pCode.split("_")[1];
+        } else if (isNumeric(pCode.split("_")[1])) {
+            // 序号_时间
+            return pCode.split("_")[0];
+        }
+        return pCode;
+    }
+
+    private boolean isNumeric(String str) {
+        Pattern pattern = Pattern.compile("^\\d+$");
+        Matcher matcher = pattern.matcher(str);
+        return matcher.matches();
+    }
+}

+ 5 - 5
mjava-aiwei/src/main/resources/application-dev.yml

@@ -38,14 +38,14 @@ spring:
 # filepath
 # filepath
 file:
 file:
   path:
   path:
-    file: /home/malk/server/_Tool/var/mjava/tmp/file/
-    image: /home/malk/server/_Tool/var/mjava/tmp/image/
-    tmp: /home/malk/server/_Tool/var/mjava/tmp/
+    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:
   source:
-    fonts: /home/malk/server/_Tool/fonts/simsun.ttc
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
 logging:
 logging:
   file:
   file:
-    path: /home/malk/server/_Tool/var/mjava/log
+    path: /Users/malk/server/_Tool/var/mjava/log
 
 
 # dingtalk
 # dingtalk
 dingtalk:
 dingtalk:

+ 7 - 0
mjava/src/main/java/com/malk/server/aliwork/YDConf.java

@@ -33,6 +33,13 @@ public class YDConf {
      */
      */
     public static final Integer PAGE_SIZE_LIMIT = 100;
     public static final Integer PAGE_SIZE_LIMIT = 100;
 
 
+
+    /**
+     * 子表超过50分页查询数量
+     */
+    public static final Integer PAGE_SIZE_DETAILS = 50;
+
+
     /**
     /**
      * 接口访问账号 [不能触发待办与消息通知, 业务规则亦不能]
      * 接口访问账号 [不能触发待办与消息通知, 业务规则亦不能]
      * -
      * -

+ 1 - 1
mjava/src/main/java/com/malk/service/aliwork/impl/YDServiceImpl.java

@@ -74,7 +74,7 @@ public class YDServiceImpl implements YDService {
 
 
     // 递归查询 todo 如果查询中, totalCount 发生变化, 就会进入死循环
     // 递归查询 todo 如果查询中, totalCount 发生变化, 就会进入死循环
     private List<Map> _queryDetails(YDParam ydParam, List<Map> details) {
     private List<Map> _queryDetails(YDParam ydParam, List<Map> details) {
-        ydParam.setPageSize(50);
+        ydParam.setPageSize(YDConf.PAGE_SIZE_DETAILS);
         DDR_New ddr_new = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_details);
         DDR_New ddr_new = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_details);
         details.addAll((List<Map>) ddr_new.getData());
         details.addAll((List<Map>) ddr_new.getData());
         if (ddr_new.getTotalCount() != details.size()) {
         if (ddr_new.getTotalCount() != details.size()) {