| | |
| | | package org.jeecg.modules.cms.controller; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import io.micrometer.core.annotation.Timed; |
| | | import org.jeecg.common.api.vo.Result; |
| | | import org.jeecg.common.system.query.QueryGenerator; |
| | | 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.ICuttingInboundDetailService; |
| | | import org.jeecg.modules.cms.service.ICuttingInboundInventoryService; |
| | | import org.jeecg.modules.cms.service.ICuttingInboundService; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import org.jeecg.modules.cms.service.ICuttingInventoryService; |
| | | import org.jeecg.modules.cms.vo.CuttingInboundExportVo; |
| | | import org.jeecgframework.poi.excel.ExcelImportUtil; |
| | | import org.jeecgframework.poi.excel.def.NormalExcelConstants; |
| | | import org.jeecgframework.poi.excel.entity.ExportParams; |
| | | import org.jeecgframework.poi.excel.entity.ImportParams; |
| | | import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; |
| | | import org.jeecg.common.system.base.controller.JeecgController; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import org.springframework.web.multipart.MultipartHttpServletRequest; |
| | | import org.springframework.web.servlet.ModelAndView; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | |
| | | @Autowired |
| | | private CuttingInboundMapper cuttingInboundMapper; |
| | | |
| | | @Autowired |
| | | private ICuttingInventoryService cuttingInventoryService; |
| | | @Autowired |
| | | private ICuttingInboundInventoryService cuttingInboundInventoryService; |
| | | /** |
| | | * 分页列表查询 |
| | | * |
| | |
| | | //@RequiresPermissions("cms_cutting_inbound:importExcel") |
| | | @RequestMapping(value = "/importExcel", method = RequestMethod.POST) |
| | | public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { |
| | | return super.importExcel(request, response, CuttingInbound.class); |
| | | // MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; |
| | | // Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); |
| | | // |
| | | // for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { |
| | | // MultipartFile file = entity.getValue(); |
| | | // ImportParams params = new ImportParams(); |
| | | // params.setTitleRows(1); |
| | | // params.setHeadRows(1); |
| | | // try { |
| | | // // 解析Excel文件 |
| | | // List<CuttingInbound> list = ExcelImportUtil.importExcel(file.getInputStream(), CuttingInbound.class, params); |
| | | // |
| | | // for (CuttingInbound cuttingInbound : list) { |
| | | // // 保存主表数据 |
| | | // cuttingInboundService.save(cuttingInbound); |
| | | // |
| | | // // 获取主表ID |
| | | // String orderId = cuttingInbound.getId(); |
| | | // |
| | | // // 处理从表数据 |
| | | // List<CuttingInboundDetail> detailList = cuttingInbound.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("导入失败"); |
| | | // } |
| | | // } |
| | | // return Result.error("导入失败"); |
| | | // return super.importExcel(request, response, CuttingInbound.class); |
| | | MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; |
| | | Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); |
| | | |
| | | for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { |
| | | MultipartFile file = entity.getValue(); |
| | | ImportParams params = new ImportParams(); |
| | | params.setTitleRows(1); |
| | | params.setHeadRows(1); |
| | | try { |
| | | // 解析Excel文件 |
| | | List<CuttingInboundExportVo> list = ExcelImportUtil.importExcel(file.getInputStream(), CuttingInboundExportVo.class, params); |
| | | |
| | | // 调用Service层处理导入逻辑 |
| | | return cuttingInboundService.importExcelData(list); |
| | | } catch (org.jeecgframework.poi.exception.excel.ExcelImportException e) { |
| | | log.error("Excel导入异常", e); |
| | | return Result.error("Excel数据格式错误,请检查数据是否符合模板要求"); |
| | | } catch (Exception e) { |
| | | log.error("导入失败", e); |
| | | return Result.error("导入失败: " + e.getMessage()); |
| | | } |
| | | } |
| | | return Result.error("导入失败"); |
| | | } |
| | | |
| | | |
| | |
| | | return Result.ok(list); |
| | | } |
| | | |
| | | |
| | | /* |
| | | * 生成唯一条码的方法 |
| | | */ |
| | | 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("提交成功"); |
| | | // 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("更新入库单状态失败"); |
| | | // } |
| | | // |
| | | // // 3. 获取入库明细 |
| | | // List<CuttingInboundDetail> detailList = cuttingInboundDetailService.lambdaQuery() |
| | | // .eq(CuttingInboundDetail::getOrderId, orderId) |
| | | // .list(); |
| | | // |
| | | // // 用于统计总数量 |
| | | // int totalSubmitted = 0; |
| | | // |
| | | // // 批量保存的列表 |
| | | // 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); |
| | | // |
| | | // // 建立入库单与库存的关联关系 |
| | | // CuttingInboundInventory cuttingInboundInventory = new CuttingInboundInventory(); |
| | | // cuttingInboundInventory.setOrderId(orderId); |
| | | // cuttingInboundInventory.setInventoryId(inventoryId); |
| | | // // 添加到批量保存列表 |
| | | // inboundInventoryList.add(cuttingInboundInventory); |
| | | // } |
| | | // } |
| | | // |
| | | // // 批量保存库存记录 |
| | | // if (!inventoryList.isEmpty()) { |
| | | // boolean saveResult = cuttingInventoryService.saveBatch(inventoryList); |
| | | // if (!saveResult) { |
| | | // throw new RuntimeException("保存库存记录失败"); |
| | | // } |
| | | // } |
| | | // |
| | | // // 批量保存关联关系 |
| | | // 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); |
| | | // } |
| | | // } |
| | | |
| | | @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()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |