| | |
| | | using Tiger.Model.Entitys.MES.BizPrintInstoreDoc; |
| | | using System.Drawing.Printing; |
| | | using Tiger.Model.Entitys.MES.Position; |
| | | using System.Drawing.Drawing2D; |
| | | using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; |
| | | using Tiger.Model.Minsun; |
| | | |
| | | namespace Tiger.Business.MES.Transaction |
| | | { |
| | |
| | | ApiHost = apiHost; |
| | | OrgCode = input.OrgCode; |
| | | pageSize = input.pageSize; |
| | | _GetScannedList(); |
| | | CurBatchNo = !inStoreInfos.IsNullOrEmpty() && inStoreInfos.InStoreScanInfos.Count > 0 ? InStoreScanInfos[0].BATCH_NO : DateTime.Now.ToString("yyyyMMddHHmmss"); |
| | | Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]"); |
| | | return this; |
| | | } |
| | |
| | | public long UserId { get; set; } |
| | | public string OrgCode { get; set; } |
| | | public string CurSN { get; set; } |
| | | public string CurBatchNo { 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 Propertys & Variables |
| | | |
| | | #region Functions |
| | | |
| | | public ApiAction<InStoreInfos> GetInStoreInfos() |
| | | { |
| | | return new() { Data = inStoreInfos }; |
| | | } |
| | | /// <summary> |
| | | /// 扫描条码 |
| | | /// </summary> |
| | |
| | | if (!ErpProdInBths.Any(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER)) |
| | | { |
| | | Info.ErpProdInBth.AUTH_ORG = OrgCode; |
| | | Info.ErpProdInBth.BATCH_NO = CurBatchNo; |
| | | Info.ErpProdInBth.CREATE_USER = UserCode; |
| | | Info.ErpProdInBth.CREATE_TIME = DateTime.Now; |
| | | Info.ErpProdInBth.SCANED_DATE = DateTime.Now; |
| | |
| | | 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 (!erpbth.IsNullOrEmpty()) |
| | | { |
| | | erpbth.SCAN_QTY += Info.InStoreScanInfo.SCAN_QTY.ToDouble(); |
| | | Info.ErpProdInBth.CartonQty++; |
| | | erpbth.CartonQty = n + 1; |
| | | } |
| | | } |
| | | } |
| | |
| | | isAdded = true; |
| | | } |
| | | } |
| | | if (isAdded) |
| | | if (!isAdded) |
| | | { |
| | | RcvRptInput.PrintJsons.Add(new() |
| | | { |
| | |
| | | //暂存扫码数据 |
| | | if (!InStoreScanInfos.Any(q => q.WORK_ORDER == Info?.ErpProdInBth.WORK_ORDER && q.SN == CurSN)) |
| | | { |
| | | Info.InStoreScanInfo.BATCH_NO = CurBatchNo; |
| | | InStoreScanInfos.Add(Info.InStoreScanInfo); |
| | | } |
| | | var wipPkgs = Biz.Db.Ado.UseStoredProcedure().SqlQuery<MES_WIP_PKG>("SP_MES_GET_ITEM_PKG", new SugarParameter("root", CurSN)); |
| | | int maxLevel = wipPkgs.Max(p => p.LEVEL); |
| | | foreach (var item in wipPkgs.Where(q=> q.LEVEL == maxLevel)) |
| | | foreach (var item in wipPkgs.Where(q => q.LEVEL == maxLevel)) |
| | | { |
| | | var scanResult = new BIZ_ERP_PROD_IN_SN |
| | | { |
| | | AUTH_ORG = OrgCode, |
| | | ID = Guid.NewGuid().ToString(), |
| | | CARTONNO = CurSN, |
| | | SN = item.SN, |
| | |
| | | this.Close(!dbTran.IsSuccess); |
| | | throw dbTran.ErrorException; |
| | | } |
| | | action.Data = new() { |
| | | RcvRptInput.RcvRptDocBases = new(); |
| | | RcvRptInput.labels = new(); |
| | | RcvRptInput.ErpProdInBths = ErpProdInBths; |
| | | RcvRptInput.userId = UserCode; |
| | | inStoreInfos = new() |
| | | { |
| | | ErpProdInBths = ErpProdInBths, |
| | | InStoreScanInfos = InStoreScanInfos, |
| | | }; |
| | | action.Data = inStoreInfos; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// </summary> |
| | | /// <param name="code"></param> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction<RcvRptDocCreateInput>> GenerateInStoreOrder(RcvRptDocCreateInput input) |
| | | public async Task<ApiAction<RcvRptDocCreateInput>> GenerateInStoreOrder() |
| | | { |
| | | var action = new ApiAction<RcvRptDocCreateInput>(); |
| | | try |
| | | { |
| | | //input.RcvRptDocBases = new() |
| | | //{ |
| | | // new(){ |
| | | // WorkOrder = item.WORK_ORDER, |
| | | // ItemCode = item.ITEM_CODE, |
| | | // WhCode = "10105", |
| | | // PkgQty = item.SCAN_QTY, |
| | | // CompleteQty = item.SCAN_QTY, |
| | | // OutputType = 0, |
| | | // StorageType = 4, |
| | | // DocState = 1, |
| | | // Status = "N" |
| | | // } |
| | | //}; |
| | | action = await _IMES_U9C.RcvRptDocCreate(input); |
| | | |
| | | //保存数据库 |
| | | var db = Business.Biz.Db; |
| | | var dbTran = db.UseTran(() => |
| | | //如果扫描记录为0 |
| | | if (!RcvRptInput.ErpProdInBths.Any(q => q.IS_HANDLED == "N")) |
| | | { |
| | | //var x = db.Storageable(ErpProdInBths, $"InStoreOrderNo_{UserCode}") |
| | | // .WhereColumns(t => new { t.ORDER_NO, t.WORK_ORDER, t.GHOST_ROW }) |
| | | // .ToStorage(); |
| | | //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) |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = Biz.L($"没有要入库的产品数据,请扫描包装完成的箱二维码重新生成入库单据!"); |
| | | return action; |
| | | } |
| | | if (RcvRptInput.RcvRptDocBases.IsNullOrEmpty() || RcvRptInput.RcvRptDocBases.Count == 0) |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); |
| | | this.Close(!dbTran.IsSuccess); |
| | | throw dbTran.ErrorException; |
| | | foreach (var item in RcvRptInput.ErpProdInBths) |
| | | { |
| | | var DocBase = new RcvRptDocBase() |
| | | { |
| | | WorkOrder = item.WORK_ORDER, |
| | | ItemCode = item.ITEM_CODE, |
| | | WhCode = "10105", |
| | | PkgQty = item.SCAN_QTY, |
| | | CompleteQty = item.SCAN_QTY, |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询对应的条码 |
| | | /// 查询已扫描列表 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction<RcvRptDocCreateInput>> GetScannedBarcodes() |
| | | public async Task<ApiAction<InStoreInfos>> GetScannedList() |
| | | { |
| | | var action = new ApiAction<RcvRptDocCreateInput>(); |
| | | var action = new ApiAction<InStoreInfos>(); |
| | | try |
| | | { |
| | | //var query = await Biz.Db.Queryable<BIZ_ERP_RECEIPT_SN, BAS_ITEM>((t, m) => |
| | | // new JoinQueryInfos( |
| | | // JoinType.Left, t.ITEM_CODE == m.ITEM_CODE |
| | | // )) |
| | | // .Where((t, m) => t.CREATE_USER == UserCode |
| | | // //&& t.WAREHOUSECODE.ToUpper() == WarehouseCode.ToUpper() |
| | | // && t.STATUS == WMS_ITEM.STATUSs.Counted.GetValue() |
| | | // && t.ITEM_CODE.ToUpper() == MaterialCode.ToUpper() |
| | | // && t.BILLCODE == UserCode |
| | | // && t.AUTH_ORG == OrgCode) |
| | | // .Select((t, m) => new Model.Minsun.CustSupplyCheckDetail |
| | | // { |
| | | // Barcode = t.SN, |
| | | // BarcodeQty = t.SCANQTY, |
| | | // Unit = m.UNIT |
| | | // }) |
| | | // .ToListAsync(); |
| | | _GetScannedList(); |
| | | action.Data = inStoreInfos; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | action.CatchExceptionWithLog(ex, $"查询对应的条码异常"); |
| | | action.CatchExceptionWithLog(ex, $"查询已扫描列表异常"); |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 从数据库读回操作者原本操作的记录 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private RcvRptDocCreateInput _GetScannedList() |
| | | { |
| | | RcvRptInput.RcvRptDocBases = new(); |
| | | RcvRptInput.ErpProdInBths = new(); |
| | | RcvRptInput.PrintJsons = new(); |
| | | RcvRptInput.labels = new(); |
| | | RcvRptInput.userId = UserCode; |
| | | ErpProdInSns.Clear(); |
| | | ErpProdIns.Clear(); |
| | | ErpProdInBths.Clear(); |
| | | InStoreScanInfos.Clear(); |
| | | RcvRptInput.ErpProdInBths = Biz.Db.Queryable<BIZ_ERP_PROD_IN_BTH>() |
| | | .Where(q => q.BATCH_NO == SqlFunc.Subqueryable<BIZ_ERP_PROD_IN_BTH>().Where(s => s.ORDER_NO == UserCode && s.GHOST_ROW == false).Select(s => s.BATCH_NO)) |
| | | .IncludesAllFirstLayer().ToList(); |
| | | foreach (var item in RcvRptInput.ErpProdInBths) |
| | | { |
| | | var values = item.ProdInSns.GroupBy(x => x.CARTONNO) |
| | | .Select(g => new InStoreScanInfo() { SN = g.Key, SALES_ORDER = item.SALES_ORDER, BATCH_NO = item.BATCH_NO, WORK_ORDER = item.WORK_ORDER, SCAN_QTY = g.Sum(x => x.Qty).ToDouble() }); |
| | | foreach (var t in values) |
| | | { |
| | | InStoreScanInfos.Add(t); |
| | | } |
| | | item.CartonQty = values.Count(); |
| | | |
| | | ErpProdIns.Add(new() |
| | | { |
| | | AUTH_ORG = OrgCode, |
| | | BILLCODE = UserCode, |
| | | BILLDATE = DateTime.Now, |
| | | STATUS = 0, |
| | | HANDLED = -1, |
| | | WAREHOUSECODE = "", |
| | | SOURCECODE = item.WORK_ORDER, |
| | | HANDLED_DATE = DateTime.Now, |
| | | }); |
| | | ErpProdInSns.AddRange(item.ProdInSns); |
| | | |
| | | //生成打印实体 |
| | | if (RcvRptInput.PrintJsons.Count == 0) |
| | | { |
| | | RcvRptInput.PrintJsons.Add(new() |
| | | { |
| | | ID = Guid.NewGuid().ToString("N"), |
| | | Items = new() { |
| | | item |
| | | } |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | //拼分页 |
| | | bool isAdded = false; |
| | | foreach (var p in RcvRptInput.PrintJsons) |
| | | { |
| | | if (!p.Items.Any(q => q.WORK_ORDER == item.WORK_ORDER)) |
| | | { |
| | | if (p.Items.Count < pageSize) |
| | | { |
| | | p.Items.Add(item); |
| | | isAdded = true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | isAdded = true; |
| | | } |
| | | } |
| | | if (!isAdded) |
| | | { |
| | | RcvRptInput.PrintJsons.Add(new() |
| | | { |
| | | ID = Guid.NewGuid().ToString("N"), |
| | | Items = new() { |
| | | item |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | ErpProdInBths = RcvRptInput.ErpProdInBths; |
| | | |
| | | inStoreInfos = new() |
| | | { |
| | | ErpProdInBths = ErpProdInBths, |
| | | InStoreScanInfos = InStoreScanInfos, |
| | | }; |
| | | return RcvRptInput; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 删除箱 |
| | | /// </summary> |
| | | /// <param name="SN"></param> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction> Delete(string CartonNo) |
| | | { |
| | | var action = new ApiAction(); |
| | | try |
| | | { |
| | | var ErpProdInSn = ErpProdInSns.Where(s => s.CARTONNO == CartonNo).ToList(); |
| | | BIZ_ERP_PROD_IN_BTH erpbth = new(); |
| | | if (!ErpProdInSn.IsNullOrEmpty()) |
| | | { |
| | | erpbth = ErpProdInBths.Where(q => q.WORK_ORDER == ErpProdInSn[0].SOURCECODE).FirstOrDefault(); |
| | | if (!erpbth.IsNullOrEmpty()) |
| | | { |
| | | erpbth.SCAN_QTY -= ErpProdInSn.Count(q => q.CARTONNO == CartonNo); |
| | | erpbth.CartonQty--; |
| | | } |
| | | } |
| | | |
| | | //保存数据库 |
| | | var db = Business.Biz.Db; |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Deleteable<BIZ_ERP_PROD_IN_SN>().Where(x => x.BUSINESSCODE == UserCode && x.CARTONNO == CartonNo).ExecuteCommand(); |
| | | db.Updateable(erpbth, $"InStoreOrderNo_{UserCode}").ExecuteCommand(); |
| | | if (erpbth.CartonQty == 0) |
| | | { |
| | | db.Deleteable(erpbth).ExecuteCommand(); |
| | | } |
| | | }); |
| | | if (!dbTran.IsSuccess) |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction delete exception"); |
| | | this.Close(!dbTran.IsSuccess); |
| | | throw dbTran.ErrorException; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | action.CatchExceptionWithLog(ex, $"查询已扫描列表异常"); |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 清除 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<ApiAction> Clear() |
| | | { |
| | | var action = new ApiAction(); |
| | | try |
| | | { |
| | | RcvRptInput = new(); |
| | | ProdInBatchs = new() { }; |
| | | ErpProdInBths = new() { }; |
| | | ErpProdIns = new(); |
| | | /// <summary> |
| | | /// 扫描列表 |
| | | /// </summary> |
| | | InStoreScanInfos = new() { }; |
| | | ErpProdInSns = new(); |
| | | inStoreInfos = new() { }; |
| | | |
| | | //保存数据库 |
| | | var db = Business.Biz.Db; |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Deleteable<BIZ_ERP_PROD_IN_BTH>().Where(x => x.ORDER_NO == UserCode && x.IS_HANDLED == "N").ExecuteCommand(); |
| | | db.Deleteable<BIZ_ERP_PROD_IN_SN>().Where(x => x.BUSINESSCODE == UserCode).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, $"查询已扫描列表异常"); |
| | | } |
| | | return action; |
| | | } |