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.util.MultiValueMap; 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.*; @RestController @RequestMapping("/api/quality/feedback") @Slf4j public class QualityBackController { private RestTemplate restTemplate = new RestTemplate(); public static void main(String[] args) { new QualityBackController().qualityFeedBack(); } /** * 问题质量反馈单更新 * * @return void * @Author weiloong_zhang */ @PostMapping("/sync/quality_back") public void qualityFeedBack() { CrmRequestUtil crmRequestUtil = new CrmRequestUtil(); log.info("开始同步新建质量反馈单"); String[] syncStatus = {"option_pending_sync__c", "option_resync__c"}; JSONObject getQualityBack = crmRequestUtil.getCRMList(Arrays.asList( //new Filter("IS", "erp_id__c", Arrays.asList("")), new Filter("IN", "sync_status__c", Arrays.asList(syncStatus)), new Filter("EQ", "life_status", Arrays.asList("normal")), //new Filter("EQ", "name", Arrays.asList("ZLXXFK202505270002")), new Filter("GT", "create_time", Arrays.asList("1748923200000")) ), "quality_feedback_form__c"); JSONObject qualityBack = new JSONObject(); try { qualityBack = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getQualityBack, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!"success".equals(qualityBack.getString("errorDescription")) || qualityBack.getJSONObject("data").getJSONArray("dataList").isEmpty()) { log.info("质量反馈单请求失败,或者不存在符合条件的数据"); return; } log.info("质量反馈单请求成功,继续向下执行"); for (Object qualityBackObj : qualityBack.getJSONObject("data").getJSONArray("dataList")) { JSONObject qualityBackData = JSON.parseObject(JSON.toJSONString(qualityBackObj)); System.out.println("当前正在处理的数据为:" + qualityBackData); //开始截取关键数据 //唯一性id String qualityId = qualityBackData.getString("_id"); //反馈单单号 String qualityName = qualityBackData.getString("name"); //反馈单创建时间 //String createTime = qualityBackData.getString("create_time"); String createTime = qualityBackData.getString("last_modified_time"); //开始查询当前单据是否已经集成过 JSONObject isLogRes = new JSONObject(); try { isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_quality&log_type=Quality&dataId=" + qualityId + "&mark=" + createTime, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } if (!isLogRes.getJSONArray("data").isEmpty()) { log.info("当前数据已经执行过了,将不再向下执行"); continue; } log.info("日志不存在,将继续向下执行"); //开始封装数据 Map qualityReqMap = new HashMap<>(); qualityReqMap.put("billno", qualityName);//单据编号 qualityReqMap.put("crmid", qualityId);//CRM唯一id //获取负责人编码 String ownerCode = ""; List ownerIdList = qualityBackData.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") : ""; } //qualityReqMap.put("provider_number", "ZHY10542");//todo 反馈人(负责人编号) qualityReqMap.put("provider_number", ownerCode);//todo 反馈人(负责人编号) //部门编码 String deptCode = ""; List deptIdList = qualityBackData.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") : ""; } //qualityReqMap.put("dept_number", "ZHY");//归属部门 qualityReqMap.put("dept_number", deptCode);//归属部门 //qualityReqMap.put("org_number", "ZHY");//todo 组织编码 qualityReqMap.put("org_number", qualityBackData.getString("erp_organization__c") != null ? qualityBackData.getString("erp_organization__c") : "");//todo 组织编码 qualityReqMap.put("contractno", qualityBackData.getString("contract_number__c__r") != null ? qualityBackData.getString("contract_number__c__r") : "");//销售合同号 qualityReqMap.put("productionbatch", qualityBackData.getString("production_batch__c") != null ? qualityBackData.getString("production_batch__c") : "");//生产批次 long askedTime = qualityBackData.getLong("required_processing_time__c") != null ? qualityBackData.getLong("required_processing_time__c") : 0; qualityReqMap.put("handletime", new Date(askedTime));//要求处理时间 long installTime = qualityBackData.getLong("installation_time__c") != null ? qualityBackData.getLong("installation_time__c") : 0; qualityReqMap.put("installtime", new Date(installTime));//项目安装时间 long happenTime = qualityBackData.getLong("event_occurrence_time__c") != null ? qualityBackData.getLong("event_occurrence_time__c") : 0; qualityReqMap.put("occurrencetime", new Date(happenTime));//事件发生时间 //产品型号 qualityReqMap.put("productmodel", qualityBackData.getString("product_model__c") != null ? qualityBackData.getString("product_model__c") : "");//产品型号 qualityReqMap.put("problemdesc", qualityBackData.getString("on_site_issue_description__c") != null ? qualityBackData.getString("on_site_issue_description__c") : "");//现场问题描述 Map erpQualityData = new HashMap<>(); erpQualityData.put("data", Arrays.asList(qualityReqMap));//请求体 //开始获取token String token = new KDTokenController().getKDAccessTokenTest(); if (token == null || token.equals("")) { log.info("金蝶token为空或不存在"); return; } String uuid = UUID.randomUUID().toString().replace("-", ""); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("accessToken", token); headers.set("Idempotency-Key", uuid); HttpEntity qualityBackReqEntity = new HttpEntity(erpQualityData, headers); System.out.println(JSON.parseObject(JSON.toJSONString(qualityBackReqEntity))); String qualityBackUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/qcqi/f9w5_problemfeedback/save"; String qualityBackRes = ""; try { qualityBackRes = restTemplate.postForObject(qualityBackUrl, qualityBackReqEntity, String.class); } catch (RestClientException e) { e.printStackTrace(); } JSONObject qualityBackResJson = JSON.parseObject(qualityBackRes); System.out.println("质量反馈结果为:" + qualityBackResJson); //开始封装回写程序 Map backReqMap = new HashMap(); backReqMap.put("_id", qualityId); backReqMap.put("dataObjectApiName", "quality_feedback_form__c"); //开始封装日志 Map logMap = new HashMap<>(); logMap.put("log_id", UUID.randomUUID().toString().replace("-", "")); logMap.put("log_type", "Quality"); logMap.put("syn_type", "0"); logMap.put("data_name", qualityName); logMap.put("data_id", qualityId); logMap.put("mark", createTime); logMap.put("send_body", JSON.toJSONString(erpQualityData)); logMap.put("send_res", JSON.toJSONString(qualityBackResJson)); logMap.put("tableName", "send_log_quality"); //判断是否执行成功 if ("0".equals(qualityBackResJson.getString("errorCode"))) { //同步成功 logMap.put("log_status", "0"); logMap.put("res_body", "同步成功"); backReqMap.put("erp_id__c", qualityBackResJson.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", "同步失败:" + qualityBackResJson.getString("message")); backReqMap.put("sync_status__c", "option_sync_failure__c"); backReqMap.put("response_info__c", qualityBackResJson.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 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); //判断是否存在附件 if (qualityBackData.getJSONArray("attachment__c") == null || qualityBackData.getJSONArray("attachment__c").isEmpty()) { log.info("该质量反馈单不存在附件,将不再向下执行。"); continue; } //附件存在,将开始执行附件上传 List attachmentList = qualityBackData.getJSONArray("attachment__c"); MultiValueMap body = crmRequestUtil.proxyUploadFileToTarget(attachmentList, qualityId); //开始封装请求实体 HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); httpHeaders.set("accessToken", token); HttpEntity entity = new HttpEntity(body, httpHeaders); //开始发起传输 JSONObject fileRes = new JSONObject(); try { fileRes = restTemplate.postForObject(ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/qcqi/feedback/uploadFile", entity, JSONObject.class); } catch (RestClientException e) { e.printStackTrace(); } System.out.println("附件上传结果为:" + fileRes); } } }