diff --git a/os-ems/src/main/java/com/os/ems/info/controller/SparePartsInventoryController.java b/os-ems/src/main/java/com/os/ems/info/controller/SparePartsInventoryController.java index 488ba93..ad4e3e3 100644 --- a/os-ems/src/main/java/com/os/ems/info/controller/SparePartsInventoryController.java +++ b/os-ems/src/main/java/com/os/ems/info/controller/SparePartsInventoryController.java @@ -85,7 +85,7 @@ public class SparePartsInventoryController extends BaseController int colIndex = 0; // 基础列 - String[] baseHeaders = {"主键", "入库时间", "采购方式", "库存位置", "物品名称", "原厂编号", "型号", "入库数量", "剩余数量", "备注"}; + String[] baseHeaders = {"主键", "入库时间", "采购方式", "库存位置", "物品名称", "原厂编号", "型号", "入库数量", "剩余数量", "库存阈值", "备注"}; for (String header : baseHeaders) { headerRow.createCell(colIndex++).setCellValue(header); } @@ -122,6 +122,8 @@ public class SparePartsInventoryController extends BaseController colIndex++; if (vo.getRemainingQuantity() != null) row.createCell(colIndex).setCellValue(vo.getRemainingQuantity()); colIndex++; + if (vo.getThreshold() != null) row.createCell(colIndex).setCellValue(vo.getThreshold()); + colIndex++; if (vo.getRemarks() != null) row.createCell(colIndex).setCellValue(vo.getRemarks()); colIndex++; @@ -329,6 +331,11 @@ public class SparePartsInventoryController extends BaseController vo.setRemainingQuantity((long) cell.getNumericCellValue()); } break; + case "库存阈值": + if (cell.getCellType() == CellType.NUMERIC) { + vo.setThreshold((long) cell.getNumericCellValue()); + } + break; case "备注": vo.setRemarks(getCellStringValue(cell)); break; diff --git a/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventory.java b/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventory.java index 720ff71..c4808b9 100644 --- a/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventory.java +++ b/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventory.java @@ -50,6 +50,10 @@ public class SparePartsInventory extends BaseEntity @Excel(name = "剩余数量", cellType = Excel.ColumnType.NUMERIC) private Long remainingQuantity; + /** 库存阈值 */ + @Excel(name = "库存阈值", cellType = Excel.ColumnType.NUMERIC) + private Long threshold; + /** 备注 */ @Excel(name = "备注", cellType = Excel.ColumnType.STRING) private String remarks; @@ -135,6 +139,15 @@ public class SparePartsInventory extends BaseEntity { return remainingQuantity; } + public void setThreshold(Long threshold) + { + this.threshold = threshold; + } + + public Long getThreshold() + { + return threshold; + } public void setRemarks(String remarks) { this.remarks = remarks; @@ -157,6 +170,7 @@ public class SparePartsInventory extends BaseEntity .append("model", getModel()) .append("warehouseQuantity", getWarehouseQuantity()) .append("remainingQuantity", getRemainingQuantity()) + .append("threshold", getThreshold()) .append("remarks", getRemarks()) .toString(); } diff --git a/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryCheck.java b/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryCheck.java index a2d2b66..5d1cc5f 100644 --- a/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryCheck.java +++ b/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryCheck.java @@ -1,9 +1,11 @@ package com.os.ems.info.domain; +import java.util.Date; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.os.common.annotation.Excel; import com.os.common.core.domain.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; /** * 备件盘点记录明细对象 spare_parts_inventory_check @@ -33,6 +35,10 @@ public class SparePartsInventoryCheck extends BaseEntity @Excel(name = "盘点日期", cellType = Excel.ColumnType.STRING) private String checkDate; + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdAt; + public void setId(Long id) { this.id = id; @@ -79,6 +85,16 @@ public class SparePartsInventoryCheck extends BaseEntity return checkDate; } + public void setCreatedAt(Date createdAt) + { + this.createdAt = createdAt; + } + + public Date getCreatedAt() + { + return createdAt; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -87,6 +103,7 @@ public class SparePartsInventoryCheck extends BaseEntity .append("checkName", getCheckName()) .append("checkQuantity", getCheckQuantity()) .append("checkDate", getCheckDate()) + .append("createdAt", getCreatedAt()) .toString(); } } diff --git a/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryExportVO.java b/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryExportVO.java index db06536..a0f1cf0 100644 --- a/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryExportVO.java +++ b/os-ems/src/main/java/com/os/ems/info/domain/SparePartsInventoryExportVO.java @@ -52,6 +52,10 @@ public class SparePartsInventoryExportVO @Excel(name = "剩余数量", cellType = Excel.ColumnType.NUMERIC) private Long remainingQuantity; + /** 库存阈值 */ + // @Excel(name = "库存阈值", cellType = Excel.ColumnType.NUMERIC) + private Long threshold; + /** 备注 */ @Excel(name = "备注", cellType = Excel.ColumnType.STRING) private String remarks; @@ -87,6 +91,9 @@ public class SparePartsInventoryExportVO public Long getRemainingQuantity() { return remainingQuantity; } public void setRemainingQuantity(Long remainingQuantity) { this.remainingQuantity = remainingQuantity; } + public Long getThreshold() { return threshold; } + public void setThreshold(Long threshold) { this.threshold = threshold; } + public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } @@ -115,6 +122,7 @@ public class SparePartsInventoryExportVO .append("model", getModel()) .append("warehouseQuantity", getWarehouseQuantity()) .append("remainingQuantity", getRemainingQuantity()) + .append("threshold", getThreshold()) .append("remarks", getRemarks()) .append("checkData", getCheckData()) .toString(); diff --git a/os-ems/src/main/java/com/os/ems/info/mapper/SparePartsInventoryCheckMapper.java b/os-ems/src/main/java/com/os/ems/info/mapper/SparePartsInventoryCheckMapper.java index 7b43c83..9fdf6dc 100644 --- a/os-ems/src/main/java/com/os/ems/info/mapper/SparePartsInventoryCheckMapper.java +++ b/os-ems/src/main/java/com/os/ems/info/mapper/SparePartsInventoryCheckMapper.java @@ -65,4 +65,12 @@ public interface SparePartsInventoryCheckMapper * @return 盘点名称列表 */ public List selectDistinctCheckNames(); + + /** + * 查询指定库存记录的最新盘点记录 + * + * @param inventoryObjid 库存记录ID + * @return 最新盘点记录 + */ + public SparePartsInventoryCheck selectLatestCheckByInventoryObjid(Long inventoryObjid); } diff --git a/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryCheckServiceImpl.java b/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryCheckServiceImpl.java index ed03ae0..81f2678 100644 --- a/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryCheckServiceImpl.java +++ b/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryCheckServiceImpl.java @@ -1,13 +1,18 @@ package com.os.ems.info.service.impl; import java.util.List; +import java.util.Set; +import java.util.HashSet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.os.common.exception.ServiceException; import com.os.common.utils.StringUtils; import com.os.ems.info.mapper.SparePartsInventoryCheckMapper; import com.os.ems.info.domain.SparePartsInventoryCheck; import com.os.ems.info.service.ISparePartsInventoryCheckService; +import com.os.ems.info.util.InventoryQuantityUpdater; +import com.os.common.utils.DateUtils; /** * 备件盘点记录明细Service业务层处理 @@ -21,6 +26,9 @@ public class SparePartsInventoryCheckServiceImpl implements ISparePartsInventory @Autowired private SparePartsInventoryCheckMapper sparePartsInventoryCheckMapper; + @Autowired + private InventoryQuantityUpdater inventoryQuantityUpdater; + /** * 查询备件盘点记录明细 * @@ -52,9 +60,22 @@ public class SparePartsInventoryCheckServiceImpl implements ISparePartsInventory * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int insertSparePartsInventoryCheck(SparePartsInventoryCheck sparePartsInventoryCheck) { - return sparePartsInventoryCheckMapper.insertSparePartsInventoryCheck(sparePartsInventoryCheck); + // 验证必要参数 + if (sparePartsInventoryCheck.getInventoryObjid() == null) { + throw new ServiceException("库存记录ID不能为空"); + } + + int result = sparePartsInventoryCheckMapper.insertSparePartsInventoryCheck(sparePartsInventoryCheck); + + // 如果插入成功,更新主表的剩余数量 + if (result > 0) { + inventoryQuantityUpdater.updateRemainingQuantityByLatestCheck(sparePartsInventoryCheck.getInventoryObjid()); + } + + return result; } /** @@ -64,9 +85,17 @@ public class SparePartsInventoryCheckServiceImpl implements ISparePartsInventory * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int updateSparePartsInventoryCheck(SparePartsInventoryCheck sparePartsInventoryCheck) { - return sparePartsInventoryCheckMapper.updateSparePartsInventoryCheck(sparePartsInventoryCheck); + int result = sparePartsInventoryCheckMapper.updateSparePartsInventoryCheck(sparePartsInventoryCheck); + + // 如果更新成功,同步更新主表的剩余数量 + if (result > 0 && sparePartsInventoryCheck.getInventoryObjid() != null) { + inventoryQuantityUpdater.updateRemainingQuantityByLatestCheck(sparePartsInventoryCheck.getInventoryObjid()); + } + + return result; } /** @@ -76,9 +105,31 @@ public class SparePartsInventoryCheckServiceImpl implements ISparePartsInventory * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int deleteSparePartsInventoryCheckByIds(Long[] ids) { - return sparePartsInventoryCheckMapper.deleteSparePartsInventoryCheckByIds(ids); + if (ids == null || ids.length == 0) { + return 0; + } + + // 先查询要删除的记录,收集相关的库存ID + Set inventoryObjids = new HashSet<>(); + for (Long id : ids) { + SparePartsInventoryCheck check = sparePartsInventoryCheckMapper.selectSparePartsInventoryCheckById(id); + if (check != null && check.getInventoryObjid() != null) { + inventoryObjids.add(check.getInventoryObjid()); + } + } + + int result = sparePartsInventoryCheckMapper.deleteSparePartsInventoryCheckByIds(ids); + + // 如果删除成功,批量更新相关库存记录的剩余数量 + if (result > 0 && !inventoryObjids.isEmpty()) { + Long[] objidArray = inventoryObjids.toArray(new Long[0]); + inventoryQuantityUpdater.batchUpdateRemainingQuantity(objidArray); + } + + return result; } /** @@ -88,9 +139,20 @@ public class SparePartsInventoryCheckServiceImpl implements ISparePartsInventory * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int deleteSparePartsInventoryCheckById(Long id) { - return sparePartsInventoryCheckMapper.deleteSparePartsInventoryCheckById(id); + // 先查询要删除的记录,获取库存ID + SparePartsInventoryCheck checkToDelete = sparePartsInventoryCheckMapper.selectSparePartsInventoryCheckById(id); + + int result = sparePartsInventoryCheckMapper.deleteSparePartsInventoryCheckById(id); + + // 如果删除成功,同步更新主表的剩余数量 + if (result > 0 && checkToDelete != null && checkToDelete.getInventoryObjid() != null) { + inventoryQuantityUpdater.updateRemainingQuantityByLatestCheck(checkToDelete.getInventoryObjid()); + } + + return result; } /** diff --git a/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryServiceImpl.java b/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryServiceImpl.java index 983584b..a6411ca 100644 --- a/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryServiceImpl.java +++ b/os-ems/src/main/java/com/os/ems/info/service/impl/SparePartsInventoryServiceImpl.java @@ -8,6 +8,7 @@ import java.util.HashMap; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.os.common.exception.ServiceException; import com.os.common.utils.StringUtils; import com.os.ems.info.mapper.SparePartsInventoryMapper; @@ -16,6 +17,7 @@ import com.os.ems.info.domain.SparePartsInventory; import com.os.ems.info.domain.SparePartsInventoryCheck; import com.os.ems.info.domain.SparePartsInventoryExportVO; import com.os.ems.info.service.ISparePartsInventoryService; +import com.os.ems.info.util.InventoryQuantityUpdater; import com.os.common.utils.DateUtils; /** @@ -33,6 +35,9 @@ public class SparePartsInventoryServiceImpl implements ISparePartsInventoryServi @Autowired private SparePartsInventoryCheckMapper sparePartsInventoryCheckMapper; + @Autowired + private InventoryQuantityUpdater inventoryQuantityUpdater; + /** * 查询备件库记录主 * @@ -262,15 +267,13 @@ public class SparePartsInventoryServiceImpl implements ISparePartsInventoryServi check.setInventoryObjid(objid); check.setCheckName(entry.getKey()); check.setCheckQuantity(entry.getValue()); - check.setCheckDate(DateUtils.getNowDate().toString()); + check.setCheckDate(DateUtils.dateTimeNow()); sparePartsInventoryCheckMapper.insertSparePartsInventoryCheck(check); - - // 更新主表的剩余数量为最新盘点数量 - main.setObjid(objid); - main.setRemainingQuantity(entry.getValue()); - sparePartsInventoryMapper.updateSparePartsInventory(main); } } + + // 盘点记录插入后,更新主表的剩余数量为最新盘点数量 + inventoryQuantityUpdater.updateRemainingQuantityByLatestCheck(objid); } successNum++; @@ -382,6 +385,7 @@ public class SparePartsInventoryServiceImpl implements ISparePartsInventoryServi * @return 结果 */ @Override + @Transactional public int insertSparePartsInventoryWithDynamicColumns(SparePartsInventoryExportVO sparePartsInventoryVO) { // 创建主记录 @@ -400,10 +404,13 @@ public class SparePartsInventoryServiceImpl implements ISparePartsInventoryServi check.setInventoryObjid(objid); check.setCheckName(entry.getKey()); check.setCheckQuantity(entry.getValue()); - check.setCheckDate(DateUtils.getNowDate().toString()); + check.setCheckDate(DateUtils.dateTimeNow()); sparePartsInventoryCheckMapper.insertSparePartsInventoryCheck(check); } } + + // 在盘点记录插入后,更新主表的剩余数量为最新盘点数量 + inventoryQuantityUpdater.updateRemainingQuantityByLatestCheck(objid); } return result; @@ -416,6 +423,7 @@ public class SparePartsInventoryServiceImpl implements ISparePartsInventoryServi * @return 结果 */ @Override + @Transactional public int updateSparePartsInventoryWithDynamicColumns(SparePartsInventoryExportVO sparePartsInventoryVO) { // 更新主记录 @@ -443,11 +451,14 @@ public class SparePartsInventoryServiceImpl implements ISparePartsInventoryServi check.setInventoryObjid(objid); check.setCheckName(entry.getKey()); check.setCheckQuantity(entry.getValue()); - check.setCheckDate(DateUtils.getNowDate().toString()); + check.setCheckDate(DateUtils.dateTimeNow()); sparePartsInventoryCheckMapper.insertSparePartsInventoryCheck(check); } } } + + // 在盘点记录更新后,同步更新主表的剩余数量为最新盘点数量 + inventoryQuantityUpdater.updateRemainingQuantityByLatestCheck(objid); } return result; diff --git a/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryCheckMapper.xml b/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryCheckMapper.xml index 50aece6..0f3ed10 100644 --- a/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryCheckMapper.xml +++ b/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryCheckMapper.xml @@ -10,10 +10,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select id, inventory_objid, check_name, check_quantity, check_date from spare_parts_inventory_check + select id, inventory_objid, check_name, check_quantity, check_date, created_at from spare_parts_inventory_check + + + \ No newline at end of file diff --git a/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryMapper.xml b/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryMapper.xml index 9ba0a34..a12acb4 100644 --- a/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryMapper.xml +++ b/os-ems/src/main/resources/mapper/ems/info/SparePartsInventoryMapper.xml @@ -14,11 +14,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select objid, warehouse_date, purchase_method, storage_location, item_name, original_part_number, model, warehouse_quantity, remaining_quantity, remarks from spare_parts_inventory + select objid, warehouse_date, purchase_method, storage_location, item_name, original_part_number, model, warehouse_quantity, remaining_quantity, threshold, remarks from spare_parts_inventory