package com.engine.salary.timer;
import cn.hutool.core.util.StrUtil;
import com.engine.salary.exception.CBS8RunTimeException;
import com.engine.salary.mapper.SQLMapper;
import com.engine.salary.mapper.cbs.UfHkrdzbMapper;
import com.engine.salary.remote.cbs8.client.AccountManagementClient;
import com.engine.salary.remote.cbs8.config.EBS2ECConfig;
import com.engine.salary.remote.cbs8.po.DepartmentPO;
import com.engine.salary.remote.cbs8.po.UfHkrdzbPO;
import com.engine.salary.remote.cbs8.request.GetTransactionDetailRequest;
import com.engine.salary.remote.cbs8.response.GetTransactionDetailResponse;
import com.engine.salary.remote.cbs8.JsonUtil;
import com.engine.salary.remote.cbs8.SalaryEntityUtil;
import com.engine.salary.remote.cbs8.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;
/**
* 获取境内账户明细
*
Copyright: Copyright (c) 2024
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class SyncCBSAccountDetailsJob extends BaseCronJob {
/**
* 开始日期 格式为yyyy-mm-dd
*/
private String startDate;
/**
* 结束日期 格式为yyyy-mm-dd
*/
private String endDate;
/**
* 借贷类型 1-借;2-贷
*/
private String loanType;
/**
* 款项性质列表
*/
private String paymentNatureList;
/**
* 日期类型 0-交易日期
*/
private String dateType;
/**
* 账户列表 查询账户列表,不传默认返回全部
*/
private String accountNoList;
/**
* 银行类型列表 例如招行CMB,银行类型枚举见附录4.1.5
*/
private String bankTypeList;
/**
* 币种列表 见附录币种枚举,4.1.1
*/
private String currencyList;
/**
* 明细来源
* B:银行,即银行直联
* U:用户,即手工/ERP接口导入
* 不传默认查全部
*/
private String detailedSources;
/**
* 明细类型 1-当日明细 2-历史明细 与明细日期无关,仅标识数据来源银行的不同接口
*/
private String currentFlag;
/**
* 账户性质列表 客户在公共设置>基础信息>账户性质查询自定义内容,例如AA-综合户,此处传值“AA”
*/
private String accountNatureList;
/**
* 银行流水号 银行流水号
*/
private String bankSerialNumber;
/**
* 交易流水号 交易流水号,由CBS8定义生成的唯一标识
*/
private Long transactionSerialNumber;
/**
* 单位编码列表 客户在公共设置>基础信息>组织机构维护,例如0001-XX科技有限公司,此处传0001
*/
private String unitCodeList;
/**
* ERP业务参考号 erpSerialNumber
*/
private String erpSerialNumber;
private SQLMapper getSQLMapper() {
return MapperProxyFactory.getProxy(SQLMapper.class);
}
private UfHkrdzbMapper getUfHkrdzbMapper() {
return MapperProxyFactory.getProxy(UfHkrdzbMapper.class);
}
@Override
public void execute() {
User user = new User();
user.setUid(1);
user.setLoginid("sysadmin");
try {
GetTransactionDetailRequest requestParam = new GetTransactionDetailRequest();
requestParam.setCurrentPage(1);
requestParam.setPageSize(1000);
if (StrUtil.isNotBlank(startDate) && StrUtil.isNotBlank(endDate)) {
requestParam.setStartDate(startDate);
requestParam.setEndDate(endDate);
} else {
String nowDate = LocalDate.now().toString();
requestParam.setStartDate(nowDate);
requestParam.setEndDate(nowDate);
}
requestParam.setLoanType(loanType);
requestParam.setPaymentNatureList(paymentNatureList == null ? null : Arrays.stream(paymentNatureList.split(",")).collect(Collectors.toList()));
requestParam.setDateType(dateType);
requestParam.setAccountNoList(accountNoList == null ? null : Arrays.stream(accountNoList.split(",")).collect(Collectors.toList()));
requestParam.setBankTypeList(bankTypeList == null ? null : Arrays.stream(bankTypeList.split(",")).collect(Collectors.toList()));
requestParam.setCurrencyList(currencyList == null ? null : Arrays.stream(currencyList.split(",")).collect(Collectors.toList()));
requestParam.setDetailedSources(detailedSources);
requestParam.setCurrentFlag(currentFlag);
requestParam.setAccountNatureList(accountNatureList == null ? null : Arrays.stream(accountNatureList.split(",")).collect(Collectors.toList()));
requestParam.setBankSerialNumber(bankSerialNumber);
requestParam.setTransactionSerialNumber(transactionSerialNumber);
requestParam.setUnitCodeList(unitCodeList == null ? null : Arrays.stream(unitCodeList.split(",")).collect(Collectors.toList()));
requestParam.setErpSerialNumber(erpSerialNumber);
//查询前1000条数据
AccountManagementClient accountManagementClient = new AccountManagementClient();
GetTransactionDetailResponse response = accountManagementClient.transactionDetailQuery(requestParam);
List list = response.getData().getList();
//判断是否还存在数据,递归查询
boolean hasNextPage = response.getData().isHasNextPage();
int nextPage = response.getData().getNextPage();
while (hasNextPage) {
requestParam.setCurrentPage(nextPage);
GetTransactionDetailResponse nextPageResponse = accountManagementClient.transactionDetailQuery(requestParam);
List pageData = nextPageResponse.getData().getList();
list.addAll(pageData);
hasNextPage = nextPageResponse.getData().isHasNextPage();
nextPage = nextPageResponse.getData().getNextPage();
}
//加载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 CBS8RunTimeException("未设置唯一标识字段");
}
String uniqueKey = uniqueField.getKey();
String uniqueEbsKey = uniqueField.getEbsKey();
List uniqueDataKeys = getSQLMapper().listString(String.format("select %s from %s", uniqueKey, tableName));
//获取汇款人与办事处的对照数据
List ufHkrdzbPOS = getUfHkrdzbMapper().listAll();
Map customerDepartmentMap = SalaryEntityUtil.convert2Map(ufHkrdzbPOS, UfHkrdzbPO::getKhmc);
List departmentPOS = getUfHkrdzbMapper().listDepartment();
Map departmentMap = SalaryEntityUtil.convert2Map(departmentPOS, DepartmentPO::getCode, DepartmentPO::getId);
for (GetTransactionDetailResponse.Detail detail : list) {
Map 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 fields = new ArrayList() {{
//建模默认字段
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