liu
2 天以前 00e4d71bd9d504ed25339595690ebe074146b7e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.mes.dal.mysql.dashboard.MesDashboardMapper">
 
    <!-- ========== 生产维度 ========== -->
 
    <!-- 按状态统计批次数量 -->
    <select id="selectBatchCountGroupByStatus" resultType="java.util.Map">
        SELECT status, COUNT(*) AS count
        FROM mes_pro_batch
        WHERE deleted = 0
        GROUP BY status
    </select>
 
    <!-- 按状态统计袋码数量 -->
    <select id="selectBagCodeCountGroupByStatus" resultType="java.util.Map">
        SELECT status, COUNT(*) AS count
        FROM mes_pro_bag_code
        WHERE deleted = 0
        GROUP BY status
    </select>
 
    <!-- 统计托盘码总数 -->
    <select id="selectPalletTotal" resultType="java.lang.Long">
        SELECT COUNT(*)
        FROM mes_pro_pallet
        WHERE deleted = 0
    </select>
 
    <!-- 统计今日扫码入库袋数(扫码成功事件数量之和) -->
    <select id="selectTodayInboundBagCount" resultType="java.lang.Long">
        SELECT IFNULL(ROUND(SUM(quantity)), 0)
        FROM mes_pro_scan_event
        WHERE status = 'SUCCESS'
          AND event_time &gt;= #{beginTime}
    </select>
 
    <!-- 按天聚合新增批次数 -->
    <select id="selectDailyBatchCount" resultType="java.util.Map">
        SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date, COUNT(*) AS count
        FROM mes_pro_batch
        WHERE deleted = 0
          AND create_time &gt;= #{beginTime}
          <if test="endTime != null">
              AND create_time &lt; #{endTime}
          </if>
        GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
        ORDER BY date
    </select>
 
    <!-- 按天聚合新增袋码数 -->
    <select id="selectDailyBagCodeCount" resultType="java.util.Map">
        SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date, COUNT(*) AS count
        FROM mes_pro_bag_code
        WHERE deleted = 0
          AND create_time &gt;= #{beginTime}
          <if test="endTime != null">
              AND create_time &lt; #{endTime}
          </if>
        GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
        ORDER BY date
    </select>
 
    <!-- 按天聚合新增托盘码数 -->
    <select id="selectDailyPalletCount" resultType="java.util.Map">
        SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date, COUNT(*) AS count
        FROM mes_pro_pallet
        WHERE deleted = 0
          AND create_time &gt;= #{beginTime}
          <if test="endTime != null">
              AND create_time &lt; #{endTime}
          </if>
        GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
        ORDER BY date
    </select>
 
    <!-- 按天聚合扫码入库袋数(扫码成功事件数量之和) -->
    <select id="selectDailyInboundBagQuantity" resultType="java.util.Map">
        SELECT DATE_FORMAT(event_time, '%Y-%m-%d') AS date,
               IFNULL(SUM(quantity), 0)              AS quantity
        FROM mes_pro_scan_event
        WHERE status = 'SUCCESS'
          AND event_time &gt;= #{beginTime}
          <if test="endTime != null">
              AND event_time &lt; #{endTime}
          </if>
        GROUP BY DATE_FORMAT(event_time, '%Y-%m-%d')
        ORDER BY date
    </select>
 
    <!-- ========== 质检维度 ========== -->
 
    <!-- 按检验结果统计数量(0处理中 1合格 2不合格) -->
    <select id="selectQualityCountGroupByResult" resultType="java.util.Map">
        SELECT result, COUNT(*) AS count
        FROM mes_qc_seed_quality
        WHERE deleted = 0
        GROUP BY result
    </select>
 
    <!-- 指标均值与合格率(值落在标准区间 [min_value, max_value] 内视为合格) -->
    <select id="selectIndicatorStatistics" resultType="java.util.Map">
        SELECT indicator_code,
               COUNT(*)                                                                        AS checkCount,
               ROUND(AVG(value), 6)                                                           AS averageValue,
               IFNULL(ROUND(SUM(CASE WHEN value &gt;= min_value AND value &lt;= max_value THEN 1 ELSE 0 END)
                            / COUNT(*) * 100, 2), 0)                                          AS passRate
        FROM mes_qc_seed_quality_indicator
        WHERE deleted = 0
        GROUP BY indicator_code
        ORDER BY indicator_code
    </select>
 
    <!-- ========== 库存维度 ========== -->
 
    <!-- 按库存状态汇总数量(10暂存库 20合格库 30已出库) -->
    <select id="selectStockGroupByState" resultType="java.util.Map">
        SELECT IFNULL(stock_state, -1) AS stockState,
               IFNULL(SUM(quantity), 0) AS quantity
        FROM mes_wm_material_stock
        WHERE deleted = 0
        GROUP BY stock_state
    </select>
 
    <!-- 按仓库汇总数量 -->
    <select id="selectStockGroupByWarehouse" resultType="java.util.Map">
        SELECT IFNULL(w.name, '未知仓库') AS name,
               IFNULL(SUM(s.quantity), 0) AS quantity
        FROM mes_wm_material_stock s
                 LEFT JOIN mes_wm_warehouse w ON w.id = s.warehouse_id AND w.deleted = 0
        WHERE s.deleted = 0
        GROUP BY s.warehouse_id
        ORDER BY quantity DESC
    </select>
 
    <!-- 按品种汇总数量 -->
    <select id="selectStockGroupByItem" resultType="java.util.Map">
        SELECT IFNULL(i.name, '未知品种') AS name,
               IFNULL(SUM(s.quantity), 0) AS quantity
        FROM mes_wm_material_stock s
                 LEFT JOIN mes_md_item i ON i.id = s.item_id AND i.deleted = 0
        WHERE s.deleted = 0
        GROUP BY s.item_id
        ORDER BY quantity DESC
    </select>
 
    <!-- ========== 出库维度 ========== -->
 
    <!-- 出库汇总(单数/总量/今日出库量) -->
    <select id="selectOutboundSummary" resultType="java.util.Map">
        SELECT COUNT(DISTINCT s.id)                    AS orderTotal,
               IFNULL(SUM(l.quantity), 0)              AS quantityTotal,
               IFNULL(SUM(CASE WHEN s.sales_date &gt;= #{beginTime} THEN l.quantity ELSE 0 END), 0) AS todayQuantity
        FROM mes_wm_product_sales s
                 LEFT JOIN mes_wm_product_sales_line l ON l.sales_id = s.id AND l.deleted = 0
        WHERE s.deleted = 0
    </select>
 
    <!-- 按天聚合出库量 -->
    <select id="selectOutboundDailyQuantity" resultType="java.util.Map">
        SELECT DATE_FORMAT(s.sales_date, '%Y-%m-%d') AS date,
               IFNULL(SUM(l.quantity), 0)              AS quantity
        FROM mes_wm_product_sales s
                 LEFT JOIN mes_wm_product_sales_line l ON l.sales_id = s.id AND l.deleted = 0
        WHERE s.deleted = 0
          AND s.sales_date &gt;= #{beginTime}
          <if test="endTime != null">
              AND s.sales_date &lt; #{endTime}
          </if>
        GROUP BY DATE_FORMAT(s.sales_date, '%Y-%m-%d')
        ORDER BY date
    </select>
 
    <!-- 按经销商汇总出库量(TOP 20) -->
    <select id="selectOutboundGroupByClient" resultType="java.util.Map">
        SELECT COALESCE(NULLIF(c.name, ''), CONCAT('经销商#', s.client_id), CONCAT('客户ID:', s.client_id)) AS name,
               IFNULL(SUM(l.quantity), 0) AS quantity
        FROM mes_wm_product_sales s
                 LEFT JOIN mes_wm_product_sales_line l ON l.sales_id = s.id AND l.deleted = 0
                 LEFT JOIN crm_customer c ON c.id = s.client_id AND c.deleted = 0
        WHERE s.deleted = 0
        GROUP BY s.client_id, c.name
        ORDER BY quantity DESC
        LIMIT 20
    </select>
 
</mapper>