票据池配置

This commit is contained in:
钱涛 2025-02-26 17:25:51 +08:00
parent 388352b937
commit fb005a8139
6 changed files with 213 additions and 152 deletions

View File

@ -3,7 +3,6 @@
<config name="CBS字段映射配置">
<table name="境内账户明细" key="uf_jnzhmx" modeId="10">
<!-- <field name="收款类型" key="sklx" ebsKey="paymentNature"/>-->
<field name="交易流水号" key="jylsh" ebsKey="transactionSerialNumber" unique="true"/>
<field name="收款日期" key="skrq" ebsKey="bankTransactionDate"/>
<field name="汇款人" key="hkr" ebsKey="oppositeName"/>
@ -12,15 +11,14 @@
</table>
<table name="票据收款明细" key="uf_pjskmx" modeId="11">
<!-- <field name="收款类型" key="sklx" ebsKey="paymentNature"/>-->
<field name="收款日期" key="skrq" ebsKey="bankTransactionDate"/>
<field name="汇款人" key="hkr" ebsKey="oppositeName"/>
<field name="对应客户" key="dykh" ebsKey="oppositeName"/>
<field name="金额" key="je" ebsKey="incurredAmount"/>
<field name="票据编号" key="pjbh" ebsKey="incurredAmount"/>
<field name="出票日期" key="cprq" ebsKey="incurredAmount"/>
<field name="到期日期" key="dqrq" ebsKey="incurredAmount"/>
<field name="承兑银行" key="cdyx" ebsKey="incurredAmount"/>
<field name="收款日期" key="skrq" ebsKey="acceptorDate"/>
<field name="汇款人" key="hkr" ebsKey="drawerName"/>
<field name="对应客户" key="dykh" ebsKey="drawerName"/>
<field name="金额" key="je" ebsKey="billAmount"/>
<field name="票据编号" key="pjbh" ebsKey="billNbr" unique="true"/>
<field name="出票日期" key="cprq" ebsKey="issueDate"/>
<field name="到期日期" key="dqrq" ebsKey="dueDate"/>
<field name="承兑银行" key="cdyx" ebsKey="acceptorName"/>
</table>

View File

@ -28,14 +28,14 @@ public class AccountManagementClient extends CBS8BaseClient {
.build();
String requestData = JsonUtil.toJsonString(requestParam);
log.info(url + "\n" + requestData);
log.info("获取cbs交易参数" + url + "\n" + requestData);
HttpPost httpPost = setupRequest(url, requestData);
try (CloseableHttpResponse response = client.execute(httpPost)) {
byte[] finalResponseData = handleResponse(response);
String req = new String(finalResponseData, StandardCharsets.UTF_8);
GetTransactionDetailResponse getTransactionDetailResponse = JsonUtil.parseBean(req, GetTransactionDetailResponse.class);
log.info(url + "\n" + JsonUtil.toJsonString(getTransactionDetailResponse));
log.info("获取cbs交易结果" + "\n" + JsonUtil.toJsonString(getTransactionDetailResponse));
if (Objects.isNull(getTransactionDetailResponse)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(156449, "服务异常"));

View File

@ -27,14 +27,14 @@ public class BillManagementClient extends CBS8BaseClient {
.build();
String requestData = JsonUtil.toJsonString(requestParam);
log.info(url + "\n" + requestData);
log.info("获取cbs票据参数" + url + "\n" + requestData);
HttpPost httpPost = setupRequest(url, requestData);
try (CloseableHttpResponse response = client.execute(httpPost)) {
byte[] finalResponseData = handleResponse(response);
String req = new String(finalResponseData, StandardCharsets.UTF_8);
GetDtaResponse getDtaResponse = JsonUtil.parseBean(req, GetDtaResponse.class);
log.info(url + "\n" + JsonUtil.toJsonString(getDtaResponse));
log.info("获取cbs票据结果" + "\n" + JsonUtil.toJsonString(getDtaResponse));
if (Objects.isNull(getDtaResponse)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(156449, "服务异常"));

View File

@ -1,130 +0,0 @@
package com.engine.salary.timer;
import cn.hutool.core.util.StrUtil;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.hrm.HrmSnapshotMapper;
import com.engine.salary.remote.cbs8.client.BillManagementClient;
import com.engine.salary.remote.cbs8.request.GetDtaRequest;
import com.engine.salary.remote.cbs8.response.GetDtaResponse;
import com.engine.salary.util.db.MapperProxyFactory;
import lombok.extern.slf4j.Slf4j;
import weaver.hrm.User;
import weaver.interfaces.schedule.BaseCronJob;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 获取CBS票据信息
* <p>Copyright: Copyright (c) 2024</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class CBS8GetDtaJob extends BaseCronJob {
/**
* 出票日期起 格式为yyyy-mm-dd出票日期起止不允许一边有值一边无值日期间隔最大为一年
*/
private String issueDateStart;
/**
* 出票日期止 格式为yyyy-mm-dd出票日期起止不允许一边有值一边无值日期间隔最大为一年
*/
private String issueDateEnd;
/**
* 持票人单位编码 多选填在cbs系统公共设置>基础信息>组织机构维护的单位编码
*/
private String displayHoldOrganizationCodeList;
/**
* 持票人账号 多选
*/
private String holdAccountList;
private HrmSnapshotMapper getHrmSnapshotMapper() {
return MapperProxyFactory.getProxy(HrmSnapshotMapper.class);
}
@Override
public void execute() {
User user = new User();
user.setUid(1);
user.setLoginid("sysadmin");
try {
GetDtaRequest requestParam = new GetDtaRequest();
requestParam.setCurrentPage(1);
requestParam.setPageSize(1000);
if (StrUtil.isNotBlank(issueDateStart) && StrUtil.isNotBlank(issueDateEnd)) {
requestParam.setIssueDateStart(issueDateStart);
requestParam.setIssueDateEnd(issueDateEnd);
} else {
String nowDate = LocalDate.now().toString();
requestParam.setIssueDateStart(nowDate);
requestParam.setIssueDateEnd(nowDate);
}
requestParam.setDisplayHoldOrganizationCodeList(Arrays.stream(displayHoldOrganizationCodeList.split(",")).collect(Collectors.toList()));
requestParam.setHoldAccountList(Arrays.stream(holdAccountList.split(",")).collect(Collectors.toList()));
BillManagementClient bailManagementClient = new BillManagementClient();
GetDtaResponse getDtaResponse = bailManagementClient.dtaQuery(requestParam);
List<GetDtaResponse.Detail> list = getDtaResponse.getData().getList();
Integer modeId = 1;
List<String> fields = new ArrayList<String>() {{
add("formmodeid");
add("modedatacreater");
add("modedatacreatertype");
add("modedatacreatedate");
add("modedatacreatetime");
}};
// String currDate = TimeUtil.getCurrentDateString();
// SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
// String currTime = sdf.format(new Date());
// List<Object> values = new ArrayList<Object>() {{
// add(modeId);
// add(1);
// add(0);
// add(String.format("'%s'", currDate));
// add(String.format("'%s'", currTime));
// }};
// for (PushSettingItemPO item : pushSettingItemPOS) {
// //数据库字段
// String fieldName = item.getFieldName();
// fields.add(fieldName);
// // 公式变量的值
// String field = item.getItem();
// String value = formulaVarValueMap.getOrDefault(field, StringUtils.EMPTY);
// PushItemFieldEnum pushItemFieldEnum = PushItemFieldEnum.parseByValue(item.getFieldType());
// values.add(pushItemFieldEnum.convertValue(value));
// }
// String tableName = setting.getTableName();
// String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(",")));
// RecordSet rs = new RecordSet();
// rs.execute(sql);
//
// if (modeId != null) {
// rs.executeQuery("select max(id) from " + tableName);
// int mainId = 0;
// if (rs.next()) {
// mainId = rs.getInt(1);
// }
// ModeRightInfo ModeRightInfo = new ModeRightInfo();
// ModeRightInfo.setNewRight(true);
// ModeRightInfo.editModeDataShare(1, modeId, mainId);
// }
} catch (Exception e) {
log.error("获取CBS票据信息失败", e);
throw new SalaryRunTimeException("获取CBS票据信息失败," + e.getMessage(), e);
}
}
}

View File

@ -3,7 +3,6 @@ package com.engine.salary.timer;
import cn.hutool.core.util.StrUtil;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.SQLMapper;
import com.engine.salary.mapper.hrm.HrmSnapshotMapper;
import com.engine.salary.remote.cbs8.client.AccountManagementClient;
import com.engine.salary.remote.cbs8.config.EBS2ECConfig;
import com.engine.salary.remote.cbs8.request.GetTransactionDetailRequest;
@ -27,7 +26,7 @@ import java.util.*;
import java.util.stream.Collectors;
/**
* 获取CBS交易信息
* 获取境内账户明细
* <p>Copyright: Copyright (c) 2024</p>
* <p>Company: 泛微软件</p>
*
@ -35,7 +34,7 @@ import java.util.stream.Collectors;
* @version 1.0
**/
@Slf4j
public class CBS8GetTransactionDetailJob extends BaseCronJob {
public class SyncCBSAccountDetailsJob extends BaseCronJob {
/**
* 开始日期 格式为yyyy-mm-dd
@ -54,10 +53,6 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
*/
private String paymentNatureList;
private HrmSnapshotMapper getHrmSnapshotMapper() {
return MapperProxyFactory.getProxy(HrmSnapshotMapper.class);
}
private SQLMapper getSQLMapper() {
return MapperProxyFactory.getProxy(SQLMapper.class);
}
@ -106,7 +101,7 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
//获取已存在的数据
EBS2ECConfig.Table.Field uniqueField = table.getFields().stream().filter(EBS2ECConfig.Table.Field::isUnique).findFirst().orElse(null);
if(uniqueField == null){
if (uniqueField == null) {
throw new SalaryRunTimeException("未设置唯一标识字段");
}
String uniqueKey = uniqueField.getKey();
@ -126,12 +121,16 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
}
List<String> fields = new ArrayList<String>() {{
//建模默认字段
add("formmodeid");
add("modedatacreater");
add("modedatacreatertype");
add("modedatacreatedate");
add("modedatacreatetime");
//业务逻辑字段收款类型默认是银行存款
add("sklx");
}};
String currDate = TimeUtil.getCurrentDateString();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currTime = sdf.format(new Date());
@ -141,6 +140,8 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
add(0);
add(String.format("'%s'", currDate));
add(String.format("'%s'", currTime));
//业务逻辑字段收款类型默认是银行存款
add(0);
}};
for (EBS2ECConfig.Table.Field field : table.getFields()) {
//数据库字段
@ -150,6 +151,15 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
values.add(String.format("'%s'", detailMap.getOrDefault(field.getEbsKey(), "")));
}
/*
* 认领逻辑
* 根据回款人去表里匹配回款人与办事处的对照表
* 如果能匹配到数据则状态改为已自动认领同时把办事处部门的值同步到办事处字段中是否系统自动认领同步为是
* 如对照标准无数据则状态为未认领
*/
String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(",")));
RecordSet rs = new RecordSet();
rs.execute(sql);

View File

@ -0,0 +1,183 @@
package com.engine.salary.timer;
import cn.hutool.core.util.StrUtil;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.SQLMapper;
import com.engine.salary.remote.cbs8.client.BillManagementClient;
import com.engine.salary.remote.cbs8.config.EBS2ECConfig;
import com.engine.salary.remote.cbs8.request.GetDtaRequest;
import com.engine.salary.remote.cbs8.response.GetDtaResponse;
import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.security.AnyTypePermission;
import lombok.extern.slf4j.Slf4j;
import weaver.conn.RecordSet;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.GCONST;
import weaver.general.TimeUtil;
import weaver.hrm.User;
import weaver.interfaces.schedule.BaseCronJob;
import java.io.File;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* 获取票据收款明细
* <p>Copyright: Copyright (c) 2024</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class SyncCBSPayDetailsJob extends BaseCronJob {
/**
* 持票人单位编码 多选填在cbs系统公共设置>基础信息>组织机构维护的单位编码
*/
private String displayHoldOrganizationCodeList;
/**
* 持票人账号 多选
*/
private String holdAccountList;
/**
* 出票日期起 格式为yyyy-mm-dd出票日期起止不允许一边有值一边无值日期间隔最大为一年
*/
private String issueDateStart;
/**
* 出票日期止 格式为yyyy-mm-dd出票日期起止不允许一边有值一边无值日期间隔最大为一年
*/
private String issueDateEnd;
/**
* 系统票据类型 多选按附录4.1.3票据类型-票据状态-流通标志级联关系表选择后按顺序填写系统票据类型枚举见附录4.1.3票据状态枚举见附录4.1.4流通标志枚举见附录4.1.5
*/
private String billVarietyList;
private SQLMapper getSQLMapper() {
return MapperProxyFactory.getProxy(SQLMapper.class);
}
@Override
public void execute() {
User user = new User();
user.setUid(1);
user.setLoginid("sysadmin");
try {
GetDtaRequest requestParam = new GetDtaRequest();
requestParam.setCurrentPage(1);
requestParam.setPageSize(1000);
if (StrUtil.isNotBlank(issueDateStart) && StrUtil.isNotBlank(issueDateEnd)) {
requestParam.setIssueDateStart(issueDateStart);
requestParam.setIssueDateEnd(issueDateEnd);
} else {
String nowDate = LocalDate.now().toString();
requestParam.setIssueDateStart(nowDate);
requestParam.setIssueDateEnd(nowDate);
}
if(StrUtil.isBlank(displayHoldOrganizationCodeList)){
throw new SalaryRunTimeException("持票人单位编码为空,请在计划任务配置此项!");
}
requestParam.setDisplayHoldOrganizationCodeList(Arrays.stream(displayHoldOrganizationCodeList.split(",")).collect(Collectors.toList()));
if(StrUtil.isBlank(holdAccountList)){
throw new SalaryRunTimeException("持票人账号为空,请在计划任务配置此项!");
}
requestParam.setHoldAccountList(Arrays.stream(holdAccountList.split(",")).collect(Collectors.toList()));
requestParam.setBillVarietyList(Arrays.stream(billVarietyList.split(",")).collect(Collectors.toList()));
BillManagementClient bailManagementClient = new BillManagementClient();
GetDtaResponse getDtaResponse = bailManagementClient.dtaQuery(requestParam);
List<GetDtaResponse.Detail> list = getDtaResponse.getData().getList();
//加载cbs配置
XStream xStream = new XStream();
String resource = GCONST.getRootPath() + "WEB-INF" + File.separatorChar + "CBS2ECConfig.xml";
File file = new File(resource);
xStream.addPermission(AnyTypePermission.ANY);
xStream.processAnnotations(EBS2ECConfig.class);
EBS2ECConfig dto = (EBS2ECConfig) xStream.fromXML(file);
EBS2ECConfig.Table table = dto.getTables().get(1);
Integer modeId = table.getModeId();
String tableName = table.getKey();
//获取已存在的数据
EBS2ECConfig.Table.Field uniqueField = table.getFields().stream().filter(EBS2ECConfig.Table.Field::isUnique).findFirst().orElse(null);
if (uniqueField == null) {
throw new SalaryRunTimeException("未设置唯一标识字段");
}
String uniqueKey = uniqueField.getKey();
String uniqueEbsKey = uniqueField.getEbsKey();
List<String> uniqueDataKeys = getSQLMapper().listString(String.format("select %s from %s", uniqueKey, tableName));
for (GetDtaResponse.Detail detail : list) {
Map<String, String> detailMap = JsonUtil.parseMap(detail, String.class);
String uniqueData = detailMap.get(uniqueEbsKey);
if (StrUtil.isBlank(uniqueData)) {
log.warn("跳过cbs票据数据唯一标识返回空,uniqueKey:{},uniqueEbsKey:{}", uniqueKey, uniqueEbsKey);
continue;
}
if (uniqueDataKeys.contains(uniqueData)) {
log.warn("跳过cbs票据数据数据已存在,uniqueKey:{},uniqueEbsKey:{},值{}", uniqueKey, uniqueEbsKey, uniqueData);
continue;
}
List<String> fields = new ArrayList<String>() {{
add("formmodeid");
add("modedatacreater");
add("modedatacreatertype");
add("modedatacreatedate");
add("modedatacreatetime");
//业务逻辑字段收款类型
add("sklx");
}};
String currDate = TimeUtil.getCurrentDateString();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currTime = sdf.format(new Date());
List<Object> values = new ArrayList<Object>() {{
add(modeId);
add(1);
add(0);
add(String.format("'%s'", currDate));
add(String.format("'%s'", currTime));
//业务逻辑字段收款类型银承商承
add("AC01".equals(detailMap.get("billType")) ? 0 : 1);
}};
for (EBS2ECConfig.Table.Field field : table.getFields()) {
//数据库字段
String fieldName = field.getKey();
fields.add(fieldName);
// 接口值
values.add(String.format("'%s'", detailMap.getOrDefault(field.getEbsKey(), "")));
}
String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(",")));
RecordSet rs = new RecordSet();
rs.execute(sql);
if (modeId != null) {
rs.executeQuery("select max(id) from " + tableName);
int mainId = 0;
if (rs.next()) {
mainId = rs.getInt(1);
}
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeId, mainId);
}
}
} catch (Exception e) {
log.error("获取CBS票据信息失败", e);
throw new SalaryRunTimeException("获取CBS票据信息失败," + e.getMessage(), e);
}
}
}