using DS.Module.Core;
using DS.Module.Core.Enums;
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;
using SqlSugar;
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 = await tenantDb.Queryable().Where(x => x.Id == long.Parse(id)).FirstAsync();
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)));
}
///
/// 获取订舱记录在指定网站的HTML数据
///
/// 业务Id
/// 网站编码;值为YARD或HLW_CD或YGT;YARD:获取订舱记录所属场站的网页数据;HLW_CD:获取互联网+的网页数据;YGT:获取云港通的网页数据
///
public async Task> GetWebData(string id, string webCode)
{
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));
}
WebCodeEnum codeEnum = webCode switch
{
"YARD" => WebCodeEnum.YARD,
"HLW_CD" => WebCodeEnum.HLW_CD,
"YGT" => WebCodeEnum.YGT,
_ => throw new Exception("webCode参数错误!")
};
var data = await GetWebData(new WebDataReq() {
MBLNO = order.MBLNO,
YardId = order.YardId,
WebCode = codeEnum,
});
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 = await tenantDb.Queryable().Where(x => x.Status == StatusEnum.Enable).ToListAsync();
var mapCtn = await tenantDb.Queryable().Where(x => x.Status == StatusEnum.Enable).ToListAsync();
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 = await db.Queryable().Filter(null, true).Where(x => x.Code == "spiderUserKeyBilltrace" && x.TenantId == 1288018625843826688).FirstAsync();
var userSecret = await db.Queryable().Filter(null, true).Where(x => x.Code == "spiderUserSecretBilltrace" && x.TenantId == 1288018625843826688).FirstAsync();
var spiderServerUrl = await db.Queryable().Filter(null, true).Where(x => x.Code == "spiderServerUrlBillTraceNew" && x.TenantId == 1288018625843826688).FirstAsync();
var tenant = await db.Queryable().Filter(null, true).Where(x => x.Id == long.Parse(user.TenantId)).FirstAsync();
if (account.IsNull())
{
return await Task.FromResult(DataResult.Failed("未配置出口运踪场站第三方账号信息!"));
}
var yardMap = await tenantDb.Queryable().Where(x => x.LinkId == req.YardId && x.Module == "BillTrace").FirstAsync();
if (yardMap.IsNull())
{
return await Task.FromResult(DataResult.Failed($"场站代号配置未找到:{req.YardId}"));
}
var objSend = new
{
user_key = userKey.Value,
user_secret = userSecret.Value,
customer_id = user.TenantId,
customer_name = tenant.Name,
web_code = yardMap.MapCode,
bno = req.MBLNO,
req_type = req.IsWeb ? "1" : "0",
web_user = account.AppKey,
web_psw = account.AppSecret,
};
var urlYard = spiderServerUrl.Value;
if (!urlYard.EndsWith("/"))
{
urlYard += "/";
}
urlYard += "real/query";
var res = await RequestHelper.PostJsonAsyncNoHeaders(urlYard,JsonConvert.SerializeObject(objSend));
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));
}
}
///
/// 异步调取网站HTML数据
///
///
///
public async Task> GetWebData(WebDataReq 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 webAcc = "";
var webPwd = "";
var newWebCode = "";
if (req.WebCode == WebCodeEnum.YARD)
{
var yardCode = seaComService.GetClientCode(req.YardId, tenantDb);
var needYgtAccountList = db.Queryable().InnerJoin((a, b) => a.TypeId == b.Id)
.Where((a, b) => b.Code == "YardListNeedYgtAccount").OrderBy((a, b) => a.OrderNo)
.Select().ToList();
var needLhtAccountList = db.Queryable().InnerJoin((a, b) => a.TypeId == b.Id)
.Where((a, b) => b.Code == "YardListNeedLhtAccount").OrderBy((a, b) => a.OrderNo)
.Select().ToList();
if (needYgtAccountList.Count(x => x.Value == yardCode) > 0)
{
var ygtAcc = seaComService.GetCodeThirdParty("YunGangTong", user.UserId, tenantDb);
if (ygtAcc == null || string.IsNullOrEmpty(ygtAcc.AppKey) || string.IsNullOrEmpty(ygtAcc.AppSecret))
{
return await Task.FromResult(DataResult.Failed("未找到云港通账号、密码配置,请到第三方账号中添加!"));
}
webAcc = ygtAcc.AppKey;
webPwd = ygtAcc.AppSecret;
}
else if (needLhtAccountList.Count(x => x.Value == yardCode) > 0)
{
var lhtAcc = seaComService.GetCodeThirdParty("LuHaiTong", user.UserId, tenantDb);
if (lhtAcc == null || string.IsNullOrEmpty(lhtAcc.AppKey) || string.IsNullOrEmpty(lhtAcc.AppSecret))
{
return await Task.FromResult(DataResult.Failed("未找到陆海通账号、密码配置,请到第三方账号中添加!"));
}
webAcc = lhtAcc.AppKey;
webPwd = lhtAcc.AppSecret;
}
else {
var account = seaComService.GetCodeThirdParty("BillTrace", user.UserId, tenantDb);
if (account.IsNull())
{
return await Task.FromResult(DataResult.Failed("未配置出口运踪场站第三方账号信息!"));
}
webAcc = account.AppKey;
webAcc = account.AppSecret;
}
var yardMap = tenantDb.Queryable().Where(x => x.LinkId == req.YardId && x.Module == "BillTrace").First();
if (yardMap.IsNull())
{
return await Task.FromResult(DataResult.Failed($"场站代号配置未找到:{yardCode}"));
}
newWebCode = yardMap.MapCode;
}
else
{
newWebCode = req.WebCode.ToString();
}
var objSend = new
{
user_key = userKey,
user_secret = userSecret,
customer_id = user.TenantId,
customer_name = tenantName,
web_code = newWebCode,
bno = req.MBLNO,
req_type = "1" ,
web_user = webAcc,
web_psw = webPwd,
};
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");
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;
}
}
}