服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-07-14 394189b16b4e0cb6fec8980c3bef15f2aaf10630
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
using Tiger.Model;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Rhea.Common;
using System.Net;
using System.Linq;
using Newtonsoft.Json;
using Tiger.IBusiness;
using Microsoft.AspNetCore.Http;
using Tiger.Business.MES;
using Org.BouncyCastle.Ocsp;
using Tiger.Model.Entitys.MES.Position;
 
namespace Tiger.Business
{
    public partial class Biz
    {
        /// <summary>
        /// 工单批次
        /// </summary>
        public partial class WorkBatch : IWorkBatch, IDisposable
        {
            public WorkBatch(string order)
            {
                OrderNo = order;
            }
            #region Propertys & Variables
            public string OrderNo { get; set; }
            public BIZ_MES_WO WO { get; set; }
            public BIZ_MES_WO_BATCH Batch { get; set; }
            public BAS_CUSTOMER Customer { get; set; }
            public List<BIZ_MES_WO_SN> WoSNs { get; set; }
            public List<MES_WO_EDGE> Edges { get; set; }
            public List<MES_WO_NODE> Nodes { get; set; }
            public List<MES_WO_OPER> NodeSets { get; set; }
            public List<MES_WO_NODE_ACT> NodeActs { get; set; }
            public List<MES_WO_ACTION> ActionSets { get; set; }
            public List<MES_WO_NODE_POST> NodePosts { get; set; }
            public List<MES_WO_NODE_DFTG> NodeDftgs { get; set; }
            public List<BAS_DEFECT_GRP> DefectGroups { get; set; }
            /// <summary>
            /// 事务锁
            /// </summary>
            public object TransLock { get; }
            #endregion
 
            #region Functions
            /// <summary>
            /// 初始化工单资料
            /// </summary>
            /// <returns></returns>
            public WorkBatch Init(string lineCode)
            {
                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).First();
                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == lineCode 
                                        && (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
                Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();    
                WoSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                Edges = Biz.Db.Queryable<MES_WO_EDGE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                Nodes = Biz.Db.Queryable<MES_WO_NODE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                NodeSets = Biz.Db.Queryable<MES_WO_OPER>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                NodeActs = Biz.Db.Queryable<MES_WO_NODE_ACT>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
                ActionSets = Biz.Db.Queryable<MES_WO_ACTION>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                NodePosts = Biz.Db.Queryable<MES_WO_NODE_POST>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                NodeDftgs = Biz.Db.Queryable<MES_WO_NODE_DFTG>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                DefectGroups = Biz.Db.Queryable<BAS_DEFECT_GRP>().IncludesAllFirstLayer().ToList();
                return this;
            }
 
            /// <summary>
            /// 工单开工
            /// </summary>
            /// <param name="user"></param>
            /// <returns></returns>
            public bool StartWorking(string user)
            {
                if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue() || Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue())
                {
                    WO.STATUS = BIZ_MES_WO.STATUSs.Working.GetValue();
                    WO.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
                    Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Working.GetValue();
                    Batch.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
                    //保存数据库
                    var db = Biz.Db;
                    var dbTran = db.UseTran(() =>
                    {
                        db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
                        db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
                    });
                    if (!dbTran.IsSuccess)
                    {
                        //throw dbTran.ErrorException;
                        return false;
                    }
                }
                return true;
            }
 
            /// <summary>
            /// 根据岗位编码判断是不是首站
            /// </summary>
            /// <param name="postCode"></param>
            /// <returns></returns>
            public bool IsFirstNode(string postCode)
            {
                return Nodes.Any(q => q.IS_FIRST_NODE == "Y" && NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
            }
 
            /// <summary>
            /// 根据岗位编码返回工序节点
            /// </summary>
            /// <param name="postCode"></param>
            /// <returns></returns>
            public MES_WO_NODE GetNode(string postCode)
            {
                return Nodes.FirstOrDefault(q => NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
            }
 
            /// <summary>
            /// 根据岗位编码返回工序不良代码
            /// </summary>
            /// <param name="postCode"></param>
            /// <returns></returns>
            public List<DefectOutput> GetNodeDefects(string postCode)
            {
                var result = new List<DefectOutput>();
                var groups = DefectGroups.Where((b, s) => NodeDftgs.Any(d => d.NODE_ID == GetNode(postCode).ID && d.DFTG_CODE == b.DFTG_CODE)).ToList();
                foreach (var group in groups)
                {
                    result.AddRange(group.Defects.Select(q => new DefectOutput { 
                        DFTG_CODE = q.DFTG_CODE,
                        DFTG_NAME = group.DFTG_NAME,
                        DFT_CODE = q.DFT_CODE,
                        DFT_NAME = q.DFT_NAME,
                        DFT_LEVEL = q.DFT_LEVEL,
                    }));
                }
                return result;
            }
 
            #endregion
 
            /// <summary>
            /// 关闭工单
            /// </summary>
            /// <returns></returns>
            public bool Close()
            {
                Dispose();
                return true;
            }
            public virtual void Dispose()
            {
                WoContext.WoBatchDic.Remove(OrderNo);
            }
        }
    }
}