| | |
| | | using Tiger.Model.MES.Yada; |
| | | using Apache.NMS.ActiveMQ.Commands; |
| | | using System.Diagnostics; |
| | | using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; |
| | | using Tiger.Model.Entitys.MES.U9C; |
| | | |
| | | namespace Tiger.Business.WMS.Transaction |
| | | { |
| | |
| | | /// </summary> |
| | | public class In_SemiProd : WMSTransactionBase, IIn_SemiProd |
| | | { |
| | | private readonly IMES_U9C _IMES_U9C = DI.Resolve<IMES_U9C>(); |
| | | public IIn_SemiProd Init(string id, string userCode, string apiHost, string orgCode) |
| | | { |
| | | TransID = id; |
| | |
| | | public string UserCode { get; set; } |
| | | public long UserId { get; set; } |
| | | public string OrgCode { get; set; } |
| | | public string LocationCode { get; set; } |
| | | public List<V_WMS_ITEM> Vitem { get; set; } = new(); |
| | | public ScanShelfInfo CurScanShelf { get; set; } |
| | | public int pageSize { get; set; } |
| | | public RcvRptDocCreateInput RcvRptInput { get; set; } = new RcvRptDocCreateInput(); |
| | | public List<ProdInBatch> ProdInBatchs { get; set; } = new List<ProdInBatch>(); |
| | | public List<BIZ_ERP_PROD_IN_BTH> ErpProdInBths { get; set; } = new List<BIZ_ERP_PROD_IN_BTH>(); |
| | | public List<BIZ_ERP_PROD_IN> ErpProdIns { get; set; } = new List<BIZ_ERP_PROD_IN>(); |
| | | /// <summary> |
| | | /// 扫描列表 |
| | | /// </summary> |
| | | public List<InStoreScanInfo> InStoreScanInfos { get; set; } = new List<InStoreScanInfo>(); |
| | | public List<BIZ_ERP_PROD_IN_SN> ErpProdInSns { get; set; } = new List<BIZ_ERP_PROD_IN_SN>(); |
| | | public InStoreInfos inStoreInfos { get; set; } |
| | | |
| | | #endregion |
| | | |
| | |
| | | if (input.SN.IsNullOrEmpty()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = Biz.L("WMS.RePrint.ScanItem.SnEmptyFailure"); |
| | | action.LocaleMsg = Biz.L("WMS.InSemiProd.ScanItem.SnEmptyFailure"); |
| | | return SetOutPutMqttMsg(action, input.Locale); |
| | | } |
| | | var LotNos = Biz.DataSource["YadaU9C"].Client.Ado.SqlQuery<mes_WhLotCodeQtyInfo>($"select *,'' as ID from mes_WhLotCodeQtyInfo where Bin = '{input.SN}'"); |
| | | //Biz.DataSource["YadaU9C"].Client.Queryable<mes_WhLotCodeQtyInfo>().Where(t => t.Bin == input.SN).ToList(); |
| | | CurScanShelf = new ScanShelfInfo(); |
| | | // 查询货架信息 |
| | | var whUnit = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => (t.SHELF_CODE.ToUpper() == input.SN || t.LOCATION_CODE.ToUpper() == input.SN) && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync(); |
| | | if (!whUnit.IsNullOrEmpty() && whUnit.LOCATION_CODE == input.SN) |
| | | { |
| | | if (whUnit.IS_ACTIVE == "N") |
| | | var wo = await Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == input.SN).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q._ItemInfos).FirstAsync(); |
| | | if (wo == null) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("扫描的储位[{0}]未启用"); |
| | | action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfOrLocationDisabled", input.SN); |
| | | action.LocaleMsg = Biz.L("WMS.InSemiProd.ScanItem.WoEmptyFailure", input.SN); // $"工单[{input.SN}]不存在" |
| | | return action; |
| | | } |
| | | if (whUnit.Shelf.IsLightShelf || whUnit.Location.IS_SINGLE == "Y") |
| | | { |
| | | var locationData = Biz.Db.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == whUnit.LOCATION_ID && q.AUTH_ORG == OrgCode).First(); |
| | | if (!locationData.IsNullOrEmpty()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("储位[{0}]已存有物料[{1}],请检查系统库存信息"); |
| | | action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", input.SN, locationData.SN); |
| | | return action; |
| | | } |
| | | } |
| | | CurScanShelf.Shelf = whUnit.Shelf; |
| | | CurScanShelf.Location = whUnit.Location; |
| | | CurScanShelf.WarehouseCode = whUnit.WH_CODE; |
| | | CurScanShelf.RegionCode = whUnit.REGION_CODE; |
| | | CurScanShelf.ShelfCode = whUnit.SHELF_CODE; |
| | | CurScanShelf.LocationCode = whUnit.LOCATION_CODE; |
| | | CurScanShelf.IsSmartRack = false; |
| | | LocationCode = whUnit.LOCATION_CODE; |
| | | } |
| | | else { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("请输入或扫描有效的货架/储位码"); |
| | | action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty"); |
| | | return action; |
| | | } |
| | | var temps = new List<TemplateInput>(); |
| | | foreach (var item in LotNos) |
| | | { |
| | | var temp = new TemplateInput |
| | | { |
| | | custCode="", |
| | | itemCode= item.ItemCode, |
| | | itemDesc= item.Description, |
| | | sapItemCode= item.SapCode, |
| | | WoBatch = item.LotCode, |
| | | batchQty= item.StoreQty, |
| | | qrCode="", |
| | | }; |
| | | temps.Add(temp); |
| | | } |
| | | |
| | | var y = Biz.Db.Storageable(LotNos, UserCode) |
| | | .WhereColumns(t => new { t.ItemCode, t.LotCode }) |
| | | InStoreInfo Info = new() |
| | | { |
| | | ErpProdInBth = new() |
| | | { |
| | | WORK_ORDER = wo.ORDER_NO, |
| | | BATCH_NO = "", |
| | | SALES_ORDER = wo.SALES_ORDER, |
| | | ITEM_CODE = wo.ITEM_CODE, |
| | | ITEM_NAME = wo.ItemInfo?.ITEM_DESC, |
| | | SapCode = wo.ItemInfo?.ExtInfo?.SapCode, |
| | | SCAN_QTY = input.Data.ToInt32(), |
| | | IS_HANDLED = "N" //Y-已生成,N-未生成,F-失败 |
| | | }, |
| | | InStoreScanInfo = new() |
| | | { |
| | | SN = "", |
| | | SALES_ORDER = wo.SALES_ORDER, |
| | | WORK_ORDER = wo.ORDER_NO, |
| | | BATCH_NO = "", |
| | | SCAN_QTY = input.Data.ToInt32() |
| | | } |
| | | }; |
| | | |
| | | //要存入的批次入库单数据 |
| | | int n = InStoreScanInfos.Where(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER).Count(); |
| | | if (!ErpProdInBths.Any(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER)) |
| | | { |
| | | Info.ErpProdInBth.AUTH_ORG = OrgCode; |
| | | Info.ErpProdInBth.BATCH_NO = ""; |
| | | Info.ErpProdInBth.CREATE_USER = UserCode; |
| | | Info.ErpProdInBth.CREATE_TIME = DateTime.Now; |
| | | Info.ErpProdInBth.SCANED_DATE = DateTime.Now; |
| | | Info.ErpProdInBth.HANDLED_DATE = DateTime.Now; |
| | | Info.ErpProdInBth.IS_SCANED = "Y"; |
| | | Info.ErpProdInBth.ORDER_NO = UserCode; |
| | | Info.ErpProdInBth.IS_HANDLED = "N"; |
| | | Info.ErpProdInBth.CartonQty = n == 0 ? 1 : n; |
| | | BIZ_ERP_PROD_IN prodIn = new() |
| | | { |
| | | AUTH_ORG = OrgCode, |
| | | BILLCODE = UserCode, |
| | | BILLDATE = DateTime.Now, |
| | | STATUS = 0, |
| | | HANDLED = -1, |
| | | WAREHOUSECODE = "", |
| | | SOURCECODE = Info.ErpProdInBth.WORK_ORDER, |
| | | HANDLED_DATE = DateTime.Now, |
| | | }; |
| | | ErpProdInBths.Add(Info.ErpProdInBth); |
| | | ErpProdIns.Add(prodIn); |
| | | } |
| | | //else |
| | | //{ |
| | | // if (!InStoreScanInfos.Any(q => q.WORK_ORDER == Info?.ErpProdInBth.WORK_ORDER && q.SN == CurSN)) |
| | | // { |
| | | // var erpbth = ErpProdInBths.Where(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER).FirstOrDefault(); |
| | | // if (!erpbth.IsNullOrEmpty()) |
| | | // { |
| | | // erpbth.SCAN_QTY += Info.InStoreScanInfo.SCAN_QTY.ToDouble(); |
| | | // erpbth.CartonQty = n + 1; |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | //生成打印实体 |
| | | if (RcvRptInput.PrintJsons.Count == 0) |
| | | { |
| | | RcvRptInput.PrintJsons.Add(new() |
| | | { |
| | | ID = Guid.NewGuid().ToString("N"), |
| | | Items = new() { |
| | | Info.ErpProdInBth |
| | | } |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | //拼分页 |
| | | bool isAdded = false; |
| | | foreach (var item in RcvRptInput.PrintJsons) |
| | | { |
| | | if (!item.Items.Any(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER)) |
| | | { |
| | | if (item.Items.Count < pageSize) |
| | | { |
| | | item.Items.Add(Info.ErpProdInBth); |
| | | isAdded = true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | isAdded = true; |
| | | } |
| | | } |
| | | if (!isAdded) |
| | | { |
| | | RcvRptInput.PrintJsons.Add(new() |
| | | { |
| | | ID = Guid.NewGuid().ToString("N"), |
| | | Items = new() { |
| | | Info.ErpProdInBth |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | //保存数据库 |
| | | var db = Business.Biz.Db; |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | var x = db.Storageable(ErpProdInBths, $"InStoreOrderNo_{UserCode}") |
| | | .WhereColumns(t => new { t.ORDER_NO, t.WORK_ORDER, t.GHOST_ROW }) |
| | | .ToStorage(); |
| | | y.AsInsertable.ExecuteCommand(); |
| | | y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); |
| | | action.Data.Data = temps; |
| | | action.LocaleMsg = Biz.L("WMS.RePrint.ScanItem.ScanSuccessed"); |
| | | x.AsInsertable.ExecuteCommand(); |
| | | x.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); |
| | | |
| | | //var s = db.Storageable(ErpProdInSns, $"InStoreOrderNo_{UserCode}") |
| | | // .WhereColumns(t => new { t.CARTONNO, t.SN, t.GHOST_ROW }) |
| | | // .ToStorage(); |
| | | //s.AsInsertable.ExecuteCommand(); |
| | | //s.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); |
| | | }); |
| | | if (!dbTran.IsSuccess) |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); |
| | | this.Close(!dbTran.IsSuccess); |
| | | throw dbTran.ErrorException; |
| | | } |
| | | RcvRptInput.RcvRptDocBases = new(); |
| | | RcvRptInput.labels = new(); |
| | | RcvRptInput.ErpProdInBths = ErpProdInBths; |
| | | RcvRptInput.userId = UserCode; |
| | | inStoreInfos = new() |
| | | { |
| | | ErpProdInBths = ErpProdInBths, |
| | | InStoreScanInfos = InStoreScanInfos, |
| | | }; |
| | | |
| | | action.Data.Data = inStoreInfos; |
| | | action.LocaleMsg = Biz.L("WMS.InSemiProd.ScanItem.ScanSuccessed"); //$"工单条码[{input.SN}]扫描成功,请填入工单数量后点提交" |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | return action; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 调用U9C接口生成入库单 |
| | | /// </summary> |
| | | /// <param name="code"></param> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction<RcvRptDocCreateInput>> GenerateInStoreOrder() |
| | | { |
| | | var action = new ApiAction<RcvRptDocCreateInput>(); |
| | | try |
| | | { |
| | | //如果扫描记录为0 |
| | | if (!RcvRptInput.ErpProdInBths.Any(q => q.IS_HANDLED == "N")) |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = Biz.L($"没有要入库的产品数据,请扫描包装完成的箱二维码重新生成入库单据!"); |
| | | return action; |
| | | } |
| | | if (RcvRptInput.RcvRptDocBases.IsNullOrEmpty() || RcvRptInput.RcvRptDocBases.Count == 0) |
| | | { |
| | | foreach (var item in RcvRptInput.ErpProdInBths) |
| | | { |
| | | var DocBase = new RcvRptDocBase() |
| | | { |
| | | WorkOrder = item.WORK_ORDER, |
| | | ItemCode = item.ITEM_CODE, |
| | | WhCode = "10105", |
| | | PkgQty = item.SCAN_QTY.ToInt32(), |
| | | CompleteQty = item.SCAN_QTY.ToInt32(), |
| | | OutputType = 0, |
| | | StorageType = 4, |
| | | DocState = 1, |
| | | Status = "N" |
| | | }; |
| | | if (!RcvRptInput.RcvRptDocBases.Any(q => q.WorkOrder == item.WORK_ORDER)) |
| | | { |
| | | RcvRptInput.RcvRptDocBases.Add(DocBase); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = Biz.L($"有存在未提交的入库单,不能生成入库单"); |
| | | return action; |
| | | } |
| | | action = await _IMES_U9C.RcvRptDocCreate(RcvRptInput); |
| | | if (action.IsSuccessed) |
| | | { |
| | | foreach (var sn in ErpProdInSns) |
| | | { |
| | | var d = action.Data.ErpProdInBths.Where(q => q.WORK_ORDER == sn.SOURCECODE).FirstOrDefault(); |
| | | if (!d.IsNullOrEmpty()) |
| | | { |
| | | sn.BUSINESSCODE = d.ORDER_NO; |
| | | sn.UPDATE_USER = UserCode; |
| | | sn.UPDATE_TIME = DateTime.Now; |
| | | } |
| | | } |
| | | foreach (var p in ErpProdIns) |
| | | { |
| | | var d = action.Data.ErpProdInBths.Where(q => q.WORK_ORDER == p.SOURCECODE).FirstOrDefault(); |
| | | if (!d.IsNullOrEmpty()) |
| | | { |
| | | p.BILLCODE = d.ORDER_NO; |
| | | p.UPDATE_USER = UserCode; |
| | | p.UPDATE_TIME = DateTime.Now; |
| | | p.HANDLED = 0; |
| | | } |
| | | } |
| | | //保存数据库 |
| | | var db = Business.Biz.Db; |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Updateable(ErpProdInSns, $"InStoreOrderNo_{UserCode}").UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.BUSINESSCODE }).ExecuteCommand(); |
| | | |
| | | var x = db.Storageable(ErpProdIns, $"InStoreOrderNo_{UserCode}") |
| | | .WhereColumns(t => new { t.BILLCODE, t.SOURCECODE, t.GHOST_ROW }) |
| | | .ToStorage(); |
| | | x.AsInsertable.ExecuteCommand(); |
| | | x.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); |
| | | }); |
| | | if (!dbTran.IsSuccess) |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); |
| | | this.Close(!dbTran.IsSuccess); |
| | | throw dbTran.ErrorException; |
| | | } |
| | | } |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | action.CatchExceptionWithLog(ex, $"调用U9C接口生成入库单异常"); |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | public override bool Close(bool needSaveHistoryLog = false) |