diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java index de07487..653135a 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java @@ -141,14 +141,11 @@ public class InventoryDetailController extends BaseController { .eq(StringUtils.isNotEmpty(inventoryDetail.getWarehouse()), InventoryDetail::getWarehouse, inventoryDetail.getWarehouse()) //原仓库编码 .eq(inventoryDetail.getSelfCreated() != null, InventoryDetail::getSelfCreated, inventoryDetail.getSelfCreated())//是否自建库 .eq(StringUtils.isNotNull(inventoryDetail.getIsFlatWarehouse()), InventoryDetail::getIsFlatWarehouse, inventoryDetail.getIsFlatWarehouse())//仓库类型 + .ne(StringUtils.isNotEmpty(inventoryDetail.getDeadTime()), InventoryDetail::getDeadTime, "") .orderByDesc(InventoryDetail::getId); - if (StringUtils.isNotEmpty(inventoryDetail.getDeadTime()) && !inventoryDetail.getDeadTime().equals("-1")) { - List<InventoryDetail> list = inventoryDetailService.list(lambdaQueryWrapper); - //处理呆滞库存 - list = inventoryDetailService.expiringInventoryHandle(list, inventoryDetail.getDeadTime()); - return getDataTable(list); - } else if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { - //分页查询 + + + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { Page<InventoryDetail> page = new Page<>(pageNum, pageSize); IPage<InventoryDetail> iPage = inventoryDetailService.page(page, lambdaQueryWrapper); return getMpDataTable(iPage.getRecords(), iPage.getTotal()); diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/domain/InventoryDetail.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/domain/InventoryDetail.java index d305c53..03f295a 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/domain/InventoryDetail.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/domain/InventoryDetail.java @@ -316,7 +316,7 @@ public class InventoryDetail implements Serializable { * 呆滞时长 */ @ApiModelProperty(value = "呆滞时长") - @TableField(exist = false) + @TableField(value = "deadTime") private String deadTime; /** @@ -389,6 +389,12 @@ public class InventoryDetail implements Serializable { @TableField(exist = false) private String materialVolumePercentage; + /** + * 真实更新时间 + */ + @TableField(value = "realUpdated") + private Date realUpdated; + public void setQty(BigDecimal qty) { if (qty.compareTo(BigDecimal.ZERO) < 0) { throw new ServiceException(containerCode + ",库存数量不能为负数"); diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java index e5ccc1f..742e93c 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java @@ -42,13 +42,6 @@ public interface InventoryDetailService extends IService<InventoryDetail> { List<LinkedHashMap<String, Object>> getCompanyInventoryProp(String companyCode); /** - * @param inventoryDetails - * @param expiring true 呆滞库存 false 未呆滞库存 - * @return - */ - List<InventoryDetail> expiringInventoryHandle(List<InventoryDetail> inventoryDetails, String expiring); - - /** * 通过id获取当前库位所存储的物料编码集合 * * @param inventoryHeaderId diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java index bfd5032..cabbfa6 100644 --- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java +++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java @@ -279,72 +279,6 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe } @Override - public List<InventoryDetail> expiringInventoryHandle(List<InventoryDetail> inventoryDetails, String expiring) { - // 获取库存呆滞时间配置 - int days = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME)); - int daysBatch = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_BATCH)); - int daysFlammable = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_FLAMMABLE)); - - // 如果 inventoryDetails 为空,直接返回空列表 - if (CollectionUtils.isEmpty(inventoryDetails)) { - return Collections.emptyList(); - } - - // 获取所有物料编码 - Set<String> materialCodes = inventoryDetails.stream() - .map(InventoryDetail::getMaterialCode) - .collect(Collectors.toSet()); - - // 批量查询物料信息 - List<Material> materials = getMaterialsByCodes(materialCodes); - - // 创建物料编码和物料对象的映射关系 - Map<String, Material> materialMap = new HashMap<>(); - for (Material material : materials) { - materialMap.put(material.getCode(), material); - } - - return inventoryDetails.stream().collect(Collectors.partitioningBy(inventoryDetail -> { - // 计算库存的更新时间和当前时间之间的差距 - long difference = DateUtils.difference(DateUtils.getNowDate(), inventoryDetail.getLastUpdated()); - - // 从 Map 中获取物料信息 - Material material = materialMap.get(inventoryDetail.getMaterialCode()); - if (material == null) { - return false; - } - - int materialDays = days; - if (Objects.equals(material.getIsFlammable(), "是")) { - materialDays = Math.min(materialDays, daysFlammable); - } else if (Objects.equals(material.getIsBatch(), "是")) { - materialDays = Math.min(materialDays, daysBatch); - } - - // 计算呆滞时长 - int differenceDay = DateUtils.secondToDays(difference); - int num = differenceDay - materialDays; - - // 判断是否为呆滞库存 - if (num > 0) { - inventoryDetail.setDeadTime(num + "天"); - return true; - } - return false; - })).getOrDefault(expiring.equals("1"), Collections.emptyList()); - } - - public List<Material> getMaterialsByCodes(Set<String> materialCodes) { - if (CollectionUtils.isEmpty(materialCodes)) { - return Collections.emptyList(); - } - //in 方法进行批量查询 - LambdaQueryWrapper<Material> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(Material::getCode, materialCodes); - return materialService.list(queryWrapper); - } - - @Override public List<InventoryDetail> queryReceiptDetailById(Integer inventoryHeaderId) { LambdaQueryWrapper<InventoryDetail> lam = Wrappers.lambdaQuery(); lam.eq(InventoryDetail::getInventoryHeaderId, inventoryHeaderId) diff --git a/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java b/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java index 0e20be2..9ba1be1 100644 --- a/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java +++ b/src/main/java/com/huaheng/pc/monitor/job/task/RyTask.java @@ -15,6 +15,7 @@ import com.huaheng.common.utils.DateUtils; import com.huaheng.common.utils.StringUtils; import com.huaheng.framework.web.controller.BaseController; import com.huaheng.framework.web.domain.AjaxResult; +import com.huaheng.framework.web.service.ConfigService; import com.huaheng.pc.config.company.service.CompanyService; import com.huaheng.pc.config.container.domain.Container; import com.huaheng.pc.config.container.service.ContainerService; @@ -28,6 +29,8 @@ import com.huaheng.pc.config.station.service.StationService; import com.huaheng.pc.config.wcsscanbarcode.service.WcsscanbarcodeService; import com.huaheng.pc.config.zone.domain.Zone; import com.huaheng.pc.config.zone.service.ZoneService; +import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail; +import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService; import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader; import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService; import com.huaheng.pc.monitor.apilog.domain.ApiLog; @@ -74,6 +77,7 @@ import org.apache.commons.collections.MapUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.ModelMap; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; @@ -87,7 +91,8 @@ import java.util.stream.Collectors; */ @Component("RyTask") public class RyTask extends BaseController { - + @Resource + private ConfigService configService; @Resource private MaterialMapper materialMapper; @Resource @@ -154,6 +159,8 @@ public class RyTask extends BaseController { private TaskNumMapper taskNumMapper; @Resource private SrmStatusTimeMapper srmStatusTimeMapper; + @Resource + private InventoryDetailService inventoryDetailService; //并发控制 Map<String, Boolean> runningTaskMap = new HashMap<>(); @@ -806,4 +813,64 @@ public class RyTask extends BaseController { } + //每天计算呆滞库存 + public void expiringInventoryHandle() { + List<InventoryDetail> inventoryDetails = inventoryDetailService.list(); + if (CollectionUtils.isEmpty(inventoryDetails)) { + return; + } + + // 获取库存呆滞时间配置 + int days = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME)); + int daysBatch = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_BATCH)); + int daysFlammable = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_FLAMMABLE)); + + // 获取所有物料编码 + Set<String> materialCodes = inventoryDetails.stream() + .map(InventoryDetail::getMaterialCode).collect(Collectors.toSet()); + + List<Material> materials = materialService.list(new LambdaQueryWrapper<Material>().in(Material::getCode, materialCodes)); + + // 创建物料编码和物料对象的映射关系 + Map<String, Material> materialMap = new HashMap<>(); + for (Material material : materials) { + materialMap.put(material.getCode(), material); + } + + List<InventoryDetail> updatedInventoryDetails = inventoryDetails.stream() + .map(inventoryDetail -> { + // 计算库存的更新时间和当前时间之间的差距 + long difference = DateUtils.difference(DateUtils.getNowDate(), inventoryDetail.getRealUpdated()); + + // 从 Map 中获取物料信息 + Material material = materialMap.get(inventoryDetail.getMaterialCode()); + if (material == null) { + return inventoryDetail; + } + + int materialDays = days; + if (Objects.equals(material.getIsFlammable(), "是")) { + materialDays = Math.min(materialDays, daysFlammable); + } else if (Objects.equals(material.getIsBatch(), "是")) { + materialDays = Math.min(materialDays, daysBatch); + } + + // 计算呆滞时长 + int differenceDay = DateUtils.secondToDays(difference); + int deadTime = Math.max(differenceDay - materialDays, 0); + if (deadTime == 0) { + inventoryDetail.setDeadTime(""); + } else { + inventoryDetail.setDeadTime(deadTime + "天"); + } + + return inventoryDetail; + }) + .collect(Collectors.toList()); + + // 保存更新后的库存信息 + inventoryDetailService.updateBatchById(updatedInventoryDetails); + } + + } diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java index 0e1b22b..006090a 100644 --- a/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java +++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java @@ -338,7 +338,7 @@ public class ReceiptTaskService { if (!locationService.update(updateLocation, locationLambdaUpdateWrapper)) { throw new ServiceException("补充入库,更新库位失败"); } - + //解除右侧库位禁用和对应4个库位标记 Container container = containerService.getContainerByCode(task.getContainerCode()); locationService.unbanRightLocationAndUnmark(container.getContainerType(), fromLocationCode); @@ -552,6 +552,7 @@ public class ReceiptTaskService { } if (StringUtils.isNotNull(inventoryDetail)) { inventoryDetail.setQty(inventoryDetail.getQty().add(taskDetail.getQty())); + inventoryDetail.setRealUpdated(new Date()); } else { ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId()); inventoryDetail = new InventoryDetail(); @@ -568,6 +569,7 @@ public class ReceiptTaskService { inventoryDetail.setMaterialUnit(material.getUnit()); inventoryDetail.setQty(receiptQty); inventoryDetail.setTaskQty(new BigDecimal(0)); + inventoryDetail.setRealUpdated(new Date()); inventoryDetail.setSupplierCode(receiptDetail.getSupplierCode()); inventoryDetail.setReferCode(receiptDetail.getReferCode()); diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java index 4562f0b..f265180 100644 --- a/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java +++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java @@ -390,6 +390,7 @@ public class ShipmentTaskService { //扣减库存明细 inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().subtract(taskDetail.getQty())); inventoryDetail.setQty(inventoryDetail.getQty().subtract(taskDetail.getQty())); + inventoryDetail.setRealUpdated(new Date()); if (inventoryDetail.getQty().signum() == -1) { throw new ServiceException("扣减库存大于wms库存"); diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java index acc3936..8741b03 100644 --- a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java +++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java @@ -656,11 +656,18 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea && inventoryDetail.getMaterialColor().equals(inventoryDetail2.getMaterialColor()) && inventoryDetail.getRemarks().equals(inventoryDetail2.getRemarks()) && inventoryDetail.getPaintStatus().equals(inventoryDetail2.getPaintStatus())) { + + //如果都相同的话,合并库存, BigDecimal totalQty = inventoryDetailList.get(i).getQty().add(inventoryDetailList.get(j).getQty()); inventoryDetailList.get(i).setQty(totalQty); + // 更新 realUpdated 字段为当前时间 + inventoryDetailList.get(i).setRealUpdated(new Date()); + + //计算两个对象的 qty 属性之和,赋值给外层循环的 inventoryDetail 对象 LambdaQueryWrapper<InventoryDetail> wrapper = Wrappers.lambdaQuery(); wrapper.eq(InventoryDetail::getId, inventoryDetailList.get(i).getId()); inventoryDetailService.update(inventoryDetailList.get(i), wrapper); + //删除 LambdaQueryWrapper<InventoryDetail> wrapper2 = Wrappers.lambdaQuery(); wrapper2.eq(InventoryDetail::getId, inventoryDetailList.get(j).getId()); inventoryDetailService.remove(wrapper2); @@ -964,11 +971,12 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)); } + @Override public Integer getShipmentTaskBy5Road() { //组盘表新建状态任务+任务表任务 - Integer tasknum=shipmentContainerHeaderService.list(new LambdaQueryWrapper<ShipmentContainerHeader>() - .in(ShipmentContainerHeader::getStatus, 1,10) + Integer tasknum = shipmentContainerHeaderService.list(new LambdaQueryWrapper<ShipmentContainerHeader>() + .in(ShipmentContainerHeader::getStatus, 1, 10) .apply("(SUBSTRING(locationCode, 1, 3) in ('K05','K06','K07','K08') )")).size(); return tasknum; } diff --git a/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html b/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html index 7519006..4b254b6 100644 --- a/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html +++ b/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html @@ -94,11 +94,9 @@ 入库明细ID:<input type="text" name="receiptDetailId"/> </li> <li> - 是否查询呆滞库存: + 呆滞库存: <select name="deadTime"> - <option value="-1">不查询</option> - <option value="3">全部查询</option> - <option value="2">非呆滞库存</option> + <option value="">全部查询</option> <option value="1">呆滞库存</option> </select> </li> @@ -325,6 +323,10 @@ visible: true }, { + field: 'realUpdated', + title: '真实更新时间' + }, + { field: 'qcCheck', title: '质检', visible: false