feat(WmsReportMapper): 优化退库原因分析报表查询逻辑

- 调整退库原因分类规则,未匹配到预设原因时直接显示原始原因
- 增加退库数量和金额占比计算时的空值判断,避免除零异常
- 统一各分析接口参数命名,补充缺失的 materialCategoryId 参数
- 移除库存预警状态中冗余的安全库存判断条件
master
zangch@mesnac.com 3 months ago
parent ad16b86caa
commit d7c53d2bd8

@ -0,0 +1,126 @@
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.time.LocalDateTime;
/**
* VO
*
* @author Yinq
* @date 2025-09-25
*/
@Data
@ExcelIgnoreUnannotated
public class WipTrackingReportExportVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "生产订单号", index = 0)
private String orderCode;
/**
*
*/
@ExcelProperty(value = "物料编号", index = 1)
private String materialCode;
/**
*
*/
@ExcelProperty(value = "物料名称", index = 2)
private String materialName;
/**
*
*/
@ExcelProperty(value = "规格型号", index = 3)
private String materialSpec;
/**
*
*/
@ExcelProperty(value = "计划总数量", index = 4)
private BigDecimal planAmount;
/**
*
*/
@ExcelProperty(value = "在制数量", index = 5)
private BigDecimal wipAmount;
/**
*
*/
@ExcelProperty(value = "已完成数量", index = 6)
private BigDecimal completeAmount;
/**
*
*/
@ExcelProperty(value = "计划开工时间", index = 7)
private LocalDateTime planBeginTime;
/**
*
*/
@ExcelProperty(value = "实际开工时间", index = 8)
private LocalDateTime realBeginTime;
/**
*
*/
@ExcelProperty(value = "计划完工时间", index = 9)
private LocalDateTime planEndTime;
/**
*
*/
@ExcelProperty(value = "当前时间", index = 10)
private LocalDateTime currentTime;
/**
*
*/
@ExcelProperty(value = "总工序数", index = 11)
private String totalProcessCount;
/**
*
*/
@ExcelProperty(value = "在制工序", index = 12)
private String wipProcesses;
/**
*
*/
@ExcelProperty(value = "剩余工序", index = 13)
private String remainingProcesses;
/**
* %
*/
@ExcelProperty(value = "整体进度(%", index = 14)
private String overallProgress;
/**
*
*/
@ExcelProperty(value = "进度状态", index = 15)
private String progressStatus;
/**
*
*/
@ExcelProperty(value = "工序进度详情", index = 16)
private String processProgressDetail;
}

@ -0,0 +1,31 @@
package org.dromara.qms.domain.vo.report;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class IqcEfficiencyReportVo {
private String inspectionNo;
private String purchaseOrderNo;
private String inspectionDate; // yyyy-MM-dd
private String inspectionStartTime;
private String inspectionEndTime;
private String materialCode;
private String materialName;
private String materialSpec;
private String materialUnit;
private String supplierName;
private BigDecimal inspectionQty;
private BigDecimal qualifiedQty;
private BigDecimal unqualifiedQty;
private String inspectionResult;
private String inspectionTypeName;
private String inspectorName;
private String items; // 聚合的质检项目
private String methods; // 聚合的检验方法
private String unqualifiedItems; // 聚合的不合格项item_nameproblem_detail
private String returnReason; // 退货原因(当评审为退货时)
private String unqualifiedSummary; // 不合格项与退货原因合并后的展示
private String remark;
}

@ -18,46 +18,54 @@ import java.util.List;
@Mapper
public interface WmsReportMapper {
/**
* 退
*/
/**
* 退
*/
@Select("SELECT " +
" ro.tenant_id AS tenantId, " +
" CASE " +
" WHEN ro.return_reason LIKE '%质量%' OR ro.return_reason LIKE '%不合格%' THEN '质量问题' " +
" WHEN ro.return_reason LIKE '%订单%' OR ro.return_reason LIKE '%变更%' THEN '订单变更' " +
" WHEN ro.return_reason LIKE '%损坏%' OR ro.return_reason LIKE '%破损%' THEN '物料损坏' " +
" WHEN ro.return_reason LIKE '%过期%' OR ro.return_reason LIKE '%超期%' THEN '过期物料' " +
" ELSE '其他原因' " +
" END AS returnReasonCategory, " +
" COUNT(*) AS returnOrderCount, " +
" SUM(ro.return_amount) AS totalReturnAmount, " +
" CAST(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') AS DECIMAL(10,2)) AS orderCountRatio, " +
" CAST(SUM(ro.return_amount) * 100.0 / (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') AS DECIMAL(10,2)) AS amountRatio, " +
" mi.material_name AS materialName, " +
" mc.material_category_name AS materialCategoryName, " +
" mi.material_code AS materialCode " +
"FROM wms_return_order ro " +
"INNER JOIN base_material_info_copy1 mi ON ro.material_id = mi.material_id " +
"INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id " +
"WHERE ro.order_status = '1' " +
" AND (#{tenantId} IS NULL OR ro.tenant_id = #{tenantId}) " +
" AND (#{materialCategoryId} IS NULL OR mc.material_category_id = #{materialCategoryId}) " +
"GROUP BY ro.tenant_id, " +
" CASE " +
" WHEN ro.return_reason LIKE '%质量%' OR ro.return_reason LIKE '%不合格%' THEN '质量问题' " +
" WHEN ro.return_reason LIKE '%订单%' OR ro.return_reason LIKE '%变更%' THEN '订单变更' " +
" WHEN ro.return_reason LIKE '%损坏%' OR ro.return_reason LIKE '%破损%' THEN '物料损坏' " +
" WHEN ro.return_reason LIKE '%过期%' OR ro.return_reason LIKE '%超期%' THEN '过期物料' " +
" ELSE '其他原因' " +
" END, " +
" mi.material_name, " +
" mc.material_category_name, " +
" mi.material_code " +
"ORDER BY ro.tenant_id, totalReturnAmount DESC")
List<WmsReturnReasonAnalysisVo> selectReturnReasonAnalysis(@Param("tenantId") String tenantId,
" ro.tenant_id AS tenantId, " +
" CASE " +
" WHEN ro.return_reason LIKE '%质量%' OR ro.return_reason LIKE '%不合格%' THEN '质量问题' " +
" WHEN ro.return_reason LIKE '%订单%' OR ro.return_reason LIKE '%变更%' THEN '订单变更' " +
" WHEN ro.return_reason LIKE '%损坏%' OR ro.return_reason LIKE '%破损%' THEN '物料损坏' " +
" WHEN ro.return_reason LIKE '%过期%' OR ro.return_reason LIKE '%超期%' THEN '过期物料' " +
" ELSE ro.return_reason " +
" END AS returnReasonCategory, " +
" COUNT(*) AS returnOrderCount, " +
" SUM(ro.return_amount) AS totalReturnAmount, " +
" CAST(CASE " +
" WHEN (SELECT COUNT(*) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') = 0 THEN 0 " +
" ELSE COUNT(*) * 100.0 / (SELECT COUNT(*) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') " +
" END AS DECIMAL(10,2)) AS orderCountRatio, " +
" CAST(CASE " +
" WHEN (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') = 0 OR (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') IS NULL THEN 0 " +
" ELSE SUM(ro.return_amount) * 100.0 / (SELECT SUM(return_amount) FROM wms_return_order WHERE tenant_id = ro.tenant_id AND order_status = '1') " +
" END AS DECIMAL(10,2)) AS amountRatio, " +
" mi.material_name AS materialName, " +
" mc.material_category_name AS materialCategoryName, " +
" mi.material_code AS materialCode " +
"FROM wms_return_order ro " +
"INNER JOIN base_material_info_copy1 mi ON ro.material_id = mi.material_id " +
"INNER JOIN base_material_category mc ON mi.material_category_id = mc.material_category_id " +
"WHERE ro.order_status = '1' " +
" AND (#{tenantId} IS NULL OR ro.tenant_id = #{tenantId}) " +
" AND (#{materialCategoryId} IS NULL OR mc.material_category_id = #{materialCategoryId}) " +
"GROUP BY ro.tenant_id, " +
" CASE " +
" WHEN ro.return_reason LIKE '%质量%' OR ro.return_reason LIKE '%不合格%' THEN '质量问题' " +
" WHEN ro.return_reason LIKE '%订单%' OR ro.return_reason LIKE '%变更%' THEN '订单变更' " +
" WHEN ro.return_reason LIKE '%损坏%' OR ro.return_reason LIKE '%破损%' THEN '物料损坏' " +
" WHEN ro.return_reason LIKE '%过期%' OR ro.return_reason LIKE '%超期%' THEN '过期物料' " +
" ELSE ro.return_reason " +
" END, " +
" mi.material_name, " +
" mc.material_category_name, " +
" mi.material_code " +
"ORDER BY ro.tenant_id, totalReturnAmount DESC")
List<WmsReturnReasonAnalysisVo> selectReturnReasonAnalysis(@Param("tenantId") String tenantId,
@Param("materialCategoryId") Long materialCategoryId);
/**
*
*/
@ -99,7 +107,7 @@ public interface WmsReportMapper {
"GROUP BY inv.tenant_id, inv.material_id, mi.material_code, mi.material_name, mc.material_category_name, " +
" instock_data.weekInstockQty, outstock_data.weekOutstockQty " +
"ORDER BY inv.tenant_id, currentInventoryQty DESC")
List<WmsInventoryTrendAnalysisVo> selectInventoryTrendAnalysis(@Param("tenantId") String tenantId,
List<WmsInventoryTrendAnalysisVo> selectInventoryTrendAnalysis(@Param("tenantId") String tenantId,
@Param("materialCategoryId") Long materialCategoryId);
/**
@ -118,7 +126,6 @@ public interface WmsReportMapper {
" CASE " +
" WHEN SUM(inv.inventory_qty) < mi.min_stock_amount THEN '短缺预警' " +
" WHEN SUM(inv.inventory_qty) > mi.max_stock_amount THEN '积压预警' " +
" WHEN SUM(inv.inventory_qty) < mi.safe_stock_amount THEN '低于安全库存' " +
" ELSE '正常' " +
" END AS alertStatus, " +
" CASE " +
@ -142,7 +149,7 @@ public interface WmsReportMapper {
" OR SUM(inv.inventory_qty) < mi.min_stock_amount " +
" OR SUM(inv.inventory_qty) > mi.max_stock_amount " +
"ORDER BY inv.tenant_id, alertStatus, differenceAmount DESC")
List<WmsSafetyStockAlertVo> selectSafetyStockAlert(@Param("tenantId") String tenantId,
List<WmsSafetyStockAlertVo> selectSafetyStockAlert(@Param("tenantId") String tenantId,
@Param("materialCategoryId") Long materialCategoryId);
/**
@ -219,7 +226,7 @@ public interface WmsReportMapper {
" w.warehouse_name, " +
" first_in.firstInstockTime " +
"ORDER BY inv.tenant_id, stagnantDays DESC, stagnantInventoryQty DESC")
List<WmsStagnantInventoryVo> selectStagnantInventory(@Param("tenantId") String tenantId,
List<WmsStagnantInventoryVo> selectStagnantInventory(@Param("tenantId") String tenantId,
@Param("materialCategoryId") Long materialCategoryId);
/**
@ -270,7 +277,7 @@ public interface WmsReportMapper {
" AND (#{tenantId} IS NULL OR ic.tenant_id = #{tenantId}) " +
" AND (#{materialCategoryId} IS NULL OR mc.material_category_id = #{materialCategoryId}) " +
"ORDER BY ic.tenant_id, ic.check_code, differenceRate DESC")
List<WmsInventoryDifferenceVo> selectInventoryDifference(@Param("tenantId") String tenantId,
List<WmsInventoryDifferenceVo> selectInventoryDifference(@Param("tenantId") String tenantId,
@Param("materialCategoryId") Long materialCategoryId);
/**
@ -336,6 +343,6 @@ public interface WmsReportMapper {
") base_data " +
"WHERE base_data.beginInventoryQty > 0 OR base_data.endInventoryQty > 0 OR base_data.monthOutstockQty > 0 " +
"ORDER BY base_data.tenantId, inventoryTurnoverRate DESC")
List<WmsInventoryTurnoverVo> selectInventoryTurnover(@Param("tenantId") String tenantId,
List<WmsInventoryTurnoverVo> selectInventoryTurnover(@Param("tenantId") String tenantId,
@Param("materialCategoryId") Long materialCategoryId);
}
}

Loading…
Cancel
Save