交易明细同步

This commit is contained in:
钱涛 2025-02-26 09:22:20 +08:00
parent de25d6cdf4
commit 214419e835
5 changed files with 176 additions and 2 deletions

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="GB2312"?>
<config name="CBS字段映射配置">
<table name="境内账户明细" key="uf_cbsjnmx" modeId="9" uniqueKey = "jylsh">
<field name="收款类型" key="sklx" ebsKey="paymentNature"/>
<field name="交易流水号" key="jylsh" ebsKey="transactionSerialNumber" unique="true"/>
<field name="收到日期" key="sdrq" ebsKey="bankTransactionDate"/>
<field name="回款人" key="hkr" ebsKey="unitName"/>
<field name="对应开票名" key="dykpm" ebsKey="unitName"/>
<field name="收款金额" key="skje" ebsKey="incurredAmount"/>
</table>
</config>

View File

@ -17,4 +17,6 @@ public interface SQLMapper {
List<Map> runSQL(@Param("sql") String sql);
List<Long> listLong(@Param("sql") String sql);
List<String> listString(@Param("sql") String sql);
}

View File

@ -9,4 +9,8 @@
<select id="listLong" resultType="long">
${sql}
</select>
<select id="listString" resultType="string">
${sql}
</select>
</mapper>

View File

@ -0,0 +1,63 @@
package com.engine.salary.remote.cbs8.config;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("config")
public class EBS2ECConfig {
@XStreamAlias("name")
@XStreamAsAttribute
private String name;
@XStreamImplicit(itemFieldName = "table")
private List<Table> tables;
@Data
public static class Table {
@XStreamAlias("name")
@XStreamAsAttribute
private String name;
@XStreamAlias("key")
@XStreamAsAttribute
private String key;
@XStreamAlias("modeId")
@XStreamAsAttribute
private Integer modeId;
@XStreamImplicit(itemFieldName = "field")
private List<Field> fields;
@Data
public static class Field {
@XStreamAlias("name")
@XStreamAsAttribute
private String name;
@XStreamAlias("key")
@XStreamAsAttribute
private String key;
@XStreamAlias("ebsKey")
@XStreamAsAttribute
private String ebsKey;
@XStreamAlias("unique")
@XStreamAsAttribute
private boolean unique;
}
}
}

View File

@ -2,16 +2,28 @@ 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;
import com.engine.salary.remote.cbs8.response.GetTransactionDetailResponse;
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.Arrays;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -46,6 +58,10 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
return MapperProxyFactory.getProxy(HrmSnapshotMapper.class);
}
private SQLMapper getSQLMapper() {
return MapperProxyFactory.getProxy(SQLMapper.class);
}
@Override
public void execute() {
User user = new User();
@ -74,7 +90,81 @@ public class CBS8GetTransactionDetailJob extends BaseCronJob {
if (StrUtil.isNotBlank(paymentNatureList)) {
requestParam.setPaymentNatureList(Arrays.stream(paymentNatureList.split(",")).collect(Collectors.toList()));
}
accountManagementClient.transactionDetailQuery(requestParam);
GetTransactionDetailResponse getTransactionDetailResponse = accountManagementClient.transactionDetailQuery(requestParam);
List<GetTransactionDetailResponse.Detail> list = getTransactionDetailResponse.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(0);
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 (GetTransactionDetailResponse.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");
}};
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 (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);