diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 47dd487b..3e57f63d 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -83,6 +83,7 @@ using Myshipping.Application.EDI.VOLTA; using TinyPinyin; using Furion.EventBus; using Myshipping.Application.Service.BookingSlot.Dto; +using Myshipping.Application.Service.BookingOrder.Dto.MSKAPI; namespace Myshipping.Application { @@ -5084,8 +5085,10 @@ namespace Myshipping.Application /// /// [HttpPost("/BookingOrder/VgmSend")] - public async Task VgmSend(long bookingId) + public async Task VgmSend(long bookingId) { + object result = null; + var order = _rep.FirstOrDefault(x => x.Id == bookingId); var ctns = _repCtn.Where(x => x.BILLID == bookingId).ToList(); @@ -5101,268 +5104,408 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK127); } - var config = _cache.GetAllTenantParam().Result.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "VgmDirectSendCarrierId"); - if (config == null) - { - throw Oops.Bah("请配置租户的VGM直发船司参数"); - } + /* 1. 先通过 租户参数里的 支持API发送的船司列表 判断是否走API发送 + * 2. 如果不走API,再通过 租户参数里的 直发船司列表 判断走爬虫直发或大简云发送 + */ + + var tenantParamList = _cache.GetAllTenantParam().Result; - var arrCarr = config.ItemCode.Split(",", StringSplitOptions.RemoveEmptyEntries); - if (!arrCarr.Contains(order.CARRIERID)) //使用大简云发送vgm + var vgmApiSendCarrierIdStr = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "VgmApiSendCarrierId"); + + string[] vgmApiSendCarrierIdArr = vgmApiSendCarrierIdStr == null + ? new string[0] + : vgmApiSendCarrierIdStr.ItemCode.Split(","); + + // VGM发送方式1:通过API发送 + if (vgmApiSendCarrierIdArr.Contains(order.CARRIERID)) { - //ETD不能为空 - if (!order.ETD.HasValue) + try { - throw Oops.Bah("ETD不能为空"); - } + if (!order.CARRIERID.Equals("MSK", StringComparison.OrdinalIgnoreCase)) + { + throw Oops.Bah($"[{order.CARRIERID}]船公司暂不支持通过API发送VGM"); + } + + //config1 + string userKey = App.Configuration["MSKAPIDjyUserKey"]; + string userSecret = App.Configuration["MSKAPIDjyUserSecret"]; + string env = App.Configuration["MSKAPIOPEnvironment"]; + + if (string.IsNullOrWhiteSpace(userKey) || string.IsNullOrWhiteSpace(userSecret) || string.IsNullOrWhiteSpace(env)) + { + throw Oops.Bah("通过MSKAPI发送VGM所需的Key或Secret或Environment未配置,请联系管理员"); + } - //重量不能为空 - if (!order.KGS.HasValue) + // config2 + var webAccount = await _webAccountConfig.GetAccountConfig("MSKApi", UserManager.UserId) ?? throw Oops.Bah("未配置网站账户,类型:MSKApi"); + + // config3 + var allSysConfig = await _cache.GetAllSysConfig(); + var url = allSysConfig.FirstOrDefault(x => x.Code == "VgmSendMskApiUrl")?.Value; + + if (string.IsNullOrWhiteSpace(url)) + { + throw Oops.Bah("通过MSKAPI发送VGM所需的Url未配置,请联系管理员,配置名称:[VgmSendMskApiUrl]"); + } + + // config4 + var vgmSendMskCustomerCode = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "VgmSendMskCustomerCode")?.ItemCode; + if (string.IsNullOrWhiteSpace(vgmSendMskCustomerCode)) + { + throw Oops.Bah("通过MSKAPI发送VGM所需的[客户编号],请联系管理员,配置名称:[VgmSendMskCustomerCode]"); + } + + var param = new + { + userKey, + userSecret, + operatingEnvironment = env, + mskAppKey = webAccount.Account, + mskAppSecret = webAccount.Password, + shipmentNumber = order.MBLNO, + brandCode = "MAEU", + customerCode = vgmSendMskCustomerCode, + terminalCode = "", + containerList = new List() + }; + foreach (var ctn in ctns) + { + if (string.IsNullOrEmpty(ctn.CNTRNO) + || !ctn.WEIGHKGS.HasValue + || ctn.WEIGHKGS == 0 + || string.IsNullOrWhiteSpace(ctn.WEIGHTYPE)) + { + throw Oops.Bah("所有箱子的箱号、称重重量、称重方式都不能为空"); + } + var vgmMethod = ctn.WEIGHTYPE switch + { + "累加" => "CALCULATED", + "总重" => "SCALED", + _ => throw Oops.Bah($"箱号为[{ctn.CNTRNO}]的箱子称重方式非[累加]或[总重],请检查") + }; + param.containerList.Add(new + { + containerNumber = ctn.CNTRNO, + vgmSource = "Shipper", + vgm = ctn.WEIGHKGS, + vgmUnit = "KGS", + vgmMethod, + authorizedPersonName = UserManager.Name, + authorizedPersonEmail = UserManager.Email + }); + } + + _logger.LogInformation("通过MSKAPI发送VGM,单号:{mblno},入参:{param}", order.MBLNO, param.ToJson()); + var resp = await url.SetBody(param).PostAsAsync(); + _logger.LogInformation("通过MSKAPI发送VGM,单号:{mblno},响应:{resp}", order.MBLNO, resp.ToJson()); + + if (resp.code == 200) + { + if (resp.data.Any(x => !x.status)) + { + result = resp.data.Select(x => new + { + CNTRNO = x.containerNumber, + IsSuccess = x.status, + FailReason = x.error_msg + }).ToList(); + _logger.LogInformation("通过MSKAPI发送VGM,部分成功,单号:{mblno},详细结果:{data}", order.MBLNO, result.ToJson()); + } + else + { + _logger.LogInformation("通过MSKAPI发送VGM,全部成功,单号:{mblno},详细结果:{data}", order.MBLNO, result.ToJson()); + + //货运动态 + var bsl = new BookingStatusLog(); + bsl.BookingId = order.Id; + bsl.Status = $"直发VGM(API)"; + bsl.OpTime = DateTime.Now; + bsl.Category = "ship"; + bsl.MBLNO = order.MBLNO; + await _repStatuslog.InsertAsync(bsl); + } + } + else + { + _logger.LogInformation("通过MSKAPI发送VGM,VGM服务接口返回失败结果,单号:{mblno}", order.MBLNO); + throw Oops.Bah($"VGM服务接口返回失败结果:{resp.msg}"); + } + } + catch (Exception ex) { - throw Oops.Bah("重量不能为空"); + _logger.LogError(ex, "通过MSKAPI发送VGM时发生未知异常,单号:{mblno}", order.MBLNO); + throw Oops.Bah($"发送失败:{ex.Message}"); } - - var sysconfig = await _cache.GetAllSysConfig(); - var urlConfig = sysconfig.FirstOrDefault(x => x.GroupCode == "DJY_CONST" && x.Code == "DjyVgmApiMyshpping"); - var accConfig = await _webAccountConfig.GetAccountConfig("DjyVgm", UserManager.UserId); - if (accConfig == null) + } + else + { + var config = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "VgmDirectSendCarrierId"); + if (config == null) { - throw Oops.Bah("请在网站账号中维护VGM接口的用户id和秘钥"); + throw Oops.Bah("请配置租户的VGM直发船司参数"); } - var objMdata = new + var arrCarr = config.ItemCode.Split(",", StringSplitOptions.RemoveEmptyEntries); + // VGM发送方式2:使用大简云发送vgm + if (!arrCarr.Contains(order.CARRIERID)) { - MBLNO = order.MBLNO, - CARRIER = order.CARRIERID, - ChuanMing = order.VESSEL, - HangCi = order.VOYNOINNER, - ETD = order.ETD.Value.ToString("yyyy-MM-dd HH:mm:ss"), - ZongZhongLiang = order.KGS.ToString(), - BeiZhu = "", - ORDERNO = order.CUSTNO, - VGMCLOSETIME = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd HH:mm:ss") : "" - }; + //ETD不能为空 + if (!order.ETD.HasValue) + { + throw Oops.Bah("ETD不能为空"); + } - var listCtn = new List(); - foreach (var ctn in ctns) - { - if (string.IsNullOrEmpty(ctn.CTNALL) - || string.IsNullOrEmpty(ctn.CNTRNO) - || string.IsNullOrEmpty(ctn.SEALNO) - || !ctn.WEIGHKGS.HasValue - || string.IsNullOrEmpty(ctn.WEIGHDATE)) + //重量不能为空 + if (!order.KGS.HasValue) { - throw Oops.Bah("所有箱子的箱型、箱号、封号、称重重量和称重时间都不能为空"); + throw Oops.Bah("重量不能为空"); } - listCtn.Add(new + var sysconfig = await _cache.GetAllSysConfig(); + var urlConfig = sysconfig.FirstOrDefault(x => x.GroupCode == "DJY_CONST" && x.Code == "DjyVgmApiMyshpping"); + var accConfig = await _webAccountConfig.GetAccountConfig("DjyVgm", UserManager.UserId); + if (accConfig == null) { - ChengZhongZhongLiang = ctn.WEIGHKGS.Value.ToString(), - ChengZhongShiJian = ctn.WEIGHDATE, - CTNALL = ctn.CTNALL.Replace("'", ""), - CNTRNO = ctn.CNTRNO, - SEALNO = ctn.SEALNO - }); - } + throw Oops.Bah("请在网站账号中维护VGM接口的用户id和秘钥"); + } + + var objMdata = new + { + MBLNO = order.MBLNO, + CARRIER = order.CARRIERID, + ChuanMing = order.VESSEL, + HangCi = order.VOYNOINNER, + ETD = order.ETD.Value.ToString("yyyy-MM-dd HH:mm:ss"), + ZongZhongLiang = order.KGS.ToString(), + BeiZhu = "", + ORDERNO = order.CUSTNO, + VGMCLOSETIME = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd HH:mm:ss") : "" + }; + + var listCtn = new List(); + foreach (var ctn in ctns) + { + if (string.IsNullOrEmpty(ctn.CTNALL) + || string.IsNullOrEmpty(ctn.CNTRNO) + || string.IsNullOrEmpty(ctn.SEALNO) + || !ctn.WEIGHKGS.HasValue + || string.IsNullOrEmpty(ctn.WEIGHDATE)) + { + throw Oops.Bah("所有箱子的箱型、箱号、封号、称重重量和称重时间都不能为空"); + } - var dictParam = new Dictionary { + listCtn.Add(new + { + ChengZhongZhongLiang = ctn.WEIGHKGS.Value.ToString(), + ChengZhongShiJian = ctn.WEIGHDATE, + CTNALL = ctn.CTNALL.Replace("'", ""), + CNTRNO = ctn.CNTRNO, + SEALNO = ctn.SEALNO + }); + } + + var dictParam = new Dictionary { { "ac", "vgm" }, { "uid", accConfig.Account}, { "skey", accConfig.Password}, { "optype", "9"}, { "mdata", JsonConvert.SerializeObject(objMdata)}, { "ctndata", JsonConvert.SerializeObject(listCtn)} - }; + }; - _logger.LogInformation($"调用vgm发送接口:{urlConfig.Value},参数:{JsonConvert.SerializeObject(dictParam)}"); + _logger.LogInformation($"调用vgm发送接口:{urlConfig.Value},参数:{JsonConvert.SerializeObject(dictParam)}"); - var rtn = await urlConfig.Value - .SetBody(dictParam, "application/x-www-form-urlencoded") - .PostAsStringAsync(); + var rtn = await urlConfig.Value + .SetBody(dictParam, "application/x-www-form-urlencoded") + .PostAsStringAsync(); - _logger.LogInformation($"调用vgm发送接口:{urlConfig.Value},返回:{rtn}"); + _logger.LogInformation($"调用vgm发送接口:{urlConfig.Value},返回:{rtn}"); - var jobjRtn = JObject.Parse(rtn); - if (jobjRtn.GetBooleanValue("Success")) - { - //货运动态 - 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); + var jobjRtn = JObject.Parse(rtn); + if (jobjRtn.GetBooleanValue("Success")) + { + //货运动态 + 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); + } + else + { + throw Oops.Bah(jobjRtn.GetStringValue("Message")); + } } + // VGM发送方式3:直接调用vgm接口直发 else { - throw Oops.Bah(jobjRtn.GetStringValue("Message")); - } - } - else //直接调用vgm接口直发 - { - //判断船公司是否支持 - 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 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 carrWebAccMap = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "carrier_web_account_mapping" && x.Code == order.CARRIERID); - if (carrWebAccMap == null) - { - throw Oops.Bah("不支持的船公司或账号映射未配置"); - } + //船公司网站账号 + var carrWebAccMap = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "carrier_web_account_mapping" && x.Code == order.CARRIERID); + if (carrWebAccMap == null) + { + throw Oops.Bah("不支持的船公司或账号映射未配置"); + } - var webacc = _webAccountConfig.GetAccountConfig(carrWebAccMap.Value, UserManager.UserId).Result; - if (webacc == null) - { - throw Oops.Bah(BookingErrorCode.BOOK125); - } + var webacc = _webAccountConfig.GetAccountConfig(carrWebAccMap.Value, UserManager.UserId).Result; + if (webacc == null) + { + throw Oops.Bah(BookingErrorCode.BOOK125); + } - ////箱型映射 - //var ctnMapping = await _cache.GetAllMappingCtn(); - //ctnMapping = ctnMapping.Where(x => x.Module == "BookingVgm").ToList(); - //if (ctnMapping.Count == 0) - //{ - // throw Oops.Bah(BookingErrorCode.BOOK122); - //} + ////箱型映射 + //var ctnMapping = await _cache.GetAllMappingCtn(); + //ctnMapping = ctnMapping.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 Oops.Bah(BookingErrorCode.BOOK123, string.Join(',', expCode)); - //} + //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修改:【累加】的必须有重量、皮重和称重重量;【总重】的只需要称重重量不为空 - 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("称重方式为累加时,箱号、重量、箱皮重以及称重重量都不能为空"); - } + #region 箱信息校验,2022-7-1修改:【累加】的必须有重量、皮重和称重重量;【总重】的只需要称重重量不为空 + 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("称重方式为总重时,箱号和称重重量都不能为空"); - } - #endregion + if (ctns.Where(c => c.WEIGHTYPE == "总重" && + ( + string.IsNullOrEmpty(c.CNTRNO) + || !c.WEIGHKGS.HasValue + || c.WEIGHKGS == 0) + ).Count() > 0) + { + throw Oops.Bah("称重方式为总重时,箱号和称重重量都不能为空"); + } + #endregion - ////场站转换 - //var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingVgm"); - //if (yardset == null) - //{ - // throw Oops.Bah(BookingErrorCode.BOOK120, order.YARDID); - //} - if (string.IsNullOrEmpty(order.YARD) || string.IsNullOrEmpty(order.YARDID)) - { - throw Oops.Bah("场站未正确选择"); - } - // 场站映射 - 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 == ""); + ////场站转换 + //var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingVgm"); + //if (yardset == null) + //{ + // throw Oops.Bah(BookingErrorCode.BOOK120, order.YARDID); + //} + if (string.IsNullOrEmpty(order.YARD) || string.IsNullOrEmpty(order.YARDID)) + { + throw Oops.Bah("场站未正确选择"); + } + // 场站映射 + 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 == ""); - mappingYard = yardset.MapName; - mappingYardId = yardset.MapCode; - } - else - { - mappingYard = order.YARD; - mappingYardId = order.YARDID; - } - - // 船司映射 - 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 = "" - }; + mappingYard = yardset.MapName; + mappingYardId = yardset.MapCode; + } + else + { + mappingYard = order.YARD; + mappingYardId = order.YARDID; + } + + // 船司映射 + 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}"); + 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 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); } - //货运动态 - 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); } //设置货物状态:已发VGM,并回传东胜 await SetGoodsStatus("YFVGM", bookingId); await SendBookingOrder(new long[] { bookingId }); + + return result; } diff --git a/Myshipping.Application/Service/BookingOrder/Dto/MSKAPI/MSKAPISendVgmResultDto.cs b/Myshipping.Application/Service/BookingOrder/Dto/MSKAPI/MSKAPISendVgmResultDto.cs new file mode 100644 index 00000000..53bcbbd6 --- /dev/null +++ b/Myshipping.Application/Service/BookingOrder/Dto/MSKAPI/MSKAPISendVgmResultDto.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; + +namespace Myshipping.Application.Service.BookingOrder.Dto.MSKAPI +{ + public class MSKAPISendVgmResultDto + { + public int code { get; set; } + public string msg { get; set; } + public List data { get; set; } + + public class VGMInfoByCtn + { + /// + /// 单号 + /// + public string shipmentNumber { get; set; } + /// + /// 箱号 + /// + public string containerNumber { get; set; } + /// + /// 提交状态 + /// + public bool status { get; set; } + public SuccessResult success_result { get; set; } + /// + /// 提交失败的提示文本 + /// + public string error_msg { get; set; } + } + public class SuccessResult + { + /// + /// 操作的结果 + /// + public string vgmAcknowledgmentMessage { get; set; } + + /// + /// 操作完成的时间戳 + /// + public string vgmTimestamp { get; set; } + } + } + + +}