using DS.Module.Core;
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 Newtonsoft.Json;
using System.Text;
using System.Text.RegularExpressions;
namespace DS.WMS.Core.Op.Method
{
///
/// 海运出口VOLTA相关接口
///
public partial class SeaExportService
{
#region 检查是否VOLTA并返回初始数据
///
/// 检查是否VOLTA并返回初始数据
///
/// 请求参数
/// 返回回执
public DataResult CheckAndInitVOLTAEdi(BookingOrClosingEDIOrderReq req)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
/*
判断当前单子是否满足执行VOLTA截单流程
1、是截单请求
2、船公司是VOL。
3、提单号开头是(VOL、FCS、REL)
*/
string batchNo = GuidHelper.NewGuidFormatN();
_logger.Info("批次={no}获取请求VOLTA截单详情 {msg}", batchNo, JsonConvert.SerializeObject(req));
if (!req.SendType.Equals("E", StringComparison.OrdinalIgnoreCase))
return DataResult.Failed($"只接受发送类型截单(E)");
if (req.Id == 0)
return DataResult.Failed($"订单Id不能为空");
var order = tenantDb.Queryable().First(x => x.Id == req.Id);
if (order == null)
return DataResult.Failed($"获取订单信息失败");
if (order.ParentId == 0)
return DataResult.Failed($"获取当前订单为分单不能生成EDI信息");
_logger.Info("批次={no}提取订单信息完成", batchNo);
var carrCode = seaComService.GetClientCode(order.CarrierId, tenantDb);
if (!carrCode.Equals("VOL", StringComparison.OrdinalIgnoreCase) && !order.Carrier.Equals("FCS", StringComparison.OrdinalIgnoreCase))
{
return DataResult.Failed($"当前订单的船公司不是VOL(沃尔塔航运)不能发送VOLTA截单EDI");
}
if (string.IsNullOrWhiteSpace(order.MBLNO))
return DataResult.Failed($"提单号不能为空");
if (!order.MBLNO.StartsWith("VOL") && !order.MBLNO.StartsWith("FCS") && !order.MBLNO.StartsWith("REL"))
{
return DataResult.Failed($"只支持提单号开头是(VOL、FCS、REL)发送截单");
}
//箱信息
var ctns = tenantDb.Queryable().Where(x => x.BSNO == order.Id.ToString()).ToList();
//VOLTAEDIBaseModel voltaModel = order.Adapt();
var voltaModel = new VOLTAEDIBaseModel()
{
BookingId = order.MBLNO,
id = order.Id,
ShpperName = order.ShipperContent,
ConsigneeName = order.ConsigneeContent,
NotifyName = order.NotifyPartyContent,
LoadPort = order.LoadPort,
DischargePort = order.DischargePort,
FinalDestination = order.Destination,
PlaceOfDelivery = order.DeliveryPlace,
CargoDescription = order.Description,
Marks = order.Marks,
Vessel = order.Vessel,
VoyNo = order.Voyno
};
#region 拆分收、发、通(名称、地址拆分)
if (!string.IsNullOrWhiteSpace(voltaModel.ShpperName))
{
string name = voltaModel.ShpperName;
voltaModel.ShpperName = GetShipCneeNotifyDetail(name);
voltaModel.ShpperAddr = GetShipCneeNotifyDetail(name, "addr");
}
if (!string.IsNullOrWhiteSpace(voltaModel.ConsigneeName))
{
string name = voltaModel.ConsigneeName;
voltaModel.ConsigneeName = GetShipCneeNotifyDetail(name);
voltaModel.ConsigneeAddr = GetShipCneeNotifyDetail(name, "addr");
}
if (!string.IsNullOrWhiteSpace(voltaModel.NotifyName))
{
string name = voltaModel.NotifyName;
voltaModel.NotifyName = GetShipCneeNotifyDetail(name);
voltaModel.NotifyAddr = GetShipCneeNotifyDetail(name, "addr");
}
#endregion
if (voltaModel.CargoDescription.EndsWith("\n"))
voltaModel.CargoDescription = voltaModel.CargoDescription.Substring(0, voltaModel.CargoDescription.Length - 1);
if (voltaModel != null)
{
var list = new List();
foreach (var item in ctns)
{
list.Add(new VOLTAEDIContaModel()
{
ContaNo = item.CntrNo,
SealNo = item.SealNo,
GWt = item.KGS,
NWt = item.TareWeight,
Qty = item.PKGS,
CBM = item.CBM,
Pkgs = item.KindPkgs
});
}
}
//voltaModel.ContaList = ctns.Adapt>();
StringBuilder pkgsBuilder = new StringBuilder();
//还需要翻译箱明细的包装
if (voltaModel.ContaList != null && voltaModel.ContaList.Count > 0)
{
List origPkgsList = voltaModel.ContaList.Select(x => x.Pkgs).Distinct().ToList();
//包装基础数据
var basePkgsList = tenantDb.Queryable().ToList();
var ediPkgsList = tenantDb.Queryable().Where(t => t.Module == "BOOK_CLOSING_VOLTA"
&& t.CarrierId.HasValue && t.CarrierId == order.CarrierId)
.ToList();
int startNo = 1;
voltaModel.ContaList.ForEach(x =>
{
x.SNo = startNo;
var curBasePkgs = basePkgsList.FirstOrDefault(p => p.PackageName.Equals(x.Pkgs, StringComparison.OrdinalIgnoreCase));
if (curBasePkgs == null)
pkgsBuilder.Append($"包装{x.Pkgs}的基础数据代码未找到");
if (curBasePkgs != null)
{
var ediPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(curBasePkgs.EdiCode, StringComparison.OrdinalIgnoreCase));
if (ediPkgs == null || string.IsNullOrWhiteSpace(ediPkgs.MapCode))
pkgsBuilder.AppendLine($"包装{x.Pkgs}的EDI代码未找到");
if (ediPkgs != null)
{
x.EdiPkgs = ediPkgs.MapCode?.Trim();
}
}
if (string.IsNullOrWhiteSpace(x.EdiPkgs))
x.EdiPkgs = string.Empty;
startNo++;
});
}
if (pkgsBuilder.Length > 0)
{
_logger.Info("批次={no}获取请求VOLTA截单详情有错误 {msg}", batchNo, JsonConvert.SerializeObject(req));
return DataResult.Failed("获取请求VOLTA截单详情有错误:" + JsonConvert.SerializeObject(req));
}
return DataResult.Success(voltaModel);
}
#endregion
#region 提取收、发、通详情
///
/// 提取收、发、通详情
///
/// 收、发、通信息
/// 内容定位(name-名称;addr-地址)
/// 返回截取字符
private string GetShipCneeNotifyDetail(string name, string location = "name")
{
string result = string.Empty;
try
{
if (location == "name")
{
result = Regex.Match(name, ".*(?=\\n)").Value;
}
else if (location == "addr")
{
string s = Regex.Match(name, ".*(?=\\n)").Value;
result = name.Replace(s, "");
if (Regex.IsMatch(result, "^\\n"))
{
result = Regex.Replace(result, "^\\n", "");
}
//result = Regex.Match(name, $"(?<={s}).*").Value;
}
}
catch (Exception ex)
{
_logger.Info($"{nameof(GetShipCneeNotifyDetail)} 提取收、发、通详情异常,原因:{ex.Message}");
}
return result;
}
#endregion
}
}