From 801bfdff5fa6ccea301898cb7cb3361a15248561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 11 Jun 2026 16:25:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...SettlementCustomersApplicationService.java | 284 ++++++++++++------ .../entity/SettlementCustomers.java | 3 + .../repository/po/SettlementCustomersPO.java | 2 +- .../todo/SettlementCustomersDO.java | 3 + .../SettlementCustomersDTO.java | 3 + .../mapper/SettlementCustomersMapper.xml | 34 ++- 6 files changed, 237 insertions(+), 92 deletions(-) diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java index 1e2608ea1..dd3dd498f 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java @@ -1,7 +1,6 @@ package com.mhd.bms.application.server.settlementCustomers; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -9,6 +8,7 @@ import com.mhd.bms.domain.settlementCustomers.entity.SettlementCustomers; import com.mhd.bms.domain.settlementCustomers.repository.mapper.SettlementCustomersMapper; import com.mhd.bms.domain.settlementCustomers.repository.po.SettlementCustomersPO; import com.mhd.bms.domain.settlementCustomers.repository.todo.SettlementCustomersDO; +import com.mhd.bms.domain.settlementCustomers.repository.persistence.SettlementCustomersImpl; import com.mhd.bms.domain.settlementCustomers.service.SettlementCustomersDomainService; import com.mhd.bms.interfaces.dto.settlementCustomers.SettlementCustomersDTO; import com.mhd.common.core.domain.po.SysDictDataVo; @@ -34,7 +34,9 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -56,7 +58,10 @@ public class SettlementCustomersApplicationService { private UserServiceFeign userServiceFeign; @Autowired private SettlementCustomersMapper settlementCustomersMapper; + @Autowired + private SettlementCustomersImpl settlementCustomersImpl; + private static final int SYNC_BATCH_SIZE = 500; /** * 分页查询结算对象列表 @@ -248,105 +253,206 @@ public class SettlementCustomersApplicationService { * 同步结算对象 */ public void syncSettlementCustomers() { - /* - 查询当前租户下所有的托运人、承运人、货主 - 对比用户id及主体角色,过滤出未同步的结算对象数据, - 新增结算对象,结算方式默认月结,结算方向根据角色区分,承运商是收款方,客户是付款方 - - 首先采用同步请求方式,如果后续数据量过大,更换消息队列或者异步新增 - */ LoginUser loginUser = SecurityUtils.getLoginUser(); if (ObjectUtil.isNull(loginUser)) { throw new DigitalLogisticsException(UserError.TIMEOUT); } - SettlementCustomersDO settlementCustomersDO = new SettlementCustomersDO(); - settlementCustomersDO.setMainRole(2); - settlementCustomersDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); - List settlementCustomersList = settlementCustomersDomainService.queryList(settlementCustomersDO); - //TODO 查询货主信息 -// List saveSettingCustomersList = settlementCustomersList + long startMs = System.currentTimeMillis(); + SyncDictCache dictCache = loadSyncDictCache(); + Map existingMap = loadExistingSettlementCustomersMap( + loginUser.getUserPo().getTopOrganizationId()); + List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + syncShipperSettlementCustomers(loginUser, existingMap, dictCache, toInsert, toUpdate); + syncDriverSettlementCustomers(loginUser, existingMap, dictCache, toInsert, toUpdate); + batchPersist(toInsert, toUpdate); + log.info("同步结算对象完成,新增{}条,更新{}条,耗时{}ms", toInsert.size(), toUpdate.size(), System.currentTimeMillis() - startMs); + } - //查询托运人信息,并过滤,同步 - settlementCustomersDO.setMainRole(2); - List shipperList = settlementCustomersDomainService.queryList(settlementCustomersDO); + private void syncShipperSettlementCustomers(LoginUser loginUser, + Map existingMap, + SyncDictCache dictCache, + List toInsert, + List toUpdate) { AjaxResult ajaxResult = userServiceFeign.userShipperListAll(); - List userShipperPoList = new ArrayList<>(); - if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ObjectUtil.isNotNull(ajaxResult.get("data"))) { - userShipperPoList = JSONUtil.toList(JSONObject.toJSONString(ajaxResult.get("data")), UserShipperPo.class); + List userShipperPoList = parseFeignList(ajaxResult, UserShipperPo.class); + if (userShipperPoList.isEmpty()) { + return; } - if(userShipperPoList != null && userShipperPoList.size()>0){ - //使用stream流过滤出 userShipperPoList中有但是shipperList中没有的集合 - List shipperListNew = userShipperPoList.stream().filter(userShipperPo -> { - return shipperList.stream().noneMatch(shipper -> ObjectUtil.equal(shipper.getSettlementEntityId(),userShipperPo.getUserId())); - }).collect(Collectors.toList()); - if(shipperListNew.size()>0){ - shipperListNew.forEach(userShipperPo -> { - SettlementCustomersDO saveEntity = new SettlementCustomersDO(); - saveEntity.setSettlementCustomersCode(OrderSequence.getOrderCode()); - saveEntity.setSettlementEntityId(userShipperPo.getUserId()); - saveEntity.setSettlementEntity(userShipperPo.getUserName()); - saveEntity.setSettlementMethodCode("monthly_settle"); - saveEntity.setMainRole(1); - saveEntity.setCustomerTypeCode("customer"); //从货主同步过来的 默认客户 - saveEntity.setNcCode(userShipperPo.getCustomerNcCode()); - saveEntity.setCreateTime(new Date()); // Set the create time to the current date and time - Long settlementEntityId = saveEntity.getSettlementEntityId(); - List settlementCustomers = settlementCustomersMapper.selectList(new LambdaQueryWrapper().eq(SettlementCustomers::getSettlementEntityId, settlementEntityId)); - if(settlementCustomers != null && settlementCustomers.size() > 0){ - for (SettlementCustomers settlementCustomer : settlementCustomers) { - settlementCustomer.setSettlementEntity(userShipperPo.getUserName()); - settlementCustomer.setSettlementMethodCode("monthly_settle"); - settlementCustomer.setMainRole(1); - settlementCustomer.setNcCode(userShipperPo.getCustomerNcCode()); - settlementCustomer.setSettlementEntity(userShipperPo.getUserName()); - settlementCustomersMapper.updateById(settlementCustomer); - } - } else { - saveEntity(saveEntity); - } - }); - } - } - //查询承运人信息,并过滤,同步 - settlementCustomersDO.setMainRole(1); - List driverList = settlementCustomersDomainService.queryList(settlementCustomersDO); - AjaxResult ajaxResultDriver = userServiceFeign.userDriverListAll(); - List userDriverPoList = new ArrayList<>(); - if ("200".equals(String.valueOf(ajaxResultDriver.get("code"))) && ObjectUtil.isNotNull(ajaxResultDriver.get("data"))) { - userDriverPoList = JSONUtil.toList(JSONObject.toJSONString(ajaxResultDriver.get("data")), UserDriverPo.class); - } - if(userDriverPoList != null && userDriverPoList.size()>0){ - //使用stream流过滤出 userDriverPoList中有但是driverList中没有的集合 - List driverListNew = userDriverPoList.stream().filter(item -> { - return driverList.stream().noneMatch(driver -> ObjectUtil.equal(driver.getSettlementEntityId(),item.getUserId())); - }).collect(Collectors.toList()); - if(driverListNew.size()>0){ - driverListNew.forEach(userDriverPo -> { - SettlementCustomersDO saveEntity = new SettlementCustomersDO(); - saveEntity.setSettlementCustomersCode(OrderSequence.getOrderCode()); - saveEntity.setSettlementEntityId(userDriverPo.getUserId()); - saveEntity.setSettlementEntity(userDriverPo.getUserName()); - saveEntity.setSettlementMethodCode("monthly_settle"); - saveEntity.setMainRole(1); - saveEntity.setCustomerTypeCode("customer"); - saveEntity.setCreateTime(new Date()); // Set the create time to the current date and time - Long settlementEntityId = saveEntity.getSettlementEntityId(); - List settlementCustomers = settlementCustomersMapper.selectList(new LambdaQueryWrapper().eq(SettlementCustomers::getSettlementEntityId, settlementEntityId)); - if(settlementCustomers != null && settlementCustomers.size() > 0){ - for (SettlementCustomers settlementCustomer : settlementCustomers) { - settlementCustomer.setSettlementEntity(userDriverPo.getUserName()); - settlementCustomer.setSettlementMethodCode("monthly_settle"); - settlementCustomer.setMainRole(1); - settlementCustomersMapper.updateById(settlementCustomer); - } - } else { - saveEntity(saveEntity); - } - }); + for (UserShipperPo userShipperPo : userShipperPoList) { + if (StringUtils.isEmpty(userShipperPo.getUserName())) { + continue; } + Long organizationId = userShipperPo.getOrganizationId() != null + ? userShipperPo.getOrganizationId() + : loginUser.getUserPo().getOrganizationId(); + SettlementCustomersDO saveEntity = buildShipperSettlementCustomerDO(userShipperPo, loginUser, organizationId); + collectSyncEntity(existingMap, dictCache, organizationId, userShipperPo.getUserName(), saveEntity, toInsert, toUpdate); } } + private void syncDriverSettlementCustomers(LoginUser loginUser, + Map existingMap, + SyncDictCache dictCache, + List toInsert, + List toUpdate) { + AjaxResult ajaxResultDriver = userServiceFeign.userDriverListAll(); + List userDriverPoList = parseFeignList(ajaxResultDriver, UserDriverPo.class); + if (userDriverPoList.isEmpty()) { + return; + } + for (UserDriverPo userDriverPo : userDriverPoList) { + if (StringUtils.isEmpty(userDriverPo.getUserName())) { + continue; + } + Long organizationId = userDriverPo.getOrganizationId() != null + ? userDriverPo.getOrganizationId() + : loginUser.getUserPo().getOrganizationId(); + SettlementCustomersDO saveEntity = buildDriverSettlementCustomerDO(userDriverPo, loginUser, organizationId); + collectSyncEntity(existingMap, dictCache, organizationId, userDriverPo.getUserName(), saveEntity, toInsert, toUpdate); + } + } + + private void collectSyncEntity(Map existingMap, + SyncDictCache dictCache, + Long organizationId, + String settlementEntity, + SettlementCustomersDO saveEntity, + List toInsert, + List toUpdate) { + String key = buildOrgEntityKey(organizationId, settlementEntity); + SettlementCustomers existing = existingMap.get(key); + applySyncDictLabels(saveEntity, dictCache); + if (existing != null) { + saveEntity.setSettlementCustomersId(existing.getSettlementCustomersId()); + saveEntity.setSettlementCustomersCode(existing.getSettlementCustomersCode()); + toUpdate.add(toEntity(saveEntity)); + } else { + saveEntity.setSettlementCustomersCode(OrderSequence.getOrderCode()); + saveEntity.setDelFlag(1); + SettlementCustomers entity = toEntity(saveEntity); + toInsert.add(entity); + existingMap.put(key, entity); + } + } + + private void batchPersist(List toInsert, List toUpdate) { + if (!toInsert.isEmpty()) { + settlementCustomersImpl.saveBatch(toInsert, SYNC_BATCH_SIZE); + } + if (!toUpdate.isEmpty()) { + settlementCustomersImpl.updateBatchById(toUpdate, SYNC_BATCH_SIZE); + } + } + + private Map loadExistingSettlementCustomersMap(Long topOrganizationId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(SettlementCustomers::getDelFlag, 1); + if (topOrganizationId != null) { + wrapper.eq(SettlementCustomers::getTopOrganizationId, topOrganizationId); + } + List existingList = settlementCustomersMapper.selectList(wrapper); + Map existingMap = new HashMap<>(existingList.size() * 2); + for (SettlementCustomers existing : existingList) { + if (existing.getOrganizationId() != null && StringUtils.isNotEmpty(existing.getSettlementEntity())) { + existingMap.put(buildOrgEntityKey(existing.getOrganizationId(), existing.getSettlementEntity()), existing); + } + } + return existingMap; + } + + private SyncDictCache loadSyncDictCache() { + SyncDictCache cache = new SyncDictCache(); + cache.settlementMethodLabel = resolveDictLabel(DictCode.SETTLEWAY.getCode(), "monthly_settle"); + cache.customerTypeLabel = resolveDictLabel(DictCode.CUSTOMER_TYPE.getCode(), "customer"); + return cache; + } + + private String resolveDictLabel(String dictType, String dictValue) { + AjaxResult ajaxResult = systemServiceFeign.selectListByDictType(dictType); + if (!"200".equals(String.valueOf(ajaxResult.get("code"))) || ajaxResult.get("data") == null) { + return null; + } + List dictList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), SysDictDataVo.class); + if (dictList == null || dictList.isEmpty()) { + return null; + } + return dictList.stream() + .filter(info -> ObjectUtil.equal(info.getDictValue(), dictValue)) + .map(SysDictDataVo::getDictLabel) + .findAny() + .orElse(null); + } + + private void applySyncDictLabels(SettlementCustomersDO settlementCustomersDO, SyncDictCache dictCache) { + if (StringUtils.isNotEmpty(settlementCustomersDO.getSettlementMethodCode()) && dictCache.settlementMethodLabel != null) { + settlementCustomersDO.setSettlementMethod(dictCache.settlementMethodLabel); + } + if (StringUtils.isNotEmpty(settlementCustomersDO.getCustomerTypeCode()) && dictCache.customerTypeLabel != null) { + settlementCustomersDO.setCustomerType(dictCache.customerTypeLabel); + } + } + + private List parseFeignList(AjaxResult ajaxResult, Class clazz) { + if (!"200".equals(String.valueOf(ajaxResult.get("code"))) || ObjectUtil.isNull(ajaxResult.get("data"))) { + return new ArrayList<>(); + } + List list = JSON.parseArray(JSON.toJSONString(ajaxResult.get("data")), clazz); + return list != null ? list : new ArrayList<>(); + } + + private SettlementCustomers toEntity(SettlementCustomersDO settlementCustomersDO) { + SettlementCustomers settlementCustomers = new SettlementCustomers(); + BeanUtils.copyProperties(settlementCustomersDO, settlementCustomers); + return settlementCustomers; + } + + private String buildOrgEntityKey(Long organizationId, String settlementEntity) { + return organizationId + "|" + settlementEntity; + } + + private static class SyncDictCache { + private String settlementMethodLabel; + private String customerTypeLabel; + } + + private SettlementCustomersDO buildShipperSettlementCustomerDO(UserShipperPo userShipperPo, LoginUser loginUser, Long organizationId) { + SettlementCustomersDO saveEntity = new SettlementCustomersDO(); + saveEntity.setSettlementEntityId(userShipperPo.getUserId()); + saveEntity.setSettlementEntity(userShipperPo.getUserName()); + saveEntity.setSettlementMethodCode("monthly_settle"); + saveEntity.setMainRole(1); + saveEntity.setCustomerTypeCode("customer"); + saveEntity.setNcCode(userShipperPo.getCustomerNcCode()); + saveEntity.setSettlementCurrency(userShipperPo.getSettlementCurrency()); + saveEntity.setOrganizationId(organizationId); + saveEntity.setOrganizationName(StringUtils.isNotEmpty(userShipperPo.getOrganizationName()) + ? userShipperPo.getOrganizationName() + : loginUser.getUserPo().getOrganizationName()); + saveEntity.setTopOrganizationId(userShipperPo.getTopOrganizationId() != null + ? userShipperPo.getTopOrganizationId() + : loginUser.getUserPo().getTopOrganizationId()); + saveEntity.setCreateTime(new Date()); + return saveEntity; + } + + private SettlementCustomersDO buildDriverSettlementCustomerDO(UserDriverPo userDriverPo, LoginUser loginUser, Long organizationId) { + SettlementCustomersDO saveEntity = new SettlementCustomersDO(); + saveEntity.setSettlementEntityId(userDriverPo.getUserId()); + saveEntity.setSettlementEntity(userDriverPo.getUserName()); + saveEntity.setSettlementMethodCode("monthly_settle"); + saveEntity.setMainRole(1); + saveEntity.setCustomerTypeCode("customer"); + saveEntity.setOrganizationId(organizationId); + saveEntity.setOrganizationName(StringUtils.isNotEmpty(userDriverPo.getOrganizationName()) + ? userDriverPo.getOrganizationName() + : loginUser.getUserPo().getOrganizationName()); + saveEntity.setTopOrganizationId(userDriverPo.getTopOrganizationId() != null + ? userDriverPo.getTopOrganizationId() + : loginUser.getUserPo().getTopOrganizationId()); + saveEntity.setCreateTime(new Date()); + return saveEntity; + } /** * 保存结算客户信息 diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/entity/SettlementCustomers.java b/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/entity/SettlementCustomers.java index 62b95a182..cd49f93d7 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/entity/SettlementCustomers.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/entity/SettlementCustomers.java @@ -92,5 +92,8 @@ public class SettlementCustomers extends BaseVOEntity{ @ApiModelProperty(name = "nc编码") private String ncCode; + @ApiModelProperty("默认结算币种") + private String settlementCurrency; + } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/po/SettlementCustomersPO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/po/SettlementCustomersPO.java index 2d497c5cc..917c5ac52 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/po/SettlementCustomersPO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/po/SettlementCustomersPO.java @@ -93,7 +93,7 @@ public class SettlementCustomersPO extends BaseVOEntity{ @ApiModelProperty(name = "nc编码") private String ncCode; - @ApiModelProperty(name = "结算币种") + @ApiModelProperty("默认结算币种") private String settlementCurrency; @ApiModelProperty("业务单据id") diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/todo/SettlementCustomersDO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/todo/SettlementCustomersDO.java index 2546f6c99..413b81ed6 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/todo/SettlementCustomersDO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/settlementCustomers/repository/todo/SettlementCustomersDO.java @@ -105,6 +105,9 @@ public class SettlementCustomersDO extends BaseVOEntity{ @ApiModelProperty(name = "nc编码") private String ncCode; + @ApiModelProperty("默认结算币种") + private String settlementCurrency; + @ApiModelProperty("业务流水号") private String businessFlow; diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/settlementCustomers/SettlementCustomersDTO.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/settlementCustomers/SettlementCustomersDTO.java index f347cd0a4..71bf8914f 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/settlementCustomers/SettlementCustomersDTO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/settlementCustomers/SettlementCustomersDTO.java @@ -104,6 +104,9 @@ public class SettlementCustomersDTO extends BaseVOEntity{ @ApiModelProperty(name = "nc编码") private String ncCode; + @ApiModelProperty("默认结算币种") + private String settlementCurrency; + @ApiModelProperty("业务流水号") private String businessFlow; diff --git a/mhd_bms/src/main/resources/mapper/SettlementCustomersMapper.xml b/mhd_bms/src/main/resources/mapper/SettlementCustomersMapper.xml index 750523150..41ebc484f 100644 --- a/mhd_bms/src/main/resources/mapper/SettlementCustomersMapper.xml +++ b/mhd_bms/src/main/resources/mapper/SettlementCustomersMapper.xml @@ -23,6 +23,7 @@ + @@ -71,11 +72,40 @@ + + a.settlement_customers_id, + a.top_organization_id, + a.organization_id, + a.organization_name, + a.settlement_customers_code, + a.settlement_entity_id, + a.settlement_entity, + a.settlement_method, + a.settlement_method_code, + a.bank_name, + a.bank_card_number, + a.bank_binding_name, + a.remark, + a.main_role, + a.customer_type, + a.customer_type_code, + a.project_code, + a.project_name, + a.nc_code, + a.create_time, + a.create_by, + a.create_by_name, + a.update_time, + a.update_by, + a.update_by_name, + a.del_flag + +