2 Комити f42c063f11 ... 9f8ab63f13

Аутор SHA1 Порука Датум
  lvjs 9f8ab63f13 新增销售项目状态变更同步AI表格接口 пре 1 месец
  lvjs 93c209903c 更换项目台账到配件任务的自动创建接口 пре 1 месец

+ 1 - 1
src/main/java/com/malk/eastar/conf/EastarParam.java

@@ -9,7 +9,7 @@ public class EastarParam {
     public static Map<String,String> TFNAME_YDKEY=new HashMap<>(); //状态(阶段)对应项目表KEY
     public static String YD_FORMUUID_PROJECT="FORM-D8DFF1F8C07A4869BCC850090F3A3B4EE0AV"; // 立项流程
     public static String YD_FORMUUID_RECOD="FORM-64A758B8173341879B24D612E180BE997E0B"; // TB项目档案
-    public static String YD_FORMUUID_GYS_YW="FORM-3AB247087A81401F87264BFA74944BE3R086"; // 供应商-业务对应表
+    public static String YD_FORMUUID_GYS_YW="FORM-3AB247087A81401F87264BFA74944BE3R086"; // 供应商跟单员档案
     public static String YD_FORMUUID_SKU_TYPE="FORM-17E244F3FB2240EB930E6DD4E22C7F89KXAR"; // 品类表
     public static String YD_FORMUUID_CGTASK="FORM-B9CBFB34DB3249C483415EF641202AC199J9"; // 采购任务表
     public static String YD_FORMUUID_ORDER="FORM-A731443BE0F04467A5D7FC1A82431D6AL2JO"; // 订单表

+ 53 - 0
src/main/java/com/malk/eastar/controller/AitableController.java

@@ -9,6 +9,7 @@ import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 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.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -166,4 +167,56 @@ public class AitableController {
         }
     }
 
+
+    /**
+     * 销售项目状态变更
+     * @param data
+     * @return
+     */
+    @PostMapping("/changeOpportunity")
+    McR changeSaleProjectStatus(@RequestBody JSONObject data) {
+        log.info("销售项目状态变更, {}", data);
+        McException.assertParamException_Null(data, "aitableId");
+        String aitableId = UtilMap.getString(data, "aitableId");
+        String yidaSaleProjectStatus = UtilMap.getString(data, "yidaSaleProjectStatus");  //销售项目状态
+        String yidaOrderAmount = UtilMap.getString(data, "yidaOrderAmount"); //预计项目金额
+        String yidaActualOrderDate = UtilMap.getString(data, "yidaActualOrderDate"); //实际成单日期
+        Map<String,Object> fields = new HashMap<>();
+        try {
+            String aiTableOrderStatus = ""; //订单状态 - S1~3【商机进度】
+            String aiTableOpportunityStage = ""; //商机阶段 - S1~3【商机进度】
+            if(yidaSaleProjectStatus != null && !yidaSaleProjectStatus.isEmpty()){
+                if("报价中".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "2、报价中";
+                    aiTableOpportunityStage = "RFQ";
+                }else if("提前打样 / 修图".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "3、提前打样 / 修图";
+                }else if("订单确认".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "4、订单确认";
+                    aiTableOpportunityStage = "已成单";
+
+                }else if("已立项".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "5、已立项";
+                }else if("暂停".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "6、暂停";
+                }else if("已完成".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "7、已完成";
+                }else if("已终止".equals(yidaSaleProjectStatus)){
+                    aiTableOrderStatus = "8、已终止";
+                    aiTableOpportunityStage = "已丢单";
+                }
+                fields.put("31G4UB7",aiTableOrderStatus);   //订单状态 - S1~3【商机进度】
+                if(StringUtils.isNotEmpty(aiTableOpportunityStage)){
+                    fields.put("LQF6OWD",aiTableOpportunityStage);   //商机阶段 - S1~3【商机进度】
+                }
+                fields.put("VBsHxPE",Long.parseLong(yidaActualOrderDate));  //实际成单日期 - S3【销售数据】
+                fields.put("MYBeHPG",Double.parseDouble(yidaOrderAmount));  //订单金额 - S2~3【销售数据】
+                aitableService.updateSys1SaleData(aitableId,fields);
+            }
+            return McR.success();
+        } catch (Exception e) {
+            return McR.error("400",e.getMessage());
+        }
+    }
+
 }

+ 2 - 1
src/main/java/com/malk/eastar/controller/EastarTbController.java

@@ -24,8 +24,9 @@ public class EastarTbController {
 
     /**
      * 保存任务,如无项目自动创建
+     * 备注:该接口已停用,已改为不含TB的新接口:/yida/addtask
      */
-    @PostMapping("task/save")
+//    @PostMapping("task/save")
     McR createProject(@RequestBody JSONObject data) {
         log.info("通过模板创建项目, {}", data);
         McException.assertParamException_Null(data, "formInstId");

+ 1 - 1
src/main/java/com/malk/eastar/controller/EastarYidaController.java

@@ -47,7 +47,7 @@ public class EastarYidaController {
     /**
      * 【立项/项目台账】→【配件任务表】数据流转
      */
-//    @PostMapping("/addtask")
+    @PostMapping("/addtask")
     McR createPartsTask(@RequestBody JSONObject data) {
         log.info("【立项/项目台账】→【配件任务表】数据流转, {}", data);
         McException.assertParamException_Null(data, "formInstId");

+ 6 - 0
src/main/java/com/malk/eastar/service/AitableService.java

@@ -40,4 +40,10 @@ public interface AitableService {
      */
     String addSys1SaleData(Map<String,Object> fields) throws Exception;
 
+    /**
+     * 更新销售台账记录
+     * @throws Exception
+     */
+    String updateSys1SaleData(String id,Map<String,Object> fields) throws Exception;
+
 }

+ 37 - 0
src/main/java/com/malk/eastar/service/impl/AitableServiceImpl.java

@@ -446,5 +446,42 @@ public class AitableServiceImpl implements AitableService {
         return aitableId;
     }
 
+    @Override
+    public String updateSys1SaleData(String id,Map<String, Object> fields) throws Exception {
+        /*
+            参数定义
+         */
+        String baseId; //AI表格文档ID
+        String sheetIdOrName;   //数据表ID或数据表名称
+        Map<String,Object> param = new HashMap<>(); //HTTP请求参数
+        JSONObject updateData = new JSONObject();   //HTTP请求体
+        JSONArray updateRecords = new JSONArray();  //更新记录集合
+        JSONObject updateRecord = new JSONObject();      //更新记录行数据
+        String result;  //返回结果
+
+        /*
+            项目总表
+         */
+        baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
+        sheetIdOrName = "C1mtX34";
+
+        /*
+            初始化参数值
+         */
+        param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE");  //操作人(Jason)的unionId
+        updateRecord.put("id",id);
+        updateRecord.put("fields",fields);
+        updateRecords.add(updateRecord);
+        updateData.put("records",updateRecords);
+
+        /*
+            更新数据
+         */
+        log.info(JSONObject.toJSONString(updateData));
+        result = mdTableClient.modifyMultiRecords(baseId,sheetIdOrName,param,updateData);
+        log.info(result);
+        return result;
+    }
+
 
 }

+ 137 - 90
src/main/java/com/malk/eastar/service/impl/YidaServiceImpl.java

@@ -59,64 +59,67 @@ public class YidaServiceImpl implements YidaService {
 
         /*
             查询项目数据
-            【立项/项目台账】   FORM-D8DFF1F8C07A4869BCC850090F3A3B4EE0AV
+            【项目台账】   FORM-D8DFF1F8C07A4869BCC850090F3A3B4EE0AV
          */
         Map projectData = ydClient.queryData(
                 YDParam.builder().formInstId(formInstId).build(),
                 YDConf.FORM_QUERY.retrieve_id
-        ).getFormData();    //【立项/项目台账】数据,旧变量名 -> data
-        String projectCode = UtilMap.getString(projectData,"textField_me2hyldc");  // 项目编号,旧变量名 -> pId
-        System.out.println("项目编码:"+projectCode);
-        String projectName = UtilMap.getString(projectData,"textField_me87x1nz");    // 项目名称,旧变量名 -> pName
-        System.out.println("项目名称:"+projectName);
+        ).getFormData();    //【项目台账】数据,旧变量名 -> data
+        String projectCode = UtilMap.getString(projectData,"textField_me2hyldc");  // 项目编号(立项流程),旧变量名 -> pId
+        log.info("项目编号(立项流程):"+projectCode);
+        String projectName = UtilMap.getString(projectData,"textField_me87x1nz");    // 项目名称(立项流程),旧变量名 -> pName
+        log.info("项目名称(立项流程):"+projectName);
+        String testFlag = UtilMap.getString(projectData,"radioField_mp4t9q57");  //测试使用
+        log.info("测试使用:"+testFlag);
         //String pTaskType = UtilMap.getString(projectData,"textField_mfqnsa9d");    // TB任务类型名称
-        String customerName = UtilMap.getString(projectData,"textField_me87x1o0");  // 客户名称,旧变量名 -> merName
-        System.out.println("客户名称:"+customerName);
+        String customerName = UtilMap.getString(projectData,"textField_me87x1o0");  // 客户公司名(英文名),旧变量名 -> merName
+        log.info("客户公司名(英文名):"+customerName);
         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
-        List<String> qeUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me9n24ka_id");  // QE(质量工程师 Quality Engineer)userid
+        List<String> ssUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me2hyld9_id");  // 业务员 userid
+        List<String> ssmUserId = (List<String>) UtilMap.getList(projectData, "employeeField_mp6mn6je_id");  // 业务组长 userid
+        List<String> pmUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me2hyld8_id");  // PM userid
+        List<String> qaUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me9n24ka_id");  // QA userid
         List<UtilMap.assDetail> projectDataAssLeads = UtilMap.getAssFieldValue(
                 projectData,"associationFormField_mdy7w1wn_id"
-        );  //【立项/项目台账】关联表单【销售项目】
-        String leadsCode = UtilMap.getString(projectData,"textField_me2hyldb");  // 项目编号,旧变量名 -> pMainId
-        System.out.println("线索编码:"+leadsCode);
-        String leadsName = UtilMap.getString(projectData,"textField_me9n24kq");    // 项目名称,旧变量名 -> pMainName
-        System.out.println("线索名称:"+leadsName);
+        );  //【项目台账】关联表单【销售项目】
+        String leadsCode = UtilMap.getString(projectData,"textField_me2hyldb");  // 项目编号,旧变量名 -> pMainId
+        log.info("项目编号:"+leadsCode);
+        String leadsName = UtilMap.getString(projectData,"textField_me9n24kq");    // 项目名称,旧变量名 -> pMainName
+        log.info("项目名称:"+leadsName);
         String devNumFlag = UtilMap.getString(projectData,"radioField_mmkb0vkc");  //研发部是否需要留样
-        System.out.println("研发部是否需要留样:"+devNumFlag);
+        log.info("研发部是否需要留样:"+devNumFlag);
         List<UtilMap.assDetail> projectDataAssOrder = UtilMap.getAssFieldValue(
                 projectData,"associationFormField_me2hylda_id"
-        );  //【立项/项目台账】关联表单【制作新订单】,旧变量名 -> projectOrder
+        );  //【项目台账】关联表单【销售订单】,旧变量名 -> projectOrder
         List<Map> projectSubDataPlan = UtilMap.getList(
                 projectData,"tableField_mgu5rm3e"
-        ); // 【立项/项目台账】子表单【项目计划】,旧变量名 -> projectPlan
+        ); // 【项目台账】子表单【项目计划】,旧变量名 -> projectPlan
         List<Map> projectSubDataParts = ydService.queryDetails(
                 YDParam.builder()
                         .formInstanceId(formInstId)
                         .formUuid(EastarParam.YD_FORMUUID_PROJECT)
                         .tableFieldId("tableField_mdy8x198").build()
-        );  // 【立项/项目台账】子表单【全品类】,旧变量名 -> table
+        );  // 【项目台账】子表单【全品类】,旧变量名 -> table
         List<Map> projectSubDataLang = ydService.queryDetails(
                 YDParam.builder()
                         .formInstanceId(formInstId)
                         .formUuid(EastarParam.YD_FORMUUID_PROJECT)
                         .tableFieldId("tableField_mn6vamoe").build()
-        );  // 【立项/项目台账】子表单【语言版本 - 数量拆分】
+        );  // 【项目台账】子表单【语言版本 - 数量拆分】
         List<Map> projectSubDataBuyer = UtilMap.getList(
                 projectData,"tableField_mec6juik"
-        );  // 【立项/项目台账】子表单【采购跟单明细】,旧变量名 -> mchTable
+        );  // 【项目台账】子表单【跟单员列表】,旧变量名 -> mchTable
 
         /*
             查询销售订单数据
-            【制作新订单】   FORM-A731443BE0F04467A5D7FC1A82431D6AL2JO
+            【销售订单】   FORM-A731443BE0F04467A5D7FC1A82431D6AL2JO
          */
         String orderId = projectDataAssOrder.get(0).instanceId; // 销售订单实例ID,旧变量名 -> orderFid
         Map orderData = ydClient.queryData(
                 YDParam.builder().formInstId(orderId).build(),
                 YDConf.FORM_QUERY.retrieve_id
-        ).getFormData();    //【制作新订单】数据
+        ).getFormData();    //【销售订单】数据
         int sampleNum;  //套装样品数量
         Object demoValue = orderData.get("textField_me2f7tvd"); //套装样品及数量(单行文本类型)
         // 检查值是否为 Integer 类型
@@ -136,8 +139,8 @@ public class YidaServiceImpl implements YidaService {
             System.err.println("套装样品及数量字段值不是整数!");
             sampleNum = 0;
         }
-        List<Map> orderSubDataSeries = UtilMap.getList(orderData,"tableField_mesc7nvj");    // 【制作新订单】子表单【系列套数】,旧变量名 -> xlConf
-        System.out.println("【制作新订单】子表单【系列套数】");
+        List<Map> orderSubDataSeries = UtilMap.getList(orderData,"tableField_mesc7nvj");    // 【销售订单】子表单【系列套数】,旧变量名 -> xlConf
+        System.out.println("【销售订单】子表单【系列套数】");
         String codeSeries;
         String nameSeries;
         int numOfSetsSeries;    //套数
@@ -147,8 +150,8 @@ public class YidaServiceImpl implements YidaService {
             numOfSetsSeries = UtilMap.getInt(orderSubRecordSeries,"numberField_mesc7nvi");    // 套数【系列套数】
             System.out.println("系列:"+nameSeries+",系列编号:"+codeSeries+",套数:"+numOfSetsSeries);
         }
-        List<Map> orderSubDataLang = UtilMap.getList(orderData,"tableField_meqqj4we");  // 【制作新订单】子表单【语言版本 - 数量拆分】,旧变量名 -> orderLangConf
-        System.out.println("【制作新订单】子表单【语言版本 - 数量拆分】");
+        List<Map> orderSubDataLang = UtilMap.getList(orderData,"tableField_meqqj4we");  // 【销售订单】子表单【语言版本 - 数量拆分】,旧变量名 -> orderLangConf
+        System.out.println("【销售订单】子表单【语言版本 - 数量拆分】");
         String codeLang;
         String nameLang;
         int numOfSetsAll;   //总套数
@@ -170,11 +173,11 @@ public class YidaServiceImpl implements YidaService {
         String supplier;
         String buyerUserId;
         Map<String,String> supplierBuyerMap = new HashMap<>();  //供应商与采购跟单userid映射,旧变量名 -> mchDDIdMap
-        for (Map projectSubRecordBuyer : projectSubDataBuyer){    //遍历子表单记录,旧变量名 -> map
+        for (Map projectSubRecordBuyer : projectSubDataBuyer){    //遍历跟单员列表,旧变量名 -> map
             buyerUserId = String.valueOf(
-                    UtilMap.getList(projectSubRecordBuyer, "employeeField_me9n24kl_id") //采购跟单
+                    UtilMap.getList(projectSubRecordBuyer, "employeeField_me9n24kl_id") //跟单
                             .get(0)
-            );  //采购跟单userid,旧变量名 -> ddId
+            );  //跟单userid,旧变量名 -> ddId
             if(!buyerUserIdList.contains(buyerUserId)){
                 buyerUserIdList.add(buyerUserId);
             }
@@ -184,23 +187,23 @@ public class YidaServiceImpl implements YidaService {
 
         /*
             查询配件类型信息
-            【品类】  FORM-17E244F3FB2240EB930E6DD4E22C7F89KXAR
+            【品类档案】  FORM-17E244F3FB2240EB930E6DD4E22C7F89KXAR
          */
         List<Map> partsTypeData = ydService.queryAllFormData(
                 YDParam.builder().formUuid(EastarParam.YD_FORMUUID_SKU_TYPE).build()
-        );  // 【品类】数据,旧变量名 -> skuTypeListConfigData
+        );  // 【品类档案】数据,旧变量名 -> skuTypeListConfigData
         Map partsTypeNameCodeMap = ConfigDataProcessor.skuTypeListConfigData(partsTypeData);  // 品类名称与配件编号(这里的配件编号应该是品类编码)映射,旧变量名 -> skuIdMap
 
         /*
             查询配件参数信息
-            【配件状态】  FORM-760F4001E1C743BA8527721F7217E068534G
+            【配件状态档案】  FORM-760F4001E1C743BA8527721F7217E068534G
          */
         List<Map> partsConfSubDataDetails = ydService.queryDetails(
                 YDParam.builder()
                         .formInstanceId("FINST-X1B66Y81IUFY9U417XIUE99I8YV93HGMJ8WEMF")
                         .formUuid(EastarParam.YD_FORMUUID_SONCONF)
                         .tableFieldId("tableField_mew7d9f3").build()
-        );  // 【配件状态】子表单【明细】,旧变量名 -> sonConfData
+        );  // 【配件状态档案】子表单【明细】,旧变量名 -> sonConfData
         Map<String,Map<String,List<String>>>  partsConfMap = ConfigDataProcessor.processConfigData(
                 partsConfSubDataDetails
         );  //配件参数信息(按配件大类分组),旧变量名 -> sonConf
@@ -222,7 +225,7 @@ public class YidaServiceImpl implements YidaService {
          */
         Map<String,String> seriesLangDevNumMap = new HashMap<>();  //系列语言与研发部订单需求数量映射数据
         String devNum;  //研发部订单需求数量
-        for(Map projectSubRecordLang : projectSubDataLang) { //遍历【立项/项目台账】子表单【语言版本 - 数量拆分】数据
+        for(Map projectSubRecordLang : projectSubDataLang) { //遍历【项目台账】子表单【语言版本 - 数量拆分】数据
             nameSeries = UtilMap.getString(projectSubRecordLang,"textField_mn6vamof");    //系列
             nameLang = UtilMap.getString(projectSubRecordLang,"textField_mn6vamoh");    //语言
             if(PublicUtil.isNull(nameLang)){
@@ -243,7 +246,7 @@ public class YidaServiceImpl implements YidaService {
         Map<String,List<String>> partsConfMapByMajorType; //配件参数信息(某配件大类),旧变量名 -> sonconfs
         List<String> phaseDeliverablesList; //阶段产出物列表
         List<String> partsMajorTypePhaseDeliverables;   //配件大类与产出物列表,旧变量名 -> sonconf
-        for(Map projectSubRecordParts : projectSubDataParts){ //遍历【立项/项目台账】子表单【全品类】数据,旧变量名 -> map
+        for(Map projectSubRecordParts : projectSubDataParts){ //遍历【项目台账】子表单【全品类】数据,旧变量名 -> map
             /*
                 获取配件大类与产出物列表
              */
@@ -276,7 +279,7 @@ public class YidaServiceImpl implements YidaService {
             }
             partsTaskSubData.addAll(partsRecordList);
         }
-        System.out.println("配件任务明细数量="+partsTaskSubData.size());
+        log.info("配件任务明细数量="+partsTaskSubData.size());
 
         /*
             按项目阶段拆解配件任务数据
@@ -289,12 +292,12 @@ public class YidaServiceImpl implements YidaService {
         String partsTaskOrderType;  //订单类型【配件任务表】,旧变量名 -> taskType
         String purchaseType;    //采购类型,旧变量名 -> procuremenType
         Map<String, Object> partsRecordNew;  //配件记录(新),旧变量名 -> copiedMap
-        List<Map> supplierBuyerData;  //【跟单-供应商对应表】数据,旧变量名 -> gysList
-        List<UtilMap.assDetail> supplierBuyerDataAssSupplier;    //【跟单-供应商对应表】关联表单【供应商】,旧变量名 -> gys
+        List<Map> supplierBuyerData;  //【供应商跟单员档案】数据,旧变量名 -> gysList
+        List<UtilMap.assDetail> supplierBuyerDataAssSupplier;    //【供应商跟单员档案】关联表单【供应商】,旧变量名 -> gys
         String numOfSets;   //工厂采购数量
         int allSupplyNum;   //总采购数量
         for(String projectPhase : projectPhaseList){ //遍历项目包含阶段,旧变量名 -> jd
-            System.out.println("项目阶段:"+projectPhase);
+            log.info("项目阶段:"+projectPhase);
             if(partsTaskPhaseList.contains(projectPhase)){
                 /*
                     获取当前阶段计划结束时间
@@ -303,6 +306,7 @@ public class YidaServiceImpl implements YidaService {
                 for(Map projectSubRecordPlan : projectSubDataPlan){    //遍历项目计划阶段
                     if(projectPhase.equals(UtilMap.getString(projectSubRecordPlan,"textField_mgu5rm3f"))){   //阶段匹配成功
                         projectPhasePlanEndTime = UtilMap.getLong(projectSubRecordPlan,"dateField_mgu5rm3h");    //计划结束时间,旧变量名 -> planTimestamp
+                        log.info("计划结束时间:"+DateUtil.formatDate(new Date(projectPhasePlanEndTime)));
                     }
                 }
                 for (String keySupplier : partsRecordListBySupplier.keySet()){ //遍历采购需求数据,旧变量名 -> key
@@ -327,9 +331,9 @@ public class YidaServiceImpl implements YidaService {
                                 }
                             }
                             partsRecordNew = new HashMap<>(partsRecord); // 关键:创建副本
+                            partsRecordNew.put("dateField_mizvc5oi", projectPhasePlanEndTime); //考核日期(采购明细)
                             partsRecordNew.put("numberField_mmmwu4ci",0);    //总采购数量(废弃)
                             partsRecordNew.put("numberField_mifp03el",allSupplyNum);   //工厂采购数量
-                            partsRecordNew.put("dateField_mizvc5oi", projectPhasePlanEndTime); //考核日期
                             partsTaskSubDataNew.add(partsRecordNew);
                         } else{
                             if("大货样".equals(projectPhase)){
@@ -340,11 +344,11 @@ public class YidaServiceImpl implements YidaService {
                             purchaseType ="样品任务";
                             partsTaskOrderType ="打样";
                             partsRecordNew = new HashMap<>(partsRecord); // 关键:创建副本
-                            partsRecordNew.put("dateField_mizvc5oi", projectPhasePlanEndTime); //考核日期
+                            partsRecordNew.put("dateField_mizvc5oi", projectPhasePlanEndTime); //考核日期(采购明细)
                             partsRecordNew.put("numberField_mkosp94h", sampleNum);   //客户订单数量
-                            partsRecordNew.put("numberField_mifp03el", sampleNum);   //工厂采购数量
                             partsRecordNew.put("numberField_mmmwu4cg",0);    //研发部订单需求数量
                             partsRecordNew.put("numberField_mmmwu4ci",0);    //总采购数量(废弃)
+                            partsRecordNew.put("numberField_mifp03el", sampleNum);   //工厂采购数量
                             partsTaskSubDataNew.add(partsRecordNew);
                         }
                     }
@@ -354,23 +358,34 @@ public class YidaServiceImpl implements YidaService {
                                     "tableField_mifp03em, " +   //采购明细
                                     "selectField_mkf6qv9b, " +  //采购类型
                                     "dateField_mifp03eb, " +    //计划完成日期
-                                    "selectField_ml0l206x", //订单类型
+                                    "selectField_ml0l206x, "+   //订单类型
+                                    "employeeField_mp6muk63, "+   //业务员
+                                    "employeeField_mp6muk64, "+   //业务组长
+                                    "employeeField_mp6muk65, "+   //PM
+                                    "employeeField_mp6muk66, "+   //QA
+                                    "radioField_mp6hn7xp",  //测试使用
                             //tbProjectId,
                             partsTaskStatus,
                             partsTaskSubDataNew,
                             purchaseType,
                             projectPhasePlanEndTime,
-                            partsTaskOrderType
+                            partsTaskOrderType,
+                            ssUserId,
+                            ssmUserId,
+                            pmUserId,
+                            qaUserId,
+                            testFlag
                     );
                     partsTaskData.put("associationFormField_mifp03e9",projectDataAssOrder); //项目订单
                     partsTaskData.put("associationFormField_mifp03e8",projectDataAssLeads); // 销售项目
                     partsTaskData.put("textField_mifp03e6",projectName+"-"+keySupplier+"-"+projectPhase);   //任务名称
-                    partsTaskData.put("textField_mimwnauk",projectCode);    //项目订单编号
+                    partsTaskData.put("textField_mimwnauk",projectCode);    //项目编号(立项流程)
+                    partsTaskData.put("textField_mp6hqggg",projectName);    //项目名称(立项流程)
                     //supplierOrder.put("textField_mizs3841",pMainId);
                     partsTaskData.put("employeeField_mifp03eu",Arrays.asList(supplierBuyerMap.get(keySupplier))); //跟单负责人
                     /*
                         查询供应商与跟单数据
-                        【跟单-供应商对应表】  FORM-3AB247087A81401F87264BFA74944BE3R086
+                        【供应商跟单员档案】  FORM-3AB247087A81401F87264BFA74944BE3R086
                      */
                     supplierBuyerData = (List<Map>) ydClient.queryData(
                             YDParam.builder()
@@ -404,7 +419,7 @@ public class YidaServiceImpl implements YidaService {
                         保存配件任务数据(不含包装)
                         【配件任务表】 FORM-B9CBFB34DB3249C483415EF641202AC199J9
                      */
-                    System.out.println("保存配件任务数据("+projectPhase+"):"+ JSONObject.toJSONString(partsTaskData));
+                    log.info("保存配件任务数据("+projectPhase+"):"+ JSONObject.toJSONString(partsTaskData));
                     ydClient.operateData(
                             YDParam.builder()
                                     .formUuid(EastarParam.YD_FORMUUID_CGTASK)
@@ -420,13 +435,13 @@ public class YidaServiceImpl implements YidaService {
             生成包装任务(打样不需要生成包装)
          */
         if("大货".equals(projectOrderType)){
-            savePartsPackTaskData(null, orderSubDataLang, projectData, projectName, projectCode, leadsCode, projectDataAssOrder, supplierBuyerMap, seriesLangDevNumMap);
+            savePartsPackTaskData(null, orderSubDataLang, projectData, projectName, projectCode, leadsCode, projectDataAssOrder, supplierBuyerMap, seriesLangDevNumMap, projectSubDataPlan);
         }
 
 
         if("是".equals(devNumFlag)){  //研发部需要留样
             /*
-                更新【制作新订单】子表单【语言版本 - 数量拆分】的总套数
+                更新【销售订单】子表单【语言版本 - 数量拆分】的总套数
              */
             List<Map> orderSubDataLangNew = new ArrayList<>();
             for(Map orderSubRecordLang : orderSubDataLang){  //遍历子表单记录
@@ -445,7 +460,7 @@ public class YidaServiceImpl implements YidaService {
                 orderSubRecordLang.put("numberField_mmtymctd",numOfSetsAll);
                 orderSubDataLangNew.add(orderSubRecordLang);
             }
-            System.out.println("更新【制作新订单】数据:"+ JSONObject.toJSONString(orderSubDataLangNew));
+            log.info("更新【销售订单】数据:"+ JSONObject.toJSONString(orderSubDataLangNew));
             ydClient.operateData(
                     YDParam.builder()
                             .formInstId(orderId)
@@ -466,14 +481,14 @@ public class YidaServiceImpl implements YidaService {
      */
     private List<Map> getPartsRecordList(
             Map taskMap,    //TB相关,无用
-            List<Map> orderSubDataLangOrSeries, //销售订单子表单记录,【语言版本 - 数量拆分】明细数据或【系列套数】明细数据,旧变量名 -> orderConf
-            Map projectSubRecordParts,  //【立项/项目台账】子表单【全品类】某一行记录,旧变量名 -> cgDetail
+            List<Map> orderSubDataLang, //销售订单子表单记录,【语言版本 - 数量拆分】明细数据,旧变量名 -> orderConf
+            Map projectSubRecordParts,  //【项目台账】子表单【全品类】某一行记录,旧变量名 -> cgDetail
             List<Map> customfields, //TB相关,无用
             boolean isMultiLang, //是否存在多种语言版本,旧变量名 -> isLang
             List<String> partsPhaseDeliverables,   //配件状态明细(按配件大类分组),旧变量名 -> sonConf
             String sonScenariofieldconfigId,    //TB相关,无用
             String supplier,    //供应商,旧变量名 -> gysName
-            String projectCode, // 项目编号,旧变量名 -> pId
+            String projectCode, // 项目编号(立项流程),旧变量名 -> pId
             String leadsCode, // 线索编码,旧变量名 -> pMainId
             Map partsTypeNameCodeMap,    //品类名称与配件编号(这里的配件编号应该是品类编码)映射,旧变量名 -> skuIdMap
             Map<String,String> seriesLangDevNumMap  //系列语言与研发部订单需求数量映射数据
@@ -488,13 +503,14 @@ public class YidaServiceImpl implements YidaService {
         String numOfSets;   //套数【语言版本 - 数量拆分】或套数【系列套数】,旧变量名 -> value
         String devNum;  //研发部订单需求数量,旧变量名 -> rdNum
         String partsName;   //配件名称
-        Map partsRecord;  //配件记录,来源于【立项/项目台账】子表单【全品类】某一行记录,旧变量名 -> recod
-        for(Map orderSubRecordLangOrSeries : orderSubDataLangOrSeries){    //遍历子表单记录,旧变量名 -> map
-            nameSeries = UtilMap.getString_first(
-                    orderSubRecordLangOrSeries,
-                    "textField_meqqj4wa",   //系列【语言版本 - 数量拆分】
-                    "textField_mesc7nvf"    //系列【系列套数】
-            ); // 系列
+        Map partsRecord;  //配件记录,来源于【项目台账】子表单【全品类】某一行记录,旧变量名 -> recod
+        for(Map orderSubRecordLang : orderSubDataLang){    //遍历子表单记录,旧变量名 -> map
+//            nameSeries = UtilMap.getString_first(
+//                    orderSubRecordLang,
+//                    "textField_meqqj4wa",   //系列【语言版本 - 数量拆分】
+//                    "textField_mesc7nvf"    //系列【系列套数】
+//            ); // 系列
+            nameSeries = UtilMap.getString(orderSubRecordLang,"textField_meqqj4wa");    //系列【语言版本 - 数量拆分】
             if(!UtilMap.getString(projectSubRecordParts,"selectField_me2f7tw4").equals(nameSeries)){
                 // 系列【全品类】与系列【语言版本 - 数量拆分】或系列【系列套数】不匹配
                 continue;
@@ -505,9 +521,9 @@ public class YidaServiceImpl implements YidaService {
             docSN = UtilMap.getString(projectSubRecordParts,"textField_me2f7tvn");
             skuSN = "2"
                     + partsTypeCode
-                    + UtilMap.getString_first(orderSubRecordLangOrSeries,"textField_mizmmf8h","textField_mizmmf8m")   //系列编号【语言版本 - 数量拆分】 或 系列编号【系列套数】
+                    + UtilMap.getString_first(orderSubRecordLang,"textField_mizmmf8h","textField_mizmmf8m")   //系列编号【语言版本 - 数量拆分】
                     + docSN.substring(docSN.length()-2);  // sku 添加系列编号及文档编号
-            nameLang = UtilMap.getString(orderSubRecordLangOrSeries,"textField_meqqj4wb"); // 语言【语言版本 - 数量拆分】,旧变量名 -> lang
+            nameLang = UtilMap.getString(orderSubRecordLang,"textField_meqqj4wb"); // 语言【语言版本 - 数量拆分】,旧变量名 -> lang
             if(PublicUtil.isNull(nameLang)){
                 devNum = seriesLangDevNumMap.get(nameSeries+"_无");   //研发部订单需求数量
             }else{
@@ -518,20 +534,21 @@ public class YidaServiceImpl implements YidaService {
                     nameLang = "不区分";
                     skuSN = skuSN+"AL"; // sku 不区分语言
                 }
-                skuSN = skuSN + UtilMap.getString(orderSubRecordLangOrSeries,"textField_mizmmf8i"); // sku+语言编号
+                skuSN = skuSN + UtilMap.getString(orderSubRecordLang,"textField_mizmmf8i"); // sku+语言编号
             }else{
                 nameLang = "不区分";
                 skuSN = skuSN+"AL"; // sku 不区分语言
             }
             skuSN = skuSN + leadsCode.substring(leadsCode.length()-10); // sku+项目号
-            numOfSets = UtilMap.getString_first(
-                    orderSubRecordLangOrSeries,
-                    "numberField_meqqj4wd", // 套数【语言版本 - 数量拆分】
-                    "numberField_mesc7nvi"  // 套数【系列套数】
-            ); // 数量
+//            numOfSets = UtilMap.getString_first(
+//                    orderSubRecordLang,
+//                    "numberField_meqqj4wd", // 套数【语言版本 - 数量拆分】
+//                    "numberField_mesc7nvi"  // 套数【系列套数】
+//            ); // 数量
+            numOfSets = UtilMap.getString(orderSubRecordLang,"numberField_meqqj4wd");    // 套数【语言版本 - 数量拆分】
             partsName = nameSeries + "-" + partsTypeName;
             /*
-                复制【立项/项目台账】子表单【全品类】记录为配件记录,并补充部分字段
+                复制【项目台账】子表单【全品类】记录为配件记录,并补充部分字段
              */
             partsRecord = new HashMap(projectSubRecordParts);
             partsRecord.putAll(
@@ -539,25 +556,25 @@ public class YidaServiceImpl implements YidaService {
                             "textField_mecmytpr, " + //配件名称
                                     "textField_mecmytps, " + //TB任务编号
                                     //"textField_mecmytpt," +
-                                    "numberField_mifp03el, " +   //工厂采购数量
+                                    "numberField_mkosp94h, " +   //客户订单数量
                                     "numberField_mmmwu4cg, " +   //研发部订单需求数量
+                                    "numberField_mifp03el, " +   //工厂采购数量
                                     "textField_mifp03eo, " + //SKU编号
-                                    "textField_miib17jx, " + //项目订单编号
+                                    "textField_miib17jx, " + //项目编号
                                     "textField_mizvc5oj, " + //任务表明细实例标识
                                     "textField_mjr129o4, " + //语言
-                                    "numberField_mkosp94h, " +   //客户订单数量
                                     "numberField_me2f7tw0", //单价
                             partsName,
                             "~",
                             //"未开始",
                             numOfSets,
                             devNum,
+                            numOfSets,
                             skuSN,
                             projectCode,
                             "~",
                             nameLang,
-                            numOfSets,
-                            UtilMap.getString(orderSubRecordLangOrSeries, "numberField_mkf4bc4j")   //货值单价
+                            UtilMap.getString(orderSubRecordLang, "numberField_mkf4bc4j")   //货值单价
                     )
             );
             partsRecordList.add(partsRecord);
@@ -573,14 +590,15 @@ public class YidaServiceImpl implements YidaService {
      */
     private List<Map> savePartsPackTaskData(
             String tbProjectId, //TB相关,无用
-            List <Map> orderSubDataLang,   //【制作新订单】子表单【语言版本 - 数量拆分】数据,旧变量名 -> orderLangConf
-            Map projectData,   //【立项/项目台账】数据,旧变量名 -> data
+            List <Map> orderSubDataLang,   //【销售订单】子表单【语言版本 - 数量拆分】数据,旧变量名 -> orderLangConf
+            Map projectData,   //【项目台账】数据,旧变量名 -> data
             String projectName,   // 项目名称,旧变量名 -> pName
-            String projectCode, // 项目编号,旧变量名 -> pId
+            String projectCode, // 项目编号(立项流程),旧变量名 -> pId
             String leadsCode, // 线索编码,旧变量名 -> pMainId
-            List projectDataAssOrder,  //【立项/项目台账】关联表单【制作新订单】,旧变量名 -> projectOrder
+            List projectDataAssOrder,  //【项目台账】关联表单【销售订单】,旧变量名 -> projectOrder
             Map supplierBuyerMap,  //供应商与采购跟单userid映射,旧变量名 -> mchDDIdMap
-            Map<String,String> seriesDevNumMap  //系列与研发部订单需求数量映射数据
+            Map<String,String> seriesDevNumMap,  //系列与研发部订单需求数量映射数据
+            List<Map> projectSubDataPlan //【项目台账】子表单【项目计划】
     ) {
         Map<String, List<Map>> partsRecordListBySupplier = new HashMap<>();  // 供应商与采购需求关联数据,旧变量名 -> packOrderData
         Map partsRecord;   //配件记录,旧变量名 -> packTask
@@ -590,6 +608,16 @@ public class YidaServiceImpl implements YidaService {
         String nameLang;    //语言
         String devNum;  //研发部订单需求数量
         int allSupplyNum;   //总采购数量
+
+        log.info("项目阶段:包装");
+        long projectPhasePlanEndTime = 0;
+        for(Map projectSubRecordPlan : projectSubDataPlan){    //遍历项目计划阶段
+            if("包装".equals(UtilMap.getString(projectSubRecordPlan,"textField_mgu5rm3f"))){   //阶段匹配成功
+                projectPhasePlanEndTime = UtilMap.getLong(projectSubRecordPlan,"dateField_mgu5rm3h");    //计划结束时间,旧变量名 -> planTimestamp
+                log.info("计划结束时间:"+DateUtil.formatDate(new Date(projectPhasePlanEndTime)));
+            }
+        }
+
         for (Map orderSubRecordLang : orderSubDataLang) { //遍历子表单,旧变量名 -> orderMap
             supplier = UtilMap.getString(orderSubRecordLang, "textField_mkp7yv76"); //供应商
             numOfSets = UtilMap.getString(orderSubRecordLang, "numberField_meqqj4wd");  //套数
@@ -613,22 +641,28 @@ public class YidaServiceImpl implements YidaService {
                             "textField_mifp03eo, " +    //SKU编号
                             "textField_mjr129o4, " +    //语言
                             "selectField_me2f7tw4, " +  //系列
+                            "dateField_mizvc5oi, " +  //考核日期(采购明细)
                             "numberField_mkosp94h, " +  //客户订单数量
-                            "numberField_mifp03el, " +  //工厂采购数量
-                            "numberField_mmmwu4cg, " + //研发部订单需求数量
-                            "numberField_mmmwu4ci, ", //总采购数量(废弃)
+                            "numberField_mmmwu4cg, " +  //研发部订单需求数量
+                            "numberField_mmmwu4ci, " +  //总采购数量(废弃)
+                            "numberField_mifp03el", //工厂采购数量
                     UtilMap.getString(orderSubRecordLang, "textField_mizmmf8k"),    //成品名称
                     UtilMap.getString(orderSubRecordLang, "textField_mizmmf8j"),    //成品编号
                     UtilMap.getString(orderSubRecordLang, "textField_meqqj4wb"),    //语言
                     nameSeries,    //系列
+                    projectPhasePlanEndTime,   //考核日期(采购明细)
                     numOfSets,
-                    allSupplyNum,   //工厂采购数量
                     devNum, //研发部订单需求数量
-                    0 //总采购数量(废弃)
-
+                    0, //总采购数量(废弃)
+                    allSupplyNum    //工厂采购数量
             );
             partsRecordListBySupplier.computeIfAbsent(supplier, k -> new ArrayList<>()).add(partsRecord);
         }
+        List<String> ssUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me2hyld9_id");  // 业务员 userid
+        List<String> ssmUserId = (List<String>) UtilMap.getList(projectData, "employeeField_mp6mn6je_id");  // 业务组长 userid
+        List<String> pmUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me2hyld8_id");  // PM userid
+        List<String> qaUserId = (List<String>) UtilMap.getList(projectData, "employeeField_me9n24ka_id");  // QA userid
+        String testFlag = UtilMap.getString(projectData,"radioField_mp4t9q57");  //测试使用
         List<Map> partsRecordList;  //配件记录(按供应商区分),旧变量名 -> packdetails
         Map partsTaskData;  //配件任务数据,旧变量名 -> packTaskorder
         List<Map> supplierBuyerData;  //【跟单-供应商对应表】数据,旧变量名 -> gysList
@@ -640,19 +674,32 @@ public class YidaServiceImpl implements YidaService {
                             "selectField_mifp03e7, " +  //任务状态
                             "tableField_mifp03em, " +   //采购明细
                             "selectField_mkf6qv9b, " +  //采购类型
-                            "selectField_ml0l206x", //订单类型
+                            "selectField_ml0l206x, "+   //订单类型
+                            "employeeField_mp6muk63, "+   //业务员
+                            "employeeField_mp6muk64, "+   //业务组长
+                            "employeeField_mp6muk65, "+   //PM
+                            "employeeField_mp6muk66, "+   //QA
+                            "dateField_mifp03eb, " +  //考核日期
+                            "radioField_mp6hn7xp",  //测试使用
 //                    tbProjectId,
                     "待排期",
                     partsRecordList,
                     "成品包装",
-                    "包装"
+                    "大货",
+                    ssUserId,
+                    ssmUserId,
+                    pmUserId,
+                    qaUserId,
+                    projectPhasePlanEndTime,
+                    testFlag
             );
             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_mimwnauk",projectCode);    //项目编号(立项流程)
+            partsTaskData.put("textField_mp6hqggg",projectName);    //项目名称(立项流程)
 //            partsTaskData.put("textField_mizs3841",leadsCode);
             partsTaskData.put("employeeField_mifp03eu",Arrays.asList(supplierBuyerMap.get(keySupplier)));   //跟单负责人
             supplierBuyerData = (List<Map>) ydClient.queryData(