collect = list.stream().map(item -> {
diff --git a/src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java b/src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java
new file mode 100644
index 000000000..d8b7ab560
--- /dev/null
+++ b/src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java
@@ -0,0 +1,285 @@
+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.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.UfHkrdzbPO;
+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.SalaryEntityUtil;
+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;
+
+/**
+ * 鑾峰彇澧冨唴璐︽埛鏄庣粏
+ * Copyright: Copyright (c) 2024
+ * Company: 娉涘井杞欢
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Slf4j
+public class SyncCBSAccountDetailsJob extends BaseCronJob {
+
+ /**
+ * 寮濮嬫棩鏈 鏍煎紡涓簓yyy-mm-dd
+ */
+ private String startDate;
+ /**
+ * 缁撴潫鏃ユ湡 鏍煎紡涓簓yyy-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-缁煎悎鎴凤紝姝ゅ浼犲尖淎A鈥
+ */
+ private String accountNatureList;
+ /**
+ * 閾惰娴佹按鍙 閾惰娴佹按鍙
+ */
+ private String bankSerialNumber;
+ /**
+ * 浜ゆ槗娴佹按鍙 浜ゆ槗娴佹按鍙凤紝鐢盋BS8瀹氫箟鐢熸垚鐨勫敮涓鏍囪瘑
+ */
+ 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 SalaryRunTimeException("鏈缃敮涓鏍囪瘑瀛楁");
+ }
+ 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, UfHkrdzbPO::getDepartmentId);
+
+ 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