feat(mes): 新增报工工时、班组作业、在制品跟踪等报表功能

新增以下报表功能:
- wipTrackingReport在制品跟踪报表
- reportWorkHour报工工时数据表
- reportTeamWork报工数据表

同时新增相关 VO 类:WorkHourReportVo、TeamWorkReportVo、
WipTrackingReportVo、ProcessProgressVo 用于支撑上述报表功能。
Mapper 层增加对应查询方法及 XML 实现,Controller 增加接口并支持
Excel 导出和防重复提交。
hwmom-htk
zangch@mesnac.com 4 months ago
parent cdd8502c11
commit 0a75b0a6b4

@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.excel.utils.ExcelUtil; 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.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
@ -122,4 +123,56 @@ public class ProdReportController extends BaseController {
return R.ok(vos); return R.ok(vos);
} }
/**
*
*/
@GetMapping("/workHourReport")
public TableDataInfo<WorkHourReportVo> 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<WorkHourReportVo> list = prodReportService.workHourReportList(hashMap);
ExcelUtil.exportExcel(list, "报工工时数据报表", WorkHourReportVo.class, response);
}
/**
*
*/
@GetMapping("/teamWorkReport")
public TableDataInfo<TeamWorkReportVo> 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<TeamWorkReportVo> list = prodReportService.teamWorkReportList(hashMap);
ExcelUtil.exportExcel(list, "班组作业情况报表", TeamWorkReportVo.class, response);
}
/**
*
*/
@GetMapping("/wipTrackingReport")
public TableDataInfo<WipTrackingReportVo> 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<WipTrackingReportVo> list = prodReportService.wipTrackingReportList(hashMap);
ExcelUtil.exportExcel(list, "在制品跟踪报表", WipTrackingReportVo.class, response);
}
} }

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<ProcessProgressVo> processProgressList;
}

@ -5,6 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo; import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo;
import org.dromara.mes.domain.vo.PlanCompletionRateReportVo; 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.HashMap;
import java.util.List; import java.util.List;
@ -76,4 +80,46 @@ public interface ProdReportMapper {
*/ */
List<HashMap<String, Object>> yieldTrendByDate(@Param("map") Map hashMap); List<HashMap<String, Object>> yieldTrendByDate(@Param("map") Map hashMap);
/**
*
*/
Page<WorkHourReportVo> workHourReportList(@Param("map") Map hashMap, @Param("page") Page<WorkHourReportVo> page,
@Param("detailTableName") String detailTableName,
@Param("planTableName") String planTableName);
/**
*
*/
List<WorkHourReportVo> workHourReportList(@Param("map") Map hashMap,
@Param("detailTableName") String detailTableName,
@Param("planTableName") String planTableName);
/**
*
*/
Page<TeamWorkReportVo> teamWorkReportList(@Param("map") Map hashMap, @Param("page") Page<TeamWorkReportVo> page,
@Param("detailTableName") String detailTableName,
@Param("planTableName") String planTableName);
/**
*
*/
List<TeamWorkReportVo> teamWorkReportList(@Param("map") Map hashMap,
@Param("detailTableName") String detailTableName,
@Param("planTableName") String planTableName);
/**
*
*/
Page<WipTrackingReportVo> wipTrackingReportList(@Param("map") Map hashMap, @Param("page") Page<WipTrackingReportVo> page);
/**
*
*/
List<WipTrackingReportVo> wipTrackingReportList(@Param("map") Map hashMap);
/**
*
*/
List<ProcessProgressVo> getOrderProcessProgress(@Param("productOrderId") Long productOrderId);
} }

@ -5,6 +5,10 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo; import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo;
import org.dromara.mes.domain.vo.PlanCompletionRateReportVo; 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.HashMap;
import java.util.List; import java.util.List;
@ -71,4 +75,56 @@ public interface IProdReportService {
*/ */
List<HashMap<String, Object>> yieldTrendByDate(Map hashMap); List<HashMap<String, Object>> yieldTrendByDate(Map hashMap);
} /**
*
* @param hashMap
* @param pageQuery
* @return
*/
TableDataInfo<WorkHourReportVo> workHourReportList(Map hashMap, PageQuery pageQuery);
/**
*
* @param hashMap
* @return
*/
List<WorkHourReportVo> workHourReportList(Map hashMap);
/**
*
* @param hashMap
* @param pageQuery
* @return
*/
TableDataInfo<TeamWorkReportVo> teamWorkReportList(Map hashMap, PageQuery pageQuery);
/**
*
* @param hashMap
* @return
*/
List<TeamWorkReportVo> teamWorkReportList(Map hashMap);
/**
*
* @param hashMap
* @param pageQuery
* @return
*/
TableDataInfo<WipTrackingReportVo> wipTrackingReportList(Map hashMap, PageQuery pageQuery);
/**
*
* @param hashMap
* @return
*/
List<WipTrackingReportVo> wipTrackingReportList(Map hashMap);
/**
*
* @param productOrderId ID
* @return
*/
List<ProcessProgressVo> getOrderProcessProgress(Long productOrderId);
}

@ -8,6 +8,10 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo; import org.dromara.mes.domain.vo.PlanCompletionContrastReportVo;
import org.dromara.mes.domain.vo.PlanCompletionRateReportVo; 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.mapper.ProdReportMapper;
import org.dromara.mes.service.IProdReportService; import org.dromara.mes.service.IProdReportService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -147,4 +151,84 @@ public class ProdReportServiceImpl implements IProdReportService {
return prodReportMapper.yieldTrendByDate(hashMap); return prodReportMapper.yieldTrendByDate(hashMap);
} }
@Override
public TableDataInfo<WorkHourReportVo> workHourReportList(Map hashMap, PageQuery pageQuery) {
Long processId = Long.parseLong(String.valueOf(hashMap.get("processId")));
String detailTable = getPlanDetailTableNameByProcessId(processId);
String planTable = getPlanInfoTableNameByProcessId(processId);
Page<WorkHourReportVo> page = prodReportMapper.workHourReportList(hashMap, pageQuery.build(), detailTable, planTable);
return TableDataInfo.build(page);
}
@Override
public List<WorkHourReportVo> 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<TeamWorkReportVo> teamWorkReportList(Map hashMap, PageQuery pageQuery) {
Long processId = Long.parseLong(String.valueOf(hashMap.get("processId")));
String detailTable = getPlanDetailTableNameByProcessId(processId);
String planTable = getPlanInfoTableNameByProcessId(processId);
Page<TeamWorkReportVo> page = prodReportMapper.teamWorkReportList(hashMap, pageQuery.build(), detailTable, planTable);
return TableDataInfo.build(page);
}
@Override
public List<TeamWorkReportVo> 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<WipTrackingReportVo> wipTrackingReportList(Map hashMap, PageQuery pageQuery) {
Page<WipTrackingReportVo> page = prodReportMapper.wipTrackingReportList(hashMap, pageQuery.build());
// 为每个订单获取工序进度详情
for (WipTrackingReportVo vo : page.getRecords()) {
if (vo.getProductOrderId() != null) {
List<ProcessProgressVo> processProgress = prodReportMapper.getOrderProcessProgress(vo.getProductOrderId());
vo.setProcessProgressList(processProgress);
}
}
return TableDataInfo.build(page);
}
/**
*
* @param hashMap
* @return
*/
@Override
public List<WipTrackingReportVo> wipTrackingReportList(Map hashMap) {
List<WipTrackingReportVo> list = prodReportMapper.wipTrackingReportList(hashMap);
// 为每个订单获取工序进度详情
for (WipTrackingReportVo vo : list) {
if (vo.getProductOrderId() != null) {
List<ProcessProgressVo> processProgress = prodReportMapper.getOrderProcessProgress(vo.getProductOrderId());
vo.setProcessProgressList(processProgress);
}
}
return list;
}
/**
*
* @param productOrderId ID
* @return
*/
@Override
public List<ProcessProgressVo> getOrderProcessProgress(Long productOrderId) {
return prodReportMapper.getOrderProcessProgress(productOrderId);
}
} }

@ -175,4 +175,198 @@
ORDER BY productionDate ORDER BY productionDate
</select> </select>
<!-- 班组作业情况报表 -->
<select id="teamWorkReportList" resultType="org.dromara.mes.domain.vo.TeamWorkReportVo">
SELECT
bct.team_name AS teamName,
pbsi.station_name AS stationName,
ppd.user_name AS operatorName,
bmi.material_name AS productName,
pproc.process_name AS processName,
CAST(ppd.complete_amount AS DECIMAL(18,4)) AS productionQuantity,
CAST(ISNULL(ppd.ok_amount, 0) AS DECIMAL(18,4)) AS qualifiedQuantity,
CAST(ISNULL(ppd.ng_amount, 0) AS DECIMAL(18,4)) AS unqualifiedQuantity,
CAST(
CASE WHEN ISNULL(ppd.complete_amount,0) > 0
THEN (ISNULL(ppd.ok_amount,0) + 0.0) / (ppd.complete_amount + 0.0) * 100
ELSE NULL END
AS DECIMAL(18,4)
) AS qualifiedRate,
ppd.real_begin_time AS startTime,
ppd.real_end_time AS endTime,
CAST(DATEDIFF(SECOND, ppd.real_begin_time, ppd.real_end_time) / 3600.0 AS DECIMAL(18,4)) AS workHours,
COALESCE(ppd.remark, ppi.remark) AS remark
FROM ${detailTableName} AS ppd
INNER JOIN ${planTableName} AS ppi ON ppi.plan_id = ppd.plan_id
LEFT JOIN base_class_team_info AS bct ON bct.class_team_id = ppd.class_team_id
LEFT JOIN prod_base_station_info AS pbsi ON pbsi.station_id = bct.station_id
LEFT JOIN prod_base_process_info AS pproc ON pproc.process_id = ppi.process_id
LEFT JOIN base_material_info AS bmi ON bmi.material_id = ppi.material_id
<where>
ppd.real_begin_time IS NOT NULL AND ppd.real_end_time IS NOT NULL
<if test="map.beginDate != null and map.beginDate != '' and map.endDate != null and map.endDate != ''">
AND FORMAT(ppd.real_begin_time, 'yyyy-MM-dd') BETWEEN #{map.beginDate} AND #{map.endDate}
</if>
<if test="map.processId != null and map.processId != ''">
AND ppi.process_id = #{map.processId}
</if>
<if test="map.machineId != null and map.machineId != ''">
AND ppi.release_id = #{map.machineId}
</if>
<if test="map.shiftId != null and map.shiftId != ''">
AND ppi.shift_id = #{map.shiftId}
</if>
<if test="map.classTeamId != null and map.classTeamId != ''">
AND ppd.class_team_id = #{map.classTeamId}
</if>
<if test="map.planCode != null and map.planCode != ''">
AND ppi.dispatch_code LIKE CONCAT('%', #{map.planCode}, '%')
</if>
<if test="map.materialName != null and map.materialName != ''">
AND bmi.material_name LIKE CONCAT('%', #{map.materialName}, '%')
</if>
<if test="map.operatorName != null and map.operatorName != ''">
AND ppd.user_name LIKE CONCAT('%', #{map.operatorName}, '%')
</if>
</where>
ORDER BY ppd.real_begin_time DESC, ppi.plan_id DESC
</select>
<select id="workHourReportList" resultType="org.dromara.mes.domain.vo.WorkHourReportVo">
SELECT
ppi.dispatch_code AS dispatchCode,
bct.team_name AS teamName,
pbsi.station_name AS stationName,
bmi.material_name AS materialName,
pproc.process_name AS processName,
CAST(ppd.complete_amount AS DECIMAL(18,4)) AS completeAmount,
CAST(ppd.complete_amount * ISNULL(pproc.production_time, 0) / 3600.0 AS DECIMAL(18,4)) AS standardWorkHour,
CAST(DATEDIFF(SECOND, ppd.real_begin_time, ppd.real_end_time) / 3600.0 AS DECIMAL(18,4)) AS reportWorkHour,
CAST(
CASE
WHEN DATEDIFF(SECOND, ppd.real_begin_time, ppd.real_end_time) > 0
AND ISNULL(pproc.production_time, 0) > 0
THEN (ppd.complete_amount * pproc.production_time + 0.0) / DATEDIFF(SECOND, ppd.real_begin_time, ppd.real_end_time)
ELSE NULL
END
AS DECIMAL(18,4)
) AS productionEfficiency,
ppi.plan_status AS planStatus,
COALESCE(ppd.remark, ppi.remark) AS remark
FROM ${detailTableName} AS ppd
INNER JOIN ${planTableName} AS ppi ON ppi.plan_id = ppd.plan_id
LEFT JOIN base_class_team_info AS bct ON bct.class_team_id = ppd.class_team_id
LEFT JOIN prod_base_station_info AS pbsi ON pbsi.station_id = bct.station_id
LEFT JOIN prod_base_process_info AS pproc ON pproc.process_id = ppi.process_id
LEFT JOIN base_material_info AS bmi ON bmi.material_id = ppi.material_id
<where>
ppd.real_begin_time IS NOT NULL AND ppd.real_end_time IS NOT NULL
<if test="map.beginDate != null and map.beginDate != '' and map.endDate != null and map.endDate != ''">
AND FORMAT(ppd.real_begin_time, 'yyyy-MM-dd') BETWEEN #{map.beginDate} AND #{map.endDate}
</if>
<if test="map.processId != null and map.processId != ''">
AND ppi.process_id = #{map.processId}
</if>
<if test="map.machineId != null and map.machineId != ''">
AND ppi.release_id = #{map.machineId}
</if>
<if test="map.shiftId != null and map.shiftId != ''">
AND ppi.shift_id = #{map.shiftId}
</if>
<if test="map.classTeamId != null and map.classTeamId != ''">
AND ppd.class_team_id = #{map.classTeamId}
</if>
<if test="map.planCode != null and map.planCode != ''">
AND ppi.dispatch_code LIKE CONCAT('%', #{map.planCode}, '%')
</if>
<if test="map.materialName != null and map.materialName != ''">
AND bmi.material_name LIKE CONCAT('%', #{map.materialName}, '%')
</if>
</where>
ORDER BY ppd.real_begin_time DESC, ppi.plan_id DESC
</select>
<!-- 在制品跟踪报表 -->
<select id="wipTrackingReportList" resultType="org.dromara.mes.domain.vo.WipTrackingReportVo">
SELECT
o.product_order_id AS productOrderId,
o.order_code AS orderCode,
m.material_code AS materialCode,
m.material_name AS materialName,
m.material_spec AS materialSpec,
CAST(o.plan_amount AS DECIMAL(18,2)) AS planAmount,
CAST(ISNULL(o.plan_amount,0) - ISNULL(o.complete_amount,0) AS DECIMAL(18,2)) AS wipAmount,
CAST(ISNULL(o.complete_amount,0) AS DECIMAL(18,2)) AS completeAmount,
o.plan_begin_time AS planBeginTime,
o.real_begin_time AS realBeginTime,
o.plan_end_time AS planEndTime,
GETDATE() AS currentTime,
'3道' AS totalProcessCount,
'在制工序' AS wipProcesses,
'剩余工序' AS remainingProcesses,
CONCAT(
CAST(
CASE WHEN o.plan_amount > 0
THEN (CAST(ISNULL(o.complete_amount,0) AS DECIMAL(18,6)) / CAST(o.plan_amount AS DECIMAL(18,6))) * 100
ELSE 0 END
AS DECIMAL(10,2)), '%'
) AS overallProgress,
CASE
WHEN o.plan_end_time IS NOT NULL AND GETDATE() > o.plan_end_time AND ISNULL(o.complete_amount,0) &lt; o.plan_amount
THEN '延期'
ELSE '正常'
END AS progressStatus,
3 AS totalProcessCountNum,
CAST(0 AS DECIMAL(18,2)) AS wipWeightedSum,
CAST(
CASE WHEN o.plan_amount > 0
THEN (CAST(ISNULL(o.complete_amount,0) AS DECIMAL(18,6)) / CAST(o.plan_amount AS DECIMAL(18,6))) * 100
ELSE 0 END
AS DECIMAL(10,2)) AS overallProgressNum
FROM prod_order_info o
JOIN base_material_info m ON m.material_id = o.material_id
<where>
<if test="map.beginDate != null and map.beginDate != '' and map.endDate != null and map.endDate != ''">
AND FORMAT(o.plan_begin_time, 'yyyy-MM-dd') BETWEEN #{map.beginDate} AND #{map.endDate}
</if>
<if test="map.orderCode != null and map.orderCode != ''">
AND o.order_code LIKE CONCAT('%', #{map.orderCode}, '%')
</if>
<if test="map.materialName != null and map.materialName != ''">
AND m.material_name LIKE CONCAT('%', #{map.materialName}, '%')
</if>
<if test="map.materialCode != null and map.materialCode != ''">
AND m.material_code LIKE CONCAT('%', #{map.materialCode}, '%')
</if>
<if test="map.progressStatus != null and map.progressStatus != ''">
AND CASE
WHEN o.plan_end_time IS NOT NULL AND GETDATE() > o.plan_end_time AND ISNULL(o.complete_amount,0) &lt; o.plan_amount
THEN '延期'
ELSE '正常'
END = #{map.progressStatus}
</if>
</where>
ORDER BY o.order_code
</select>
<!-- 获取订单的工序进度详情 -->
<select id="getOrderProcessProgress" resultType="org.dromara.mes.domain.vo.ProcessProgressVo">
SELECT
p.process_id AS processId,
pr.process_name AS processName,
p.process_order AS processOrder,
p.plan_status AS planStatus,
CASE p.plan_status
WHEN '0' THEN '未派工'
WHEN '1' THEN '已派工'
WHEN '2' THEN '进行中'
WHEN '3' THEN '已完成'
ELSE '未知'
END AS statusDesc,
CASE WHEN p.plan_status = '3' THEN 1 ELSE 0 END AS isCompleted
FROM prod_plan_info p
LEFT JOIN prod_base_process_info pr ON pr.process_id = p.process_id
WHERE p.product_order_id = #{productOrderId}
ORDER BY p.process_order
</select>
</mapper> </mapper>

Loading…
Cancel
Save