Tjiny
2025-05-19 4c8b2eea64bcd0ae14602a2a6e993b2d04c80ee0
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
using System;
using System.Collections.Generic;
using System.Linq;
using HH.WCS.Mobox3.RiDong.dto;
using HH.WCS.Mobox3.RiDong.generalMethod;
using HH.WCS.Mobox3.RiDong.models;
using HH.WCS.Mobox3.RiDong.util;
using HH.WCS.Mobox3.RiDong.wms;
 
namespace HH.WCS.Mobox3.RiDong.apiMethod;
 
/// <summary>
/// 入库流程方法类
/// </summary>
public static class EnterWareHouseService
{
    /// <summary>
    /// 组盘
    /// </summary>
    /// <param name="input">组盘模型</param>
    /// <returns></returns>
    public static ApiModel.SimpleResult SetDisk(SetDiskDto input)
    {
        var result = new ApiModel.SimpleResult();
 
        var sqlSugarClient = AdoSqlMethod<object>.QuerySqlSugarClient();
 
        var container = ContainerHelper.GetCntr(input.cntrCode, input.type);
 
        // 托盘不可用
        if (container.C_ENABLE == 'N')
        {
            result.resultCode = -1;
            result.resultMsg = "当前托盘不可用";
            return result;
        }
 
        // 判断该托盘是否存在容器货品货位数据(即判断容器是否在库里)
        if (AdoSqlMethod<LocCntrRel>.QueryCount(p => p.S_CNTR_CODE == input.cntrCode) > 0)
        {
            result.resultCode = -1;
            result.resultMsg = "当前托盘已存在立库,请勿重复入库";
            return result;
        }
 
        try
        {
            sqlSugarClient.BeginTran();
 
            List<CntrItemDetail> cntrItemDetails = new List<CntrItemDetail>();
 
            foreach (var inputSetDiskDetailDto in input.SetDiskDetailDtos)
            {
                // 查找该托盘的该规格(物料编码)是否存在数据
                var containerGood = AdoSqlMethod<CntrItemDetail>
                    .QueryFirst(p => p.S_CNTR_CODE == input.cntrCode && p.S_ITEM_CODE == inputSetDiskDetailDto.specifications);
 
                // 存在该条容器货品数据
                if (containerGood != null)
                {
                    containerGood.F_QTY = inputSetDiskDetailDto.number;
                    AdoSqlMethod<CntrItemDetail>.UpdateFirstTran(sqlSugarClient, containerGood, p => new { p.F_QTY });
                }
                // 不存在该条容器货品数据
                else
                {
                    // 新增容器货品数据
                    containerGood = new CntrItemDetail()
                    {
                        S_CNTR_CODE = input.cntrCode,
                        S_ITEM_CODE = inputSetDiskDetailDto.specifications,
                        F_QTY = inputSetDiskDetailDto.number,
                        S_UOM = "台",
                        S_BS_NO = inputSetDiskDetailDto.od,
                        S_BATCH_NO = inputSetDiskDetailDto.lot,
                        S_ITEM_NAME = inputSetDiskDetailDto.itemname,
                        S_ITEM_SPEC = inputSetDiskDetailDto.itemspec,
                        D_PRD_DATE = DateTime.Now.ToString("yyyy-MM-dd"),
                        S_ADDRESS_CODE = input.address,
                        S_EXT_ATTR3 = input.islastbox,
                        S_EXT_ATTR2 = inputSetDiskDetailDto.color,
                        S_EXT_ATTR4 = inputSetDiskDetailDto.customer,
                        S_EXT_ATTR1 = inputSetDiskDetailDto.type,
                    };
 
                    cntrItemDetails.Add(containerGood);
                }
            }
 
            AdoSqlMethod<CntrItemDetail>.AddListTran(sqlSugarClient, cntrItemDetails);
 
            // 修改容器状态
            container.C_ENABLE = 'N';
            container.S_TYPE = input.type;
            container.T_MODIFY = DateTime.Now;
            container.N_DETAIL_COUNT = cntrItemDetails.Count;
            AdoSqlMethod<Container>.UpdateFirstTran(sqlSugarClient, container, p => new { p.C_ENABLE, p.T_MODIFY, p.N_DETAIL_COUNT, p.S_TYPE });
 
            sqlSugarClient.CommitTran();
 
            result.resultCode = 1;
            result.resultMsg = "码盘成功";
        }
        catch (Exception e)
        {
            sqlSugarClient.RollbackTran();
            result.resultCode = -1;
            result.resultMsg = "码盘失败";
            LogHelper.Info(e.Message, "出入库流程记录");
        }
        return result;
    }
 
    /// <summary>
    /// 小车任务完成
    /// </summary>
    /// <param name="task"></param>
    /// <returns></returns>
    public static void CarTaskFinished(Task task)
    {
        var db = new SqlHelper<object>().GetInstance();
 
        // 修改容器货品明细数据
        var cntrItemDetails = db.Queryable<CntrItemDetail>().Where(p => p.S_CNTR_CODE == task.S_CNTR_CODE).ToList();
 
        // 入库
        if (task.N_TYPE == 1 || task.N_TYPE == 3)
        {
            List<string> cntrs = new List<string>();
 
            cntrs.Add(task.S_CNTR_CODE);
 
            // 仓库管理,货位管理
            LocationHelper.BindingLoc(task.S_END_LOC, cntrs);
 
            if (task.N_TYPE == 1)
            {
                // 仓库管理
                ContainerHelper.Enable(task.S_CNTR_CODE, task.S_END_LOC);
            }
            else if (task.N_TYPE == 3)
            {
                var container = AdoSqlMethod<Container>.QueryFirst(p => p.S_CODE == task.S_CNTR_CODE);
 
                container.C_ENABLE = 'Y';
                container.N_LOCK_STATE = 0;
                AdoSqlMethod<Container>.UpdateFirst(container,
                    p => new { p.C_ENABLE, p.T_MODIFY, p.N_LOCK_STATE });
            }
 
            foreach (var cntrItemDetail in cntrItemDetails)
            {
                cntrItemDetail.N_ALR_ENTR = 2;
                cntrItemDetail.T_INBOUND_TIME = DateTime.Now;
            }
 
            db.Updateable(cntrItemDetails).UpdateColumns(p => new { p.N_ALR_ENTR, p.T_INBOUND_TIME }).ExecuteCommand();
        }
        // 出库
        else if (task.N_TYPE == 2 || task.N_TYPE == 4 || task.N_TYPE == 6)
        {
            // 货位解锁
            LocationHelper.UnBindingLoc(task.S_START_LOC, new List<string> { task.S_CNTR_CODE });
 
            foreach (var cntrItemDetail in cntrItemDetails)
            {
                cntrItemDetail.N_ALR_ENTR = 1;
            }
 
            db.Updateable(cntrItemDetails).UpdateColumns(p => new { p.N_ALR_ENTR }).ExecuteCommand();
 
            if (task.S_OP_NAME == "整托出库" && task.N_TYPE != 4)
            {
                // 结果确定,根据当前任务号找到对应的配盘明细数据
                var tnDistributionCntrDetails = AdoSqlMethod<TN_Distribution_CNTR_Detail>.QueryList(p => p.S_CNTR_CODE == task.S_CNTR_CODE && p.IS_SORTING == "N");
 
                var resultDeterminationDto = new ResultDeterminationDto();
 
                resultDeterminationDto.cntrCode = task.S_CNTR_CODE;
                resultDeterminationDto.ids = tnDistributionCntrDetails.Select(p => p.S_ID).ToList();
 
                OutWareHouseService.ResultDetermination(resultDeterminationDto);
            }
        }
        // 指引出库
        else if (task.N_TYPE == 5)
        {
            // 货位解锁
            LocationHelper.UnBindingLoc(task.S_START_LOC, new List<string> { task.S_CNTR_CODE });
 
            foreach (var cntrItemDetail in cntrItemDetails)
            {
                cntrItemDetail.N_ALR_ENTR = 1;
            }
            
            db.Updateable(cntrItemDetails).UpdateColumns(p => new { p.N_ALR_ENTR }).ExecuteCommand();
 
            OutWareHouseService.ResultDeterminationGuideOut(task);
        }
        // 指引出库
        else if (task.N_TYPE == 7)
        {
            // 货位解锁
            LocationHelper.UnBindingLoc(task.S_START_LOC, new List<string> { task.S_CNTR_CODE });
            
            db.Updateable(cntrItemDetails).UpdateColumns(p => new { p.N_ALR_ENTR }).ExecuteCommand();
            
            var container = AdoSqlMethod<Container>.QueryFirst(p => p.S_CODE == task.S_CNTR_CODE);
            
            container.C_ENABLE = 'Y';
            container.N_DETAIL_COUNT = 0;
            
            AdoSqlMethod<Container>.UpdateFirst(container, p => new { p.C_ENABLE, p.N_DETAIL_COUNT });
        }
    }
 
    /// <summary>
    /// 货位解锁
    /// </summary>
    /// <param name="task"></param>
    public static void LocationUnlock(Task task)
    {
        var queryFirst = AdoSqlMethod<Location>.QueryFirst(p => p.S_CODE == task.S_START_LOC);
 
        queryFirst.N_LOCK_STATE = 0;
        queryFirst.S_LOCK_STATE = "无锁";
        queryFirst.N_CURRENT_NUM = 0;
 
        AdoSqlMethod<Location>.UpdateFirst(queryFirst, p => new { p.S_LOCK_STATE, p.N_LOCK_STATE });
    }
}