841 lines
38 KiB
Java

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.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
@RestController
@RequestMapping("/api/invoice")
@Slf4j
public class InvoiceController {
private RestTemplate restTemplate = new RestTemplate();
public static void main(String[] args) {
//new InvoiceController().syncInvoice();
new InvoiceController().syncRedInvoice();
}
/**
* 发票同步
*
* @return void
* @Author weiloong_zhang
*/
@PostMapping("/sync_invoice")
public void syncInvoice() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
String[] syncStatus = {"option_pending_sync__c", "option_resync__c"};
JSONObject getInvoice = 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("20250527-000010"))
new Filter("GT", "create_time", Arrays.asList("1748923200000"))
), "InvoiceApplicationObj");
log.info("开始同步创建发票");
JSONObject invoiceRes = new JSONObject();
try {
invoiceRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getInvoice, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(invoiceRes.getString("errorDescription")) || invoiceRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("发票查询失败或者不存在");
return;
}
log.info("单据存在,继续向下执行");
for (Object invoiceObj : invoiceRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject invoiceData = JSON.parseObject(JSON.toJSONString(invoiceObj));
System.out.println("当前正在处理的发票为:" + invoiceData);
//开始截取关键数据
//发票CRMID
String invoiceId = invoiceData.getString("_id");
//发票名称
String invoiceName = invoiceData.getString("name");
//开票创建时间
//String createTime = invoiceData.getString("create_time");
String createTime = invoiceData.getString("last_modified_time");
//开始判断数据库中是否存在数据
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_invoice&log_type=KP&dataId=" + invoiceId + "&mark=" + createTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前数据已经执行过了,将不再向下执行");
continue;
}
log.info("日志不存在,将继续向下执行");
//开始封装请求
Map invoiceMap = new HashMap();
String invoiceType = invoiceData.getString("record_type") != null ? invoiceData.getString("record_type") : "";
invoiceMap.put("billsourcetype", "blue");
invoiceMap.put("crmbillno", invoiceName);//单据编号
invoiceMap.put("crmid", invoiceData.getString("sales1_contract__c"));//销售合同CRMID
//是否国网
String isGWStr = invoiceData.getString("is_state_grid__c") != null ? invoiceData.getString("is_state_grid__c") : "";
Boolean isGW = null;
switch (isGWStr) {
case "ubaL12a0M":
isGW = true;
break;
case "tiVjNIMLU":
isGW = false;
break;
default:
isGW = null;
break;
}
invoiceMap.put("isgw", isGW);//是否国网
//是否设计建筑服务
String isJZStr = invoiceData.getString("is_involved_construction_s__c") != null ? invoiceData.getString("is_involved_construction_s__c") : "";
Boolean isJZ = null;
switch (isJZStr) {
case "option_is_yes__c":
isJZ = true;
break;
case "option_is_no__c":
isJZ = false;
break;
default:
isJZ = null;
break;
}
invoiceMap.put("isjzfw", isJZ);//是否设计建筑服务
//是否跨地市
String isCityStr = invoiceData.getString("is_cross_city__c") != null ? invoiceData.getString("is_cross_city__c") : "";
Boolean isCity = null;
switch (isCityStr) {
case "option_is_yes__c":
isCity = true;
break;
case "option_is_no__c":
isCity = false;
break;
default:
isCity = null;
break;
}
invoiceMap.put("iskds", isCity);//是否跨地市
invoiceMap.put("jzaddr", invoiceData.getString("field_b11hY__c") != null ? invoiceData.getString("field_b11hY__c") : "");//建筑服务发生地
invoiceMap.put("jzpjname", invoiceData.getString("field_6cxEV__c") != null ? invoiceData.getString("field_6cxEV__c") : "");//建筑服务项目名称
invoiceMap.put("crminvoiceid", invoiceId);//crm开票申请ID
//开票类型
String invoiceKinds = invoiceData.getString("invoice_type") != null ? invoiceData.getString("invoice_type") : "";
invoiceMap.put("invoicetype", invoiceKinds);
invoiceMap.put("comment", invoiceData.getString("remark") != null ? invoiceData.getString("remark") : "");//发票备注
invoiceMap.put("buyeremail", invoiceData.getString("invoice_delivery_email__c") != null ? invoiceData.getString("invoice_delivery_email__c") : "2019326567@qq.com");//发票推送邮箱
//开票单位编码
String customerId = invoiceData.getString("invoice_unit__c") != null ? invoiceData.getString("invoice_unit__c") : "TEST0001";
//根据客户唯一id查询客户编码
JSONObject getCustomer = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(customerId))
), "AccountObj");
JSONObject customerRes = new JSONObject();
try {
customerRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getCustomer, 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);
String customerNumber = customerData.getString("account_no");
invoiceMap.put("asstact_number", customerNumber);//往来户(客户)
invoiceMap.put("buyertaxno", invoiceData.getString("tax_id") != null ? invoiceData.getString("tax_id") : "");//纳税人识别号
//开票地址
String invoice_add = invoiceData.getString("invoice_add") != null ? invoiceData.getString("invoice_add") : "";
invoiceMap.put("buyeraddr", invoice_add);//购方地址
//电话
String invoice_phone = invoiceData.getString("invoice_tel") != null ? invoiceData.getString("invoice_tel") : "";
invoiceMap.put("buyerphone", invoice_phone);//购方电话
//开户行
String account_bank = invoiceData.getString("account_bank") != null ? invoiceData.getString("account_bank") : "";
invoiceMap.put("buyerbank", account_bank);
//开户账号
String account_bank_no = invoiceData.getString("account_bank_no") != null ? invoiceData.getString("account_bank_no") : "";
invoiceMap.put("buyerbanknumber", account_bank_no);
//是否展示地址电话
Boolean isShowTel = invoiceData.getBoolean("show_address_phone__c");
invoiceMap.put("showbuyeraddresstel", isShowTel);
//是否展示明细
Boolean isShowDetail = invoiceData.getBoolean("invoice_details_complete__c");
invoiceMap.put("showdetails", isShowDetail);
//是否展示开户行及账号
Boolean isShowBank = invoiceData.getBoolean("show_bank_account__c");
invoiceMap.put("showbuyerbank", isShowBank);
//是否含软
String isHasSoft = invoiceData.getString("is_contain_soft__c") != null ? invoiceData.getString("is_contain_soft__c") : "";
Boolean isHasSoftBool = false;
switch (isHasSoft) {
case "v2j71Ak5p":
isHasSoftBool = true;
break;
case "YOZj917km":
isHasSoftBool = false;
break;
}
invoiceMap.put("issoftworks", isHasSoftBool);
//软著版本编码
invoiceMap.put("softworks_number", invoiceData.getString("positive_number__c") != null ? invoiceData.getString("positive_number__c") : "");
//开始查询明细
JSONObject getInvoiceDetail = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "invoice_id", Arrays.asList(invoiceId))
), "InvoiceApplicationLinesObj");
JSONObject invoiceDetailRes = new JSONObject();
try {
invoiceDetailRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getInvoiceDetail, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(invoiceDetailRes.getString("errorDescription")) || invoiceDetailRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("发票明细查询失败或者不存在");
continue;
}
log.info("发票明细查询成功,将继续向下执行");
List entry = new ArrayList<>();
for (Object invoiceDetailObj : invoiceDetailRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject invoiceDetailData = JSON.parseObject(JSON.toJSONString(invoiceDetailObj));
System.out.println("当前正在处理的明细为:" + invoiceDetailData);
Map entryMap = new HashMap();
if (invoiceType.equals("default__c")) {
//blue传销售合同明细id
entryMap.put("crmentryid", invoiceDetailData.getString("sales_contract_details__c"));
} else if (invoiceType.equals("record_3pGf2__c")) {
//red传开票申请单明细id
entryMap.put("crmentryid", invoiceDetailData.getString("_id"));
}
entryMap.put("crminvoiceentryid", invoiceDetailData.getString("_id"));//开票申请明细id
entryMap.put("goodsname", invoiceDetailData.getString("invoice_product_name__c") != null ? invoiceDetailData.getString("invoice_product_name__c") : "");//商品名称
//entryMap.put("softworks_number", invoiceDetailData.getString("invoice_product_num__c") != null ? invoiceDetailData.getString("invoice_product_num__c") : "");//软著编码
entryMap.put("taxratecodeid_number", invoiceDetailData.getString("product_category__c") != null ? invoiceDetailData.getString("product_category__c") : "");//税收分类
entryMap.put("quantity", invoiceDetailData.getBigDecimal("field_9C0j7__c") != null ? invoiceDetailData.getBigDecimal("field_9C0j7__c") : 0);//数量
entryMap.put("taxunitprice", invoiceDetailData.getBigDecimal("tax_inclusive_unit_price__c") != null ? invoiceDetailData.getBigDecimal("tax_inclusive_unit_price__c") : 0);//含税单价
entryMap.put("recamount", invoiceDetailData.getBigDecimal("invoiced_amount") != null ? invoiceDetailData.getBigDecimal("invoiced_amount") : 0);//应收金额-开票小计
entryMap.put("taxrateid_number", invoiceDetailData.getString("tax_rate_code__c") != null ? invoiceDetailData.getString("tax_rate_code__c") : "");//税率编码
entryMap.put("measureunit_number", invoiceDetailData.getString("unit__c") != null ? invoiceDetailData.getString("unit__c") : "");//计量单位
entryMap.put("specification", invoiceDetailData.getString("specification_model__c") != null ? invoiceDetailData.getString("specification_model__c") : "");//规格型号
entry.add(entryMap);
}
invoiceMap.put("entry", entry);
//开始获取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 invoiceReqEntity = new HttpEntity(invoiceMap, headers);
System.out.println(JSON.parseObject(JSON.toJSONString(invoiceReqEntity)));
String invoiceUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/ar/arbusbill/createInvoice";
JSONObject erpInvoiceRes = new JSONObject();
try {
erpInvoiceRes = restTemplate.postForObject(invoiceUrl, invoiceReqEntity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println(erpInvoiceRes);
//开始封装回写程序
Map backReqMap = new HashMap();
backReqMap.put("_id", invoiceId);
backReqMap.put("dataObjectApiName", "InvoiceApplicationObj");
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "KP");
logMap.put("syn_type", "0");
logMap.put("data_name", invoiceName);
logMap.put("data_id", invoiceId);
logMap.put("mark", createTime);
logMap.put("send_body", JSON.toJSONString(invoiceReqEntity));
logMap.put("send_res", JSON.toJSONString(erpInvoiceRes));
logMap.put("tableName", "send_log_invoice");
//判断是否执行成功
if ("0".equals(erpInvoiceRes.getString("errorCode"))) {
//同步成功
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
backReqMap.put("erp_id__c", erpInvoiceRes.getJSONObject("data").getString("pkId"));
backReqMap.put("sync_status__c", "option_sync_success__c");
backReqMap.put("response_info__c", "同步成功");
} else {
//同步失败
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败:" + erpInvoiceRes.getString("message"));
backReqMap.put("sync_status__c", "option_sync_failure__c");
backReqMap.put("response_info__c", erpInvoiceRes.getString("message"));
}
//开始回写
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
public void syncRedInvoice() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
String[] syncStatus = {"option_pending_sync__c", "option_resync__c"};
JSONObject getRedInvoice = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("IN", "sync_status__c", Arrays.asList(syncStatus)),
//new Filter("IS", "field_UB1hE__c", Arrays.asList("")),
//new Filter("EQ", "name", Arrays.asList("HCFP2505-0003")),
new Filter("GT", "create_time", Arrays.asList("1748923200000")),
new Filter("EQ", "life_status", Arrays.asList("normal"))
), "custom_object_example1__c");
JSONObject redInvoiceRes = new JSONObject();
try {
redInvoiceRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getRedInvoice, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(redInvoiceRes.getString("errorDescription")) || redInvoiceRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("未找到红冲发票或者查询失败");
return;
}
for (Object redInvoiceObj : redInvoiceRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject redInvoiceData = JSON.parseObject(JSON.toJSONString(redInvoiceObj));
System.out.println("当前正在处理数据为:" + redInvoiceData);
//开始截取关键数据
//唯一性编码
String redInvoiceId = redInvoiceData.getString("_id");
//红冲单号
String redInvoiceName = redInvoiceData.getString("name");
//红冲单创建时间
String createTime = redInvoiceData.getString("last_modified_time");
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_invoice&log_type=REDKP&dataId=" + redInvoiceId + "&mark=" + createTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("查询日志结果为:" + isLogRes);
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前数据已经执行过了,将不再向下执行");
continue;
}
log.info("日志不存在,将继续向下执行");
Map invoiceMap = new HashMap();
invoiceMap.put("billsourcetype", "red");//单据类型
invoiceMap.put("crmbillno", redInvoiceName);//单据编号
invoiceMap.put("crmid", redInvoiceData.getString("blue_invoice_application__c"));//红冲开票CRMID
invoiceMap.put("crminvoiceid", redInvoiceId);//CRM红冲开票申请ID
invoiceMap.put("invoicetype", redInvoiceData.getString("invoice_type__c") != null ? redInvoiceData.getString("invoice_type__c") : "");//开票类型
invoiceMap.put("comment", redInvoiceData.getString("invoice_note__c") != null ? redInvoiceData.getString("invoice_note__c") : "");//备注
invoiceMap.put("buyeremail", redInvoiceData.getString("invoice_delivery_email__c") != null ? redInvoiceData.getString("invoice_delivery_email__c") : "2019326567@qq.com");//发票推送邮箱
//开票单位编码
String customerId = redInvoiceData.getString("customer_name__c") != null ? redInvoiceData.getString("customer_name__c") : "TEST0001";
//根据客户唯一id查询客户编码
JSONObject getCustomer = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(customerId))
), "AccountObj");
JSONObject customerRes = new JSONObject();
try {
customerRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getCustomer, 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);
String customerNumber = customerData.getString("account_no");
invoiceMap.put("asstact_number", customerNumber);//往来户(客户)
invoiceMap.put("buyertaxno", redInvoiceData.getString("tax_identification_number__c") != null ? redInvoiceData.getString("tax_identification_number__c") : "");//纳税识别号
invoiceMap.put("buyeraddr", redInvoiceData.getString("invoice_address__c") != null ? redInvoiceData.getString("invoice_address__c") : "");//地址
invoiceMap.put("buyerphone", redInvoiceData.getString("field_SM1Wc__c") != null ? redInvoiceData.getString("field_SM1Wc__c") : "");//电话
invoiceMap.put("showbuyeraddresstel", redInvoiceData.getBooleanValue("show_address_phone__c"));//是否展示地址电话
invoiceMap.put("buyerbank", redInvoiceData.getString("bank_branch__c") != null ? redInvoiceData.getString("bank_branch__c") : "");//开户行
invoiceMap.put("buyerbanknumber", redInvoiceData.getString("account_number__c") != null ? redInvoiceData.getString("account_number__c") : "");//开户行账号
invoiceMap.put("showbuyerbank", redInvoiceData.getBooleanValue("show_bank_account__c"));//是否展示开户行
invoiceMap.put("showdetails", redInvoiceData.getBooleanValue("is_display_invoice_details__c"));//是否展示发票明细(名称、数量、单价、单位、规格)
String isSoftWorks = redInvoiceData.getString("is_contain_soft__c") != null ? redInvoiceData.getString("is_contain_soft__c") : "";
Boolean isSoftWorksFlag = false;
switch (isSoftWorks) {
case "v2j71Ak5p":
isSoftWorksFlag = true;
break;
case "YOZj917km":
isSoftWorksFlag = false;
break;
}
invoiceMap.put("issoftworks", isSoftWorksFlag);//是否含软
//是否国网
String isGWStr = redInvoiceData.getString("is_state_grid__c") != null ? redInvoiceData.getString("is_state_grid__c") : "";
Boolean isGW = null;
switch (isGWStr) {
case "ubaL12a0M":
isGW = true;
break;
case "tiVjNIMLU":
isGW = false;
break;
default:
isGW = null;
break;
}
invoiceMap.put("isgw", isGW);//是否国网
//是否设计建筑服务
String isJZStr = redInvoiceData.getString("is_involved_construction__c") != null ? redInvoiceData.getString("is_involved_construction__c") : "";
Boolean isJZ = null;
switch (isJZStr) {
case "option_is_yes__c":
isJZ = true;
break;
case "option_is_no__c":
isJZ = false;
break;
default:
isJZ = null;
break;
}
invoiceMap.put("isjzfw", isJZ);//是否设计建筑服务
//是否跨地市
String isCityStr = redInvoiceData.getString("is_cross_city__c") != null ? redInvoiceData.getString("is_cross_city__c") : "";
Boolean isCity = null;
switch (isCityStr) {
case "option_is_yes__c":
isCity = true;
break;
case "option_is_no__c":
isCity = false;
break;
default:
isCity = null;
break;
}
invoiceMap.put("iskds", isCity);//是否跨地市
invoiceMap.put("jzaddr", redInvoiceData.getString("service_occurrence_locatio__c") != null ? redInvoiceData.getString("service_occurrence_locatio__c") : "");//建筑服务发生地
invoiceMap.put("jzpjname", redInvoiceData.getString("project_name__c") != null ? redInvoiceData.getString("project_name__c") : "");//建筑服务项目名称
invoiceMap.put("softworks_number", redInvoiceData.getString("registration_number__c") != null ? redInvoiceData.getString("registration_number__c") : "");//软著版本编码
invoiceMap.put("blueinvoiceno", redInvoiceData.getString("original_invoice_number__c") != null ? redInvoiceData.getString("original_invoice_number__c") : "");//待冲蓝字发票号码
invoiceMap.put("redreason", redInvoiceData.getString("redemption_reason__c") != null ? redInvoiceData.getString("redemption_reason__c") : "");//冲红原因
//开始查询明细数据
JSONObject getInvoiceDetail = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "red_invoice_application__c", Arrays.asList(redInvoiceId))
), "red_invoice_details__c");
JSONObject invoiceDetailRes = new JSONObject();
try {
invoiceDetailRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getInvoiceDetail, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(invoiceDetailRes.getString("errorDescription")) || invoiceDetailRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("请求失败或数据不存在");
continue;
}
log.info("查询明细数据成功,继续向下执行和封装");
List<Map> invoiceDetailList = new ArrayList<>();
for (Object invoiceDetailObj : invoiceDetailRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject invoiceDetailData = JSON.parseObject(JSON.toJSONString(invoiceDetailObj));
Map invoiceDetailMap = new HashMap();
invoiceDetailMap.put("crmentryid", invoiceDetailData.getString("invoice_application_detail__c"));
invoiceDetailMap.put("crminvoiceentryid", invoiceDetailData.getString("_id"));
invoiceDetailMap.put("goodsname", invoiceDetailData.getString("name__c") != null ? invoiceDetailData.getString("name__c") : "");//商品名称
invoiceDetailMap.put("taxratecodeid_number", invoiceDetailData.getString("product_category__c") != null ? invoiceDetailData.getString("product_category__c") : "");//税收分类编码-商品分类编码
BigDecimal quality = invoiceDetailData.getBigDecimal("red_canceled_quantity__c");
if (quality.compareTo(BigDecimal.ZERO) > 0) {
quality = quality.negate();
}
invoiceDetailMap.put("quality", quality);//数量
invoiceDetailMap.put("taxunitprice", invoiceDetailData.getBigDecimal("tax_inclusive_unit_price__c"));//含税单价
BigDecimal receivablePrice = invoiceDetailData.getBigDecimal("unit_price_taxINCLUDED_tot__c");
if (receivablePrice.compareTo(BigDecimal.ZERO) > 0) {
receivablePrice = receivablePrice.negate();
}
invoiceDetailMap.put("recamount", receivablePrice);//应收金额
invoiceDetailMap.put("taxrateid_number", invoiceDetailData.getString("tax_rate_code__c"));//税率编码
invoiceDetailMap.put("measureunit_number", invoiceDetailData.getString("unit__c") != null ? invoiceDetailData.getString("unit__c") : "");//计量单位
invoiceDetailMap.put("specification", invoiceDetailData.getString("specification_model__c"));//规格型号
invoiceDetailList.add(invoiceDetailMap);
}
invoiceMap.put("entry", invoiceDetailList);
//开始获取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 invoiceReqEntity = new HttpEntity(invoiceMap, headers);
System.out.println(JSON.parseObject(JSON.toJSONString(invoiceReqEntity)));
String invoiceUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/ar/arbusbill/createInvoice";
JSONObject erpInvoiceRes = new JSONObject();
try {
erpInvoiceRes = restTemplate.postForObject(invoiceUrl, invoiceReqEntity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println(erpInvoiceRes);
//开始封装回写程序
Map backReqMap = new HashMap();
backReqMap.put("_id", redInvoiceId);
backReqMap.put("dataObjectApiName", "custom_object_example1__c");
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "REDKP");
logMap.put("syn_type", "0");
logMap.put("data_name", redInvoiceName);
logMap.put("data_id", redInvoiceId);
logMap.put("mark", createTime);
logMap.put("send_body", JSON.toJSONString(invoiceReqEntity));
logMap.put("send_res", JSON.toJSONString(erpInvoiceRes));
logMap.put("tableName", "send_log_invoice");
//判断是否执行成功
if ("0".equals(erpInvoiceRes.getString("errorCode"))) {
//同步成功
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
backReqMap.put("field_UB1hE__c", erpInvoiceRes.getJSONObject("data").getString("pkId"));
backReqMap.put("sync_status__c", "option_sync_success__c");
backReqMap.put("response_info__c", "同步成功");
} else {
//同步失败
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败:" + erpInvoiceRes.getString("message"));
backReqMap.put("sync_status__c", "option_sync_failure__c");
backReqMap.put("response_info__c", erpInvoiceRes.getString("message"));
}
//开始回写
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("/sync/delete/invoice")
public void deleteInvoice() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
long twoDaysAgo = LocalDateTime.now()
.minusDays(2)
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
JSONObject getInvoice = crmRequestUtil.getCRMList(Arrays.asList(
//new Filter("EQ", "name", Arrays.asList("2025-06-14-0005")),
new Filter("GT", "last_modified_time", Arrays.asList(String.valueOf(twoDaysAgo))),
new Filter("EQ", "life_status", Arrays.asList("invalid"))
), "ExpenseClaimFormObj");
JSONObject invoiceRes = new JSONObject();
try {
invoiceRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getInvoice, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(invoiceRes.getString("errorDescription")) || invoiceRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("未找到作废的开票申请数据或者查询失败");
return;
}
log.info("当前作废的开票申请数据存在");
for (Object invoiceObj : invoiceRes.getJSONObject("data").getJSONArray("dataList")) {
JSONObject invoiceData = JSON.parseObject(JSON.toJSONString(invoiceObj));
System.out.println("当前正在处理的作废开票申请数据为:" + invoiceData);
//开始截取关键数据
String invoiceId = invoiceData.getString("_id");
String invoiceName = invoiceData.getString("name");
String modifyTime = invoiceData.getString("last_modified_time");
//开始判断日志中是否已经执行过该数据
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_invoice&log_type=KPZF&dataId=" + invoiceId + "&mark=" + modifyTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("日志已存在,将不再向下执行");
continue;
}
log.info("日志不存在,继续向下执行");
Map invoiceDelMap = new HashMap<>();
invoiceDelMap.put("crmInvoiceId", invoiceId);
//开始获取金蝶的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 invoiceReqEntity = new HttpEntity(invoiceDelMap, headers);
String invoiceUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/ar/arbusbill/deleteInvoice";
JSONObject delInvoiceRes = new JSONObject();
try {
delInvoiceRes = restTemplate.postForObject(invoiceUrl, invoiceReqEntity, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("金蝶删除开票申请结果为:" + delInvoiceRes);
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "KPZF");
logMap.put("syn_type", "2");
logMap.put("data_name", invoiceName);
logMap.put("data_id", invoiceId);
logMap.put("mark", modifyTime);
logMap.put("send_body", JSON.toJSONString(invoiceReqEntity));
logMap.put("send_res", JSON.toJSONString(delInvoiceRes));
logMap.put("tableName", "send_log_invoice");
if ("0".equals(delInvoiceRes.getString("errorCode"))) {
log.info("金蝶删除开票申请成功");
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
} else {
log.info("金蝶删除开票申请失败");
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败:" + (delInvoiceRes.getString("message") != null ? delInvoiceRes.getString("message") : "未知错误"));
}
JSONObject logRes = new JSONObject();
try {
logRes = restTemplate.postForObject("http://localhost:18088/Log/insert/log_data", logMap, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("日志插入结果为:" + logRes);
}
}
}