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 837eaaa9..d0eb5fef 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 @@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; @@ -122,4 +123,56 @@ public class ProdReportController extends BaseController { return R.ok(vos); } + /** + * 报工工时数据报表 + */ + @GetMapping("/workHourReport") + public TableDataInfo workHourReport(@RequestParam(required = false) Map hashMap, PageQuery pageQuery) { + return prodReportService.workHourReportList(hashMap, pageQuery); + } + + /** + * 报工工时数据报表导出 + */ + @PostMapping("/workHourReport/export") + public void workHourReportExport(@RequestParam(required = false) Map hashMap, HttpServletResponse response) { + List list = prodReportService.workHourReportList(hashMap); + ExcelUtil.exportExcel(list, "报工工时数据报表", WorkHourReportVo.class, response); + } + + /** + * 班组作业情况报表 + */ + @GetMapping("/teamWorkReport") + public TableDataInfo teamWorkReport(@RequestParam(required = false) Map hashMap, PageQuery pageQuery) { + return prodReportService.teamWorkReportList(hashMap, pageQuery); + } + + /** + * 班组作业情况报表导出 + */ + @RepeatSubmit() + @PostMapping("/teamWorkReport/export") + public void teamWorkReportExport(@RequestParam(required = false) Map hashMap, HttpServletResponse response) { + List list = prodReportService.teamWorkReportList(hashMap); + ExcelUtil.exportExcel(list, "班组作业情况报表", TeamWorkReportVo.class, response); + } + + /** + * 在制品跟踪报表 + */ + @GetMapping("/wipTrackingReport") + public TableDataInfo wipTrackingReport(@RequestParam(required = false) Map hashMap, PageQuery pageQuery) { + return prodReportService.wipTrackingReportList(hashMap, pageQuery); + } + + /** + * 在制品跟踪报表导出 + */ + @RepeatSubmit() + @PostMapping("/wipTrackingReport/export") + public void wipTrackingReportExport(@RequestParam(required = false) Map hashMap, HttpServletResponse response) { + List list = prodReportService.wipTrackingReportList(hashMap); + ExcelUtil.exportExcel(list, "在制品跟踪报表", WipTrackingReportVo.class, response); + } } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/EquipmentUtilizationReportVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/EquipmentUtilizationReportVo.java new file mode 100644 index 00000000..58c6af58 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/EquipmentUtilizationReportVo.java @@ -0,0 +1,89 @@ +package org.dromara.mes.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 设备利用率报表视图对象 + * + * @author MES + * @date 2025-01-20 + */ +@Data +@ExcelIgnoreUnannotated +public class EquipmentUtilizationReportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 序号 + */ + @ExcelProperty(value = "序号") + private Integer rowNumber; + + /** + * 机台编号 + */ + @ExcelProperty(value = "机台编号") + private String machineCode; + + /** + * 机台名称 + */ + @ExcelProperty(value = "机台名称") + private String machineName; + + /** + * 车间名称 + */ + @ExcelProperty(value = "车间名称") + private String workshopName; + + /** + * 总工作时间(小时) + */ + @ExcelProperty(value = "总工作时间(小时)") + private BigDecimal totalWorkHours; + + /** + * 实际运行时间(小时) + */ + @ExcelProperty(value = "实际运行时间(小时)") + private BigDecimal actualRunHours; + + /** + * 设备利用率(%) + */ + @ExcelProperty(value = "设备利用率(%)") + private BigDecimal utilizationRate; + + /** + * 生产数量 + */ + @ExcelProperty(value = "生产数量") + private BigDecimal productionAmount; + + /** + * 统计日期 + */ + @ExcelProperty(value = "统计日期") + private Date statisticsDate; + + /** + * 机台状态 + */ + @ExcelProperty(value = "机台状态") + private String machineStatus; + + // 非导出字段 + private Long machineId; + private Long workshopId; +} + diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessProgressVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessProgressVo.java new file mode 100644 index 00000000..154bfd84 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/ProcessProgressVo.java @@ -0,0 +1,49 @@ +package org.dromara.mes.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 工序进度VO + * + * @author Yinq + * @date 2025-01-25 + */ +@Data +public class ProcessProgressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 工序ID + */ + private Long processId; + + /** + * 工序名称 + */ + private String processName; + + /** + * 工序顺序 + */ + private Integer processOrder; + + /** + * 工序状态:0未派工 1已派工 2已开始 3已完成 + */ + private String planStatus; + + /** + * 工序状态描述 + */ + private String statusDesc; + + /** + * 是否已完成 + */ + private Boolean isCompleted; +} \ No newline at end of file diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/TeamWorkReportVo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/TeamWorkReportVo.java new file mode 100644 index 00000000..685cb984 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/TeamWorkReportVo.java @@ -0,0 +1,103 @@ +package org.dromara.mes.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 班组作业情况报表VO + * + * @author MES + * @date 2025-01-20 + */ +@Data +@ExcelIgnoreUnannotated +public class TeamWorkReportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 班组名称 + */ + @ExcelProperty(value = "班组") + private String teamName; + + /** + * 工位名称 + */ + @ExcelProperty(value = "工位") + private String stationName; + + /** + * 操作员姓名 + */ + @ExcelProperty(value = "操作员") + private String operatorName; + + /** + * 产品名称 + */ + @ExcelProperty(value = "产品") + private String productName; + + /** + * 工序名称 + */ + @ExcelProperty(value = "工序") + private String processName; + + /** + * 生产数量 + */ + @ExcelProperty(value = "生产数量") + private BigDecimal productionQuantity; + + /** + * 合格数量 + */ + @ExcelProperty(value = "合格数量") + private BigDecimal qualifiedQuantity; + + /** + * 不合格数量 + */ + @ExcelProperty(value = "不合格数量") + private BigDecimal unqualifiedQuantity; + + /** + * 合格率(%) + */ + @ExcelProperty(value = "合格率(%)") + private BigDecimal qualifiedRate; + + /** + * 作业开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date startTime; + + /** + * 作业结束时间 + */ + @ExcelProperty(value = "结束时间") + private Date endTime; + + /** + * 作业时长(h) + */ + @ExcelProperty(value = "作业时长(h)") + private BigDecimal workHours; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + +} \ 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 new file mode 100644 index 00000000..be556ffc --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/vo/WipTrackingReportVo.java @@ -0,0 +1,152 @@ +package org.dromara.mes.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 在制品跟踪报表VO + * + * @author Yinq + * @date 2025-01-25 + */ +@Data +@ExcelIgnoreUnannotated +public class WipTrackingReportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 产品订单ID + */ + private Long productOrderId; + + /** + * 生产订单号 + */ + @ExcelProperty(value = "生产订单号") + private String orderCode; + + /** + * 物料编号 + */ + @ExcelProperty(value = "物料编号") + private String materialCode; + + /** + * 物料名称 + */ + @ExcelProperty(value = "物料名称") + private String materialName; + + /** + * 规格型号 + */ + @ExcelProperty(value = "规格型号") + private String materialSpec; + + /** + * 计划总数量 + */ + @ExcelProperty(value = "计划总数量") + private BigDecimal planAmount; + + /** + * 在制数量 + */ + @ExcelProperty(value = "在制数量") + private BigDecimal wipAmount; + + /** + * 已完成数量 + */ + @ExcelProperty(value = "已完成数量") + private BigDecimal completeAmount; + + /** + * 计划开工时间 + */ + @ExcelProperty(value = "计划开工时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date planBeginTime; + + /** + * 实际开工时间 + */ + @ExcelProperty(value = "实际开工时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date realBeginTime; + + /** + * 计划完工时间 + */ + @ExcelProperty(value = "计划完工时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date planEndTime; + + /** + * 当前时间 + */ + @ExcelProperty(value = "当前时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date currentTime; + + /** + * 总工序数 + */ + @ExcelProperty(value = "总工序数") + private String totalProcessCount; + + /** + * 在制工序 + */ + @ExcelProperty(value = "在制工序") + private String wipProcesses; + + /** + * 剩余工序 + */ + @ExcelProperty(value = "剩余工序") + private String remainingProcesses; + + /** + * 整体进度(%) + */ + @ExcelProperty(value = "整体进度(%)") + private String overallProgress; + + /** + * 进度状态 + */ + @ExcelProperty(value = "进度状态") + private String progressStatus; + + // 以下字段用于计算,不导出到Excel + /** + * 总工序数(数值) + */ + private Integer totalProcessCountNum; + + /** + * 在制工序加权和 + */ + private BigDecimal wipWeightedSum; + + /** + * 整体进度(数值) + */ + private BigDecimal overallProgressNum; + + /** + * 工序进度列表(不导出到Excel) + */ + private List processProgressList; +} \ 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 4e01412a..cb9e23d7 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 @@ -5,6 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo; import org.dromara.mes.domain.vo.PlanCompletionRateReportVo; +import org.dromara.mes.domain.vo.WorkHourReportVo; +import org.dromara.mes.domain.vo.TeamWorkReportVo; +import org.dromara.mes.domain.vo.WipTrackingReportVo; +import org.dromara.mes.domain.vo.ProcessProgressVo; import java.util.HashMap; import java.util.List; @@ -76,4 +80,46 @@ public interface ProdReportMapper { */ List> yieldTrendByDate(@Param("map") Map hashMap); + /** + * 报工工时数据报表(分页) + */ + Page workHourReportList(@Param("map") Map hashMap, @Param("page") Page page, + @Param("detailTableName") String detailTableName, + @Param("planTableName") String planTableName); + + /** + * 报工工时数据报表(导出) + */ + List workHourReportList(@Param("map") Map hashMap, + @Param("detailTableName") String detailTableName, + @Param("planTableName") String planTableName); + + /** + * 班组作业情况报表(分页) + */ + Page teamWorkReportList(@Param("map") Map hashMap, @Param("page") Page page, + @Param("detailTableName") String detailTableName, + @Param("planTableName") String planTableName); + + /** + * 班组作业情况报表(导出) + */ + List teamWorkReportList(@Param("map") Map hashMap, + @Param("detailTableName") String detailTableName, + @Param("planTableName") String planTableName); + + /** + * 在制品跟踪报表(分页) + */ + Page wipTrackingReportList(@Param("map") Map hashMap, @Param("page") Page page); + + /** + * 在制品跟踪报表(导出) + */ + List wipTrackingReportList(@Param("map") Map hashMap); + + /** + * 获取订单的工序进度详情 + */ + List getOrderProcessProgress(@Param("productOrderId") Long productOrderId); } 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 1282caed..eb77c82a 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 @@ -5,6 +5,10 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo; import org.dromara.mes.domain.vo.PlanCompletionRateReportVo; +import org.dromara.mes.domain.vo.WorkHourReportVo; +import org.dromara.mes.domain.vo.TeamWorkReportVo; +import org.dromara.mes.domain.vo.WipTrackingReportVo; +import org.dromara.mes.domain.vo.ProcessProgressVo; import java.util.HashMap; import java.util.List; @@ -71,4 +75,56 @@ public interface IProdReportService { */ List> yieldTrendByDate(Map hashMap); - } + /** + * 报工工时数据报表 + * @param hashMap 查询参数 + * @param pageQuery 分页参数 + * @return 表格数据 + */ + TableDataInfo workHourReportList(Map hashMap, PageQuery pageQuery); + + /** + * 报工工时数据报表导出 + * @param hashMap 查询参数 + * @return 列表数据 + */ + List workHourReportList(Map hashMap); + + /** + * 班组作业情况报表 + * @param hashMap 查询参数 + * @param pageQuery 分页参数 + * @return 表格数据 + */ + TableDataInfo teamWorkReportList(Map hashMap, PageQuery pageQuery); + + /** + * 班组作业情况报表导出 + * @param hashMap 查询参数 + * @return 列表数据 + */ + List teamWorkReportList(Map hashMap); + + /** + * 在制品跟踪报表 + * @param hashMap 查询参数 + * @param pageQuery 分页参数 + * @return 表格数据 + */ + TableDataInfo wipTrackingReportList(Map hashMap, PageQuery pageQuery); + + /** + * 在制品跟踪报表导出 + * @param hashMap 查询参数 + * @return 列表数据 + */ + List wipTrackingReportList(Map hashMap); + + /** + * 获取订单的工序进度详情 + * @param productOrderId 产品订单ID + * @return 工序进度列表 + */ + List getOrderProcessProgress(Long productOrderId); + +} 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 07654f3d..b9bf8933 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 @@ -8,6 +8,10 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo; import org.dromara.mes.domain.vo.PlanCompletionRateReportVo; +import org.dromara.mes.domain.vo.WorkHourReportVo; +import org.dromara.mes.domain.vo.TeamWorkReportVo; +import org.dromara.mes.domain.vo.WipTrackingReportVo; +import org.dromara.mes.domain.vo.ProcessProgressVo; import org.dromara.mes.mapper.ProdReportMapper; import org.dromara.mes.service.IProdReportService; import org.springframework.stereotype.Service; @@ -147,4 +151,84 @@ public class ProdReportServiceImpl implements IProdReportService { return prodReportMapper.yieldTrendByDate(hashMap); } + @Override + public TableDataInfo workHourReportList(Map hashMap, PageQuery pageQuery) { + Long processId = Long.parseLong(String.valueOf(hashMap.get("processId"))); + String detailTable = getPlanDetailTableNameByProcessId(processId); + String planTable = getPlanInfoTableNameByProcessId(processId); + Page page = prodReportMapper.workHourReportList(hashMap, pageQuery.build(), detailTable, planTable); + return TableDataInfo.build(page); + } + + @Override + public List workHourReportList(Map hashMap) { + Long processId = Long.parseLong(String.valueOf(hashMap.get("processId"))); + String detailTable = getPlanDetailTableNameByProcessId(processId); + String planTable = getPlanInfoTableNameByProcessId(processId); + return prodReportMapper.workHourReportList(hashMap, detailTable, planTable); + } + + @Override + public TableDataInfo teamWorkReportList(Map hashMap, PageQuery pageQuery) { + Long processId = Long.parseLong(String.valueOf(hashMap.get("processId"))); + String detailTable = getPlanDetailTableNameByProcessId(processId); + String planTable = getPlanInfoTableNameByProcessId(processId); + Page page = prodReportMapper.teamWorkReportList(hashMap, pageQuery.build(), detailTable, planTable); + return TableDataInfo.build(page); + } + + @Override + public List teamWorkReportList(Map hashMap) { + Long processId = Long.parseLong(String.valueOf(hashMap.get("processId"))); + String detailTable = getPlanDetailTableNameByProcessId(processId); + String planTable = getPlanInfoTableNameByProcessId(processId); + return prodReportMapper.teamWorkReportList(hashMap, detailTable, planTable); + } + + /** + * 在制品跟踪报表(分页) + * @param hashMap 查询参数 + * @param pageQuery 分页参数 + * @return 表格数据 + */ + @Override + public TableDataInfo wipTrackingReportList(Map hashMap, PageQuery pageQuery) { + Page page = prodReportMapper.wipTrackingReportList(hashMap, pageQuery.build()); + // 为每个订单获取工序进度详情 + for (WipTrackingReportVo vo : page.getRecords()) { + if (vo.getProductOrderId() != null) { + List processProgress = prodReportMapper.getOrderProcessProgress(vo.getProductOrderId()); + vo.setProcessProgressList(processProgress); + } + } + return TableDataInfo.build(page); + } + + /** + * 在制品跟踪报表(导出) + * @param hashMap 查询参数 + * @return 列表数据 + */ + @Override + public List wipTrackingReportList(Map hashMap) { + List list = prodReportMapper.wipTrackingReportList(hashMap); + // 为每个订单获取工序进度详情 + for (WipTrackingReportVo vo : list) { + if (vo.getProductOrderId() != null) { + List processProgress = prodReportMapper.getOrderProcessProgress(vo.getProductOrderId()); + vo.setProcessProgressList(processProgress); + } + } + return list; + } + + /** + * 获取订单的工序进度详情 + * @param productOrderId 产品订单ID + * @return 工序进度列表 + */ + @Override + public List getOrderProcessProgress(Long productOrderId) { + return prodReportMapper.getOrderProcessProgress(productOrderId); + } } 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 1bb9e8b7..52eccd03 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 @@ -175,4 +175,198 @@ ORDER BY productionDate + + + + + + + + + +