|
|
using DS.Module.SqlSugar;
|
|
|
using DS.Module.UserModule;
|
|
|
using DS.WMS.Core.HangfireJob.Interface;
|
|
|
using SqlSugar;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
using DS.Module.Core.Helpers;
|
|
|
using DS.Module.Core;
|
|
|
using DS.WMS.Core.Map.Entity;
|
|
|
using DS.WMS.Core.Op.Entity;
|
|
|
using DS.WMS.Core.Sys.Entity;
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
using DS.WMS.Core.Op.Interface;
|
|
|
using Logger = NLog.Logger;
|
|
|
using NLog;
|
|
|
using DS.Module.Core.Extensions;
|
|
|
using DS.WMS.Core.HangfireJob.Dtos;
|
|
|
using DS.Module.Core.Data;
|
|
|
|
|
|
namespace DS.WMS.Core.HangfireJob.Method
|
|
|
{
|
|
|
public class OpJobService: IOpJobService
|
|
|
{
|
|
|
private readonly IServiceProvider _serviceProvider;
|
|
|
private readonly ISqlSugarClient db;
|
|
|
private readonly IUser user;
|
|
|
private readonly ISaasDbService saasService;
|
|
|
private readonly IJobCommonService jobComService;
|
|
|
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
|
|
|
/// <summary>
|
|
|
///
|
|
|
/// </summary>
|
|
|
/// <param name="serviceProvider"></param>
|
|
|
public OpJobService(IServiceProvider serviceProvider)
|
|
|
{
|
|
|
_serviceProvider = serviceProvider;
|
|
|
db = _serviceProvider.GetRequiredService<ISqlSugarClient>();
|
|
|
user = _serviceProvider.GetRequiredService<IUser>();
|
|
|
saasService = _serviceProvider.GetRequiredService<ISaasDbService>();
|
|
|
jobComService = _serviceProvider.GetRequiredService<IJobCommonService>();
|
|
|
}
|
|
|
|
|
|
public async void VgmLinkJob(BaseJobReq req)
|
|
|
{
|
|
|
var tenantDb = saasService.GetBizJobDbScopeById(req);
|
|
|
tenantDb.QueryFilter.Clear<IOrgId>();
|
|
|
|
|
|
var bookingId = req.Id;
|
|
|
var order = tenantDb.Queryable<SeaExport>().First(x => x.Id == bookingId);
|
|
|
if (order == null)
|
|
|
{
|
|
|
throw new Exception("海运出口信息不存在!");
|
|
|
}
|
|
|
|
|
|
var orderUrl = tenantDb.Queryable<BookingOrderUrl>().First(x => x.BusinessId == bookingId);
|
|
|
if (orderUrl == null)
|
|
|
{
|
|
|
orderUrl = new BookingOrderUrl()
|
|
|
{
|
|
|
BusinessId = bookingId
|
|
|
};
|
|
|
await tenantDb.Insertable(orderUrl).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
//if (!string.IsNullOrEmpty(orderUrl.UrlVgm))
|
|
|
//{
|
|
|
// return await Task.FromResult(DataResult<string[]>.Success(new string[] { orderUrl.UrlVgm, orderUrl.UrlVgmSi }));
|
|
|
//}
|
|
|
|
|
|
//校验船公司
|
|
|
if (string.IsNullOrEmpty(order.Carrier) || order.CarrierId == 0)
|
|
|
{
|
|
|
throw new Exception("船公司未正确填写!");
|
|
|
}
|
|
|
|
|
|
var ctns = tenantDb.Queryable<OpCtn>().Where(x => x.BSNO == bookingId.ToString()).ToList();
|
|
|
//判断船公司是否支持
|
|
|
//db.Queryable<SysDictData>().Where(x => x.TypeId == 1790194688729419776).Select(x => x.Value).ToList();
|
|
|
var allowCarrier = db.Queryable<SysDictData>()
|
|
|
.InnerJoin<SysDictType>((a, b) => a.TypeId == b.Id).Where((a, b) => b.Code == "vgm_carrier_list").Select((a, b) => a.Value).ToList();
|
|
|
var carrCode = jobComService.GetCarrierCode(order.CarrierId, tenantDb);
|
|
|
if (!allowCarrier.Contains(carrCode))
|
|
|
throw new Exception("不支持的船公司!");
|
|
|
|
|
|
//船公司网站账号
|
|
|
var carrWebAccMap = db.Queryable<SysDictData>()
|
|
|
.InnerJoin<SysDictType>((a, b) => a.TypeId == b.Id).Where((a, b) => b.Code == "carrier_web_account_mapping" && a.Name == carrCode)
|
|
|
.Select((a, b) => new { Value = a.Value, Name = a.Name }).First();
|
|
|
//x.CustomerId == order.CarrierId &&
|
|
|
var webacc = jobComService.GetCodeThirdParty(carrWebAccMap.Value, user.UserId, tenantDb);
|
|
|
if (webacc == null)
|
|
|
throw new Exception("船公司VGM网站账号未配置!");
|
|
|
|
|
|
//场站转换
|
|
|
var yardset = tenantDb.Queryable<MappingYard>().Where(x => x.Status == StatusEnum.Enable && x.Module == "BookingVgm" && x.LinkId == order.YardId).First();
|
|
|
if (yardset == null)
|
|
|
{
|
|
|
throw new Exception("场站EDI配置未找到:{0}\", $\"{order.Yard}(VGM)");
|
|
|
}
|
|
|
|
|
|
//校验箱子数据录入
|
|
|
if (ctns.Where(c => string.IsNullOrEmpty(c.CtnAll) || !c.CtnNum.HasValue).Count() > 0)
|
|
|
{
|
|
|
throw new Exception("所有箱型箱量必须录入完整!");
|
|
|
}
|
|
|
|
|
|
//箱型映射
|
|
|
var ctnMapping = tenantDb.Queryable<MappingCtn>().Where(x => x.Module == "BookingVgm").ToList();
|
|
|
//if (ctnMapping.Count == 0)
|
|
|
//{
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK122);
|
|
|
//}
|
|
|
|
|
|
var expCode = ctns.Select(x => x.CtnCode).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
|
|
|
if (expCode.Count > 0)
|
|
|
{
|
|
|
throw new Exception("箱型EDI配置未找到:{0}\", $\"{string.Join(',', expCode)}(VGM)!");
|
|
|
}
|
|
|
|
|
|
var userInfo = await db.Queryable<SysUser>().Filter(null, true).FirstAsync(x => x.Id == req.UserId);
|
|
|
var tenant = db.Queryable<SysTenant>().Filter(null, true).First(x => x.Id == req.TenantId);
|
|
|
|
|
|
var destinationCode = jobComService.GetPortCode(order.DestinationId, tenantDb);
|
|
|
var loadPortCode = jobComService.GetPortCode(order.LoadPortId, tenantDb);
|
|
|
var dischargePortCode = jobComService.GetPortCode(order.DischargePortId, tenantDb);
|
|
|
|
|
|
//调用vgm链接服务
|
|
|
var postUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "vgm_link_service" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var postObj = new
|
|
|
{
|
|
|
SystemCode = "djy_hechuan",
|
|
|
billOrderId = order.Id.ToString(),
|
|
|
sendOrderCode = order.MBLNO,
|
|
|
customerName = $"{tenant.Name}+{userInfo.UserName}", //公司名称+用户姓名
|
|
|
customerId = order.CustomerId.ToString(),
|
|
|
agentName = string.IsNullOrEmpty(order.Forwarder) ? tenant.Name : order.Forwarder,
|
|
|
carrierCode = carrCode,
|
|
|
userName = webacc.AppKey,
|
|
|
userPassword = webacc.AppSecret,
|
|
|
depotCode = yardset.MapCode,
|
|
|
depotName = yardset.MapName,
|
|
|
linkName = userInfo.UserName,
|
|
|
linkMobile = userInfo.Phone,
|
|
|
linkEmail = userInfo.Email,
|
|
|
//userId = userInfo.DjyUserId,
|
|
|
userId = order.SaleId,
|
|
|
signatory = userInfo.UserName,
|
|
|
//returnUrl = dicUrlVgmResp?.Value,
|
|
|
shipName = order.Vessel,
|
|
|
voyNo = order.Voyno,
|
|
|
etdstr = order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
potrSend = order.LoadPort,
|
|
|
potrGoal = order.DischargePort,
|
|
|
boxinfoStr = order.CntrTotal.Replace("'", ""),
|
|
|
vgmEndTimeStr = order.CloseVgmDate.HasValue ? order.CloseVgmDate.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
returnOkUrl = "",
|
|
|
//SiReturnUrl = dicUrlSiResp?.Value,
|
|
|
DataInfoJson = new
|
|
|
{
|
|
|
order.Shipper,
|
|
|
order.Consignee,
|
|
|
order.NotifyParty,
|
|
|
order.Marks,
|
|
|
order.Description,
|
|
|
order.MBLFrt,
|
|
|
order.Service,
|
|
|
order.IssueType,
|
|
|
order.TransPort,
|
|
|
order.TransPortCode,
|
|
|
order.Destination,
|
|
|
//order.DestinationId,
|
|
|
destinationCode,
|
|
|
order.KindPkgs,
|
|
|
order.ThirdPayAt,
|
|
|
order.LoadPort,
|
|
|
//order.LoadPortId,
|
|
|
loadPortCode,
|
|
|
order.DischargePort,
|
|
|
//order.DischargePortId
|
|
|
dischargePortCode
|
|
|
}
|
|
|
};
|
|
|
|
|
|
string strPostObj = postObj.ToJsonString();
|
|
|
_logger.Info($"调用VGM链接接口 {postUrl} 传递数据:{strPostObj}");
|
|
|
var result = RequestHelper.Post(strPostObj, postUrl);
|
|
|
_logger.Info($"调用VGM链接接口返回:{result}");
|
|
|
|
|
|
var jobjResp = JObject.Parse(result);
|
|
|
int respCode = jobjResp.GetIntValue("code");
|
|
|
if (respCode != 200)
|
|
|
{
|
|
|
throw new Exception(jobjResp.GetStringValue("message"));
|
|
|
}
|
|
|
|
|
|
|
|
|
//保存url
|
|
|
var memoData = jobjResp.GetJObjectValue("memoData");
|
|
|
orderUrl.UrlVgm = memoData.GetStringValue("vgmUrl");
|
|
|
orderUrl.UrlVgmSi = memoData.GetStringValue("vgmAndSiUrl");
|
|
|
await tenantDb.Updateable(orderUrl).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
|
//货运动态
|
|
|
var bookingStatus = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"生成VGM链接",
|
|
|
Group = "ship",
|
|
|
OpTime = DateTime.Now,
|
|
|
MBLNO = order.MBLNO
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
public async void TxxpLinkJob(BaseJobReq req)
|
|
|
{
|
|
|
var tenantDb = saasService.GetBizJobDbScopeById(req);
|
|
|
tenantDb.QueryFilter.Clear<IOrgId>();
|
|
|
|
|
|
var bookingId = req.Id;
|
|
|
var order = tenantDb.Queryable<SeaExport>().First(x => x.Id == bookingId);
|
|
|
|
|
|
var orderUrl = tenantDb.Queryable<BookingOrderUrl>().First(x => x.BusinessId == bookingId);
|
|
|
if (orderUrl == null)
|
|
|
{
|
|
|
orderUrl = new BookingOrderUrl()
|
|
|
{
|
|
|
BusinessId = bookingId
|
|
|
};
|
|
|
await tenantDb.Insertable(orderUrl).ExecuteCommandAsync();
|
|
|
}
|
|
|
|
|
|
//校验船公司
|
|
|
if (string.IsNullOrEmpty(order.Carrier) || order.CarrierId == 0)
|
|
|
{
|
|
|
throw new Exception("船公司未正确填写!");
|
|
|
}
|
|
|
|
|
|
var ctns = tenantDb.Queryable<OpCtn>().Where(x => x.BSNO == bookingId.ToString()).ToList();
|
|
|
//判断船公司是否支持
|
|
|
//db.Queryable<SysDictData>().Where(x => x.TypeId == 1790194688729419776).Select(x => x.Value).ToList();
|
|
|
var allowCarrier = db.Queryable<SysDictData>()
|
|
|
.InnerJoin<SysDictType>((a, b) => a.TypeId == b.Id).Where((a, b) => b.Code == "vgm_carrier_list").Select((a, b) => a.Value).ToList();
|
|
|
var carrCode = jobComService.GetCarrierCode(order.CarrierId, tenantDb);
|
|
|
if (!allowCarrier.Contains(carrCode))
|
|
|
throw new Exception("不支持的船公司!"+ carrCode);
|
|
|
|
|
|
var carrMap = tenantDb.Queryable<MappingCarrier>().Where(y => y.Code == carrCode && y.Module == "BookingTxxp").First();
|
|
|
if (carrMap != null)
|
|
|
{
|
|
|
carrCode = carrMap.MapCode;
|
|
|
}
|
|
|
|
|
|
//根据订舱代理获取账号类型
|
|
|
var ytMapList = db.Queryable<SysDictData>()
|
|
|
.InnerJoin<SysDictType>((a, b) => a.TypeId == b.Id).Where((a, b) => b.Code == "txxp_yitong_forwarder_map")
|
|
|
.Select((a, b) => new { Value = a.Value, Name = a.Name }).ToList();
|
|
|
|
|
|
var forwarderCode = jobComService.GetClientCode(order.ForwarderId, tenantDb);
|
|
|
var ytmap = ytMapList.FirstOrDefault(x => x.Value == forwarderCode);
|
|
|
if (ytmap == null)
|
|
|
{
|
|
|
throw new Exception($"订舱代理 {order.Forwarder} 对应的网站账号类型未配置");
|
|
|
}
|
|
|
|
|
|
//亿通账号
|
|
|
var ytAcc = jobComService.GetCodeThirdParty("YitongWeb", user.UserId, tenantDb, order.ForwarderId);
|
|
|
if (ytAcc == null)
|
|
|
throw new Exception("亿通账号未配置");
|
|
|
|
|
|
//场站转换
|
|
|
var yardsetList = tenantDb.Queryable<MappingYard>().Where(x => x.Status == StatusEnum.Enable && x.Module == "BookingTxxp" && x.LinkId == order.YardId && (x.CarrierId == 0 || x.CarrierId == order.CarrierId)).ToList();
|
|
|
if (yardsetList.Count == 0)
|
|
|
{
|
|
|
throw new Exception(String.Format("场站EDI配置未找到:{0}", $"{order.Yard} {order.Carrier}(提箱小票)"));
|
|
|
}
|
|
|
|
|
|
var yardset = yardsetList.FirstOrDefault(x => x.Code == carrCode);
|
|
|
if (yardset == null)
|
|
|
{
|
|
|
yardset = yardsetList.FirstOrDefault(x => x.Code == null || x.Code == "");
|
|
|
}
|
|
|
|
|
|
//校验箱子数据录入
|
|
|
if (ctns.Where(c => string.IsNullOrEmpty(c.CtnAll) || !c.CtnNum.HasValue).Count() > 0)
|
|
|
{
|
|
|
throw new Exception("所有箱型箱量必须录入完整!");
|
|
|
}
|
|
|
|
|
|
//箱型映射
|
|
|
var ctnMapping = tenantDb.Queryable<MappingCtn>().Where(x => x.Module == "BookingTxxp").ToList();
|
|
|
|
|
|
var expCode = ctns.Select(x => x.CtnCode).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
|
|
|
if (expCode.Count > 0)
|
|
|
{
|
|
|
var expName = ctns.Where(x => expCode.Contains(x.CtnCode)).Select(x => x.CtnAll).Distinct().ToList();
|
|
|
throw new Exception("箱型EDI配置未找到:{0}\", $\"{string.Join(',', expCode)}(提箱小票)!");
|
|
|
}
|
|
|
|
|
|
var userInfo = await db.Queryable<SysUser>().Filter(null, true).FirstAsync(x => x.Id == req.UserId);
|
|
|
var tenant = db.Queryable<SysTenant>().Filter(null, true).First(x => x.Id == req.TenantId);
|
|
|
|
|
|
//调用小票服务
|
|
|
var postUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "txxp_service" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
var postObj = new
|
|
|
{
|
|
|
SystemCode = "djy_hechuan",
|
|
|
CarrierCode = carrCode,
|
|
|
billOrderId = order.Id.ToString(),
|
|
|
sendOrderCode = order.MBLNO,
|
|
|
//userId = userInfo.DjyUserId,
|
|
|
userId = order.SaleId,
|
|
|
customerId = order.CustomerId.ToString(),
|
|
|
// userName = currUser.CODENAME,
|
|
|
//userPassword = currUser.PASSWORD,
|
|
|
operatorName = userInfo.UserName,
|
|
|
depotCode = yardset.MapCode,
|
|
|
depotName = yardset.MapName,
|
|
|
AgentName = tenant.Name,
|
|
|
linkName = userInfo.UserName,
|
|
|
linkMobile = userInfo.Phone,
|
|
|
CustomerName = $"{tenant.Name}+{userInfo.UserName}", //公司名称+用户姓名
|
|
|
memo = string.Empty,
|
|
|
boxInfo = ctns.Select(c =>
|
|
|
{
|
|
|
var mapCtn = ctnMapping.First(x => x.Code == c.CtnCode);
|
|
|
return new
|
|
|
{
|
|
|
boxType = mapCtn == null ? c.CtnAll : mapCtn.MapCode,
|
|
|
boxCount = c.CtnNum.Value
|
|
|
};
|
|
|
}),
|
|
|
sysLoginName = ytAcc.AppKey,
|
|
|
sysPsssword = ytAcc.AppSecret,
|
|
|
systemCode = "Dongsheng8"
|
|
|
};
|
|
|
|
|
|
|
|
|
string strPostObj = postObj.ToJsonString();
|
|
|
_logger.Info($"调用提箱小票接口传递数据:{strPostObj}");
|
|
|
var result = RequestHelper.Post(strPostObj, postUrl);
|
|
|
_logger.Info($"调用提箱小票接口返回:{result}");
|
|
|
|
|
|
var jobjResp = JObject.Parse(result);
|
|
|
int respCode = jobjResp.GetIntValue("code");
|
|
|
if (respCode != 200)
|
|
|
{
|
|
|
throw new Exception(jobjResp.GetStringValue("message"));
|
|
|
}
|
|
|
|
|
|
var addUrlFlag = string.IsNullOrEmpty(orderUrl.UrlTxxp) ? true : false; //新生成还是更新链接
|
|
|
//保存url
|
|
|
|
|
|
//保存url
|
|
|
var txxpUrl = jobjResp.GetStringValue("data");
|
|
|
orderUrl.UrlTxxp = txxpUrl;
|
|
|
await tenantDb.Updateable(orderUrl).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
|
//货运动态
|
|
|
var bookingStatus = new BookingStatusLog()
|
|
|
{
|
|
|
BusinessId = bookingId,
|
|
|
Status = $"{(addUrlFlag ? "生成" : "更新")}提箱小票链接",
|
|
|
Group = "ship",
|
|
|
OpTime = DateTime.Now,
|
|
|
MBLNO = order.MBLNO
|
|
|
};
|
|
|
await tenantDb.Insertable(bookingStatus).ExecuteCommandAsync();
|
|
|
}
|
|
|
}
|
|
|
}
|