kazelee
2025-05-09 24180a4a19e29ad39ccf61f4b31f03d0f594c99c
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using HH.WCS.Mobox3.DSZSH.Consts;
using HH.WCS.Mobox3.DSZSH.Helpers;
using HH.WCS.Mobox3.DSZSH.Helpers.Model;
using HH.WCS.Mobox3.DSZSH.Models;
 
namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
    /// <summary>
    /// 定时轮询任务:抽检业务核心
    /// </summary>
    public class CheckCore {
        /// <summary>
        /// 轮询查看抽检单是否有执行中的项目
        /// </summary>
        public void CheckOrderState() {
            var db = DbHelper.GetDbClient();
            try {
                var orderList = db.Queryable<TN_Check_Order>()
                    .Where(c => c.N_B_STATE == 0)
                    .OrderBy(c => c.T_CREATE).ToList();
 
                using (var tran = db.Ado.UseTran()) {
                    foreach (var order in orderList) {
                        var startLocList = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
                            ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
                            .Where((l, c, d) => d.S_CG_ID == order.S_CG_ID && d.S_BATCH_NO == order.S_BATCH_NO)
                            .Select((l, c) => new { Location = l, Container = c })
                            .Take(order.N_QTY).ToList(); // 获取指定数量的货位数,随机抽取故无需排序
 
                        if (startLocList.Count < order.N_QTY) {
                            LogHelper.Info($"轮询 | 当前可抽检的物料数量 {startLocList.Count} 无法满足抽检单数量 {order.N_QTY} 要求");
                            return;
                        }
 
                        var endLocList = db.Queryable<TN_Location>()
                            .Where(l => l.S_AREA_CODE == order.S_END_AREA)
                            .Where(ExprHelper.LocIsFree)
                            .Where(ExprHelper.LocIsEmpty)
                            .Take(order.N_QTY).ToList(); // 获取指定数量的货位数
 
                        if (endLocList.Count < order.N_QTY) {
                            LogHelper.Info($"轮询 | 终点区域可用货位 {startLocList.Count} 无法满足抽检单数量 {order.N_QTY} 要求");
                            return;
                        }
 
                        // TODO 参考出库,如果要求任务顺序也要新创建表存储,有需求再更新
                        for (var i = 0; i < order.N_QTY; i++) {
                            if (!TaskHelper.LogCreateTask(startLocList[i].Location.S_CODE, startLocList[i].Container.S_CNTR_CODE,
                                endLocList[i].S_CODE, TaskName.抽检)) {
                                tran.RollbackTran();
                            }
                        }
 
                        order.N_B_STATE = 1;
                        db.Updateable<TN_Check_Order>(endLocList).UpdateColumns(c => c.N_B_STATE);
                        tran.CommitTran();
                    } 
                }
            }
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
            }
        }
    }
}