using AutoMapper; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using wms.dataservice.IDataSetvice; using wms.dto; using wms.dto.request.fj; using wms.dto.response; using wms.dto.response.fj; using wms.service.IService; using wms.sqlsugar; using wms.sqlsugar.model; using wms.sqlsugar.model.fj; using wms.util.Ext; using System.Linq; using WCS.Entity.fj; using wms.util.Check; namespace wms.service.Service { public class FJService : IFJService { private readonly IMapper _mapper; private readonly ILogger _logger; private readonly IFJDataService _IFJDataService; public FJService(IMapper mapper, ILogger logger, IFJDataService IFJDataService) { _mapper = mapper; _logger = logger; _IFJDataService = IFJDataService; } Repository _docrepository => new Repository(); Repository _sysconfigrepository => new Repository(); Repository _materrepository => new Repository(); Repository _billTaskrepository => new Repository(); Repository _baseWareHouserepository => new Repository(); Repository _billBarcoderepository => new Repository(); Repository _billFbackPushrepository => new Repository(); Repository _fjBillBomInfoRepository => new Repository(); Repository _fjBillWetStackRepository => new Repository(); ITenant _db => SqlSugarHelper.Db;//处理事务 Repository _baseContinfo => new Repository(); RepositoryTask _taskrepository => new RepositoryTask(); Repository _billInvnowrepository => new Repository(); Repository _billInvinitrepository => new Repository(); Repository _basematerrepository => new Repository(); Repository _billSpoolTransrepository => new Repository(); Repository _billBominfoRepository => new Repository(); Repository _billBomsetinfoRepository => new Repository(); Repository _billdocrepository => new Repository(); RepositoryTask _wcstaskoldrepository => new RepositoryTask(); Repository _billInvflow => new Repository(); Repository _billPushinforepository => new Repository(); Repository _basewarecellrepository => new Repository(); Repository _basewarehouserepository => new Repository(); RepositoryTask _taskdetailrepository => new RepositoryTask(); Repository _basemachinforepository => new Repository(); /// /// 添加单据 /// /// public bool Add(fjBillDocument data1) { try { _db.BeginTran(); _docrepository.Insert(data1); _db.CommitTran(); } catch (Exception) { _db.RollbackTran(); throw; } return true; } /// /// 获取配置内容信息 /// /// 配置表code值 /// public string GetSysConfigContentByCode(string code) { //先读缓存 var cacheContent = RedisHelper.Get("sys_config" + code); if (!string.IsNullOrEmpty(cacheContent)) { return cacheContent; } var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code); if (sysconf == null) { throw new Exception("数据表没有配置" + code); } var content = sysconf.SContent; string sysname = sysconf.Default1;//所属系统mes/erp RedisHelper.Set("sys_config" + code, content + "|" + sysname); return content; } /// /// 获取配置信息 /// /// /// public fjSysConfig GetSysConfigByCode(string code) { //Repository _billdtrepository = new Repository(); return _sysconfigrepository.GetSingle(p => p.Code == code); } /// /// 获取物料信息 /// /// /// public fjBaseMater GetBaseMaterByExpression(Expression> WhereExpression) { return _materrepository.GetSingle(WhereExpression); } /// /// 获取配置信息 /// /// /// public fjSysConfig GetSysConfigByExpression(Expression> WhereExpression) { return _sysconfigrepository.GetSingle(WhereExpression); } /// /// 获取单据信息 /// /// /// public fjBillDocument GetBillDocumentByExpression(Expression> WhereExpression) { return _docrepository.GetSingle(WhereExpression); } /// /// 获取反馈信息 /// /// /// public List GetBillFeedbackList(Expression> WhereExpression) { return _billFbackPushrepository.GetList(WhereExpression); } ///// ///// 获取单据信息 ///// ///// ///// //public fjBillDocument GetBillDocumentList(Expression> WhereExpression) //{ // return _billdtrepository.Context.Queryable((doc, conf) => new object[] { // JoinType.Left, doc.BState == conf.Code // }).Where((doc, conf) => doc.Status == 0) // .Select((bc, bm) => bc).First(); //} /// /// 更新SysConfig表字段 /// /// /// public bool UpdateSysConfigModelColumns(UpdateModelColumns updateModel) { return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression); } /// /// 更新hjBillFeedbackPush表字段 /// /// /// public bool UpdateBillFeedbackPushModelColumns(UpdateModelColumns updateModel) { return _billFbackPushrepository.Update(updateModel.Columns, updateModel.WhereExpression); } public SRes DeleteDoc(Expression> whereExpression) { var res = new SRes(); res.ResData = _docrepository.Delete(whereExpression); return res; } public bool SyncMaterInfo(List ResData) { foreach (var item in ResData) { if (_materrepository.IsAny(p => p.Code == item.MatCode)) { _materrepository.UpdateModelColumns(p => new fjBaseMater() { IsHold = item.IsHold, HoldDuration = item.HoldDuration }, p => p.Code == item.MatCode); } else { var model = _mapper.Map(item); _materrepository.Insert(model); } } return true; } public bool SyncMachineInfo(List ResData) { foreach (var item in ResData) { if (_basemachinforepository.IsAny(p => p.MachNo == item.MacCode)) { _basemachinforepository.UpdateModelColumns(p => new BillMachinfo() { GrpCode = item.MacGroup, Direction = item.Direction,Station = item.LocCode,EditTime = DateTime.Now }, p => p.MachNo == item.MacCode); } else { var model = _mapper.Map(item); _basemachinforepository.Insert(model); } } return true; } /// /// 帘线工单信息传输 /// /// /// public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto) { var res = new SRes(); var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); if (doc == null) { doc = new BillDocsinfo(); doc.WarehouseId = 0; doc.ReqNo = reqDto.BillCode; doc.DocsNo = reqDto.BillCode; doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode(); doc.StateNum = DocState.DocState_Create.GetHashCode(); doc.JsonContent = JsonConvert.SerializeObject(reqDto); doc.DownQty = 1; doc.IsStop = 0; var docinsert = _billdocrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } _basemachinforepository.UpdateModelColumns(p => new BillMachinfo() { BillCode = reqDto.BillCode, WorkOrder = reqDto.WorkOrder, PlanQty = reqDto.PlanQty, EditTime = DateTime.Now }, p => reqDto.WbList.Contains(p.MachNo)); return res; } /// /// 工单启动验证 /// /// /// public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto) { var res = new SRes(); var wetStack = _billBominfoRepository.GetSingle(p => p.BillCode == reqDto.BillCode); if (wetStack == null) { res.ResCode = 0; res.ResMsg = reqDto.BillCode + "没有配置垛型信息,请先配置垛型"; return res; } return res; } /// /// 湿拉工字轮/芯股信息传输接口 /// /// /// public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto) { var res = new SRes(); var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode); if (container == null) { var insertcon = new BaseContinfo() { ContBarCode = reqDto.SpoolCode, Name = reqDto.SpoolCode, TypeCode = ContainerType.ContainerType_Spool.ToString(), PrintQty = 1, IsStop = 0, WarehouseId = 0, WeightQty = 0, AddWho = "wms", AddTime = DateTime.Now }; //新加载具信息 if (!_baseContinfo.Insert(insertcon)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "工字轮载具初始化失败"; return res; } } var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode); if (mater == null) { res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription(); return res; } BillSpoolTrans billSpoolTrans = new BillSpoolTrans(); billSpoolTrans.ConBarCode = reqDto.SpoolCode; billSpoolTrans.BillCode = reqDto.BillCode; billSpoolTrans.WorkOrder = reqDto.WorkOrder; billSpoolTrans.AddTime = DateTime.Now; var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode); if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString()) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = "该工字轮条码号已在库中,请检查RFID号是否重复"; } if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString()) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成"; } //条码验证 var barstock = _billInvnowrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barstock != null && barstock.InvStateCode == InvState.InvEcecState_In.ToString()) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = "该材料号已在库中,请检查是否重复"; } if (barstock != null && barstock.ContGrpBarCode != reqDto.SpoolCode) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = reqDto.MatBarCode + "该材料号已经绑定" + barstock.ContGrpBarCode + ",请检查是否重复"; } var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barinfo == null) { barinfo = new BillInvinit() { InvBarCode = reqDto.MatBarCode, WarehouseId = 0, ContGrpId = IdFactory.NewId(), ContGrpBarCode = reqDto.SpoolCode, ExecStateCode = InvLockState.InvState_Normal.ToString(), ExecDocsNo = reqDto.WorkOrder, ExecDocsRowNo = reqDto.MatBarCode, ExecDocsTypeCode = DocType.DocType_HJ_CopperProductStockIn.GetHashCode().ToString(), InvInOut = InvInOutType.In.GetHashCode(), ExecWho = "MES", EditTime = DateTime.Now, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), InDocsNo = reqDto.BillCode, InDocsRowNo = reqDto.MatBarCode, SuppCode = "", MatId = mater.Id, MatCode = mater.Code, MatName = mater.Name, LengthQty = reqDto.Length, TareWQty = reqDto.Weight, ProductTime = reqDto.ProductDate, RFIDBarCode = "", ProductLineNo = "", Grade = reqDto.Grade, HWBarCode = "", HWTypeCode = reqDto.SpoolType,//工字轮类型 IsFast = reqDto.IsFast, IsRework = false, CLBarCode = reqDto.MatBarCode, Size = 1, AddTime = DateTime.Now, BackReason = "", IsBack = reqDto.IsBack, SilkTypeCode = reqDto.SilkType, IsCore = reqDto.BusType == "2", }; _billInvinitrepository.InsertReturnEntity(barinfo); _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans); } return res; } /// /// 分配分拣库 /// /// public bool AllocationWarehouseSort(AllocationWarehouseSortRequest reqDto) { var list = _billSpoolTransrepository.AsQueryable().Where(p => p.WarehouseSort == 0).Take(reqDto.TaskCount).ToList(); foreach (var item in list) { var maclist = _basemachinforepository.AsQueryable().Where(p => p.WorkOrder == item.WorkOrder); var warelist = maclist.Select(p => p.WarehouseCode).Distinct(); if (!warelist.Any()) { _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans() { ErrType = 1, ErrMsg = "没有配置机台信息", EditTime = DateTime.Now }, p => p.ConBarCode == item.ConBarCode); } else if (warelist.Count() == 1) { int sort = int.Parse(warelist.First().Substring(0, 1)); _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans() { WarehouseSort = sort, Direct = warelist.First().Substring(1, 1), EditTime = DateTime.Now }, p => p.ConBarCode == item.ConBarCode); } else { var waretemplist = maclist.Select(p => new { p.WarehouseCode,p.WorkOrder,p.BillCode, p.PlanQty }).Distinct(); var warehouselist = _basewarehouserepository.GetList().Select(p => p.Code); foreach (var warehouse in warehouselist) { var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == warehouse); getMatProport(item.MatCode, warehouse); } //根据垛型及库存比例分配 //找出该物料类型在每个库所要求的所有量 //找出该物料库存在当前库所有 } } return true; } /// /// 二次扫码分配输送地址 /// /// /// public SRes AllocationConveyorSort(AllocationConveyorSortRequest reqDto) { var res = new SRes(); var baritem = _billSpoolTransrepository.GetFirst(p => p.ConBarCode == reqDto.BarCode); //判断当前库是否有mix垛型 var mixrow = _billBomsetinfoRepository.AsQueryable().Where(p => p.IsMixRow == 1 && p.WarehouseCode == baritem.WarehouseCode); if (mixrow == null || !mixrow.Any()) { var matcodelist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode); var curmatrate = matcodelist.Where(p => p.MatCode == baritem.MatCode).Count() / matcodelist.Count(); //需要的总量 } else { } var translist = _billSpoolTransrepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode).ToList(); foreach (var item in translist.GroupBy(p=>p.ConveyorSort)) { } return res; } public decimal getMatProport(string matcode, string warehousecode) { //计算此仓库所有该物料的量 //每的单子(每盘的数量)*预计盘数 var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == warehousecode); return 0; } /// /// 帘线领料出库 /// /// /// public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto) { var res = new SRes(); var warehosue = _baseWareHouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (warehosue == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var doc = _docrepository.GetSingle(p => p.DocNo == reqDto.BillCode); if (doc == null) { doc = new fjBillDocument(); doc.WarehouseId = warehosue.Id; //保存单据信息 doc.ReqNo = reqDto.ReqId; doc.DocNo = reqDto.BillCode; doc.TypeCode = DocType.DocType_FJ_CurtainProductionStockOut.ToString(); doc.StateCode = DocState.DocState_Create.ToString(); doc.ContentJson = JsonConvert.SerializeObject(reqDto); doc.DownQty = 1; var docinsert = _docrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } return res; } public SRes ProductionBack(FjProductionBackRequest reqDto) { var res = new SRes(); return res; } public SRes ProductionLeftFeedBack(string doccode) { var res = new SRes(); return res; } public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto) { var res = new SRes(); return res; } public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto) { var res = new SRes(); return res; } public SRes StockChange(FjStockChangeRequest reqDto) { var res = new SRes(); return res; } public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto) { var res = new SRes(); return res; } public SRes BomInfoTrans(BomInfoTransRequest reqDto) { var res = new SRes(); return res; } } }