wet 2 years ago
commit 58c530f01b

@ -136,5 +136,30 @@ namespace Myshipping.Application.Entity
/// 签单方式名称(来自订舱)
/// </summary>
public string ISSUE_TYPE_NAME { get; set; }
/// <summary>
/// 任务请求人ID
/// </summary>
public long TASK_REQ_USERID { get; set; }
/// <summary>
/// 任务请求人名称
/// </summary>
public string TASK_REQ_USERNAME { get; set; }
/// <summary>
/// 箱型箱量
/// </summary>
public string CONTA_INFO { get; set; }
/// <summary>
/// 船名航次
/// </summary>
public string VESSEL_VOYNO { get; set; }
/// <summary>
/// 场站
/// </summary>
public string YARD_NAME { get; set; }
}
}

@ -345,7 +345,7 @@ namespace Myshipping.Application
.WhereIF(!string.IsNullOrWhiteSpace(input.FREIGHTPAYER), u => u.FREIGHTPAYER.Contains(input.FREIGHTPAYER))
.WhereIF(!string.IsNullOrWhiteSpace(input.DZRemark), u => u.DZRemark.Contains(input.DZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.CZRemark), u => u.CZRemark.Contains(input.CZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.ZhanCangFlag), u => u.ZhanCangFlag==input.ZhanCangFlag)
.WhereIF(!string.IsNullOrWhiteSpace(input.ZhanCangFlag), u => u.ZhanCangFlag == input.ZhanCangFlag)
.WhereIF(userlist != null && userlist.Count() > 0, u => userlist.Contains((long)u.CreatedUserId) || UserManager.UserId.ToString() == u.ROUTEID || UserManager.Name.ToString() == u.ROUTE || UserManager.UserId.ToString() == u.SALEID || UserManager.Name.ToString() == u.SALE || UserManager.UserId.ToString() == u.OPID || UserManager.Name.ToString() == u.OP || UserManager.UserId.ToString() == u.DOCID || UserManager.Name.ToString() == u.DOC || UserManager.UserId.ToString() == u.CUSTSERVICEID || UserManager.Name.ToString() == u.CUSTSERVICE)
.OrderBy(PageInputOrder.OrderBuilder(input.SortField, input.DescSort))
.ToPagedListAsync(input.PageNo, input.PageSize);
@ -3110,10 +3110,10 @@ namespace Myshipping.Application
await _repOrderUrl.InsertAsync(ordUrl);
}
if (!string.IsNullOrEmpty(ordUrl.UrlTxxp))
{
return ordUrl.UrlTxxp;
}
//if (!string.IsNullOrEmpty(ordUrl.UrlTxxp))
//{
// return ordUrl.UrlTxxp;
//}
//校验船公司
if (string.IsNullOrEmpty(order.CARRIERID))
@ -3136,10 +3136,16 @@ namespace Myshipping.Application
}
//场站转换
var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingTxxp");
var yardsetList = _cache.GetAllMappingYard().Result.Where(y => y.Code == order.YARDID && y.Module == "BookingTxxp" && (y.CarrierCode == null || y.CarrierCode == "" || y.CarrierCode == order.CARRIERID)).ToList();
if (yardsetList.Count == 0)
{
throw Oops.Bah(BookingErrorCode.BOOK120, $"{order.YARD} {order.CARRIER}(提箱小票)");
}
var yardset = yardsetList.FirstOrDefault(x => x.CarrierCode == order.CARRIERID);
if (yardset == null)
{
throw Oops.Bah(BookingErrorCode.BOOK120, $"{order.YARDID}(提箱小票)");
yardset = yardsetList.FirstOrDefault(x => x.CarrierCode == null || x.CarrierCode == "");
}
var ctns = await _repCtn.Where(x => x.BILLID == bookingId).ToListAsync();
@ -3160,7 +3166,8 @@ namespace Myshipping.Application
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)}(提箱小票)");
var expName = ctns.Where(x => expCode.Contains(x.CTNCODE)).Select(x => x.CTNALL).Distinct().ToList();
throw Oops.Bah(BookingErrorCode.BOOK123, $"{string.Join(',', expName)}(提箱小票)");
}
var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId);
@ -3211,6 +3218,7 @@ namespace Myshipping.Application
throw Oops.Bah(BookingErrorCode.BOOK124, jobjResp.GetStringValue("message"));
}
var addUrlFlag = string.IsNullOrEmpty(ordUrl.UrlTxxp) ? true : false; //新生成还是更新链接
//保存url
var txxpUrl = jobjResp.GetStringValue("data");
ordUrl.UrlTxxp = txxpUrl;
@ -3219,7 +3227,7 @@ namespace Myshipping.Application
//货运动态
var bsl = new BookingStatusLog();
bsl.BookingId = bookingId;
bsl.Status = $"生成提箱小票链接";
bsl.Status = $"{(addUrlFlag ? "" : "")}提箱小票链接";
bsl.OpTime = DateTime.Now;
bsl.Category = "ship";
bsl.MBLNO = order.MBLNO;
@ -3781,6 +3789,14 @@ namespace Myshipping.Application
EDIRouteEnum ediRouteEnum = GetEDIRoute(order.CARRIERID);
if (ediRouteEnum == EDIRouteEnum.YT)
{
if (string.IsNullOrWhiteSpace(order.NOBILL))
{
throw Oops.Bah("当前船公司{ca} EDI={name} 提单份数必填", order.CARRIERID, ediRouteEnum.ToString());
}
}
//部分船公司EDI需要填写操作英文名称这里预先预警其他船公司如果也需要可以再此追加
if (ediRouteEnum == EDIRouteEnum.TSL)
{
@ -5339,7 +5355,35 @@ namespace Myshipping.Application
throw Oops.Bah(rtn.Value);
}
return rtn.Value;
//场站引入的数据,转换为订舱箱型,且带上箱型代码
var ctnList = await _cache.GetAllCodeCtn();
var mapCtn = await _cache.GetAllMappingCtn();
var jData = JArray.Parse(rtn.Value);
foreach (JObject item in jData)
{
var ctnall = item.GetStringValue("CTNALL");
var findMap = mapCtn.FirstOrDefault(x => x.Module == "YardData" && x.MapCode == ctnall);
var findCtn = ctnList.FirstOrDefault(x => x.Name == ctnall);
if (findMap != null)
{
item.Add("CtnCode", findMap.Code);
findCtn = ctnList.First(c => c.Code == findMap.Code);
item["CTNALL"] = findCtn.Name; //名称显示维护的箱型
}
else if (findCtn != null)
{
item.Add("CtnCode", findCtn.Code);
item["CTNALL"] = findCtn.Name; //名称显示维护的箱型
}
else
{
throw Oops.Bah($"未找到箱型{ctnall}的场站引入配置");
}
}
return jData.ToString();
}
/// <summary>

@ -0,0 +1,349 @@
using Furion;
using Furion.DependencyInjection;
using Furion.DistributedIDGenerator;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Furion.JsonSerialization;
using Furion.RemoteRequest.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Myshipping.Application.ConfigOption;
using Myshipping.Application.Entity;
using Myshipping.Core;
using Myshipping.Core.Service;
using Org.BouncyCastle.Crypto;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace Myshipping.Application
{
/// <summary>
/// 订舱增值类服务
/// </summary>
[ApiDescriptionSettings("Application", Name = "BookingValueAdded", Order = 9)]
public class BookingValueAddedService : IBookingValueAddedService, IDynamicApiController, ITransient
{
private readonly ISysCacheService _cache;
private readonly IDjyWebsiteAccountConfigService _webAccountConfig;
private readonly ILogger<BookingTruckService> _logger;
private readonly SqlSugarRepository<BookingOrder> _bookingOrderRepository;
private readonly SqlSugarRepository<BookingFile> _bookingfile;
const string CONST_MAPPING_CARRIER_MODULE_ROUTE = "BC_OR_DRAFT_RT";
const string CONST_FORMAT_BC_URL = "{0}_bc_down_url";
const string CONST_FORMAT_DRAFT_URL = "{0}_draft_down_url";
const string CONST_TSL_BC_WEB = "TslWeb";
public BookingValueAddedService(ISysCacheService cache, ILogger<BookingTruckService> logger,
SqlSugarRepository<BookingOrder> bookingOrderRepository, SqlSugarRepository<BookingFile> bookingfile,
IDjyWebsiteAccountConfigService webAccountConfig)
{
_cache = cache;
_logger = logger;
_bookingOrderRepository = bookingOrderRepository;
_bookingfile = bookingfile;
_webAccountConfig = webAccountConfig;
}
/// <summary>
/// 批量下载BC
/// </summary>
/// <param name="bookingIds">订舱主键数组</param>
/// <returns></returns>
[HttpPost("/BookingValueAdded/DownloadBookingConfirm")]
public async Task<TaskManageOrderResultDto> DownloadBookingConfirm([FromBody]long[] bookingIds)
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto();
List<Task<TaskManageOrderResultDto>> taskList = new List<Task<TaskManageOrderResultDto>>();
string batchNo = IDGen.NextID().ToString();
try
{
/*
1
2
3
4
5
6
*/
var list = _bookingOrderRepository.AsQueryable()
.Where(a => bookingIds.Contains(a.Id)).ToList();
if (list.Count != bookingIds.Length)
throw Oops.Oh($"订舱信息获取失败,订舱信息不存在或已作废");
foreach (var bk in list)
{
taskList.Add(InnerDownloadBookingConfirm(bk, batchNo));
}
Task.WaitAll(taskList.ToArray());
result.succ = true;
result.msg = "批量下载BC成功";
//result.ext = id;
}
catch (Exception ex)
{
result.succ = false;
result.msg = $"批量下载BC异常原因{ex.Message}";
}
return result;
}
private async Task<TaskManageOrderResultDto> InnerDownloadBookingConfirm(BookingOrder bookingOrder,string batchNo)
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto();
try
{
/*
1
2BCDRAFT2
3
4
5
*/
var bcOrDraftRouteCfg = _cache.GetAllMappingCarrier().GetAwaiter().GetResult()
.FirstOrDefault(t => t.Module.Equals(CONST_MAPPING_CARRIER_MODULE_ROUTE, StringComparison.OrdinalIgnoreCase)
&& t.Code.Equals(bookingOrder.CARRIERID?.Trim(), StringComparison.OrdinalIgnoreCase));
_logger.LogInformation("提单号【{mbl}】根据订舱的船公司代码{ca} 提取船公司映射完成,结果={rlt}",
bookingOrder.MBLNO, bookingOrder.CARRIERID, bcOrDraftRouteCfg);
if (bcOrDraftRouteCfg == null)
{
_logger.LogInformation("提单号【{mbl}】根据订舱的船公司代码{ca} 提取船公司映射失败",
bookingOrder.MBLNO, bookingOrder.CARRIERID);
throw Oops.Bah("提单号={mbl} 船公司={ca} 未配置BC和DRAFT下载路由请联系官员配置", bookingOrder.MBLNO, bookingOrder.CARRIERID);
}
string urlKey = string.Format(CONST_FORMAT_BC_URL, bcOrDraftRouteCfg.MapCode.ToLower());
var bcUrl = _cache.GetAllDictData().GetAwaiter().GetResult()
.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code.Equals(urlKey, StringComparison.OrdinalIgnoreCase))?.Value;
_logger.LogInformation("提单号【{mbl}】根据订舱的船公司代码{ca} 提取BC下载URL完成结果={rlt}",
bookingOrder.MBLNO, bookingOrder.CARRIERID, bcUrl);
if (string.IsNullOrWhiteSpace(bcUrl))
{
_logger.LogInformation("提单号【{mbl}】根据订舱的船公司代码{ca} 提取BC下载URL失败未取到配置key={key}",
bookingOrder.MBLNO, bookingOrder.CARRIERID, urlKey);
}
//获取个人对应的账户,这里GetAccountConfig逻辑优先取个人个人没有配置取公司对应配置
var userWebAccountConfig = _webAccountConfig.GetAccountConfig(CONST_TSL_BC_WEB, UserManager.UserId).GetAwaiter()
.GetResult();
_logger.LogInformation("批次={no} 获取获取网站的账户完成result={Num}", batchNo, JSON.Serialize(userWebAccountConfig));
if (userWebAccountConfig == null)
throw Oops.Bah($"个人/公司网站【{CONST_TSL_BC_WEB}】获取失败,请维护个人/公司网站账户信息");
BCOrDraftRequestDto requestDto = new BCOrDraftRequestDto
{
user_key = App.Configuration["BCOrDraftUserKey"],
user_secret = App.Configuration["BCOrDraftUserSecret"],
web_user = userWebAccountConfig.Account?.Trim(),
web_psw = userWebAccountConfig.Password?.Trim(),
bno = bookingOrder.MBLNO,
is_parse = false
};
//开始请求BC
var rlt = await ExcuteBCDownload(bcUrl, requestDto, batchNo);
if (rlt.code == 200)
{
string currFilePath = rlt.data.path;
string fileTypeCode = "bc";
string fileTypeName = "Booking Confirmation";
//读取文件配置
var fileCfg = App.GetOptions<BookingAttachOptions>();
string relativePath = $"{fileCfg.relativePath}\\bcfiles\\{bookingOrder.Id}";
string filePath = $"{(!string.IsNullOrWhiteSpace(fileCfg.basePath) ? fileCfg.basePath : App.WebHostEnvironment.WebRootPath)}\\{relativePath}";
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
relativePath = relativePath.Replace("\\", "/");
filePath = filePath.Replace("\\", "/");
}
_logger.LogInformation("批次={no} 生成文件保存路径完成 路由={filePath} 服务器系统={system}", batchNo, filePath, RuntimeInformation.OSDescription);
//预先创建目录
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
var bcStream = await currFilePath.GetAsStreamAsync();
//这里先写入附件表
await SaveEDIFile(bookingOrder.Id, currFilePath, new System.IO.FileInfo(currFilePath).Name,
fileTypeCode, fileTypeName);
}
result.succ = true;
result.msg = "下载BC成功";
}
catch (Exception ex)
{
result.succ = false;
result.msg = $"下载BC失败原因{ex.Message}";
}
return result;
}
[NonAction]
private async Task SaveEDIFile(long boookId, string FilePath, string fileName, string fileTypeCode = "edi", string fileTypeName = "EDI文件")
{
/*
*/
//EDI文件
var bookFile = new BookingFile
{
Id = YitIdHelper.NextId(),
FileName = fileName,
FilePath = FilePath,
TypeCode = fileTypeCode,
TypeName = fileTypeName,
BookingId = boookId,
};
await _bookingfile.InsertAsync(bookFile);
}
/// <summary>
/// 批量下载Draft
/// </summary>
/// <param name="bookingIds">订舱主键数组</param>
/// <returns></returns>
public async Task<TaskManageOrderResultDto> DownloadDraft(long[] bookingIds)
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto();
try
{
/*
1
2
3
4
5
6
*/
result.succ = true;
result.msg = "批量下载Draft成功";
//result.ext = id;
}
catch (Exception ex)
{
result.succ = false;
result.msg = $"批量下载Draft异常原因{ex.Message}";
}
return result;
}
#region 请求规则平台
/// <summary>
/// 请求规则平台
/// </summary>
/// <param name="BusinessMsg"></param>
/// <returns></returns>
[NonAction]
private async Task<BCAPIBaseResult<BCAPIBaseDataParse>> ExcuteBCDownload(string url, BCOrDraftRequestDto info, string batchNo)
{
BCAPIBaseResult<BCAPIBaseDataParse> model = null;
/*
1JSON
2POST
3
*/
try
{
_logger.LogInformation("批次={no} 对应请求报文 request={res}", batchNo, JSON.Serialize(info));
var res = await url.SetHttpMethod(HttpMethod.Post)
.SetBody(JSON.Serialize(info), "application/json")
.SetContentEncoding(Encoding.UTF8)
.PostAsync();
_logger.LogInformation("批次={no} 对应请求报文完成 res={res}", batchNo, JSON.Serialize(res));
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
var userResult = await res.Content.ReadAsStringAsync();
System.Text.Json.JsonSerializerOptions jsonOptions = new JsonSerializerOptions();
jsonOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss"));
model = JSON.Deserialize<BCAPIBaseResult<BCAPIBaseDataParse>>(userResult, jsonOptions);
}
}
catch (Exception ex)
{
//写日志
if (ex is HttpRequestException)
throw Oops.Oh(10000002);
}
return model;
}
#endregion
}
public class DateTimeJsonConverter : System.Text.Json.Serialization.JsonConverter<DateTime>
{
private readonly string _dateFormatString;
public DateTimeJsonConverter()
{
_dateFormatString = "yyyy-MM-dd HH:mm:ss";
}
public DateTimeJsonConverter(string dateFormatString)
{
_dateFormatString = dateFormatString;
}
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToUniversalTime().ToString(_dateFormatString));
}
}
}

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Myshipping.Application
{
public class BCAPIBaseResult<T>
{
/// <summary>
/// 回执代码
/// </summary>
public int code { get; set; }
/// <summary>
/// 提示信息
/// </summary>
public string msg { get; set; }
/// <summary>
/// 数据集
/// </summary>
public BCAPIBaseData<T> data { get; set; }
}
public class BCAPIBaseData<T>
{
/// <summary>
/// 文件下载路径
/// </summary>
public string path { get; set; }
/// <summary>
/// 解析详情
/// </summary>
public T parse { get; set; }
}
public class BCAPIBaseDataParse
{
/// <summary>
/// 解析回执代码
/// </summary>
public int status { get; set; }
/// <summary>
/// 解析提示信息
/// </summary>
public string message { get; set; }
/// <summary>
/// 解析提示信息
/// </summary>
public BCAPIBaseDataParseModel data { get; set; }
}
public class BCAPIBaseDataParseModel
{
/// <summary>
/// 模板ID
/// </summary>
public string ModelID { get; set; }
/// <summary>
/// 模板名称
/// </summary>
public string ModelName { get; set; }
/// <summary>
/// BC解析明细
/// </summary>
public List<BCReadModel> BCList { get; set; }
}
}

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Myshipping.Application
{
/// <summary>
/// BC或DRAFT下载请求
/// </summary>
public class BCOrDraftRequestDto
{
/// <summary>
/// 用户key
/// </summary>
public string user_key { get; set; }
/// <summary>
/// 用户secret
/// </summary>
public string user_secret { get; set; }
/// <summary>
/// 网站账号
/// </summary>
public string web_user { get; set; }
/// <summary>
/// 网站密码
/// </summary>
public string web_psw { get; set; }
/// <summary>
/// 单号(订舱编号)
/// </summary>
public string bno { get; set; }
/// <summary>
/// 是否解析,默认否
/// </summary>
public bool is_parse { get; set; } = false;
}
}

@ -0,0 +1,265 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Myshipping.Application
{
/// <summary>
/// BC解析主信息
/// </summary>
public class BCReadModel
{
/// <summary>
/// 订舱单位
/// </summary>
public string BookingParty { get; set; }
/// <summary>
/// 发货人
/// </summary>
public string Shipper { get; set; }
/// <summary>
/// 收货人
/// </summary>
public string Consigner { get; set; }
/// <summary>
/// 通知人
/// </summary>
public string NotifyParty { get; set; }
/// <summary>
/// BC更新次数
/// </summary>
public Nullable<int> BCUpdateTimes { get; set; }
/// <summary>
/// BC更新时间
/// </summary>
public Nullable<DateTime> BCUpdateTime { get; set; }
/// <summary>
/// 提单号
/// </summary>
public string BLNo { get; set; }
/// <summary>
/// 船名
/// </summary>
public string Vessel { get; set; }
/// <summary>
/// 航次
/// </summary>
public string Voyage { get; set; }
/// <summary>
/// 船公司
/// </summary>
public string ShippingCompany { get; set; }
/// <summary>
/// 收货地
/// </summary>
public string PlaceOfReceipt { get; set; }
/// <summary>
/// 发货人
/// </summary>
public string LoadingPort { get; set; }
/// <summary>
/// 截关时间
/// </summary>
public Nullable<DateTime> ClosingDate { get; set; }
/// <summary>
/// 截VGM时间
/// </summary>
public Nullable<DateTime> VGMCutOffTime { get; set; }
/// <summary>
/// ETA
/// </summary>
public Nullable<DateTime> ETA { get; set; }
/// <summary>
/// ETD
/// </summary>
public Nullable<DateTime> ETD { get; set; }
/// <summary>
/// 目的港ETA
/// </summary>
public Nullable<DateTime> PortOfDestinationETA { get; set; }
/// <summary>
/// 预付地点
/// </summary>
public Nullable<DateTime> CutSingleTime { get; set; }
/// <summary>
/// 截港时间
/// </summary>
public Nullable<DateTime> CYCutOffTime { get; set; }
/// <summary>
/// 卸货港
/// </summary>
public string DischargingPort { get; set; }
/// <summary>
/// 交货地
/// </summary>
public string DeliveryPlace { get; set; }
/// <summary>
/// 装运方式
/// </summary>
public string ShippingWay { get; set; }
/// <summary>
/// 运输条款
/// </summary>
public string ShippingTerms { get; set; }
/// <summary>
/// 港前运输形态
/// </summary>
public string PreportTransportationMode { get; set; }
/// <summary>
/// 品名
/// </summary>
public string OfTheGoods { get; set; }
/// <summary>
/// 签单地点
/// </summary>
public string SignTheBillLocation { get; set; }
/// <summary>
/// 集港码头
/// </summary>
public string CollectionTerminal { get; set; }
/// <summary>
/// 约号
/// </summary>
public string AboutNo { get; set; }
/// <summary>
/// 预付地点
/// </summary>
public string PlaceInAdvance { get; set; }
/// <summary>
/// 船代
/// </summary>
public string ShipAgency { get; set; }
/// <summary>
/// 场站
/// </summary>
public string Station { get; set; }
/// <summary>
/// 场站联系人
/// </summary>
public string StationContact { get; set; }
/// <summary>
/// 场站联系电话
/// </summary>
public string StationContactNumber { get; set; }
/// <summary>
/// 一代客服姓名
/// </summary>
public string FirstCustomerServiceName { get; set; }
/// <summary>
/// 一代客服电话
/// </summary>
public string FirstCustomerServiceNumber { get; set; }
/// <summary>
/// 一代客服邮箱
/// </summary>
public string FirstCustomerServiceEmail { get; set; }
/// <summary>
/// 备注1
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 集装箱列表
/// </summary>
public List<BCReadContaModel> Containers { get; set; }
}
/// <summary>
/// 集装箱详情
/// </summary>
public class BCReadContaModel
{
/// <summary>
/// 箱量
/// </summary>
public Nullable<int> CartonQuantity { get; set; }
/// <summary>
/// 箱型
/// </summary>
public string BoxPile { get; set; }
/// <summary>
/// 件数
/// </summary>
public Nullable<int> Pieces { get; set; }
/// <summary>
/// 尺寸
/// </summary>
public Nullable<decimal> Size { get; set; }
/// <summary>
/// 毛重
/// </summary>
public Nullable<decimal> GrossWeight { get; set; }
/// <summary>
/// 箱皮重
/// </summary>
public Nullable<decimal> TareWeight { get; set; }
/// <summary>
/// 危品票标示
/// </summary>
public string IODGT { get; set; }
/// <summary>
/// 特殊装载需求
/// </summary>
public string SpecialLoadingRequirement { get; set; }
/// <summary>
/// 提箱场站
/// </summary>
public string SuitcaseTterminal { get; set; }
/// <summary>
/// 提箱时间
/// </summary>
public Nullable<DateTime> SuitcaseTime { get; set; }
/// <summary>
/// 还箱场站
/// </summary>
public string ReturnDepot { get; set; }
}
}

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Myshipping.Application
{
/// <summary>
/// 订舱增值类服务
/// </summary>
public interface IBookingValueAddedService
{
/// <summary>
/// 批量下载BC
/// </summary>
/// <param name="bookingIds">订舱主键数组</param>
/// <returns></returns>
Task<TaskManageOrderResultDto> DownloadBookingConfirm(long[] bookingIds);
/// <summary>
/// 批量下载Draft
/// </summary>
/// <param name="bookingIds">订舱主键数组</param>
/// <returns></returns>
Task<TaskManageOrderResultDto> DownloadDraft(long[] bookingIds);
}
}

@ -744,6 +744,9 @@ namespace Myshipping.Application
if (model == null)
throw Oops.Oh($"派车信息获取失败,派车信息不存在或已作废", typeof(InvalidOperationException));
var bookingOrder = _bookingOrderRepository.AsQueryable().First(a => a.Id == model.BookingId);
//校验
ValidateTruck(OperateTypeEnum.Submit, new BookingTruck[] { model });
@ -769,9 +772,34 @@ namespace Myshipping.Application
{
TaskType = TaskBaseTypeEnum.TRUCK_DISPATCH,
TruckInfo = model.Adapt<TaskManageOrderTruckInfo>(),
MBlNo = bookingOrder.MBLNO,
ETD = bookingOrder.ETD,
VesselVoyno = $"{bookingOrder.VESSEL}/{bookingOrder.VOYNO}",
TaskUserId = UserManager.UserId.ToString(),
TaskUserName = UserManager.Name,
ContaInfo = model.CntrTotal,
YardName = model.InYard
}
};
if(string.IsNullOrWhiteSpace(messageInfo.Main.TruckInfo.Vessel)
&& !string.IsNullOrWhiteSpace(bookingOrder.VESSEL))
{
messageInfo.Main.TruckInfo.Vessel = bookingOrder.VESSEL;
}
if (string.IsNullOrWhiteSpace(messageInfo.Main.TruckInfo.VoyNo)
&& !string.IsNullOrWhiteSpace(bookingOrder.VOYNO))
{
messageInfo.Main.TruckInfo.VoyNo = bookingOrder.VOYNO;
}
if (string.IsNullOrWhiteSpace(messageInfo.Main.TruckInfo.MBLNo)
&& !string.IsNullOrWhiteSpace(bookingOrder.MBLNO))
{
messageInfo.Main.TruckInfo.MBLNo = bookingOrder.MBLNO;
}
if (contaList.Count > 0)
messageInfo.Main.TruckInfo.ContaList = contaList.Adapt<List<TaskManageOrderTruckContaInfo>>();

@ -89,6 +89,26 @@ namespace Myshipping.Application
/// </summary>
public string TaskOrgName { get; set; }
/// <summary>
/// 开船日期
/// </summary>
public Nullable<DateTime> ETD { get; set; }
/// <summary>
/// 箱型箱量
/// </summary>
public string ContaInfo { get; set; }
/// <summary>
/// 船名航次
/// </summary>
public string VesselVoyno { get; set; }
/// <summary>
/// 场站
/// </summary>
public string YardName { get; set; }
/// <summary>
/// 费用明细当业务类型是INVOICE_BILL_MAIL-航次账单
/// </summary>

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -177,6 +178,24 @@ namespace Myshipping.Application
/// </summary>
public string FactoryAddr { get; set; }
/// <summary>
/// 箱型箱量
/// </summary>
public string CntrTotal { get; set; }
/// <summary>
/// 船名
/// </summary>
public string Vessel { get; set; }
/// <summary>
/// 航次
/// </summary>
public string VoyNo { get; set; }
/// <summary>
/// 提单号
/// </summary>
public string MBLNo { get; set; }
/// <summary>
/// 集装箱列表
/// </summary>

@ -52,6 +52,10 @@ namespace Myshipping.Application
/// </summary>
public string AttnFax { get; set; }
/// <summary>
/// FROM手机号
/// </summary>
public string FromMobile { get; set; }
/// <summary>
/// FROM
/// </summary>
public string FromName { get; set; }

@ -240,8 +240,23 @@ namespace Myshipping.Application
TASK_DESP = info.Main.TaskDesp,
TASK_SOURCE = info.Main.TaskSource.ToString(),
TASK_TYPE = info.Main.TaskType.ToString(),
VESSEL_VOYNO = info.Main.VesselVoyno?.Trim(),
CONTA_INFO = info.Main.ContaInfo,
TASK_REQ_USERNAME = info.Main.TaskUserName,
YARD_NAME = info.Main.YardName,
ETD = info.Main.ETD
};
long taskReqUserId = 0;
if (!string.IsNullOrWhiteSpace(info.Main.TaskUserId))
{
if(long.TryParse(info.Main.TaskUserId,out taskReqUserId))
{
taskInfo.TASK_REQ_USERID = taskReqUserId;
}
}
UserTendDto userTendInfo = GetUserTendInfo(info.Main.RecvUserId);
taskInfo.CreatedUserId = userTendInfo.userId;
@ -477,6 +492,7 @@ namespace Myshipping.Application
truckInfo.TenantName = taskInfo.TenantName;
truckInfo.Status = BookingTruckStatus.TEMP.ToString();
//异步写入
await _taskTruckInfoRepository.InsertAsync(truckInfo);
@ -685,13 +701,15 @@ namespace Myshipping.Application
ActionKey = TaskStatLevelEnum.EXCPTION.ToString()
});
var nextList = new List<TaskUserStatItemNext>();
exceptList.GroupBy(t => t.Status)
.Select(t => new { Key = t.Key, Total = t.ToList().Sum(p => p.Total) })
.ToList().ForEach(t =>
{
TaskStatusEnum currEnum = (TaskStatusEnum)System.Enum.Parse(typeof(TaskStatusEnum), t.Key);
resultInfo.LevelNext.Add(new TaskUserStatItemNext
nextList.Add(new TaskUserStatItemNext
{
TopKey = TaskStatLevelEnum.EXCPTION.ToString(),
Key = currEnum.ToString(),
@ -703,6 +721,9 @@ namespace Myshipping.Application
});
if (nextList.Count > 0)
resultInfo.LevelNext = nextList.OrderBy(t => t.SortNo).ToList();
exceptList.GroupBy(t => new { t.Status, t.TaskType })
.Select(t => new { Key = t.Key, Total = t.ToList().Sum(p => p.Total) })
.ToList().ForEach(t =>
@ -736,13 +757,14 @@ namespace Myshipping.Application
ActionKey = TaskStatLevelEnum.PERSON.ToString()
});
var nextList = new List<TaskUserStatItemNext>();
personList.GroupBy(t => t.Status)
.Select(t => new { Key = t.Key, Total = t.ToList().Sum(p => p.Total) })
.ToList().ForEach(t =>
{
TaskStatusEnum currEnum = (TaskStatusEnum)System.Enum.Parse(typeof(TaskStatusEnum), t.Key);
resultInfo.LevelNext.Add(new TaskUserStatItemNext
nextList.Add(new TaskUserStatItemNext
{
TopKey = TaskStatLevelEnum.PERSON.ToString(),
Key = currEnum.ToString(),
@ -754,6 +776,9 @@ namespace Myshipping.Application
});
if (nextList.Count > 0)
resultInfo.LevelNext = nextList.OrderBy(t => t.SortNo).ToList();
personList.GroupBy(t => new { t.Status, t.TaskType })
.Select(t => new { Key = t.Key, Total = t.ToList().Sum(p => p.Total) })
.ToList().ForEach(t =>
@ -787,13 +812,15 @@ namespace Myshipping.Application
ActionKey = TaskStatLevelEnum.PUBLIC.ToString()
});
var nextList = new List<TaskUserStatItemNext>();
publicList.GroupBy(t => t.Status)
.Select(t => new { Key = t.Key, Total = t.ToList().Sum(p => p.Total) })
.ToList().ForEach(t =>
{
TaskStatusEnum currEnum = (TaskStatusEnum)System.Enum.Parse(typeof(TaskStatusEnum), t.Key);
resultInfo.LevelNext.Add(new TaskUserStatItemNext
nextList.Add(new TaskUserStatItemNext
{
TopKey = TaskStatLevelEnum.PUBLIC.ToString(),
Key = currEnum.ToString(),
@ -805,6 +832,9 @@ namespace Myshipping.Application
});
if (nextList.Count > 0)
resultInfo.LevelNext = nextList.OrderBy(t => t.SortNo).ToList();
publicList.GroupBy(t => new { t.Status, t.TaskType })
.Select(t => new { Key = t.Key, Total = t.ToList().Sum(p => p.Total) })
.ToList().ForEach(t =>
@ -825,7 +855,6 @@ namespace Myshipping.Application
});
}
#endregion
}
catch (Exception ex)
{
@ -916,7 +945,7 @@ namespace Myshipping.Application
.WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.TaskCategory) && QuerySearch.TaskCategory == TaskStatLevelEnum.PUBLIC.ToString(), t => t.IS_PUBLIC == 1)
.WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.TaskCategory) && QuerySearch.TaskCategory == TaskStatLevelEnum.PERSON.ToString(), t => t.IS_PUBLIC == 0 && t.IS_EXCEPT == 0)
.WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.Status), t => t.STATUS.Equals(QuerySearch.Status, StringComparison.OrdinalIgnoreCase))
.OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc "))
.OrderBy(entityOrderCol + (QuerySearch.descSort ? " desc " : " asc "))
.ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize);

@ -68,5 +68,10 @@ namespace Myshipping.Core.Entity
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 船司代码
/// </summary>
public string CarrierCode { get; set; }
}
}

@ -26,6 +26,23 @@ namespace Myshipping.Core
return jt as JObject;
}
/// <summary>
/// 获取JArray
/// </summary>
/// <param name="jobj"></param>
/// <param name="prop"></param>
/// <returns></returns>
public static JArray GetJArrayValue(this JObject jobj, string prop)
{
var jt = jobj[prop];
if (jt == null)
{
return null;
}
return jt as JArray;
}
/// <summary>
/// 获取字符串值
/// </summary>

@ -1527,6 +1527,11 @@
备注
</summary>
</member>
<member name="P:Myshipping.Core.Entity.MappingYard.CarrierCode">
<summary>
船司代码
</summary>
</member>
<member name="P:Myshipping.Core.Entity.CommonDbEntity.GID">
<summary>
主键
@ -5345,6 +5350,14 @@
<param name="prop"></param>
<returns></returns>
</member>
<member name="M:Myshipping.Core.JsonExtension.GetJArrayValue(Newtonsoft.Json.Linq.JObject,System.String)">
<summary>
获取JArray
</summary>
<param name="jobj"></param>
<param name="prop"></param>
<returns></returns>
</member>
<member name="M:Myshipping.Core.JsonExtension.GetStringValue(Newtonsoft.Json.Linq.JObject,System.String)">
<summary>
获取字符串值
@ -8894,6 +8907,11 @@
排序
</summary>
</member>
<member name="P:Myshipping.Core.Service.CommonDB.Dto.MappingYardDto.CarrierCode">
<summary>
船司代码
</summary>
</member>
<member name="T:Myshipping.Core.Service.CommonDB.Dto.RelaPortCarrierLaneDto">
<summary>
航线与港口的的关系表

@ -104,7 +104,7 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie
_codeLaneRep = codeLaneRep;
_relaPortCarrierLaneRep = relaPortCarrierLaneRep;
_codeCountryRep = codeCountryRep;
_mappingIssueTypeRep= mappingIssueTypeRep;
_mappingIssueTypeRep = mappingIssueTypeRep;
_mappingForwarder = mappingForwarder;
}
@ -526,7 +526,7 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie
{
var list = await _sysCacheService.GetAllMappingYard();
var count = list.Where(x => x.Code == dto.Code && x.Module == dto.Module && x.GID != dto.GID).Count();
var count = list.Where(x => x.Code == dto.Code && x.Module == dto.Module && x.CarrierCode == dto.CarrierCode && x.GID != dto.GID).Count();
if (count > 0)
{
throw Oops.Bah(ErrorCode.D1006);
@ -1328,7 +1328,7 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie
public async Task AddOrUpdateMappingIssueType([FromBody] MappingIssueTypeDto dto)
{
var list = await _sysCacheService.GetAllMappingIssueType();
var count = list.Where(x => x.Code == dto.Code && x.Module == dto.Module && x.GID != dto.GID).Count();
var count = list.Where(x => x.Code == dto.Code && x.Module == dto.Module && x.GID != dto.GID).Count();
if (count > 0)
{
throw Oops.Bah(ErrorCode.D1006);
@ -1578,13 +1578,13 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie
/// </summary>
/// <param name="input">查询条件</param>
/// <returns></returns>
[HttpGet("/commondb/CodeCountryList")]
[HttpGet("/commondb/CodeCountryList")]
public async Task<dynamic> CodeCountryList([FromQuery] NameQueryDto input)
{
List<CodeCountry> list = await _sysCacheService.GetAllCodeCountry();
var queryList = list
.WhereIF(!string.IsNullOrEmpty(input.Name),x=>x.Code.ToUpper()==input.Name.ToUpper())
.WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Code.ToUpper() == input.Name.ToUpper())
.WhereIF(!string.IsNullOrEmpty(input.KeyWord),
x => (!string.IsNullOrWhiteSpace(x.Code) && x.Code.Contains(input.KeyWord, System.StringComparison.CurrentCultureIgnoreCase))
|| (!string.IsNullOrWhiteSpace(x.EnName) && x.EnName.Contains(input.KeyWord, System.StringComparison.CurrentCultureIgnoreCase))

@ -41,5 +41,10 @@ namespace Myshipping.Core.Service.CommonDB.Dto
/// </summary>
public int Sort { get; set; }
/// <summary>
/// 船司代码
/// </summary>
public string CarrierCode { get; set; }
}
}

@ -119,5 +119,7 @@
"Path": "TempFiles",
"RemainHours": 2
},
"ShippingOrderCompareUrl": "http://60.209.125.238:35210/api/TaskShippingOrderCompare/ExcuteShippingOrderCompare"
"ShippingOrderCompareUrl": "http://60.209.125.238:35210/api/TaskShippingOrderCompare/ExcuteShippingOrderCompare",
"BCOrDraftUserKey": "BookingOrderPlat",
"BCOrDraftUserSecret": "228b2db5952d13291f228d441018c1b6"
}

@ -26,6 +26,11 @@
<Content Remove="wwwroot\Template\Service.cs.vm" />
</ItemGroup>
<ItemGroup>
<_WebToolingArtifacts Remove="Properties\PublishProfiles\linux.pubxml" />
<_WebToolingArtifacts Remove="Properties\PublishProfiles\windows.pubxml" />
</ItemGroup>
<ItemGroup>
<None Update="Dockerfile">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

Loading…
Cancel
Save