kazelee
2025-05-15 1af49bdb3cdaa44a7e44ebdc843fb8180596365f
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
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.Models;
 
namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
    /// <summary>
    /// 移库业务核心
    /// </summary>
    internal class ShiftCore {
        public static void CheckOrderState() {
            var db = DbHelper.GetDbClient();
 
            // 目前按出库的逻辑:逐个移库
            try {
                var order = db.Queryable<TN_Shift_Order>()
                    .Where(c => c.N_B_STATE == SpotStateCode.已执行待生成任务)
                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc).First();
 
                if (order == null) {
                    LogHelper.Info("轮询:暂无待执行的移库单");
                    return;
                }
 
                if (db.Queryable<TN_Shift_Detail>()
                    .First(d => d.S_NO == order.S_NO && d.N_B_STATE == SpotStateCode.任务执行中) != null) {
                    LogHelper.Debug("轮询:上一个移库任务仍在进行中");
                    return;
                }
 
                var detail = db.Queryable<TN_Shift_Detail>()
                    .Where(d => d.S_NO == order.S_NO && d.N_B_STATE == SpotStateCode.已执行待生成任务)
                    .OrderBy(d => d.T_CREATE, SqlSugar.OrderByType.Asc).First();
 
                if (detail == null) {
                    //order.N_B_STATE = SpotStateCode.任务执行中;
 
                    LogHelper.Info("轮询移库:暂无待执行的任务");
                    return;
                }
 
                var startLocCntrRel = db.Queryable<TN_Loc_Container>()
                    .Where(c => c.S_CNTR_CODE == detail.S_CNTR_CODE)
                    .First();
 
                if (startLocCntrRel == null) {
                    LogHelper.Info("轮询:移库:没有找到合适的起点货位");
                    return;
                }
 
                var endLoc = db.Queryable<TN_Location>()
                    .Where(l => l.S_AREA_CODE == detail.S_END_AREA)
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty).First();
 
                if (endLoc == null) {
                    LogHelper.Info("轮询:出库:没有找到合适的终点货位");
                    return;
                }
 
                using (var tran = db.Ado.UseTran()) {
                    detail.N_B_STATE = SpotStateCode.任务执行中;
                    if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:出库:更新失败:修改明细表状态为完成");
                    }
 
                    if (TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE,
                        endLoc.S_CODE, TaskName.成品胶出库)) {
                        tran.CommitTran();
                    }
                    else {
                        tran.RollbackTran();
                    }
                }
            }
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
            }
        }
 
        public static void UpdateTaskState(int spotStateCode) {
            var db = DbHelper.GetDbClient();
 
            var detail = db.Queryable<TN_Shift_Detail>()
                .First(d => d.N_B_STATE == SpotStateCode.任务执行中);
 
            if (detail == null) {
                LogHelper.Info("当前没有执行中的移库单明细项目");
                return;
            }
 
            using (var tran = db.Ado.UseTran()) {
                detail.N_B_STATE = spotStateCode;
                db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand();
 
                if (db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 2) ==
                    db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO)) {
 
                    if (db.Updateable<TN_Shift_Order>().SetColumns(it => it.N_B_STATE == SpotStateCode.任务执行完成)
                        .Where(it => it.S_NO == detail.S_NO)
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("修改Order状态错误");
                    }
                }
 
                tran.CommitTran();
            }
        }
    }
}