Bläddra i källkod

完善【立项/项目台账】→【配件任务表】数据流转接口服务,该接口与/tb/task/save接口基本的业务逻辑一致,但是排除了TeamBition相关代码

lvjs 1 dag sedan
förälder
incheckning
a7d30d3c1d
1 ändrade filer med 304 tillägg och 130 borttagningar
  1. 304 130
      src/main/java/com/malk/eastar/service/impl/YidaServiceImpl.java

+ 304 - 130
src/main/java/com/malk/eastar/service/impl/YidaServiceImpl.java

@@ -13,6 +13,7 @@ import com.malk.service.aliwork.YDService;
 import com.malk.utils.PublicUtil;
 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;
 
@@ -67,7 +68,7 @@ public class YidaServiceImpl implements YidaService {
         //String pTaskType = UtilMap.getString(projectData,"textField_mfqnsa9d");    // TB任务类型名称
         String customerName = UtilMap.getString(projectData,"textField_me87x1o0");  // 客户名称,旧变量名 -> merName
         System.out.println("客户名称:"+customerName);
-        String orderType = UtilMap.getString(projectData,"selectField_mdf997wp");  // 订单类型(大货|打样)
+        String projectOrderType = UtilMap.getString(projectData,"selectField_mdf997wp");  // 订单类型(大货|打样)
         List<String> projectPhaseList = UtilMap.getList(projectData,"checkboxField_me9n37rs");   //包含阶段,旧变量名 -> jds
         List<String> pmUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me2hyld8_id");  // 项目经理(项目经理 Product Manager)userid
         List<String> ssUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me2hyld9_id");  // 业务(从事销售工作的人员 Sales Staff)userid
@@ -82,6 +83,9 @@ public class YidaServiceImpl implements YidaService {
         List<UtilMap.assDetail> projectDataAssOrder = UtilMap.getAssFieldValue(
                 projectData,"associationFormField_me2hylda_id"
         );  //【立项/项目台账】关联表单【制作新订单】,旧变量名 -> projectOrder
+        List<Map> projectSubDataPlan = UtilMap.getList(
+                projectData,"tableField_mgu5rm3e"
+        ); // 【立项/项目台账】子表单【项目计划】,,旧变量名 -> projectPlan
         List<Map> projectSubDataParts = ydService.queryDetails(
                 YDParam.builder()
                         .formInstanceId(formInstId)
@@ -101,6 +105,25 @@ public class YidaServiceImpl implements YidaService {
                 YDParam.builder().formInstId(orderId).build(),
                 YDConf.FORM_QUERY.retrieve_id
         ).getFormData();    //【制作新订单】数据
+        int sampleNum;  //套装样品数量
+        Object demoValue = orderData.get("textField_me2f7tvd"); //套装样品及数量(单行文本类型)
+        // 检查值是否为 Integer 类型
+        if (demoValue == null) {
+            sampleNum = 0;
+        }else if (demoValue instanceof Integer) {
+            sampleNum = (Integer) demoValue;
+        } else if (demoValue instanceof String) {
+            try {
+                sampleNum = Integer.parseInt((String) demoValue);
+            } catch (NumberFormatException e) {
+                // 解析失败
+                System.err.println("套装样品及数量字段值不是整数!");
+                sampleNum = 0;
+            }
+        }else{
+            System.err.println("套装样品及数量字段值不是整数!");
+            sampleNum = 0;
+        }
         List<Map> orderSubDataSeries = UtilMap.getList(orderData,"tableField_mesc7nvj");    // 【制作新订单】子表单【系列套数】,旧变量名 -> xlConf
         System.out.println("【制作新订单】子表单【系列套数】");
         String codeSeries;
@@ -129,7 +152,7 @@ public class YidaServiceImpl implements YidaService {
         }
 
         /*
-            获取供应商与采购跟单数据
+            获取供应商与采购跟单数据(当前项目)
          */
         List<String> buyerUserIdList = new ArrayList<>();   //采购跟单userid列表,旧变量名 -> mchList
         String supplier;
@@ -148,13 +171,13 @@ public class YidaServiceImpl implements YidaService {
         }
 
         /*
-            查询配件信息
+            查询配件类型信息
             【品类表】  FORM-17E244F3FB2240EB930E6DD4E22C7F89KXAR
          */
-        List<Map> partsData = ydService.queryAllFormData(
+        List<Map> partsTypeData = ydService.queryAllFormData(
                 YDParam.builder().formUuid(EastarParam.YD_FORMUUID_SKU_TYPE).build()
         );  // 【品类表】数据,旧变量名 -> skuTypeListConfigData
-        Map partsNameCodeMap = ConfigDataProcessor.skuTypeListConfigData(partsData);  // 品类名称与配件编号映射,旧变量名 -> skuIdMap
+        Map partsTypeNameCodeMap = ConfigDataProcessor.skuTypeListConfigData(partsTypeData);  // 品类名称与配件编号(这里的配件编号应该是品类编码)映射,旧变量名 -> skuIdMap
 
         /*
             查询配件参数信息
@@ -183,17 +206,30 @@ public class YidaServiceImpl implements YidaService {
 //        userIdList = new ArrayList<>(userIdSet);
 
         /*
-            创建配件任务
+            获取所有配件记录
          */
-        List<Map> partsTaskData1;    //配件任务数据1,旧变量名 -> result
-        List<Map> partsTaskData2 = new ArrayList<>();    //配件任务数据
-        Map<String,List<Map>> supplierPurchaseMap = new HashMap<>(); // 供应商与采购需求关联数据
+        List<Map> partsRecordList;    //所有配件记录,旧变量名 -> result
+        List<Map> partsTaskSubData = new ArrayList<>();    //配件任务明细数据
+        Map<String,List<Map>> partsRecordListBySupplier = new HashMap<>(); // 供应商与采购需求关联数据
         boolean isMultiLang;    //语言区别,旧变量名 -> isLang
         String partsMajorType;  //配件大类,旧变量名 -> type
         Map<String,List<String>> partsConfMapByMajorType; //配件参数信息(某配件大类),旧变量名 -> sonconfs
         List<String> phaseDeliverablesList; //阶段产出物列表
         List<String> partsMajorTypePhaseDeliverables;   //配件大类与产出物列表,旧变量名 -> sonconf
-        for(Map projectSubRecordParts : projectSubDataParts){ //遍历【立项/项目台账】子表单【全品类】记录,旧变量名 -> map
+        Map<String,String> seriesDevNumMap = new HashMap<>();  //系列与研发部订单需求数量映射数据
+        String devNum;  //研发部订单需求数量
+        for(Map projectSubRecordParts : projectSubDataParts){ //遍历【立项/项目台账】子表单【全品类】数据,旧变量名 -> map
+            /*
+                获取系列与研发部订单需求数量映射
+             */
+            nameSeries = UtilMap.getString(projectSubRecordParts,"selectField_me2f7tw4");    //系列
+            devNum = UtilMap.getString(projectSubRecordParts,"numberField_mmke3fdc");   //研发部订单需求数量
+            if(seriesDevNumMap.get(nameSeries) == null){
+                seriesDevNumMap.put(nameSeries,devNum);
+            }
+            /*
+                获取配件大类与产出物列表
+             */
             supplier = UtilMap.getString(projectSubRecordParts,"textField_me2f7tvz"); //供应商,旧变量名 -> gysName
             isMultiLang = "是".equals(UtilMap.getString(projectSubRecordParts,"radioField_me2f7tvx"));
             partsMajorType = UtilMap.getString(projectSubRecordParts,"selectField_me2f7tvk");
@@ -209,77 +245,88 @@ public class YidaServiceImpl implements YidaService {
                     }
                 }
             }
-            if(isMultiLang){ // 是否存在多种语言版本
-                partsTaskData1 = createPartsTaskData1(null,orderSubDataLang,projectSubRecordParts,null,isMultiLang,partsMajorTypePhaseDeliverables,null,supplier,projectCode,leadsCode,partsNameCodeMap);
-            }else{
-                partsTaskData1 = createPartsTaskData1(null,orderSubDataSeries,projectSubRecordParts,null,isMultiLang,partsMajorTypePhaseDeliverables,null,supplier,projectCode,leadsCode,partsNameCodeMap);
-            }
-            if(supplierPurchaseMap.containsKey(supplier)){
-                supplierPurchaseMap.get(supplier).addAll(partsTaskData1);
+            /*
+                获取所有配件记录
+             */
+            partsRecordList = getPartsRecordList(null,orderSubDataLang,projectSubRecordParts,null,isMultiLang,partsMajorTypePhaseDeliverables,null,supplier,projectCode,leadsCode,partsTypeNameCodeMap);
+            /*
+                按供应商对配件记录进行分组
+             */
+            if(partsRecordListBySupplier.containsKey(supplier)){
+                partsRecordListBySupplier.get(supplier).addAll(partsRecordList);
             }else{
-                supplierPurchaseMap.put(supplier,partsTaskData1);
+                partsRecordListBySupplier.put(supplier,partsRecordList);
             }
-            partsTaskData2.addAll(partsTaskData1);
+            partsTaskSubData.addAll(partsRecordList);
         }
-        System.out.println("配件任务数据数量="+partsTaskData2.size());
-        /*
-            从立项数据提取项目计划明细数据
-         */
-        List<Map> projectSubDataPlan = UtilMap.getList(projectData,"tableField_mgu5rm3e"); // 项目计划明细,旧变量名 -> projectPlan
+        System.out.println("配件任务明细数量="+partsTaskSubData.size());
+
         /*
-            按配件任务关联项目阶段对配件任务数据进行调整
+            按项目阶段拆解配件任务数据
          */
-        List<String> partsTaskPhaseList = Arrays.asList("白样", "产前样","大货样", "大货"); //配件任务关联项目阶段(不包含包装),旧变量名 -> jdList
-        Object demoValue = orderData.get("textField_me2f7tvd"); //套装样品及数量
-        long planEndTime;
-        List<Map> partsTaskRecordsByGys;
-        List<Map> modifiedList;
-        String taskStatus;
-        String taskType;
-        String procuremenType;
-        Map<String, Object> copiedMap;
-        Map supplierOrder;  //采购订单,旧变量名 -> order
-        List<Map> gysBuyerData;  //跟单与供应商映射数据,旧变量名 -> gysList
-        List<UtilMap.assDetail> gysBuyerDataAssSupplier;    //供应商档案关联表单,旧变量名 -> gys
-        for(String phase : projectPhaseList){ //遍历项目包含阶段,旧变量名 -> jd
-            System.out.println("项目阶段:"+phase);
-            if(partsTaskPhaseList.contains(phase)){
-                planEndTime = 0;
-                for(Map stage : projectSubDataPlan){
-                    if(phase.equals(UtilMap.getString(stage,"textField_mgu5rm3f"))){   //比较阶段是否一致
-                        planEndTime = UtilMap.getLong(stage,"dateField_mgu5rm3h");    //计划结束时间,旧变量名 -> planTimestamp
+        Map partsTaskData;  //配件任务数据,旧变量名 -> order
+        List<String> partsTaskPhaseList = Arrays.asList("白样", "产前样","大货样", "大货"); //配件任务阶段(不包含包装)列表,旧变量名 -> jdList
+        long projectPhasePlanEndTime;   //项目阶段计划结束时间(时间戳)
+        List<Map> partsTaskSubDataNew; //配件任务明细数据(新)
+        String partsTaskStatus;   //配件任务状态,旧变量名 -> taskStatus
+        String partsTaskOrderType;  //订单类型【配件任务表】,旧变量名 -> taskType
+        String purchaseType;    //采购类型,旧变量名 -> procuremenType
+        Map<String, Object> partsRecordNew;  //配件记录(新),旧变量名 -> copiedMap
+        List<Map> supplierBuyerData;  //【跟单-供应商对应表】数据,旧变量名 -> gysList
+        List<UtilMap.assDetail> supplierBuyerDataAssSupplier;    //【跟单-供应商对应表】关联表单【供应商】,旧变量名 -> gys
+        String numOfSets;   //工厂采购数量
+        int allSupplyNum;   //总采购数量
+        for(String projectPhase : projectPhaseList){ //遍历项目包含阶段,旧变量名 -> jd
+            System.out.println("项目阶段:"+projectPhase);
+            if(partsTaskPhaseList.contains(projectPhase)){
+                /*
+                    获取当前阶段计划结束时间
+                 */
+                projectPhasePlanEndTime = 0;
+                for(Map projectSubRecordPlan : projectSubDataPlan){    //遍历项目计划阶段
+                    if(projectPhase.equals(UtilMap.getString(projectSubRecordPlan,"textField_mgu5rm3f"))){   //阶段匹配成功
+                        projectPhasePlanEndTime = UtilMap.getLong(projectSubRecordPlan,"dateField_mgu5rm3h");    //计划结束时间,旧变量名 -> planTimestamp
                     }
                 }
-                for (String gys : supplierPurchaseMap.keySet()){ //遍历采购需求数据,旧变量名 -> key
-                    partsTaskRecordsByGys = supplierPurchaseMap.get(gys);  //待新增的配件任务表记录(按供应商区分),旧变量名 -> arr
-                    modifiedList = new ArrayList<>();
-                    procuremenType = "";
-                    taskStatus = "";
-                    taskType = "";
-                    for (Map<String, Object> partsTaskRecordByGys : partsTaskRecordsByGys) { //遍历待新增的配件任务表记录(按供应商区分),旧变量名 -> map
-                        if("大货".equals(phase)){
-                            procuremenType ="配件采购";
-                            taskStatus ="待排期";
-                            taskType ="大货";
-                            copiedMap = new HashMap<>(partsTaskRecordByGys); // 关键:创建副本
-                            copiedMap.put("dateField_mizvc5oi", planEndTime); //考核日期
-                            modifiedList.add(copiedMap);
+                for (String keySupplier : partsRecordListBySupplier.keySet()){ //遍历采购需求数据,旧变量名 -> key
+                    partsRecordList = partsRecordListBySupplier.get(keySupplier);  //配件记录(按供应商区分),旧变量名 -> arr
+                    partsTaskSubDataNew = new ArrayList<>();
+                    purchaseType = "";
+                    partsTaskStatus = "";
+                    partsTaskOrderType = "";
+                    for (Map<String, Object> partsRecord : partsRecordList) { //遍历配件记录(按供应商区分),旧变量名 -> map
+                        if("大货".equals(projectPhase)){
+                            purchaseType ="配件采购";
+                            partsTaskStatus ="待排期";
+                            partsTaskOrderType ="大货";
+                            numOfSets = partsRecord.get("numberField_mifp03el")==null?null:partsRecord.get("numberField_mifp03el").toString();
+                            devNum = partsRecord.get("numberField_mmmwu4cg")==null?null:partsRecord.get("numberField_mmmwu4cg").toString();
+                            allSupplyNum = 0;
+                            if(StringUtils.isNotEmpty(devNum) && StringUtils.isNotEmpty(numOfSets)){
+                                allSupplyNum = Integer.parseInt(devNum) + Integer.parseInt(numOfSets);  //计算总采购数量
+                            }
+                            partsRecordNew = new HashMap<>(partsRecord); // 关键:创建副本
+                            partsRecordNew.put("numberField_mmmwu4ci",allSupplyNum);    //总采购数量
+                            partsRecordNew.put("dateField_mizvc5oi", projectPhasePlanEndTime); //考核日期
+                            partsTaskSubDataNew.add(partsRecordNew);
                         } else{
-                            if("大货样".equals(phase)){
-                                taskStatus ="无需合同";
+                            if("大货样".equals(projectPhase)){
+                                partsTaskStatus ="无需合同";
                             }else{  //白样和产前样
-                                taskStatus ="待排期";
+                                partsTaskStatus ="待排期";
                             }
-                            procuremenType ="样品任务";
-                            taskType ="打样";
-                            copiedMap = new HashMap<>(partsTaskRecordByGys); // 关键:创建副本
-                            copiedMap.put("dateField_mizvc5oi", planEndTime); //考核日期
-                            copiedMap.put("numberField_mkosp94h", demoValue);   //客户订单数量
-                            copiedMap.put("numberField_mifp03el", demoValue);   //工厂采购数量
-                            modifiedList.add(copiedMap);
+                            purchaseType ="样品任务";
+                            partsTaskOrderType ="打样";
+                            partsRecordNew = new HashMap<>(partsRecord); // 关键:创建副本
+                            partsRecordNew.put("dateField_mizvc5oi", projectPhasePlanEndTime); //考核日期
+                            partsRecordNew.put("numberField_mkosp94h", sampleNum);   //客户订单数量
+                            partsRecordNew.put("numberField_mifp03el", sampleNum);   //工厂采购数量
+                            partsRecordNew.put("numberField_mmmwu4cg",0);    //研发部订单需求数量
+                            partsRecordNew.put("numberField_mmmwu4ci",sampleNum);    //总采购数量
+                            partsTaskSubDataNew.add(partsRecordNew);
                         }
                     }
-                    supplierOrder = UtilMap.map(
+                    partsTaskData = UtilMap.map(
                             //"textField_mifp03ew, " +    //TB项目编号
                                     "selectField_mifp03e7, " +  //任务状态
                                     "tableField_mifp03em, " +   //采购明细
@@ -287,23 +334,23 @@ public class YidaServiceImpl implements YidaService {
                                     "dateField_mifp03eb, " +    //计划完成日期
                                     "selectField_ml0l206x", //订单类型
                             //tbProjectId,
-                            taskStatus,
-                            modifiedList,
-                            procuremenType,
-                            planEndTime,
-                            taskType
+                            partsTaskStatus,
+                            partsTaskSubDataNew,
+                            purchaseType,
+                            projectPhasePlanEndTime,
+                            partsTaskOrderType
                     );
-                    supplierOrder.put("associationFormField_mifp03e9",projectDataAssOrder); //项目订单
-                    supplierOrder.put("associationFormField_mifp03e8",projectDataAssLeads); // 销售项目
-                    supplierOrder.put("textField_mifp03e6",projectName+"-"+gys+"-"+phase);   //任务名称
-                    supplierOrder.put("textField_mimwnauk",projectCode);    //项目订单编号
+                    partsTaskData.put("associationFormField_mifp03e9",projectDataAssOrder); //项目订单
+                    partsTaskData.put("associationFormField_mifp03e8",projectDataAssLeads); // 销售项目
+                    partsTaskData.put("textField_mifp03e6",projectName+"-"+keySupplier+"-"+projectPhase);   //任务名称
+                    partsTaskData.put("textField_mimwnauk",projectCode);    //项目订单编号
                     //supplierOrder.put("textField_mizs3841",pMainId);
-                    supplierOrder.put("employeeField_mifp03eu",Arrays.asList(supplierBuyerMap.get(gys))); //跟单负责人
+                    partsTaskData.put("employeeField_mifp03eu",Arrays.asList(supplierBuyerMap.get(keySupplier))); //跟单负责人
                     /*
-                        查询跟单与供应商数据
+                        查询供应商与跟单数据
                         【跟单-供应商对应表】  FORM-3AB247087A81401F87264BFA74944BE3R086
                      */
-                    gysBuyerData = (List<Map>) ydClient.queryData(
+                    supplierBuyerData = (List<Map>) ydClient.queryData(
                             YDParam.builder()
                                     .formUuid(EastarParam.YD_FORMUUID_GYS_YW)
                                     .searchCondition(
@@ -311,7 +358,7 @@ public class YidaServiceImpl implements YidaService {
                                                     Arrays.asList(
                                                             new YDSearch(
                                                                     "textField_mec6lku3",   //供应商简称
-                                                                    gys,
+                                                                    keySupplier,
                                                                     "供应商简称",
                                                                     YDSearch.Type.TEXT_FIELD,
                                                                     YDSearch.Operator.EQ
@@ -321,27 +368,28 @@ public class YidaServiceImpl implements YidaService {
                                     ).build(),
                             YDConf.FORM_QUERY.retrieve_list
                     ).getData();
-                    if(gysBuyerData!=null && gysBuyerData.size()>0){
-                        gysBuyerDataAssSupplier
+                    if(supplierBuyerData!=null && supplierBuyerData.size()>0){
+                        supplierBuyerDataAssSupplier
                                 = UtilMap.getAssFieldValue(
-                                        UtilMap.getMap(gysBuyerData.get(0),"formData"),
+                                        UtilMap.getMap(supplierBuyerData.get(0),"formData"),
                                         "associationFormField_mec6lku4_id"  //供应商
                                   );
-                        supplierOrder.put("associationFormField_mifp03ea",gysBuyerDataAssSupplier); //供应商
-                        supplierOrder.put("textField_mifp03ez",gysBuyerDataAssSupplier.get(0).subTitle);    // 供应商编号
+                        partsTaskData.put("associationFormField_mifp03ea",supplierBuyerDataAssSupplier); //供应商
+                        partsTaskData.put("textField_mifp03ez",supplierBuyerDataAssSupplier.get(0).subTitle);    // 供应商编号
                     }
-                    supplierOrder.put("textField_mmikzhlb",phase); //里程碑
+                    partsTaskData.put("textField_mmikzhlb",projectPhase); //里程碑
                     /*
-                        保存配件任务数据
+                        保存配件任务数据(不含包装)
                         【配件任务表】 FORM-B9CBFB34DB3249C483415EF641202AC199J9
                      */
-//                    ydClient.operateData(
-//                            YDParam.builder()
-//                                    .formUuid(EastarParam.YD_FORMUUID_CGTASK)
-//                                    .formDataJson(JSONObject.toJSONString(supplierOrder))
-//                                    .build(),
-//                            YDConf.FORM_OPERATION.create
-//                    );
+                    System.out.println("保存配件任务数据("+projectPhase+"):"+ JSONObject.toJSONString(partsTaskData));
+                    ydClient.operateData(
+                            YDParam.builder()
+                                    .formUuid(EastarParam.YD_FORMUUID_CGTASK)
+                                    .formDataJson(JSONObject.toJSONString(partsTaskData))
+                                    .build(),
+                            YDConf.FORM_OPERATION.create
+                    );
                 }
             }
         }
@@ -349,39 +397,41 @@ public class YidaServiceImpl implements YidaService {
         /*
             生成包装任务(打样不需要生成包装)
          */
-        if("大货".equals(orderType)){
-            //savePackTask(tbProjectId, orderLangConf, data, pName, pId, pMainId, projectOrder, mchDDIdMap);
+        if("大货".equals(projectOrderType)){
+            savePartsPackTaskData(null, orderSubDataLang, projectData, projectName, projectCode, leadsCode, projectDataAssOrder, supplierBuyerMap, seriesDevNumMap);
         }
 
         return Collections.emptyMap();
     }
 
-    //创建配件任务数据1
-    private List<Map> createPartsTaskData1(
+    /**
+     * 获取所有配件记录
+     */
+    private List<Map> getPartsRecordList(
             Map taskMap,    //TB相关,无用
             List<Map> orderSubDataLangOrSeries, //销售订单子表单记录,【语言版本 - 数量拆分】明细数据或【系列套数】明细数据,旧变量名 -> orderConf
-            Map projectSubRecordParts,  //立项数据子表单记录,【全品类】明细数据某一行,旧变量名 -> cgDetail
+            Map projectSubRecordParts,  //【立项/项目台账】子表单【全品类】某一行记录,旧变量名 -> cgDetail
             List<Map> customfields, //TB相关,无用
             boolean isMultiLang, //是否存在多种语言版本,旧变量名 -> isLang
             List<String> partsPhaseDeliverables,   //配件状态明细(按配件大类分组),旧变量名 -> sonConf
             String sonScenariofieldconfigId,    //TB相关,无用
             String supplier,    //供应商,旧变量名 -> gysName
-            String pId, // 项目编号
-            String pMainId, // 主项目编号
-            Map skuTypeDataMap    //品类名称与配件编号映射,旧变量名 -> skuIdMap
+            String projectCode, // 项目编号,旧变量名 -> pId
+            String leadsCode, // 线索编码,旧变量名 -> pMainId
+            Map partsTypeNameCodeMap    //品类名称与配件编号(这里的配件编号应该是品类编码)映射,旧变量名 -> skuIdMap
     ){
-        List<Map> partsTaskData1 = new ArrayList<>();    //待新增的配件任务数据
+        List<Map> partsRecordList = new ArrayList<>();    //所有配件记录
         String nameSeries;  //系列,旧变量名 -> confSeries
         String nameLang;    //语言
-        String skuId;
-        String reportId;
-        String sku;
+        String partsTypeCode;   //配件类型编码(来源于【品类表】的“配件编号”),旧变量名 -> skuId
+        String partsTypeName;   //配件类型名称(来源于【品类表】的“品类名称”)
+        String docSN; //文档序号,旧变量名 -> reportId
+        String skuSN; //SKU编号,旧变量名 -> sku
         String numOfSets;   //套数【语言版本 - 数量拆分】或套数【系列套数】,旧变量名 -> value
         String devNum;  //研发部订单需求数量,旧变量名 -> rdNum
         int allSupplyNum;   //总采购数量
-        String partsType;   //配件类型(来源于【品类表】的“品类名称”)
         String partsName;   //配件名称
-        Map projectSubRecordPartsNew;  //立项数据子表单记录,【全品类】明细数据某一行(新),旧变量名 -> recod
+        Map partsRecord;  //配件记录,来源于【立项/项目台账】子表单【全品类】某一行记录,旧变量名 -> recod
         for(Map orderSubRecordLangOrSeries : orderSubDataLangOrSeries){    //遍历子表单记录,旧变量名 -> map
             nameSeries = UtilMap.getString_first(
                     orderSubRecordLangOrSeries,
@@ -392,39 +442,43 @@ public class YidaServiceImpl implements YidaService {
                 // 系列【全品类】与系列【语言版本 - 数量拆分】或系列【系列套数】不匹配
                 continue;
             }
-            partsType = UtilMap.getString(projectSubRecordParts,"selectField_mizsccds");
-            skuId = String.valueOf(skuTypeDataMap.get(partsType));  //配件编号
-            skuId = PublicUtil.isNull(skuId) ? "000":skuId;
-            reportId = UtilMap.getString(projectSubRecordParts,"textField_me2f7tvn");// 文档序号
-            sku = "2" + skuId
-                    + UtilMap.getString_first(orderSubRecordLangOrSeries,"textField_mizmmf8h","textField_mizmmf8m")   //系列编号【语言版本 - 数量拆分】或 系列编号【系列套数】
-                    + reportId.substring(reportId.length()-2);  // sku 添加系列编号及文档编号
+            partsTypeName = UtilMap.getString(projectSubRecordParts,"selectField_mizsccds");
+            partsTypeCode = String.valueOf(partsTypeNameCodeMap.get(partsTypeName));
+            partsTypeCode = PublicUtil.isNull(partsTypeCode) ? "000":partsTypeCode;
+            docSN = UtilMap.getString(projectSubRecordParts,"textField_me2f7tvn");
+            skuSN = "2"
+                    + partsTypeCode
+                    + UtilMap.getString_first(orderSubRecordLangOrSeries,"textField_mizmmf8h","textField_mizmmf8m")   //系列编号【语言版本 - 数量拆分】 或 系列编号【系列套数】
+                    + docSN.substring(docSN.length()-2);  // sku 添加系列编号及文档编号
             nameLang = UtilMap.getString(orderSubRecordLangOrSeries,"textField_meqqj4wb"); // 语言【语言版本 - 数量拆分】,旧变量名 -> lang
             if(isMultiLang){ // 是否存在多种语言版本
                 if(PublicUtil.isNull(nameLang)){
                     nameLang = "不区分";
-                    sku = sku+"AL"; // sku 不区分语言
+                    skuSN = skuSN+"AL"; // sku 不区分语言
                 }
-                sku = sku + UtilMap.getString(orderSubRecordLangOrSeries,"textField_mizmmf8i"); // sku+语言编号
+                skuSN = skuSN + UtilMap.getString(orderSubRecordLangOrSeries,"textField_mizmmf8i"); // sku+语言编号
             }else{
                 nameLang = "不区分";
-                sku = sku+"AL"; // sku 不区分语言
+                skuSN = skuSN+"AL"; // sku 不区分语言
             }
-            sku = sku + pMainId.substring(pMainId.length()-10); // sku+项目号
+            skuSN = skuSN + leadsCode.substring(leadsCode.length()-10); // sku+项目号
             numOfSets = UtilMap.getString_first(
                     orderSubRecordLangOrSeries,
                     "numberField_meqqj4wd", // 套数【语言版本 - 数量拆分】
                     "numberField_mesc7nvi"  // 套数【系列套数】
             ); // 数量
             devNum = UtilMap.getString(projectSubRecordParts,"numberField_mmke3fdc");   //研发部订单需求数量
-            allSupplyNum = 0;
+//            allSupplyNum = 0;
 //            if(StringUtils.isNotEmpty(devNum) && StringUtils.isNotEmpty(numOfSets)){
 //                allSupplyNum = Integer.parseInt(devNum) + Integer.parseInt(numOfSets);  //计算总采购数量
 //            }
-            allSupplyNum = Integer.parseInt(numOfSets);
-            projectSubRecordPartsNew = new HashMap(projectSubRecordParts);
-            partsName = nameSeries+"-"+partsType;
-            projectSubRecordPartsNew.putAll(
+            allSupplyNum = Integer.parseInt(numOfSets); //暂时不加上“研发部订单需求数量”
+            partsName = nameSeries + "-" + partsTypeName;
+            /*
+                复制【立项/项目台账】子表单【全品类】记录为配件记录,并补充部分字段
+             */
+            partsRecord = new HashMap(projectSubRecordParts);
+            partsRecord.putAll(
                     UtilMap.map(
                             "textField_mecmytpr, " + //配件名称
                                     "textField_mecmytps, " + //TB任务编号
@@ -443,18 +497,138 @@ public class YidaServiceImpl implements YidaService {
                             numOfSets,
                             devNum,
                             allSupplyNum,
-                            sku,
-                            pId,
+                            skuSN,
+                            projectCode,
                             "~",
                             nameLang,
                             numOfSets
                     )
             );
-            partsTaskData1.add(projectSubRecordPartsNew);
+            partsRecordList.add(partsRecord);
         }
 
 
-        return partsTaskData1;
+        return partsRecordList;
+    }
+
+
+    /**
+     * 保存配件任务数据(包装)
+     */
+    private List<Map> savePartsPackTaskData(
+            String tbProjectId, //TB相关,无用
+            List <Map> orderSubDataLang,   //【制作新订单】子表单【语言版本 - 数量拆分】数据,旧变量名 -> orderLangConf
+            Map projectData,   //【立项/项目台账】数据,旧变量名 -> data
+            String projectName,   // 项目名称,旧变量名 -> pName
+            String projectCode, // 项目编号,旧变量名 -> pId
+            String leadsCode, // 线索编码,旧变量名 -> pMainId
+            List projectDataAssOrder,  //【立项/项目台账】关联表单【制作新订单】,旧变量名 -> projectOrder
+            Map supplierBuyerMap,  //供应商与采购跟单userid映射,旧变量名 -> mchDDIdMap
+            Map<String,String> seriesDevNumMap  //系列与研发部订单需求数量映射数据
+    ) {
+        Map<String, List<Map>> partsRecordListBySupplier = new HashMap<>();  // 供应商与采购需求关联数据,旧变量名 -> packOrderData
+        Map partsRecord;   //配件记录,旧变量名 -> packTask
+        String supplier;    //供应商
+        String numOfSets;   //套数,旧变量名 -> setsValue
+        String nameSeries;  //系列
+        String devNum;  //研发部订单需求数量
+        int allSupplyNum;   //总采购数量
+        for (Map orderSubRecordLang : orderSubDataLang) { //遍历子表单,旧变量名 -> orderMap
+            supplier = UtilMap.getString(orderSubRecordLang, "textField_mkp7yv76"); //供应商
+            numOfSets = UtilMap.getString(orderSubRecordLang, "numberField_meqqj4wd");  //套数
+            nameSeries = UtilMap.getString(orderSubRecordLang, "textField_meqqj4wa");   //系列
+            devNum = seriesDevNumMap.get(nameSeries);
+            allSupplyNum = 0;
+            if(StringUtils.isNotEmpty(devNum) && StringUtils.isNotEmpty(numOfSets)){
+                allSupplyNum = Integer.parseInt(devNum) + Integer.parseInt(numOfSets);  //计算总采购数量
+            }
+            partsRecord = UtilMap.map(
+                    "textField_mecmytpr, " +    //配件名称
+                            "textField_mifp03eo, " +    //SKU编号
+                            "textField_mjr129o4, " +    //语言
+                            "selectField_me2f7tw4, " +  //系列
+                            "numberField_mkosp94h, " +  //客户订单数量
+                            "numberField_mifp03el, " +  //工厂采购数量
+                            "numberField_mmmwu4cg, " + //研发部订单需求数量
+                            "numberField_mmmwu4ci, ", //总采购数量
+                    UtilMap.getString(orderSubRecordLang, "textField_mizmmf8k"),    //成品名称
+                    UtilMap.getString(orderSubRecordLang, "textField_mizmmf8j"),    //成品编号
+                    UtilMap.getString(orderSubRecordLang, "textField_meqqj4wb"),    //语言
+                    nameSeries,    //系列
+                    numOfSets,
+                    numOfSets,
+                    devNum, //研发部订单需求数量
+                    allSupplyNum //总采购数量
+
+            );
+            partsRecordListBySupplier.computeIfAbsent(supplier, k -> new ArrayList<>()).add(partsRecord);
+        }
+        List<Map> partsRecordList;  //配件记录(按供应商区分),旧变量名 -> packdetails
+        Map partsTaskData;  //配件任务数据,旧变量名 -> packTaskorder
+        List<Map> supplierBuyerData;  //【跟单-供应商对应表】数据,旧变量名 -> gysList
+        List<UtilMap.assDetail> supplierBuyerDataAssSupplier;    //【跟单-供应商对应表】关联表单【供应商】,旧变量名 -> gys
+        for (String keySupplier : partsRecordListBySupplier.keySet()){  //遍历供应商与采购需求关联数据,旧变量名 -> key
+            partsRecordList = partsRecordListBySupplier.get(keySupplier);
+            partsTaskData = UtilMap.map(
+//                    "textField_mifp03ew, " +    //TB项目编号
+                            "selectField_mifp03e7, " +  //任务状态
+                            "tableField_mifp03em, " +   //采购明细
+                            "selectField_mkf6qv9b, " +  //采购类型
+                            "selectField_ml0l206x", //订单类型
+//                    tbProjectId,
+                    "待排期",
+                    partsRecordList,
+                    "成品包装",
+                    "包装"
+            );
+            partsTaskData.put("associationFormField_mifp03e9",projectDataAssOrder); //项目订单
+            partsTaskData.put("associationFormField_mifp03e8",
+                    UtilMap.getAssFieldValue(projectData,"associationFormField_mdy7w1wn_id")
+            );  // 销售项目
+            partsTaskData.put("textField_mifp03e6",projectName+"-"+keySupplier+"-包装");  //任务名称
+            partsTaskData.put("textField_mimwnauk",projectCode);    //项目订单编号
+//            partsTaskData.put("textField_mizs3841",leadsCode);
+            partsTaskData.put("employeeField_mifp03eu",Arrays.asList(supplierBuyerMap.get(keySupplier)));   //跟单负责人
+            supplierBuyerData = (List<Map>) ydClient.queryData(
+                    YDParam.builder()
+                            .formUuid(EastarParam.YD_FORMUUID_GYS_YW)
+                            .searchCondition(
+                                    JSONObject.toJSONString(
+                                            Arrays.asList(
+                                                    new YDSearch(
+                                                            "textField_mec6lku3",  //"供应商简称"
+                                                            keySupplier,
+                                                            "供应商简称",
+                                                            YDSearch.Type.TEXT_FIELD,
+                                                            YDSearch.Operator.EQ
+                                                    )
+                                            )
+                                    )
+                            )
+                            .build(),
+                    YDConf.FORM_QUERY.retrieve_list
+            ).getData();
+            if(supplierBuyerData!=null && supplierBuyerData.size()>0){
+                supplierBuyerDataAssSupplier
+                        = UtilMap.getAssFieldValue(
+                                UtilMap.getMap(supplierBuyerData.get(0),"formData"),
+                        "associationFormField_mec6lku4_id"
+                        );
+                partsTaskData.put("associationFormField_mifp03ea",supplierBuyerDataAssSupplier);    //供应商
+                partsTaskData.put("textField_mifp03ez",supplierBuyerDataAssSupplier.get(0).subTitle); // 供应商编号
+            }
+            partsTaskData.put("textField_mmikzhlb","包装"); //里程碑
+            System.out.println("保存配件任务数据(包装):"+ JSONObject.toJSONString(partsTaskData));
+            ydClient.operateData(
+                    YDParam.builder()
+                            .formUuid(EastarParam.YD_FORMUUID_CGTASK)
+                            .formDataJson(JSONObject.toJSONString(partsTaskData))
+                            .build(),
+                    YDConf.FORM_OPERATION.create
+            );
+        }
+
+        return null;
     }