|
|
using Amazon.Runtime.Internal.Util;
|
|
|
using DS.Module.Core;
|
|
|
using DS.Module.Core.Extensions;
|
|
|
using DS.Module.Core.Helpers;
|
|
|
using DS.WMS.Core.Invoice.Dtos;
|
|
|
using DS.WMS.Core.Map.Entity;
|
|
|
using DS.WMS.Core.Op.Dtos;
|
|
|
using DS.WMS.Core.Op.EDI;
|
|
|
using DS.WMS.Core.Op.Entity;
|
|
|
using DS.WMS.Core.Sys.Entity;
|
|
|
using Mapster;
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using Newtonsoft.Json;
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
using Org.BouncyCastle.Ocsp;
|
|
|
|
|
|
namespace DS.WMS.Core.Op.Method
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 海运出口运踪相关接口
|
|
|
/// </summary>
|
|
|
public partial class SeaExportService
|
|
|
{
|
|
|
#region 运踪相关
|
|
|
/// <summary>
|
|
|
/// 发起运踪订阅或者更新提单号
|
|
|
/// </summary>
|
|
|
/// <param name="req"></param>
|
|
|
/// <returns></returns>
|
|
|
public async Task<DataResult<string>> SendOrUpdateTrace(List<BillTraceSendReq> req)
|
|
|
{
|
|
|
if (req.Count == 0)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未传入正确参数!"));
|
|
|
}
|
|
|
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
//var userKey = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "seae_billtraceurl_userKey" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
//var userPwd = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "seae_billtraceurl_userPwd" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
//var userId = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "seae_billtraceurl_userId" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var reqUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "request_seae_billtraceurl" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var resUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "response_seae_billtraceurl" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
|
|
|
var account = seaComService.GetCodeThirdParty("BillTraceSubcribe", user.UserId, tenantDb);
|
|
|
|
|
|
if (account.IsNull())
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未配置运踪订阅第三方账号信息!"));
|
|
|
}
|
|
|
if (account.AppSecret.IsNull() || account.AppKey.IsNull() || account.RegistContractName.IsNull())
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("请检查运踪订阅第三方账号关键参数!"));
|
|
|
}
|
|
|
|
|
|
BillTraceMain billdto = new BillTraceMain();
|
|
|
List<BillTraceReq> billTraceList = new List<BillTraceReq>();
|
|
|
foreach (var item in req)
|
|
|
{
|
|
|
var yardCode = seaComService.GetClientCode(item.YardId, tenantDb);
|
|
|
var carrierCode = seaComService.GetClientCode(item.CarrierId, tenantDb);
|
|
|
if (!string.IsNullOrWhiteSpace(item.CarrierId.ToString()))
|
|
|
{
|
|
|
var et = await tenantDb.Queryable<BookingStatus>().Where(x => x.StatusCode == "status_mudigang" && x.BusinessId == Convert.ToInt64(item.BusinessId)).FirstAsync();
|
|
|
if (et != null)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("\"提单号\" + item.MBLNO + \"已订阅!"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(item.YardId.ToString()))
|
|
|
{
|
|
|
var et = await tenantDb.Queryable<BookingStatus>().Where(x => x.StatusCode == "status_qiyungang" && x.BusinessId == Convert.ToInt64(item.BusinessId)).FirstAsync();
|
|
|
if (et != null)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("\"提单号\" + item.MBLNO + \"已订阅!"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (item.isBook && (string.IsNullOrWhiteSpace(carrierCode) || string.IsNullOrWhiteSpace(item.Carrier) || string.IsNullOrWhiteSpace(item.MBLNO)))
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("订阅目的港船公司或提单号不能为空!"));
|
|
|
}
|
|
|
if (!item.isBook && (string.IsNullOrWhiteSpace(item.Yard) || string.IsNullOrWhiteSpace(yardCode) || string.IsNullOrWhiteSpace(item.MBLNO)))
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("订阅港前数据提单号或场站不能为空!"));
|
|
|
}
|
|
|
var yardMap = tenantDb.Queryable<MappingYard>().Where(x => x.Code == yardCode && x.Module == "BillTrace").First();
|
|
|
if (yardMap.IsNull())
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed($"场站代号配置未找到:{yardCode}"));
|
|
|
}
|
|
|
//var carrierMap = tenantDb.Queryable<MappingYard>().Where(x => x.Code == yardCode && x.Module == "BillTrace").First();
|
|
|
//if (yardMap.IsNull())
|
|
|
//{
|
|
|
// return await Task.FromResult(DataResult<string>.Failed($"船公司代号配置未找到:{yardCode}"));
|
|
|
//}
|
|
|
var carrierName = string.Empty;
|
|
|
if (string.IsNullOrEmpty(carrierCode))
|
|
|
{
|
|
|
carrierName = "";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
carrierName = seaComService.GetCarrierMapper(item.CarrierId, tenantDb).MapName;
|
|
|
}
|
|
|
billTraceList.Add(new BillTraceReq
|
|
|
{
|
|
|
BusinessId = item.BusinessId,
|
|
|
MBLNO = item.MBLNO,
|
|
|
YARD = yardMap.MapName,
|
|
|
YardCode = yardMap.MapCode == "" ? null : yardMap.MapCode,
|
|
|
CARRIER = carrierName,
|
|
|
CARRIERID = carrierCode == "" ? null : carrierCode,
|
|
|
isBook = item.isBook
|
|
|
});
|
|
|
var status = string.Empty;
|
|
|
var IsBookingYZ = String.Empty;
|
|
|
if (!string.IsNullOrWhiteSpace(yardCode) && !string.IsNullOrWhiteSpace(carrierCode))
|
|
|
{
|
|
|
status = "订阅起运港,目的港";
|
|
|
IsBookingYZ = "3";
|
|
|
}
|
|
|
else if (string.IsNullOrWhiteSpace(yardCode) && !string.IsNullOrWhiteSpace(carrierCode))
|
|
|
{
|
|
|
status = "订阅目的港";
|
|
|
IsBookingYZ = "2";
|
|
|
}
|
|
|
else if (!string.IsNullOrWhiteSpace(yardCode) && string.IsNullOrWhiteSpace(carrierCode))
|
|
|
{
|
|
|
status = "订阅起运港";
|
|
|
IsBookingYZ = "1";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
IsBookingYZ = "0";
|
|
|
}
|
|
|
//TODO 添加booking日志
|
|
|
//更新运踪标识
|
|
|
var info = tenantDb.Queryable<SeaExport>().First(x => x.Id == Convert.ToInt64(item.BusinessId));
|
|
|
info.IsBookingYZ = IsBookingYZ;
|
|
|
|
|
|
await tenantDb.Updateable(info).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
billdto.Children = billTraceList;
|
|
|
billdto.Key = account.AppKey;
|
|
|
billdto.PWD = account.AppSecret;
|
|
|
billdto.url = resUrl;
|
|
|
billdto.Gid = account.RegistContractName;
|
|
|
billdto.PushBackKey = user.TenantId;//根据回传的租户Id回调
|
|
|
var json = billdto.ToJsonString();
|
|
|
|
|
|
var postData = new { msg = json };
|
|
|
|
|
|
if (!reqUrl.EndsWith("/"))
|
|
|
{
|
|
|
reqUrl += "/";
|
|
|
}
|
|
|
|
|
|
reqUrl += "BillTrace/SubcribeOrUpdateBilltrace";
|
|
|
|
|
|
var result = RequestHelper.Post(postData.ToJsonString(), reqUrl);
|
|
|
|
|
|
var res = JsonConvert.DeserializeObject<BillTraceRes>(result);
|
|
|
|
|
|
if (!res.Success)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed($"发起运踪订阅或者更新提单号失败:{res.Message}"));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Success(res.Data.ToJsonString()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 运踪退订
|
|
|
/// </summary>
|
|
|
/// <param name="req"></param>
|
|
|
/// <returns></returns>
|
|
|
public async Task<DataResult<string>> UnsubscribeBillTrace(List<BillTraceUnsubscribeList> req)
|
|
|
{
|
|
|
if (req.Count == 0)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未传入正确参数!"));
|
|
|
}
|
|
|
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
//var userKey = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "seae_billtraceurl_userKey" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
//var userPwd = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "seae_billtraceurl_userPwd" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
//var userId = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "seae_billtraceurl_userId" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var reqUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "request_seae_billtraceurl" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var resUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "response_seae_billtraceurl" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var account = seaComService.GetCodeThirdParty("BillTraceSubcribe", user.UserId, tenantDb);
|
|
|
|
|
|
if (account.IsNull())
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未配置运踪订阅第三方账号信息!"));
|
|
|
}
|
|
|
if (account.AppSecret.IsNull() || account.AppKey.IsNull() || account.RegistContractName.IsNull())
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("请检查运踪订阅第三方账号关键参数!"));
|
|
|
}
|
|
|
|
|
|
BillTraceUnsubscribeDto reqDto = new BillTraceUnsubscribeDto()
|
|
|
{
|
|
|
Children = new List<BillTraceUnsubscribeList>(),
|
|
|
Key = account.AppKey,
|
|
|
PWD = account.AppSecret,
|
|
|
Gid = account.RegistContractName,
|
|
|
PushBackKey = user.TenantId,
|
|
|
};
|
|
|
foreach (var item in req)
|
|
|
{
|
|
|
if (string.IsNullOrEmpty(item.BusinessId))
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("订舱记录主键不能为空!!"));
|
|
|
}
|
|
|
reqDto.Children.Add(new BillTraceUnsubscribeList(item.BusinessId, item.MBLNO));
|
|
|
|
|
|
//TODO 添加booking日志
|
|
|
//更新运踪标识
|
|
|
var info = tenantDb.Queryable<SeaExport>().First(x => x.Id == Convert.ToInt64(item.BusinessId));
|
|
|
info.IsBookingYZ = "0";
|
|
|
|
|
|
await tenantDb.Updateable(info).ExecuteCommandAsync();
|
|
|
}
|
|
|
var json = reqDto.ToJsonString();
|
|
|
if (!reqUrl.EndsWith("/"))
|
|
|
{
|
|
|
reqUrl += "/";
|
|
|
}
|
|
|
|
|
|
reqUrl += "BillTrace/UnsubscribeBillTrace";
|
|
|
var postData = new { msg = json };
|
|
|
var result = RequestHelper.Post(postData.ToJsonString(), reqUrl);
|
|
|
|
|
|
var res = JsonConvert.DeserializeObject<BillTraceUnsubscribeRes>(result);
|
|
|
|
|
|
if (!res.Success)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed($"运踪退订失败:{res.Message}"));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Success(res.Data));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 刷新运踪(互联网和云港通)
|
|
|
/// </summary>
|
|
|
/// <param name="Ids"></param>
|
|
|
/// <returns></returns>
|
|
|
public async Task<DataResult<string>> RefreshYGT(long[] Ids)
|
|
|
{
|
|
|
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
var order = await tenantDb.Queryable<SeaExport>().Where(x => Ids.Contains(x.Id) && x.ParentId == 0 && x.IsBookingYZ != "0").ToListAsync();
|
|
|
if (order == null || order.Count == 0)
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("存在未订阅单据"));
|
|
|
|
|
|
}
|
|
|
var key = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "billTraceNewUserKey" && x.TenantId == 1288018625843826688).Select(x => x.Value).First();
|
|
|
|
|
|
if (string.IsNullOrEmpty(key))
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未获取到运踪相关KEY,请联系管理员!"));
|
|
|
}
|
|
|
|
|
|
var secret = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "billTraceNewUserSecret" && x.TenantId == 1288018625843826688).Select(x => x.Value).First();
|
|
|
if (string.IsNullOrEmpty(secret))
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未获取到运踪相关SECRET,请联系管理员!"));
|
|
|
}
|
|
|
|
|
|
|
|
|
var url = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "billTraceYgtUrl" && x.TenantId == 1288018625843826688).Select(x => x.Value).First();
|
|
|
if (string.IsNullOrEmpty(secret))
|
|
|
{
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未获取到运港通船期即时查询接口,请联系管理员!"));
|
|
|
}
|
|
|
//var url = _cache.GetAllDictData().Result.Where(x => x.Code == "billTraceYgtUrl").Select(x => x.Value).FirstOrDefault();
|
|
|
|
|
|
|
|
|
JArray jarrHLWTemos = new JArray();
|
|
|
JArray jarrYGTTemos = new JArray();
|
|
|
foreach (var item in order)
|
|
|
{
|
|
|
JObject jobjhlwTemp = new JObject();
|
|
|
jobjhlwTemp.Add("web_code", "HLW_CD");
|
|
|
jobjhlwTemp.Add("bno", new JValue(item.MBLNO.Trim()));
|
|
|
jarrHLWTemos.Add(jobjhlwTemp);
|
|
|
|
|
|
JObject jobjygtTemp = new JObject();
|
|
|
jobjygtTemp.Add("web_code", "YGT_YZ");
|
|
|
jobjygtTemp.Add("bno", new JValue(item.MBLNO.Trim()));
|
|
|
jarrYGTTemos.Add(jobjygtTemp);
|
|
|
}
|
|
|
|
|
|
if (jarrHLWTemos.Count > 0)
|
|
|
{
|
|
|
JObject HLWjobjSend = new JObject();
|
|
|
HLWjobjSend.Add("user_key", new JValue(key));
|
|
|
HLWjobjSend.Add("user_secret", new JValue(secret));
|
|
|
HLWjobjSend.Add("customer_id", new JValue(user.TenantId));
|
|
|
HLWjobjSend.Add("customer_name", new JValue(user.TenantName));
|
|
|
HLWjobjSend.Add("data_list", jarrHLWTemos);
|
|
|
var json = HLWjobjSend.ToJsonString();
|
|
|
_logger.Info("运踪查询HLW+参数:" + json);
|
|
|
//var rtn = await url.SetHttpMethod(HttpMethod.Post).SetBody(HLWjobjSend.ToJsonString()).PostAsStringAsync();
|
|
|
var rtn = await RequestHelper.PostJsonAsyncNoHeaders(url, json);
|
|
|
_logger.Info("运踪查询HLW+查询结果:" + rtn);
|
|
|
await ExecuteHLW(rtn);
|
|
|
}
|
|
|
if (jarrYGTTemos.Count > 0)
|
|
|
{
|
|
|
JObject YGTjobjSend = new JObject();
|
|
|
YGTjobjSend.Add("user_key", new JValue(key));
|
|
|
YGTjobjSend.Add("user_secret", new JValue(secret));
|
|
|
YGTjobjSend.Add("customer_id", new JValue(user.TenantId));
|
|
|
YGTjobjSend.Add("customer_name", new JValue(user.TenantName));
|
|
|
YGTjobjSend.Add("data_list", jarrYGTTemos);
|
|
|
var json = YGTjobjSend.ToJsonString();
|
|
|
_logger.Info("运踪查询YGT参数:" + json);
|
|
|
//var rtn = await url.SetHttpMethod(HttpMethod.Post).SetBody(YGTjobjSend.ToJsonString()).PostAsStringAsync();
|
|
|
var rtn = await RequestHelper.PostJsonAsyncNoHeaders(url, YGTjobjSend.ToJsonString());
|
|
|
_logger.Info("运踪查询YGT查询结果:" + rtn);
|
|
|
await ExecuteYGT(rtn);
|
|
|
}
|
|
|
return await Task.FromResult(DataResult<string>.Success("刷新运踪成功!"));
|
|
|
}
|
|
|
|
|
|
[NonAction]
|
|
|
//[SqlSugarUnitOfWork]
|
|
|
public async Task ExecuteHLW(string rtn)
|
|
|
{
|
|
|
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
JObject jobjRtn = JObject.Parse(rtn);
|
|
|
var code = jobjRtn.GetValue("code").ToString();
|
|
|
var msg = jobjRtn.GetValue("msg").ToString();
|
|
|
if (code != "200")
|
|
|
{
|
|
|
_logger.Info($"请求爬虫获取【HLW+数据】出错:{msg}");
|
|
|
throw new Exception(msg);
|
|
|
}
|
|
|
//订舱状态
|
|
|
var dicList = db.Queryable<SysDictData>().Where(x => x.TypeId == 1788810332945387520).ToList();
|
|
|
JArray jarrData = jobjRtn.GetValue("data") as JArray;
|
|
|
|
|
|
foreach (JObject item in jarrData)
|
|
|
{
|
|
|
//每票 货物
|
|
|
|
|
|
var mblno = item.GetValue("bno").ToString();
|
|
|
|
|
|
var bookingId = await tenantDb.Queryable<SeaExport>().Where(x => x.MBLNO == mblno && x.ParentId == 0).Select(x => x.Id).FirstAsync();
|
|
|
var list = await tenantDb.Queryable<BookingStatus>().Filter(null, true)
|
|
|
.InnerJoin<SysDictData>((d, t) => d.StatusCode == t.Value && t.TypeId == 1788810332945387520 && d.StatusGroup == "booking_status_group_billtrace"
|
|
|
&& d.BusinessId == bookingId, "shippingweb8_dev.sys_dict_data")
|
|
|
.Select((d, t) => new
|
|
|
{
|
|
|
BusinessId = d.BusinessId,
|
|
|
StatusCode = d.StatusCode,
|
|
|
StatusName = d.StatusName,
|
|
|
StatusTime = d.StatusTime,
|
|
|
Name = t.Name,
|
|
|
Value = t.Value
|
|
|
}).ToListAsync();
|
|
|
var jarrInnerData = item.GetValue("data") as JArray;
|
|
|
|
|
|
if (jarrInnerData.Count == 0)
|
|
|
{
|
|
|
throw new Exception(item.GetStringValue("msg"));
|
|
|
}
|
|
|
|
|
|
DateTime? TimeCangDan = null;
|
|
|
DateTime? FangXingShiJian = null;
|
|
|
|
|
|
foreach (JObject dataItem in jarrInnerData)
|
|
|
{
|
|
|
TimeCangDan = dataItem.GetDateTimeValue("YuPeiShiJian"); //舱单时间
|
|
|
FangXingShiJian = dataItem.GetDateTimeValue("FangXingShiJian"); //放行时间
|
|
|
}
|
|
|
//await _repStatuslog.DeleteAsync(x => x.BookingId == bookingId && x.Category == "yunzong" && (x.Status == "舱单" || x.Status == "报关"));
|
|
|
var oldLog = await tenantDb.Queryable<BookingStatusLog>().Where(x => x.BusinessId == bookingId && x.Group == "yunzong" && (x.Status == "舱单" || x.Status == "报关")).ToListAsync();
|
|
|
if (oldLog.Count > 0)
|
|
|
{
|
|
|
//var oldid = oldLog.Select(x => x.Id).ToList();
|
|
|
////删除日志详情和日志
|
|
|
//var oldLogDetails = await tenantDb.Queryable<BookingStatusLogDetail>().Where(x => oldid.Contains(x.PId)).ToListAsync();
|
|
|
//if (oldLogDetails.Count > 0)
|
|
|
//{
|
|
|
// await tenantDb.Deleteable(oldLogDetails).ExecuteCommandAsync();
|
|
|
//}
|
|
|
await tenantDb.Deleteable(oldLog).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
if (TimeCangDan != null)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"舱单",
|
|
|
Group = "yunzong",
|
|
|
OpTime = TimeCangDan,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
|
|
|
if (list.Where(x => x.StatusCode == "status_cangdan").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_cangdan",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_cangdan").Select(x => x.Name).First(),
|
|
|
StatusTime = TimeCangDan,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (FangXingShiJian != null)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"报关",
|
|
|
Group = "yunzong",
|
|
|
OpTime = FangXingShiJian,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
if (list.Where(x => x.StatusCode == "status_haifang").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_haifang",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_haifang").Select(x => x.Name).First(),
|
|
|
StatusTime = TimeCangDan,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
await seaComService.SetGoodsStatus("BG", bookingId, tenantDb);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
[NonAction]
|
|
|
//[SqlSugarUnitOfWork]
|
|
|
public async Task ExecuteYGT(string rtn)
|
|
|
{
|
|
|
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
JObject jobjRtn = JObject.Parse(rtn);
|
|
|
var code = jobjRtn.GetValue("code").ToString();
|
|
|
var msg = jobjRtn.GetValue("msg").ToString();
|
|
|
if (code != "200")
|
|
|
{
|
|
|
_logger.Info($"请求爬虫获取【YGT数据】出错:{msg}");
|
|
|
throw new Exception(msg);
|
|
|
}
|
|
|
var dicList = db.Queryable<SysDictData>().Where(x => x.TypeId == 1788810332945387520).ToList();
|
|
|
JArray jarrData = jobjRtn.GetValue("data") as JArray;
|
|
|
|
|
|
foreach (JObject item in jarrData)
|
|
|
{
|
|
|
//每票 货物
|
|
|
var mblno = item.GetValue("bno").ToString();
|
|
|
|
|
|
var bookingId = await tenantDb.Queryable<SeaExport>().Where(x => x.MBLNO == mblno && x.ParentId == 0).Select(x => x.Id).FirstAsync();
|
|
|
|
|
|
var list = await tenantDb.Queryable<BookingStatus>().Filter(null, true)
|
|
|
.InnerJoin<SysDictData>((d, t) => d.StatusCode == t.Value && t.TypeId == 1788810332945387520 && d.StatusGroup == "booking_status_group_billtrace"
|
|
|
&& d.BusinessId == bookingId, "shippingweb8_dev.sys_dict_data")
|
|
|
.Select((d, t) => new
|
|
|
{
|
|
|
BusinessId = d.BusinessId,
|
|
|
StatusCode = d.StatusCode,
|
|
|
StatusName = d.StatusName,
|
|
|
StatusTime = d.StatusTime,
|
|
|
Name = t.Name,
|
|
|
Value = t.Value
|
|
|
}).ToListAsync();
|
|
|
var jarrInnerData = item.GetValue("data") as JArray;
|
|
|
List<YGTDataDto> ygtdto = new List<YGTDataDto>();
|
|
|
DateTime? SJLGShiJian = null;//ATD
|
|
|
DateTime? YJDGShiJian = null;//ETA
|
|
|
DateTime? SJDGShiJian = null;//ATA
|
|
|
DateTime? YJLGShiJian = null;//ETD
|
|
|
int xl = 0;
|
|
|
foreach (JObject dataItem in jarrInnerData)
|
|
|
{
|
|
|
SJLGShiJian = dataItem.GetDateTimeValue("sjlg_time"); //实际离港时间
|
|
|
YJDGShiJian = dataItem.GetDateTimeValue("yjdk_time"); //预计到港时间
|
|
|
SJDGShiJian = dataItem.GetDateTimeValue("sjdk_time"); //实际到港时间
|
|
|
YJLGShiJian = dataItem.GetDateTimeValue("yjlk_time"); //预计离港时间
|
|
|
var xh_info = dataItem.GetValue("xh_info") as JArray;
|
|
|
xl = xh_info.Count();
|
|
|
foreach (JObject it in xh_info)
|
|
|
{
|
|
|
var CNTRNO = it.GetStringValue("ctn_no"); //箱号
|
|
|
var yd_time = it.GetDateTimeValue("yd_time"); //运抵时间
|
|
|
var wl_time = it.GetDateTimeValue("wl_time"); //外理时间
|
|
|
var mtfx = it.GetStringValue("mtfx"); //码头放行
|
|
|
var zz_time = it.GetDateTimeValue("zz_time"); //装载时间
|
|
|
var ck_time = it.GetDateTimeValue("ck_time"); //装船时间
|
|
|
var rg_time = it.GetDateTimeValue("rg_lr_time"); //入港时间
|
|
|
|
|
|
ygtdto.Add(new YGTDataDto
|
|
|
{
|
|
|
CNTRNO = CNTRNO,
|
|
|
YunDiShiJian = yd_time,
|
|
|
WaiLiShiJian = wl_time,
|
|
|
MTFX = mtfx,
|
|
|
ZhuangzhaiShiJian = zz_time,
|
|
|
ZhuangChuanShiJian = ck_time,
|
|
|
RuGangShiJian = rg_time
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
var rgnum = ygtdto.Where(x => x.RuGangShiJian != null).Count();
|
|
|
var ydnum = ygtdto.Where(x => x.YunDiShiJian != null).Count();
|
|
|
var zznum = ygtdto.Where(x => x.ZhuangzhaiShiJian != null).Count();
|
|
|
var wlnum = ygtdto.Where(x => x.WaiLiShiJian != null).Count();
|
|
|
var mfnum = ygtdto.Where(x => x.MTFX == "Y").Count();
|
|
|
var zcnum = ygtdto.Where(x => x.ZhuangChuanShiJian != null).Count();
|
|
|
|
|
|
var oldLog = await tenantDb.Queryable<BookingStatusLog>().Where(x => x.BusinessId == bookingId && x.Group == "yunzong" && (x.Status == "运抵" || x.Status == "装载" || x.Status == "外理" || x.Status == "码放" || x.Status == "装船" || x.Status == "入港" || x.Status == "ATD")).ToListAsync();
|
|
|
if (oldLog.Count > 0)
|
|
|
{
|
|
|
var oldid = oldLog.Select(x => x.Id).ToList();
|
|
|
//删除日志详情和日志
|
|
|
var oldLogDetails = await tenantDb.Queryable<BookingStatusLogDetail>().Where(x => oldid.Contains(x.PId)).ToListAsync();
|
|
|
if (oldLogDetails.Count > 0)
|
|
|
{
|
|
|
await tenantDb.Deleteable(oldLogDetails).ExecuteCommandAsync();
|
|
|
}
|
|
|
await tenantDb.Deleteable(oldLog).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
if (xl > 0 && rgnum > 0)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"入港",
|
|
|
Group = "yunzong",
|
|
|
OpTime = xl == ydnum ? ygtdto.Select(x => x.RuGangShiJian).Max() : null,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
|
|
|
foreach (var dt in ygtdto)
|
|
|
{
|
|
|
var BookingStatusLogDetail = new BookingStatusLogDetail()
|
|
|
{
|
|
|
PId = bookingStatusLog.Id,
|
|
|
Status = "入港",
|
|
|
CNTRNO = dt.CNTRNO,
|
|
|
OpTime = dt.RuGangShiJian
|
|
|
};
|
|
|
await tenantDb.Insertable(BookingStatusLogDetail).ExecuteCommandAsync();
|
|
|
}
|
|
|
if (list.Where(x => x.Value == "status_rugang").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_rugang",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_rugang").Select(x => x.Name).First(),
|
|
|
StatusTime = xl == ydnum ? ygtdto.Select(x => x.RuGangShiJian).Max() : null,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
await seaComService.SetGoodsStatus("YRG", bookingId, tenantDb);
|
|
|
}
|
|
|
}
|
|
|
if (xl > 0 && ydnum > 0)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"运抵",
|
|
|
Group = "yunzong",
|
|
|
OpTime = xl == ydnum ? ygtdto.Select(x => x.YunDiShiJian).Max() : null,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
|
|
|
foreach (var dt in ygtdto)
|
|
|
{
|
|
|
var BookingStatusLogDetail = new BookingStatusLogDetail()
|
|
|
{
|
|
|
PId = bookingStatusLog.Id,
|
|
|
Status = "运抵",
|
|
|
CNTRNO = dt.CNTRNO,
|
|
|
OpTime = dt.YunDiShiJian
|
|
|
};
|
|
|
await tenantDb.Insertable(BookingStatusLogDetail).ExecuteCommandAsync();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (xl > 0 && zznum > 0 && zznum == xl)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"装载",
|
|
|
Group = "yunzong",
|
|
|
OpTime = xl == zznum ? ygtdto.Select(x => x.ZhuangzhaiShiJian).Max() : null,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
if (list.Where(x => x.Value == "status_zhuangzai").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_zhuangzai",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_zhuangzai").Select(x => x.Name).First(),
|
|
|
StatusTime = xl == zznum ? ygtdto.Select(x => x.ZhuangzhaiShiJian).Max() : null,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
await seaComService.SetGoodsStatus("ZZFX", bookingId, tenantDb);
|
|
|
}
|
|
|
}
|
|
|
if (xl > 0 && wlnum > 0 && wlnum == xl)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"外理",
|
|
|
Group = "yunzong",
|
|
|
OpTime = null,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
if (xl > 0 && mfnum > 0 && mfnum == xl)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"码放",
|
|
|
Group = "yunzong",
|
|
|
OpTime = null,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
if (list.Where(x => x.Value == "status_mafang").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_mafang",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_mafang").Select(x => x.Name).First(),
|
|
|
StatusTime = xl == zznum ? ygtdto.Select(x => x.ZhuangzhaiShiJian).Max() : null,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
await seaComService.SetGoodsStatus("MTFX", bookingId, tenantDb);
|
|
|
};
|
|
|
}
|
|
|
if (xl > 0 && zcnum > 0)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"装船",
|
|
|
Group = "yunzong",
|
|
|
OpTime = xl == ydnum ? ygtdto.Select(x => x.ZhuangChuanShiJian).Max() : null,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
foreach (var dt in ygtdto)
|
|
|
{
|
|
|
var BookingStatusLogDetail = new BookingStatusLogDetail()
|
|
|
{
|
|
|
PId = bookingStatusLog.Id,
|
|
|
Status = "装船",
|
|
|
CNTRNO = dt.CNTRNO,
|
|
|
OpTime = dt.ZhuangChuanShiJian
|
|
|
};
|
|
|
await tenantDb.Insertable(BookingStatusLogDetail).ExecuteCommandAsync();
|
|
|
}
|
|
|
if (list.Where(x => x.Value == "status_zhuangchuan").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_zhuangchuan",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_zhuangchuan").Select(x => x.Name).First(),
|
|
|
StatusTime = xl == ydnum ? ygtdto.Select(x => x.ZhuangChuanShiJian).Max() : null,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
};
|
|
|
}
|
|
|
|
|
|
if (SJLGShiJian != null)
|
|
|
{
|
|
|
//新增数据
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"ATD",
|
|
|
Group = "yunzong",
|
|
|
OpTime = SJLGShiJian,
|
|
|
MBLNO = mblno
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
if (list.Where(x => x.Value == "status_atd").FirstOrDefault() == null)
|
|
|
{
|
|
|
BookingStatus bookingStatus = new BookingStatus()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
StatusCode = "status_atd",
|
|
|
StatusName = dicList.Where(x => x.Value == "status_atd").Select(x => x.Name).First(),
|
|
|
StatusTime = SJLGShiJian,
|
|
|
StatusGroup = "booking_status_group_billtrace"
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
};
|
|
|
}
|
|
|
|
|
|
|
|
|
var bookingOrder = await tenantDb.Queryable<SeaExport>().FirstAsync(x => x.Id == bookingId);
|
|
|
|
|
|
//ATD
|
|
|
if (SJLGShiJian != null && bookingOrder.ATD != SJLGShiJian)
|
|
|
{
|
|
|
//var oldorder = bookingOrder;
|
|
|
bookingOrder.ATD = SJLGShiJian;
|
|
|
bookingOrder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(bookingOrder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.ATD,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
|
|
|
if (!string.IsNullOrEmpty(bookingOrder.Vessel) && !string.IsNullOrEmpty(bookingOrder.Voyno) && !string.IsNullOrEmpty(bookingOrder.Carrier))
|
|
|
{
|
|
|
var neworder = await tenantDb.Queryable<SeaExport>().Where(x => x.Voyno == bookingOrder.Voyno && x.Vessel == bookingOrder.Vessel && x.CarrierId == bookingOrder.CarrierId && x.Id != bookingOrder.Id).ToListAsync();
|
|
|
|
|
|
foreach (var it in neworder)
|
|
|
{
|
|
|
var _oldorder = it.Adapt<SeaExport>();
|
|
|
if (it.ATD != SJLGShiJian)
|
|
|
{
|
|
|
_oldorder.ATD = SJLGShiJian;
|
|
|
_oldorder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(_oldorder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.ATD,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//ETA
|
|
|
if (YJDGShiJian != null && bookingOrder.StartETA != YJDGShiJian)
|
|
|
{
|
|
|
var oldorder = bookingOrder;
|
|
|
bookingOrder.StartETA = YJDGShiJian;
|
|
|
bookingOrder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(bookingOrder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.StartETA,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
|
|
|
if (!string.IsNullOrEmpty(bookingOrder.Vessel) && !string.IsNullOrEmpty(bookingOrder.Voyno) && !string.IsNullOrEmpty(bookingOrder.Carrier))
|
|
|
{
|
|
|
var neworder = await tenantDb.Queryable<SeaExport>().Where(x => x.Voyno == bookingOrder.Voyno && x.Vessel == bookingOrder.Vessel && x.CarrierId == bookingOrder.CarrierId && x.Id != bookingOrder.Id).ToListAsync();
|
|
|
|
|
|
foreach (var it in neworder)
|
|
|
{
|
|
|
var _oldorder = it.Adapt<SeaExport>();
|
|
|
if (it.StartETA != YJDGShiJian)
|
|
|
{
|
|
|
_oldorder.StartETA = YJDGShiJian;
|
|
|
_oldorder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(_oldorder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.ATD,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//ATA
|
|
|
if (SJDGShiJian != null && bookingOrder.StartATA != SJDGShiJian)
|
|
|
{
|
|
|
var oldorder = bookingOrder;
|
|
|
bookingOrder.StartATA = SJDGShiJian;
|
|
|
bookingOrder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(bookingOrder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.StartATA,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
|
|
|
if (!string.IsNullOrEmpty(bookingOrder.Vessel) && !string.IsNullOrEmpty(bookingOrder.Voyno) && !string.IsNullOrEmpty(bookingOrder.Carrier))
|
|
|
{
|
|
|
var neworder = await tenantDb.Queryable<SeaExport>().Where(x => x.Voyno == bookingOrder.Voyno && x.Vessel == bookingOrder.Vessel && x.CarrierId == bookingOrder.CarrierId && x.Id != bookingOrder.Id).ToListAsync();
|
|
|
|
|
|
foreach (var it in neworder)
|
|
|
{
|
|
|
var _oldorder = it.Adapt<SeaExport>();
|
|
|
if (it.StartATA != SJDGShiJian)
|
|
|
{
|
|
|
_oldorder.StartATA = SJDGShiJian;
|
|
|
_oldorder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(_oldorder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.StartATA,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
//ETD
|
|
|
if (YJLGShiJian != null && bookingOrder.YgtETD != YJLGShiJian)
|
|
|
{
|
|
|
var oldorder = bookingOrder;
|
|
|
bookingOrder.YgtETD = YJLGShiJian;
|
|
|
bookingOrder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(bookingOrder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.YgtETD,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
|
|
|
if (!string.IsNullOrEmpty(bookingOrder.Vessel) && !string.IsNullOrEmpty(bookingOrder.Voyno) && !string.IsNullOrEmpty(bookingOrder.Carrier))
|
|
|
{
|
|
|
var neworder = await tenantDb.Queryable<SeaExport>().Where(x => x.Voyno == bookingOrder.Voyno && x.Vessel == bookingOrder.Vessel && x.CarrierId == bookingOrder.CarrierId && x.Id != bookingOrder.Id).ToListAsync();
|
|
|
|
|
|
foreach (var it in neworder)
|
|
|
{
|
|
|
var _oldorder = it.Adapt<SeaExport>();
|
|
|
if (it.YgtETD != YJLGShiJian)
|
|
|
{
|
|
|
_oldorder.YgtETD = YJLGShiJian;
|
|
|
_oldorder.Note = "刷新运踪";
|
|
|
await tenantDb.Updateable(_oldorder).UpdateColumns(x => new
|
|
|
{
|
|
|
x.YgtETD,
|
|
|
x.Note
|
|
|
}).EnableDiffLogEvent().ExecuteCommandAsync();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
}
|