using Apache.NMS.ActiveMQ.Commands; using Newtonsoft.Json; using Rhea.Common; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Entitys.WMS.Api; using Tiger.Model.Minsun; namespace Tiger.Business.WMS { /// /// 补印条码 /// public class RePrintBarcode : IRePrintBarcode { #region Propertys & Variables public string UserCode { get; set; } public long UserId { get; set; } public string OrgCode { get; set; } public List invs { get; set; } = new(); public Inventory CurInv { get; set; } #endregion /// /// 补印条码 /// /// /// public ApiAction ScanItem(ReprintEntitys input) { var action = new ApiAction(); try { if (input.SN.IsNullOrEmpty()) { action.IsSuccessed = false; action.LocaleMsg = Biz.L("条码不能为空"); return action; } UserCode = input.AuthOption.UserId; OrgCode = input.AuthOption.OrgCode; //解析条码 Result result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true); if (!result.IsSuccessed) { action.IsSuccessed = false; action.LocaleMsg = result.LocaleMsg; return action; } CurInv = result.Data as Inventory; if (!CurInv.isExists) { //action.IsSuccessed = false; //action.LocaleMsg = Biz.L($"条码不存在"); action.Data = new ReprintReturnEntitys() { Barcode = CurInv.Barcode.SN, MaterialCode = CurInv.Barcode.ItemCode, MaterialName = CurInv.Barcode.ItemName, MaterialStandard = CurInv.Barcode.ItemName, DateCode = (DateTime)CurInv.Barcode.ProdDate, ScanQty = (decimal)CurInv.Barcode.Qty, Unit = CurInv.Barcode.Unit, VenderSName = "" }; action.LocaleMsg = Biz.L($"条码[{input.SN}]信息返回成功,如果数量不对请输入数量打印"); return action; } var suppEnt = Biz.Db.Queryable().Where(x => x.SUPP_CODE == CurInv.Items[0].SUPP_CODE).First(); action.Data = new ReprintReturnEntitys() { Barcode = CurInv.CurPkg.SN, MaterialCode = CurInv.ItemInfo.ITEM_CODE, MaterialName = CurInv.ItemInfo.ITEM_NAME, MaterialStandard = CurInv.ItemInfo.SPEC, DateCode = CurInv.CurPkg.PRINT_DATE, ScanQty = CurInv.CurPkg.QTY, Unit = CurInv.ItemInfo.UNIT, VenderSName = suppEnt?.SUPP_NAME_CN }; action.LocaleMsg = Biz.L($"条码[{input.SN}]信息返回成功,如果数量不对请输入数量打印"); } catch (Exception ex) { action.CatchExceptionWithLog(ex, $"补印异常"); } return action; } /// /// 供应商退料 /// /// /// public ApiAction ReturnBarcodeRecord(ReturnBarcodeInput input) { var action = new ApiAction(); try { DbClient db = Biz.DataSource["XCSJ"].Client; var findBarcode = db.Queryable().Where(t => t.BARCODE.ToUpper() == input.Barcode.ToUpper()).First(); //await _barcodeRepository.FirstOrDefaultAsync(t => t.Barcode.ToUpper() == input.Barcode.ToUpper()); if (findBarcode == null) { action.IsSuccessed = false; action.Message = $"条码信息有误"; return action; } //克隆对象 var deserializeSettings = new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace }; var nReturnBarcodeNo = $"{input.Barcode}-T"; //条码一 var nReturnBarcode1 = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(findBarcode), deserializeSettings); nReturnBarcode1.BARCODE = nReturnBarcodeNo; //nReturnBarcode1.BarcodeStatus = (int)Domain.InvStorageInfoSides.BarcodeStatus.Outstock; //出库状态 nReturnBarcode1.PACKQTY = input.Qty; nReturnBarcode1.CURRENTQTY = input.Qty; nReturnBarcode1.INITIALQTY = input.Qty; nReturnBarcode1.Id = Guid.NewGuid().ToString(); //生成barcode操作 //await _barcodeRepository.InsertAsync(nReturnBarcode1); findBarcode.BARCODESTATUS = WMS_BARCODE.InvStorageInfoSides.BarcodeStatus.InValid.GetValue(); //(int)Domain.InvStorageInfoSides.BarcodeStatus.InValid;//状态为无效 //await _barcodeRepository.UpdateAsync(findBarcode); //新增SRMSNList var nBarcodeList = new WMS_SRMSNList() { SOURCETYPE = "WMS", MATERIALCODE = findBarcode.MATERIALCODE, DeliveryNo = findBarcode.SOURCECODE, SmallBarcode = nReturnBarcodeNo, BigBarcode = findBarcode.CARTON, OuterBarcode = findBarcode.PALLET, IncludeQty = input.Qty, production_date = DateTime.Now }; //await _wms_srmsnlistRepository.InsertAsync(nBarcodeList); //var nWorkShopLotInfo = db.Queryable() //await _workShopLotInfoRepository.FirstOrDefaultAsync(t => t.Barcode.ToUpper() == input.Barcode.ToUpper()); //if (nWorkShopLotInfo == null) //{ // throw new UserFriendlyException("扫描的条码不在线边仓中,无法进行退料"); //} //var _nWorkShopLotInfo = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(nWorkShopLotInfo), deserializeSettings); //_nWorkShopLotInfo.Barcode = nReturnBarcodeNo; //_nWorkShopLotInfo.LastQty = input.Qty; //_nWorkShopLotInfo.Id = new Guid(); //await _workShopLotInfoRepository.InsertAsync(_nWorkShopLotInfo); //获取供应商信息 var vender = db.Queryable().Where(t => t.VenderCode == findBarcode.SUPPLIERCODE).First(); //await _venderRepository.FirstOrDefaultAsync(t => t.VenderCode == findBarcode.SupplierCode); DbClient _db = Biz.DataSource["XCSJ"].Client; //保存到数据库 var dbTran = _db.UseTran(() => { _db.Insertable(nReturnBarcode1).ExecuteCommand(); _db.Updateable(findBarcode).ExecuteCommand(); //_db.Utilities.PageEach(pkgs, 1000, pageList => //{ // var x = _db.Storageable(pageList, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // x.BulkCopy(); // x.BulkUpdate(); //.IgnoreColumns(x => x.ID); //}); //_db.Fastest().BulkCopy(hiss);//插入 }); if (!dbTran.IsSuccess) { Logger.Scheduler.Error($"退料异常,错误:[{dbTran.ErrorException.Message}]"); } action.Data = new ReturnBarcodeReponse { Barcode = nReturnBarcodeNo, VenderSName = vender != null ? vender.VenderName : "" }; } catch (Exception ex) { Logger.Scheduler.Error($"退料异常,错误:[{ex.Message}]"); } return action; } /// /// 退料扫描 /// /// /// public ApiAction ScanReprintBarcode(IncomingInventoryInput input) { var action = new ApiAction(); try { DbClient db = Biz.DataSource["XCSJ"].Client; if (input.Barcode.IsNullOrEmpty()) { action.IsSuccessed = false; action.LocaleMsg = Biz.L("请输入或扫描正确的条码"); return action; } var nDisassembleBarcode = iWMS.SplitFullBarcode(input.Barcode).Data; //await _commonService.SplitFullBarcode(input.Barcode, true); WMS_PO_H nOrderHeader = null; List nOrderDetails = new List(); if (nDisassembleBarcode.OrderNo != null) { //验证订单是否存在 nOrderHeader = db.Queryable().Where(x => x.BILLCODE == nDisassembleBarcode.OrderNo).First(); //await _headerRepository.FirstOrDefaultAsync(x => x.BillCode.ToUpper() == nDisassembleBarcode.OrderNo.ToUpper()); //if (nOrderHeader == null) // throw new UserFriendlyException("条码对应的采购订单不存在"); if (nOrderHeader != null && nDisassembleBarcode.MaterialCode != null) { //一个订单中存在多行相同物料的情况() nOrderDetails = db.Queryable().Where(x => x.BILLCODE == nOrderHeader.BILLCODE && x.MATERIALCODE == nDisassembleBarcode.MaterialCode).ToList(); //await _detailRepository.GetAll().Where(x => x.BillCode.ToUpper() == nOrderHeader.BillCode.ToUpper() && x.MaterialCode.ToUpper() == nDisassembleBarcode.MaterialCode.ToUpper()).AsNoTracking().ToListAsync(); //if (!nOrderDetails.Any()) // throw new UserFriendlyException("条码对应的订单没有该物料的采购信息"); } } var t = 1; //定义条码值 var nTempResult = new RePrintScanTempOutput { BillCode = nOrderHeader != null ? nOrderHeader.BILLCODE : "", BillLine = nOrderDetails.Count > 0 ? nOrderDetails.First().BILLLINE : 0, //存在多行相同物料时,这个字段为null,但目前后续的表结构不支持这么操作 MaterialCode = nDisassembleBarcode.MaterialCode, MaterialName = nDisassembleBarcode.MaterialName, MaterialStandard = nDisassembleBarcode.MaterialStandard, SupplierCode = nOrderHeader != null ? nOrderHeader.SUPPLIERCODE : "", Barcode = nDisassembleBarcode.Barcode, //批次号即为条码 DateCode = nDisassembleBarcode.LotDate, LotNo = nDisassembleBarcode.Barcode, StateFlag = nDisassembleBarcode.StateFlag, ScanQty = nDisassembleBarcode.LotQty, //批次数量 Unit = nDisassembleBarcode.Unit }; action.Data = new RePrintScanReponse { ActionType = "SUCCESS", ErrorMessage = "验证通过", Result = nTempResult }; } catch (Exception ex) { action.CatchExceptionWithLog(ex, $"退料打印异常"); } return action; } /// /// 新系统退料扫描 /// /// /// public ApiAction ScanReprintBarcodeNew(IncomingInventoryInput input) { var action = new ApiAction(); try { DbClient db = Biz.Db; if (input.Barcode.IsNullOrEmpty()) { action.IsSuccessed = false; action.LocaleMsg = Biz.L("请输入或扫描正确的条码"); return action; } //解析条码 Result result = WMS_ITEM_Biz.WmsItem.Get(input.Barcode, new AuthOption { ByOrg = true, CurOrg = "DGXC", UserId = "admin" }, false); if (!result.IsSuccessed) { action.IsSuccessed = false; action.LocaleMsg = result.LocaleMsg; return action; } var CurInv = result.Data as Inventory; var newItem = CurInv.isExists ? CurInv.Items[0] : new WMS_ITEM() { AUTH_ORG = "DGXC", SN = CurInv.Barcode.SN, ITEM_CODE = CurInv.Barcode.ItemCode, STATUS = WMS_ITEM.STATUSs.Returned.GetValue(), QTY = input.Qty, PROD_DATE = (DateTime)CurInv.Barcode.ProdDate, FIRST_IN_DATE = DateTime.Now, TRANS_CODE = "供应商退料", TRANS_LINE = "", TRANS_NO = CurInv.Barcode.OrderNo, SUPP_CODE = CurInv.Barcode.SupplierCode, CARTON_NO = "", PALLET_NO = "", IS_LOCKED = "N", SOURCE_CODE = "供应商退料", SOURCE_LINE = "", SOURCE_ORDER = CurInv.Barcode.OrderNo, CREATE_USER = "供应商退料", UPDATE_USER = "供应商退料", }; newItem.TRANS_CODE = "供应商退料"; newItem.TRANS_LINE = ""; newItem.SOURCE_CODE = "供应商退料"; newItem.SOURCE_LINE = ""; newItem.SOURCE_ORDER = CurInv.Barcode.OrderNo; var strSn = newItem.SN.Split("_"); var cutSerial = strSn.Length == 1 ? "1" : $"{Convert.ToInt32(strSn[1].Substring(2)) + 1}"; var orglSn = strSn[0]; var _sn = $"{orglSn}_CT{cutSerial}"; newItem.SN = _sn; newItem.QTY = input.Qty; var item = db.Queryable().Where(x => x.SN == _sn).First(); newItem.ID = item != null ? item.ID : newItem.ID; var oPkg = db.Queryable().Where(x => x.SN == _sn).First(); var pkg = CurInv.isExists ? CurInv.CurPkg : new WMS_ITEM_PKG() { AUTH_ORG = "DGXC", SN = _sn, PARENT_SN = "", PKG_TYPE = CurInv.Barcode.SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (CurInv.Barcode.SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), ITEM_CODE = CurInv.Barcode.ItemCode, QTY = input.Qty, TRANS_CODE = "供应商退料", TRANS_NO = CurInv.Barcode.OrderNo, SUPP_CODE = CurInv.Barcode.SupplierCode, }; pkg.ID = oPkg != null ? oPkg.ID : pkg.ID; pkg.SN = _sn; pkg.TRANS_CODE = "供应商退料"; pkg.TRANS_NO = CurInv.Barcode.OrderNo; pkg.QTY = input.Qty; action.Data = new RePrintScanReponse { ActionType = "SUCCESS", ErrorMessage = "验证通过", Result = new RePrintScanTempOutput { BillCode = "", BillLine = 0, //存在多行相同物料时,这个字段为null,但目前后续的表结构不支持这么操作 MaterialCode = !CurInv.isExists ? CurInv.Barcode.ItemCode : CurInv.ItemInfo?.ITEM_CODE, MaterialName = !CurInv.isExists ? CurInv.Barcode.ItemName : CurInv.ItemInfo?.ITEM_NAME, MaterialStandard = !CurInv.isExists ? CurInv.Barcode.ItemName : CurInv.ItemInfo?.ITEM_NAME, SupplierCode = !CurInv.isExists ? CurInv.Barcode.SupplierCode : CurInv.Items[0].SUPP_CODE, Barcode = _sn, //批次号即为条码 DateCode = !CurInv.isExists ? (DateTime)CurInv.Barcode.ProdDate : CurInv.Items[0].PROD_DATE, LotNo = _sn, StateFlag = "", ScanQty = input.Qty, //批次数量 Unit = !CurInv.isExists ? CurInv.Barcode.Unit : CurInv.ItemInfo?.UNIT } }; DbClient _db = Biz.Db; //保存到数据库 var dbTran = _db.UseTran(() => { _db.Storageable(newItem, "Supplier").ExecuteCommand(); _db.Insertable(new WMS_ITEM_HIS(newItem, "供应商退料打印"), "Supplier").ExecuteCommand(); _db.Storageable(pkg, "Supplier").ExecuteCommand(); //_db.Fastest().BulkCopy(hiss);//插入 }); if (!dbTran.IsSuccess) { Logger.Scheduler.Error($"退料异常,错误:[{dbTran.ErrorException.Message}]"); } } catch (Exception ex) { action.CatchExceptionWithLog(ex, $"退料打印异常"); } return action; } } }