222
schangxiang@126.com
2024-12-14 3eabfd8dfa2574efbe8ce8d4a64862c16ad04823
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
using iWareCC.WCF;
using iWareCommon.Utils;
using iWareModel;
using iWareModel.Entity;
using iWareSql.DataAccess;
using iWareSql.DBModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using XiGang.Core.Model;
using XiGang.Core.Model.PostParamModels;
using XiGang.Core.Model.PostParamModels.Task;
using static System.Windows.Forms.AxHost;
 
namespace iWareCC.BLL
{
    /// <summary>
    /// 【组盘】的业务处理类
    /// </summary>
    public class SalverMaterialBindBLL
    {
        /// <summary>
        /// 组盘
        /// </summary>
        /// <param name="_unitOfWork"></param>
        /// <param name="request"></param>
        /// <param name="user"></param>
        /// <param name="material"></param>
        /// <param name="salver"></param>
        /// <returns></returns>
        public static MessageModel<string> SalverMaterialBind(
            bool isValidate1015ScanValue,
            bool isBtj,
            C_Task_InStoreSlaverParam Task_InStoreSlaver, C_AnalyzeMaterialPostParam request,
            string userName, int userId, string inStoreNo
           )
        {
            MessageModel<string> result = new MessageModel<string>();
            var errMsg = "";
            try
            {
                using (DbModel context = new DbModel())
                {
 
                    #region 生成最新的序列号 【Eidtby shaocx,2023-02-21】
                    string taskSequenceGuid = "";
                    int taskSequence = 0;
                    if (isValidate1015ScanValue)
                    {
                        TaskSequenceEntity taskSequenceEntity = MyGenerateTaskSequence(context);
                        taskSequence = taskSequenceEntity.TaskSequence;
                        taskSequenceGuid = taskSequenceEntity.TaskSequenceGuid;
                    }
                    else
                    {
                        taskSequenceGuid = Guid.NewGuid().ToString();
                    }
                    #endregion
 
                    //验证1015站点是否有库存存在!
                    //var existStores = context.V_AllStore.Where(x => x.RgvStationCode == "1015").ToList();
                    var existStores = context.V_AllStore.Where(x => x.RgvStationCode == inStoreNo).ToList();
                    if (existStores != null && existStores.Count > 0)
                    {
                        result = MessageModel<string>.Fail($"入库口{inStoreNo}已经有库存存在!托盘号:" + existStores[0].SalverCode + ",序列号:" + existStores[0].SerialNumber);
                        return result;
                    }
 
 
                    //_unitOfWork.BeginTran();
 
                    //1、寻找空库位
 
                    Task_Main mainTask = new Task_Main();
                    mainTask.IsVirtual = false;//非虚拟入库
                    mainTask.IsBtj = isBtj;
                    if (isBtj)
                    {
                        mainTask.IsBtjReceive = true;
                        mainTask.BtjReceiveTime = DateTime.Now;
                    }
 
                    //mainTask.TaskSequence = await GenerateTaskSequence();//生成最新的任务序列号
                    mainTask.TaskSequence = taskSequence;//生成最新的任务序列号
                    mainTask.TaskSequenceGuid = taskSequenceGuid;
 
                    if (request == null)
                    {
                        mainTask.TaskNo = Task_InStoreSlaver.TaskNo;
                    }
                    else
                    {
                        //阻止出现两次重复扫码组盘的情况
                        //List<V_TaskMain> NewV_TaskMain = await _V_TaskMain.Query(a => a.SerialNumber == request.SerialNumber);
                        List<V_TaskMain> NewV_TaskMain = context.V_TaskMain.Where(a => a.SerialNumber == request.SerialNumber).ToList();
                        foreach (var item in NewV_TaskMain)
                        {
                            if (item.TaskState != (int)MainTaskStatusEnum.已完成 && item.TaskState != (int)MainTaskStatusEnum.已取消)
                            {
                                result = MessageModel<string>.Fail("入库任务已存在该序列号的任务");
                                return result;
                            }
                            else
                            {
                                //List<V_Store> storeList = await v_StoreServices.Query(a => a.SerialNumber == request.SerialNumber);
                                List<V_Store> storeList = context.V_Store.Where(a => a.SerialNumber == request.SerialNumber).ToList();
                                if (storeList != null && storeList.Count > 0)
                                {
                                    result = MessageModel<string>.Fail($"序列号{request.SerialNumber}已经在立体库中,库位号{storeList[0].SrmStationCode}");
                                    return result;
                                }
                            }
                        }
                        mainTask.TaskNo = TaskNoHelper.GenerateTaskNo("IN");
                    }
                    mainTask.TaskName = "入库";
 
                    mainTask.InOutFlag = (int)MainInOutFlagEnum.入库;
                    mainTask.InOutFlagName = MainInOutFlagEnum.入库.ToString();
 
                    //先模拟写死
                    //暂时读取本项目的,以后要改为调用服务的 !!!!
                    //起点,写死
                    //var sourcePlaceList = await base_StationServices.Query(x => x.RgvStationCode == ((int)RgvLocation.入库口1015).ToString());
                    var sourcePlaceList = context.Base_Station.Where(x => x.RgvStationCode == inStoreNo).ToList();
                    if (sourcePlaceList == null || sourcePlaceList.Count == 0)
                    {
                        result = MessageModel<string>.Fail($"没有找到RGV站点{inStoreNo}的站点基础数据");
                        return result;
                    }
                    var sourcePlace = sourcePlaceList[0];
 
                    //判断起点是否有任务被占用
                    //var validateStationIsAllowUseResult = await base_StationServices.ValidateStationIsAllowUse(sourcePlace.Id, task_PartServices);
                    var validateStationIsAllowUseResult = StationHandler.ValidateStationIsAllowUse(sourcePlace.Id, context);
                    if (validateStationIsAllowUseResult.data == false)
                    {
                        result = MessageModel<string>.Fail(validateStationIsAllowUseResult.msg);
                        return result;
                    }
                    mainTask.SourcePlace = sourcePlace.Id;
                    mainTask.RealSourcePlace = sourcePlace.RgvStationCode;
 
 
                    Base_Material newMaterial = null;
                    Base_Salver salver = null;
                    if (request == null)
                    {
                        //增加空托
                        //newMaterial = await base_MaterialServices.CreateEmptySlaverMaterial(Task_InStoreSlaver.Qty, "入库时,新建空托", user);
                        //salver = await base_SalverServices.CreateVirtualSalver("入库时,新建空托", user);
                        newMaterial = MaterialHandler.CreateEmptySlaverMaterial(context, "入库时,新建空托", Task_InStoreSlaver.Qty);
                        salver = SalverHandler.CreateVirtualSalver(context, "入库时,新建空托");
                    }
                    else
                    {
                        //增加物料
                        //首先去判断该物料是否存在
                        //var existMaterialResult = await base_MaterialServices.GetMaterialBySerialNumber(request.SerialNumber, false);
                        var existMaterialResult = MaterialHandler.GetMaterialBySerialNumber(context, request.SerialNumber, false);
                        if (existMaterialResult.success == false)
                        {
                            result = MessageModel<string>.Fail(existMaterialResult.msg);
                            return result;
                        }
                        else
                        {
                            newMaterial = existMaterialResult.data;
                        }
                        if (newMaterial == null)
                        {
                            //newMaterial = await base_MaterialServices.CreateCargoMaterial("入库时,新建物料", request, user);
                            newMaterial = MaterialHandler.CreateCargoMaterial(context, request, "入库时,新建物料", request.SerialNumber, request.OrderNo);
 
                            //如果是新物料,并且是没有主机厂、机型、系列字段,则需要重新使用服务获取下
                            if (string.IsNullOrEmpty(request.Supplier) || request.items_ModelNumber == null)
                            {
                                mainTask.IsUpdateMatFinish = false;
                                mainTask.UpdateMatFinishTime = DateTime.Now;
                                mainTask.UpdateMatFinishNum = 0;
                            }
                            else
                            {
                                mainTask.IsUpdateMatFinish = true;
                                mainTask.UpdateMatFinishTime = DateTime.Now;
                                mainTask.UpdateMatFinishNum = 0;
                            }
                        }
 
                        //判断托盘是否存在,如果存在,就不需要重建,如果不存在,就新建托盘
                        //var salverResult = await base_SalverServices.GetSalveByCodeForInTask(request.SalverCode, user, base_Salver_V_StationServices, base_Salver_V_MaterialServices);
                        var salverResult = SalverHandler.GetSalveByCodeForInTask(context, request.SalverCode, out errMsg);
                        if (!string.IsNullOrEmpty(errMsg))
                        {
                            result = MessageModel<string>.Fail(errMsg);
                            return result;
                        }
                        salver = salverResult;
                    }
 
 
                    mainTask.MaterialId = newMaterial.Id;
                    mainTask.SerialNumber = newMaterial.SerialNumber;
                    mainTask.OrderNo = newMaterial.OrderNo;
                    mainTask.SalverId = salver.Id;
                    mainTask.SalverCode = salver.SalverCode;
 
                    //物料信息
                    //XiGangCommonHelper.SetMaterialForMainTask(ref mainTask, newMaterial);
                    MainTaskHandler.SetMaterialForMainTask(ref mainTask, newMaterial);
 
 
                    ////绑定托盘和物料的关系
                    //await base_Salver_V_MaterialServices.CreateCvIRelation(userName, salver, newMaterial, "入库时,新建绑定托盘和物料的关系");
                    ////绑定托盘和站点的关系
                    //await base_Salver_V_StationServices.CreateCvPRelation(userName, salver, sourcePlace, Salver_V_Station_StateEnum.入库绑定, "入库时,新建绑定托盘和站点的关系");
                    //绑定托盘和物料的关系
                    Salver_Material_Handler.CreateCvIRelation(context, userName, salver, newMaterial, "入库时,新建绑定托盘和物料的关系");
                    //绑定托盘和站点的关系
                    Salver_Station_Handler.CreateCvPRelation(context, userName, salver, sourcePlace, Salver_V_Station_StateEnum.入库绑定, "入库时,新建绑定托盘和站点的关系");
 
                    ////
 
                    var _taskType = MainTaskTypeEnum.自动入库;
                    mainTask.TaskType = Convert.ToInt32(_taskType);
                    mainTask.TaskTypeName = _taskType.ToString();
                    var _taskState = MainTaskStatusEnum.已组盘;
                    mainTask.TaskState = Convert.ToInt32(_taskState);
                    mainTask.TaskStateName = _taskState.ToString();
 
 
                    mainTask.CreateTime = mainTask.ModifyTime = mainTask.StartTime = DateTime.Now;
                    mainTask.CreateBy = mainTask.ModifyBy = userName;
                    mainTask.CreateId = mainTask.ModifyId = userId;
                    mainTask.OperationRemark = "添加";
 
                    //int mainTaskId = await _dal.Add(mainTask);
                    context.Task_Main.Add(mainTask);
                    //if (mainTaskId <= 0)
                    //{
                    //    result = MessageModel<string>.Fail("新增主任务失败");
                    //    return result;
                    //}
 
                    //锁定站点
 
                    sourcePlace.IsLock = true;
                    sourcePlace.IsHasTaskDoing = true;
                    sourcePlace.OperationRemark = "创建入库任务,锁定库位";
                    //await base_StationServices.Update(sourcePlace);
 
                    context.SaveChanges();
 
 
                    result = MessageModel<string>.Success("成功");
                    return result;
 
                }
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                //if (result.success)
                //{
                //    _unitOfWork.CommitTran();
                //}
                //else
                //{
                //    _unitOfWork.RollbackTran();
                //}
            }
        }
 
 
        /// <summary>
        /// 生成最新的任务序列号
        /// </summary>
        private static TaskSequenceEntity MyGenerateTaskSequence(DbModel edm)
        {
            TaskSequenceEntity entity = new TaskSequenceEntity();
            entity = MainTaskHandler.GetTaskSequenceEntity(edm);
            if (entity == null)
            {
                throw new Exception("生成最新的任务序列号失败");
            }
            if (entity.TaskSequence == 0)
            {
                throw new Exception("生成最新的任务序列号为0");
            }
            return entity;
        }
    }
}