From 2ae6bb79fe8d701b02266eb3c769652c10419acf Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Wed, 25 Feb 2026 17:26:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(order/shutdown):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改工单控制器接口名称从 /running 到 /getRunningOrders - 新增批量开始生产接口 /batchStart 用于启动多个工单 - 新增批量更新完工数量接口 /batchUpdateQty 处理完成和不良数量 - 新增批量完工提报接口 /batchComplete 完成多个工单 - 实现工单解析工具方法 parseObjIds 和 parseLong - 添加工单批量开始生产数据库操作 batchStartProduction - 添加工单批量更新完工数量数据库操作 batchUpdateQuantity - 添加工单批量完工提报数据库操作 batchCompleteProduction - 在服务层实现对应的批量业务逻辑并添加事务管理 - 为停机记录模块添加批量更新停机原因功能 - 优化停机记录查询条件和排序方式 --- .../controller/BaseOrderInfoController.java | 104 +++++++++++++++++- .../base/mapper/BaseOrderInfoMapper.java | 32 ++++++ .../base/service/IBaseOrderInfoService.java | 29 +++++ .../impl/BaseOrderInfoServiceImpl.java | 71 +++++++++++- .../mapper/base/BaseOrderInfoMapper.xml | 38 +++++++ .../DmsRecordShutDownController.java | 32 ++++++ .../aucma/dms/domain/DmsRecordShutDown.java | 11 ++ .../dms/mapper/DmsRecordShutDownMapper.java | 11 ++ .../service/IDmsRecordShutDownService.java | 9 ++ .../impl/DmsRecordShutDownServiceImpl.java | 25 +++++ .../mapper/dms/DmsRecordShutDownMapper.xml | 16 ++- 11 files changed, 372 insertions(+), 6 deletions(-) diff --git a/aucma-base/src/main/java/com/aucma/base/controller/BaseOrderInfoController.java b/aucma-base/src/main/java/com/aucma/base/controller/BaseOrderInfoController.java index adabe78..e06a973 100644 --- a/aucma-base/src/main/java/com/aucma/base/controller/BaseOrderInfoController.java +++ b/aucma-base/src/main/java/com/aucma/base/controller/BaseOrderInfoController.java @@ -1,8 +1,11 @@ package com.aucma.base.controller; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletResponse; +import com.aucma.common.annotation.Log; +import com.aucma.common.enums.BusinessType; import com.aucma.common.utils.DateUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -150,9 +153,106 @@ public class BaseOrderInfoController extends BaseController { * 获取正在执行的工单列表 */ @PreAuthorize("@ss.hasPermi('base:orderInfo:list')") - @GetMapping("/running") + @GetMapping("/getRunningOrders") public AjaxResult getRunningOrders() { - return success(baseOrderInfoService.getRunningOrders()); + List orders = baseOrderInfoService.getRunningOrders(); + return AjaxResult.success(orders); + } + + /** + * 批量开始生产 + */ + @PreAuthorize("@ss.hasPermi('base:orderInfo:edit')") + @Log(title = "工单信息", businessType = BusinessType.UPDATE) + @PutMapping("/batchStart") + public AjaxResult batchStartProduction(@RequestBody Map params) { + Long[] objIds = parseObjIds(params.get("objIds")); + String operator = (String) params.get("operator"); + + if (objIds == null || objIds.length == 0) { + return AjaxResult.error("请选择要操作的工单"); + } + if (operator == null || operator.isEmpty()) { + return AjaxResult.error("请输入操作员"); + } + + return toAjax(baseOrderInfoService.batchStartProduction(objIds, operator)); + } + + /** + * 批量更新完工数量 + */ + @PreAuthorize("@ss.hasPermi('base:orderInfo:edit')") + @Log(title = "工单信息", businessType = BusinessType.UPDATE) + @PutMapping("/batchUpdateQty") + public AjaxResult batchUpdateQuantity(@RequestBody Map params) { + Long[] objIds = parseObjIds(params.get("objIds")); + Long completeQty = parseLong(params.get("completeQty")); + Long defectQty = parseLong(params.get("defectQty")); + + if (objIds == null || objIds.length == 0) { + return AjaxResult.error("请选择要操作的工单"); + } + + return toAjax(baseOrderInfoService.batchUpdateQuantity(objIds, completeQty, defectQty)); + } + + /** + * 批量完工提报 + */ + @PreAuthorize("@ss.hasPermi('base:orderInfo:edit')") + @Log(title = "工单信息", businessType = BusinessType.UPDATE) + @PutMapping("/batchComplete") + public AjaxResult batchCompleteProduction(@RequestBody Map params) { + Long[] objIds = parseObjIds(params.get("objIds")); + Long completeQty = parseLong(params.get("completeQty")); + Long defectQty = parseLong(params.get("defectQty")); + + if (objIds == null || objIds.length == 0) { + return AjaxResult.error("请选择要操作的工单"); + } + + return toAjax(baseOrderInfoService.batchCompleteProduction(objIds, completeQty, defectQty)); + } + + /** + * 解析objIds参数 + */ + private Long[] parseObjIds(Object obj) { + if (obj == null) { + return null; + } + if (obj instanceof List) { + List list = (List) obj; + Long[] result = new Long[list.size()]; + for (int i = 0; i < list.size(); i++) { + Object item = list.get(i); + if (item instanceof Number) { + result[i] = ((Number) item).longValue(); + } else { + result[i] = Long.parseLong(item.toString()); + } + } + return result; + } + return null; + } + + /** + * 解析Long类型参数 + */ + private Long parseLong(Object obj) { + if (obj == null) { + return 0L; + } + if (obj instanceof Number) { + return ((Number) obj).longValue(); + } + try { + return Long.parseLong(obj.toString()); + } catch (NumberFormatException e) { + return 0L; + } } /** diff --git a/aucma-base/src/main/java/com/aucma/base/mapper/BaseOrderInfoMapper.java b/aucma-base/src/main/java/com/aucma/base/mapper/BaseOrderInfoMapper.java index 8afddc9..91bdb50 100644 --- a/aucma-base/src/main/java/com/aucma/base/mapper/BaseOrderInfoMapper.java +++ b/aucma-base/src/main/java/com/aucma/base/mapper/BaseOrderInfoMapper.java @@ -66,4 +66,36 @@ public interface BaseOrderInfoMapper { * @return 结果 */ public int deleteBaseOrderInfoByObjIds(Long[] objIds); + + /** + * 批量更新工单执行状态为运行中 + * + * @param objIds 工单ID集合 + * @param operator 操作员 + * @param startTime 开始时间 + * @return 结果 + */ + public int batchStartProduction(Long[] objIds, String operator, java.util.Date startTime); + + /** + * 批量更新完工数量 + * + * @param objIds 工单ID集合 + * @param completeQty 完工数量 + * @param defectQty 不良数量 + * @param updateTime 更新时间 + * @return 结果 + */ + public int batchUpdateQuantity(Long[] objIds, Long completeQty, Long defectQty, java.util.Date updateTime); + + /** + * 批量更新工单为已完工状态 + * + * @param objIds 工单ID集合 + * @param completeQty 完工数量 + * @param defectQty 不良数量 + * @param finishTime 完工时间 + * @return 结果 + */ + public int batchCompleteProduction(Long[] objIds, Long completeQty, Long defectQty, java.util.Date finishTime); } diff --git a/aucma-base/src/main/java/com/aucma/base/service/IBaseOrderInfoService.java b/aucma-base/src/main/java/com/aucma/base/service/IBaseOrderInfoService.java index 94a233c..d224f65 100644 --- a/aucma-base/src/main/java/com/aucma/base/service/IBaseOrderInfoService.java +++ b/aucma-base/src/main/java/com/aucma/base/service/IBaseOrderInfoService.java @@ -118,4 +118,33 @@ public interface IBaseOrderInfoService { * @return 工单信息 */ public BaseOrderInfo getRunningOrderByDevice(String deviceCode); + + /** + * 批量开始生产 + * + * @param objIds 工单ID集合 + * @param operator 操作员 + * @return 结果 + */ + public int batchStartProduction(Long[] objIds, String operator); + + /** + * 批量更新完工数量 + * + * @param objIds 工单ID集合 + * @param completeQty 完工数量 + * @param defectQty 不良数量 + * @return 结果 + */ + public int batchUpdateQuantity(Long[] objIds, Long completeQty, Long defectQty); + + /** + * 批量完工提报 + * + * @param objIds 工单ID集合 + * @param completeQty 完工数量 + * @param defectQty 不良数量 + * @return 结果 + */ + public int batchCompleteProduction(Long[] objIds, Long completeQty, Long defectQty); } diff --git a/aucma-base/src/main/java/com/aucma/base/service/impl/BaseOrderInfoServiceImpl.java b/aucma-base/src/main/java/com/aucma/base/service/impl/BaseOrderInfoServiceImpl.java index 1d8f62d..97c05bf 100644 --- a/aucma-base/src/main/java/com/aucma/base/service/impl/BaseOrderInfoServiceImpl.java +++ b/aucma-base/src/main/java/com/aucma/base/service/impl/BaseOrderInfoServiceImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.aucma.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.aucma.base.mapper.BaseOrderInfoMapper; import com.aucma.base.domain.BaseOrderInfo; import com.aucma.base.service.IBaseOrderInfoService; @@ -182,7 +183,75 @@ public class BaseOrderInfoServiceImpl implements IBaseOrderInfoService { BaseOrderInfo query = new BaseOrderInfo(); query.setDeviceCode(deviceCode); query.setExecutionStatus("RUNNING"); - List list = baseOrderInfoMapper.selectAllOrderInfoList(query); + List list = baseOrderInfoMapper.selectBaseOrderInfoList(query); return list != null && !list.isEmpty() ? list.get(0) : null; } + + /** + * 批量开始生产 + * + * @param objIds 工单ID集合 + * @param operator 操作员 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int batchStartProduction(Long[] objIds, String operator) { + if (objIds == null || objIds.length == 0) { + return 0; + } + if (operator == null || operator.isEmpty()) { + throw new RuntimeException("操作员不能为空"); + } + Date now = DateUtils.getNowDate(); + return baseOrderInfoMapper.batchStartProduction(objIds, operator, now); + } + + /** + * 批量更新完工数量 + * + * @param objIds 工单ID集合 + * @param completeQty 完工数量 + * @param defectQty 不良数量 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int batchUpdateQuantity(Long[] objIds, Long completeQty, Long defectQty) { + if (objIds == null || objIds.length == 0) { + return 0; + } + if (completeQty == null) { + completeQty = 0L; + } + if (defectQty == null) { + defectQty = 0L; + } + Date now = DateUtils.getNowDate(); + return baseOrderInfoMapper.batchUpdateQuantity(objIds, completeQty, defectQty, now); + } + + /** + * 批量完工提报 + * + * @param objIds 工单ID集合 + * @param completeQty 完工数量 + * @param defectQty 不良数量 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int batchCompleteProduction(Long[] objIds, Long completeQty, Long defectQty) { + if (objIds == null || objIds.length == 0) { + return 0; + } + if (completeQty == null) { + completeQty = 0L; + } + if (defectQty == null) { + defectQty = 0L; + } + Date now = DateUtils.getNowDate(); + return baseOrderInfoMapper.batchCompleteProduction(objIds, completeQty, defectQty, now); + } } diff --git a/aucma-base/src/main/resources/mapper/base/BaseOrderInfoMapper.xml b/aucma-base/src/main/resources/mapper/base/BaseOrderInfoMapper.xml index a25184a..04e13da 100644 --- a/aucma-base/src/main/resources/mapper/base/BaseOrderInfoMapper.xml +++ b/aucma-base/src/main/resources/mapper/base/BaseOrderInfoMapper.xml @@ -250,4 +250,42 @@ #{objId} + + + update base_orderinfo + set execution_status = 'RUNNING', + start_time = #{startTime}, + execution_operator = #{operator}, + updated_time = #{startTime} + where obj_id in + + #{objId} + + and (execution_status is null or execution_status = 'PENDING') + + + + update base_orderinfo + set actual_complete_qty = #{completeQty}, + actual_defect_qty = #{defectQty}, + updated_time = #{updateTime} + where obj_id in + + #{objId} + + + + + update base_orderinfo + set execution_status = 'COMPLETED', + actual_complete_qty = #{completeQty}, + actual_defect_qty = #{defectQty}, + finish_time = #{finishTime}, + updated_time = #{finishTime} + where obj_id in + + #{objId} + + and execution_status = 'RUNNING' + \ No newline at end of file diff --git a/aucma-dms/src/main/java/com/aucma/dms/controller/DmsRecordShutDownController.java b/aucma-dms/src/main/java/com/aucma/dms/controller/DmsRecordShutDownController.java index a48d8ba..b7e8562 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/controller/DmsRecordShutDownController.java +++ b/aucma-dms/src/main/java/com/aucma/dms/controller/DmsRecordShutDownController.java @@ -1,8 +1,10 @@ package com.aucma.dms.controller; +import com.aucma.common.annotation.Log; import com.aucma.common.core.controller.BaseController; import com.aucma.common.core.domain.AjaxResult; import com.aucma.common.core.page.TableDataInfo; +import com.aucma.common.enums.BusinessType; import com.aucma.common.utils.poi.ExcelUtil; import com.aucma.dms.domain.DmsRecordShutDown; import com.aucma.dms.service.IDmsRecordShutDownService; @@ -106,4 +108,34 @@ public class DmsRecordShutDownController extends BaseController { return toAjax(dmsRecordShutDownService.deleteDmsRecordShutDownByRecordShutDownIds(recordShutDownIds)); } + + /** + * 查询PDA待处理停机记录列表 + */ + @PreAuthorize("@ss.hasPermi('dms:shutDown:query')") + @GetMapping("/pda/list") + public AjaxResult pdaList() + { + List list = dmsRecordShutDownService.selectPdaShutDownList(); + return AjaxResult.success(list); + } + + /** + * 批量更新停机原因 + */ + @PreAuthorize("@ss.hasPermi('dms:shutDown:edit')") + @Log(title = "停机记录", businessType = BusinessType.UPDATE) + @PutMapping("/batchUpdateReason") + public AjaxResult batchUpdateReason(@RequestBody DmsRecordShutDown dmsRecordShutDown) + { + if (dmsRecordShutDown.getRecordShutDownIds() == null || dmsRecordShutDown.getRecordShutDownIds().length == 0) + { + return AjaxResult.error("请选择要维护的停机记录"); + } + if (dmsRecordShutDown.getShutReasonId() == null) + { + return AjaxResult.error("请选择停机原因"); + } + return toAjax(dmsRecordShutDownService.batchUpdateShutReason(dmsRecordShutDown.getRecordShutDownIds(), dmsRecordShutDown.getShutReasonId())); + } } diff --git a/aucma-dms/src/main/java/com/aucma/dms/domain/DmsRecordShutDown.java b/aucma-dms/src/main/java/com/aucma/dms/domain/DmsRecordShutDown.java index ecea1c1..11d23fc 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/domain/DmsRecordShutDown.java +++ b/aucma-dms/src/main/java/com/aucma/dms/domain/DmsRecordShutDown.java @@ -65,6 +65,17 @@ public class DmsRecordShutDown extends DmsBaseEntity /** 设备名称(查询用,非持久化字段) */ private String deviceName; + /** 批量操作ID数组(非持久化字段) */ + private Long[] recordShutDownIds; + + public Long[] getRecordShutDownIds() { + return recordShutDownIds; + } + + public void setRecordShutDownIds(Long[] recordShutDownIds) { + this.recordShutDownIds = recordShutDownIds; + } + public String getDeviceCode() { return deviceCode; } diff --git a/aucma-dms/src/main/java/com/aucma/dms/mapper/DmsRecordShutDownMapper.java b/aucma-dms/src/main/java/com/aucma/dms/mapper/DmsRecordShutDownMapper.java index 9a0c6ee..83e74d9 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/mapper/DmsRecordShutDownMapper.java +++ b/aucma-dms/src/main/java/com/aucma/dms/mapper/DmsRecordShutDownMapper.java @@ -66,4 +66,15 @@ public interface DmsRecordShutDownMapper * @return 停机记录集合 */ public List selectPdaShutDownList(); + + /** + * 批量更新停机原因 + * + * @param recordShutDownIds 停机记录ID集合 + * @param shutReasonId 停机原因ID + * @param updateBy 更新人 + * @param updateTime 更新时间 + * @return 结果 + */ + public int batchUpdateShutReason(Long[] recordShutDownIds, Long shutReasonId, Long updateBy, java.util.Date updateTime); } diff --git a/aucma-dms/src/main/java/com/aucma/dms/service/IDmsRecordShutDownService.java b/aucma-dms/src/main/java/com/aucma/dms/service/IDmsRecordShutDownService.java index bdbd528..61f51b3 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/service/IDmsRecordShutDownService.java +++ b/aucma-dms/src/main/java/com/aucma/dms/service/IDmsRecordShutDownService.java @@ -66,4 +66,13 @@ public interface IDmsRecordShutDownService * @return 停机记录集合 */ public List selectPdaShutDownList(); + + /** + * 批量更新停机原因 + * + * @param recordShutDownIds 停机记录ID集合 + * @param shutReasonId 停机原因ID + * @return 结果 + */ + public int batchUpdateShutReason(Long[] recordShutDownIds, Long shutReasonId); } diff --git a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsRecordShutDownServiceImpl.java b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsRecordShutDownServiceImpl.java index b9df03d..2704d27 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsRecordShutDownServiceImpl.java +++ b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsRecordShutDownServiceImpl.java @@ -9,6 +9,7 @@ import com.aucma.dms.mapper.DmsRecordShutDownMapper; import com.aucma.dms.service.IDmsRecordShutDownService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -110,4 +111,28 @@ public class DmsRecordShutDownServiceImpl implements IDmsRecordShutDownService{ { return dmsRecordShutDownMapper.selectPdaShutDownList(); } + + /** + * 批量更新停机原因 + * + * @param recordShutDownIds 停机记录ID集合 + * @param shutReasonId 停机原因ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int batchUpdateShutReason(Long[] recordShutDownIds, Long shutReasonId) + { + if (recordShutDownIds == null || recordShutDownIds.length == 0) + { + return 0; + } + if (shutReasonId == null) + { + throw new RuntimeException("停机原因不能为空"); + } + + Long updateBy = SecurityUtils.getLoginUser() == null ? SecurityUtils.getUserId() : SecurityUtils.getLoginUser().getUser().getUserId(); + return dmsRecordShutDownMapper.batchUpdateShutReason(recordShutDownIds, shutReasonId, updateBy, DateUtils.getNowDate()); + } } diff --git a/aucma-dms/src/main/resources/mapper/dms/DmsRecordShutDownMapper.xml b/aucma-dms/src/main/resources/mapper/dms/DmsRecordShutDownMapper.xml index 764c0e0..d9aacee 100644 --- a/aucma-dms/src/main/resources/mapper/dms/DmsRecordShutDownMapper.xml +++ b/aucma-dms/src/main/resources/mapper/dms/DmsRecordShutDownMapper.xml @@ -133,11 +133,21 @@ + + update dms_record_shut_down + set shut_reason_id = #{shutReasonId}, + update_by = #{updateBy}, + update_time = #{updateTime} + where record_shut_down_id in + + #{recordShutDownId} + + + delete from dms_record_shut_down