/* *所有关于VV_ContainerInfo类的业务代码应在此处编写 *可使用repository.调用常用方法,获取EF/Dapper等信息 *如果需要事务请使用repository.DbContextBeginTransaction *也可使用DBServerProvider.手动获取数据库相关信息 *用户信息、权限、角色等使用UserContext.Current操作 *VV_ContainerInfoService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter */ using WIDESEA.Core.BaseProvider; using WIDESEA.Core.Extensions.AutofacManager; using WIDESEA.Entity.DomainModels; using System.Linq; using WIDESEA.Core.Utilities; using System.Linq.Expressions; using WIDESEA.Core.Extensions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Http; using WIDESEA.Services.IRepositories; using System.Collections.Generic; using System; using WIDESEA.Services.Repositories; using WIDESEA.Common.CustomModels; using WIDESEA.Common; using Newtonsoft.Json; using WIDESEA.Services.IServices; using WIDESEA.Common.EquipEnum; using WIDESEA.Core.EFDbContext; using WIDESEA_Common.LogEnum; using WIDESEA.Core.ManageUser; using WIDESEA_Services; using WIDESEA.Core.Services; using System.Text.RegularExpressions; using OfficeOpenXml.FormulaParsing.Excel.Functions.Database; using System.Reflection.Metadata; using NewLife.Reflection; using NPOI.Util.Collections; using WIDESEA.Core.Enums; using System.Reflection; using WIDESEA.Core.Const; namespace WIDESEA.Services.Services { public partial class VV_ContainerInfoService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IVV_ContainerInfoRepository _repository;//访问数据库 [ActivatorUtilitiesConstructor] public VV_ContainerInfoService( IVV_ContainerInfoRepository dbRepository, IHttpContextAccessor httpContextAccessor ) : base(dbRepository) { _httpContextAccessor = httpContextAccessor; _repository = dbRepository; //多租户会用到这init代码,其他情况可以不用2 //base.Init(dbRepository); } public override WebResponseContent Export(PageDataOptions pageData) { return base.Export(pageData); } public override WebResponseContent Update(SaveModel saveModel) { if (null != saveModel.Extra) { string updateType = saveModel.Extra.ToString(); DateTime dateTime = DateTime.Now; string userName = UserContext.Current.UserTrueName; List keys = saveModel.DelKeys.Select(r => Guid.Parse(r.ToString())).ToList(); List containerList = Dt_container_detailRepository.Instance.Find(r => keys.Contains(r.containerdtl_id)); if (containerList.Count == 0) return WebResponseContent.Instance.Error("未找到该数据"); List groupedStats = containerList.GroupBy(item => item.containerdtl_lotNumber).Select(group => group.Key).ToList(); //收货确认 if ("takeGoogsCheck".Equal(updateType)) { foreach (string item in groupedStats) { List contadata = Dt_container_detailRepository.Instance.Find(r => r.containerdtl_lotNumber == item && r.containerdtl_takeGoogsCheck != true); if (containerList.Count == 0) continue; foreach (var cont in contadata) { cont.containerdtl_takeGoogsCheck = true; cont.containerdtl_takeGoogsCheckTime = dateTime; cont.containerdtl_takeGoogsCheckUser = userName; } Dt_container_detailRepository.Instance.UpdateRange(contadata, x => new { x.containerdtl_takeGoogsCheck, x.containerdtl_takeGoogsCheckTime, x.containerdtl_takeGoogsCheckUser }, true); } }//质检确认 else if ("qualityCheck".Equal(updateType)) { foreach (string item in groupedStats) { List contadata = Dt_container_detailRepository.Instance.Find(r => r.containerdtl_lotNumber == item && r.containerdtl_qualityCheck != true); // List contadat = VV_ContainerInfoRepository.Instance.Find(r => r.containerdtl_lotNumber == item && r.containerdtl_qualityCheck != true); if (containerList.Count == 0) continue; foreach (var cont in contadata) { cont.containerdtl_qualityCheck = true; cont.containerdtl_qualityCheckTime = dateTime; cont.containerdtl_qualityCheckUser = userName; } Dt_container_detailRepository.Instance.UpdateRange(contadata, x => new { x.containerdtl_qualityCheck, x.containerdtl_qualityCheckTime, x.containerdtl_qualityCheckUser }, true); } } return WebResponseContent.Instance.OK("确认成功."); } else { //2024年9月4日更新 新增修改测量结果数据 IDt_container_detailRepository detailRepository = Dt_container_detailRepository.Instance; Guid detID = saveModel.MainData["containerdtl_id"].ToGuid(); string testResult = saveModel.MainData["containerdtl_text3"].ToString(); string containerdtl_goodsWeight = saveModel.MainData["containerdtl_goodsWeight"].ToString(); string containerdtl_standardResult = saveModel.MainData["containerdtl_standardResult"].ToString(); Dt_container_detail container_Detail = detailRepository.FindFirst(x => x.containerdtl_id == detID); container_Detail.containerdtl_text3 = testResult; container_Detail.containerdtl_goodsWeight = containerdtl_goodsWeight; container_Detail.containerdtl_standardResult = decimal.Parse(containerdtl_standardResult); detailRepository.Update(container_Detail, true); return WebResponseContent.Instance.OK("修改成功."); } } public override WebResponseContent Del(object[] keys, bool delList = true) { WebResponseContent content = new WebResponseContent(); try { if (keys.Length > 9999) return content.Error("一次最多删除5条库存记录"); content = repository.DbContextBeginTransaction(() => { foreach (var item in keys) { Guid id = new Guid(item.ToString()); VV_ContainerInfo containerInfo = repository.FindFirst(x => x.containerdtl_id == id); if (null != containerInfo) { Dt_taskinfo task = Dt_taskinfoRepository.Instance.FindFirst(r => r.task_barcode == containerInfo.containerdtl_barcode); if (null != task) return content.Error($"托盘号{task.task_barcode}存在未完成的任务,请先确认。"); Dt_container_head container_Head = Dt_container_headRepository.Instance.FindFirst(x => x.containerhead_barcode == containerInfo.containerhead_barcode); Dt_container_detail container_Detail = Dt_container_detailRepository.Instance.FindFirst(x => x.containerdtl_id == id); //将库存数据一到到历史表 head、detail CommonFunction.AddContainerHeadToHistory(container_Head); CommonFunction.AddContainerDetailToHistory(container_Detail); //barcodeinfo数据移动到历史 Dt_barcodeinfo barcodeinfo = Dt_barcodeinfoRepository.Instance.FindFirst(x => x.barcode_value == containerInfo.containerhead_barcode); CommonFunction.AddBarcodeInfoToHistory(barcodeinfo, UserContext.Current.UserTrueName); //恢复空货位状态 Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == containerInfo.location_id); CommonFunction.ChangeLocationState(locationinfo, LocationState.LocationState_Empty.ToString()); } } return content.OK("删除库存成功."); }); } catch (Exception ex) { return content.OK("删除库存失败." + ex.Message); } finally { Logger.AddLog(Core.Enums.LoggerType.Del, keys, content, content); } return content; } /// /// 前端调用的轴承手动指定出库功能 /// /// /// public WebResponseContent BoxOutboundByManual(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); WebResponseContent content2 = new WebResponseContent(); try { if (saveModel.DelKeys.Count > 0) { content2 = WCSApi.GetInboundLineCurrentModel(saveModel); var contianerList = saveModel.DelKeys; string workStation = saveModel.MainData["workStation"].ToString(); if (content2.Status) { Dictionary returndic = JsonConvert.DeserializeObject>(content2.Data.ToString()); var controlModel = returndic["controlModel"]; // 入库区的模式 var modelResult = returndic["modelResult"]; // 出库区域的模式 if (workStation == "20101") { if (controlModel!= "联机控制") { return content.Error($"入库区域当前不处于【联机模式】"); } } else if (modelResult != "联机控制") { return content.Error($"出库区域当前不处于【联机模式】"); } } //if (workStation != "入库口") // throw new Exception("::Error::=> 出库线体还在安装中,无法新建!"); List listBarcode = new List(); string outboundType = saveModel.MainData["outboundType"].ToString(); List listContainer = new List(); string taskType = TaskType.TaskType_Box_Pallet_Outbound.ToString(); if ("Empty".Equal(outboundType)) { foreach (var constr in contianerList) { VV_ContainerInfo_EmptyPallet container = JsonConvert.DeserializeObject(constr.ToString()); listBarcode.Add(container.containerdtl_barcode); if (container.location_state != LocationState.LocationState_Stored.ToString()) throw new Exception($"选择的库存中包含正在执行任务的状态,请重新选择.托盘号:{container.containerdtl_barcode}"); if (container.location_islocked) return content.Error($"选择的库存饱含锁定库存,请重新选择.托盘号:{container.containerhead_barcode}"); Dt_taskinfo taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == container.containerhead_barcode); if (taskInfo != null) return content.Error($"选择的库存中包含已经下发的任务,请勿重复下发.托盘号:{container.containerhead_barcode}"); Dt_container_head head = Dt_container_headRepository.Instance.FindFirst(r => r.containerhead_barcode == container.containerhead_barcode); listContainer.Add(new VV_ContainerInfo() { containerhead_barcode = container.containerhead_barcode, materiel_id = container.materiel_id, location_id = container.location_id, containerdtl_type = container.containerdtl_type, containerdtl_goodsWeight = head.containerhead_palletweight }); } taskType = TaskType.TaskType_Empty_Pallet_Outbound.ToString(); } else { foreach (var constr in contianerList) { VV_ContainerInfo container = JsonConvert.DeserializeObject(constr.ToString()); listBarcode.Add(container.containerdtl_barcode); if (container.location_state != LocationState.LocationState_Stored.ToString() && container.location_state != LocationState.LocationState_Error.ToString()) throw new Exception($"选择的库存中包含正在执行任务的状态,请重新选择.托盘号:{container.containerhead_barcode}"); if (container.location_islocked) return content.Error($"选择的库存饱含锁定库存,请重新选择.托盘号:{container.containerdtl_barcode}"); Dt_taskinfo taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == container.containerhead_barcode); if (taskInfo != null) return content.Error($"选择的库存中包含已经下发的任务,请勿重复下发.托盘号:{container.containerhead_barcode}"); listContainer.Add(container); } } IDt_taskinfoRepository taskinfoRepository = Dt_taskinfoRepository.Instance; Dt_general_info general_Info = Dt_general_infoRepository.Instance.FindFirst(x => true); if ("应急模式".Equals(general_Info.general_inline_current_model)) { Dt_taskinfo task = Dt_taskinfoRepository.Instance.FindFirst(r => LayerToStation.inboundStations.Contains(r.task_endstation) || LayerToStation.outboundStations.Contains(r.task_beginstation)); if (null != task || listContainer.Count > 1) return content.Error("应急模式只能出1个任务."); } // string direction = ""; content = taskinfoRepository.DbContextBeginTransaction(() => { List listTask = new List(); string locationState = taskType.Equal(TaskType.TaskType_Empty_Pallet_Outbound.ToString()) ? LocationState.LocationState_Empty_OutBound_Wait_Executing.ToString() : LocationState.LocationState_Box_OutBound_Wait_Executing.ToString(); foreach (var item in listContainer) { Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == item.location_id); CommonFunction.ChangeLocationState(locationinfo, locationState); Dt_taskinfo taskinfo = new Dt_taskinfo(); //表示将轴承出到入库口 try { if (item.containerdtl_goodsCode != null && item.containerdtl_goodsCode != "") { taskinfo.task_sn = item.containerdtl_goodsCode; } } catch (Exception) { throw; } if (workStation == "20101") { string target = CommonFunction.GetOutboundAddress(general_Info, locationinfo.location_layer); taskinfo.task_id = Guid.NewGuid(); taskinfo.task_type = taskType; taskinfo.task_state = TaskState.TaskState_Create.ToString(); taskinfo.task_barcode = item.containerhead_barcode; taskinfo.task_materielid = item.materiel_id; //起始货位 taskinfo.task_fromlocationid = item.location_id; //目的货位,即出库口 taskinfo.task_tolocationid = target; //起始站台,也是出库口 taskinfo.task_beginstation = target; //目的站台 taskinfo.task_endstation = "20101"; taskinfo.task_grade = 0; taskinfo.task_isunpacked = false; taskinfo.task_creator = UserContext.Current.UserTrueName; taskinfo.task_createtime = DateTime.Now; taskinfo.task_materielType = item.containerdtl_type; taskinfo.task_weight = item.containerdtl_goodsWeight; } else { //if ("left".Equals(direction)) // direction = "right"; //else // direction = "left"; taskinfo.task_id = Guid.NewGuid(); taskinfo.task_type = taskType; taskinfo.task_state = TaskState.TaskState_Create.ToString(); taskinfo.task_barcode = item.containerhead_barcode; taskinfo.task_materielid = item.materiel_id; //起始货位 taskinfo.task_fromlocationid = item.location_id; //目的货位,即出库口 taskinfo.task_tolocationid = LayerToStation.OutAreaLayerToStation(locationinfo.location_layer); //起始站台,也是出库口 taskinfo.task_beginstation = LayerToStation.OutAreaLayerToStation(locationinfo.location_layer); //目的站台,即压装工位 taskinfo.task_endstation = workStation;// LayerToStation.GetOutboundStation(workStation, direction); taskinfo.task_grade = 0; taskinfo.task_isunpacked = false; taskinfo.task_creator = UserContext.Current.UserTrueName; taskinfo.task_createtime = DateTime.Now; taskinfo.task_materielType = item.containerdtl_type; taskinfo.task_weight = item.containerdtl_goodsWeight; } listTask.Add(taskinfo); } taskinfoRepository.AddRange(listTask, true); //下发出库任务给WCS content = WCSApi.SendTaskToWCS(listTask); if (content.Status) content.OK($"指定出库任务下发给WCS成功."); else content.Error($"指定出库任务下发给WCS失败,原因 => {content.Message}"); return content; }); } else content.Error(message: "请选择出库库存"); } catch (Exception ex) { content.Error(ex.Message); } finally { Logger.AddLog(Core.Enums.LoggerType.Add, null, content, content); } return content; } /// /// 锁定或者取消锁定库存 /// /// /// public WebResponseContent UpdateLockStateForContianer(SaveModel saveModel) { WebResponseContent responseContent = new WebResponseContent(); try { bool islock = Convert.ToBoolean(saveModel.Extra); List listLocation = new List(); foreach (var item in saveModel.DelKeys) { Guid id = new Guid(item.ToString()); VV_ContainerInfo containerInfo = repository.FindFirst(x => x.containerdtl_id == id); if (containerInfo.location_state != LocationState.LocationState_Stored.ToString()) throw new Exception("只能操作有货状态的库存"); Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == containerInfo.location_id); locationinfo.location_islocked = islock; listLocation.Add(locationinfo); } responseContent = repository.DbContextBeginTransaction(() => { Dt_locationinfoRepository.Instance.UpdateRange(listLocation, x => x.location_islocked, true); return responseContent.OK("修改货位锁定状态成功."); }); } catch (Exception ex) { responseContent.Error("解锁货位失败:" + ex.Message); } finally { Logger.AddLog(Core.Enums.LoggerType.Edit, saveModel, responseContent, responseContent); } return responseContent; } /// /// 供前端的库存平面图调用,获取数据 /// /// /// public WebResponseContent SelectContainerList(SaveModel saveModel) { return CommonFunction.SelectContainerList(saveModel); } /// /// 查询大屏数据 /// /// /// public WebResponseContent QueryHomeInfo(SaveModel saveModel) { return CommonFunction.QueryHomeInfo(saveModel); } //public WebResponseContent SelectContainerList(SaveModel saveModel) //{ // WebResponseContent content = new WebResponseContent(); // try // { // string line = saveModel.MainData["layer"].ToString(); // List> lists = new List>(); // for (int i = Convert.ToInt32(line); i < line.ToInt32() + 2; i++) // { // List locationinfos = Dt_locationinfoRepository.Instance.Find(x => x.location_line == i && x.location_layer <= 8) // .OrderByDescending(x => x.location_layer).ThenBy(x => x.location_column).ToList(); // List list = new List(); // for (int j = 8; j > 0; j--) // { // List layerlist = new List(); // foreach (var item in locationinfos) // { // if (item.location_layer == j) // { // VV_ContainerInfo containerInfo = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == item.location_id); // VV_ContainerInfo_EmptyPallet emptyPalletContainer = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == item.location_id); // Dt_locationinfo _Locationinfo = Dt_locationinfoRepository.Instance.FindFirst(d => d.location_id == item.location_id); // if (containerInfo != null) // { // containerInfo.location_state = locationstate(_Locationinfo, item.location_islocked, true); // } // else if (emptyPalletContainer != null) // { // emptyPalletContainer.location_state = locationstate(_Locationinfo, item.location_islocked, true); // } // else // { // _Locationinfo.location_state = locationstate(_Locationinfo, item.location_islocked, false); // } // if (containerInfo != null) // { // layerlist.Add(new // { // color = "success", // id = item.location_id, // src = LocationStausImage(_Locationinfo, item.location_islocked, true), // form = containerInfo, // form2 = _Locationinfo // }); // } // else if (emptyPalletContainer != null) // { // layerlist.Add(new // { // color = "success", // id = item.location_id, // src = LocationStausImage(_Locationinfo, item.location_islocked, true), // form = emptyPalletContainer, // form2 = _Locationinfo // }); // } // else // { // layerlist.Add(new // { // color = "success", // id = item.location_id, // src = LocationStausImage(_Locationinfo, item.location_islocked, false), // form = containerInfo, // form2 = _Locationinfo // }); ; // } // } // } // list.Add(layerlist); // } // lists.Add(list); // } // content.OK("成功", lists); // } // catch (Exception ex) // { // content.Error(ex.Message); // } // return content; //} public string locationstate(Dt_locationinfo locationinfo, bool isLocked, bool flag) { string state = ""; if (isLocked == true && flag == true) return "有货被锁定"; if (isLocked == true && flag == false) return "空货位被锁定"; if (flag == false) return "空货位"; string locationId = locationinfo.location_id; List taskList = Dt_taskinfoRepository.Instance.Find(x => true); foreach (Dt_taskinfo taskinfo in taskList) { if (taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString() && taskinfo.task_tolocationid == locationId) { state = "空托盘入库中"; break; } else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Inbound.ToString() && taskinfo.task_tolocationid == locationId) { state = "轴承入库中"; break; } else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString() && taskinfo.task_tolocationid == locationId) { state = "测量回库中"; break; } else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() && taskinfo.task_fromlocationid == locationId) { state = "测量出库中"; break; } else if (taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() && taskinfo.task_fromlocationid == locationId) { state = "空托出库中"; break; } else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() && taskinfo.task_fromlocationid == locationId) { state = "轴承出库中"; break; } } //说明库存没有对应进行的任务 if (string.IsNullOrEmpty(state)) { VV_ContainerInfo_EmptyPallet emptyPalletContainer = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == locationId); if (emptyPalletContainer != null) { state = "空托盘"; } else { VV_ContainerInfo boxContainer = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == locationId); if (boxContainer != null && string.IsNullOrEmpty(boxContainer.csize_in_result)) { state = "等待测量"; } else if (boxContainer != null) { state = "已测量"; } } } return state; } //显示货位状态 public string locationinfomatching(string location_state, bool isLocked, string containerdtl_state) { string img = "NewEmpty.png"; if (containerdtl_state == MaterielState.Error.ToString()) { img = "abnormal.png"; } if (containerdtl_state == MaterielState.Freeze.ToString()) { img = "freeze.png"; } if (containerdtl_state == MaterielState.GoodProduct.ToString()) { img = "NewStored.png"; } if (containerdtl_state == MaterielState.Pedding.ToString()) { img = "inspected.png"; } if (containerdtl_state == MaterielState.GoodProduct.ToString() && isLocked) { img = "NewLock.png"; } if (containerdtl_state == MaterielState.Freeze.ToString() && isLocked) { img = "freelock.png"; } if (containerdtl_state == MaterielState.Pedding.ToString() && isLocked) { img = "Transfer_Executing.png"; } if (containerdtl_state == MaterielState.Error.ToString() && isLocked) { img = "InWaveComputing.png"; } return img; } public string LocationStausImage(Dt_locationinfo locationinfo, bool isLocked, bool flag) { string img = ""; if (isLocked == true) return "NewLock.png"; if (flag == false) return "NewEmpty.png"; string locationId = locationinfo.location_id; List taskList = Dt_taskinfoRepository.Instance.Find(x => true); foreach (Dt_taskinfo taskinfo in taskList) { if ((taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString() || taskinfo.task_type == TaskType.TaskType_Box_Pallet_Inbound.ToString()) && taskinfo.task_tolocationid == locationId) { img = "NewInbound.png"; break; } else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString() && taskinfo.task_tolocationid == locationId) { img = "Measureing.png"; break; } else if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() && taskinfo.task_fromlocationid == locationId) { img = "Measureing.png"; break; } else if ((taskinfo.task_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || taskinfo.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()) && taskinfo.task_fromlocationid == locationId) { img = "NewOutbound.png"; break; } } //说明库存没有对应进行的任务 if (string.IsNullOrEmpty(img)) { VV_ContainerInfo_EmptyPallet emptyPalletContainer = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == locationId); if (emptyPalletContainer != null) { img = "EmptyPallet.png"; } else { VV_ContainerInfo boxContainer = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == locationId); if (boxContainer != null && !string.IsNullOrEmpty(boxContainer.csize_in_result)) { img = "HadMeasure.png"; } else if (boxContainer != null) { img = "WaitMeasure.png"; } } } return img; } /// /// 添加一条库存记录 /// /// /// public WebResponseContent addGoodsRecord(SaveModel saveModel) { WebResponseContent responseContent = new WebResponseContent(); string barcode = "", locationid = ""; try { barcode = saveModel.MainData["add_barcode"].ToString(); locationid = saveModel.MainData["add_locationid"].ToString(); if (barcode.Length != 6) throw new Exception("托盘号不符合规则"); if (locationid.Length != 12) throw new Exception("货位编号输入有误,请按该格式输入:01-01-008-01"); //查询条码值是否已经存在 VV_ContainerInfo tmpInfo = VV_ContainerInfoRepository.Instance.FindFirst(x => x.containerhead_barcode == barcode); if (tmpInfo != null) throw new Exception("该条码值已经存在"); //查询货位是否是空货位 Dt_locationinfo tmpLoc = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == locationid); if (tmpLoc == null) throw new Exception("输入的货位号不存在"); if (tmpLoc.location_state != LocationState.LocationState_Empty.ToString()) throw new Exception("输入的货位号已被使用"); responseContent = VV_ContainerInfoRepository.Instance.DbContextBeginTransaction(() => { Guid containerHeadID = Guid.NewGuid(); Dt_container_head conHead = new Dt_container_head(); conHead.containerhead_id = Guid.NewGuid(); conHead.containerhead_barcode = barcode; conHead.containerhead_creator = UserContext.Current.UserTrueName; conHead.containerhead_createtime = DateTime.Now; conHead.containerhead_palletweight = "0"; Dt_container_headRepository.Instance.Add(conHead, true); Dt_container_detail conDetail = new Dt_container_detail(); conDetail.containerdtl_id = Guid.NewGuid(); conDetail.containerdtl_headid = conHead.containerhead_id.ToString(); conDetail.containerdtl_materielid = "100"; conDetail.containerdtl_qty = "1"; conDetail.containerdtl_creator = UserContext.Current.UserTrueName; conDetail.containerdtl_createtime = DateTime.Now; Dt_container_detailRepository.Instance.Add(conDetail, true); Dt_barcodeinfo barcodeinfo = new Dt_barcodeinfo(); barcodeinfo.barcodeinfo_id = Guid.NewGuid(); barcodeinfo.barcode_value = barcode; barcodeinfo.barcode_intime = DateTime.Now; barcodeinfo.barcode_locationid = locationid; barcodeinfo.barcode_creator = UserContext.Current.UserTrueName; barcodeinfo.barcode_createtime = DateTime.Now; Dt_barcodeinfoRepository.Instance.Add(barcodeinfo, true); Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == locationid); locationinfo.location_state = LocationState.LocationState_Stored.ToString(); Dt_locationinfoRepository.Instance.Update(locationinfo, true); return responseContent.OK($"执行添加空托库存操作成功,货位号 :{locationid},条码值:{barcode}"); }); } catch (Exception ex) { responseContent.Error($"执行添加空托库存操作成功,货位号 :{locationid},条码值:{barcode},异常信息:{ex.Message}"); } finally { Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, responseContent, responseContent); } return responseContent; } /// /// 手动指定添加一条测量记录(手动选中的测量轴承不计算时间) /// /// /// /// public WebResponseContent addMeasureTaskByMannual(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); List listContainer = new List(); try { Dt_general_info general_Info = Dt_general_infoRepository.Instance.FindFirst(x => true); if ("应急模式".Equals(general_Info.general_inline_current_model)) { Dt_taskinfo task = Dt_taskinfoRepository.Instance.FindFirst(r => LayerToStation.inboundStations.Contains(r.task_endstation) || LayerToStation.outboundStations.Contains(r.task_beginstation)); if (null != task || saveModel.DelKeys.Count > 1) return content.Error("应急模式只能出1个任务."); } foreach (var item in saveModel.DelKeys) { Guid id = new Guid(item.ToString()); VV_ContainerInfo containerInfo = repository.FindFirst(x => x.containerdtl_id == id); if (null != containerInfo) { if ((containerInfo.location_state != LocationState.LocationState_Error.ToString() && containerInfo.location_state != LocationState.LocationState_Stored.ToString()) || containerInfo.location_islocked) throw new Exception($"只能测量异常状态,有货状态和解锁的库存,货位号:{containerInfo.location_id}"); if (containerInfo.location_state == LocationState.LocationState_Error.ToString()) { Dt_container_detail dt_Container_Detail = Dt_container_detailRepository.Instance.FindFirst(x => x.containerdtl_id == id); dt_Container_Detail.containerdtl_isError = "1"; Dt_container_detailRepository.Instance.Update(dt_Container_Detail, true); } listContainer.Add(containerInfo); } } content = repository.DbContextBeginTransaction(() => { foreach (var containerInfo in listContainer) { //更改货位状态 Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == containerInfo.location_id); locationinfo.location_state = LocationState.LocationState_Box_Measure_Out_Wait_Executing.ToString(); Dt_locationinfoRepository.Instance.Update(locationinfo, true); // 更改测量出库的状态为为测量 //Dt_container_detail dt_container_detail = Dt_container_detailRepository.Instance.FindFirst(x => x.containerdtl_barcode == containerInfo.containerdtl_barcode); //dt_container_detail.containerdtl_text1 = "未测量"; //Dt_container_detailRepository.Instance.Update(dt_container_detail, true); string target = CommonFunction.GetInboundAddress(general_Info, locationinfo.location_layer); //生成WMS任务 Dt_taskinfo taskinfo = new Dt_taskinfo(); taskinfo.task_id = Guid.NewGuid(); taskinfo.task_type = TaskType.TaskType_Box_Pallet_Measure_Out.ToString(); taskinfo.task_state = TaskState.TaskState_Create.ToString(); taskinfo.task_barcode = containerInfo.containerdtl_barcode; taskinfo.task_materielid = containerInfo.materiel_id; taskinfo.task_weight = containerInfo.containerdtl_goodsWeight; taskinfo.task_sn = containerInfo.containerdtl_goodsCode; taskinfo.task_materielType = containerInfo.containerdtl_type; //起始货位 taskinfo.task_fromlocationid = containerInfo.location_id; //目的货位,应该是穿梭车的放货站台 (50301-50308) taskinfo.task_tolocationid = target; //测量出库任务穿梭车的放货站台(50301-50308) taskinfo.task_beginstation = target; //目的站台 taskinfo.task_endstation = "10301"; taskinfo.task_grade = 0; taskinfo.task_isunpacked = false; taskinfo.task_creator = UserContext.Current.UserTrueName; taskinfo.task_createtime = DateTime.Now; taskinfo.task_isunpacked = true; Dt_taskinfoRepository.Instance.Add(taskinfo, true); LogRecord.WriteLog((int)LogEnum.Measure, $"{UserContext.Current.UserName}【手动添加测量任务】给货位:【{locationinfo.location_id}】、托盘号:【{containerInfo.containerdtl_barcode}】的轴承添加了测量任务"); } return content.OK("手动增加测量任务成功."); }); } catch (Exception ex) { content.Error("手动增加测量任务失败." + ex.Message); } finally { Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content); } return content; } /// /// 移库出库 /// /// /// public WebResponseContent MoveContainerAction(SaveModel saveModel) { return CommonFunction.MoveContainerAction(saveModel); } /// /// 出库复核 /// /// /// public WebResponseContent AddCheckTaskAction(SaveModel saveModel) { return CommonFunction.AddCheckTaskAction(saveModel); } public WebResponseContent Getgqrkts() { WebResponseContent webResponseContent = new WebResponseContent(); int goodscount = repository.Find(x => x.containerdtl_text3 == "不合格").Count(); int standarcount = repository.Find(x => x.containerdtl_standardResult == 0).Count(); // 使用AsEnumerable()切换到客户端评估 int dateDiffResultcount = repository.Find(x => true) .AsEnumerable() .Count(x => { if (string.IsNullOrEmpty(x.DateDiffResult)) return false; var match = Regex.Match(x.DateDiffResult, @"(\d+)\s*天"); return match.Success && int.TryParse(match.Groups[1].Value, out int days) && days >= 180; }); webResponseContent.Data = new { goodscount = goodscount, standarcount = standarcount, dateDiffResultcount = dateDiffResultcount, }; return webResponseContent.OK(); } public virtual PageGridData GetPageData(PageDataOptions options) { options = ValidatePageOptions(options, out IQueryable queryable); //获取排序字段 Dictionary orderbyDic = GetPageDataSort(options, TProperties); PageGridData pageGridData = new PageGridData(); if (QueryRelativeExpression != null) { queryable = QueryRelativeExpression.Invoke(queryable); } if (options.Export) { pageGridData.rows = queryable.GetIQueryableOrderBy(orderbyDic).Take(Limit).ToList(); } else { if (options.Wheres.Contains("超期") || options.Wheres.Contains("未超期") || options.Wheres.Contains("未登记收货确认时间") || options.Wheres.Contains("未登记确认时间")) { pageGridData.rows = repository.IQueryablePage(queryable, 1, 99999, out int rowCount, orderbyDic).ToList(); pageGridData.total = rowCount; } else { pageGridData.rows = repository.IQueryablePage(queryable, options.Page, options.Rows, out int rowCount, orderbyDic).ToList(); pageGridData.total = rowCount; } if (options.Wheres.Contains("超期")) { if (options.Wheres.Contains("未超期")) { for (int i = pageGridData.rows.Count - 1; i >= 0; i--) { var item = pageGridData.rows[i]; Match match = Regex.Match(item.DateDiffResult, @"^\d+"); if (match.Success && int.TryParse(match.Value, out int days)) { if (days >= 180) { pageGridData.rows.RemoveAt(i); // 按索引删除 } } } } else { for (int i = pageGridData.rows.Count - 1; i >= 0; i--) { var item = pageGridData.rows[i]; Match match = Regex.Match(item.DateDiffResult, @"^\d+"); if (match.Success && int.TryParse(match.Value, out int days)) { if (days < 180) { pageGridData.rows.RemoveAt(i); // 按索引删除 } } } } pageGridData.total = pageGridData.rows.Count; pageGridData.rows = pageGridData.rows.Skip((options.Page - 1) * options.Rows).Take(options.Rows).ToList(); } if (options.Wheres.Contains("确认时间")) { if (options.Wheres.Contains("未登记收货确认时间")) { for (int i = pageGridData.rows.Count - 1; i >= 0; i--) { var item = pageGridData.rows[i]; if (item.containerdtl_takeGoogsCheckTime!=null) { pageGridData.rows.RemoveAt(i); // 按索引删除 } } } else { for (int i = pageGridData.rows.Count - 1; i >= 0; i--) { var item = pageGridData.rows[i]; if (item.containerdtl_qualityCheckTime != null) { pageGridData.rows.RemoveAt(i); // 按索引删除 } } } pageGridData.total = pageGridData.rows.Count; pageGridData.rows = pageGridData.rows.Skip((options.Page - 1) * options.Rows).Take(options.Rows).ToList(); } //查询界面统计求等字段 if (SummaryExpress != null) { pageGridData.summary = SummaryExpress.Invoke(queryable); //Func groupExpress = x =>x; //pageGridData.summary = queryable.GroupBy(groupExpress).Select(SummaryExpress).FirstOrDefault(); } } GetPageDataOnExecuted?.Invoke(pageGridData); return pageGridData; } } }