using Furion; using Furion.FriendlyException; using Furion.Logging; using Furion.RemoteRequest.Extensions; using Myshipping.Core; using Myshipping.Core.Service; using Newtonsoft.Json.Linq; using Org.BouncyCastle.Asn1.X500; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Myshipping.Application.Helper { /// /// 获取场站数据辅助类(调用爬虫新运踪接口) /// public static class YardDataHelper { /// /// 异步调取出口运踪场站详情(按箱明细显示) /// /// 用户名ID /// 租户ID /// 租户名称 /// 提单号 /// 场站ID /// 是否网站 /// 返回场站详情(按箱明细显示) public static async Task> GetYardData(long userId, long tenantId, string tenantName, string mblno, string yardid, bool isWeb = true) { var cacheService = App.GetService(); var webAccService = App.GetService(); var sysConfig = await cacheService.GetAllSysConfig(); var userKey = sysConfig.FirstOrDefault(x => x.Code == "spiderUserKeyBilltrace"); var userSecret = sysConfig.FirstOrDefault(x => x.Code == "spiderUserSecretBilltrace"); var spiderServerUrl = sysConfig.FirstOrDefault(x => x.Code == "spiderServerUrlBillTraceNew"); var needYgtAccountList = cacheService.GetAllDictData().Result.Where(x => x.TypeCode == "YardListNeedYgtAccount").ToList();//需要云港通账号的场站 var needLhtAccountList = cacheService.GetAllDictData().Result.Where(x => x.TypeCode == "YardListNeedLhtAccount").ToList();//需要陆海通账号的场站 var webAcc = ""; var webPwd = ""; if (needYgtAccountList.Count(x => x.Code == yardid) > 0) { //从租户参数中获取网站云港通账号密码 var tenantParam = await cacheService.GetAllTenantParam(); var ygtAcc = await webAccService.GetAccountConfig("YunGangTong", userId); if (ygtAcc == null || string.IsNullOrEmpty(ygtAcc.Account) || string.IsNullOrEmpty(ygtAcc.Password)) { return new KeyValuePair(false, "未找到云港通账号、密码配置,请到账号维护模块中添加"); } webAcc = ygtAcc.Account; webPwd = ygtAcc.Password; } if (needLhtAccountList.Count(x => x.Code == yardid) > 0) { //从租户参数中获取网站云港通账号密码 var tenantParam = await cacheService.GetAllTenantParam(); var ygtAcc = await webAccService.GetAccountConfig("LuHaiTong", userId); if (ygtAcc == null || string.IsNullOrEmpty(ygtAcc.Account) || string.IsNullOrEmpty(ygtAcc.Password)) { return new KeyValuePair(false, "未找到陆海通账号、密码配置,请到账号维护模块中添加"); } webAcc = ygtAcc.Account; webPwd = ygtAcc.Password; } var yardMappings = await cacheService.GetAllMappingYard(); var ym = yardMappings.FirstOrDefault(x => x.Code.ToLower() == yardid.ToLower() && x.Module == "BillTrace"); if (ym == null) { return new KeyValuePair(false, $"场站代号配置未找到:{yardid}"); } var objSend = new { user_key = userKey.Value, user_secret = userSecret.Value, customer_id = tenantId.ToString(), customer_name = tenantName, web_code = ym.MapCode, bno = mblno, req_type = isWeb ? "1" : "0", web_user = webAcc, web_psw = webPwd, }; var urlYard = spiderServerUrl.Value; if (!urlYard.EndsWith("/")) { urlYard += "/"; } urlYard += "real/query"; var strJson = objSend.ToJsonString(); Log.Information($"查询实时场站数据发送数据,url:{urlYard},json:{strJson}"); string rtn = await urlYard.SetBody(objSend).PostAsStringAsync(); Log.Information($"查询实时场站数据,返回:{rtn}"); var rtnObj = JObject.Parse(rtn); if (rtnObj.GetIntValue("code") != 200) { return new KeyValuePair(false, $"获取场站数失败:{rtnObj.GetStringValue("msg")}"); } else { var rtnData = rtnObj.GetStringValue("data"); if (isWeb) { var viewstatehtml = GetDataHtmlList(rtnData, "__VIEWSTATE", "/>"); if (viewstatehtml != "") { rtnData = rtnData.Replace(viewstatehtml, ""); } } return new KeyValuePair(true, rtnData); } } #region 异步调取出口运踪场站详情 /// /// 异步调取出口运踪场站详情(按箱明细显示,并对箱型做了本地转换) /// /// 用户名ID /// 租户ID /// 租户名称 /// 提单号 /// 场站ID /// 是否网站 /// 返回场站详情(按箱明细显示,并对箱型做了本地转换) public static async Task GetYardDataWithTranslateAsync(long userId, long tenantId, string tenantName, string mblno, string yardid, bool isWeb = true) { var rtn = await GetYardData(userId, tenantId, tenantName, mblno, yardid, isWeb); if (!rtn.Key) { throw Oops.Bah(rtn.Value); } var _cache = App.GetService(); //场站引入的数据,转换为订舱箱型,且带上箱型代码 var ctnList = await _cache.GetAllCodeCtn(); var mapCtn = await _cache.GetAllMappingCtn(); var jData = JArray.Parse(rtn.Value); foreach (JObject item in jData) { var ctnall = item.GetStringValue("CTNALL"); var findMap = mapCtn.FirstOrDefault(x => x.Module == "YardData" && x.MapCode == ctnall); var findCtn = ctnList.FirstOrDefault(x => x.Name == ctnall); if (findMap != null) { item.Add("CtnCode", findMap.Code); findCtn = ctnList.First(c => c.Code == findMap.Code); item["CTNALL"] = findCtn.Name; //名称显示维护的箱型 } else if (findCtn != null) { item.Add("CtnCode", findCtn.Code); item["CTNALL"] = findCtn.Name; //名称显示维护的箱型 } else { throw Oops.Bah($"未找到箱型{ctnall}的场站引入配置"); } } return jData.ToString(); } #endregion private 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; } } }