2025-06-11 13:58:36 +08:00
|
|
|
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.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);
|
|
|
|
|
|
|
|
//是否含软
|
2025-06-12 13:46:17 +08:00
|
|
|
String isHasSoft = invoiceData.getString("is_contain_soft__c") != null ? invoiceData.getString("is_contain_soft__c") : "";
|
2025-06-11 13:58:36 +08:00
|
|
|
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("create_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");
|
|
|
|
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);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|