using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using WIDESEA.Common; using WIDESEA.Core.Extensions; using WIDESEA.Core.ManageUser; using WIDESEA.Core.Services; using WIDESEA.Core.Utilities; using WIDESEA.Entity.DomainModels; using WIDESEA.Services.IRepositories; using WIDESEA.Services.Repositories; using WIDESEA_Common.LogEnum; namespace WIDESEA.Services.Services { public partial class CommonFunction { /// /// 轴承出库 /// /// /// public static WebResponseContent BearingOutboundAction(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { //轮对条码 string barcode = saveModel.MainData["barcode"].ToString(); //车型 string materiel = saveModel.MainData["materiel"].ToString(); //轴承状态新旧 string zcState = saveModel.MainData["zcState"].ToString(); //轴承厂家 string Manufacturer = saveModel.MainData["Manufacturer"].ToString(); //右防尘板 string yfcbAVG = saveModel.MainData["yfcbAVG"]?.ToString(); //左防尘板 string zfcbAVG = saveModel.MainData["zfcbAVG"]?.ToString(); //左油档 string zydAVG = saveModel.MainData["zydAVG"]?.ToString(); //右油档 string yydAVG = saveModel.MainData["yydAVG"]?.ToString(); //左轴径 string zzjAVG = saveModel.MainData["zzjAVG"]?.ToString(); //右轴径 string yzjAVG = saveModel.MainData["yzjAVG"]?.ToString(); //呼叫工位 string targetStation = saveModel.MainData["targetStation"].ToString(); //轴承方向 string ZCdirection = saveModel.MainData["ZCdirection"].ToString(); //轮对号 string ldCode = saveModel.MainData["ldCode"].ToString(); //左出库轴承 VV_ContainerInfo leftContainer = null; //右出库轴承 VV_ContainerInfo rightContainer = null; List materielinfo = Dt_materielinfoRepository.Instance.Find(r => r.materiel_suitMateriel.Contains(materiel)); //获取选配标准 List listStandard = null; foreach (var item in materielinfo) { listStandard = Dt_selection_standardsRepository.Instance.Find(r => r.selection_carId == item.materiel_id && r.selection_zc_manufacturer == Manufacturer && r.selection_zc_type.Contains(zcState)); if (null != listStandard && listStandard.Count > 0) break; } foreach (var item in materielinfo) { List listContainer = VV_ContainerInfoRepository.Instance.Find(r => !r.location_islocked && r.location_state == LocationState.LocationState_Stored.ToString() && r.containerdtl_madeUnit == Manufacturer && r.containerdtl_standard.Contains(zcState) && r.materiel_id == item.materiel_id && r.containerdtl_standardResult == 1 && (string.IsNullOrEmpty(r.csize_out_result) || r.csize_out_result == "合格") && r.containerdtl_qualityCheck == true && r.containerdtl_takeGoogsCheck == true); //listContainer = listContainer.OrderBy(x => DateTime.ParseExact(x.containerdtl_ProductDate,"yyyy-MM-dd",CultureInfo.InvariantCulture)).ToList(); //&& Convert.ToDateTime(r.containerdtl_ProductDate) > DateTime.Now if (null != listContainer && listContainer.Count > 0) { if ("all".Equals(ZCdirection) || string.IsNullOrEmpty(ZCdirection)) { if (null == leftContainer) { leftContainer = GetContainer(listStandard, listContainer, zzjAVG, zfcbAVG, zydAVG, "left"); if (null != leftContainer) listContainer.Remove(leftContainer); } if (null == rightContainer) { rightContainer = GetContainer(listStandard, listContainer, yzjAVG, yfcbAVG, yydAVG, "right"); if (null != rightContainer) listContainer.Remove(rightContainer); } if (null == leftContainer || null == rightContainer) continue; else break; } else if ("left".Equals(ZCdirection)) { leftContainer = GetContainer(listStandard, listContainer, zzjAVG, zfcbAVG, zydAVG, "left"); if (null == leftContainer) continue; else break; } else if ("right".Equals(ZCdirection)) { rightContainer = GetContainer(listStandard, listContainer, yzjAVG, yfcbAVG, yydAVG, "right"); if (null == rightContainer) continue; else break; } } } if ("all".Equal(ZCdirection)) { if (null == leftContainer || null == rightContainer) return content.Error("未找到可匹配的出库轴承,车型:" + materiel); } if (null != leftContainer || null != rightContainer) { IDt_taskinfoRepository taskinfoRepository = Dt_taskinfoRepository.Instance; content = taskinfoRepository.DbContextBeginTransaction(() => { List listTask = new List(); if (null != leftContainer) { Dt_taskinfo leftTask = GetOutboundTask(leftContainer, targetStation, "left", CommonFunction.GetZCInfo(leftContainer, materiel, barcode, zfcbAVG, zydAVG, zzjAVG, ldCode, targetStation, "left")); listTask.Add(leftTask); } if (null != rightContainer) { Dt_taskinfo rightTask = GetOutboundTask(rightContainer, targetStation, "right", CommonFunction.GetZCInfo(rightContainer, materiel, barcode, yfcbAVG, yydAVG, yzjAVG, ldCode, targetStation, "right")); listTask.Add(rightTask); } taskinfoRepository.AddRange(listTask, true); //下发出库任务给WCS content = WIDESEA_Services.WCSApi.SendTaskToWCS(listTask); if (content.Status) { //if (null != leftContainer) // CommonFunction.WheelsetMatch(barcode, leftContainer.containerdtl_number, "6"); //if (null != rightContainer) // CommonFunction.WheelsetMatch(barcode, rightContainer.containerdtl_number, "7"); content.OK($"轴承出库任务下发给WCS成功."); } else content.Error($"轴承出库任务下发给WCS失败,原因 => {content.Message}"); return content; }); } else return content.Error("未找到可匹配的出库轴承,车型:" + materiel); } catch (Exception ex) { content.Error("创建轴承出库任务失败:" + ex.Message); } finally { LogRecord.WriteLog((int)LogEnum.OutBound, $"{UserContext.Current.UserTrueName}轴承选配出库:参数:{saveModel.Serialize()},返回参数:{content.Serialize()}"); //Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content); } return content; } private static Dt_taskinfo GetOutboundTask(VV_ContainerInfo container, string target, string direction, object zcInfo) { Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == container.location_id); CommonFunction.ChangeLocationState(locationinfo, LocationState.LocationState_Outbound_Wait_Executing.ToString()); Dt_taskinfo taskinfo = new Dt_taskinfo(); taskinfo.task_id = Guid.NewGuid(); taskinfo.task_type = TaskType.TaskType_Box_Pallet_Outbound.ToString(); taskinfo.task_state = TaskState.TaskState_Create.ToString(); taskinfo.task_barcode = container.containerhead_barcode; taskinfo.task_materielid = container.materiel_id; //起始货位 taskinfo.task_fromlocationid = container.location_id; //目的货位 taskinfo.task_tolocationid = LayerToStation.OutAreaLayerToStation(locationinfo.location_layer); //起始站台 taskinfo.task_beginstation = LayerToStation.OutAreaLayerToStation(locationinfo.location_layer); //目的站台 taskinfo.task_endstation = LayerToStation.GetOutboundStation(target, direction); taskinfo.task_grade = 0; taskinfo.task_isunpacked = false; taskinfo.task_creator = UserContext.Current.UserTrueName; taskinfo.task_createtime = DateTime.Now; taskinfo.task_bak_1 = JsonConvert.SerializeObject(zcInfo); taskinfo.task_sn = container.containerdtl_goodsCode; taskinfo.task_materielType = container.containerdtl_type; taskinfo.task_weight = container.containerdtl_goodsWeight; return taskinfo; } /// /// 获取库存 /// /// /// /// /// /// /// public static VV_ContainerInfo GetContainer(List listStand, List listContainer, string zjAVG, string fcbAVG, string ydAVG, string direction) { IQueryable queryble = listContainer.AsQueryable(); //轴承内径 Dt_selection_standards zjStand = listStand.Find(r => r.selection_standard_type == "1"); if (null != zjStand) { if (!string.IsNullOrEmpty(zjAVG)) { //上限 decimal zjStandQty_positive = zjStand.selection_positive_value.GetValueOrDefault(); //下限 decimal zjStandQty_negative = zjStand.selection_negative_value.GetValueOrDefault(); decimal mesStand = decimal.Parse(zjAVG); queryble = queryble.Where(r => r.csize_in_result == "合格" && mesStand - (decimal.Parse(r.csize_in_value)) >= zjStandQty_negative && mesStand - (decimal.Parse(r.csize_in_value)) <= zjStandQty_positive); } else queryble = queryble.Where(r => r.csize_in_result != "不合格"); } else queryble = queryble.Where(r => r.csize_in_result != "不合格"); ////防尘板 Dt_selection_standards fcbStand = listStand.Find(r => r.selection_standard_type == "2"); if (null != fcbStand) { if (!string.IsNullOrEmpty(fcbAVG)) { //上限 decimal fcbStandQty_positive = fcbStand.selection_positive_value.GetValueOrDefault(); //下限 decimal fcbStandQty_negative = fcbStand.selection_negative_value.GetValueOrDefault(); decimal mesStand = decimal.Parse(fcbAVG); queryble = queryble.Where(r => r.csize_four_result == "合格" && mesStand - (decimal.Parse(r.csize_four_3)) >= fcbStandQty_negative && mesStand - (decimal.Parse(r.csize_four_3)) <= fcbStandQty_positive); } else queryble = queryble.Where(r => r.csize_four_result != "不合格"); } else queryble = queryble.Where(r => r.csize_four_result != "不合格"); ////油档 Dt_selection_standards ydStand = listStand.Find(r => r.selection_standard_type == "3"); if (null != ydStand) { if (!string.IsNullOrEmpty(ydAVG)) { //上限 decimal ydStandQty_positive = ydStand.selection_positive_value.GetValueOrDefault(); //下限 decimal ydStandQty_negative = ydStand.selection_negative_value.GetValueOrDefault(); decimal mesStand = decimal.Parse(ydAVG); queryble = queryble.Where(r => r.csize_three_result == "合格" && (mesStand - decimal.Parse(r.csize_three_3)) >= ydStandQty_negative && mesStand - (decimal.Parse(r.csize_three_3)) <= ydStandQty_positive); } else queryble = queryble.Where(r => r.csize_three_result != "不合格"); } else queryble = queryble.Where(r => r.csize_three_result != "不合格"); //轴承内径 //if (!string.IsNullOrEmpty(zjAVG)) //{ // Dt_selection_standards zjStand = listStand.Find(r => r.selection_standard_type == "1"); // if (null == zjStand) // throw new Exception($"请先维护可用的轴承内径过盈量选配标准。"); // //上限 // decimal zjStandQty_positive = zjStand.selection_positive_value.GetValueOrDefault(); // //下限 // decimal zjStandQty_negative = zjStand.selection_negative_value.GetValueOrDefault(); // decimal mesStand = decimal.Parse(zjAVG); // queryble = queryble.Where(r => r.csize_in_result == "合格" && (decimal.Parse(r.csize_in_value) - mesStand) >= zjStandQty_negative // && (decimal.Parse(r.csize_in_value) - mesStand) <= zjStandQty_positive); //} //else // queryble = queryble.Where(r => r.csize_in_result != "不合格"); ////防尘板 //if (!string.IsNullOrEmpty(fcbAVG)) //{ // Dt_selection_standards fcbStand = listStand.Find(r => r.selection_standard_type == "2"); // if (null == fcbStand) // throw new Exception($"请先维护可用的防尘板过盈量选配标准。"); // //上限 // decimal fcbStandQty_positive = fcbStand.selection_positive_value.GetValueOrDefault(); // //下限 // decimal fcbStandQty_negative = fcbStand.selection_negative_value.GetValueOrDefault(); // decimal mesStand = decimal.Parse(fcbAVG); // queryble = queryble.Where(r => r.csize_four_result == "合格" && (decimal.Parse(r.csize_four_3) - mesStand) >= fcbStandQty_negative // && (decimal.Parse(r.csize_four_3) - mesStand) <= fcbStandQty_positive); //} //else // queryble = queryble.Where(r => r.csize_four_result != "不合格"); ////油档 //if (!string.IsNullOrEmpty(ydAVG)) //{ // Dt_selection_standards ydStand = listStand.Find(r => r.selection_standard_type == "3"); // if (null == ydStand) // throw new Exception($"请先维护可用的油档过盈量选配标准。"); // //上限 // decimal ydStandQty_positive = ydStand.selection_positive_value.GetValueOrDefault(); // //下限 // decimal ydStandQty_negative = ydStand.selection_negative_value.GetValueOrDefault(); // decimal mesStand = decimal.Parse(ydAVG); // queryble = queryble.Where(r => r.csize_three_result == "合格" && (decimal.Parse(r.csize_three_3) - mesStand) >= ydStandQty_negative // && (decimal.Parse(r.csize_three_3) - mesStand) <= ydStandQty_positive); //} //else // queryble = queryble.Where(r => r.csize_three_result != "不合格");containerdtl_createtime return queryble.OrderBy(r => r.containerdtl_ProductDate).ThenBy(r => r.containerdtl_createtime).FirstOrDefault(); } } }