Kaynağa Gözat

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

xmy 1 ay önce
ebeveyn
işleme
1ac27f1e21

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

@@ -101,5 +101,12 @@ public class HeiHuOrderController {
         return McR.success(huOrderService.purchaseSchedule());
     }
 
+    /*todo:定时抓取修改采购订单*/
+    @SneakyThrows
+    @PostMapping("/testUpdate")
+    @Scheduled(cron = "0 3,8 * * * ?")
+    McR purchaseUpdateSchedule(){
+        return McR.success(huOrderService.purchaseUpdateSchedule());
+    }
 
 }

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

@@ -43,5 +43,6 @@ public interface HeiHuOrderService {
 
     /*采购订单定时同步*/
     McR purchaseSchedule() throws JacksonException;
+    McR purchaseUpdateSchedule() throws JacksonException;
 
 }

+ 479 - 2
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/Impl/HeiHuOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.malk.fenggefushi.service.Impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -1007,7 +1008,7 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
         header.put("X-AUTH", HeiHuAccessToken().getData().toString());
         header.put("Content-Type", "application/json");
         String targetValue = "合同确认,提交审批";
-        String targetValue1 = "合同修改,修改审批";
+//        String targetValue1 = "合同修改,修改审批";
         Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
 
         int pageNum = 1;
@@ -1043,7 +1044,8 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                     List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
                     if (customFieldValues != null) {
                         for (Map<String, Object> field : customFieldValues) {
-                            if (targetValue.equals(field.get("value") ) || targetValue1.equals(field.get("value"))) {
+//                            if (targetValue.equals(field.get("value") ) || targetValue1.equals(field.get("value"))) {
+                            if (targetValue.equals(field.get("value"))) {
                                 hasTargetStatus = true;
                                 break;
                             }
@@ -1401,7 +1403,482 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
 
         return null;
     }
+    @Override
+    public McR purchaseUpdateSchedule() throws JacksonException {
+        HashMap header = new HashMap();
+        header.put("X-AUTH", HeiHuAccessToken().getData().toString());
+        header.put("Content-Type", "application/json");
+        String targetValue = "合同修改,修改审批";
+        Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
+
+        int pageNum = 1;
+        int pageSize = 100;
+        boolean hasMoreData = true;
+        boolean isUpdate = false;
+
+        while (hasMoreData) {
+            HashMap body = new HashMap();
+            Map<String, Integer> page = new HashMap<>();
+            page.put("pageNum", pageNum);
+            page.put("pageSize", pageSize);
+            List<Integer> status = Arrays.asList(1);
+            body.put("page", page);
+            body.put("status", status);
+
+            String doPost = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);//查询采购订单
+
+            ObjectMapper mapper = new ObjectMapper();
+            Map<String, Object> response = mapper.readValue(doPost, Map.class);
+
+            if (!"01000000".equals(response.get("code"))) {
+                System.out.println("请求失败: " + response.get("msg"));
+                break;
+            }
+
+            List<Map<String, Object>> dataList = (List<Map<String, Object>>) response.get("data");
+            if (dataList != null) {
+                for (Map<String, Object> item : dataList) {
+                    String purchaserName = (String) item.get("purchaserName");
+                    if (purchaserName == null) purchaserName = "未知";
+
+                    boolean hasTargetStatus = false;
+                    List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
+                    if (customFieldValues != null) {
+                        for (Map<String, Object> field : customFieldValues) {
+                            if (targetValue.equals(field.get("value"))) {
+                                hasTargetStatus = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (hasTargetStatus) {
+                        String orderCode = (String) item.get("orderCode");
+                        if (orderCode != null) {
+                            purchaserOrderCodes.computeIfAbsent(purchaserName, k -> new ArrayList<>()).add(orderCode);
+                        }
+                    }
+                }
+
+                hasMoreData = dataList.size() >= pageSize;
+            } else {
+                hasMoreData = false;
+            }
+
+            pageNum++;
+
+            try {
+                Thread.sleep(200);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+
+        // 输出所有采购员的待审批订单
+        System.out.println("========== 所有采购员的待审批订单统计 ==========");
+
+        if (purchaserOrderCodes.isEmpty()) {
+            System.out.println("没有找到钉钉审批状态为'" + targetValue + "'的订单");
+        } else {
+            int totalPurchasers = purchaserOrderCodes.size();
+            int totalOrders = purchaserOrderCodes.values().stream().mapToInt(List::size).sum();
+
+            System.out.println("共找到 " + totalOrders + " 个待审批订单");
+            System.out.println("涉及 " + totalPurchasers + " 位采购员");
+            System.out.println();
+
+            // 输出每个采购员的情况
+            for (Map.Entry<String, List<String>> entry : purchaserOrderCodes.entrySet()) {
+                String purchaserName = entry.getKey();
+                List<String> orderCodes = entry.getValue();
+                int orderCount = orderCodes.size();
+
+                System.out.println("采购员: " + purchaserName);
+                System.out.println("待审批订单数量: " + orderCount);
+
+                if (orderCount > 1) {
+                    System.out.println("⚠️  注意:该采购员有 " + orderCount + " 个待审批订单");
+                }
+
+                System.out.println("订单编号: " + String.join(", ", orderCodes));
+                System.out.println();
+            }
+
+            // 按订单数量排序输出
+            System.out.println("========== 按待审批订单数量排序 ==========");
+            purchaserOrderCodes.entrySet().stream()
+                    .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
+                    .forEach(entry -> {
+                        String purchaserName = entry.getKey();
+                        List<String> orderCodes = entry.getValue();
+                        System.out.println(purchaserName + " (" + orderCodes.size() + "个): " +
+                                String.join(", ", orderCodes));
+
+                        // ========== 修改点1:声明两个列表分别存储不同毛利率的订单数据 ==========
+                        // 针对同一个采购员,遍历下面的订单编号
+                        System.out.println("开始处理采购员 " + purchaserName + " 的 " + orderCodes.size() + " 个待审批订单");
+
+                        // 高毛利率表单数据 (mlv >= 0.15)
+                        HashMap formdataHigh = new HashMap();
+                        List<Map<String,String>> tabledataHigh = new ArrayList();
+
+                        // 低毛利率表单数据 (mlv < 0.15)
+                        HashMap formdataLow = new HashMap();
+                        List<Map<String,String>> tabledataLow = new ArrayList();
+
+                        // ========== 修改点2:为每个订单创建临时存储列表 ==========
+                        // 用于暂存每个订单的明细数据,等计算出毛利率后再决定添加到哪个列表
+                        Map<String, List<Map<String, String>>> tempOrderDataMap = new HashMap<>();
+                        // 用于存储每个订单的汇总数据,用于计算毛利率
+                        Map<String, Map<String, Double>> orderSummaryForMlv = new HashMap<>();
+                        List<String> oldHighIds = new ArrayList<>();
+                        List<String> oldLowIds = new ArrayList<>();
+
+                        for (String orderCode : orderCodes) {
+                            System.out.println("正在处理订单: " + orderCode);
+
+                            // ========== 修改点3:为当前订单创建临时数据存储 ==========
+                            List<Map<String, String>> currentOrderRows = new ArrayList<>();
+                            double orderTotalSalesAmount = 0.0;
+                            double orderTotalPurchaseAmount = 0.0;
+                            double orderTotalFlygcb = 0.0;
+
+                            //todo:查询订单的销售订单 | 客户  销售订单号  款式  产品描述  颜色 | 数量  销售单价  销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
+                            String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
+                            Double number,unitPrice,salesAmount;
+                            String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
+                            Double estimatedPrice = 0.00;//辅料预估单价
+
+                            HashMap body = new HashMap();
+                            body.put("orderCode",orderCode);//订单编号
+                            String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);
+                            //todo:查询采购订单 生产工厂(供应商)
+                            String shortName = "";
+                            JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
+                            for (int i=0;i<dataArray.size();i++) {
+                                JSONObject data = dataArray.getJSONObject(i);
+                                shortName = data.getString("shortName");//供应商:shortName
+                            }
+                            JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
+                            ObjectMapper objectMapper = new ObjectMapper();
+                            JsonNode rootNode = null;
+                            try {
+                                rootNode = objectMapper.readTree(jsonString);
+                            } catch (JsonProcessingException e) {
+                                throw new RuntimeException(e);
+                            }
+                            JsonNode dataNode = rootNode.get("data");
+                            if(dataNode != null && dataNode.isArray()){
+                                for(JsonNode item : dataNode){
+                                    JsonNode orderNoNode = item.get("orderCode");
+                                    JsonNode saleOrders = item.get("relationSaleOrders");
+                                    if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
+                                        orderNumber = saleOrders.get(0).asText();//销售订单号
+                                    }
+                                }
+                            }
+
+                            HashMap body_A = new HashMap();
+                            body_A.put("orderNo",orderNumber);
+                            String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
+                            JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
+                            for(int i=0;i<array.size();i++){
+                                JSONObject data = array.getJSONObject(i);
+                                customerName = data.getString("customerCode");//客户
+                            }
+                            ObjectMapper objectMapper2 = new ObjectMapper();
+                            JsonNode dataNode2 = null;//主表数据
+                            try {
+                                dataNode2 = objectMapper2.readTree(jsonString2).get("data");
+                            } catch (JsonProcessingException e) {
+                                throw new RuntimeException(e);
+                            }
+                            for (JsonNode item : dataNode2){
+                                JsonNode customFieldValues = item.get("customFieldValues");
+                                for (JsonNode field : customFieldValues){
+                                    JsonNode fieldIdNode = field.get("fieldId");
+                                    if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
+                                        JsonNode valueNode = field.get("value");
+                                        if(valueNode != null){
+                                            estimatedPrice = valueNode.asDouble();//辅料预估单价
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+
+                            JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
+
+                            if(products_A != null) {
+                                for (int i = 0; i < products_A.size(); i++) {
+                                    JSONObject detail = products_A.getJSONObject(i);
+                                    HashMap row = new HashMap();
+                                    row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
+                                    row.put("textField_ml6g7k5e", customerName);//todo:客户
+                                    row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
+
+                                    styleNumber = detail.getString("productCode");//款号
+                                    row.put("textField_ml7c3yhq", styleNumber);//todo:款号
+
+                                    productDescription = detail.getString("productName");//产品描述
+                                    row.put("textField_ml7c3yhr", productDescription);//todo:产品描述
+
+                                    JSONArray array1 = detail.getJSONArray("customFieldValues");
+                                    color = array1.stream()
+                                            .map(obj -> (JSONObject) obj)
+                                            .filter(item -> item.getIntValue("fieldId") == 82259)
+                                            .map(item -> item.getString("value"))
+                                            .findFirst()
+                                            .orElse(null);
+                                    ArrayList colorList = new ArrayList();
+                                    colorList.add(color);
+                                    String color_AAA = null;
+                                    try {
+                                        color_AAA = getProductColor(colorList);
+                                    } catch (JacksonException e) {
+                                        throw new RuntimeException(e);
+                                    }
+                                    row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
+
+                                    number = detail.getDoubleValue("qty");//数量
+                                    row.put("numberField_ml7c3yht", number);//todo:数量
+
+                                    unitPrice = detail.getDoubleValue("unitPrice");//销售单价
+                                    row.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
+
+                                    salesAmount = number * unitPrice;//销售金额
+                                    row.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
+                                    String customFieldValues = detail.getString("customFieldValues");
+                                    ObjectMapper mapper = new ObjectMapper();
+                                    JsonNode jsonarray = null;
+                                    try {
+                                        jsonarray = mapper.readTree(customFieldValues);
+                                    } catch (JsonProcessingException e) {
+                                        throw new RuntimeException(e);
+                                    }
+                                    for (JsonNode node : jsonarray) {
+                                        if (node.get("fieldId").asInt() == 47919) {
+                                            currency = node.get("value").asText();
+                                        } else if (node.get("fieldId").asInt() == 165251) {
+                                            USDrate = node.get("value").asDouble();
+
+                                        } else if (node.get("fieldId").asInt() == 161783) {
+                                            flygcb = node.get("value").asDouble();
+                                        }
+                                    }
+                                    row.put("textField_ml7c3yhw", currency);//todo:币别
+                                    row.put("numberField_ml86221y", USDrate);//todo:美金汇率
+                                    row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
+                                    if(currency.equals("USD")){
+                                        saletotalAmount = salesAmount * USDrate;
+                                    }else {
+                                        saletotalAmount = salesAmount;
+                                    }
+                                    row.put("numberField_ml862220",saletotalAmount);
+                                    //下面是采购订单的明细数据
+                                    row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
+                                    for(int j=0;j<products.size();j++){
+                                        if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
+                                            //找到对应的采购一行数据
+                                            row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
+                                            row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
+                                            row.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
+                                        }
+                                    }
+
+                                    // ========== 修改点4:将当前行转换为Map<String,String>并暂存 ==========
+                                    Map<String, String> rowMap = new HashMap<>();
+                                    for (Object key : row.keySet()) {
+                                        Object value = row.get(key);
+                                        rowMap.put(key.toString(), value != null ? value.toString() : "");
+                                    }
+                                    currentOrderRows.add(rowMap);
+
+                                    // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
+                                    orderTotalSalesAmount += saletotalAmount;
+                                    orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
+                                    orderTotalFlygcb += flygcb;
+                                }
+                            }
+
+                            // ========== 修改点6:计算当前订单的毛利率 ==========
+                            double mlv = 0.0;
+                            if (orderTotalSalesAmount > 0) {
+                                mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
+                            }
+
+                            System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
+
+                            // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
+                            if (mlv >= 0.15) {
+                                // 高毛利率订单
+                                tabledataHigh.addAll(currentOrderRows);
+                                oldHighIds.add(orderCode);
+                                System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
+                            } else {
+                                // 低毛利率订单
+                                tabledataLow.addAll(currentOrderRows);
+                                oldLowIds.add(orderCode);
+                                System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
+                            }
+                        }
+
+                        // ========== 修改点8:分别处理高低毛利率的审批 ==========
+
+                        // 处理高毛利率的审批 (mlv >= 0.15)
+                        if (!tabledataHigh.isEmpty()) {
+                            System.out.println("\n========== 开始处理高毛利率审批(>=15%),共 " + tabledataHigh.size() + " 条明细 ==========");
+                            List<Map<String, Object>> oldList = new ArrayList<>();
+                            oldHighIds.forEach(h->{
+                                List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                                        .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                        .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
+                                        .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
+                                        .build());
+                                if (ObjectUtil.isNotNull(dataList) && dataList.size()>0){
+                                    List<Map> sonList = ydService.queryDetails(YDParam.builder()
+                                            .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                            .formInstanceId(UtilMap.getString(dataList.get(0),"textField_mmx9gycu"))
+                                            .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
+                                            .tableFieldId("tableField_ml6g7k5d")
+                                            .build());
+                                    if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
+                                        sonList.forEach(s->{
+                                            Map<String, Object> map = new HashMap<>();
+                                            TABLEFIELD_ENUM.forEach((k,v)->{
+                                                map.put(v,UtilMap.getString(s,k));
+                                            });
+                                            oldList.add(map);
+                                        });
+                                    }
+                                }
+                            });
+                            //组装数据塞到采购明细表
+                            formdataHigh.put("tableField_ml6g7k5d", tabledataHigh);
+                            formdataHigh.put("tableField_mmx6gata", oldList);
+
+                            //组装数据塞到采购审批单号明细
+                            List<Map<String, String>> orderSummaryListHigh = calculateOrderSummary(tabledataHigh);
+                            formdataHigh.put("tableField_ml7ch2pj", orderSummaryListHigh);
+
+                            //数值统计毛利率
+                            int szHigh = 0;
+                            for (Map map : orderSummaryListHigh) {
+                                Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
+                                log.info((String) numberFieldMm2t71jo);
+                                szHigh += Integer.parseInt((String) numberFieldMm2t71jo);
+                            }
+                            formdataHigh.put("numberField_mm2t71jp", szHigh);
+
+                            /*发起流程 - 高毛利率审批*/
+                            String userId = getDDToken(purchaserName);
+                            ydClient.operateData(YDParam.builder()
+                                    .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                    .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")  // 高毛利率使用原表单
+                                    .userId(userId)
+                                    .formDataJson(JSON.toJSONString(formdataHigh))
+                                    .build(), YDConf.FORM_OPERATION.start).toString();
+
+                            /*修改采购订单为审批中*/
+                            for (Map map : orderSummaryListHigh) {
+                                String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
+                                callback(textFieldMl7ch2pk);
+                            }
+
+                            System.out.println("高毛利率审批流程发起完成");
+                        }
+
+                        // 处理低毛利率的审批 (mlv < 0.15)
+                        if (!tabledataLow.isEmpty()) {
+                            System.out.println("\n========== 开始处理低毛利率审批(<15%),共 " + tabledataLow.size() + " 条明细 ==========");
+                            List<Map<String, Object>> oldList = new ArrayList<>();
+                            oldLowIds.forEach(h->{
+                                List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                                        .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                        .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
+                                        .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
+                                        .build());
+                                if (ObjectUtil.isNotNull(dataList) && dataList.size()>0){
+                                    List<Map> sonList = ydService.queryDetails(YDParam.builder()
+                                            .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                            .formInstanceId(UtilMap.getString(dataList.get(0),"textField_mmx9gycu"))
+                                            .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
+                                            .tableFieldId("tableField_ml6g7k5d")
+                                            .build());
+                                    if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
+                                        sonList.forEach(s->{
+                                            Map<String, Object> map = new HashMap<>();
+                                            TABLEFIELD_ENUM.forEach((k,v)->{
+                                                map.put(v,UtilMap.getString(s,k));
+                                            });
+                                            oldList.add(map);
+                                        });
+                                    }
+                                }
+                            });
+                            //组装数据塞到采购明细表
+                            formdataHigh.put("tableField_mmx6gata", oldList);
+                            //组装数据塞到采购明细表
+                            formdataLow.put("tableField_ml6g7k5d", tabledataLow);
+
+                            //组装数据塞到采购审批单号明细
+                            List<Map<String, String>> orderSummaryListLow = calculateOrderSummary(tabledataLow);
+                            formdataLow.put("tableField_ml7ch2pj", orderSummaryListLow);
+
+                            //数值统计毛利率
+                            int szLow = 0;
+                            for (Map map : orderSummaryListLow) {
+                                Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
+                                log.info((String) numberFieldMm2t71jo);
+                                szLow += Integer.parseInt((String) numberFieldMm2t71jo);
+                            }
+                            formdataLow.put("numberField_mm2t71jp", szLow);
+
+                            /*发起流程 - 低毛利率审批*/
+                            String userId = getDDToken(purchaserName);
+                            // ========== 修改点9:如果低毛利率需要不同表单,可以在这里修改formUuid ==========
+                            ydClient.operateData(YDParam.builder()
+                                    .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                    .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")  // 如果需要不同流程,替换这里的UUID
+                                    .userId(userId)
+                                    .formDataJson(JSON.toJSONString(formdataLow))
+                                    .build(), YDConf.FORM_OPERATION.start).toString();
 
+                            /*修改采购订单为审批中*/
+                            for (Map map : orderSummaryListLow) {
+                                String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
+                                callback(textFieldMl7ch2pk);
+                            }
+
+                            System.out.println("低毛利率审批流程发起完成");
+                        }
+
+                    });
+        }
+
+        return null;
+    }
+
+    private static final Map<String,String> TABLEFIELD_ENUM =new HashMap<>();
+    static {
+        TABLEFIELD_ENUM.put("textField_mm2t71jm","textField_mmx6gast");
+        TABLEFIELD_ENUM.put("textField_ml6g7k5e","textField_mmx6gasu");
+        TABLEFIELD_ENUM.put("textField_ml6g7k5f","textField_mmx6gasv");
+        TABLEFIELD_ENUM.put("textField_ml7c3yhq","textField_mmx6gasw");
+        TABLEFIELD_ENUM.put("textField_ml7c3yhr","textField_mmx6gasx");
+        TABLEFIELD_ENUM.put("textField_ml7c3yhs","textField_mmx6gasy");
+        TABLEFIELD_ENUM.put("numberField_ml7c3yht","numberField_mmx6gasz");
+        TABLEFIELD_ENUM.put("numberField_ml7c3yhu","numberField_mmx6gat0");
+        TABLEFIELD_ENUM.put("numberField_ml7c3yhv","numberField_mmx6gat1");
+        TABLEFIELD_ENUM.put("textField_ml7c3yhw","textField_mmx6gat2");
+        TABLEFIELD_ENUM.put("numberField_ml86221y","numberField_mmx6gat3");
+        TABLEFIELD_ENUM.put("numberField_ml86221z","numberField_mmx6gat4");
+        TABLEFIELD_ENUM.put("numberField_ml862220","numberField_mmx6gat5");
+        TABLEFIELD_ENUM.put("textField_ml7c3yhx","textField_mmx6gat6");
+        TABLEFIELD_ENUM.put("numberField_ml7c3yhy","numberField_mmx6gat7");
+        TABLEFIELD_ENUM.put("numberField_ml7c3yhz","numberField_mmx6gat8");
+        TABLEFIELD_ENUM.put("numberField_ml7c3yi0","numberField_mmx6gat9");
+    }
     /**
      * 根据orderCode对tabledata进行分类求和
      * @param tableData 原始明细数据

+ 2 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdDeliveryServiceImpl.java

@@ -149,6 +149,7 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
                     String sjr = safeGetString(item, "textField_mejnamf6");
                     String sjdh = safeGetString(item, "textField_mejnamf7");
                     String sjdz = safeGetString(item, "textareaField_mf6a0h5e");
+                    String bz1 = safeGetString(item, "textareaField_mf6a0h6q");
                     String zbq = safeGetString(item, "numberField_mf6a0h6v");
                     String kddh = safeGetString(item, "textField_mf6a0h6w");
                     String mdh = safeGetString(item, "textField_mf6a0h6y");
@@ -161,6 +162,7 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
                     table1Map.put("xsdw", xsdw);
                     table1Map.put("jjsl", jjsl);
 //                    table1Map.put("count", count);
+                    table1Map.put("bz1", bz1);
                     table1Map.put("ssxl", ssxl);
                     table1Map.put("yhrq", yhrq);
                     table1Map.put("sfzp", sfzp);

+ 32 - 8
mjava-lianan/src/main/java/com/malk/lianan/service/impl/LianAnGyServiceImpl.java

@@ -126,8 +126,12 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
 
         Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
 
-        Map result = gyPost("T0022", data);
+        String requestNo = gyPost("T0022", data);
 
+        ydClient.operateData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
+                .build(), YDConf.FORM_OPERATION.update);
 
         return McR.success();
     }
@@ -202,7 +206,14 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
         Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
 
         //工银-单笔付款
-        Map result = gyPost("T0002", data);
+        String requestNo = gyPost("T0002", data);
+
+        //回写请求号
+        ydClient.operateData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
+                .build(), YDConf.FORM_OPERATION.update);
+
 
         return McR.success();
     }
@@ -379,7 +390,13 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
 
         Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
 
-        Map result = gyPost("T0003", data);
+        String requestNo = gyPost("T0003", data);
+
+        //回写请求号
+        ydClient.operateData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
+                .build(), YDConf.FORM_OPERATION.update);
 
 
         return McR.success();
@@ -457,13 +474,19 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
 
         Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
 
-        Map result = gyPost("T0022", data);
+        String requestNo = gyPost("T0022", data);
+
+        //回写请求号
+        ydClient.operateData(YDParam.builder()
+                .formInstanceId(formInstId)
+                .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mmolqml1",requestNo)))
+                .build(), YDConf.FORM_OPERATION.update);
 
 
         return McR.success();
     }
 
-    private Map gyPost(String MesgNo,Map<String,Object> data){
+    private String gyPost(String MesgNo,Map<String,Object> data){
         log.info("data:{}",data);
 
         Map<String,Object> head = new HashMap<>();
@@ -472,7 +495,8 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
         head.put("Timestamp", UtilDateTime.getLocalDateTimeTimeStamp());
         head.put("SystemNo",GYPAY_API_SYS_ID);
         head.put("SystemName",GYPAY_API_SYS_NAME);
-        head.put("RequestNo", IdUtil.nanoId(6));
+        String requestNo = IdUtil.nanoId(6);
+        head.put("RequestNo", requestNo);
 
         Map<String,Object> body = new HashMap<>();
         String encrypt = AesUtil.encrypt(JSON.toJSONString(data),GYPAY_API_AES_KEY);
@@ -497,9 +521,9 @@ public class LianAnGyServiceImpl implements LianAnGyPayService {
         String resultData=AesUtil.decrypt(resultBody.getString("Data"),GYPAY_API_AES_KEY);
         System.out.println(resultData);
 
-        Map resultMap = (Map) JSONObject.parse(resultData);
+//        Map resultMap = (Map) JSONObject.parse(resultData);
 
-        return resultMap;
+        return requestNo;
     }
 
     private String getPayStatusName(String payStatus){

+ 489 - 125
mjava-siku/src/main/java/com/malk/siku/service/impl/SikuServiceImpl.java

@@ -76,8 +76,22 @@ public class SikuServiceImpl implements SikuService {
 
         Map result = MkBxUtil.saveTradingPartner(body);
 
-        //保存供应商账户
-        if ("供应商".equals(type)){
+        List<Map> data = UtilMap.getList(result, "data");
+
+        String status = UtilMap.getString(data.get(0), "status");
+
+        if ("ALL_FAIL".equals(status)){
+            //保存往来单位失败回写错误信息
+            String message = UtilMap.getString(data.get(0), "message");
+
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(formInstId)
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库失败",message)))
+                    .build(), YDConf.FORM_OPERATION.update);
+        }
+
+        //保存往来单位账户
+        if ("SUCCESS".equals(status)){
             Map account = new HashMap();
             account.put("businessCode",UtilMap.getString(formData,"serialNumberField_mketkvw4"));
 
@@ -89,7 +103,23 @@ public class SikuServiceImpl implements SikuService {
 
             account.put("accounts",Arrays.asList(accountItem));
 
-            MkBxUtil.saveAccount(Arrays.asList(account));
+            Map result2 = MkBxUtil.saveAccount(Arrays.asList(account));
+
+            List<Map> data2 = UtilMap.getList(result2, "data");
+            String status2 = UtilMap.getString(data2.get(0), "status");
+            if ("ALL_FAIL".equals(status2)){
+                String message = UtilMap.getString(data2.get(0), "message");
+
+                ydClient.operateData(YDParam.builder()
+                        .formInstanceId(formInstId)
+                        .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功,账号保存失败",message)))
+                        .build(), YDConf.FORM_OPERATION.update);
+            }else {
+                ydClient.operateData(YDParam.builder()
+                        .formInstanceId(formInstId)
+                        .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("selectField_mmx7nk6m, textareaField_mmx7nk6r","入库成功","")))
+                        .build(), YDConf.FORM_OPERATION.update);
+            }
         }
 
         return McR.success();
@@ -109,6 +139,9 @@ public class SikuServiceImpl implements SikuService {
 
         application.put("clientBizCode",UtilMap.getString(formData,"textField_mkxpe3fj"));//收票方bizCode(客户的业务编码(云票系统内维护的))与收票方开票信息字段二选一必填
 
+//        application.put("submitterBizCode","18857526310");//提交人工号,单据状态为审批中时必填  todo 暂时固定 周漂
+//        application.put("applicantBizCode","18857526310");//开票申请人工号 todo 暂时固定 周漂
+
         /*Map clientLegalEntityOaDto = new HashMap();//收票方开票信息(不在云票系统内维护的)与收票方bizCode(客户的业务编码)二选一必填且优先级高于收票方bizCode(客户的业务编码)(也就是当两字段都有值时,忽略客户的业务编码)
         clientLegalEntityOaDto.put("invoiceTitle",UtilMap.getString(formData,"selectField_mkxmix7e"));//名称
         clientLegalEntityOaDto.put("dutyParagraph",UtilMap.getString(formData,"textField_mm2wj87l"));//税号
@@ -217,46 +250,62 @@ public class SikuServiceImpl implements SikuService {
     public void invoiceWriteBack2(Map map) {
         //获取发票信息
         Map calloutParams = UtilMap.getMap(map, "calloutParams");
+        String serviceType = UtilMap.getString(map, "serviceType");
         Map bizData = UtilMap.getMap(calloutParams, "bizData");
 
-        String bizCode = UtilMap.getString(bizData, "bizCode");//发票号码
-        String invoiceNumber = UtilMap.getString(bizData, "invoiceNumber");//发票号码
-        String pdfUrl = UtilMap.getString(bizData, "pdfUrl");//pdf文件下载地址
-        String downloadPageUrl = UtilMap.getString(bizData, "downloadPageUrl");//发票下载页面链接
-        List<Map> detailItems = (List<Map>) UtilMap.getList(bizData, "detailItems");
-        List<Map> documentCorrelates = UtilMap.getList(detailItems.get(0), "documentCorrelates");
-        String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号
-
-        //回写宜搭
-        Map formData = new HashMap();
-        formData.put("radioField_mkxripcc","开票成功");
-        formData.put("textField_mkxripc6",invoiceNumber);
-        formData.put("textField_mm3aixk0",downloadPageUrl);
-        formData.put("textareaField_mmlzqvn0","");
-
-        if (Strings.isNotBlank(pdfUrl)){
-            String fileName = invoiceNumber + ".pdf";
-            String downloadPath = downloadFilePath + fileName;
-            downloadFile(pdfUrl,downloadPath);//下载pdf发票
-
-            String downloadUri = downloadUrl + "/files/" + fileName + "?option=download" + fileName;
-            String previewUri = downloadUrl + "/files/"+fileName+"?option=preview" + fileName;
-
-            Map attachmentField = new HashMap();
-            attachmentField.put("downloadUrl",downloadUri);
-            attachmentField.put("name",fileName);
-            attachmentField.put("previewUrl",previewUri);
-            attachmentField.put("url",downloadUri);
-            attachmentField.put("ext","pdf");
-            formData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
+        if ("INVOICE_VAT_INVOICED_NOTIFY_AR".equals(serviceType)){
+            //发票开具成功后回调
+            String bizCode = UtilMap.getString(bizData, "bizCode");//发票号码
+            String invoiceNumber = UtilMap.getString(bizData, "invoiceNumber");//发票号码
+            String pdfUrl = UtilMap.getString(bizData, "pdfUrl");//pdf文件下载地址
+            String downloadPageUrl = UtilMap.getString(bizData, "downloadPageUrl");//发票下载页面链接
+            List<Map> detailItems = (List<Map>) UtilMap.getList(bizData, "detailItems");
+            List<Map> documentCorrelates = UtilMap.getList(detailItems.get(0), "documentCorrelates");
+            String lsh = UtilMap.getString(documentCorrelates.get(0), "bizCode");//开票申请单编号
+
+            //回写宜搭
+            Map formData = new HashMap();
+            formData.put("radioField_mkxripcc","开票成功");
+            formData.put("textField_mkxripc6",invoiceNumber);
+            formData.put("textField_mm3aixk0",downloadPageUrl);
+            formData.put("textareaField_mmlzqvn0","");
+
+            if (Strings.isNotBlank(pdfUrl)){
+                String fileName = invoiceNumber + ".pdf";
+                String downloadPath = downloadFilePath + fileName;
+                downloadFile(pdfUrl,downloadPath);//下载pdf发票
+
+                String downloadUri = downloadUrl + "/files/" + fileName + "?option=download" + fileName;
+                String previewUri = downloadUrl + "/files/"+fileName+"?option=preview" + fileName;
+
+                Map attachmentField = new HashMap();
+                attachmentField.put("downloadUrl",downloadUri);
+                attachmentField.put("name",fileName);
+                attachmentField.put("previewUrl",previewUri);
+                attachmentField.put("url",downloadUri);
+                attachmentField.put("ext","pdf");
+                formData.put("attachmentField_mkxripc5",Arrays.asList(attachmentField));
+            }
+
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(bizCode)
+                    .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh)))
+                    .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
+                    .formDataJson(JSONObject.toJSONString(formData))
+                    .build(), YDConf.FORM_OPERATION.upsert);
+
+        }else if ("INVOICE_APPLICATION_VAT_FAIL_NOTIFY_AR".equals(serviceType)){
+            //开票失败后回调
+
+            String invoiceErrorMsg = UtilMap.getString(bizData, "invoiceErrorMsg");
+
+            String bizCode = UtilMap.getString(bizData, "bizCode");
+
         }
 
-        ydClient.operateData(YDParam.builder()
-                .formInstanceId(bizCode)
-                .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mknspz75",lsh)))
-                .formUuid("FORM-A9A47B0365DB437F8F4C8E01B4468220K7GU")
-                .formDataJson(JSONObject.toJSONString(formData))
-                .build(), YDConf.FORM_OPERATION.upsert);
+
+
+
     }
 
     @Override
@@ -267,7 +316,214 @@ public class SikuServiceImpl implements SikuService {
                 .formInstanceId(formInstId)
                 .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
 
-        Map body = new HashMap();
+        String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
+        String formSubTypeBizCode = "FT208629766551519240";//项目支付单
+
+        Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i");
+
+        String empId = "";
+        String deptBusinessCode = "";
+
+        String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号
+
+        if (amt >= 5000){
+            //支付金额>=5000元,每刻发起人为宜搭采购单据发起人;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
+            Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
+            if (Objects.nonNull(employeeDetails)){
+                List<Map> departments = UtilMap.getList(employeeDetails, "departments");
+                deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
+
+                empId = ydfqr;
+            }else {
+                empId = "002";//默认沃洲洋
+                deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
+            }
+        }else {
+            //支付金额<5000元,每刻发起人为宜搭采购单据中的中台采购;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
+            Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
+            if (Objects.nonNull(employeeDetails)){
+                List<Map> departments = UtilMap.getList(employeeDetails, "departments");
+                deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
+            }else {
+                deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
+            }
+
+            String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号
+            Map employeeDetails2 = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ztcggh)));
+
+            if (Objects.nonNull(employeeDetails2)){
+                empId = ztcggh;
+            }else {
+                empId = "002";//默认沃洲洋
+            }
+        }
+
+        String submittedUserEmployeeId = empId;//提单人工号
+        String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码
+        String coverUserEmployeeId = empId;//承担人工号
+        String coverDepartmentBizCode = deptBusinessCode;//承担部门编码
+
+        String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号
+        long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间
+        String isFree = "FREE需求".equals(type) ? "是" : "否";//是否free
+        String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "1" : "2";//是否代垫付
+        String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部
+        String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码
+
+        //针对多供应商分期付款拆分多条每刻项目支付单
+        if ("常规需求".equals(type)){
+            List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
+
+            int index = 0;
+            for (Map detail : detailList) {
+                index++;
+                String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
+                Map body = new HashMap();
+                body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
+                body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
+                body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
+                body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由
+                body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
+                body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
+                body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
+                body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码
+
+
+                Map customObject = new HashMap();
+                customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
+                customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhqm0u"));}});//期望支付日期
+                customObject.put("CF6",isFree);////free  是;否
+                customObject.put("CF5",isDdf);//代垫付  是:1  ;  否:2
+                customObject.put("CF2",xmsssyb);//项目所属事业部
+                customObject.put("CF1",projectCode);//项目
+                customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwt2wcn"));//逾期天数
+
+
+                body.put("customObject",customObject);
+
+                //报销单费用导入
+                Map expenseListItem = new HashMap();
+
+                Map consumeAmount = new HashMap();
+                consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额
+                consumeAmount.put("currency","CNY");
+
+                expenseListItem.put("consumeAmount",consumeAmount);
+                expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
+                String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
+                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
+                expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
+                expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
+                expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码
+
+                Map consumeLocation = new HashMap();
+                consumeLocation.put("cityPair",null);
+                consumeLocation.put("location","110001");//todo 暂时写死  110001 北京
+                expenseListItem.put("consumeLocation",consumeLocation);
+
+                expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
+
+                Map body2 = new HashMap();
+                body2.put("employeeId","002");//需要导入的对应员工的工号
+                body2.put("expenseList",Arrays.asList(expenseListItem));
+
+                List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
+
+                body.put("expenseCodes",expenseCodes);//费用类型业务编码
+
+                //收款账户
+                Map payeeAccount = new HashMap();
+                payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名
+                payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户
+                payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
+                payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
+                body.put("payeeAccount",payeeAccount);
+
+                body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
+
+
+                Map result = MkBxUtil.receiveReimburse(body);
+
+            }
+        }else {
+            List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
+
+            int index = 0;
+            for (Map detail : detailList) {
+                index ++;
+                String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
+                Map body = new HashMap();
+//                body.put("formCode",xqbh + "-" + uuid);//有值时会使用该值作为单据号
+                body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
+                body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
+                body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
+                body.put("reimburseName","FREE-" + UtilMap.getString(detail,"selectField_mkkixdd7"));//报销事由
+                body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
+                body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
+                body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
+                body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码
+
+                Map customObject = new HashMap();
+                customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
+                customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期
+                customObject.put("CF6",isFree);//free  是;否
+                customObject.put("CF5",isDdf);//代垫付  是:1  ;  否:2
+                customObject.put("CF2",xmsssyb);//项目所属事业部
+                customObject.put("CF1",projectCode);//项目
+                customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数
+
+                body.put("customObject",customObject);
+
+                //报销单费用导入
+                Map expenseListItem = new HashMap();
+
+                Map consumeAmount = new HashMap();
+                consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额
+                consumeAmount.put("currency","CNY");
+
+                expenseListItem.put("consumeAmount",consumeAmount);
+                expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
+                String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
+                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
+                expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
+                expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
+                expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码
+
+                Map consumeLocation = new HashMap();
+                consumeLocation.put("cityPair",null);
+                consumeLocation.put("location","110001");//todo 暂时写死  110001 北京
+                expenseListItem.put("consumeLocation",consumeLocation);
+
+                expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
+
+                Map body2 = new HashMap();
+                body2.put("employeeId","002");//需要导入的对应员工的工号
+                body2.put("expenseList",Arrays.asList(expenseListItem));
+
+                List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
+
+                body.put("expenseCodes",expenseCodes);//费用类型业务编码
+
+                //收款账户
+                Map payeeAccount = new HashMap();
+                payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名
+                payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户
+                payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
+                payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
+                body.put("payeeAccount",payeeAccount);
+
+                body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
+
+
+                Map result = MkBxUtil.receiveReimburse(body);
+
+            }
+
+        }
+
+        /*Map body = new HashMap();
         body.put("formCode",UtilMap.getString(formData,"serialNumberField_mkkmij3o"));//有值时会使用该值作为单据号
         body.put("formSubTypeBizCode","FT208629766551519240");//表单类型的业务编号  todo 暂时写死 FT208629766551519240 宜搭支付单
         body.put("submittedUserEmployeeId","002");//提单人工号 todo 暂时写死 002 wzy
@@ -282,12 +538,10 @@ public class SikuServiceImpl implements SikuService {
         customObject.put("CF6",UtilMap.getString(formData,"radioField_mkf2quln"));////free  是;否
         customObject.put("CF5","是".equals(UtilMap.getString(formData,"radioField_mkf2quln")) ? "1" : "2");//代垫付  是:1  ;  否:2
         customObject.put("CF2",UtilMap.getString(formData,"selectField_mkdedkv7"));//项目所属事业部
-        customObject.put("CF1",UtilMap.getString(formData,"textField_mkkmij50"));//项目
+        customObject.put("CF1",UtilMap.getString(formData,"textField_mmoh6nvx"));//项目
 
         body.put("customObject",customObject);
 
-        String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
-
         List<String> expenseCodes = new ArrayList<>();
         List<Map> collectionSchedule = new ArrayList<>();
 
@@ -392,7 +646,7 @@ public class SikuServiceImpl implements SikuService {
 
         body.put("stagingFlag",false);////暂存标识,默认为false表示不暂存
 
-        Map result = MkBxUtil.receiveReimburse(body);
+        Map result = MkBxUtil.receiveReimburse(body);*/
 
         return McR.success();
     }
@@ -490,6 +744,19 @@ public class SikuServiceImpl implements SikuService {
     public void invoiceWriteBack3(Map map) {
         String formCode = UtilMap.getString(map, "formCode");
 
+        String operation = UtilMap.getString(map, "operation");
+
+        if ("FORM_COMPLETE".equals(operation)){
+            //完成
+        }else if ("FORM_REJECT".equals(operation)){
+            //驳回
+        }
+
+        String[] split = formCode.split("-");
+
+        String bh = split[0];//采购需求编号/直接采购单编号
+        String uuid = split[1];//子表uuid
+
         Map formData = UtilMap.getMap(map, "formData");
 
         Map baseAmount = UtilMap.getMap(formData, "baseAmount");
@@ -504,20 +771,35 @@ public class SikuServiceImpl implements SikuService {
             //采购需求&结算
             List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
                     .formUuid("FORM-C8C1FBBA781C4C5EBAC487C07BC5A86AD2HO")
-                    .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", formCode)))
+                    .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
                     .build(), YDConf.FORM_QUERY.retrieve_list).getData();
 
             String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
 
+            Map ydFormData = UtilMap.getMap(data.get(0), "formData");
+
+            List<Map> detailList = UtilMap.getList(ydFormData, "tableField_mkkmij56");
+
+            for (Map detail : detailList) {
+                if (uuid.equals(UtilMap.getString(detail, "textField_mmvhqm0q"))){
+                    detail.put("selectField_mmvhqm0p","已付款");
+                    break;
+                }
+            }
+
+            Double yzf = UtilMap.getDouble(ydFormData, "numberField_mkf2qumf");//已支付
+
+            ydFormData.put("numberField_mkf2qumf",yzf + amt);
+
             ydClient.operateData(YDParam.builder()
                     .formInstanceId(formInstanceId)
-                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mkf2qumf",amt)))
+                    .updateFormDataJson(JSONObject.toJSONString(ydFormData  ))
                     .build(), YDConf.FORM_OPERATION.update);
         }else {
             //直接采购结算单
             List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
                     .formUuid("FORM-1AFEDDA034C74F0DB18FA60C941CB56EHUUG")
-                    .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", formCode)))
+                    .searchCondition(JSONObject.toJSONString(UtilMap.map("serialNumberField_mkkmij3o", bh)))
                     .build(), YDConf.FORM_QUERY.retrieve_list).getData();
 
             String formInstanceId = UtilMap.getString(data.get(0), "formInstanceId");
@@ -538,132 +820,214 @@ public class SikuServiceImpl implements SikuService {
                 .formInstanceId(formInstId)
                 .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
 
-        Map body = new HashMap();
-        body.put("formCode",UtilMap.getString(formData,"serialNumberField_mkkmij3o"));//有值时会使用该值作为单据号
-        body.put("formSubTypeBizCode","FT208629766551519240");//表单类型的业务编号  todo 暂时写死 FT208629766551519240 宜搭支付单
-        body.put("submittedUserEmployeeId","002");//提单人工号 todo 暂时写死 002 wzy
-        body.put("reimburseName",UtilMap.getString(formData,"textareaField_mmbmohr9"));//报销事由
-        body.put("legalEntityBizCode",UtilMap.getString(formData,"textField_mmd6hio7"));//公司抬头编码
-        body.put("coverUserEmployeeId","002");//承担人工号 todo 暂时写死 002 wzy
-        body.put("coverDepartmentBizCode","DI203800035494740082");//承担部门编码 todo 暂时写死 DI203800035494740082
+        String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
+        String formSubTypeBizCode = "FT208629766551519240";//项目支付单
 
-        Map customObject = new HashMap();
-        customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkdf8q8q"));}});//落地结束时间
-        customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(formData,"dateField_mkkkw298"));}});//预计支付日期
-        customObject.put("CF6",UtilMap.getString(formData,"radioField_mkf2quln"));////free  是;否
-        customObject.put("CF5","是".equals(UtilMap.getString(formData,"radioField_mkf2quln")) ? "1" : "2");//代垫付  是:1  ;  否:2
-        customObject.put("CF2",UtilMap.getString(formData,"selectField_mkdedkv7"));//项目所属事业部
-        customObject.put("CF1",UtilMap.getString(formData,"textField_mkkmij50"));//项目
+        Double amt = UtilMap.getDouble(formData, "numberField_mkkmij6i");
 
-        body.put("customObject",customObject);
+        String empId = "";
+        String deptBusinessCode = "";
 
-        String type = UtilMap.getString(formData, "radioField_mkkmij3b");//需求单类型
+        String ydfqr = UtilMap.getString(formData, "textField_mmwvodde");//宜搭发起人工号
 
-        List<String> expenseCodes = new ArrayList<>();
-        List<Map> collectionSchedule = new ArrayList<>();
+        if (amt >= 5000){
+            //支付金额>=5000元,每刻发起人为宜搭采购单据发起人;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
+            Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
+            if (Objects.nonNull(employeeDetails)){
+                List<Map> departments = UtilMap.getList(employeeDetails, "departments");
+                deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
 
-        List<Map> expenseList = new ArrayList<>();
+                empId = ydfqr;
+            }else {
+                empId = "002";//默认沃洲洋
+                deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
+            }
+        }else {
+            //支付金额<5000元,每刻发起人为宜搭采购单据中的中台采购;每刻中的【费用承担部门】实际为采购单发起人所在部门,非每刻单据发起人部门
+            Map employeeDetails = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ydfqr)));
+            if (Objects.nonNull(employeeDetails)){
+                List<Map> departments = UtilMap.getList(employeeDetails, "departments");
+                deptBusinessCode = UtilMap.getString(departments.get(0), "businessCode");
+            }else {
+                deptBusinessCode = "DI203800035494740082";//默认DI203800035494740082
+            }
 
+            String ztcggh = UtilMap.getString(formData, "textField_mmwvfb97");//中台采购工号
+            Map employeeDetails2 = MkBxUtil.employeeDetails(UtilMap.map("employeeIds", Arrays.asList(ztcggh)));
+
+            if (Objects.nonNull(employeeDetails2)){
+                empId = ztcggh;
+            }else {
+                empId = "002";//默认沃洲洋
+            }
+        }
+
+        String submittedUserEmployeeId = empId;//提单人工号
+        String legalEntityBizCode = UtilMap.getString(formData, "textField_mmd6hio7");//公司抬头编码
+        String coverUserEmployeeId = empId;//承担人工号
+        String coverDepartmentBizCode = deptBusinessCode;//承担部门编码
+
+        String xqbh = UtilMap.getString(formData, "serialNumberField_mkkmij3o");//需求编号
+        long ldjssj = UtilMap.getLong(formData, "dateField_mkdf8q8q");//落地结束时间
+        String isFree = "FREE采购".equals(UtilMap.getString(formData, "radioField_mkf2quln")) ? "是" : "否";//是否free
+        String isDdf = "是".equals(UtilMap.getString(formData, "radioField_mkf2qulo")) ? "1" : "2";//是否代垫付
+        String xmsssyb = UtilMap.getString(formData, "selectField_mkdedkv7");//项目所属事业部
+        String projectCode = UtilMap.getString(formData, "textField_mmoh6nvx");//项目编码
+
+        //针对多供应商分期付款拆分多条每刻项目支付单
         if ("常规采购".equals(type)){
             List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
-
-            for (Map result : detailList) {
-                Map item = new HashMap();
+            int index = 0;
+            for (Map detail : detailList) {
+                index++;
+                String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
+                Map body = new HashMap();
+                body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
+                body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
+                body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
+                body.put("reimburseName",UtilMap.getString(detail,"textareaField_mkkmij5i"));//报销事由
+                body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
+                body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
+                body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
+                body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位编码
+
+
+                Map customObject = new HashMap();
+                customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
+                customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mkkkw298"));}});//期望支付日期
+                customObject.put("CF6",isFree);//free  是;否
+                customObject.put("CF5",isDdf);//代垫付  是:1  ;  否:2
+                customObject.put("CF2",xmsssyb);//项目所属事业部
+                customObject.put("CF1",projectCode);//项目
+                customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkv"));//逾期天数
+
+                body.put("customObject",customObject);
+
+                //报销单费用导入
+                Map expenseListItem = new HashMap();
 
                 Map consumeAmount = new HashMap();
-                consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij5e")));//结算金额
+                consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij5e")));//结算金额
                 consumeAmount.put("currency","CNY");
 
-                item.put("consumeAmount",consumeAmount);
-                item.put("corpExpense",true);//是否对公费用,需要填写true
-                item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用
-                item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
-                item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
-                item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
-                item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//往来单位业务编码
+                expenseListItem.put("consumeAmount",consumeAmount);
+                expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
+                String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
+                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
+                expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
+                expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
+                expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmbmohrb"));//往来单位业务编码
 
                 Map consumeLocation = new HashMap();
                 consumeLocation.put("cityPair",null);
-                consumeLocation.put("location","110001");
-                item.put("consumeLocation",consumeLocation);
+                consumeLocation.put("location","110001");//todo 暂时写死  110001 北京
+                expenseListItem.put("consumeLocation",consumeLocation);
 
-                item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
+                expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
 
-                expenseList.add(item);
+                Map body2 = new HashMap();
+                body2.put("employeeId","002");//需要导入的对应员工的工号
+                body2.put("expenseList",Arrays.asList(expenseListItem));
 
+                List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
 
-                Map collectionScheduleItem = new HashMap();
+                body.put("expenseCodes",expenseCodes);//费用类型业务编码
+
+                //收款账户
                 Map payeeAccount = new HashMap();
-                payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mkkmij6z"));//账户名
-                payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mkkmij6y"));//银行账户
+                payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mkkmij6z"));//账户名
+                payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mkkmij6y"));//银行账户
                 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
                 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
-                collectionScheduleItem.put("payeeAccount",payeeAccount);
-                collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmbmohrb"));//收款往来单位编码
-                collectionScheduleItem.put("amountRatio",0);//收款比例
-                collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额
-                collectionScheduleItem.put("collectionType","BANK");//支付类型
+                body.put("payeeAccount",payeeAccount);
+
+                body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
+
+
+                Map result = MkBxUtil.receiveReimburse(body);
 
-                collectionSchedule.add(collectionScheduleItem);
             }
         }else {
             List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
 
-            for (Map result : detailList) {
-                Map item = new HashMap();
+            int index = 0;
+            for (Map detail : detailList) {
+                index ++;
+                String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
+                Map body = new HashMap();
+//                body.put("formCode",xqbh + "-" + uuid);//有值时会使用该值作为单据号
+                body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
+                body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
+                body.put("submittedUserEmployeeId",submittedUserEmployeeId);//提单人工号
+                body.put("reimburseName","FREE-" + UtilMap.getString(detail,"selectField_mkkixdd7"));//报销事由
+                body.put("legalEntityBizCode",legalEntityBizCode);//公司抬头编码
+                body.put("coverUserEmployeeId",coverUserEmployeeId);//承担人工号
+                body.put("coverDepartmentBizCode",coverDepartmentBizCode);//承担部门编码
+                body.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位编码
+
+                Map customObject = new HashMap();
+                customObject.put("CF4",new HashMap<String,Long>(){{put("currentTime",ldjssj);}});//落地结束时间
+                customObject.put("CF3",new HashMap<String,Long>(){{put("currentTime",UtilMap.getLong(detail,"dateField_mmvhtdy4"));}});//期望支付日期
+                customObject.put("CF6",isFree);//free  是;否
+                customObject.put("CF5",isDdf);//代垫付  是:1  ;  否:2
+                customObject.put("CF2",xmsssyb);//项目所属事业部
+                customObject.put("CF1",projectCode);//项目
+                customObject.put("CF7",UtilMap.getString(detail,"numberField_mmwswtkx"));//逾期天数
+
+                body.put("customObject",customObject);
+
+                //报销单费用导入
+                Map expenseListItem = new HashMap();
 
                 Map consumeAmount = new HashMap();
-                consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(result,"numberField_mkkmij6p")));//结算金额
+                consumeAmount.put("amount",String.format("%.2f", UtilMap.getDouble(detail,"numberField_mkkmij6p")));//结算金额
                 consumeAmount.put("currency","CNY");
 
-                item.put("consumeAmount",consumeAmount);
-                item.put("corpExpense",true);//是否对公费用,需要填写true
-                item.put("expenseTypeBizCode","200140");//费用类型业务编码 todo 暂时写死 200140 其他费用
-                item.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
-                item.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
-                item.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
-                item.put("tradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//往来单位业务编码
+                expenseListItem.put("consumeAmount",consumeAmount);
+                expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
+                String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
+                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
+                expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
+                expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
+                expenseListItem.put("tradingPartnerBizCode",UtilMap.getString(detail,"textField_mmekbfa2"));//往来单位业务编码
 
                 Map consumeLocation = new HashMap();
                 consumeLocation.put("cityPair",null);
-                consumeLocation.put("location","110001");
-                item.put("consumeLocation",consumeLocation);
+                consumeLocation.put("location","110001");//todo 暂时写死  110001 北京
+                expenseListItem.put("consumeLocation",consumeLocation);
 
-                item.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
+                expenseListItem.put("corpExpenseResponsibleEmpIds",Arrays.asList("002"));//责任人/业务经办人(预付未到票/到票部分支付或不支付 两种场景必填) todo 暂时写死 002 wzy
 
-                expenseList.add(item);
+                Map body2 = new HashMap();
+                body2.put("employeeId","002");//需要导入的对应员工的工号
+                body2.put("expenseList",Arrays.asList(expenseListItem));
 
+                List<String> expenseCodes = MkBxUtil.receiveExpense(body2);
 
-                Map collectionScheduleItem = new HashMap();
+                body.put("expenseCodes",expenseCodes);//费用类型业务编码
+
+                //收款账户
                 Map payeeAccount = new HashMap();
-                payeeAccount.put("bankAcctName",UtilMap.getString(result,"textField_mketkvxa"));//账户名
-                payeeAccount.put("bankAcctNumber",UtilMap.getString(result,"textField_mketkvxc"));//银行账户
+                payeeAccount.put("bankAcctName",UtilMap.getString(detail,"textField_mketkvxa"));//账户名
+                payeeAccount.put("bankAcctNumber",UtilMap.getString(detail,"textField_mketkvxc"));//银行账户
                 payeeAccount.put("paymentType","BANK");//账户类型;ALIPAY-支付宝,BANK-银行账户,CASH-现金
                 payeeAccount.put("accountType","CORP");//收款账户类型:个人(员工)-PERSONAL,公司(往来单位)-CORP
-                collectionScheduleItem.put("payeeAccount",payeeAccount);
-                collectionScheduleItem.put("collectionTradingPartnerBizCode",UtilMap.getString(result,"textField_mmekbfa2"));//收款往来单位编码
-                collectionScheduleItem.put("amountRatio",0);//收款比例
-                collectionScheduleItem.put("amount",new HashMap<>(consumeAmount));//收款金额
-                collectionScheduleItem.put("collectionType","BANK");//支付类型
+                body.put("payeeAccount",payeeAccount);
+
+                body.put("stagingFlag",true);//暂存标识,默认为false表示不暂存
+
+
+                Map result = MkBxUtil.receiveReimburse(body);
 
-                collectionSchedule.add(collectionScheduleItem);
             }
-        }
 
-        //报销单费用导入
-        Map body2 = new HashMap();
-        body2.put("employeeId","002");//需要导入的对应员工的工号
-        body2.put("expenseList",expenseList);
+        }
 
-        expenseCodes = MkBxUtil.receiveExpense(body2);
 
-        body.put("expenseCodes",expenseCodes);//费用类型业务编码
-        body.put("collectionSchedule",collectionSchedule);//多人收款,如果已填充该字段,则无需填充上方的收款账户字段,若传多人收款,则paymentSceneBizCode参数必填
-        body.put("paymentSceneBizCode","DGYSSK");//多人收款场景(支付场景)表单业务编码,需要填写多人收款时必填
 
-        body.put("stagingFlag",false);////暂存标识,默认为false表示不暂存
 
-        Map result = MkBxUtil.receiveReimburse(body);
 
         return McR.success();
     }

+ 36 - 5
mjava-siku/src/main/java/com/malk/siku/utils/MkBxUtil.java

@@ -9,10 +9,7 @@ import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 每刻报销
@@ -84,7 +81,7 @@ public class MkBxUtil {
         return result;
     }
 
-    //保存往来单位
+    //保存往来单位账号
     public static Map saveAccount(Object body){
         Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://" + host + "/api/openapi/tradingPartner/batch/account/save", MkBxUtil.initTokenHeader(), null, body,(Map) null));
 
@@ -122,6 +119,40 @@ public class MkBxUtil {
         return expenseCodes;
     }
 
+    //费用类型查询
+    public static String expenseTypeSearch(Object body){
+        log.info("body:{}",JSONObject.toJSONString(body));
+        Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://" + host + "/api/openapi/expense/type/search", MkBxUtil.initTokenHeader(), null, body,(Map) null));
+
+        log.info("Result:{}",result);
+
+        List<Map> data = UtilMap.getList(result, "data");
+
+        if (!data.isEmpty()){
+            String bizCode = UtilMap.getString(data.get(0), "bizCode");
+
+            return bizCode;
+        }else {
+            return null;
+        }
+    }
+
+    //根据工号查询员工详情
+    public static Map employeeDetails(Object body){
+        log.info("body:{}",JSONObject.toJSONString(body));
+        Map result = (Map) JSONObject.parse(UtilHttp.doPost("https://" + host + "/api/openapi/employee/details", MkBxUtil.initTokenHeader(), null, body,(Map) null));
+
+        log.info("Result:{}",result);
+
+        List<Map> data = UtilMap.getList(result, "data");
+
+        if (Objects.nonNull(data)){
+            return data.get(0);
+        }else {
+            return null;
+        }
+    }
+
 
     private static String getSecret(String appCode, String appSecret, long timeMillis){
         log.info("time:{}",timeMillis);

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

@@ -12,4 +12,4 @@ spring:
 #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
   global-config:
     db-config:
-      id-type: auto
+      id-type: autos

+ 4 - 4
mjava-siku/src/test/java/com.malk.siku/SkTest.java

@@ -14,14 +14,14 @@ public class SkTest {
     @Test
     public void getSecret(){
         //每刻报销-测试环境
-        /*String appCode="AP52Y01LHHTAP9";
-        String appSecret="N4WuERLteAUPaWebnsHy";*/
+        String appCode="AP52Y01LHHTAP9";
+        String appSecret="N4WuERLteAUPaWebnsHy";
 
 
 
         //每刻云票-测试环境
-        String appCode="AP53EP1SVDS1N9";
-        String appSecret="qF4nm3nPnyXYcrWcr5jl";
+        /*String appCode="AP53EP1SVDS1N9";
+        String appSecret="qF4nm3nPnyXYcrWcr5jl";*/
 
         long timeMillis = System.currentTimeMillis();
         log.info("time:{}",timeMillis);