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