src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java
@@ -279,163 +279,75 @@ /* * 生成唯一条码的方法 * 生成唯一条码的方法(目前还没有编码规则,确定后在这里改) */ private String generateUniqueBarcode(String cuttingId, int index) { // 条码生成规则示例:刀具ID + 序号(4位) + 随机数 return cuttingId + String.format("%04d", index + 1) + (int) (Math.random() * 10000); } // @GetMapping("/submit") // public Result<?> submit(@RequestParam("orderId") String orderId) { // // cuttingInboundService.submit(orderId); // // return Result.ok("提交成功"); @GetMapping("/submit") @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时") public Result<?> submit(@RequestParam("orderId") String orderId) { // long startTime = System.currentTimeMillis(); // try { // // 1. 更新入库单状态 // CuttingInbound cuttingInbound = cuttingInboundService.getById(orderId); // if (cuttingInbound == null) { // return Result.error("未找到对应的入库单"); // } // // // 检查入库单状态,只允许状态为"1"的入库单提交 // if (!"1".equals(cuttingInbound.getOrderStatus())) { // return Result.error("只有状态为未提交的入库单才能执行提交操作"); // } // // // 2. 更新状态为已提交 // cuttingInbound.setOrderStatus("2"); // boolean updateResult = cuttingInboundService.updateById(cuttingInbound); // if (!updateResult) { // return Result.error("更新入库单状态失败"); // } // cuttingInboundService.updateById(cuttingInbound); // // // 3. 获取入库明细 // // 2. 获取入库明细 // List<CuttingInboundDetail> detailList = cuttingInboundDetailService.lambdaQuery() // .eq(CuttingInboundDetail::getOrderId, orderId) // .list(); // // // 用于统计总数量 // int totalSubmitted = 0; // // // 批量保存的列表 // // 3. 收集所有需要保存的数据 // List<CuttingInventory> inventoryList = new ArrayList<>(); // List<CuttingInboundInventory> inboundInventoryList = new ArrayList<>(); // // // 4. 根据明细数量生成库存记录和条码 // for (CuttingInboundDetail detail : detailList) { // // 根据明细中的数量生成对应数量的库存记录receive_number // int quantity = detail.getReceiveNumber() != null ? detail.getReceiveNumber() : 0; // for (int i = 0; i < quantity; i++) { // totalSubmitted++; // // 为每个刀具生成独立的库存记录 // CuttingInventory cuttingInventory = new CuttingInventory(); // String inventoryId = UUID.randomUUID().toString().replace("-", ""); // cuttingInventory.setId(inventoryId); // cuttingInventory.setCuttingId(detail.getCuttingId()); // // 为每个刀具生成唯一条码 // cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i)); // // 设置库存状态为在库 // cuttingInventory.setInventoryStatus("正常"); // // 设置当前寿命为100 // cuttingInventory.setCurrentLife(BigDecimal.valueOf(100)); // // 添加到批量保存列表 // inventoryList.add(cuttingInventory); // int quantity = detail.getReceiveNumber() != null ? detail.getReceiveNumber().intValue() : 0; // // // 建立入库单与库存的关联关系 // for (int i = 0; i < quantity; i++) { // // 生成库存记录 // CuttingInventory cuttingInventory = new CuttingInventory(); // cuttingInventory.setCuttingId(detail.getCuttingId()); // cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i)); // cuttingInventory.setInventoryStatus("正常"); // cuttingInventory.setCurrentLife(BigDecimal.valueOf(100)); // inventoryList.add(cuttingInventory); // } // } // // // 4. 批量保存库存记录(一次性操作) // if (!inventoryList.isEmpty()) { // cuttingInventoryService.saveBatch(inventoryList); // // // 5. 为每个保存的库存记录创建关联关系 // for (CuttingInventory inventory : inventoryList) { // CuttingInboundInventory cuttingInboundInventory = new CuttingInboundInventory(); // cuttingInboundInventory.setOrderId(orderId); // cuttingInboundInventory.setInventoryId(inventoryId); // // 添加到批量保存列表 // cuttingInboundInventory.setInventoryId(inventory.getId()); // inboundInventoryList.add(cuttingInboundInventory); // } // // // 6. 批量保存关联关系(一次性操作) // cuttingInboundInventoryService.saveBatch(inboundInventoryList); // } // // // 批量保存库存记录 // if (!inventoryList.isEmpty()) { // boolean saveResult = cuttingInventoryService.saveBatch(inventoryList); // if (!saveResult) { // throw new RuntimeException("保存库存记录失败"); // } // } // long endTime = System.currentTimeMillis(); // log.info("刀具入库提交完成,耗时: {} s", (endTime - startTime)/1000); // return Result.ok("提交成功"); // // // 批量保存关联关系 // if (!inboundInventoryList.isEmpty()) { // boolean relationSaveResult = cuttingInboundInventoryService.saveBatch(inboundInventoryList); // if (!relationSaveResult) { // throw new RuntimeException("保存关联关系失败"); // } // } // // Map<String, Object> result = new HashMap<>(); // result.put("message", "提交成功"); // result.put("totalSubmitted", totalSubmitted); // return Result.ok(result); // } catch (Exception e) { // log.error("提交入库单失败,orderId: " + orderId, e); // throw new RuntimeException("提交失败: " + e.getMessage(), e); // long endTime = System.currentTimeMillis(); // log.error("提交入库单失败,orderId: " + orderId + ",耗时: " + (endTime - startTime) + " ms", e); // return Result.error("提交失败: " + e.getMessage()); // } // } @GetMapping("/submit") @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时") public Result<?> submit(@RequestParam("orderId") String orderId) { long startTime = System.currentTimeMillis(); try { // 1. 更新入库单状态 CuttingInbound cuttingInbound = cuttingInboundService.getById(orderId); if (cuttingInbound == null) { return Result.error("未找到对应的入库单"); } cuttingInbound.setOrderStatus("2"); cuttingInboundService.updateById(cuttingInbound); // 2. 获取入库明细 List<CuttingInboundDetail> detailList = cuttingInboundDetailService.lambdaQuery() .eq(CuttingInboundDetail::getOrderId, orderId) .list(); // 3. 收集所有需要保存的数据 List<CuttingInventory> inventoryList = new ArrayList<>(); List<CuttingInboundInventory> inboundInventoryList = new ArrayList<>(); for (CuttingInboundDetail detail : detailList) { int quantity = detail.getReceiveNumber() != null ? detail.getReceiveNumber().intValue() : 0; for (int i = 0; i < quantity; i++) { // 生成库存记录 CuttingInventory cuttingInventory = new CuttingInventory(); cuttingInventory.setCuttingId(detail.getCuttingId()); cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i)); cuttingInventory.setInventoryStatus("正常"); cuttingInventory.setCurrentLife(BigDecimal.valueOf(100)); inventoryList.add(cuttingInventory); } } // 4. 批量保存库存记录(一次性操作) if (!inventoryList.isEmpty()) { cuttingInventoryService.saveBatch(inventoryList); // 5. 为每个保存的库存记录创建关联关系 for (CuttingInventory inventory : inventoryList) { CuttingInboundInventory cuttingInboundInventory = new CuttingInboundInventory(); cuttingInboundInventory.setOrderId(orderId); cuttingInboundInventory.setInventoryId(inventory.getId()); inboundInventoryList.add(cuttingInboundInventory); } // 6. 批量保存关联关系(一次性操作) cuttingInboundInventoryService.saveBatch(inboundInventoryList); } long endTime = System.currentTimeMillis(); log.info("刀具入库提交完成,耗时: {} s", (endTime - startTime)/1000); return Result.ok("提交成功"); } catch (Exception e) { long endTime = System.currentTimeMillis(); log.error("提交入库单失败,orderId: " + orderId + ",耗时: " + (endTime - startTime) + " ms", e); return Result.error("提交失败: " + e.getMessage()); } return cuttingInboundService.submit(orderId); } } src/main/java/org/jeecg/modules/cms/controller/CuttingInventoryController.java
@@ -6,6 +6,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.modules.cms.entity.CuttingInventory; src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java
src/main/java/org/jeecg/modules/cms/controller/CuttingToolController.java
@@ -198,7 +198,7 @@ return super.importExcel(request, response, CuttingTool.class); } //选择刀具的接口 @GetMapping(value = "/getCuttingToolList") public Result<?> getCuttingToolList(@RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer pageSize, src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java
@@ -4,10 +4,8 @@ import java.io.UnsupportedEncodingException; import java.util.Date; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; @@ -57,6 +55,9 @@ @ApiModelProperty(value = "刀具ID") @Dict(dictTable = "cms_cutting_tool",dicCode="id",dicText = "cutting_code") private String cuttingId; @TableField(exist = false) // 表示这不是数据库字段 private String cuttingCode; /**刀具条码*/ @Excel(name = "刀具条码", width = 15) @ApiModelProperty(value = "刀具条码") @@ -69,4 +70,11 @@ @Excel(name = "当前寿命(百分比)", width = 15) @ApiModelProperty(value = "当前寿命(百分比)") private BigDecimal currentLife; // 在CuttingInventory实体类中添加 @TableField(exist = false) // 表示这不是数据库字段 private String cuttingIdSearch; @TableField(exist = false) // 表示这不是数据库字段 private String cuttingBarcodeSearch; } src/main/java/org/jeecg/modules/cms/mapper/CuttingReceiveDetailMapper.java
@@ -15,5 +15,5 @@ */ public interface CuttingReceiveDetailMapper extends BaseMapper<CuttingReceiveDetail> { public List<Map<String, Object>> detailList(@Param("orderId") String orderId); List<Map<String, Object>> detailList(@Param("orderId") String orderId); } src/main/java/org/jeecg/modules/cms/service/ICuttingInboundService.java
@@ -15,4 +15,6 @@ */ public interface ICuttingInboundService extends IService<CuttingInbound> { Result<?> importExcelData(List<CuttingInboundExportVo> list); Result<?> submit(String orderId); } src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveDetailService.java
@@ -7,6 +7,7 @@ import java.util.Map; /** * * @Description: 领用单明细 * @Author: jeecg-boot * @Date: 2025-07-28 @@ -14,5 +15,5 @@ */ public interface ICuttingReceiveDetailService extends IService<CuttingReceiveDetail> { public List<Map<String, Object>> detailList(String orderId); List<Map<String, Object>> detailList(String orderId); } src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
@@ -1,17 +1,25 @@ package org.jeecg.modules.cms.service.impl; import io.micrometer.core.annotation.Timed; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.cms.entity.CuttingInbound; import org.jeecg.modules.cms.entity.CuttingInboundDetail; import org.jeecg.modules.cms.entity.CuttingInboundInventory; import org.jeecg.modules.cms.entity.CuttingInventory; import org.jeecg.modules.cms.mapper.CuttingInboundMapper; import org.jeecg.modules.cms.service.ICuttingInboundInventoryService; import org.jeecg.modules.cms.service.ICuttingInboundService; import org.jeecg.modules.cms.service.ICuttingInboundDetailService; import org.jeecg.modules.cms.service.ICuttingInventoryService; import org.jeecg.modules.cms.vo.CuttingInboundExportVo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -22,10 +30,18 @@ * @Date: 2025-07-28 * @Version: V1.0 */ @Slf4j @Service public class CuttingInboundServiceImpl extends ServiceImpl<CuttingInboundMapper, CuttingInbound> implements ICuttingInboundService { @Autowired private ICuttingInboundDetailService cuttingInboundDetailService; // 注入从表服务 @Autowired private ICuttingInventoryService cuttingInventoryService; @Autowired private ICuttingInboundInventoryService cuttingInboundInventoryService; /** * 通过Excel导入刀具入库单数据 * @@ -35,39 +51,7 @@ @Override @Transactional(rollbackFor = Exception.class) public Result<?> importExcelData(List<CuttingInboundExportVo> list) { // try { // for (CuttingInboundExportVo exportVo : list) { // // 保存主表数据 // CuttingInbound cuttingInbound = new CuttingInbound(); // cuttingInbound.setReceiver(exportVo.getReceiver()); // cuttingInbound.setReceiveTime(exportVo.getReceiveTime()); // cuttingInbound.setReceiveComment(exportVo.getReceiveComment()); // cuttingInbound.setConfirmer(exportVo.getConfirmer()); // cuttingInbound.setConfirmTime(exportVo.getConfirmTime()); // cuttingInbound.setConfirmComment(exportVo.getConfirmComment()); // cuttingInbound.setOrderStatus(exportVo.getOrderStatus()); // // // 保存主表数据以获取ID // this.save(cuttingInbound); // // // 获取主表ID // String orderId = cuttingInbound.getId(); // // // 处理从表数据 // List<CuttingInboundDetail> detailList = exportVo.getDetailList(); // if (detailList != null && !detailList.isEmpty()) { // for (CuttingInboundDetail detail : detailList) { // detail.setOrderId(orderId); // 设置外键关联 // cuttingInboundDetailService.save(detail); // } // } // } // return Result.ok("导入成功"); // } catch (Exception e) { // log.error("导入失败", e); // return Result.error("导入失败: " + e.getMessage()); // } // } for (CuttingInboundExportVo exportVo : list) { // 保存主表数据 CuttingInbound cuttingInbound = new CuttingInbound(); @@ -96,4 +80,88 @@ } return Result.ok("导入成功"); } /* * 生成唯一条码的方法(确定编码生成规则后在此处重写) */ private String generateUniqueBarcode(String cuttingId, int index) { // 条码生成规则示例:刀具ID + 序号(4位) + 随机数 return cuttingId + String.format("%04d", index + 1) + (int) (Math.random() * 10000); } @Override @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时") public synchronized Result<?> submit(String orderId) { long startTime = System.currentTimeMillis(); try { // 1. 更新入库单状态 CuttingInbound cuttingInbound = this.getById(orderId); if (cuttingInbound == null) { return Result.error("未找到对应的入库单"); } // 检查入库单状态,只允许状态为"1"的入库单提交 if (!"1".equals(cuttingInbound.getOrderStatus())) { return Result.error("只有状态为未提交的入库单才能执行提交操作"); } cuttingInbound.setOrderStatus("2"); boolean updateResult = this.updateById(cuttingInbound); if (!updateResult) { return Result.error("更新入库单状态失败,可能已被其他用户处理"); } // 2. 获取入库明细 List<CuttingInboundDetail> detailList = cuttingInboundDetailService.lambdaQuery() .eq(CuttingInboundDetail::getOrderId, orderId) .list(); // 3. 收集所有需要保存的数据 List<CuttingInventory> inventoryList = new ArrayList<>(); List<CuttingInboundInventory> inboundInventoryList = new ArrayList<>(); for (CuttingInboundDetail detail : detailList) { int quantity = detail.getReceiveNumber() != null ? detail.getReceiveNumber().intValue() : 0; for (int i = 0; i < quantity; i++) { // 生成库存记录 CuttingInventory cuttingInventory = new CuttingInventory(); cuttingInventory.setCuttingId(detail.getCuttingId()); cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i)); cuttingInventory.setInventoryStatus("正常"); cuttingInventory.setCurrentLife(BigDecimal.valueOf(100)); inventoryList.add(cuttingInventory); } } // 4. 批量保存库存记录(一次性操作) if (!inventoryList.isEmpty()) { cuttingInventoryService.saveBatch(inventoryList); // 5. 为每个保存的库存记录创建关联关系 for (CuttingInventory inventory : inventoryList) { CuttingInboundInventory cuttingInboundInventory = new CuttingInboundInventory(); cuttingInboundInventory.setOrderId(orderId); cuttingInboundInventory.setInventoryId(inventory.getId()); inboundInventoryList.add(cuttingInboundInventory); } // 6. 批量保存关联关系(一次性操作) cuttingInboundInventoryService.saveBatch(inboundInventoryList); } long endTime = System.currentTimeMillis(); log.info("刀具入库提交完成,耗时: {} ms", (endTime - startTime)); return Result.ok("提交成功"); } catch (Exception e) { long endTime = System.currentTimeMillis(); log.error("提交入库单失败,orderId: " + orderId + ",耗时: " + (endTime - startTime) + " ms", e); return Result.error("提交失败: " + e.getMessage()); } } }