using DS.Module.Core; using DS.Module.Core.Extensions; using DS.Module.Core.Helpers; using DS.WMS.Core.Code.Entity; using DS.WMS.Core.Map.Entity; using DS.WMS.Core.Op.Dtos; using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Sys.Entity; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.OpenXmlFormats; namespace DS.WMS.Core.Op.Method { /// /// 海运出口场站相关接口 /// public partial class SeaExportService { /// /// 获取场站数据 /// /// 业务Id /// /// public async Task> GetYardData(string id, bool isWeb = false) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var order = tenantDb.Queryable().Where(x => x.Id == long.Parse(id)).First(); if (order.IsNull()) { return await Task.FromResult(DataResult.Failed("海运出口信息不存在!", MultiLanguageConst.SeaExportNotExist)); } if (string.IsNullOrEmpty(order.Yard) || order.YardId == 0 || order.YardId.IsNull()) { return await Task.FromResult(DataResult.Failed("请先选择场站!", MultiLanguageConst.SeaExportNotExist)); } var data = await GetYardDataAndMappingSystem(order, isWeb); if (!data.Succeeded) { return await Task.FromResult(DataResult.Failed(data.Message)); } return await Task.FromResult(DataResult.Success(JsonConvert.SerializeObject(data.Data))); } /// /// 从爬虫获取场站数据,并映射为系统中的箱型 /// /// private async Task>> GetYardDataAndMappingSystem(SeaExport order, bool isWeb = false) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); //var yardCode = seaComService.GetClientCode(order.YardId, tenantDb); var req = new YardDataReq { YardId = order.YardId, MBLNO = order.MBLNO, IsWeb = isWeb }; var rtn = await GetYardData(req); if (!rtn.Succeeded) { return await Task.FromResult(DataResult>.Failed(rtn.Message)); } //场站引入的数据,转换为订舱箱型,且带上箱型代码 var ctnList = tenantDb.Queryable().Where(x => x.Status == StatusEnum.Enable).ToList(); var mapCtn = tenantDb.Queryable().Where(x => x.Status == StatusEnum.Enable).ToList(); var listRtn = JsonConvert.DeserializeObject>(rtn.Data); foreach (var item in listRtn) { var ctnall = item.CTNALL; var findMap = mapCtn.FirstOrDefault(x => x.Module == "YardData" && x.MapCode == ctnall); var findCtn = ctnList.FirstOrDefault(x => x.CtnName == ctnall); if (findMap != null) { item.CtnCode = findMap.Code; findCtn = ctnList.First(c => c.EdiCode == findMap.Code); item.CTNALL = findCtn.CtnName; //名称显示维护的箱型 } else if (findCtn != null) { item.CtnCode = findCtn.EdiCode; item.CTNALL = findCtn.CtnName; //名称显示维护的箱型 } else { return await Task.FromResult(DataResult>.Failed($"未找到箱型{ctnall}的场站引入配置")); } } return await Task.FromResult(DataResult>.Success(listRtn)); } /// /// 异步调取出口运踪场站详情(按箱明细显示) /// /// /// public async Task> GetYardData(YardDataReq req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var account = seaComService.GetCodeThirdParty("BillTrace", user.UserId, tenantDb, req.YardId); //tenantDb.Queryable().Where(x => x.CustomerId == req.YardId && x.AccountType == "BillTrace").First(); var userKey = db.Queryable().Filter(null, true).Where(x => x.Code == "spiderUserKeyBilltrace" && x.TenantId == 1288018625843826688).First().Value; var userSecret = db.Queryable().Filter(null, true).Where(x => x.Code == "spiderUserSecretBilltrace" && x.TenantId == 1288018625843826688).First().Value; var spiderServerUrl = db.Queryable().Filter(null, true).Where(x => x.Code == "spiderServerUrlBillTraceNew" && x.TenantId == 1288018625843826688).First().Value; var tenantName = db.Queryable().Filter(null, true).Where(x => x.Id == long.Parse(user.TenantId)).First().Name; if (account.IsNull()) { return await Task.FromResult(DataResult.Failed("未配置出口运踪场站第三方账号信息!")); } var yardMap = tenantDb.Queryable().Where(x => x.LinkId == req.YardId && x.Module == "BillTrace").First(); if (yardMap.IsNull()) { return await Task.FromResult(DataResult.Failed($"场站代号配置未找到:{req.YardId}")); } var objSend = new { user_key = userKey, user_secret = userSecret, customer_id = user.TenantId, customer_name = tenantName, web_code = yardMap.MapCode, bno = req.MBLNO, req_type = req.IsWeb ? "1" : "0", web_user = account.AppKey, web_psw = account.AppSecret, }; var urlYard = spiderServerUrl; if (!urlYard.EndsWith("/")) { urlYard += "/"; } urlYard += "real/query"; var res = RequestHelper.Post(JsonConvert.SerializeObject(objSend), urlYard); var rtnObj = JObject.Parse(res); if (rtnObj.GetIntValue("code") != 200) { return await Task.FromResult(DataResult.Failed("$\"获取场站数据失败:{rtnObj.GetStringValue(\"msg\")}\"!")); } else { var rtnData = rtnObj.GetStringValue("data"); if (req.IsWeb) { var viewstatehtml = GetDataHtmlList(rtnData, "__VIEWSTATE", "/>"); if (viewstatehtml != "") { rtnData = rtnData.Replace(viewstatehtml, ""); } } return await Task.FromResult(DataResult.Success(rtnData)); } } public static string GetDataHtmlList(string html, string startstr, string endstr) { var subhtml = html; var htmllength = subhtml.Length; var startindex = subhtml.IndexOf(startstr); //if (startindex == -1 || startindex == 0) return ""; if (startindex == -1) return ""; subhtml = subhtml.Substring(startindex + startstr.Length, htmllength - startindex - startstr.Length); var endindex = subhtml.IndexOf(endstr); if (endindex != -1 && endindex != 0) subhtml = subhtml.Substring(0, endindex); return subhtml; } } }