1116 lines
54 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.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.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* 销售合同同步
*
* @return null
* @Author weiloong_zhang
*/
@RestController
@RequestMapping("/api/sign/conract")
@Slf4j
public class XSHTController {
private RestTemplate restTemplate = new RestTemplate();
public static void main(String[] args) {
//new XSHTController().syncXSHT();
//new XSHTController().isComplete();
new XSHTController().XSHTBGSync();
}
/**
* 销售合同同步
*
* @return void
* @Author weiloong_zhang
*/
@PostMapping("/sync_xsht")
public void syncXSHT() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
String[] syncStatus = {"option_pending_sync__c", "option_resync__c"};
JSONObject preContractReq = crmRequestUtil.getCRMList(Arrays.asList(
//new Filter("IS", "erp_id__c", Arrays.asList("")),
new Filter("IN", "sync_status__c", Arrays.asList(syncStatus)),
new Filter("GT", "create_time", Arrays.asList("1748923200000")),
//new Filter("EQ", "name", Arrays.asList("ZHY2505280021")),
new Filter("N", "is_initial__c", Arrays.asList("true")),
new Filter("EQ", "life_status", Arrays.asList("normal"))
), "SaleContractObj");
JSONObject ContractRes = new JSONObject();
try {
ContractRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, preContractReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
//判断查询是否成功
if (!"success".equals(ContractRes.getString("errorDescription")) || ContractRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("查询失败或者没有符合条件的单据");
return;
}
for (Object ContractObj : ContractRes.getJSONObject("data").getJSONArray("dataList")) {
//销售合同数据
JSONObject contractData = JSON.parseObject(JSON.toJSONString(ContractObj));
System.out.println("当前正在处理的数据为:" + contractData);
//合同唯一id
String contractId = contractData.getString("_id");
//合同名称
String contractName = contractData.getString("name");
//创建时间
//String createTime = contractData.getString("create_time");
String createTime = contractData.getString("last_modified_time");
//查看数据库表中是否已执行过当前数据
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_htxx&log_type=XSHT&dataId=" + contractId + "&mark=" + createTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println(isLogRes);
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前数据已经执行过了,将不再向下执行");
continue;
}
log.info("没有集成过,将继续向下执行");
//签订日期
long documentDate = contractData.getLong("contract_time");
Date date = new Date(documentDate);
//开始查询项目号(商机)
JSONObject projectReq = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(contractData.getString("opportunity_name__c")))
), "NewOpportunityObj");
JSONObject projectRes = new JSONObject();
try {
projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, projectReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(projectRes.getString("errorDescription")) || projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("项目号不存在,将不再向下执行");
continue;
}
String projectCode = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("opportunity_id__c");
//合同种类
String contractType = contractData.getString("contract_zl__c") != null ? contractData.getString("contract_zl__c") : "";
if (contractType.equals("")) {
log.info("合同种类不存在,将不再向下执行");
continue;
}
String contractMainType = "";
String contractTypeStr = "";
if (contractType.equals("option_sales_contract_details__c")) {
contractMainType = "XSHT-QD01";
contractTypeStr = "020";
} else if (contractType.equals("option_sales_contract_total_amoun__c")) {
contractMainType = "XSHT-QD02";
contractTypeStr = "020-1";
}
//开始封装传输至ERP的请求
Map erpContractReq = new HashMap<>();
erpContractReq.put("billno", contractData.getString("name"));//合同编号
erpContractReq.put("crmid", contractData.getString("_id"));//CRM唯一性编码
erpContractReq.put("project_number", projectCode);//项目号
erpContractReq.put("zhybilltype", contractData.getString("contract_type__c"));//合同类型
//erpContractReq.put("project_number", "SJ20250424-0033");//项目号
erpContractReq.put("billtype_number", "conm_salcontract_BT_QD");//单据类型
erpContractReq.put("billname", contractData.getString("project_name__c") != null ? contractData.getString("project_name__c") : "销售合同");//合同名称
erpContractReq.put("type_number", contractMainType);//合同类型
erpContractReq.put("contparties_number", contractData.getString("our_company_name__c") != null ? contractData.getString("our_company_name__c") : "");//合同主体
erpContractReq.put("createorg_number", contractData.getString("our_company_name__c") != null ? contractData.getString("our_company_name__c") : "");//销售组织编码
erpContractReq.put("org_number", contractData.getString("our_company_name__c") != null ? contractData.getString("our_company_name__c") : "");//销售组织编码
erpContractReq.put("currency_number", "CNY");//本位币.货币代码
erpContractReq.put("settlecurrency_number", "CNY");//结算币别.货币代码
erpContractReq.put("biztime", date);//签订日期,单据日期
erpContractReq.put("biztimebegin", date);//起始日期
erpContractReq.put("biztimeend", date);//截止日期
erpContractReq.put("party1st", contractData.getString("account_id__r") != null ? contractData.getString("account_id__r") : "");//甲方
erpContractReq.put("party2nd", contractData.getString("our_company_name__c__r") != null ? contractData.getString("our_company_name__c__r") : "");//乙方
erpContractReq.put("bizmode", "C");//业务模式 A:统谈统签, B:统谈分签,C:分谈分签
erpContractReq.put("totalallamount", 0);//价税合计
erpContractReq.put("deviceqty", 0);//价税合计
//部门编码
String deptCode = "";
List deptIdList = contractData.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") : "";
}
//erpContractReq.put("dept", "zyierp");//归属部门
erpContractReq.put("dept", deptCode);//归属部门
//获取负责人编码
String ownerCode = "";
List ownerIdList = contractData.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") : "";
}
//erpContractReq.put("operator", "ZHY10542");//todo 负责人
erpContractReq.put("operator", ownerCode);//todo 负责人
//合同单位
String customerId = contractData.getString("account_id");
//根据客户唯一id查询客户名称
JSONObject customerReq = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(customerId))
), "AccountObj");
JSONObject customerRes = new JSONObject();
try {
customerRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, customerReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(customerRes.getString("errorDescription")) || customerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("客户名称查询失败或者不存在,直接跳过更新");
continue;
}
JSONObject customerData = customerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0);
erpContractReq.put("customer_number", customerData.getString("account_no") != null ? customerData.getString("account_no") : "");//合同单位名称
erpContractReq.put("reccustomer_number", contractData.getString("receiver_customer__c") != null ? contractData.getString("receiver_customer__c") : "");//收获客户单位名称
//erpContractReq.put("customer_number", "Cus-000001");//合同单位名称
erpContractReq.put("settlecustomer_number", contractData.getString("billing_customer_code__c") != null ? contractData.getString("billing_customer_code__c") : "");//结算客户
erpContractReq.put("payingcustomer_number", contractData.getString("payment_customer_code__c") != null ? contractData.getString("payment_customer_code__c") : "");//付款客户
//获取产品线
erpContractReq.put("productline_number", contractData.getString("product_line__c") != null ? contractData.getString("product_line__c") : "");//产品线
//获取具体安装方式
erpContractReq.put("installationmethod", contractData.getString("installation_method__c") != null ? contractData.getString("installation_method__c") : "");//安装方式
//行业类型
erpContractReq.put("industrytype_number", contractData.getString("industry_type__c") != null ? contractData.getString("industry_type__c") : "");//行业类型
erpContractReq.put("province", contractData.getString("field_9IuQE__c__r") != null ? contractData.getString("field_9IuQE__c__r") : "");//省
erpContractReq.put("city", contractData.getString("field_9IuQE__c__r") != null ? contractData.getString("field_9IuQE__c__r") : "");//市
erpContractReq.put("county", contractData.getString("field_e9XrV__c") != null ? contractData.getString("field_e9XrV__c") : "");//县
erpContractReq.put("warranty", contractData.getBigDecimal("warranty_period_months__c") != null ? contractData.getBigDecimal("warranty_period_months__c") : 0);//质保期
//是否招投标
Boolean isBidding = null;
switch (contractData.getString("is_bidding__c")) {
case "yes":
isBidding = true;
break;
case "no":
isBidding = false;
break;
default:
isBidding = null;
break;
}
erpContractReq.put("isbidding", isBidding);
erpContractReq.put("customerpropert", contractData.getString("customer_attribute__c") != null ? contractData.getString("customer_attribute__c") : "");//客户属性
erpContractReq.put("station", contractData.getString("bureau_level__c") != null ? contractData.getString("bureau_level__c") : "");//局级
//款到发货
Boolean delivery = null;
switch (contractData.getString("ship_on_payment_received__c")) {
case "yes":
delivery = true;
break;
case "no":
delivery = false;
break;
default:
delivery = null;
break;
}
erpContractReq.put("delivery", delivery);
//项目来源
erpContractReq.put("projectsource", contractData.getString("project_source__c") != null ? contractData.getString("project_source__c") : "");
//销售方式
erpContractReq.put("salesmethod", contractData.getString("sales_method__c") != null ? contractData.getString("sales_method__c") : "");
List payMethodList = contractData.getJSONArray("payment_method__c") != null ? contractData.getJSONArray("payment_method__c") : new ArrayList();
List payMethodListMap = new ArrayList();
if (payMethodList != null && !payMethodList.isEmpty()) {
for (Object payMethodStr : payMethodList) {
String payMethod = payMethodStr.toString();
//单个付款方式
Map paymentMethodMap = new HashMap<>();
if ("1".equals(payMethod)) {
//预付款
//款项名称
paymentMethodMap.put("payname_number", "1");
//收款比例
paymentMethodMap.put("payrate", contractData.getBigDecimal("prepayment_ratio__c") != null ? contractData.getBigDecimal("prepayment_ratio__c") : BigDecimal.ZERO);
//预付款金额
paymentMethodMap.put("payamount", contractData.getBigDecimal("pre_invoice_amount__c") != null ? contractData.getBigDecimal("pre_invoice_amount__c") : BigDecimal.ZERO);
//是否预收
paymentMethodMap.put("isprepay", true);
} else if ("2".equals(payMethod)) {
//到货款
//款项名称
paymentMethodMap.put("payname_number", "2");
//收款比例
paymentMethodMap.put("payrate", contractData.getBigDecimal("arrival_payment_ratio__c") != null ? contractData.getBigDecimal("arrival_payment_ratio__c") : BigDecimal.ZERO);
//预付款金额
paymentMethodMap.put("payamount", contractData.getBigDecimal("received_amount__c") != null ? contractData.getBigDecimal("received_amount__c") : BigDecimal.ZERO);
//是否预收
paymentMethodMap.put("isprepay", false);
} else if ("3".equals(payMethod)) {
//投运款
//款项名称
paymentMethodMap.put("payname_number", "3");
//收款比例
paymentMethodMap.put("payrate", contractData.getBigDecimal("commission_ratio__c") != null ? contractData.getBigDecimal("commission_ratio__c") : BigDecimal.ZERO);
//预付款金额
paymentMethodMap.put("payamount", contractData.getBigDecimal("commission_amount__c") != null ? contractData.getBigDecimal("commission_amount__c") : BigDecimal.ZERO);
//是否预收
paymentMethodMap.put("isprepay", false);
} else if ("4".equals(payMethod)) {
//质保金
//款项名称
paymentMethodMap.put("payname_number", "4");
//收款比例
paymentMethodMap.put("payrate", contractData.getBigDecimal("warranty_deposit__c") != null ? contractData.getBigDecimal("warranty_deposit__c") : BigDecimal.ZERO);
//预付款金额
paymentMethodMap.put("payamount", contractData.getBigDecimal("warranty_amount__c") != null ? contractData.getBigDecimal("warranty_amount__c") : BigDecimal.ZERO);
//是否预收
paymentMethodMap.put("isprepay", false);
}
payMethodListMap.add(paymentMethodMap);
}
}
erpContractReq.put("payentry", payMethodListMap);
//根据合同号查询合同明细
JSONObject contractDetailReq = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "sale_contract_id", Arrays.asList(contractId))
), "SaleContractLineObj");
JSONObject contractDetailRes = new JSONObject();
try {
contractDetailRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, contractDetailReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(contractDetailRes.getString("errorDescription")) || contractDetailRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("合同明细查询失败或者不存在,直接跳过");
continue;
}
//合同明细存在,继续向下执行
List contractDetailList = new ArrayList<>();
for (Object contractDetailObj : contractDetailRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject contractDetailData = JSON.parseObject(JSON.toJSONString(contractDetailObj));
System.out.println("当前正在处理的明细为:" + contractDetailData);
//开始封装销售合同明细
Map contractDetailMap = new HashMap();
contractDetailMap.put("linetype_number", contractTypeStr);//行类型
contractDetailMap.put("goodsname", contractDetailData.getString("product_name__c"));//产品名称
//contractDetailMap.put("material_number", contractDetailData.getString("product_id__r"));//物料编号
contractDetailMap.put("material_number", "80800001");//物料编号
contractDetailMap.put("specification", contractDetailData.getString("specification__c") != null ? contractDetailData.getString("specification__c") : "");//规格
//contractDetailMap.put("baseunit", contractDetailData.getString("unit__c__r") != null ? contractDetailData.getString("unit__c__r") : "");//单位
//contractDetailMap.put("baseunit", "TEST0001");//todo 单位
//contractDetailMap.put("unit_number", contractDetailData.getString("unit__c") != null ? contractDetailData.getString("unit__c") : "");//单位编码
contractDetailMap.put("unit1_number", contractDetailData.getString("unit__c") != null ? contractDetailData.getString("unit__c") : "");//单位编码
//contractDetailMap.put("f9w5_unit1_number", contractDetailData.getString("unit__c") != null ? contractDetailData.getString("unit__c") : "");//单位编码
//contractDetailMap.put("baseqty", contractDetailData.getBigDecimal("quantity") != null ? contractDetailData.getBigDecimal("quantity") : 0);//数量
contractDetailMap.put("qty", contractDetailData.getBigDecimal("quantity") != null ? contractDetailData.getBigDecimal("quantity") : 0);//数量
contractDetailMap.put("priceandtax", contractDetailData.getBigDecimal("sales_price") != null ? contractDetailData.getBigDecimal("sales_price") : 0);//含税单价
//contractDetailMap.put("taxrateid_number", contractDetailData.getBigDecimal("tax_rate__c") != null ? contractDetailData.getBigDecimal("tax_rate__c") : 0);//税率
contractDetailMap.put("taxrateid_number", "V13");//税率
contractDetailMap.put("curamountandtax", contractDetailData.getBigDecimal("subtotal") != null ? contractDetailData.getBigDecimal("subtotal") : 0);//价税合计
//contractDetailMap.put("curtaxamount", contractDetailData.getBigDecimal("tax_amount__c") != null ? contractDetailData.getBigDecimal("tax_amount__c") : 0);//金额
contractDetailMap.put("crmentryid", contractDetailData.getString("_id"));//明细id
contractDetailList.add(contractDetailMap);
}
//开始封装明细
erpContractReq.put("billentry", contractDetailList);
System.out.println("erp请求为" + JSON.parseObject(JSON.toJSONString(erpContractReq)));
Map erpContractData = new HashMap<>();
erpContractData.put("data", Arrays.asList(erpContractReq));//请求体
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 contractReqEntity = new HttpEntity(erpContractData, headers);
System.out.println(JSON.parseObject(JSON.toJSONString(contractReqEntity)));
//开始向金蝶发起请求
String contractUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/conm/conm_salcontract/savecontract";
JSONObject contractRes = new JSONObject();
try {
contractRes = restTemplate.postForObject(contractUrl, contractReqEntity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println(JSON.parseObject(JSON.toJSONString(contractRes)));
//开始封装回写程序
Map backReqMap = new HashMap();
backReqMap.put("_id", contractId);
backReqMap.put("dataObjectApiName", "SaleContractObj");
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "XSHT");
logMap.put("syn_type", "0");
logMap.put("data_name", contractName);
logMap.put("data_id", contractId);
logMap.put("mark", createTime);
logMap.put("send_body", JSON.toJSONString(contractReqEntity));
logMap.put("send_res", JSON.toJSONString(contractRes));
logMap.put("tableName", "send_log_htxx");
//判断是否执行成功
if ("0".equals(contractRes.getString("errorCode"))) {
//同步成功
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
backReqMap.put("erp_id__c", contractRes.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(contractRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id"), "conm_salcontract");
} else {
//同步失败
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败:" + contractRes.getString("message"));
backReqMap.put("sync_status__c", "option_sync_failure__c");
backReqMap.put("response_info__c", contractRes.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_MAIN, 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);
log.info("开始同步销售合同附件");
//判断销售合同是否执行成功
String contractERPID = "";
if ("0".equals(contractRes.getString("errorCode"))) {
log.info("销售合同执行成功");
contractERPID = contractRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id");
} else {
log.info("销售合同执行失败,将不再向下执行");
continue;
}
List contractFileList = contractData.getJSONArray("contract_attachment__c") != null ? contractData.getJSONArray("contract_attachment__c") : new ArrayList();
if (contractFileList == null || contractFileList.isEmpty()) {
log.info("该销售合同不存在附件,将不再向下执行。");
continue;
}
log.info("附件存在,继续向下执行");
MultiValueMap<String, Object> body = crmRequestUtil.contractFile(contractFileList, Long.parseLong(contractERPID));
//开始封装请求实体
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
httpHeaders.set("accessToken", accessToken);
HttpEntity entity = new HttpEntity(body, httpHeaders);
//开始发起传输
JSONObject fileRes = new JSONObject();
try {
fileRes = restTemplate.postForObject(ERPURLConstant.ERP_URL + "/ierp/kapi/v2/frame/attachment/uploadFile", entity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("附件上传结果为:" + fileRes);
}
}
/**
* 销售合同变更
*
* @return void
* @Author weiloong_zhang
*/
@PostMapping("/sync/XSHTBG")
public void XSHTBGSync() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
long twoDaysAgo = LocalDateTime.now()
.minusDays(1)
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
JSONObject getContract = crmRequestUtil.getCRMList(Arrays.asList(
//new Filter("EQ", "name", Arrays.asList("ZHY25062476-04")),
new Filter("GT", "create_time", Arrays.asList(String.valueOf(twoDaysAgo))),
new Filter("EQ", "life_status", Arrays.asList("normal"))
), "SaleContractChangeObj");
JSONObject contractBGRes = new JSONObject();
try {
contractBGRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getContract, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(contractBGRes.getString("errorDescription")) || contractBGRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("未找到销售合同或者查询失败");
return;
}
for (Object contractBGObj : contractBGRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject contractBGData = JSON.parseObject(JSON.toJSONString(contractBGObj));
System.out.println("当前销售合同变更数据为:" + contractBGData);
//开始截取关键数据
String contractBGId = contractBGData.getString("_id");
String createTime = contractBGData.getString("create_time");
String contractBGName = contractBGData.getString("name");
//原单单据
String originalContractName = contractBGData.getString("name");
//开始查看是否已经同步
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_htxx&log_type=XSHTBG&dataId=" + contractBGId + "&mark=" + createTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前数据已经执行过了,将不再向下执行");
continue;
}
log.info("日志不存在,将继续向下执行");
//合同种类
String contractType = contractBGData.getString("change_contract_zl__c") != null ? contractBGData.getString("change_contract_zl__c") : "";
if (contractType.equals("")) {
log.info("合同种类不存在,将不再向下执行");
continue;
}
String contractMainType = "";
String contractTypeStr = "";
if (contractType.equals("option_sales_contract_details__c")) {
contractMainType = "XSHT-QD01";
contractTypeStr = "020";
} else if (contractType.equals("option_sales_contract_total_amoun__c")) {
contractMainType = "XSHT-QD02";
contractTypeStr = "020-1";
}
//开始封装请求体
Map contractBGMap = new HashMap();
contractBGMap.put("billno", contractBGName);//合同编号
//开始获取商机编号
String businessId = contractBGData.getString("change_opportunity_name__c") != null ? contractBGData.getString("change_opportunity_name__c") : "";
//根据商机唯一性ID获取商机编号
JSONObject getBusiness = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(businessId))
), "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()) {
log.info("不存在该商机,将不再向下执行");
continue;
}
String projectCode = businessRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("opportunity_id__c");
contractBGMap.put("project", projectCode);//项目号
//合同类型
contractBGMap.put("zhybilltype", contractBGData.getString("change_contract_type__c") != null ? contractBGData.getString("change_contract_type__c") : "");
//项目名称
contractBGMap.put("billname", contractBGData.getString("change_project_name__c") != null ? contractBGData.getString("change_project_name__c") : "");
//来源单据号
contractBGMap.put("srcbillnumber", contractBGData.getString("original_data__r") != null ? contractBGData.getString("original_data__r") : "");
//来源单ID
contractBGMap.put("srcsysbillid", contractBGData.getString("original_data") != null ? contractBGData.getString("original_data") : "");
//CRMID
contractBGMap.put("crmid", contractBGData.getString("original_data") != null ? contractBGData.getString("original_data") : "");
//获取部门
String ownerDept = contractBGData.getString("owner_department_id") != null ? contractBGData.getString("owner_department_id") : "";
JSONObject getDept = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(ownerDept))
), "DepartmentObj");
JSONObject deptRes = new JSONObject();
try {
deptRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getDept, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(deptRes.getString("errorDescription")) || deptRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("不存在该部门,将不再向下执行");
continue;
}
//开始获取部门
String deptERPCode = deptRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("field_Vj6sf__c");
contractBGMap.put("dept", deptERPCode);//部门编码
//contractBGMap.put("dept", "zyierp");//部门编码
List ownerId = contractBGData.getJSONArray("owner") != null ? contractBGData.getJSONArray("owner") : new ArrayList<>();
JSONObject getOwner = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "user_id", ownerId)
), "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);
String ownerUserId = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("field_T1xid__c");
contractBGMap.put("operator", ownerUserId);//负责人
//contractBGMap.put("operator", "ID-000016");//负责人
//是否招投标
Boolean isBidding = null;
switch (contractBGData.getString("change_is_bidding__c")) {
case "yes":
isBidding = true;
break;
case "no":
isBidding = false;
break;
default:
isBidding = null;
break;
}
contractBGMap.put("isbidding", isBidding);
//客户属性
contractBGMap.put("customerpropert", contractBGData.getString("change_customer_attribute__c") != null ? contractBGData.getString("change_customer_attribute__c") : "");
//付款比例
contractBGMap.put("payratio", contractBGData.getBigDecimal("change_prepayment_ratio__c") != null ? contractBGData.getBigDecimal("change_prepayment_ratio__c") : BigDecimal.ZERO);
//质保期
contractBGMap.put("warranty", contractBGData.getBigDecimal("change_warranty_period_months__c") != null ? contractBGData.getBigDecimal("change_warranty_period_months__c") : BigDecimal.ZERO);
//订货客户
contractBGMap.put("customer", contractBGData.getString("change_billing_customer_code__c") != null ? contractBGData.getString("change_billing_customer_code__c") : "");
//产品线
contractBGMap.put("productLine", contractBGData.getString("change_product_line__c") != null ? contractBGData.getString("change_product_line__c") : "");
//安装方式
contractBGMap.put("installationmethod", contractBGData.getString("change_installation_method__c") != null ? contractBGData.getString("change_installation_method__c") : "");
//行业类型
contractBGMap.put("industrytype", contractBGData.getString("change_industry_type__c") != null ? contractBGData.getString("change_industry_type__c") : "");
//省
contractBGMap.put("province", contractBGData.getString("change_field_9IuQE__c__r") != null ? contractBGData.getString("change_field_9IuQE__c__r") : "");
//市
contractBGMap.put("city", contractBGData.getString("change_field_cuMW9__c__r") != null ? contractBGData.getString("change_field_cuMW9__c__r") : "");
//区
contractBGMap.put("county", contractBGData.getString("change_field_e9XrV__c__r") != null ? contractBGData.getString("change_field_e9XrV__c__r") : "");
//局级
contractBGMap.put("station", contractBGData.getString("change_bureau_level__c") != null ? contractBGData.getString("change_bureau_level__c") : "");
//款到发货
Boolean delivery = null;
switch (contractBGData.getString("change_ship_on_payment_received__c")) {
case "yes":
delivery = true;
break;
case "no":
delivery = false;
break;
default:
delivery = null;
break;
}
contractBGMap.put("delivery", delivery);
//项目来源
contractBGMap.put("projectsource", contractBGData.getString("change_project_source__c") != null ? contractBGData.getString("change_project_source__c") : "");
//销售方式
contractBGMap.put("salesmethod", contractBGData.getString("change_sales_method__c") != null ? contractBGData.getString("change_sales_method__c") : "");
//开始查询明细
JSONObject getContractBGDetail = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "changed_data", Arrays.asList(contractBGId))
), "SaleContractLineChangeObj");
JSONObject contractBGDetailRes = new JSONObject();
try {
contractBGDetailRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getContractBGDetail, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(contractBGDetailRes.getString("errorDescription")) || contractBGDetailRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("合同明细不存在或者请求失败");
continue;
}
//请求成功,开始封装
List contractBGDetailList = new ArrayList();
for (Object contractBGDetailObj : contractBGDetailRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject contractBGDetailData = JSON.parseObject(JSON.toJSONString(contractBGDetailObj));
System.out.println("合同明细数据为:" + contractBGDetailData);
//开始封装合同变更单明细
Map contractBGDetailMap = new HashMap();
//商品名称
contractBGDetailMap.put("goodsname", contractBGDetailData.getString("change_product_name__c") != null ? contractBGDetailData.getString("change_product_name__c") : "");
//规格型号
contractBGDetailMap.put("specification", contractBGDetailData.getString("change_specification__c") != null ? contractBGDetailData.getString("change_specification__c") : "");
//todo 计量单位
contractBGDetailMap.put("unit", contractBGDetailData.getString("change_unit__c") != null ? contractBGDetailData.getString("change_unit__c") : "");
//数量
contractBGDetailMap.put("qty", contractBGDetailData.getBigDecimal("change_quantity") != null ? contractBGDetailData.getBigDecimal("change_quantity") : BigDecimal.ZERO);
//含税单价
contractBGDetailMap.put("priceandtax", contractBGDetailData.getBigDecimal("change_sales_price") != null ? contractBGDetailData.getBigDecimal("change_sales_price") : BigDecimal.ZERO);
//税率
contractBGDetailMap.put("taxrateid", contractBGDetailData.getString("change_tax_rate_code__c") != null ? contractBGDetailData.getString("change_tax_rate_code__c") : "");
//开始获取变更类型
String changeType = contractBGDetailData.getString("changed_type") != null ? contractBGDetailData.getString("changed_type") : "";
if (changeType.equals("add")) {
log.info("新增行");
//变更类型为新增获取当前的行ID
contractBGDetailMap.put("changeType", "add");
//行ID
contractBGDetailMap.put("crmentryid", contractBGDetailData.getString("original_detail_data"));
//物料编码
contractBGDetailMap.put("material", "80800001");
//行类型
contractBGDetailMap.put("lineType", contractTypeStr);
} else if (changeType.equals("update")) {
log.info("更新行");
//变更类型为删除或者修改获取当源单的行id
contractBGDetailMap.put("changeType", "modify");
contractBGDetailMap.put("crmentryid", contractBGDetailData.getString("original_detail_data"));
} else if (changeType.equals("deleted")) {
log.info("删除行");
contractBGDetailMap.put("changeType", "delete");
contractBGDetailMap.put("crmentryid", contractBGDetailData.getString("original_detail_data"));
} else {
log.info("变更类型不存在");
continue;
}
contractBGDetailList.add(contractBGDetailMap);
}
contractBGMap.put("entryList", contractBGDetailList);
//开始获取token
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 contractReqEntity = new HttpEntity(contractBGMap, headers);
System.out.println(JSON.parseObject(JSON.toJSONString(contractReqEntity)));
String contractUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/conm/salcontract/change";
JSONObject contractRes = new JSONObject();
try {
contractRes = restTemplate.postForObject(contractUrl, contractReqEntity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println(JSON.parseObject(JSON.toJSONString(contractRes)));
//开始封装回写程序
Map backReqMap = new HashMap();
backReqMap.put("_id", contractBGData.getString("original_data"));
backReqMap.put("dataObjectApiName", "SaleContractObj");
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "XSHTBG");
logMap.put("syn_type", "0");
logMap.put("data_name", contractBGName);
logMap.put("data_id", contractBGId);
logMap.put("mark", createTime);
logMap.put("send_body", JSON.toJSONString(contractReqEntity));
logMap.put("send_res", JSON.toJSONString(contractRes));
logMap.put("tableName", "send_log_htxx");
//判断是否执行成功
if ("0".equals(contractRes.getString("errorCode"))) {
//同步成功
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
//backReqMap.put("sales_contract_ERPID__c", contractRes.getJSONObject("data").getString("pkId"));
backReqMap.put("sync_status__c", "option_sync_success__c");
backReqMap.put("response_info__c", "变更同步成功,同步时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//开始审核
// KingDeeUtils kingDeeUtils = new KingDeeUtils();
// kingDeeUtils.audit(contractRes.getJSONObject("data").getJSONArray("result").getJSONObject(0).getString("id"), "conm_salcontract");
} else {
//同步失败
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败:" + contractRes.getString("message"));
backReqMap.put("sync_status__c", "option_sync_failure__c");
backReqMap.put("response_info__c", "变更失败:" + contractRes.getString("message") + ",同步时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
//开始回写
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);
//开始记录日志
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);
}
}
/**
* 是否竣工
*
* @return void
* @Author weiloong_zhang
*/
@PostMapping("/isComplete")
public void isComplete() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
JSONObject contractReq = crmRequestUtil.getCRMList(Arrays.asList(
//new Filter("EQ", "name", Arrays.asList("ZHY2505180013")),
new Filter("GT", "create_time", Arrays.asList("1748923200000")),
new Filter("EQ", "is_completed__c", Arrays.asList("yes"))
), "SaleContractObj");
JSONObject contractRes = new JSONObject();
try {
contractRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, contractReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(contractRes.getString("errorDescription")) || contractRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("没有找到销售合同");
return;
}
log.info("数据存在,继续向下执行");
for (Object contractObj : contractRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject contractData = JSON.parseObject(JSON.toJSONString(contractObj));
System.out.println("当前正在处理的销售合同数据为:" + contractData);
//开始查询该销售合同是否已经执行过
JSONObject isLogRes = new JSONObject();
String contractId = contractData.getString("_id");
String contractName = contractData.getString("name");
String createTime = contractData.getString("create_time");
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_htxx&log_type=是否竣工&dataId=" + contractId + "&mark=" + createTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前数据已经执行过了,将不再向下执行");
continue;
}
log.info("日志不存在,将继续向下执行");
//开始封装请求
Map isCompleteReqMap = new HashMap<>();
isCompleteReqMap.put("billno", contractName);
Map isCompleteReq = new HashMap<>();
isCompleteReq.put("model", isCompleteReqMap);
//开始获取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 isCompleteEntity = new HttpEntity(isCompleteReq, headers);
System.out.println(JSON.parseObject(JSON.toJSONString(isCompleteEntity)));
JSONObject isCompleteRes = new JSONObject();
try {
isCompleteRes = restTemplate.postForObject(ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/f9w5_conm_ext/salcontract/beComplete", isCompleteEntity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println(JSON.parseObject(JSON.toJSONString(isCompleteRes)));
//开始封装回写程序
Map backReqMap = new HashMap();
backReqMap.put("_id", contractId);
backReqMap.put("dataObjectApiName", "SaleContractObj");
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "是否竣工");
logMap.put("syn_type", "0");
logMap.put("data_name", contractName);
logMap.put("data_id", contractId);
logMap.put("mark", createTime);
logMap.put("send_body", JSON.toJSONString(isCompleteEntity));
logMap.put("send_res", JSON.toJSONString(isCompleteRes));
logMap.put("tableName", "send_log_htxx");
//判断是否执行成功
if ("0".equals(isCompleteRes.getString("errorCode"))) {
//同步成功
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
backReqMap.put("completion_sync_status__c", "option_sync_success__c");
backReqMap.put("response_info__c", "同步成功");
} else {
//同步失败
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败:" + isCompleteRes.getString("message"));
backReqMap.put("completion_sync_status__c", "option_sync_failure__c");
backReqMap.put("response_info__c", isCompleteRes.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_MAIN, 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);
}
}
}