using Newtonsoft.Json; using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tiger.Business.SqlSugarHepler; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Entitys.WMS.DTOS; namespace Tiger.Business.WMS.Transaction { public class Resell : WMSTransactionBase, IResell { /// /// T100接口URL /// public string t100Url { get; set; } = @"http://172.18.8.11/wstopprd/ws/r/awsp920"; /// /// 事务初始化函数 /// /// /// /// /// /// public IResell Init(string id, string userCode, string apiHost, string orgCode) { TransID = id; UserCode = userCode; ApiHost = apiHost; OrgCode = orgCode; Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]"); return this; } #region Propertys & Variables public string BillCode { get; set; } public string TARGET_ORG { get; set; } public string UserCode { get; set; } public long UserId { get; set; } public string RackCode { get; set; } public string WarehouseCode { get; set; } public string WarehouseName { get; set; } public string OrgCode { get; set; } public WMS_SHELF Shelf { get; set; } public ResellPuton ResellPuton1 { get; set; } public BIZ_ERP_SALE_OUT res { get; set; } #endregion /// /// 获取转卖单列表 /// /// /// /// public ApiAction> GetResellHeaders(int pageIndex, int pageSize, string orgcode, string billcode) { var action = new ApiAction>(); var query = Biz.Db.Queryable().Where(x => (x.STATUS == BIZ_ERP_SALE_OUT.STATUSs.INIT.GetValue() || x.STATUS == BIZ_ERP_SALE_OUT.STATUSs.WORKING.GetValue()) && x.AUTH_ORG == orgcode) .WhereIF(!billcode.IsNullOrEmpty(), x => x.BILLCODE.Contains(billcode)) .OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd")) .OrderBy(x => x.CREATE_TIME) .ToPage(pageIndex, pageSize); action.Data = query; return action; } /// /// 转卖单选择事件 /// /// /// public async Task> SelectOrder(ResellInput input) { var action = new ApiAction(); try { //SelectOrderOption = input.AuthOption; res = await Biz.Db.Queryable().Where(x => x.BILLCODE == input.ResellNo).Includes(q => q.DetailsWithGhost, d => d.ItemInfo).IncludesAllFirstLayer().FirstAsync(); //验证明细是否正确 if (!res.Details.Any()) { action.IsSuccessed = false; action.LocaleMsg = new("WMS.ProdMReq.SelectOrder.DtlsException", input.ResellNo); return action; } BillCode = input.ResellNo;//单号 TARGET_ORG = res.TARGET_ORG;//目标据点 //OrgCode//原据点 //WareHouseCode//扫描仓库 action.LocaleMsg = Biz.L("选择多角转卖单成功"); action.Data = new Resell_Input { BILLCODE = BillCode,//单据 WAREHOUSECODE = "",//原仓库 TARGET_WAREHOUSECODE = "",//目标仓库 AUTH_ORG = "",//原据点 TARGET_ORG = "",//目标据点 }; } catch (Exception ex) { action.CatchExceptionWithLog(ex, $"多角转卖单选择异常"); } return action; } /// /// 扫描物料并复核,如果物料已经完成移库则货架上亮灯提醒储位 /// public async Task ScanItem(ResellModel input) { var action = new ApiAction(); try { if (string.IsNullOrEmpty(input.SN)) { action.IsSuccessed = false; action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.SnEmptyFailure"); // $"条码不能为空!"; return action; } //货架为空则扫描的认为是货架 if (string.IsNullOrEmpty(RackCode)) { var _action = await ScanShelf(input.SN); action.LocaleMsg = _action.LocaleMsg; action.IsSuccessed = _action.IsSuccessed; if (!action.IsSuccessed) { action.Data = _action.Data; return action; } else { //调用T100接口传入WarehouseCode,修改业务表信息 var To100param = new Resell_Input { BILLCODE=BillCode }; var query = MaterialToErp(To100param); //调用t100或修改业务表时发生错误 if(query.IsSuccessed == false) { action.IsSuccessed = false; action.LocaleMsg = query.LocaleMsg; return action; } //返回信息 action.Data = new Resell_Input { BILLCODE=BillCode,//单据 WAREHOUSECODE= RackCode,//原仓库 TARGET_WAREHOUSECODE="",//目标仓库 AUTH_ORG=OrgCode,//原据点 TARGET_ORG=TARGET_ORG,//目标据点 }; } } else { action.IsSuccessed = false; action.LocaleMsg = Biz.L("该单已操作,请退出重新选单!"); return action; } } catch (Exception ex) { //取消当前操作 action.CatchExceptionWithLog(ex, $"扫描物料[{input.SN}]复核异常"); } return action; } /// /// 扫描货架或者储位 /// public async Task> ScanShelf(string Code) { var action = new ApiAction(); try { if (Code.IsNullOrEmpty()) { action.IsSuccessed = false; action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.ShelfCanNotEmpty"); return action; } ResellPuton1 = new ResellPuton(); // 查询货架信息 var whUnit = await Biz.Db.Queryable().Where(t => t.WH_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync(); // 扫描货架代码,且为智能货架 if (whUnit != null && whUnit.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue()) { ResellPuton1.WarehouseCode = whUnit.WH_CODE; ResellPuton1.RackCode = whUnit.SHELF_CODE; ResellPuton1.ShelfType = whUnit.SHELF_TYPE; ResellPuton1.IsSmartRack = true; Shelf = whUnit.Shelf; } // 扫描库位代码 else { var nWh_code = await Biz.Db.Queryable().Where(t => t.WH_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).FirstAsync(); if (nWh_code == null) { action.IsSuccessed = false; action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.NotExist", Code); return action; } if (nWh_code.IS_ACTIVE == "N") { action.IsSuccessed = false; action.LocaleMsg = Biz.L("WMS.CustSupChk.ScanItem.ShelfOrLocationDisabled"); return action; } //if (nWh_code.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue() || nWh_code.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.QRCode.GetValue()) //{ // var locationData = Biz.Db.Queryable().Where(q => q.LOCATION_ID == nWh_code.LOCATION_ID && q.AUTH_ORG == OrgCode).First(); // if (!locationData.IsNullOrEmpty()) // { // action.IsSuccessed = false; // action.LocaleMsg = Biz.L($"系统当前库位存在料盘,请检查系统库存信息"); // return action; // } //} ResellPuton1.LocationCode = nWh_code.LOCATION_CODE; ResellPuton1.WarehouseCode = nWh_code.WH_CODE; //CustomerSupplyPuton.Capacity = nLocation.MAXSIZE - nUsedCapacity; //CustomerSupplyPuton.LotCount = nLocation.LOTCOUNT; //CustomerSupplyPuton.MaxSize = nLocation.MAXSIZE; ResellPuton1.IsSmartRack = false; ResellPuton1.RackCode = nWh_code.SHELF_CODE; } WarehouseCode = ResellPuton1.WarehouseCode; RackCode = ResellPuton1.RackCode; ResellPuton1.IsScanShelf = true; action.LocaleMsg = Biz.L("扫描成功"); action.Data = ResellPuton1; } catch (Exception ex) { //取消当前操作 action.CatchExceptionWithLog(ex, $"扫描货架或者储位[{Code}]异常"); } return action; } /// /// 领料单过账到T100 /// /// 单号 /// public ApiAction MaterialToErp(Resell_Input param) { var action = new ApiAction(); List dtl = new List(); //foreach (var item in res.Details) { var t100 = new Tot100pamar() { l_seq="1", imaxuc005=OrgCode, imaxuc006=WarehouseCode, imaxuc002=TARGET_ORG, imaxuc003="", }; dtl.Add(t100); } //Work.DoAsync(() => { Thread.Sleep(3000); var authOrg = GetAuthOrg(param.BILLCODE); #region 创建请求实体 var model = new BodyDTO>>() { host = new HostDTO(), datakey = new DataKey() { EntId = "88", CompanyId = authOrg }, service = new ServiceDTO() { name = "wms_get_cimm202" }, payload = new PayLoad>() { std_data = new Std_Data() { parameter = new Tot100() { pamar = dtl } } } }; #endregion 创建请求实体 #region 发起请求 var result = new T100ActionResult(); try { var requestJson = JsonConvert.SerializeObject(model); var response = HttpHelper.PostAsync(t100Url, requestJson).Result; result = JsonConvert.DeserializeObject>(response.Message); Logger.Scheduler.Info($"多角转卖对接T100过账提交Json: {requestJson},返回Json: {response.Message}"); } catch (Exception ex) { Logger.Default.Info($"多角转卖对接T100过账失败"); //return "0"; } #endregion 发起请求 var db = Biz.Db; var items = db.Queryable().Where(i => i.TRANS_NO == param.BILLCODE).ToList(); var items_pkg = db.Queryable().Where(i => i.TRANS_NO == param.BILLCODE).ToList(); var t100_res = result.payload.parameter?.returns; //var wh_id=db.Queryable().Where(q=>q.WH_CODE==WarehouseCode).ToString(); List ItemHistorys = new List(); if (result.payload.std_data?.execution.code == "0") { if (items.Count > 0 && items_pkg.Count > 0) { foreach (var item in items) { item.AUTH_ORG = TARGET_ORG; item.WH_ID = result.payload.parameter?.returns.FirstOrDefault().imaxuc003; item.SOURCE_CODE = "BIZ_ERP_SALE_OUT"; WMS_ITEM_HIS his = new WMS_ITEM_HIS(item, $"多角转卖,销售单[{BillCode}][{string.Join(",", res.Details.Where(s => s.ITEM_CODE == item.ITEM_CODE).Select(q => q.BILLLINE))}]"); ItemHistorys.Add(his); } foreach (var item in items_pkg) { item.AUTH_ORG = TARGET_ORG; item.WH_ID = result.payload.parameter?.returns.FirstOrDefault().imaxuc003; item.SOURCE_CODE = "BIZ_ERP_SALE_OUT"; } //业务表头 res.AUTH_ORG = TARGET_ORG; res.WAREHOUSECODE = WarehouseCode; res.STATUS = BIZ_ERP_SALE_OUT.STATUSs.COMPLETE.GetValue(); //业务表明细 foreach (var item in res.Details) { item.AUTH_ORG = TARGET_ORG; item.WAREHOUSECODE = WarehouseCode; item.LINESTATUS = BIZ_ERP_SALE_OUT.STATUSs.COMPLETE.GetValue(); } //业务表条码 foreach (var item in res.SnList) { item.AUTH_ORG = TARGET_ORG; //item.WAREHOUSECODE = WarehouseCode; item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue(); } } else { action.IsSuccessed = false; action.LocaleMsg = Biz.L($"库存信息不足"); } } else { action.IsSuccessed = false; action.LocaleMsg = Biz.L($"T100返回了错误[{result.payload.std_data?.execution.description}]"); } //保存到数据库 var db2 = Biz.Db; var dbTran = db2.UseTran(() => { // 插入单据表头 db2.Updateable(res, UserCode).ExecuteCommand(); var x = db2.Storageable(res.Details, UserCode).ToStorage(); x.AsInsertable.ExecuteCommand();//不存在插入 x.AsUpdateable.IgnoreColumns(z => new { z.CREATE_TIME, z.CREATE_USER }).ExecuteCommand();//存在更新,更新时忽略字段CreationTime、CreatorUserId db2.Updateable(res.SnList, UserCode).ExecuteCommand(); db2.Updateable(items, UserCode).ExecuteCommand(); db2.Updateable(items_pkg, UserCode).ExecuteCommand(); db2.Insertable(ItemHistorys, UserCode).ExecuteCommand(); }); if (!dbTran.IsSuccess) { Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); this.Close(!dbTran.IsSuccess); throw dbTran.ErrorException; } } //}); return action; } /// /// 根据工单号获取据点名称 /// /// /// public string GetAuthOrg(string workOrder) { var authOrg = string.Empty; var org = workOrder.Substring(0, 2); switch (org) { #region 循环取值 case "PH": authOrg = "PHXC"; break; case "YX": authOrg = "YXYY"; break; case "XP": authOrg = "XCXP"; break; case "XN": authOrg = "XCXN"; break; case "TH": authOrg = "STTH"; break; case "XC": authOrg = "XCSJ"; break; case "DG": authOrg = "DGXC"; break; case "HK": authOrg = "HKXC"; break; case "TX": authOrg = "TXXC"; break; case "LR": authOrg = "XCLR"; break; case "OM": authOrg = "OMKJ"; break; case "AH": authOrg = "AHXC"; break; case "YK": authOrg = "XCYK"; break; case "CC": authOrg = "XCCC"; break; case "TC": authOrg = "XCTC"; break; case "TK": authOrg = "STTK"; break; case "MM": authOrg = "STMM"; break; default: throw new Exception($"单号前两位:{org}未能找到对应的据点,请确认!"); #endregion 循环取值 } return authOrg; } public override bool Close(bool needSaveHistoryLog = false) { //保存操作日志 this.IsFinished = true; return IsFinished ? base.Close(needSaveHistoryLog) : IsFinished; } } }