src/main/java/org/jeecg/modules/andon/controller/AndonOrderController.java
@@ -83,6 +83,8 @@ String productionLineId = andonResponseConfigService.getProductionLineIdByButtonId(andonOrder.getButtonId()); if (productionLineId != null) { andonOrder.setFactoryId(productionLineId); }else{ return Result.error("未找到对应的产线ID,请先进行安灯响应配置!"); } } andonOrderService.save(andonOrder); src/main/java/org/jeecg/modules/andon/service/impl/AndonOrderServiceImpl.java
@@ -68,7 +68,7 @@ // 设置工单状态为处理中 andonOrder.setOrderStatus("3"); // 获取响应者用户名 // 获取响应用户名 String responderUsername = andonOrder.getResponder(); // 验证响应者用户名不为空 src/main/java/org/jeecg/modules/andon/service/impl/AndonResponseConfigServiceImpl.java
@@ -55,7 +55,7 @@ @Override public String getProductionLineIdByButtonId(String buttonId) { QueryWrapper<AndonResponseConfig> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("button_id", buttonId); queryWrapper.eq("button_id", buttonId); // 确保这里使用的是数据库字段名 AndonResponseConfig config = this.getOne(queryWrapper); return config != null ? config.getFactoryId() : null; } src/main/java/org/jeecg/modules/cms/controller/CuttingInboundController.java
@@ -1,5 +1,6 @@ package org.jeecg.modules.cms.controller; import java.math.BigDecimal; import java.util.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -10,8 +11,11 @@ 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; @@ -19,13 +23,18 @@ 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; @@ -51,6 +60,10 @@ @Autowired private CuttingInboundMapper cuttingInboundMapper; @Autowired private ICuttingInventoryService cuttingInventoryService; @Autowired private ICuttingInboundInventoryService cuttingInboundInventoryService; /** * 分页列表查询 * @@ -224,42 +237,30 @@ //@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("导入失败"); } @@ -275,4 +276,88 @@ 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(); // 用于统计总数量 // 4. 根据明细数量生成库存记录和条码 int totalSubmitted = 0; for (CuttingInboundDetail detail : detailList) { // 根据明细中的数量生成对应数量的库存记录receive_number int quantity = detail.getReceiveNumber() != null ? detail.getReceiveNumber() : 0; totalSubmitted = 0; for (int i = 0; i < quantity; i++) { totalSubmitted += quantity; // 为每个刀具生成独立的库存记录 CuttingInventory cuttingInventory = new CuttingInventory(); cuttingInventory.setCuttingId(detail.getCuttingId()); // 为每个刀具生成唯一条码 cuttingInventory.setCuttingBarcode(generateUniqueBarcode(detail.getCuttingId(), i)); // 设置库存状态为在库 cuttingInventory.setInventoryStatus("正常"); // 设置当前寿命为100 cuttingInventory.setCurrentLife(BigDecimal.valueOf(100)); // 保存到库存表 boolean saveResult = cuttingInventoryService.save(cuttingInventory); if (!saveResult) { return Result.error("保存库存记录失败"); } // 建立入库单与库存的关联关系 CuttingInboundInventory cuttingInboundInventory = new CuttingInboundInventory(); cuttingInboundInventory.setOrderId(orderId); cuttingInboundInventory.setInventoryId(cuttingInventory.getId()); // 保存关联关系 boolean relationSaveResult = cuttingInboundInventoryService.save(cuttingInboundInventory); if (!relationSaveResult) { return Result.error("保存关联关系失败"); } } } Map<String, Object> result = new HashMap<>(); result.put("message", "提交成功"); result.put("totalSubmitted", totalSubmitted); return Result.ok("提交成功"); } catch (Exception e) { log.error("提交入库单失败,orderId: " + orderId, e); return Result.error("提交失败: " + e.getMessage()); } } } src/main/java/org/jeecg/modules/cms/controller/CuttingInventoryController.java
@@ -3,15 +3,11 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.cms.entity.CuttingInventory; import org.jeecg.modules.cms.service.ICuttingInventoryService; @@ -20,18 +16,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; 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 com.alibaba.fastjson.JSON; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.jeecg.common.aspect.annotation.AutoLog; @@ -174,4 +162,18 @@ return super.importExcel(request, response, CuttingInventory.class); } /** * 刀具库存统计 */ @ApiOperation(value = "刀具库存-统计分页查询", notes = "刀具库存-统计分页查询") @GetMapping(value = "/statistics") public Result<IPage<Map<String, Object>>> statistics( @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page<Map<String, Object>> page = new Page<>(pageNo, pageSize); IPage<Map<String, Object>> pageList = cuttingInventoryService.statisticsByCuttingIdAndStatus(page); return Result.OK(pageList); } } src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java
@@ -55,6 +55,7 @@ /**刀具ID*/ @Excel(name = "刀具ID", width = 15) @ApiModelProperty(value = "刀具ID") @Dict(dictTable = "cms_cutting_tool",dicCode="id",dicText = "cutting_code") private String cuttingId; /**刀具条码*/ @Excel(name = "刀具条码", width = 15) src/main/java/org/jeecg/modules/cms/mapper/CuttingInventoryMapper.java
@@ -1,8 +1,9 @@ package org.jeecg.modules.cms.mapper; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.jeecg.modules.cms.entity.CuttingInventory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -13,5 +14,4 @@ * @Version: V1.0 */ public interface CuttingInventoryMapper extends BaseMapper<CuttingInventory> { } IPage<Map<String, Object>> statisticsByCuttingIdAndStatus(Page<Map<String, Object>> page);} src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingInventoryMapper.xml
@@ -1,5 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.jeecg.modules.cms.mapper.CuttingInventoryMapper"> <select id="statisticsByCuttingIdAndStatus" resultType="map"> SELECT t1.cutting_id as cuttingId, count(*) AS cuttingIdNumber, t1.inventory_status as inventoryStatus, t2.cutting_code AS cuttingCode FROM cms_cutting_inventory t1 LEFT JOIN cms_cutting_tool t2 ON t1.cutting_id = t2.id AND t2.del_flag = 0 GROUP BY cutting_id, inventory_status, cutting_code </select> </mapper> src/main/java/org/jeecg/modules/cms/service/ICuttingInboundDetailService.java
@@ -15,4 +15,5 @@ public interface ICuttingInboundDetailService extends IService<CuttingInboundDetail> { public List<Map<String, Object>> detailList(String orderId); } src/main/java/org/jeecg/modules/cms/service/ICuttingInboundService.java
@@ -1,7 +1,11 @@ package org.jeecg.modules.cms.service; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.cms.entity.CuttingInbound; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.cms.vo.CuttingInboundExportVo; import java.util.List; /** * @Description: 刀具入库单 @@ -10,5 +14,5 @@ * @Version: V1.0 */ public interface ICuttingInboundService extends IService<CuttingInbound> { Result<?> importExcelData(List<CuttingInboundExportVo> list); } src/main/java/org/jeecg/modules/cms/service/ICuttingInventoryService.java
@@ -1,7 +1,12 @@ package org.jeecg.modules.cms.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.jeecg.modules.cms.entity.CuttingInventory; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; import java.util.Map; /** * @Description: 刀具库存 @@ -11,4 +16,6 @@ */ public interface ICuttingInventoryService extends IService<CuttingInventory> { IPage<Map<String, Object>> statisticsByCuttingIdAndStatus(Page<Map<String, Object>> page); } src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
@@ -1,11 +1,20 @@ package org.jeecg.modules.cms.service.impl; 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.mapper.CuttingInboundMapper; import org.jeecg.modules.cms.service.ICuttingInboundService; import org.jeecg.modules.cms.service.ICuttingInboundDetailService; 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.util.List; import org.springframework.beans.factory.annotation.Autowired; /** * @Description: 刀具入库单 @@ -15,5 +24,76 @@ */ @Service public class CuttingInboundServiceImpl extends ServiceImpl<CuttingInboundMapper, CuttingInbound> implements ICuttingInboundService { @Autowired private ICuttingInboundDetailService cuttingInboundDetailService; // 注入从表服务 /** * 通过Excel导入刀具入库单数据 * * @param list 待导入的数据列表 * @return 导入结果 */ @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(); 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("导入成功"); } } src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java
@@ -1,11 +1,21 @@ package org.jeecg.modules.cms.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.jeecg.modules.cms.entity.CuttingInventory; import org.jeecg.modules.cms.mapper.CuttingInventoryMapper; import org.jeecg.modules.cms.mapper.CuttingToolMapper; import org.jeecg.modules.cms.service.ICuttingInventoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** * @Description: 刀具库存 @@ -15,5 +25,9 @@ */ @Service public class CuttingInventoryServiceImpl extends ServiceImpl<CuttingInventoryMapper, CuttingInventory> implements ICuttingInventoryService { @Override public IPage<Map<String, Object>> statisticsByCuttingIdAndStatus(Page<Map<String, Object>> page) { // 执行分页统计查询 IPage<Map<String, Object>> result = baseMapper.statisticsByCuttingIdAndStatus(page); return result; } } src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.base.entity.Factory; import org.jeecg.modules.base.entity.LineSideWarehouse; import org.jeecg.modules.base.entity.Shift; @@ -28,6 +29,7 @@ import org.jeecg.modules.mes.service.IMesProductionWorkOrderService; import org.jeecg.modules.mes.entity.MesProductionWorkOrder; import org.jeecg.modules.mes.mapper.MesProductionWorkOrderMapper; import org.jeecg.modules.mes.utils.CommonUtils; import org.jeecg.modules.pms.entity.PmsProcessBillMaterials; import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail; import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService; @@ -135,10 +137,28 @@ @Override public IPage<MesProductionWorkOrder> queryPageList(Page<MesProductionWorkOrder> page, Map<String, String[]> parameterMap) { QueryWrapper<MesProductionWorkOrder> queryWrapper = Wrappers.query(); LoginUser loginUser = CommonUtils.getCurrentUser(); if (loginUser == null) { return page; } queryWrapper.exists("select 1 from base_user_factory t where t.user_id = {0} and t.factory_id = t1.factory_id", loginUser.getId()); String[] factoryIds = parameterMap.get("factoryId"); if (factoryIds != null && factoryIds.length > 0) { queryWrapper.eq("t1.factory_id", factoryIds[0]); } String[] materialNumbers = parameterMap.get("materialNumber"); if (materialNumbers != null && materialNumbers.length > 0) { queryWrapper.like("t1.material_number", materialNumbers[0]); } String[] materialNames = parameterMap.get("materialName"); if (materialNames != null && materialNames.length > 0) { queryWrapper.like("t1.material_name", materialNames[0]); } String[] workOrderCodes = parameterMap.get("workOrderCode"); if (workOrderCodes != null && workOrderCodes.length > 0) { queryWrapper.like("t1.work_order_code", workOrderCodes[0]); } String[] startDates = parameterMap.get("startDate"); String[] endDates = parameterMap.get("endDate"); if (startDates != null && startDates.length > 0) {