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 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.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; @RestController @RequestMapping("/api/reimbursement") @Slf4j public class ReimbursementController { private RestTemplate restTemplate = new RestTemplate(); public static void main(String[] args) { new ReimbursementController().syncReimbursement(); //new ReimbursementController().syncPublicExpenses(); } /** * 报销查询同步 todo 需要完善 * * @return void * @Author weiloong_zhang */ @PostMapping("/sync/reimburse") public void syncReimbursement() { CrmRequestUtil crmRequestUtil = new CrmRequestUtil(); log.info("开始同步银行信息"); //获取当前时间 LocalDateTime now = LocalDateTime.now(); log.info("当前时间:{}", now); //获取两天前的时间 LocalDateTime twoDaysAgo = now.minusDays(1); //将时间转换样式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String twoDaysAgoStr = twoDaysAgo.format(formatter); String nowStr = now.format(formatter); //开始查询f费用报销单 Map data = new HashMap<>(); data.put("startTime", twoDaysAgoStr); data.put("endTime", nowStr); Map expensesMap = new HashMap<>(); expensesMap.put("data", data); expensesMap.put("pageNo", 1); expensesMap.put("pageSize", 1999); //开始获取金蝶token String accessToken = new KDTokenController().getKDAccessTokenTest(); if (accessToken == null || accessToken.equals("")) { log.info("金蝶token为空或不存在"); return; } //开始封装请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("accessToken", accessToken); HttpEntity expensesEntity = new HttpEntity(expensesMap, headers); String expensesUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/em/er_dailyreimbursebill/dailyreimbursebillQuery"; JSONObject expensesRes = new JSONObject(); try { expensesRes = restTemplate.postForObject(expensesUrl, expensesEntity, JSONObject.class); } catch (Exception e) { e.printStackTrace(); } System.out.println(expensesRes); //开始判断是否存在符合条件的数据 if (!"0".equals(expensesRes.getString("errorCode")) || expensesRes.getJSONObject("data").getJSONArray("rows").isEmpty()) { log.info("查询失败或者没有符合条件的单据"); return; } log.info("数据存在,将继续向下执行"); for (Object expensesObj : expensesRes.getJSONObject("data").getJSONArray("rows")) { JSONObject expensesData = JSON.parseObject(JSON.toJSONString(expensesObj)); System.out.println("当前正在处理的报销单数据为:" + expensesData); //开始截取关键数据 //ERPID String expensesId = expensesData.getString("erpid"); //String expensesId = "6467554454212545"; String expensesCode = expensesData.getString("billno");//编码 String modifyTime = expensesData.getString("modifytime");//最后修改时间 JSONObject isLogRes = new JSONObject(); try { isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_fybx&log_type=FY&dataId=" + expensesId + "&mark=" + modifyTime, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!isLogRes.getJSONArray("data").isEmpty()) { log.info("当前报销单存在日志,将不再向下执行"); continue; } log.info("不存在日志,继续向下执行"); //开始封装请求 Map expensesMapReq = new HashMap<>(); expensesMapReq.put("erp_document_number__c", expensesCode);//单据编号 expensesMapReq.put("erp_id__c", expensesId);//单据ERPID expensesMapReq.put("record_type", "record_kYs9j__c");//业务类型 expensesMapReq.put("dataObjectApiName", "ExpenseClaimFormObj");//对象名称 //开始获取时间数据并转换为字符串 String bizDate = expensesData.getString("bizdate"); // 定义时间格式 DateTimeFormatter formatterB = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析字符串为 LocalDateTime LocalDateTime localDateTime = LocalDateTime.parse(bizDate, formatterB); // 转换为时间戳(毫秒) long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); expensesMapReq.put("application_date", timestamp);//申请日期 //获取负责人信息 String ownerCode = "ID-000016";//todo 负责人编码 JSONObject getOwner = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "field_T1xid__c", Arrays.asList(ownerCode)) ), "PersonnelObj"); JSONObject ownerRes = new JSONObject(); try { ownerRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getOwner, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!"success".equals(ownerRes.getString("errorDescription")) || ownerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("负责人不存在或者请求失败"); continue; } System.out.println("负责人数据为:" + ownerRes); //开始截取负责人user_id String ownerUserId = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("user_id"); expensesMapReq.put("owner", Arrays.asList(ownerUserId)); expensesMapReq.put("applicant", Arrays.asList(ownerUserId)); //todo 费用承担公司 String costCompany = expensesData.getString("costcompany_number"); //事由 String description = expensesData.getString("description") != null ? expensesData.getString("description") : ""; expensesMapReq.put("reason_for_event__c", description);//事由 //开始判断CRM里面是否已经存在该单据 Boolean isExist = false; JSONObject getExpenses = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "erp_id__c", Arrays.asList(expensesId)), new Filter("EQ", "erp_document_number__c", Arrays.asList(expensesCode)) ), "ExpenseClaimFormObj"); JSONObject expensesCRMRes = new JSONObject(); try { expensesCRMRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getExpenses, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(expensesCRMRes.getString("errorDescription")) && !expensesCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("该报销单已经存在"); isExist = true; expensesMapReq.put("_id", expensesCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id")); } //开始封装明细数据 List expensesDetails = new ArrayList<>(); for (Object expensesDetailObj : expensesData.getJSONArray("expenseentryentity")) { JSONObject expensesDetailData = JSON.parseObject(JSON.toJSONString(expensesDetailObj)); System.out.println("当前正在处理的报销单明细数据为:" + expensesDetailData); //开始封装明细数据 Map expensesDetailMap = new HashMap<>(); expensesDetailMap.put("record_type", "default__c"); String costProject = expensesDetailData.getString("std_project_number"); //项目号 if (costProject.contains("SJ")) { //商机编号 JSONObject getBusiness = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "opportunity_id__c", Arrays.asList(costProject)) ), "NewOpportunityObj"); JSONObject businessRes = new JSONObject(); try { businessRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getBusiness, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(businessRes.getString("errorDescription")) && !businessRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject businessData = businessRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); expensesDetailMap.put("", businessData.getString("_id")); } } else if (costProject.contains("XM")) { //项目编号 JSONObject getProject = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "project_no__c", Arrays.asList(costProject)) ), "ProjectObj"); JSONObject projectRes = new JSONObject(); try { projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getProject, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(projectRes.getString("errorDescription")) && !projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject projectData = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); expensesDetailMap.put("project_id", projectData.getString("_id")); } } //todo 成本中心 String costCenter = expensesDetailData.getString("expensesDetailData") != null ? expensesDetailData.getString("expensesDetailData") : ""; expensesDetailMap.put("amount", expensesDetailData.getBigDecimal("expenseamount"));//金额(价税合计) expensesDetailMap.put("erp_row_id__c", expensesDetailData.getString("entryId"));//ERP行ID //开始根据ERP行ID判断是否已经集成过该单据 JSONObject getExpensesDetail = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "_id", Arrays.asList(expensesDetailData.getString("entryId"))) ), "ExpenseClaimFormDetailObj"); JSONObject expensesDetailCRMRes = new JSONObject(); try { expensesDetailCRMRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getExpensesDetail, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(expensesDetailCRMRes.getString("errorDescription")) && !expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("该报销单明细已经存在"); expensesDetailMap.put("_id", expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id")); } expensesDetails.add(expensesDetailMap); } Map detailsMap = new HashMap<>(); detailsMap.put("ExpenseClaimFormDetailObj", expensesDetails); JSONObject expensesReq = crmRequestUtil.crmWithDetail(expensesMapReq, detailsMap); System.out.println("费用报销请求结果为:" + expensesReq); //开始封装日志 Map logMap = new HashMap<>(); logMap.put("log_id", UUID.randomUUID().toString().replace("-", "")); logMap.put("log_type", "FY"); logMap.put("data_name", expensesCode); logMap.put("data_id", expensesId); logMap.put("mark", modifyTime); logMap.put("send_body", JSON.toJSONString(expensesReq)); logMap.put("tableName", "send_log_fybx"); JSONObject expensesCRMReq = new JSONObject(); if (isExist) { //已存在该单据,将进行更新 logMap.put("syn_type", "1"); try { expensesCRMReq = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, expensesReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("费用报销更新请求结果为:" + expensesCRMReq); } else { logMap.put("syn_type", "0"); try { expensesCRMReq = restTemplate.postForObject(URLConstant.CREATE_CRM_CUSTOMER_MAIN, expensesReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("费用报销创建请求结果为:" + expensesCRMReq); } if ("success".equals(expensesCRMReq.getString("errorDescription"))) { logMap.put("log_status", "0"); logMap.put("res_body", "同步成功"); } else { logMap.put("log_status", "1"); logMap.put("res_body", "同步失败" + expensesCRMReq.getString("errorMessage")); } JSONObject logRes = new JSONObject(); try { logRes = restTemplate.postForObject("http://localhost:18085/Log/insert/log_data", logMap, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("日志插入结果为:" + logRes); } } /** * 对公报销 todo 待完善 * * @return void * @Author weiloong_zhang */ @PostMapping public void syncPublicExpenses() { CrmRequestUtil crmRequestUtil = new CrmRequestUtil(); log.info("开始同步对公报销信息"); //获取当前时间 LocalDateTime now = LocalDateTime.now(); log.info("当前时间:{}", now); //获取两天前的时间 LocalDateTime twoDaysAgo = now.minusDays(5); //将时间转换样式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String twoDaysAgoStr = twoDaysAgo.format(formatter); String nowStr = now.format(formatter); //开始查询f费用报销单 Map data = new HashMap<>(); data.put("startTime", twoDaysAgoStr); data.put("endTime", nowStr); Map expensesMap = new HashMap<>(); expensesMap.put("data", data); expensesMap.put("pageNo", 1); expensesMap.put("pageSize", 1999); //开始获取金蝶token String accessToken = new KDTokenController().getKDAccessTokenTest(); if (accessToken == null || accessToken.equals("")) { log.info("金蝶token为空或不存在"); return; } //开始封装请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("accessToken", accessToken); HttpEntity expensesEntity = new HttpEntity(expensesMap, headers); String expensesUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/em/er_publicreimbursebill/publicreimbursebillQuery"; JSONObject expensesRes = new JSONObject(); try { expensesRes = restTemplate.postForObject(expensesUrl, expensesEntity, JSONObject.class); } catch (Exception e) { e.printStackTrace(); } System.out.println(expensesRes); //判断是否成功或者数据是否存在 if (!"0".equals(expensesRes.getString("errorCode")) || expensesRes.getJSONObject("data").getJSONArray("rows").isEmpty()) { log.info("查询失败或者没有符合条件的单据"); return; } for (Object expensesObj : expensesRes.getJSONObject("data").getJSONArray("rows")) { JSONObject expensesData = JSON.parseObject(JSON.toJSONString(expensesObj)); System.out.println("当前正在处理数据为:" + expensesData); //开始截取关键数据 //ERPID String erpId = expensesData.getString("erpid"); //单据名称 String erpNo = expensesData.getString("billno"); //最后修改时间 String modifyTime = expensesData.getString("modifytime"); //开始判断是否已经集成过该单据 JSONObject isLogRes = new JSONObject(); try { isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_fybx&log_type=FYDG&dataId=" + erpId + "&mark=" + modifyTime, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!isLogRes.getJSONArray("data").isEmpty()) { log.info("当前数据已经执行过了,将不再向下执行"); continue; } log.info("日志不存在,将继续向下执行"); //开始封装请求参数 Map expensesMainReq = new HashMap(); expensesMainReq.put("erp_document_number__c", erpNo);//ERP单据编码 expensesMainReq.put("erp_id__c", erpId);//ERP单据ID expensesMainReq.put("record_type", "record_Lu2Cc__c"); expensesMainReq.put("dataObjectApiName", "ExpenseClaimFormObj");//对象名称 expensesMainReq.put("reason_for_event__c", expensesData.getString("description") != null ? expensesData.getString("description") : "");//事由 //开始获取时间数据并转换为字符串 String bizDate = expensesData.getString("bizdate"); // 定义时间格式 DateTimeFormatter formatterB = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析字符串为 LocalDateTime LocalDateTime localDateTime = LocalDateTime.parse(bizDate, formatterB); // 转换为时间戳(毫秒) long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); expensesMainReq.put("application_date", timestamp);//申请日期 //获取负责人信息 String ownerCode = "ID-000016";//todo 负责人编码 JSONObject getOwner = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "field_T1xid__c", Arrays.asList(ownerCode)) ), "PersonnelObj"); JSONObject ownerRes = new JSONObject(); try { ownerRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getOwner, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!"success".equals(ownerRes.getString("errorDescription")) || ownerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("负责人不存在或者请求失败"); continue; } System.out.println("负责人数据为:" + ownerRes); //开始截取负责人user_id String ownerUserId = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("user_id"); expensesMainReq.put("owner", Arrays.asList(ownerUserId)); expensesMainReq.put("applicant", Arrays.asList(ownerUserId)); //开始判断CRM里面是否已经存在该单据 Boolean isExist = false; JSONObject getExpenses = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "erp_id__c", Arrays.asList(erpId)), new Filter("EQ", "erp_document_number__c", Arrays.asList(erpNo)) ), "ExpenseClaimFormObj"); JSONObject expensesCRMRes = new JSONObject(); try { expensesCRMRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getExpenses, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(expensesCRMRes.getString("errorDescription")) && !expensesCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("该报销单已经存在"); isExist = true; expensesMainReq.put("_id", expensesCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id")); } List expensesDetailReq = new ArrayList(); //开始封装明细数据 for (Object expenseDetailObj : expensesData.getJSONArray("expenseentryentity")) { JSONObject expenseDetailData = JSON.parseObject(JSON.toJSONString(expenseDetailObj)); System.out.println("当前正在处理明细数据为:" + expenseDetailData); //开始封装明细数据 Map expensesDetail = new HashMap(); expensesDetail.put("record_type", "record_Eex1M__c");//对公报销 String projectCode = expenseDetailData.getString("std_project_number") != null ? expenseDetailData.getString("std_project_number") : ""; //开始判断项目来源 if (projectCode.contains("SJ")) { //商机编号 JSONObject getBusiness = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "opportunity_id__c", Arrays.asList(projectCode)) ), "NewOpportunityObj"); JSONObject businessRes = new JSONObject(); try { businessRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getBusiness, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(businessRes.getString("errorDescription")) && !businessRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject businessData = businessRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); expensesDetail.put("", businessData.getString("_id")); } } else if (projectCode.contains("XM")) { //项目编号 JSONObject getProject = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "project_no__c", Arrays.asList(projectCode)) ), "ProjectObj"); JSONObject projectRes = new JSONObject(); try { projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getProject, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(projectRes.getString("errorDescription")) && !projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { JSONObject projectData = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0); expensesDetail.put("project_id", projectData.getString("_id")); } } expensesDetail.put("amount", expenseDetailData.getBigDecimal("expenseamount"));//金额(价税合计) expensesDetail.put("erp_row_id__c", expenseDetailData.getString("entryId"));//ERP行ID //开始根据ERP行ID判断是否已经集成过该单据 JSONObject getExpensesDetail = crmRequestUtil.getCRMList(Arrays.asList( new Filter("EQ", "_id", Arrays.asList(expenseDetailData.getString("entryId"))) ), "ExpenseClaimFormDetailObj"); JSONObject expensesDetailCRMRes = new JSONObject(); try { expensesDetailCRMRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getExpensesDetail, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if ("success".equals(expensesDetailCRMRes.getString("errorDescription")) && !expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("该报销单明细已经存在"); expensesDetail.put("_id", expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id")); } expensesDetailReq.add(expensesDetail); } Map detailsMap = new HashMap<>(); detailsMap.put("ExpenseClaimFormDetailObj", expensesDetailReq); JSONObject expensesReq = crmRequestUtil.crmWithDetail(expensesMainReq, detailsMap); System.out.println("费用报销请求结果为:" + expensesReq); //开始封装日志 Map logMap = new HashMap<>(); logMap.put("log_id", UUID.randomUUID().toString().replace("-", "")); logMap.put("log_type", "FYDG"); logMap.put("data_name", erpNo); logMap.put("data_id", erpId); logMap.put("mark", modifyTime); logMap.put("send_body", JSON.toJSONString(expensesReq)); logMap.put("tableName", "send_log_fybx"); JSONObject expensesCRMReq = new JSONObject(); if (isExist) { //已存在该单据,将进行更新 logMap.put("syn_type", "1"); try { expensesCRMReq = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, expensesReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("费用报销更新请求结果为:" + expensesCRMReq); } else { logMap.put("syn_type", "0"); try { expensesCRMReq = restTemplate.postForObject(URLConstant.CREATE_CRM_CUSTOMER_MAIN, expensesReq, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("费用报销创建请求结果为:" + expensesCRMReq); } if ("success".equals(expensesCRMReq.getString("errorDescription"))) { logMap.put("log_status", "0"); logMap.put("res_body", "同步成功"); } else { logMap.put("log_status", "1"); logMap.put("res_body", "同步失败" + expensesCRMReq.getString("errorMessage")); } JSONObject logRes = new JSONObject(); try { logRes = restTemplate.postForObject("http://localhost:18085/Log/insert/log_data", logMap, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("日志插入结果为:" + logRes); } } }