From a4dceb819c53c5d6b07c7dd7f1c8e7a389988801 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Tue, 14 Oct 2025 09:55:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E6=96=B0=E5=A2=9E=E5=B7=A5?= =?UTF-8?q?=E5=BA=8F=E5=B7=A5=E5=8D=95=E7=BB=9F=E8=AE=A1=E4=B8=8E=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增工序工单统计分页接口(按工序聚合) - 新增工序工单统计导出接口(按工序聚合) - 新增按工序查询计划列表接口(不分页) - 扩展统计SQL支持多表union查询与复杂条件过滤 - 新增ProcessWorkOrderStatsVo用于导出数据封装 -优化统计逻辑支持按processId聚合及完成率计算 - 增加物料编码查询条件支持 - 提供完整的分页与导出功能实现- 支持按计划开始时间、工序、设备、班次等多维度查询 - 实现工序生产统计总数查询用于分页处理 --- .../mes/controller/ProdReportController.java | 29 +- .../domain/vo/ProcessWorkOrderStatsVo.java | 30 + .../mes/domain/vo/WipTrackingReportVo.java | 15 + .../dromara/mes/mapper/ProdReportMapper.java | 19 + .../mes/service/IProdReportService.java | 22 + .../service/impl/ProdReportServiceImpl.java | 74 ++ .../resources/mapper/mes/ProdReportMapper.xml | 182 ++++- .../mapper/mes/ProdReportMapper.xml.bak | 734 ++++++++++++++++++ 8 files changed, 1097 insertions(+), 8 deletions(-) create mode 100644 ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessWorkOrderStatsVo.java create mode 100644 ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml.bak diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdReportController.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdReportController.java index 437a37c6..52fa6024 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdReportController.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdReportController.java @@ -202,7 +202,25 @@ public class ProdReportController extends BaseController { } /** - * 工序下的计划子节点查询:按 plan_code + process_id 过滤,关联明细表 + * 工序工单统计(分页,按工序聚合) + */ + @GetMapping("/processWorkOrderStats/page") + public TableDataInfo> processWorkOrderStatsPage(@RequestParam(required = false) Map hashMap, PageQuery pageQuery) { + return prodReportService.processWorkOrderStatsPage(hashMap, pageQuery); + } + + /** + * 工序工单统计导出(按工序聚合) + */ + @RepeatSubmit() + @PostMapping("/processWorkOrderStats/export") + public void processWorkOrderStatsExport(@RequestParam(required = false) Map hashMap, HttpServletResponse response) { + List list = prodReportService.processWorkOrderStatsExport(hashMap); + ExcelUtil.exportExcel(list, "工序生产统计", ProcessWorkOrderStatsVo.class, response); + } + + /** + * 工序下的计划子节点查询:按 plan_code + process_id 过滤 */ @GetMapping("/planProcessChildren") public R>> planProcessChildren(@RequestParam(required = false) Map hashMap) { @@ -210,4 +228,13 @@ public class ProdReportController extends BaseController { return R.ok(vos); } + /** + * 按工序查询计划列表(不分页) + */ + @GetMapping("/processPlanList") + public R>> processPlanList(@RequestParam(required = false) Map hashMap) { + List> list = prodReportService.listPlansByProcess(hashMap); + return R.ok(list); + } + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessWorkOrderStatsVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessWorkOrderStatsVo.java new file mode 100644 index 00000000..6abd8a1f --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessWorkOrderStatsVo.java @@ -0,0 +1,30 @@ +package org.dromara.mes.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 工序生产统计导出VO(按工序聚合) + */ +@Data +public class ProcessWorkOrderStatsVo { + @ExcelProperty("工序ID") + private Long processId; + + @ExcelProperty("工序名称") + private String processName; + + @ExcelProperty("计划数量") + private BigDecimal planQty; + + @ExcelProperty("已完成数量") + private BigDecimal completedQty; + + @ExcelProperty("未完成数量") + private BigDecimal uncompletedQty; + + @ExcelProperty("完成率%") + private BigDecimal completionRateNum; +} \ No newline at end of file diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/WipTrackingReportVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/WipTrackingReportVo.java index f1ef39e7..8c762813 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/WipTrackingReportVo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/WipTrackingReportVo.java @@ -28,12 +28,19 @@ public class WipTrackingReportVo implements Serializable { * 产品订单ID */ private Long productOrderId; + private String planCode; /** * 租户ID(用于批量查询工序进度的租户过滤) */ private Long tenantId; + /** + * 派工单号 + */ + @ExcelProperty(value = "派工单号") + private String dispatchCode; + /** * 生产订单号 */ @@ -154,4 +161,12 @@ public class WipTrackingReportVo implements Serializable { * 工序进度列表(不导出到Excel) */ private List processProgressList; + + // public String getPlanCode() { + // return planCode; + // } + + // public void setPlanCode(String planCode) { + // this.planCode = planCode; + // } } \ No newline at end of file diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/ProdReportMapper.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/ProdReportMapper.java index 88376a8a..37c57974 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/ProdReportMapper.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/mapper/ProdReportMapper.java @@ -132,6 +132,19 @@ public interface ProdReportMapper { @Param("planTableName") String planTableName, @Param("tenantId") String tenantId); + /** + * 工序生产统计(分页,按 processId 聚合) + */ + Page> processWorkOrderStatsPage(@Param("map") Map hashMap, + @Param("page") Page> page, + @Param("planTableName") String planTableName); + + /** + * 工序生产统计总数(按 processId 聚合) + */ + Long processWorkOrderStatsCount(@Param("map") Map hashMap, + @Param("planTableName") String planTableName); + /** * 获取计划的工序进度详情(单计划,按planCode) */ @@ -160,4 +173,10 @@ public interface ProdReportMapper { */ List> processWorkOrderStats(@Param("map") Map hashMap, @Param("planTableName") String planTableName); + + /** + * 按工序查询计划列表(不分页) + */ + List> listPlansByProcess(@Param("map") Map hashMap, + @Param("planTableName") String planTableName); } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdReportService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdReportService.java index 4f03c98f..8cd989cc 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdReportService.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdReportService.java @@ -143,6 +143,21 @@ public interface IProdReportService { */ List> processWorkOrderStats(Map hashMap); + /** + * 工序工单统计(分页,按工序聚合) + * @param hashMap 查询条件 + * @param pageQuery 分页参数 + * @return 表格数据 + */ + TableDataInfo> processWorkOrderStatsPage(Map hashMap, PageQuery pageQuery); + + /** + * 工序工单统计导出(按工序聚合) + * @param hashMap 查询条件 + * @return 导出列表 + */ + List processWorkOrderStatsExport(Map hashMap); + /** * 工序下的计划子节点查询:按 plan_code + process_id 过滤,关联明细表 * @param hashMap 查询条件:planCode、processId @@ -150,4 +165,11 @@ public interface IProdReportService { */ List> planProcessDetailChildren(Map hashMap); + /** + * 按工序查询计划列表(不分页) + * @param hashMap 查询条件:beginDate/endDate、processId、machineId、shiftId、classTeamId、planCode、materialName、materialCode + * @return 计划列表 + */ + List> listPlansByProcess(Map hashMap); + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdReportServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdReportServiceImpl.java index 5586c5b3..e6b49310 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdReportServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdReportServiceImpl.java @@ -625,9 +625,83 @@ public class ProdReportServiceImpl implements IProdReportService { */ @Override public List> processWorkOrderStats(Map hashMap) { + try { + String tenantId = org.dromara.common.satoken.utils.LoginHelper.getTenantId(); + if (tenantId != null && !tenantId.isEmpty()) { + hashMap.put("tenantId", tenantId); + } + } catch (Exception ignore) {} Long processId = parseProcessId(hashMap.get("processId")); String planTable = getPlanInfoTableNameByProcessId(processId); return prodReportMapper.processWorkOrderStats(hashMap, planTable); } + /** + * 工序工单统计(分页,按工序聚合) + */ + @Override + public TableDataInfo> processWorkOrderStatsPage(Map hashMap, PageQuery pageQuery) { + try { + String tenantId = org.dromara.common.satoken.utils.LoginHelper.getTenantId(); + if (tenantId != null && !tenantId.isEmpty()) { + hashMap.put("tenantId", tenantId); + } + } catch (Exception ignore) {} + Long processId = parseProcessId(hashMap.get("processId")); + String planTable = getPlanInfoTableNameByProcessId(processId); + Page> mpPage = pageQuery.build(); + // 复杂聚合SQL,手动count更稳妥 + mpPage.setSearchCount(false); + Page> page = prodReportMapper.processWorkOrderStatsPage(hashMap, mpPage, planTable); + try { + Long total = prodReportMapper.processWorkOrderStatsCount(hashMap, planTable); + if (total != null) { + page.setTotal(total); + } + } catch (Exception ignore) { + } + return TableDataInfo.build(page); + } + + /** + * 工序工单统计导出(按工序聚合) + */ + @Override + public List processWorkOrderStatsExport(Map hashMap) { + Long processId = parseProcessId(hashMap.get("processId")); + String planTable = getPlanInfoTableNameByProcessId(processId); + List> rows = prodReportMapper.processWorkOrderStats(hashMap, planTable); + List list = new ArrayList<>(); + for (HashMap r : rows) { + ProcessWorkOrderStatsVo vo = new ProcessWorkOrderStatsVo(); + vo.setProcessId(asLong(r.get("processId"))); + vo.setProcessName(String.valueOf(r.get("processName"))); + vo.setPlanQty(asBigDecimal(r.get("planQty"))); + vo.setCompletedQty(asBigDecimal(r.get("completedQty"))); + vo.setUncompletedQty(asBigDecimal(r.get("uncompletedQty"))); + vo.setCompletionRateNum(asBigDecimal(r.get("completionRateNum"))); + list.add(vo); + } + return list; + } + + private Long asLong(Object o) { + if (o == null) return null; + try { return Long.parseLong(String.valueOf(o)); } catch (Exception e) { return null; } + } + private BigDecimal asBigDecimal(Object o) { + if (o == null) return BigDecimal.ZERO; + try { return new BigDecimal(String.valueOf(o)); } catch (Exception e) { return BigDecimal.ZERO; } + } + + /** + * 按工序查询计划列表(不分页) + */ + @Override + public List> listPlansByProcess(Map hashMap) { + Long processId = parseProcessId(hashMap.get("processId")); + String planTable = getPlanInfoTableNameByProcessId(processId); + return prodReportMapper.listPlansByProcess(hashMap, planTable); + } + } diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml index b7e77067..59042678 100644 --- a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml @@ -1,4 +1,4 @@ - + @@ -702,16 +702,15 @@ ORDER BY productionDate, DATEPART(HOUR, t.create_time) - + + + + + + + + + + diff --git a/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml.bak b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml.bak new file mode 100644 index 00000000..c5e78133 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/resources/mapper/mes/ProdReportMapper.xml.bak @@ -0,0 +1,734 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +