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 { /// /// 【组盘】的业务处理类 /// public class SalverMaterialBindBLL { /// /// 组盘 /// /// /// /// /// /// /// public static MessageModel SalverMaterialBind( bool isValidate1015ScanValue, bool isBtj, C_Task_InStoreSlaverParam Task_InStoreSlaver, C_AnalyzeMaterialPostParam request, string userName, int userId, string inStoreNo ) { MessageModel result = new MessageModel(); 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.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 NewV_TaskMain = await _V_TaskMain.Query(a => a.SerialNumber == request.SerialNumber); List 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.Fail("入库任务已存在该序列号的任务"); return result; } else { //List storeList = await v_StoreServices.Query(a => a.SerialNumber == request.SerialNumber); List storeList = context.V_Store.Where(a => a.SerialNumber == request.SerialNumber).ToList(); if (storeList != null && storeList.Count > 0) { result = MessageModel.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.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.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.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.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.Fail("新增主任务失败"); // return result; //} //锁定站点 sourcePlace.IsLock = true; sourcePlace.IsHasTaskDoing = true; sourcePlace.OperationRemark = "创建入库任务,锁定库位"; //await base_StationServices.Update(sourcePlace); context.SaveChanges(); result = MessageModel.Success("成功"); return result; } } catch (System.Exception ex) { throw ex; } finally { //if (result.success) //{ // _unitOfWork.CommitTran(); //} //else //{ // _unitOfWork.RollbackTran(); //} } } /// /// 生成最新的任务序列号 /// 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; } } }