|
|
@ -1,93 +1,64 @@
|
|
|
|
using Myshipping.Core;
|
|
|
|
using Furion;
|
|
|
|
using Furion.DependencyInjection;
|
|
|
|
using Furion.DependencyInjection;
|
|
|
|
|
|
|
|
using Furion.DistributedIDGenerator;
|
|
|
|
using Furion.DynamicApiController;
|
|
|
|
using Furion.DynamicApiController;
|
|
|
|
|
|
|
|
using Furion.EventBus;
|
|
|
|
|
|
|
|
using Furion.FriendlyException;
|
|
|
|
|
|
|
|
using Furion.JsonSerialization;
|
|
|
|
|
|
|
|
using Furion.RemoteRequest.Extensions;
|
|
|
|
using Mapster;
|
|
|
|
using Mapster;
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
|
|
using SqlSugar;
|
|
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
using Myshipping.Application.Entity;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
using Furion;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
using Furion.DataEncryption;
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using System.Security.Claims;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Authentication.Cookies;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Authentication;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
|
|
|
|
|
using Furion.FriendlyException;
|
|
|
|
|
|
|
|
using Furion.Logging;
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
using System.Reflection;
|
|
|
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
|
|
|
using Myshipping.Application.Service.BookingOrder.Dto;
|
|
|
|
|
|
|
|
using Myshipping.Application.ConfigOption;
|
|
|
|
using Myshipping.Application.ConfigOption;
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
using Yitter.IdGenerator;
|
|
|
|
|
|
|
|
using Myshipping.Core.Entity;
|
|
|
|
|
|
|
|
using Furion.RemoteRequest.Extensions;
|
|
|
|
|
|
|
|
using System.Net.Http;
|
|
|
|
|
|
|
|
using Myshipping.Core.Service;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI;
|
|
|
|
using Myshipping.Application.EDI;
|
|
|
|
using System.Text;
|
|
|
|
using Myshipping.Application.EDI.ESL;
|
|
|
|
using System.Web;
|
|
|
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
|
|
|
using Myshipping.Core.Helper;
|
|
|
|
|
|
|
|
using Myshipping.Application.Enum;
|
|
|
|
|
|
|
|
using Org.BouncyCastle.Asn1.X500;
|
|
|
|
|
|
|
|
using System.Drawing.Drawing2D;
|
|
|
|
|
|
|
|
using StackExchange.Profiling.Internal;
|
|
|
|
|
|
|
|
using Myshipping.Application;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI.PIL;
|
|
|
|
using Myshipping.Application.EDI.PIL;
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
using Myshipping.Application.EDI.SeaLead;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI.SITC;
|
|
|
|
using Myshipping.Application.EDI.TSL;
|
|
|
|
using Myshipping.Application.EDI.TSL;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI.VOLTA;
|
|
|
|
using Myshipping.Application.EDI.WY;
|
|
|
|
using Myshipping.Application.EDI.WY;
|
|
|
|
using Myshipping.Application.EDI.YML;
|
|
|
|
using Myshipping.Application.EDI.YML;
|
|
|
|
using Myshipping.Application.EDI.YT;
|
|
|
|
using Myshipping.Application.EDI.YT;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
using Myshipping.Application.Entity;
|
|
|
|
using System.Threading;
|
|
|
|
using Myshipping.Application.Enum;
|
|
|
|
using Furion.JsonSerialization;
|
|
|
|
|
|
|
|
using System.Xml.Linq;
|
|
|
|
|
|
|
|
using Myshipping.Application.Helper;
|
|
|
|
using Myshipping.Application.Helper;
|
|
|
|
using System.Net;
|
|
|
|
using Myshipping.Application.Service.BookingOrder.Dto;
|
|
|
|
using Furion.DistributedIDGenerator;
|
|
|
|
using Myshipping.Application.Service.BookingOrder.Dto.MSKAPI;
|
|
|
|
using System.Linq.Expressions;
|
|
|
|
using Myshipping.Application.Service.BookingSlot.Dto;
|
|
|
|
|
|
|
|
using Myshipping.Application.Service.DataSync.Dto;
|
|
|
|
|
|
|
|
using Myshipping.Core;
|
|
|
|
|
|
|
|
using Myshipping.Core.Const;
|
|
|
|
|
|
|
|
using Myshipping.Core.Entity;
|
|
|
|
|
|
|
|
using Myshipping.Core.Entity.PingTai;
|
|
|
|
using Myshipping.Core.Extension;
|
|
|
|
using Myshipping.Core.Extension;
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
using Myshipping.Core.Helper;
|
|
|
|
using MathNet.Numerics.Distributions;
|
|
|
|
using Myshipping.Core.Service;
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
using Myshipping.Application.EDI.ESL;
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
using NPOI.HSSF.UserModel;
|
|
|
|
using NPOI.HSSF.UserModel;
|
|
|
|
using NPOI.SS.UserModel;
|
|
|
|
using NPOI.SS.UserModel;
|
|
|
|
using NPOI.SS.Formula.Functions;
|
|
|
|
using RabbitMQ.Client;
|
|
|
|
using NPOI.HPSF;
|
|
|
|
using SqlSugar;
|
|
|
|
using MimeKit;
|
|
|
|
using StackExchange.Profiling.Internal;
|
|
|
|
using NPOI.SS.Formula;
|
|
|
|
using System;
|
|
|
|
using NPOI.Util;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Specialized;
|
|
|
|
using System.Collections.Specialized;
|
|
|
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
using System.Net.Http;
|
|
|
|
using System.Net.Http.Headers;
|
|
|
|
using System.Net.Http.Headers;
|
|
|
|
using MySqlX.XDevAPI.Common;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
using Ubiety.Dns.Core;
|
|
|
|
using System.Text;
|
|
|
|
using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData;
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
using System.Security.Cryptography;
|
|
|
|
using System.Threading;
|
|
|
|
using Myshipping.Application.Service.DataSync.Dto;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using RabbitMQ.Client;
|
|
|
|
using System.Web;
|
|
|
|
using System.Configuration;
|
|
|
|
|
|
|
|
using System.Collections;
|
|
|
|
|
|
|
|
using System.Security.Principal;
|
|
|
|
|
|
|
|
using Myshipping.Core.Const;
|
|
|
|
|
|
|
|
using ICSharpCode.SharpZipLib.BZip2;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI.VOLTA;
|
|
|
|
|
|
|
|
using TinyPinyin;
|
|
|
|
using TinyPinyin;
|
|
|
|
using Furion.EventBus;
|
|
|
|
using Yitter.IdGenerator;
|
|
|
|
using Myshipping.Application.Service.BookingSlot.Dto;
|
|
|
|
|
|
|
|
using Myshipping.Application.Service.BookingOrder.Dto.MSKAPI;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Routing.Template;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI.SeaLead;
|
|
|
|
|
|
|
|
using Myshipping.Application.EDI.SITC;
|
|
|
|
|
|
|
|
using Myshipping.Core.Entity.PingTai;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Myshipping.Application
|
|
|
|
namespace Myshipping.Application
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -5240,10 +5211,418 @@ namespace Myshipping.Application
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// 直发VGM(单票)
|
|
|
|
/// 直发VGM(单票)
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="bookingId"></param>
|
|
|
|
/// <param name="bookingId">订单Id</param>
|
|
|
|
|
|
|
|
/// <param name="isSendCarr">是否发送船司</param>
|
|
|
|
|
|
|
|
/// <param name="isSendYGT">是否发送云港通</param>
|
|
|
|
|
|
|
|
/// <param name="isCheckRepeat">是否检查重复发送</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPost("/BookingOrder/VgmSend")]
|
|
|
|
[HttpPost("/BookingOrder/VgmSend")]
|
|
|
|
public async Task<object> VgmSend(long bookingId)
|
|
|
|
public async Task<object> VgmSend(long bookingId, bool isSendCarr, bool isSendYGT, bool? isCheckRepeat)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//throw Oops.Bah(201, $"是否重新发送?");
|
|
|
|
|
|
|
|
//throw Oops.Bah($"是否重新发送?");
|
|
|
|
|
|
|
|
if (App.Configuration["RunType"] == CommonConst.RUN_TYPE_HECHUAN && App.Configuration["RunTest"] == "true")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return await VgmSendNewSchema(bookingId, isSendCarr, isSendYGT, isCheckRepeat);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return await VgmSendOldSchema(bookingId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// VGM发送(新)
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="bookingId">订单Id</param>
|
|
|
|
|
|
|
|
/// <param name="isSendCarr">是否发送船司</param>
|
|
|
|
|
|
|
|
/// <param name="isSendYGT">是否发送云港通</param>
|
|
|
|
|
|
|
|
/// <param name="isCheckRepeat">是否检查重复发送</param>
|
|
|
|
|
|
|
|
/// <remarks>发船司判断走船司直发或者通过大简云新API发送;发云港通通过大简云新API发送</remarks>
|
|
|
|
|
|
|
|
public async Task<object> VgmSendNewSchema(long bookingId, bool isSendCarr, bool isSendYGT, bool? isCheckRepeat)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!isSendCarr && !isSendYGT)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("VGM发送船司或云港通至少选择一项");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var order = await _rep.FirstOrDefaultAsync(x => x.Id == bookingId);
|
|
|
|
|
|
|
|
var ctns = await _repCtn.Where(x => x.BILLID == bookingId).ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (order == null)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("未获取到订单信息,可能已被删除,请关闭页面重新打开");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ctns.Count == 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("箱信息为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 查询vgm发送状态
|
|
|
|
|
|
|
|
var vgmStatus = await _rep.Context.Queryable<BookingVGMStatus>().Where(x => x.BookingId == bookingId).FirstAsync();
|
|
|
|
|
|
|
|
if (vgmStatus == null)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus = new BookingVGMStatus()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
BookingId = bookingId
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 船司VGM是否通过直发的方式
|
|
|
|
|
|
|
|
bool isSendCarrDirect = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//船公司
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(order.CARRIERID))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK118);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//提单号不能为空
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(order.MBLNO))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK127);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(order.YARD) || string.IsNullOrEmpty(order.YARDID))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("场站未正确选择");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 验证是否重复发送
|
|
|
|
|
|
|
|
if (isCheckRepeat == true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var repeatType = new List<string>(2);
|
|
|
|
|
|
|
|
if (isSendCarr && vgmStatus.IsSendCarrierSuccess)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
repeatType.Add("【船司】");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isSendYGT && vgmStatus.IsSendYgtSuccess)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
repeatType.Add("【云港通】");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (repeatType.Count > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah($"已发送过{string.Join("、", repeatType)}VGM,是否重新发送?");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ctns.Where(c => c.WEIGHTYPE == "累加" &&
|
|
|
|
|
|
|
|
(
|
|
|
|
|
|
|
|
string.IsNullOrEmpty(c.CNTRNO)
|
|
|
|
|
|
|
|
|| !c.WEIGHKGS.HasValue
|
|
|
|
|
|
|
|
|| c.WEIGHKGS == 0
|
|
|
|
|
|
|
|
|| !c.TAREWEIGHT.HasValue
|
|
|
|
|
|
|
|
|| c.TAREWEIGHT == 0
|
|
|
|
|
|
|
|
|| !c.KGS.HasValue
|
|
|
|
|
|
|
|
|| c.KGS == 0)
|
|
|
|
|
|
|
|
).Count() > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("称重方式为累加时,箱号、重量、箱皮重以及称重重量都不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ctns.Where(c => c.WEIGHTYPE == "总重" &&
|
|
|
|
|
|
|
|
(
|
|
|
|
|
|
|
|
string.IsNullOrEmpty(c.CNTRNO)
|
|
|
|
|
|
|
|
|| !c.WEIGHKGS.HasValue
|
|
|
|
|
|
|
|
|| c.WEIGHKGS == 0)
|
|
|
|
|
|
|
|
).Count() > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("称重方式为总重时,箱号和称重重量都不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var tenantParamList = _cache.GetAllTenantParam().Result;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isSendCarr)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var config = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "VgmDirectSendCarrierId");
|
|
|
|
|
|
|
|
if (config != null
|
|
|
|
|
|
|
|
&& config.ItemCode?.Split(",", StringSplitOptions.RemoveEmptyEntries)?.Contains(order.CARRIERID) == true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
isSendCarrDirect = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isSendCarrDirect)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
await VGMDirectSendCarrier(bookingId, order, ctns);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrier = true;
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierDirect = true;
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierSuccess = true;
|
|
|
|
|
|
|
|
vgmStatus.SendCarrierMessage = "发送船司成功";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrier = true;
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierDirect = true;
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierSuccess = false;
|
|
|
|
|
|
|
|
vgmStatus.SendCarrierMessage = $"发送船司失败:{ex.Message}";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((isSendCarr && !isSendCarrDirect) || isSendYGT)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var sysconfig = await _cache.GetAllSysConfig();
|
|
|
|
|
|
|
|
var urlConfig = sysconfig.FirstOrDefault(x => x.GroupCode == "DJY_CONST" && x.Code == "DjyCarrierAndYgtVgmApi");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取用户Key及Secret
|
|
|
|
|
|
|
|
var keySecretParam = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "DjyCarrierAndYgtVgmApiKeySecret");
|
|
|
|
|
|
|
|
if (keySecretParam == null || !keySecretParam.ItemCode.Contains(','))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("请在租户参数配置【船司及云港通VGM发送API】所需的Key及Secret");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
var keySecretArr = keySecretParam.ItemCode.Split(',');
|
|
|
|
|
|
|
|
var dicHead = new Dictionary<string, string>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
{ "USER_KEY", keySecretArr[0] },
|
|
|
|
|
|
|
|
{ "USER_SECRET", keySecretArr[1] }
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//ETD不能为空
|
|
|
|
|
|
|
|
if (!order.ETD.HasValue)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("ETD不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//重量不能为空
|
|
|
|
|
|
|
|
if (!order.KGS.HasValue)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("重量不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 场站映射
|
|
|
|
|
|
|
|
string mappingYard;
|
|
|
|
|
|
|
|
var yardMapList = _cache.GetAllMappingYard().Result?.Where(y => y.Code == order.YARDID && y.Module == "VgmPlat" && (y.CarrierCode == null || y.CarrierCode == "" || y.CarrierCode == order.CARRIERID))?.ToList();
|
|
|
|
|
|
|
|
if (yardMapList?.Any() == true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var yardset = yardMapList.FirstOrDefault(x => x.CarrierCode == order.CARRIERID)
|
|
|
|
|
|
|
|
?? yardMapList.FirstOrDefault(x => x.CarrierCode == null || x.CarrierCode == "");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mappingYard = yardset.MapName;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
mappingYard = order.YARD;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 判断并验证发送类型
|
|
|
|
|
|
|
|
string carrSendType = null, ygtSendType = null;
|
|
|
|
|
|
|
|
if (isSendCarr && !isSendCarrDirect)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (vgmStatus.IsSendCarrierSuccess)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
carrSendType = "update";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
carrSendType = "add";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isSendYGT)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (vgmStatus.IsSendYgtSuccess)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ygtSendType = "update";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ygtSendType = "add";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (carrSendType != null && ygtSendType != null && carrSendType != ygtSendType)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (carrSendType == "add" && ygtSendType == "update")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("检测到已发送过船司VGM非直发,请分别进行船司VGM的非直发新增以及云港通VGM的修改操作");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("检测到已发送过云港通VGM,请分别进行船司VGM的非直发修改以及云港通VGM的新增操作");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var sendObj = new VgmPlatDto
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// 到这一步,carrSendType和ygtSendType在都不为null的情况下,应该是一致的
|
|
|
|
|
|
|
|
SendType = (carrSendType ?? ygtSendType) switch
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"add" => "9",
|
|
|
|
|
|
|
|
"update" => "5",
|
|
|
|
|
|
|
|
_ => throw Oops.Bah("无法判断发送类型")
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
SendCarr = (isSendCarr && !isSendCarrDirect),
|
|
|
|
|
|
|
|
SendYGT = isSendYGT,
|
|
|
|
|
|
|
|
IsLinkSave = false,
|
|
|
|
|
|
|
|
IsApiSave = false,
|
|
|
|
|
|
|
|
MFNO = vgmStatus.MFNO,
|
|
|
|
|
|
|
|
MBLNO = order.MBLNO,
|
|
|
|
|
|
|
|
CARRIER = order.CARRIERID,
|
|
|
|
|
|
|
|
ETD = order.ETD,
|
|
|
|
|
|
|
|
WeiTuoFaSongFang = "",
|
|
|
|
|
|
|
|
ChuanMing = order.VESSEL,
|
|
|
|
|
|
|
|
HangCi = order.VOYNO,
|
|
|
|
|
|
|
|
BeiZhu = order.CZRemark,
|
|
|
|
|
|
|
|
ZhuangHuoGang = order.PORTLOAD,
|
|
|
|
|
|
|
|
ZhuangHuoGangDaiMa = order.PORTLOADID,
|
|
|
|
|
|
|
|
YARD = mappingYard,
|
|
|
|
|
|
|
|
ORDERNO = order.CUSTNO,
|
|
|
|
|
|
|
|
VGMCLOSETIME = order.CLOSEVGMDATE,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CtnList = ctns.Select(c => new VgmPlatCtnDto()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CTNALL = c.CTNALL,
|
|
|
|
|
|
|
|
CNTRNO = c.CNTRNO,
|
|
|
|
|
|
|
|
SEALNO = c.SEALNO,
|
|
|
|
|
|
|
|
KGS = c.KGS,
|
|
|
|
|
|
|
|
PKGS = c.PKGS,
|
|
|
|
|
|
|
|
PIZHONG = c.TAREWEIGHT.Value,
|
|
|
|
|
|
|
|
ChengZhongFangShi = c.WEIGHTYPE,
|
|
|
|
|
|
|
|
ChengZhongShiJian = string.IsNullOrEmpty(c.WEIGHDATE) ? DateTime.Today.ToString("yyyy-MM-dd") : c.WEIGHDATE,
|
|
|
|
|
|
|
|
ChengZhongZhongLiang = c.WEIGHKGS,
|
|
|
|
|
|
|
|
SendFlag = true
|
|
|
|
|
|
|
|
}).ToList()
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用VGM平台的发送接口:{urlConfig.Value},参数:{JsonConvert.SerializeObject(sendObj)}");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var rtn = await urlConfig.Value
|
|
|
|
|
|
|
|
.SetBody(sendObj, "application/json")
|
|
|
|
|
|
|
|
.SetHeaders(dicHead)
|
|
|
|
|
|
|
|
.PostAsStringAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用VGM平台的发送接口:{urlConfig.Value},返回:{rtn}");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var jobjRtn = JObject.Parse(rtn);
|
|
|
|
|
|
|
|
var isSuccess = jobjRtn.GetBooleanValue("succeeded");
|
|
|
|
|
|
|
|
var errors = jobjRtn.GetStringValue("errors");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var jobjData = jobjRtn.GetJObjectValue("data");
|
|
|
|
|
|
|
|
var carrSendFlag = jobjData?.GetIntValue("carrierSendFlag");
|
|
|
|
|
|
|
|
var ygtSendFlag = jobjData?.GetIntValue("ygtSendFlag");
|
|
|
|
|
|
|
|
var sendRltMsg = jobjData?.GetStringValue("sendRltMsg");
|
|
|
|
|
|
|
|
var vgmMFNO = jobjData?.GetValue("mfno")?.ToString();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(vgmMFNO))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.MFNO = vgmMFNO;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isSuccess)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//货运动态(两种)
|
|
|
|
|
|
|
|
var statusLogList = new List<BookingStatusLog>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isSendCarr && !isSendCarrDirect)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrier = true;
|
|
|
|
|
|
|
|
if (carrSendFlag == 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierSuccess = true;
|
|
|
|
|
|
|
|
vgmStatus.SendCarrierMessage = "发送船司成功";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
statusLogList.Add(new BookingStatusLog()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
BookingId = bookingId,
|
|
|
|
|
|
|
|
Status = $"发送船司VGM",
|
|
|
|
|
|
|
|
OpTime = DateTime.Now,
|
|
|
|
|
|
|
|
Category = "ship",
|
|
|
|
|
|
|
|
MBLNO = order.MBLNO
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierSuccess = false;
|
|
|
|
|
|
|
|
vgmStatus.SendCarrierMessage = $"发送船司失败:{sendRltMsg}";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isSendYGT)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendYgt = true;
|
|
|
|
|
|
|
|
if (ygtSendFlag == 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendYgtSuccess = true;
|
|
|
|
|
|
|
|
vgmStatus.SendYgtMessage = "发送云港通成功";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
statusLogList.Add(new BookingStatusLog()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
BookingId = bookingId,
|
|
|
|
|
|
|
|
Status = $"发送云港通VGM",
|
|
|
|
|
|
|
|
OpTime = DateTime.Now,
|
|
|
|
|
|
|
|
Category = "ship",
|
|
|
|
|
|
|
|
MBLNO = order.MBLNO
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendYgtSuccess = false;
|
|
|
|
|
|
|
|
vgmStatus.SendYgtMessage = $"发送云港通失败:{sendRltMsg}";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
await _repStatuslog.InsertAsync(statusLogList);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah($"VGM平台返回错误({errors})");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (isSendCarr && !isSendCarrDirect)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(vgmStatus.MFNO))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrier = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
vgmStatus.IsSendCarrierSuccess = false;
|
|
|
|
|
|
|
|
vgmStatus.SendCarrierMessage = $"发送船司失败:{ex.Message}";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isSendYGT)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(vgmStatus.MFNO))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
vgmStatus.IsSendYgt = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
vgmStatus.IsSendYgtSuccess = false;
|
|
|
|
|
|
|
|
vgmStatus.SendYgtMessage = $"发送云港通失败:{ex.Message}";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (vgmStatus.Id == 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
await _rep.Context.Insertable(vgmStatus).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
await _rep.Context.Updateable(vgmStatus).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
|
|
(!isSendCarr || (isSendCarr && vgmStatus.IsSendCarrierSuccess))
|
|
|
|
|
|
|
|
&&
|
|
|
|
|
|
|
|
(!isSendYGT || (isSendYGT && vgmStatus.IsSendYgtSuccess))
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//设置货物状态:已发VGM,并回传东胜
|
|
|
|
|
|
|
|
await SetGoodsStatus("YFVGM", bookingId);
|
|
|
|
|
|
|
|
await SendBookingOrder(new long[] { bookingId });
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return vgmStatus;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// VGM发送(通过船司直发或者大简云发送)
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
public async Task<object> VgmSendOldSchema(long bookingId)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
object result = null;
|
|
|
|
object result = null;
|
|
|
|
|
|
|
|
|
|
|
@ -5499,173 +5878,180 @@ namespace Myshipping.Application
|
|
|
|
// VGM发送方式3:直接调用vgm接口直发
|
|
|
|
// VGM发送方式3:直接调用vgm接口直发
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//判断船公司是否支持
|
|
|
|
await VGMDirectSendCarrier(bookingId, order, ctns);
|
|
|
|
var allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "vgm_carrier_list").Select(x => x.Code).ToList();
|
|
|
|
}
|
|
|
|
if (!allowCarrier.Contains(order.CARRIERID))
|
|
|
|
}
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK117);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//船公司网站账号
|
|
|
|
//设置货物状态:已发VGM,并回传东胜
|
|
|
|
var carrWebAccMap = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "carrier_web_account_mapping" && x.Code == order.CARRIERID);
|
|
|
|
await SetGoodsStatus("YFVGM", bookingId);
|
|
|
|
if (carrWebAccMap == null)
|
|
|
|
await SendBookingOrder(new long[] { bookingId });
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("不支持的船公司或账号映射未配置");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var webacc = _webAccountConfig.GetAccountConfig(carrWebAccMap.Value, UserManager.UserId).Result;
|
|
|
|
return result;
|
|
|
|
if (webacc == null)
|
|
|
|
}
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK125);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////箱型映射
|
|
|
|
/// <summary>
|
|
|
|
//var ctnMapping = await _cache.GetAllMappingCtn();
|
|
|
|
/// VGM直发船司
|
|
|
|
//ctnMapping = ctnMapping.Where(x => x.Module == "BookingVgm").ToList();
|
|
|
|
/// </summary>
|
|
|
|
//if (ctnMapping.Count == 0)
|
|
|
|
private async Task VGMDirectSendCarrier(long bookingId, BookingOrder order, List<BookingCtn> ctns)
|
|
|
|
//{
|
|
|
|
{
|
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK122);
|
|
|
|
//判断船公司是否支持
|
|
|
|
//}
|
|
|
|
var allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "vgm_carrier_list").Select(x => x.Code).ToList();
|
|
|
|
|
|
|
|
if (!allowCarrier.Contains(order.CARRIERID))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK117);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//var expCode = ctns.Select(x => x.CTNCODE).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
|
|
|
|
//船公司网站账号
|
|
|
|
//if (expCode.Count > 0)
|
|
|
|
var carrWebAccMap = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "carrier_web_account_mapping" && x.Code == order.CARRIERID);
|
|
|
|
//{
|
|
|
|
if (carrWebAccMap == null)
|
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK123, string.Join(',', expCode));
|
|
|
|
{
|
|
|
|
//}
|
|
|
|
throw Oops.Bah("不支持的船公司或账号映射未配置");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#region 箱信息校验,2022-7-1修改:【累加】的必须有重量、皮重和称重重量;【总重】的只需要称重重量不为空
|
|
|
|
var webacc = _webAccountConfig.GetAccountConfig(carrWebAccMap.Value, UserManager.UserId).Result;
|
|
|
|
if (ctns.Where(c => c.WEIGHTYPE == "累加" &&
|
|
|
|
if (webacc == null)
|
|
|
|
(
|
|
|
|
{
|
|
|
|
string.IsNullOrEmpty(c.CNTRNO)
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK125);
|
|
|
|
|| !c.WEIGHKGS.HasValue
|
|
|
|
}
|
|
|
|
|| c.WEIGHKGS == 0
|
|
|
|
|
|
|
|
|| !c.TAREWEIGHT.HasValue
|
|
|
|
|
|
|
|
|| c.TAREWEIGHT == 0
|
|
|
|
|
|
|
|
|| !c.KGS.HasValue
|
|
|
|
|
|
|
|
|| c.KGS == 0)
|
|
|
|
|
|
|
|
).Count() > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah("称重方式为累加时,箱号、重量、箱皮重以及称重重量都不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ctns.Where(c => c.WEIGHTYPE == "总重" &&
|
|
|
|
////箱型映射
|
|
|
|
(
|
|
|
|
//var ctnMapping = await _cache.GetAllMappingCtn();
|
|
|
|
string.IsNullOrEmpty(c.CNTRNO)
|
|
|
|
//ctnMapping = ctnMapping.Where(x => x.Module == "BookingVgm").ToList();
|
|
|
|
|| !c.WEIGHKGS.HasValue
|
|
|
|
//if (ctnMapping.Count == 0)
|
|
|
|
|| c.WEIGHKGS == 0)
|
|
|
|
//{
|
|
|
|
).Count() > 0)
|
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK122);
|
|
|
|
{
|
|
|
|
//}
|
|
|
|
throw Oops.Bah("称重方式为总重时,箱号和称重重量都不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//var expCode = ctns.Select(x => x.CTNCODE).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
|
|
|
|
|
|
|
|
//if (expCode.Count > 0)
|
|
|
|
|
|
|
|
//{
|
|
|
|
|
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK123, string.Join(',', expCode));
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
////场站转换
|
|
|
|
#region 箱信息校验,2022-7-1修改:【累加】的必须有重量、皮重和称重重量;【总重】的只需要称重重量不为空
|
|
|
|
//var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingVgm");
|
|
|
|
if (ctns.Where(c => c.WEIGHTYPE == "累加" &&
|
|
|
|
//if (yardset == null)
|
|
|
|
(
|
|
|
|
//{
|
|
|
|
string.IsNullOrEmpty(c.CNTRNO)
|
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK120, order.YARDID);
|
|
|
|
|| !c.WEIGHKGS.HasValue
|
|
|
|
//}
|
|
|
|
|| c.WEIGHKGS == 0
|
|
|
|
if (string.IsNullOrEmpty(order.YARD) || string.IsNullOrEmpty(order.YARDID))
|
|
|
|
|| !c.TAREWEIGHT.HasValue
|
|
|
|
{
|
|
|
|
|| c.TAREWEIGHT == 0
|
|
|
|
throw Oops.Bah("场站未正确选择");
|
|
|
|
|| !c.KGS.HasValue
|
|
|
|
}
|
|
|
|
|| c.KGS == 0)
|
|
|
|
// 场站映射
|
|
|
|
).Count() > 0)
|
|
|
|
string mappingYard, mappingYardId;
|
|
|
|
{
|
|
|
|
var yardMapList = _cache.GetAllMappingYard().Result?.Where(y => y.Code == order.YARDID && y.Module == "BookingVgm" && (y.CarrierCode == null || y.CarrierCode == "" || y.CarrierCode == order.CARRIERID))?.ToList();
|
|
|
|
throw Oops.Bah("称重方式为累加时,箱号、重量、箱皮重以及称重重量都不能为空");
|
|
|
|
if (yardMapList?.Any() == true)
|
|
|
|
}
|
|
|
|
{
|
|
|
|
|
|
|
|
var yardset = yardMapList.FirstOrDefault(x => x.CarrierCode == order.CARRIERID)
|
|
|
|
|
|
|
|
?? yardMapList.FirstOrDefault(x => x.CarrierCode == null || x.CarrierCode == "");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mappingYard = yardset.MapName;
|
|
|
|
if (ctns.Where(c => c.WEIGHTYPE == "总重" &&
|
|
|
|
mappingYardId = yardset.MapCode;
|
|
|
|
(
|
|
|
|
}
|
|
|
|
string.IsNullOrEmpty(c.CNTRNO)
|
|
|
|
else
|
|
|
|
|| !c.WEIGHKGS.HasValue
|
|
|
|
{
|
|
|
|
|| c.WEIGHKGS == 0)
|
|
|
|
mappingYard = order.YARD;
|
|
|
|
).Count() > 0)
|
|
|
|
mappingYardId = order.YARDID;
|
|
|
|
{
|
|
|
|
}
|
|
|
|
throw Oops.Bah("称重方式为总重时,箱号和称重重量都不能为空");
|
|
|
|
|
|
|
|
}
|
|
|
|
// 船司映射
|
|
|
|
#endregion
|
|
|
|
var carrMap = _cache.GetAllMappingCarrier().Result?.Where(y => y.Code == order.CARRIERID && y.Module == "BookingVgm")?.FirstOrDefault();
|
|
|
|
|
|
|
|
string mappingCarrierId = carrMap != null ? carrMap.MapCode : order.CARRIERID;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int idx = 1;
|
|
|
|
|
|
|
|
//调用接口
|
|
|
|
|
|
|
|
var dicUrl = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "vgm_service_single");
|
|
|
|
|
|
|
|
var sendObj = new
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
SystemCode = "djy_hechuan",
|
|
|
|
|
|
|
|
billOrderId = order.Id.ToString(),
|
|
|
|
|
|
|
|
sendOrderCode = order.MBLNO,
|
|
|
|
|
|
|
|
customerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //公司名称+用户姓名
|
|
|
|
|
|
|
|
customerId = order.CUSTOMERID.ToString(),
|
|
|
|
|
|
|
|
agentName = string.IsNullOrEmpty(order.FORWARDER) ? UserManager.TENANT_NAME : order.FORWARDER,
|
|
|
|
|
|
|
|
carrierCode = mappingCarrierId,
|
|
|
|
|
|
|
|
userName = webacc.Account,
|
|
|
|
|
|
|
|
userPassword = webacc.Password,
|
|
|
|
|
|
|
|
depotCode = mappingYardId,
|
|
|
|
|
|
|
|
depotName = mappingYard,
|
|
|
|
|
|
|
|
linkName = UserManager.Name,
|
|
|
|
|
|
|
|
linkMobile = user.Phone,
|
|
|
|
|
|
|
|
linkEmail = user.Email,
|
|
|
|
|
|
|
|
userId = user.DjyUserId,
|
|
|
|
|
|
|
|
signatory = user.NickName, //2023年8月28日,董怡含:把用户昵称当做vgm上传人
|
|
|
|
|
|
|
|
returnUrl = "",
|
|
|
|
|
|
|
|
shipName = order.VESSEL,
|
|
|
|
|
|
|
|
voyNo = order.VOYNO,
|
|
|
|
|
|
|
|
etdstr = order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
|
|
|
|
|
potrSend = order.PORTLOAD,
|
|
|
|
|
|
|
|
potrGoal = order.PORTDISCHARGE,
|
|
|
|
|
|
|
|
boxinfoStr = order.CNTRTOTAL.Replace("'", ""),
|
|
|
|
|
|
|
|
vgmEndTimeStr = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
|
|
|
|
|
BoxInfo = ctns.Select(c => new
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
index = idx++,
|
|
|
|
|
|
|
|
boxType = c.CTNALL.Replace("'", ""),
|
|
|
|
|
|
|
|
boxcount = c.CTNNUM.HasValue ? c.CTNNUM.Value : 0,
|
|
|
|
|
|
|
|
code = c.CNTRNO,
|
|
|
|
|
|
|
|
sealCode = c.SEALNO,
|
|
|
|
|
|
|
|
weigth = c.KGS,
|
|
|
|
|
|
|
|
weigthTare = c.TAREWEIGHT,
|
|
|
|
|
|
|
|
weigthTotal = c.WEIGHKGS,
|
|
|
|
|
|
|
|
weigthType = c.WEIGHTYPE == "累加" ? "SM2" : "SM1"
|
|
|
|
|
|
|
|
}).ToList(),
|
|
|
|
|
|
|
|
returnOkUrl = ""
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string strPostObj = sendObj.ToJsonString();
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用VGM直发接口 {dicUrl.Value} 传递数据:{strPostObj}");
|
|
|
|
|
|
|
|
var strResp = await dicUrl.Value.SetBody(sendObj).PostAsStringAsync();
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用VGM直发接口返回:{strResp}");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var jobjResp = JObject.Parse(strResp);
|
|
|
|
////场站转换
|
|
|
|
int respCode = jobjResp.GetIntValue("code");
|
|
|
|
//var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingVgm");
|
|
|
|
if (respCode != 200)
|
|
|
|
//if (yardset == null)
|
|
|
|
{
|
|
|
|
//{
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK128, jobjResp.GetStringValue("message"));
|
|
|
|
// throw Oops.Bah(BookingErrorCode.BOOK120, order.YARDID);
|
|
|
|
}
|
|
|
|
//}
|
|
|
|
//货运动态
|
|
|
|
if (string.IsNullOrEmpty(order.YARD) || string.IsNullOrEmpty(order.YARDID))
|
|
|
|
var bsl = new BookingStatusLog();
|
|
|
|
{
|
|
|
|
bsl.BookingId = bookingId;
|
|
|
|
throw Oops.Bah("场站未正确选择");
|
|
|
|
bsl.Status = $"直发VGM";
|
|
|
|
|
|
|
|
bsl.OpTime = DateTime.Now;
|
|
|
|
|
|
|
|
bsl.Category = "ship";
|
|
|
|
|
|
|
|
bsl.MBLNO = order.MBLNO;
|
|
|
|
|
|
|
|
await _repStatuslog.InsertAsync(bsl);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 场站映射
|
|
|
|
|
|
|
|
string mappingYard, mappingYardId;
|
|
|
|
|
|
|
|
var yardMapList = _cache.GetAllMappingYard().Result?.Where(y => y.Code == order.YARDID && y.Module == "BookingVgm" && (y.CarrierCode == null || y.CarrierCode == "" || y.CarrierCode == order.CARRIERID))?.ToList();
|
|
|
|
|
|
|
|
if (yardMapList?.Any() == true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var yardset = yardMapList.FirstOrDefault(x => x.CarrierCode == order.CARRIERID)
|
|
|
|
|
|
|
|
?? yardMapList.FirstOrDefault(x => x.CarrierCode == null || x.CarrierCode == "");
|
|
|
|
|
|
|
|
|
|
|
|
//设置货物状态:已发VGM,并回传东胜
|
|
|
|
mappingYard = yardset.MapName;
|
|
|
|
await SetGoodsStatus("YFVGM", bookingId);
|
|
|
|
mappingYardId = yardset.MapCode;
|
|
|
|
await SendBookingOrder(new long[] { bookingId });
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
mappingYard = order.YARD;
|
|
|
|
|
|
|
|
mappingYardId = order.YARDID;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
// 船司映射
|
|
|
|
}
|
|
|
|
var carrMap = _cache.GetAllMappingCarrier().Result?.Where(y => y.Code == order.CARRIERID && y.Module == "BookingVgm")?.FirstOrDefault();
|
|
|
|
|
|
|
|
string mappingCarrierId = carrMap != null ? carrMap.MapCode : order.CARRIERID;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int idx = 1;
|
|
|
|
|
|
|
|
//调用接口
|
|
|
|
|
|
|
|
var dicUrl = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "vgm_service_single");
|
|
|
|
|
|
|
|
var sendObj = new
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
SystemCode = "djy_hechuan",
|
|
|
|
|
|
|
|
billOrderId = order.Id.ToString(),
|
|
|
|
|
|
|
|
sendOrderCode = order.MBLNO,
|
|
|
|
|
|
|
|
customerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //公司名称+用户姓名
|
|
|
|
|
|
|
|
customerId = order.CUSTOMERID.ToString(),
|
|
|
|
|
|
|
|
agentName = string.IsNullOrEmpty(order.FORWARDER) ? UserManager.TENANT_NAME : order.FORWARDER,
|
|
|
|
|
|
|
|
carrierCode = mappingCarrierId,
|
|
|
|
|
|
|
|
userName = webacc.Account,
|
|
|
|
|
|
|
|
userPassword = webacc.Password,
|
|
|
|
|
|
|
|
depotCode = mappingYardId,
|
|
|
|
|
|
|
|
depotName = mappingYard,
|
|
|
|
|
|
|
|
linkName = UserManager.Name,
|
|
|
|
|
|
|
|
linkMobile = user.Phone,
|
|
|
|
|
|
|
|
linkEmail = user.Email,
|
|
|
|
|
|
|
|
userId = user.DjyUserId,
|
|
|
|
|
|
|
|
signatory = user.NickName, //2023年8月28日,董怡含:把用户昵称当做vgm上传人
|
|
|
|
|
|
|
|
returnUrl = "",
|
|
|
|
|
|
|
|
shipName = order.VESSEL,
|
|
|
|
|
|
|
|
voyNo = order.VOYNO,
|
|
|
|
|
|
|
|
etdstr = order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
|
|
|
|
|
potrSend = order.PORTLOAD,
|
|
|
|
|
|
|
|
potrGoal = order.PORTDISCHARGE,
|
|
|
|
|
|
|
|
boxinfoStr = order.CNTRTOTAL.Replace("'", ""),
|
|
|
|
|
|
|
|
vgmEndTimeStr = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
|
|
|
|
|
BoxInfo = ctns.Select(c => new
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
index = idx++,
|
|
|
|
|
|
|
|
boxType = c.CTNALL.Replace("'", ""),
|
|
|
|
|
|
|
|
boxcount = c.CTNNUM.HasValue ? c.CTNNUM.Value : 0,
|
|
|
|
|
|
|
|
code = c.CNTRNO,
|
|
|
|
|
|
|
|
sealCode = c.SEALNO,
|
|
|
|
|
|
|
|
weigth = c.KGS,
|
|
|
|
|
|
|
|
weigthTare = c.TAREWEIGHT,
|
|
|
|
|
|
|
|
weigthTotal = c.WEIGHKGS,
|
|
|
|
|
|
|
|
weigthType = c.WEIGHTYPE == "累加" ? "SM2" : "SM1"
|
|
|
|
|
|
|
|
}).ToList(),
|
|
|
|
|
|
|
|
returnOkUrl = ""
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string strPostObj = sendObj.ToJsonString();
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用VGM直发接口 {dicUrl.Value} 传递数据:{strPostObj}");
|
|
|
|
|
|
|
|
var strResp = await dicUrl.Value.SetBody(sendObj).PostAsStringAsync();
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用VGM直发接口返回:{strResp}");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var jobjResp = JObject.Parse(strResp);
|
|
|
|
|
|
|
|
int respCode = jobjResp.GetIntValue("code");
|
|
|
|
|
|
|
|
if (respCode != 200)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw Oops.Bah(BookingErrorCode.BOOK128, jobjResp.GetStringValue("message"));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//货运动态
|
|
|
|
|
|
|
|
var bsl = new BookingStatusLog();
|
|
|
|
|
|
|
|
bsl.BookingId = bookingId;
|
|
|
|
|
|
|
|
bsl.Status = $"发送船司VGM(直发)";
|
|
|
|
|
|
|
|
bsl.OpTime = DateTime.Now;
|
|
|
|
|
|
|
|
bsl.Category = "ship";
|
|
|
|
|
|
|
|
bsl.MBLNO = order.MBLNO;
|
|
|
|
|
|
|
|
await _repStatuslog.InsertAsync(bsl);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// 批量编辑vgm
|
|
|
|
/// 批量编辑vgm
|
|
|
@ -7755,7 +8141,7 @@ namespace Myshipping.Application
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var multiline = _repBookingMultiLineSplitRecord.AsQueryable().First(b => b.Id == model.multilineid.Value);
|
|
|
|
var multiline = _repBookingMultiLineSplitRecord.AsQueryable().First(b => b.Id == model.multilineid.Value);
|
|
|
|
|
|
|
|
|
|
|
|
if(multiline == null)
|
|
|
|
if (multiline == null)
|
|
|
|
throw Oops.Oh($"收、发、通拆分信息获取失败");
|
|
|
|
throw Oops.Oh($"收、发、通拆分信息获取失败");
|
|
|
|
|
|
|
|
|
|
|
|
primaryModel.SHIPPER = multiline.SHIPPERNAME;
|
|
|
|
primaryModel.SHIPPER = multiline.SHIPPERNAME;
|
|
|
@ -8686,10 +9072,10 @@ namespace Myshipping.Application
|
|
|
|
fileRole = fileRole,
|
|
|
|
fileRole = fileRole,
|
|
|
|
send = false,
|
|
|
|
send = false,
|
|
|
|
sendType = sendType,
|
|
|
|
sendType = sendType,
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if(!string.IsNullOrWhiteSpace(multilineid))
|
|
|
|
if (!string.IsNullOrWhiteSpace(multilineid))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
model.multilineid = long.Parse(multilineid);
|
|
|
|
model.multilineid = long.Parse(multilineid);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -11868,7 +12254,7 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation("批次={no}提取订单信息完成", batchNo);
|
|
|
|
_logger.LogInformation("批次={no}提取订单信息完成", batchNo);
|
|
|
|
|
|
|
|
|
|
|
|
if (model.sendType.Equals("B", StringComparison.OrdinalIgnoreCase) && order.CARRIERID.Equals("SITC",StringComparison.OrdinalIgnoreCase))
|
|
|
|
if (model.sendType.Equals("B", StringComparison.OrdinalIgnoreCase) && order.CARRIERID.Equals("SITC", StringComparison.OrdinalIgnoreCase))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
VOLTAEDIBaseModel sitcModel = new VOLTAEDIBaseModel();
|
|
|
|
VOLTAEDIBaseModel sitcModel = new VOLTAEDIBaseModel();
|
|
|
|
if (!string.IsNullOrWhiteSpace(order.SHIPPER))
|
|
|
|
if (!string.IsNullOrWhiteSpace(order.SHIPPER))
|
|
|
@ -11904,7 +12290,7 @@ namespace Myshipping.Application
|
|
|
|
{
|
|
|
|
{
|
|
|
|
throw Oops.Bah("只接受发送类型截单(E)");
|
|
|
|
throw Oops.Bah("只接受发送类型截单(E)");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var allowCarrier = App.Configuration["VOLTASIExportCarrier"].Split(new char[] { ',' });
|
|
|
|
var allowCarrier = App.Configuration["VOLTASIExportCarrier"].Split(new char[] { ',' });
|
|
|
|
//if (!order.CARRIERID.Equals("VOL", StringComparison.OrdinalIgnoreCase) && !order.CARRIERID.Equals("FCS", StringComparison.OrdinalIgnoreCase)
|
|
|
|
//if (!order.CARRIERID.Equals("VOL", StringComparison.OrdinalIgnoreCase) && !order.CARRIERID.Equals("FCS", StringComparison.OrdinalIgnoreCase)
|
|
|
@ -11930,7 +12316,7 @@ namespace Myshipping.Application
|
|
|
|
bool isSeaLead = false;
|
|
|
|
bool isSeaLead = false;
|
|
|
|
|
|
|
|
|
|
|
|
//if (order.MBLNO.StartsWith("SLS"))
|
|
|
|
//if (order.MBLNO.StartsWith("SLS"))
|
|
|
|
if (order.CARRIERID.Equals("SLS",StringComparison.OrdinalIgnoreCase))
|
|
|
|
if (order.CARRIERID.Equals("SLS", StringComparison.OrdinalIgnoreCase))
|
|
|
|
isSeaLead = true;
|
|
|
|
isSeaLead = true;
|
|
|
|
|
|
|
|
|
|
|
|
//箱信息
|
|
|
|
//箱信息
|
|
|
|