From 308f79b804031831cda726d406ae4e4613ca6c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Mon, 9 Feb 2026 16:53:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1BUG=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/domain/MaterialBarCodeFeign.java | 5 + .../Lease/LeaseApplicationService.java | 107 +++++++++++++----- .../mapper/basic/lease/LeaseMapper.xml | 3 + .../service/UserApplicationService.java | 10 +- .../service/UserWlhyDomainService.java | 4 + .../mhd/user/interfaces/facade/UserAPI.java | 4 + .../repository/po/MaterialBarCodePO.java | 6 + .../repository/todo/MaterialBarCodeDO.java | 5 + .../MaterialBaseInfoDomainService.java | 73 +++++++++++- .../materialBarCode/MaterialBarCodeDTO.java | 5 + 10 files changed, 188 insertions(+), 34 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialBarCodeFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialBarCodeFeign.java index b890b6a14..a322ec639 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialBarCodeFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/MaterialBarCodeFeign.java @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; import java.util.List; /** @@ -66,6 +67,10 @@ public class MaterialBarCodeFeign extends BaseVOEntity{ @Excel(name = "名称") private String name; + @ApiModelProperty("数量") + @Excel(name = "数量") + private BigDecimal number; + @ApiModelProperty("备注") @Excel(name = "备注") private String remark; diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java index c91db2035..f64ace339 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java @@ -1,5 +1,6 @@ package com.mhd.basic.application.service.Lease; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -188,56 +189,98 @@ public class LeaseApplicationService { /** * 货主租赁明细 + * 定时任务:每天凌晨1点执行,计算前一天的货主租赁明细 */ @Scheduled(cron = "0 0 1 * * ?") public void shipperLeaseDetails() { + log.info("开始执行货主租赁明细定时任务"); + // 计算前一天的日期,将时间设置为当天的0点0分0秒,只保留日期部分 + final Date yesterday = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -1)); + LeaseDO leaseDO = new LeaseDO(); - leaseDO.setTime(new Date()); - //查询租赁 + leaseDO.setTime(yesterday); + //查询有效期内的租赁 List leasePOS = queryList(leaseDO); -// List leasePOS = leaseDomainService.queryList(leaseDO); List entireUnit = leasePOS.stream() .filter(lease -> lease.getLeaseType().equals("整租")) .collect(Collectors.toList()); List casualRental = leasePOS.stream() .filter(lease -> lease.getLeaseType().equals("散租")) .collect(Collectors.toList()); - List shipperLeaseDetailsList = new ArrayList<>(); //建表后保存 - for (LeasePO en : entireUnit) {//整租 + + List shipperLeaseDetailsList = new ArrayList<>(); //需要保存或更新的数据 + List shipperLeaseDetailsToUpdate = new ArrayList<>(); //需要更新的数据 + + // 查询已存在的货主租赁明细数据(用于判断是新增还是更新) + ShipperLeaseDetailsDO queryDO = new ShipperLeaseDetailsDO(); + queryDO.setBusinessDate(yesterday); + List existingList = shipperLeaseDetailsService.queryList(queryDO); + // 构建已存在数据的Map,key为:业务日期+货主ID+仓库ID+租赁类型 + Map existingMap = existingList.stream() + .collect(Collectors.toMap( + item -> buildKey(yesterday, item.getShipperId(), item.getWarehouseId(), item.getLeaseType()), + item -> item, + (existing, replacement) -> existing // 如果有重复key,保留第一个 + )); + + // 处理整租 + for (LeasePO en : entireUnit) { + String key = buildKey(yesterday, en.getShipperId(), en.getWarehouseId(), en.getLeaseType()); ShipperLeaseDetails shipperLeaseDetails = new ShipperLeaseDetails(); BeanUtils.copyProperties(en, shipperLeaseDetails); - shipperLeaseDetails.setBusinessDate(new Date()); - shipperLeaseDetailsList.add(shipperLeaseDetails); + shipperLeaseDetails.setBusinessDate(yesterday); + + // 如果已存在,则更新;否则新增 + if (existingMap.containsKey(key)) { + ShipperLeaseDetailsPO existing = existingMap.get(key); + shipperLeaseDetails.setId(existing.getId()); + shipperLeaseDetailsToUpdate.add(shipperLeaseDetails); + } else { + shipperLeaseDetailsList.add(shipperLeaseDetails); + } } - //当前货主当前仓库,库存查询页面所有面积加起来就是散租面积 - for (LeasePO ca : casualRental) {//散租 + + // 处理散租:从租赁管理页面维护的面积,效期内的散租客户面积之和 + for (LeasePO ca : casualRental) { + String key = buildKey(yesterday, ca.getShipperId(), ca.getWarehouseId(), ca.getLeaseType()); ShipperLeaseDetails shipperLeaseDetails = new ShipperLeaseDetails(); BeanUtils.copyProperties(ca, shipperLeaseDetails); - shipperLeaseDetails.setBusinessDate(new Date()); - //物料库存 - MaterialInventoryDTO materialInventoryDTO = new MaterialInventoryDTO(); - materialInventoryDTO.setShipperId(ca.getShipperId()); - materialInventoryDTO.setWarehouseId(ca.getWarehouseId()); - AjaxResult ajaxResult = wmsServiceFeign.materialInventoryApiListAll(materialInventoryDTO); - BigDecimal area = BigDecimal.ZERO; - if(String.valueOf(ajaxResult.get("code")).equals("200")) { - JSONArray data = JSONObject.parseArray(JSON.toJSONString(ajaxResult.get("data"))); - for (Object datum : data) { - JSONObject json = (JSONObject) datum; - BigDecimal area1 = json.getBigDecimal("area"); - if (area1 == null) { - area1 = BigDecimal.ZERO; - } - area = area.add(area1); - } + shipperLeaseDetails.setBusinessDate(yesterday); + // 散租面积直接使用租赁管理页面维护的面积 + shipperLeaseDetails.setLeaseArea(ca.getLeaseArea()); + log.info("货主:{},仓库:{},散租面积:{}(来自租赁管理)", ca.getCargoOwnerName(), ca.getWarehouseName(), ca.getLeaseArea()); + + // 如果已存在,则更新;否则新增 + if (existingMap.containsKey(key)) { + ShipperLeaseDetailsPO existing = existingMap.get(key); + shipperLeaseDetails.setId(existing.getId()); + shipperLeaseDetailsToUpdate.add(shipperLeaseDetails); + } else { + shipperLeaseDetailsList.add(shipperLeaseDetails); } - shipperLeaseDetails.setLeaseArea(area); - shipperLeaseDetailsList.add(shipperLeaseDetails); } - // 保存货主租赁明细(新建表) + + // 批量新增货主租赁明细 if (shipperLeaseDetailsList.size() > 0) { shipperLeaseDetailsService.saveBatch(shipperLeaseDetailsList); + log.info("新增货主租赁明细{}条", shipperLeaseDetailsList.size()); } + + // 批量更新货主租赁明细 + if (shipperLeaseDetailsToUpdate.size() > 0) { + shipperLeaseDetailsService.updateBatchById(shipperLeaseDetailsToUpdate); + log.info("更新货主租赁明细{}条", shipperLeaseDetailsToUpdate.size()); + } + + log.info("货主租赁明细定时任务执行完成,业务日期:{}", DateUtil.formatDate(yesterday)); + } + + /** + * 构建唯一key:业务日期+货主ID+仓库ID+租赁类型 + */ + private String buildKey(Date businessDate, Long shipperId, Long warehouseId, String leaseType) { + String dateStr = DateUtil.formatDate(businessDate); + return dateStr + "_" + shipperId + "_" + warehouseId + "_" + leaseType; } /** @@ -247,9 +290,11 @@ public class LeaseApplicationService { * businessDateEnd 业务结束时间 */ public List warehouseOccupancyRate(ShipperLeaseDetailsDO shipperLeaseDetailsDO) { - //仓库id 和 开始结束时间作为查询条件 查数据库 差出来当前仓库所有的 + //仓库id 和 开始结束时间作为查询条件 查数据库 查出来当前仓库所有的 List shipperLeaseDetailsList = shipperLeaseDetailsService.queryList(shipperLeaseDetailsDO); - ShipperLeaseDetailsPO shipperLeaseDetailsPO = shipperLeaseDetailsList.get(0); + if (shipperLeaseDetailsList == null || shipperLeaseDetailsList.isEmpty()) { + return new ArrayList<>(); + } //按业务日期分组,并按日期排序 TreeMap> groupedByDate = shipperLeaseDetailsList.stream().collect( Collectors.groupingBy( diff --git a/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml index e50d747e7..ebef601df 100644 --- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml +++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml @@ -10,6 +10,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java index 894fc935e..4008e8d23 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java @@ -2022,6 +2022,10 @@ public class UserApplicationService { */ @Transactional(rollbackFor = Exception.class) public int deleteByIds(List ids) { + // 检查ids是否为空 + if (ids == null || ids.isEmpty()) { + throw new ServiceException("删除的用户ID列表不能为空"); + } //获取登录人信息 LoginUser loginUser = SecurityUtils.getLoginUser(); if (ObjectUtil.isNull(loginUser)) { @@ -2042,8 +2046,10 @@ public class UserApplicationService { userDomainService.updateUser(userDO); } } - //同步删除网货的员工信息 - wlhyDomainService.deleteBatchPlatformUser(ids); + //同步删除网货的员工信息(只有当ids不为空时才调用) + if (!ids.isEmpty()) { + wlhyDomainService.deleteBatchPlatformUser(ids); + } return ids.size(); } diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserWlhyDomainService.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserWlhyDomainService.java index c1a03cc06..dff71b160 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserWlhyDomainService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserWlhyDomainService.java @@ -609,6 +609,10 @@ public class UserWlhyDomainService { * @return boolean */ public boolean deleteBatchPlatformUser(List szwlUserIds){ + // 检查ids是否为空 + if (szwlUserIds == null || szwlUserIds.isEmpty()) { + return true; // 如果列表为空,直接返回成功,避免SQL语法错误 + } //检查是否开启网货 boolean flag = checkSwitch(); if(!flag){ diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java index 897f5f6b0..277b1d5c0 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java @@ -366,6 +366,10 @@ public class UserAPI extends BaseController { @Log(title = "用户中台管理-删除", description ="批量删除用户",businessType = BusinessType.DELETE) @DeleteMapping("/removeByIds/{ids}") public AjaxResult removeByIds(@PathVariable List ids) { + // 检查ids是否为空 + if (ids == null || ids.isEmpty()) { + return error("删除的用户ID列表不能为空"); + } return toAjax(userApplicationService.deleteByIds(ids)); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/po/MaterialBarCodePO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/po/MaterialBarCodePO.java index 9882cc45f..988924de7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/po/MaterialBarCodePO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/po/MaterialBarCodePO.java @@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; + /** * 物料条码信息对象 material_bar_code @@ -66,6 +68,10 @@ public class MaterialBarCodePO extends BaseVOEntity { @Excel(name = "名称") private String name; + @ApiModelProperty("数量") + @Excel(name = "数量") + private BigDecimal number; + @ApiModelProperty("备注") @Excel(name = "备注") private String remark; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/todo/MaterialBarCodeDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/todo/MaterialBarCodeDO.java index 8a28146b1..7dd79635b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/todo/MaterialBarCodeDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBarCode/repository/todo/MaterialBarCodeDO.java @@ -5,6 +5,7 @@ import com.mhd.common.core.web.domain.BaseVOEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.List; @@ -66,6 +67,10 @@ public class MaterialBarCodeDO extends BaseVOEntity { @Excel(name = "名称") private String name; + @ApiModelProperty("数量") + @Excel(name = "数量") + private BigDecimal number; + @ApiModelProperty("备注") @Excel(name = "备注") private String remark; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/service/MaterialBaseInfoDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/service/MaterialBaseInfoDomainService.java index 5a6cd9478..7fb4eda46 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/service/MaterialBaseInfoDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialBaseInfo/service/MaterialBaseInfoDomainService.java @@ -116,9 +116,80 @@ public class MaterialBaseInfoDomainService { //获取库存预警 List materialInventoryWarningPOList = materialInventoryWarningService.getInfoByMaterialBaseInfoIds(materialBaseInfoId); materialBaseInfoPO.setMaterialInventoryWarningList(materialInventoryWarningPOList); - //获取条码信息 + + // 条码信息: + // 1)优先读取已维护的物料条码表 material_bar_code; + // 2)如果没有维护条码,则根据当前物料绑定的包装规格(packId), + // 按包装明细的单位(EA/IP/CS/PL/OT 等)生成一份默认的条码信息列表, + // 其中条码字段留空,前端可编辑。 List materialBarCodePOList = materialBarCodeService.getInfoByMaterialBaseInfoIds(materialBaseInfoId); + if ((materialBarCodePOList == null || materialBarCodePOList.isEmpty()) && materialBaseInfoPO.getPackId() != null) { + try { + materialBarCodePOList = new ArrayList<>(); + // 常见单位代码;只生成在包装规格中实际存在的单位 + String[] unitCodes = {"EA", "IP", "CS", "PL", "OT"}; + for (String unitCode : unitCodes) { + AjaxResult packDetailResult = systemServiceFeign.getInfoByPackIdAndUnitCode(materialBaseInfoPO.getPackId(), unitCode); + if (!"200".equals(String.valueOf(packDetailResult.get("code"))) + || packDetailResult.get("data") == null) { + continue; + } + PackDetailFeignPO packDetailFeignPO = JSON.parseObject( + JSONObject.toJSONString(packDetailResult.get("data")), + PackDetailFeignPO.class); + // 如果包装明细没有维护名称或数量,则不生成对应的条码行 + if (packDetailFeignPO == null + || packDetailFeignPO.getName() == null + || packDetailFeignPO.getNumber() == null) { + continue; + } + MaterialBarCodePO barCodePO = new MaterialBarCodePO(); + // 物料、组织信息 + barCodePO.setMaterialBaseInfoId(materialBaseInfoId); + barCodePO.setPackId(materialBaseInfoPO.getPackId()); + barCodePO.setPackCode(materialBaseInfoPO.getPackCode()); + barCodePO.setPackName(materialBaseInfoPO.getPackName()); + // 绑定包装明细(单位代码、名称、数量来自包装规格明细) + barCodePO.setPackDetailId(packDetailFeignPO.getPackDetailId()); + barCodePO.setUnitCode(packDetailFeignPO.getUnitCode()); + barCodePO.setName(packDetailFeignPO.getName()); + barCodePO.setNumber(packDetailFeignPO.getNumber()); + // 条码本身留空,前端允许编辑 + barCodePO.setBarCode(null); + materialBarCodePOList.add(barCodePO); + } + } catch (Exception e) { + log.warn("根据包装规格生成条码信息失败,物料ID:{},包装ID:{},错误:{}", + materialBaseInfoId, materialBaseInfoPO.getPackId(), e.getMessage()); + } + } materialBaseInfoPO.setMaterialBarCodeList(materialBarCodePOList); + + // 从包装规格获取默认显示的包装单位(取第一条包装详情的单位名称),前端只读展示 + if (materialBaseInfoPO.getPackId() != null) { + try { + String[] unitCodes = {"EA", "IP", "CS", "PL", "OT"}; + for (String unitCode : unitCodes) { + AjaxResult packDetailResult = systemServiceFeign.getInfoByPackIdAndUnitCode(materialBaseInfoPO.getPackId(), unitCode); + if (!"200".equals(String.valueOf(packDetailResult.get("code"))) + || packDetailResult.get("data") == null) { + continue; + } + PackDetailFeignPO packDetailFeignPO = JSON.parseObject( + JSONObject.toJSONString(packDetailResult.get("data")), + PackDetailFeignPO.class); + if (packDetailFeignPO != null && packDetailFeignPO.getName() != null) { + materialBaseInfoPO.setUnitName(packDetailFeignPO.getName()); + materialBaseInfoPO.setUnitCode(packDetailFeignPO.getUnitCode()); + break; + } + } + } catch (Exception e) { + log.warn("获取包装规格单位名称失败,物料ID:{},包装ID:{},错误:{}", + materialBaseInfoId, materialBaseInfoPO.getPackId(), e.getMessage()); + } + } + return materialBaseInfoPO; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBarCode/MaterialBarCodeDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBarCode/MaterialBarCodeDTO.java index 7cfae5256..6593c4fc5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBarCode/MaterialBarCodeDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialBarCode/MaterialBarCodeDTO.java @@ -5,6 +5,7 @@ import com.mhd.common.core.web.domain.BaseVOEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.List; /** @@ -65,6 +66,10 @@ public class MaterialBarCodeDTO extends BaseVOEntity { @Excel(name = "名称") private String name; + @ApiModelProperty("数量") + @Excel(name = "数量") + private BigDecimal number; + @ApiModelProperty("备注") @Excel(name = "备注") private String remark;