package com.management.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.management.constant.ERPURLConstant; import com.management.constant.URLConstant; import com.management.entity.Filter; import com.management.utils.CrmRequestUtil; import com.management.utils.KingDeeUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 要货计划 * * @param * @return null * @Author weiloong_zhang */ @RestController @RequestMapping("/api/goods_plan") @Slf4j public class GoodsPlanController { private RestTemplate restTemplate = new RestTemplate(); public static void main(String[] args) { new GoodsPlanController().syncGoodsPlan(); //new GoodsPlanController().updateGoodsPlan(); //new GoodsPlanController().syncTrackingNum(); } /** * 同步新增要货计划 * * @return void * @Author weiloong_zhang */ @PostMapping("/sync/goodsPlan") public void syncGoodsPlan() { CrmRequestUtil crmRequestUtil = new CrmRequestUtil(); log.info("开始同步要货计划"); String[] syncStatus = {"option_pending_sync__c", "option_resync__c"}; //要货计划请求 JSONObject getGoodsPlan = crmRequestUtil.getCRMList(Arrays.asList( //new Filter("IS", "erp_id__c", Arrays.asList("")), new Filter("EQ", "business_status__c", Arrays.asList("option_normal__c")), new Filter("IN", "sync_status__c", Arrays.asList(syncStatus)), new Filter("GT", "create_time", Arrays.asList("1748923200000")), //new Filter("EQ", "name", Arrays.asList("YHJH20250508-0002")), new Filter("EQ", "life_status", Arrays.asList("normal")) ), "purchase_plan__c"); JSONObject goodsPlanRes = new JSONObject(); //开始发起请求 try { goodsPlanRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getGoodsPlan, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } //判断是否请求成功 if (!"success".equals(goodsPlanRes.getString("errorDescription")) || goodsPlanRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("请求失败或数据不存在"); return; } //请求成功 for (Object goodsPlanObj : goodsPlanRes.getJSONObject("data").getJSONArray("dataList")) { //将Obj转为JSONObject JSONObject goodsPlanData = JSON.parseObject(JSON.toJSONString(goodsPlanObj)); System.out.println("当前正在处理的要货计划数据为:" + goodsPlanData); //获取当前单据的唯一id String goodsPlanId = goodsPlanData.getString("_id"); //获取当前单据名称 String goodsPlanName = goodsPlanData.getString("name"); //获取当前单据的创建时间 //String createTime = goodsPlanData.getString("create_time"); String createTime = goodsPlanData.getString("last_modified_time"); //开始查询该单据是否已经集成过 JSONObject logRes = new JSONObject(); try { logRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_goodsplan&log_type=GP&dataId=" + goodsPlanId + "&mark=" + createTime, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!logRes.getJSONArray("data").isEmpty()) { log.info("当前单据已经集成过了"); continue; } log.info("当前单据没有集成过"); //开始封装传输至ERP的请求 log.info("开始封装请求"); Map erpGoodsPlanReq = new HashMap<>(); erpGoodsPlanReq.put("f9w5_crmid", goodsPlanId); erpGoodsPlanReq.put("billno", goodsPlanName);//单据编号 erpGoodsPlanReq.put("billtype_number", "f9w5_sm_purchaseplan_BT");//单据类型 String orgNum = goodsPlanData.getString("erp_organization__c") != null ? goodsPlanData.getString("erp_organization__c") : ""; erpGoodsPlanReq.put("org_number", orgNum);//组织编码 String businessType = goodsPlanData.getString("business_status__c") != null ? goodsPlanData.getString("business_status__c") : ""; switch (businessType) { case "option_normal__c": erpGoodsPlanReq.put("f9w5_busstatus", "A");//业务状态 break; case "option_close__c": erpGoodsPlanReq.put("f9w5_busstatus", "B");//业务状态 break; default: erpGoodsPlanReq.put("f9w5_busstatus", "A");//业务状态 break; } //开始获取需求日期 long biztime = goodsPlanData.getLong("requirement_date__c"); Date date = new Date(biztime); erpGoodsPlanReq.put("biztime", date);//需求日期 //部门编码 String deptCode = ""; List deptIdList = goodsPlanData.getJSONArray("data_own_department"); //开始查询部门编码 JSONObject deptReq = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "_id", deptIdList) ), "DepartmentObj"); JSONObject deptRes = new JSONObject(); try { deptRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, deptReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(deptRes.getString("errorDescription")) && !deptRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject deptData = deptRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); deptCode = deptData.getString("field_Vj6sf__c") != null ? deptData.getString("field_Vj6sf__c") : ""; } //erpGoodsPlanReq.put("dept", "zyierp");//todo 归属部门 erpGoodsPlanReq.put("dept", deptCode);//todo 归属部门 //获取负责人编码 String ownerCode = ""; List ownerIdList = goodsPlanData.getJSONArray("owner"); JSONObject ownerReq = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "user_id", ownerIdList) ), "PersonnelObj"); JSONObject ownerRes = new JSONObject(); try { ownerRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, ownerReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(ownerRes.getString("errorDescription")) && !ownerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject ownerData = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); ownerCode = ownerData.getString("field_T1xid__c") != null ? ownerData.getString("field_T1xid__c") : ""; } //erpGoodsPlanReq.put("operator", "ID-000011");//todo 负责人 erpGoodsPlanReq.put("operator", ownerCode);//todo 负责人 //根据要货计划查询要货计划明细 JSONObject getGoodsPlanDetail = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "purchase_plan__c", Arrays.asList(goodsPlanId)) ), "purchase_plan_details__c"); JSONObject goodsPlanDetailRes = new JSONObject(); try { goodsPlanDetailRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getGoodsPlanDetail, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("要货计划明细查询结果为:" + goodsPlanDetailRes); if (!"success".equals(goodsPlanDetailRes.getString("errorDescription")) || goodsPlanDetailRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("要货计划明细查询失败不存在当前要货计划明细"); continue; } log.info("要货计划明细存在,继续向下执行"); //延时执行(非阻塞) ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); executor.schedule(() -> { System.out.println("延时任务执行"); }, 10, TimeUnit.SECONDS); //10秒后执行 executor.shutdown(); // 关闭线程池 //明细列表 List goodsPlanDetailList = new ArrayList<>(); //用来判断跟踪号是否传输成功 JSONObject trackingNumReason = new JSONObject(); for (Object goodsPlanDetailObj : goodsPlanDetailRes.getJSONObject("data").getJSONArray("dataList")) { if (!trackingNumReason.isEmpty()) { log.info("已经存在执行错误的明细,将不再执行本条数据"); continue; } JSONObject goodsPlanDetailData = JSON.parseObject(JSON.toJSONString(goodsPlanDetailObj)); System.out.println("当前正在处理的要货计划明细数据为:" + goodsPlanDetailData); String trackingNum = goodsPlanDetailData.getString("batch_number__c") != null ? goodsPlanDetailData.getString("batch_number__c") : ""; if (trackingNum.equals("")) { log.info("跟踪号不存在,将不再向下执行"); trackingNumReason.put("status", "false"); trackingNumReason.put("reason", "跟踪号不存在,将不再向下执行"); continue; } //跟踪号存在,开始执行 JSONObject syncTrackingNum = syncTrackingNum(trackingNum); //判断是否执行成功 if (!"success".equals(syncTrackingNum.getString("errorCode"))) { trackingNumReason.put("status", "false"); trackingNumReason.put("reason", syncTrackingNum.getString("message")); continue; } //开始封装要货计划明细数据 Map erpGoodsPlanDetailReq = new HashMap<>(); erpGoodsPlanDetailReq.put("f9w5_crmentryid", goodsPlanDetailData.getString("_id"));//crm明细id erpGoodsPlanDetailReq.put("material_number", goodsPlanDetailData.getString("material_id__c__r"));//物料编号 erpGoodsPlanDetailReq.put("entryorg_number", orgNum);//组织编码 erpGoodsPlanDetailReq.put("qty", goodsPlanDetailData.getBigDecimal("quantity__c") != null ? goodsPlanDetailData.getBigDecimal("quantity__c") : 0);//数量 //erpGoodsPlanDetailReq.put("lot_number", goodsPlanDetailData.getString("batch_number__c") != null ? goodsPlanDetailData.getString("batch_number__c") : "");//批号 erpGoodsPlanDetailReq.put("entrycomment", goodsPlanDetailData.getString("remark__c") != null ? goodsPlanDetailData.getString("remark__c") : "");//备注 erpGoodsPlanDetailReq.put("f9w5_contractno", goodsPlanDetailData.getString("sales_contract_number__c__r") != null ? goodsPlanDetailData.getString("sales_contract_number__c__r") : "");//销售合同编号 erpGoodsPlanDetailReq.put("f9w5_tracknumber_number", trackingNum);//跟踪号 //程序版本 String programVersion = goodsPlanDetailData.getString("program_version_number__c") != null ? goodsPlanDetailData.getString("program_version_number__c") : ""; if (programVersion.equals("")) { log.info("程序版本不存在,将不再向下执行"); continue; } erpGoodsPlanDetailReq.put("f9w5_programversion_number", programVersion);//程序版本 //程序版本编码 String programVersionCode = goodsPlanDetailData.getString("platform_name_code__c") != null ? goodsPlanDetailData.getString("platform_name_code__c") : ""; if (programVersionCode.equals("")) { log.info("程序版本编码不存在,将不再向下执行"); continue; } erpGoodsPlanDetailReq.put("f9w5_smplatform_number", programVersionCode); // //开始查询项目号 // String projectId = goodsPlanDetailData.getString("project_name__c") != null ? goodsPlanDetailData.getString("project_name__c") : ""; // // //开始查询项目号 // JSONObject getProjectReq = crmRequestUtil.getCRMList(Arrays.asList( // new Filter("EQ", "_id", Arrays.asList(projectId)) // ), "NewOpportunityObj"); // // JSONObject projectRes = new JSONObject(); // // try { // projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getProjectReq, JSONObject.class); // } catch (RestClientException e) { // e.printStackTrace(); // } // // String projectCode = ""; // // if ("success".equals(projectRes.getString("errorDescription")) && !projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { // JSONObject projectData = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); // projectCode = projectData.getString("opportunity_id__c") != null ? projectData.getString("opportunity_id__c") : ""; // } //项目号 erpGoodsPlanDetailReq.put("f9w5_project_number", goodsPlanDetailData.getString("project_no__c") != null ? goodsPlanDetailData.getString("project_no__c") : "");//项目号 goodsPlanDetailList.add(erpGoodsPlanDetailReq); } //开始封装回写程序 Map backReqMap = new HashMap(); backReqMap.put("_id", goodsPlanId); backReqMap.put("dataObjectApiName", "purchase_plan__c"); //开始判断 if (!trackingNumReason.isEmpty()) { log.info("明细封装错误,将不再向下执行"); backReqMap.put("sync_status__c", "option_sync_failure__c"); backReqMap.put("response_info__c", trackingNumReason.getString("reason")); //开始回写 JSONObject backReq = crmRequestUtil.updateCRM(backReqMap); JSONObject backRes = new JSONObject(); try { backRes = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, backReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("回写结果为:" + backRes); continue; } //判断明细是否存在 if (goodsPlanDetailList.isEmpty()) { log.info("明细为空,将不再向下执行"); continue; } erpGoodsPlanReq.put("billentry", goodsPlanDetailList); //开始封装要货计划请求 System.out.println("erp请求为:" + JSON.parseObject(JSON.toJSONString(erpGoodsPlanReq))); Map erpContractData = new HashMap<>(); erpContractData.put("data", Arrays.asList(erpGoodsPlanReq));//请求体 String accessToken = new KDTokenController().getKDAccessTokenTest(); if (accessToken == null || accessToken.equals("")) { log.info("金蝶token为空或不存在"); return; } String uuid = UUID.randomUUID().toString().replace("-", ""); //开始封装请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("accessToken", accessToken); headers.set("Idempotency-Key", uuid); HttpEntity goodsPlanReqEntity = new HttpEntity(erpContractData, headers); System.out.println(JSON.parseObject(JSON.toJSONString(goodsPlanReqEntity))); //开始向金蝶发起请求 String goodsPlanUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/sm/f9w5_sm_purchaseplan/purchaseplanSave"; JSONObject erpGoodsPlanRes = new JSONObject(); try { erpGoodsPlanRes = restTemplate.postForObject(goodsPlanUrl, goodsPlanReqEntity, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("要货计划结果为:" + JSON.parseObject(JSON.toJSONString(erpGoodsPlanRes))); //开始封装日志 Map logMap = new HashMap<>(); logMap.put("log_id", UUID.randomUUID().toString().replace("-", "")); logMap.put("log_type", "GP"); logMap.put("syn_type", "0"); logMap.put("data_name", goodsPlanName); logMap.put("data_id", goodsPlanId); logMap.put("mark", createTime); logMap.put("send_body", JSON.toJSONString(goodsPlanReqEntity)); logMap.put("send_res", JSON.toJSONString(erpGoodsPlanRes)); logMap.put("tableName", "send_log_goodsplan"); //判断是否执行成功 if ("0".equals(erpGoodsPlanRes.getString("errorCode"))) { //同步成功 logMap.put("log_status", "0"); logMap.put("res_body", "同步成功"); backReqMap.put("erp_id__c", erpGoodsPlanRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id")); backReqMap.put("sync_status__c", "option_sync_success__c"); backReqMap.put("response_info__c", "同步成功"); //审核 KingDeeUtils kingDeeUtils = new KingDeeUtils(); kingDeeUtils.audit(erpGoodsPlanRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id"), "f9w5_sm_purchaseplan"); } else { //同步失败 logMap.put("log_status", "1"); logMap.put("res_body", "同步失败:" + erpGoodsPlanRes.getString("message")); backReqMap.put("sync_status__c", "option_sync_failure__c"); backReqMap.put("response_info__c", erpGoodsPlanRes.getString("message")); } //开始回写 JSONObject backReq = crmRequestUtil.updateCRM(backReqMap); System.out.println("回写请求为:" + JSON.parseObject(JSON.toJSONString(backReq))); JSONObject backRes = new JSONObject(); try { backRes = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, backReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("回写结果为:" + backRes); //开始记录日志 JSONObject logResMap = new JSONObject(); try { logResMap = restTemplate.postForObject("http://localhost:18085/Log/insert/log_data", logMap, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("日志插入结果为:" + logResMap); } } /** * 要货计划更新接口 * * @return void * @Author weiloong_zhang */ @PostMapping("/update/goodsPlan") public void updateGoodsPlan() { CrmRequestUtil crmRequestUtil = new CrmRequestUtil(); log.info("开始同步更新要货计划"); //要货计划请求 JSONObject getGoodsPlan = crmRequestUtil.getCRMList(Arrays.asList( //new Filter("IS", "erp_id__c", Arrays.asList("")), new Filter("EQ", "business_status__c", Arrays.asList("option_close__c")), //new Filter("IN", "sync_status__c", Arrays.asList(syncStatus)), new Filter("GT", "create_time", Arrays.asList("1748923200000")), //new Filter("EQ", "name", Arrays.asList("YHJH20250508-0002")), new Filter("EQ", "life_status", Arrays.asList("normal")) ), "purchase_plan__c"); JSONObject goodsPlanRes = new JSONObject(); //开始发起请求 try { goodsPlanRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getGoodsPlan, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } //判断是否请求成功 if (!"success".equals(goodsPlanRes.getString("errorDescription")) || goodsPlanRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("请求失败或数据不存在"); return; } //请求成功 for (Object goodsPlanObj : goodsPlanRes.getJSONObject("data").getJSONArray("dataList")) { //将Obj转为JSONObject JSONObject goodsPlanData = JSON.parseObject(JSON.toJSONString(goodsPlanObj)); System.out.println("当前正在处理的要货计划数据为:" + goodsPlanData); //获取当前单据的唯一id String goodsPlanId = goodsPlanData.getString("_id"); //获取当前单据名称 String goodsPlanName = goodsPlanData.getString("name"); //获取当前单据的最后修改时间 String lastModifyTime = goodsPlanData.getString("last_modified_time"); //开始查询该单据是否已经集成过 JSONObject logRes = new JSONObject(); try { logRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_goodsplan&log_type=GPUP&dataId=" + goodsPlanId + "&mark=" + lastModifyTime, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!logRes.getJSONArray("data").isEmpty()) { log.info("当前单据已经更新过了"); continue; } log.info("当前单据没有集成过"); //开始封装传输至ERP的请求 log.info("开始封装请求"); //获取ERPID String erpId = goodsPlanData.getString("erp_id__c") != null ? goodsPlanData.getString("erp_id__c") : ""; if ("".equals(erpId)) { log.info("当前单据erp_id__c为空,不再向下执行"); continue; } log.info("存在ERPID,继续向下执行!"); Map erpGoodsPlanReq = new HashMap<>(); erpGoodsPlanReq.put("id", erpId); erpGoodsPlanReq.put("f9w5_crmid", goodsPlanId); erpGoodsPlanReq.put("billno", goodsPlanName);//单据编号 erpGoodsPlanReq.put("billtype_number", "f9w5_sm_purchaseplan_BT");//单据类型 //组织编码 String orgNum = goodsPlanData.getString("erp_organization__c") != null ? goodsPlanData.getString("erp_organization__c") : ""; erpGoodsPlanReq.put("org_number", orgNum);//组织编码 String businessType = goodsPlanData.getString("business_status__c") != null ? goodsPlanData.getString("business_status__c") : ""; switch (businessType) { case "option_normal__c": erpGoodsPlanReq.put("f9w5_busstatus", "A");//业务状态 break; case "option_close__c": erpGoodsPlanReq.put("f9w5_busstatus", "B");//业务状态 break; default: erpGoodsPlanReq.put("f9w5_busstatus", "A");//业务状态 break; } //开始获取需求日期 long biztime = goodsPlanData.getLong("requirement_date__c"); Date date = new Date(biztime); erpGoodsPlanReq.put("biztime", date);//需求日期 //部门编码 String deptCode = ""; List deptIdList = goodsPlanData.getJSONArray("data_own_department"); //开始查询部门编码 JSONObject deptReq = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "_id", deptIdList) ), "DepartmentObj"); JSONObject deptRes = new JSONObject(); try { deptRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, deptReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(deptRes.getString("errorDescription")) && !deptRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject deptData = deptRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); deptCode = deptData.getString("field_Vj6sf__c") != null ? deptData.getString("field_Vj6sf__c") : ""; } erpGoodsPlanReq.put("dept", deptCode);//todo 归属部门 //获取负责人编码 String ownerCode = ""; List ownerIdList = goodsPlanData.getJSONArray("owner"); JSONObject ownerReq = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "user_id", ownerIdList) ), "PersonnelObj"); JSONObject ownerRes = new JSONObject(); try { ownerRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, ownerReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(ownerRes.getString("errorDescription")) && !ownerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject ownerData = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); ownerCode = ownerData.getString("field_T1xid__c") != null ? ownerData.getString("field_T1xid__c") : ""; } erpGoodsPlanReq.put("operator", ownerCode);//todo 负责人 //根据要货计划查询要货计划明细 JSONObject getGoodsPlanDetail = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "purchase_plan__c", Arrays.asList(goodsPlanId)) ), "purchase_plan_details__c"); JSONObject goodsPlanDetailRes = new JSONObject(); try { goodsPlanDetailRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getGoodsPlanDetail, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("要货计划明细查询结果为:" + goodsPlanDetailRes); if (!"success".equals(goodsPlanDetailRes.getString("errorDescription")) || goodsPlanDetailRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("要货计划明细查询失败不存在当前要货计划明细"); continue; } log.info("要货计划明细存在,继续向下执行"); //明细列表 List goodsPlanDetailList = new ArrayList<>(); //用来判断跟踪号是否传输成功 JSONObject trackingNumReason = new JSONObject(); for (Object goodsPlanDetailObj : goodsPlanDetailRes.getJSONObject("data").getJSONArray("dataList")) { JSONObject goodsPlanDetailData = JSON.parseObject(JSON.toJSONString(goodsPlanDetailObj)); System.out.println("当前正在处理的要货计划明细数据为:" + goodsPlanDetailData); String trackingNum = goodsPlanDetailData.getString("batch_number__c") != null ? goodsPlanDetailData.getString("batch_number__c") : ""; if (trackingNum.equals("")) { log.info("跟踪号不存在,将不再向下执行"); trackingNumReason.put("status", "false"); trackingNumReason.put("reason", "跟踪号不存在,将不再向下执行"); continue; } //跟踪号存在,开始执行 JSONObject syncTrackingNum = syncTrackingNum(trackingNum); //判断是否执行成功 if (!"success".equals(syncTrackingNum.getString("errorCode"))) { trackingNumReason.put("status", "false"); trackingNumReason.put("reason", syncTrackingNum.getString("message")); continue; } //开始封装要货计划明细数据 Map erpGoodsPlanDetailReq = new HashMap<>(); erpGoodsPlanDetailReq.put("f9w5_crmentryid", goodsPlanDetailData.getString("_id"));//crm明细id erpGoodsPlanDetailReq.put("material_number", goodsPlanDetailData.getString("material_id__c__r"));//物料编号 erpGoodsPlanDetailReq.put("entryorg_number", orgNum);//组织编码 erpGoodsPlanDetailReq.put("qty", goodsPlanDetailData.getBigDecimal("quantity__c") != null ? goodsPlanDetailData.getBigDecimal("quantity__c") : 0);//数量 //erpGoodsPlanDetailReq.put("lot_number", goodsPlanDetailData.getString("batch_number__c") != null ? goodsPlanDetailData.getString("batch_number__c") : "");//批号 erpGoodsPlanDetailReq.put("entrycomment", goodsPlanDetailData.getString("remark__c") != null ? goodsPlanDetailData.getString("remark__c") : "");//备注 erpGoodsPlanDetailReq.put("f9w5_contractno", goodsPlanDetailData.getString("sales_contract_number__c__r") != null ? goodsPlanDetailData.getString("sales_contract_number__c__r") : "");//销售合同编号 erpGoodsPlanDetailReq.put("f9w5_tracknumber_number", trackingNum);//跟踪号 //开始查询项目号 String projectId = goodsPlanDetailData.getString("project_name__c") != null ? goodsPlanDetailData.getString("project_name__c") : ""; //开始查询项目号 JSONObject getProjectReq = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "_id", Arrays.asList(projectId)) ), "NewOpportunityObj"); JSONObject projectRes = new JSONObject(); try { projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getProjectReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } String projectCode = ""; if ("success".equals(projectRes.getString("errorDescription")) && !projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject projectData = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); projectCode = projectData.getString("opportunity_id__c") != null ? projectData.getString("opportunity_id__c") : ""; } erpGoodsPlanDetailReq.put("f9w5_project_number", projectCode);//项目号 goodsPlanDetailList.add(erpGoodsPlanDetailReq); } //开始封装回写程序 Map backReqMap = new HashMap(); backReqMap.put("_id", goodsPlanId); backReqMap.put("dataObjectApiName", "purchase_plan__c"); //开始判断 if (!trackingNumReason.isEmpty()) { log.info("明细封装错误,将不再向下执行"); backReqMap.put("sync_status__c", "option_sync_failure__c"); backReqMap.put("response_info__c", trackingNumReason.getString("reason")); //开始回写 JSONObject backReq = crmRequestUtil.updateCRM(backReqMap); JSONObject backRes = new JSONObject(); try { backRes = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, backReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("回写结果为:" + backRes); continue; } erpGoodsPlanReq.put("billentry", goodsPlanDetailList); //开始封装要货计划请求 System.out.println("erp请求为:" + JSON.parseObject(JSON.toJSONString(erpGoodsPlanReq))); Map erpContractData = new HashMap<>(); erpContractData.put("data", Arrays.asList(erpGoodsPlanReq));//请求体 String accessToken = new KDTokenController().getKDAccessTokenTest(); if (accessToken == null || accessToken.equals("")) { log.info("金蝶token为空或不存在"); return; } String uuid = UUID.randomUUID().toString().replace("-", ""); //开始封装请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("accessToken", accessToken); headers.set("Idempotency-Key", uuid); HttpEntity goodsPlanReqEntity = new HttpEntity(erpContractData, headers); System.out.println(JSON.parseObject(JSON.toJSONString(goodsPlanReqEntity))); //开始向金蝶发起请求 String goodsPlanUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/sm/f9w5_sm_purchaseplan/purchaseplanSave"; JSONObject erpGoodsPlanRes = new JSONObject(); try { erpGoodsPlanRes = restTemplate.postForObject(goodsPlanUrl, goodsPlanReqEntity, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("要货计划结果为:" + JSON.parseObject(JSON.toJSONString(erpGoodsPlanRes))); //开始封装日志 Map logMap = new HashMap<>(); logMap.put("log_id", UUID.randomUUID().toString().replace("-", "")); logMap.put("log_type", "GPUP"); logMap.put("syn_type", "1"); logMap.put("data_name", goodsPlanName); logMap.put("data_id", goodsPlanId); logMap.put("mark", lastModifyTime); logMap.put("send_body", JSON.toJSONString(goodsPlanReqEntity)); logMap.put("send_res", JSON.toJSONString(erpGoodsPlanRes)); logMap.put("tableName", "send_log_goodsplan"); //判断是否执行成功 if ("0".equals(erpGoodsPlanRes.getString("errorCode"))) { //同步成功 logMap.put("log_status", "0"); logMap.put("res_body", "同步成功"); backReqMap.put("erp_id__c", erpGoodsPlanRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id")); backReqMap.put("sync_status__c", "option_sync_success__c"); backReqMap.put("response_info__c", "同步成功"); } else { //同步失败 logMap.put("log_status", "1"); logMap.put("res_body", "同步失败:" + erpGoodsPlanRes.getString("message")); backReqMap.put("sync_status__c", "option_sync_failure__c"); backReqMap.put("response_info__c", erpGoodsPlanRes.getString("message")); } //开始回写 JSONObject backReq = crmRequestUtil.updateCRM(backReqMap); System.out.println("回写请求为:" + JSON.parseObject(JSON.toJSONString(backReq))); JSONObject backRes = new JSONObject(); try { backRes = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, backReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("回写结果为:" + backRes); //开始记录日志 JSONObject logResMap = new JSONObject(); try { logResMap = restTemplate.postForObject("http://localhost:18085/Log/insert/log_data", logMap, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("日志插入结果为:" + logResMap); } } /** * 跟踪号同步方法 * * @return java.lang.String * @Author weiloong_zhang */ public JSONObject syncTrackingNum(String trackingNum) { CrmRequestUtil crmRequestUtil = new CrmRequestUtil(); //String trackingNum = "YHJH2505290005-1"; JSONObject res = new JSONObject(); JSONObject getTrackNum = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "name", Arrays.asList(trackingNum)) ), "tracking_number__c"); JSONObject trackingNumRes = new JSONObject(); try { trackingNumRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getTrackNum, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("跟踪号查询结果为:" + trackingNumRes); if (!"success".equals(trackingNumRes.getString("errorDescription")) || trackingNumRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("查询失败或者不存在符合条件数据"); res.put("errorCode", "error"); res.put("message", "跟踪号查询失败或者不存在符合条件数据"); return res; } log.info("跟踪号查询成功,继续向下执行"); JSONObject trackingNumData = trackingNumRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); System.out.println("当前正在处理的跟踪号为:" + trackingNumData); String trackingNumStr = trackingNumData.getString("name"); //开始封装跟踪号数据 Map trackingNumMap = new HashMap(); trackingNumMap.put("number", trackingNumStr);//跟踪号 trackingNumMap.put("status", "C");//数据状态 trackingNumMap.put("sourcebillno", trackingNumData.getString("purchase_plan__c__r") != null ? trackingNumData.getString("purchase_plan__c__r") : "");//todo 来源单据编号 trackingNumMap.put("description", "C");//todo 描述 String lineStr = trackingNumStr.split("-")[1]; trackingNumMap.put("sourcebillentryseq", lineStr);//来源单据分录行号 trackingNumMap.put("f9w5_materialname", trackingNumData.getString("material_name__c") != null ? trackingNumData.getString("material_name__c") : "");//物料名称 String isNeedForProduction = trackingNumData.getString("is_need_for_production__c") != null ? trackingNumData.getString("is_need_for_production__c") : ""; switch (isNeedForProduction) { case "yes": trackingNumMap.put("f9w5_isuse", true);//是否需要生产使用该参数 break; case "no": trackingNumMap.put("f9w5_isuse", false);//是否需要生产使用该参数 break; default: trackingNumMap.put("f9w5_isuse", null);//是否需要生产使用该参数 break; } trackingNumMap.put("f9w5_deviceid", trackingNumData.getString("device_id_third__c") != null ? trackingNumData.getString("device_id_third__c") : "");//设备ID(第三方编号) trackingNumMap.put("f9w5_apn", trackingNumData.getString("apn_parameters__c") != null ? trackingNumData.getString("apn_parameters__c") : "");//APN参数 trackingNumMap.put("f9w5_ip", trackingNumData.getString("ip_address__c") != null ? trackingNumData.getString("ip_address__c") : "");//ip trackingNumMap.put("f9w5_port", trackingNumData.getString("port__c") != null ? trackingNumData.getString("port__c") : "");//端口 //是否插卡 String isCard = trackingNumData.getString("is_card_inserted__c") != null ? trackingNumData.getString("is_card_inserted__c") : ""; switch (isCard) { case "yes": trackingNumMap.put("f9w5_bindingcard", true);//是否插卡 break; case "no": trackingNumMap.put("f9w5_bindingcard", false);//是否插卡 break; default: trackingNumMap.put("f9w5_bindingcard", null);//是否插卡 break; } //快快拍模式 String snapShot = trackingNumData.getString("snap_mode__c") != null ? trackingNumData.getString("snap_mode__c") : ""; switch (snapShot) { case "yes": trackingNumMap.put("f9w5_snapshot", true);//是否插卡 break; case "no": trackingNumMap.put("f9w5_snapshot", false);//是否插卡 break; default: trackingNumMap.put("f9w5_snapshot", null);//是否插卡 break; } //前端智能识别 String isFront = trackingNumData.getString("front_end_intelligent_reco__c") != null ? trackingNumData.getString("front_end_intelligent_reco__c") : ""; switch (isFront) { case "yes": trackingNumMap.put("f9w5_frontir", true);//前端智能识别 break; case "no": trackingNumMap.put("f9w5_frontir", false);//前端智能识别 break; default: trackingNumMap.put("f9w5_frontir", null);//前端智能识别 break; } //运行模式修改 String runMode = trackingNumData.getString("operation_mode_update__c") != null ? trackingNumData.getString("operation_mode_update__c") : ""; trackingNumMap.put("f9w5_runmodification", runMode); //通道拍照时间间隔 trackingNumMap.put("f9w5_channelinterval", trackingNumData.getString("channel_photo_interval__c__r") != null ? trackingNumData.getString("channel_photo_interval__c__r") : ""); //通道图片分辨率/像素 trackingNumMap.put("f9w5_channelpixel", trackingNumData.getString("channel_image_resolution__c__r") != null ? trackingNumData.getString("channel_image_resolution__c__r") : ""); //机芯图片分辨率/像素 trackingNumMap.put("f9w5_movementpixel", trackingNumData.getString("core_image_resolution__c__r") != null ? trackingNumData.getString("core_image_resolution__c__r") : ""); //副机通道号 String auxiliarychannel = trackingNumData.getString("secondary_channel_number__c") != null ? trackingNumData.getString("secondary_channel_number__c") : ""; if (auxiliarychannel.equals("") || auxiliarychannel.equals("option_none__c")) { auxiliarychannel = ""; } trackingNumMap.put("f9w5_auxiliarychannel", auxiliarychannel); //机芯拍照时间间隔 trackingNumMap.put("f9w5_movementinterval", trackingNumData.getString("core_photo_interval__c__r") != null ? trackingNumData.getString("core_photo_interval__c__r") : ""); //副机绑定地址 trackingNumMap.put("f9w5_auxiliaryip", trackingNumData.getString("secondary_device_bound_add__c__r") != null ? trackingNumData.getString("secondary_device_bound_add__c__r") : ""); //副机通道类型 String auxiliarychanneltype = trackingNumData.getString("secondary_channel_type__c__r") != null ? trackingNumData.getString("secondary_channel_type__c__r") : ""; if (auxiliarychanneltype.equals("") || auxiliarychanneltype.equals("option_none__c")) { auxiliarychanneltype = ""; } trackingNumMap.put("f9w5_auxiliarytype", auxiliarychanneltype); //维护时间段 trackingNumMap.put("f9w5_maintenancetime", trackingNumData.getString("maintenance_time_period__c") != null ? trackingNumData.getString("maintenance_time_period__c") : ""); //出厂内外卡选择 trackingNumMap.put("f9w5_inoutcard", trackingNumData.getString("factory_external_card_choi__c__r") != null ? trackingNumData.getString("factory_external_card_choi__c__r") : ""); //出厂平台选择 trackingNumMap.put("f9w5_outplatform", trackingNumData.getString("factory_platform_choice__c__r") != null ? trackingNumData.getString("factory_platform_choice__c__r") : ""); //铭牌 trackingNumMap.put("f9w5_nameplate", trackingNumData.getString("tag_name__c__r") != null ? trackingNumData.getString("tag_name__c__r") : ""); //流量卡 trackingNumMap.put("f9w5_flowcard", trackingNumData.getString("traffic_card__c__r") != null ? trackingNumData.getString("traffic_card__c__r") : ""); //联网模式配置 trackingNumMap.put("f9w5_confignetset", trackingNumData.getString("network_mode_config__c__r") != null ? trackingNumData.getString("network_mode_config__c__r") : ""); //是否开启维护模式 String isMaintenance = trackingNumData.getString("is_maintenance_mode_enable__c") != null ? trackingNumData.getString("is_maintenance_mode_enable__c") : ""; switch (isMaintenance) { case "yes": trackingNumMap.put("f9w5_ismaintenance", true);//前端智能识别 break; case "no": trackingNumMap.put("f9w5_ismaintenance", false);//前端智能识别 break; default: trackingNumMap.put("f9w5_ismaintenance", null);//前端智能识别 break; } //物料编码 trackingNumMap.put("f9w5_material_number", trackingNumData.getString("material_code__c__r") != null ? trackingNumData.getString("material_code__c__r") : ""); //平台 trackingNumMap.put("f9w5_smplatform_number", trackingNumData.getString("platform_name_code__c") != null ? trackingNumData.getString("platform_name_code__c") : ""); //todo 来源单据类型.编码 trackingNumMap.put("sourcebilltype_number", "f9w5_sm_purchaseplan_BT"); Map erpTrackReq = new HashMap<>(); erpTrackReq.put("data", Arrays.asList(trackingNumMap)); //开始获取token String accessToken = new KDTokenController().getKDAccessTokenTest(); if (accessToken == null || accessToken.equals("")) { log.info("金蝶token为空或不存在"); res.put("errorCode", "error"); res.put("message", "跟踪号金蝶token为空或不存在"); return res; } String uuid = UUID.randomUUID().toString().replace("-", ""); //开始封装请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("accessToken", accessToken); headers.set("Idempotency-Key", uuid); HttpEntity contractReqEntity = new HttpEntity(erpTrackReq, headers); System.out.println(JSON.parseObject(JSON.toJSONString(contractReqEntity))); String trackingNumUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/sbd/bd_tracknumber/bdTracknumberSave"; //开始调用金蝶接口 JSONObject trackingNumERPRes = new JSONObject(); try { trackingNumERPRes = restTemplate.postForObject(trackingNumUrl, contractReqEntity, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); res.put("errorCode", "error"); res.put("message", "跟踪号新增或更新请求失败"); return res; } System.out.println(JSON.parseObject(JSON.toJSONString(trackingNumERPRes))); if ("0".equals(trackingNumERPRes.getString("errorCode"))) { log.info("金蝶接口返回成功"); String trackingNumId = trackingNumERPRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id"); res.put("errorCode", "success"); res.put("message", "请求成功"); } else { log.info("金蝶接口返回失败"); res.put("errorCode", "error"); res.put("message", "跟踪号新增或更新请求失败" + trackingNumERPRes.getString("message")); return res; } return res; } }