You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingHeChuan/Myshipping.Application/Service/BookingOrderSeaeEdi/BookingOrderSeaeEdiService.cs

522 lines
20 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Myshipping.Core;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Linq;
using System.Threading.Tasks;
using Myshipping.Application.Entity;
using Microsoft.AspNetCore.Authorization;
using Furion;
using Microsoft.AspNetCore.Http;
using Furion.DataEncryption;
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 System.Reflection;
using System.ComponentModel;
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 System.Reflection.Emit;
using Myshipping.Application.Service.BookingOrderSeaeEdi.Dto;
using Myshipping.Application.Enum;
using Myshipping.Application.Service.BookingOrder.Dto;
using Newtonsoft.Json.Linq;
using System.Text;
using System.Web;
namespace Myshipping.Application
{
/// <summary>
/// 舱单服务
/// </summary>
[ApiDescriptionSettings("Application", Name = "BookingOrderSeaeEdi", Order = 1)]
public class BookingOrderSeaeEdiService : IBookingOrderSeaeEdiService, IDynamicApiController, ITransient
{
private readonly ILogger<BookingOrderSeaeEdiService> _logger;
private readonly SqlSugarRepository<BookingOrderSeaeEdi> _seaeedi;
private readonly SqlSugarRepository<BookingOrderSeaeEdiCtn> _seaeedictn;
private readonly ISysCacheService _cache;
private readonly IBookingOrderService _rep;
private readonly SqlSugarRepository<BookingStatusLog> _repStatuslog;
private readonly SqlSugarRepository<BookingOrderSeaeEdiTemplate> _repTemplate;
private readonly IDjyWebsiteAccountConfigService _webAccountConfig;
private readonly SqlSugarRepository<BookingGoodsStatusConfig> _goodsStatusConfig;
private readonly SqlSugarRepository<BookingGoodsStatus> _goodsStatus;
public BookingOrderSeaeEdiService(ILogger<BookingOrderSeaeEdiService> logger, SqlSugarRepository<BookingOrderSeaeEdi> seaeedi,
SqlSugarRepository<BookingOrderSeaeEdiCtn> seaeedictn, ISysCacheService cache, SqlSugarRepository<BookingStatusLog> repStatuslog,
SqlSugarRepository<BookingOrderSeaeEdiTemplate> repTemplate, SqlSugarRepository<BookingGoodsStatusConfig> goodsStatusConfig,
SqlSugarRepository<BookingGoodsStatus> goodsStatus, IBookingOrderService rep,
IDjyWebsiteAccountConfigService webAccountConfig)
{
this._logger = logger;
this._seaeedi = seaeedi;
this._seaeedictn = seaeedictn;
this._cache = cache;
this._repStatuslog = repStatuslog;
this._webAccountConfig = webAccountConfig;
this._repTemplate = repTemplate;
this._goodsStatusConfig = goodsStatusConfig;
this._goodsStatus = goodsStatus;
this._rep = rep;
}
/// <summary>
/// 获取数据
/// </summary>
/// <param name="bookingId"></param>
/// <returns></returns>
[HttpGet("/BookingOrderSeaeEdi/PageESeaeEdi")]
public async Task<List<BookingOrderSeaeEdiServiceDto>> PageESeaeEdi(long bookingId)
{
var entities = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.BookingId == bookingId && x.IsDeleted == false).ToListAsync();
var list = entities.Adapt<List<BookingOrderSeaeEdiServiceDto>>();
foreach (var item in list)
{
var ctn = await _seaeedictn.AsQueryable().Filter(null, true).Where(x => x.PId == item.Id && x.IsDeleted == false).ToListAsync();
item.EdiCtn = ctn.Adapt<List<BookingOrderSeaeEdiCtnDto>>();
}
return list;
}
/// <summary>
/// 立即返回保存信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/BookingOrderSeaeEdi/Save")]
public async Task<dynamic> Save(BookingOrderSeaeEdiServiceDto input)
{
if (input == null)
{
throw Oops.Bah("请传入正常数据!");
}
if (!string.IsNullOrWhiteSpace(input.MBLNO))
{
var et = await _seaeedi.Where(x => x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == input.HBLNO && x.Id != input.Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前提单号已存在,请勿重复录入!");
}
}
BookingOrderSeaeEdi entity = null;
if (input.Id == 0)
{
entity = input.Adapt<BookingOrderSeaeEdi>();
entity.State = "已录入";
if (!string.IsNullOrEmpty(entity.CARRIERID))
{
entity.CARRIER = _cache.GetAllCodeCarrier().Result.Where(x => x.Code == entity.CARRIERID).Select(x => x.EdiCode).FirstOrDefault();
}
if (entity.CARGOID != "D")
{
entity.DCLASS = string.Empty;
entity.DUNNO = string.Empty;
}
await _seaeedi.InsertAsync(entity);
if (input.EdiCtn != null)
{
foreach (var item in input.EdiCtn)
{
var ctn = item.Adapt<BookingOrderSeaeEdiCtn>();
ctn.PId = entity.Id;
if (ctn.CTNALL.Length == 4)
{
ctn.SIZE = ctn.CTNALL != null ? ctn.CTNALL.Substring(0, 2) : "";
ctn.CTN = ctn.CTNALL != null ? ctn.CTNALL.Substring(2, 2) : "";
}
if (ctn.CTNALL.Contains("'"))
{
ctn.SIZE = ctn.CTNALL.Split("'")[0].ToString();
ctn.CTN = ctn.CTNALL.Split("'")[1].ToString();
}
await _seaeedictn.InsertAsync(ctn);
}
}
}
else
{
entity = _seaeedi.AsQueryable().First(x => x.Id == input.Id);
if (entity == null)
{
throw Oops.Bah("未找到业务数据");
}
if (entity.State != "已录入")
{
if (input.State != entity.State)
{
input.State = entity.State; //防止前端数据覆盖状态
}
if (input.HBLNO != entity.HBLNO)
{
throw Oops.Bah("已直发状态不能修改分单号");
}
}
//校验数据可修改后,赋值前端数据
input.Adapt(entity);
if (!string.IsNullOrEmpty(entity.CARRIERID))
{
entity.CARRIER = _cache.GetAllCodeCarrier().Result.Where(x => x.Code == entity.CARRIERID).Select(x => x.EdiCode).FirstOrDefault();
}
if (entity.CARGOID != "D")
{
entity.DCLASS = string.Empty;
entity.DUNNO = string.Empty;
}
await _seaeedi.AsUpdateable(entity).IgnoreColumns(it => new
{
it.MBLNO,
//it.HBLNO, //2023年9月4日原有直接忽略的逻辑有问题应该是直发之后不能改而不是录入状态就不能改分单号
it.BookingId,
it.TenantId,
it.CreatedTime,
it.CreatedUserId,
it.CreatedUserName,
it.IsDeleted
}).ExecuteCommandAsync();
await _seaeedictn.DeleteAsync(x => x.PId == input.Id);
if (input.EdiCtn != null)
{
foreach (var item in input.EdiCtn)
{
var ctn = item.Adapt<BookingOrderSeaeEdiCtn>();
ctn.PId = entity.Id;
if (ctn.CTNALL.Length == 4)
{
ctn.SIZE = ctn.CTNALL != null ? ctn.CTNALL.Substring(0, 2) : "";
ctn.CTN = ctn.CTNALL != null ? ctn.CTNALL.Substring(2, 2) : "";
}
if (ctn.CTNALL.Contains("'"))
{
ctn.SIZE = ctn.CTNALL.Split("'")[0].ToString();
ctn.CTN = ctn.CTNALL.Split("'")[1].ToString();
}
await _seaeedictn.InsertAsync(ctn);
}
}
}
var entities = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.Id == entity.Id).ToListAsync();
var list = entities.Adapt<List<BookingOrderSeaeEdiServiceDto>>();
foreach (var item in list)
{
var ctn = await _seaeedictn.AsQueryable().Filter(null, true).Where(x => x.PId == item.Id).ToListAsync();
item.EdiCtn = ctn.Adapt<List<BookingOrderSeaeEdiCtnDto>>();
}
return list;
}
/// <summary>
/// 删除舱单
/// </summary>
/// <param name="Ids"></param>
/// <returns></returns>
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrderSeaeEdi/Delete")]
public async Task Delete(string Ids)
{
var arr = Ids.Split(",");
if (arr.Count() > 0)
{
foreach (var ar in arr)
{
long Id = Convert.ToInt64(ar);
await _seaeedi.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdi { IsDeleted = true });
await _seaeedictn.UpdateAsync(x => x.PId == Id, x => new BookingOrderSeaeEdiCtn { IsDeleted = true });
_logger.LogInformation(Id + "删除成功!");
}
}
}
#region 舱单
/// <summary>
/// 舱单
/// </summary>
/// <returns></returns>
[HttpPost("/BookingOrderSeaeEdi/CustEDI")]
public async Task CustEDI(string Ids, string type, string SENDREMARK)
{
var arr = Ids.Split(",");
if (arr.Count() > 0)
{
List<CustEDIDto> custEDIDtos = new List<CustEDIDto>();
var key = _webAccountConfig.GetAccountConfig("DjyCangDan", UserManager.UserId).Result;
if (key == null)
{
throw Oops.Bah("当前用户未配置key,请联系管理员");
}
var dicUrl = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "request_emf");
foreach (var ar in arr)
{
long Id = Convert.ToInt64(ar);
var order = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.Id == Id).FirstAsync();
var ctns = await _seaeedictn.AsQueryable().Filter(null, true).Where(x => x.PId == order.Id).ToListAsync();
//船公司
if (string.IsNullOrEmpty(order.CARRIER))
{
throw Oops.Bah(BookingErrorCode.BOOK118);
}
//提单号不能为空
if (string.IsNullOrEmpty(order.MBLNO))
{
throw Oops.Bah(BookingErrorCode.BOOK127);
}
MDATA mDATA = new MDATA();
List<CTNDATAItem> CTNDATA = new List<CTNDATAItem>();
mDATA = order.Adapt<MDATA>();
if (string.IsNullOrEmpty(mDATA.FORWARDER))
{
throw Oops.Bah("船代不能为空");
}
if (string.IsNullOrEmpty(mDATA.YARDID))
{
throw Oops.Bah("场站不能为空");
}
mDATA.SENDREMARK = SENDREMARK;
var FORWARDER = mDATA.FORWARDER;
var YardCode = mDATA.YARDID;
if (_cache.GetAllMappingForwarder().Result.Where(x => x.Code == FORWARDER && x.Module == "cangdan").Select(x => x.MapCode).FirstOrDefault() == null)
{
throw Oops.Bah("暂不支持此船代");
}
mDATA.FORWARDER =
_cache.GetAllMappingForwarder().Result.Where(x => x.Code == FORWARDER && x.Module == "cangdan").Select(x => x.MapCode).FirstOrDefault();
mDATA.YARDID = _cache.GetAllMappingYard().Result.Where(x => x.Code == YardCode && x.Module == "cangdan").Select(x => x.MapCode).FirstOrDefault();
CTNDATA = ctns.Adapt<List<CTNDATAItem>>();
foreach (var item in CTNDATA)
{
item.KINDPKGS = _cache.GetAllCodePackage().Result.Where(x => x.Name == item.KINDPKGS).Select(x => x.EdiCode).FirstOrDefault();
}
custEDIDtos.Add(
new CustEDIDto
{
MDATA = mDATA,
CTNDATA = CTNDATA
}
);
}
string strPostObj = custEDIDtos.ToJsonString();
var sendObj = new
{
ac = "emf",
uid = UserManager.DjyUserId,
skey = key.Password,
optype = type,
data = strPostObj
};
_logger.LogInformation($"调用舱单接口 {dicUrl.Value} 传递数据:{strPostObj}");
var strResp = await dicUrl.Value.SetContentType("multipart/form-data").SetBody(sendObj).PostAsStringAsync();
_logger.LogInformation($"调用舱单接口返回:{strResp}");
var jobjResp = JObject.Parse(strResp);
bool respCode = jobjResp.GetBooleanValue("Success");
if (respCode == false)
{
throw Oops.Bah(jobjResp.GetStringValue("Message").Replace("<br />", "\r\n").Replace("<br/>", ""));
}
foreach (var ar in arr)
{
long Id = Convert.ToInt64(ar);
var order = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.Id == Id).FirstAsync();
//货运动态
var bsl = new BookingStatusLog();
bsl.BookingId = order.BookingId;
if (type == "3")
{
bsl.Status = $"保存舱单";
}
if (type == "0")
{
bsl.Status = $"直发舱单";
}
if (type == "1")
{
bsl.Status = $"修改舱单";
}
if (type == "2")
{
bsl.Status = $"删除舱单";
}
if (type == "4")
{
bsl.Status = $"作废舱单";
}
bsl.OpTime = DateTime.Now;
bsl.Category = "ship";
bsl.MBLNO = order.MBLNO;
await _repStatuslog.InsertAsync(bsl);
if (type == "3")
{
await _seaeedi.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdi { State = "已发送", SENDREMARK = SENDREMARK });
}
if (type == "0" || type == "1")
{
await _seaeedi.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdi { State = "已直发", SENDREMARK = SENDREMARK });
if (string.IsNullOrEmpty(order.HBLNO))
{
await _rep.SetGoodsStatus("YFCD", order.BookingId);
await _rep.SendBookingOrder(new long[] { order.BookingId });
}
}
if (type == "2")
{
await _seaeedi.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdi { State = "已删除", SENDREMARK = SENDREMARK });
}
if (type == "4")
{
await _seaeedi.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdi { State = "已作废", SENDREMARK = SENDREMARK });
}
}
}
}
#endregion
#region 模板
/// <summary>
/// 获取模板数据
/// </summary>
/// <returns></returns>
[HttpGet("/BookingOrderSeaeEdi/GetBookingOrderSeaeEdiTemplateList")]
public async Task<List<BookingOrderSeaeEdiTemplateDto>> GetBookingOrderSeaeEdiTemplateList(string type, string templatename = null)
{
var entities = await _repTemplate.AsQueryable().Where(x => x.Type == type).
WhereIF(!string.IsNullOrEmpty(templatename), x => x.TemplateName.Contains(templatename)).
ToListAsync();
var list = entities.Adapt<List<BookingOrderSeaeEdiTemplateDto>>();
return list;
}
/// <summary>
/// 保存信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/BookingOrderSeaeEdi/SaveBookingOrderSeaeEdiTemplate")]
public async Task SaveBookingOrderSeaeEdiTemplate(BookingOrderSeaeEdiTemplateDto input)
{
if (input == null)
{
throw Oops.Bah("请传入正常数据!");
}
if (!string.IsNullOrWhiteSpace(input.TemplateNAME))
{
var et = await _repTemplate.Where(x => x.TemplateName == input.TemplateNAME && x.Id != input.Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前模板名称已存在,请勿重复录入!");
}
}
var entity = input.Adapt<BookingOrderSeaeEdiTemplate>();
if (input.Id == 0)
{
await _repTemplate.InsertAsync(entity);
}
else
{
await _repTemplate.AsUpdateable(entity).IgnoreColumns(it => new
{
it.TenantId,
it.CreatedTime,
it.CreatedUserId,
it.CreatedUserName,
it.IsDeleted
}).ExecuteCommandAsync();
}
}
/// <summary>
/// 删除舱单
/// </summary>
/// <param name="Ids"></param>
/// <returns></returns>
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrderSeaeEdi/DeleteBookingOrderSeaeEdiTemplate")]
public async Task DeleteBookingOrderSeaeEdiTemplate(string Ids)
{
var arr = Ids.Split(",");
if (arr.Count() > 0)
{
foreach (var ar in arr)
{
long Id = Convert.ToInt64(ar);
await _repTemplate.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdiTemplate { IsDeleted = true });
}
}
}
#endregion
}
}