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.DataSync.Dto; namespace Myshipping.Application { /// /// 数据同步服务 /// [ApiDescriptionSettings("Application", Name = "DataSync", Order = 1), AllowAnonymous] public class DataSyncService : IDynamicApiController, ITransient { private readonly ILogger _logger; private readonly ISysCacheService _cache; private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _repCtn; private readonly SqlSugarRepository _ctndetailrep; private readonly SqlSugarRepository _repUser; private readonly SqlSugarRepository _repTenant; private readonly SqlSugarRepository _djycustomer; private readonly SqlSugarRepository _djycustomercontact; private readonly SqlSugarRepository _vesselinfo; private readonly SqlSugarRepository _bookingEDIExt; private readonly SqlSugarRepository _bookinglog; private readonly SqlSugarRepository _bookinglogdetail; public DataSyncService(ILogger logger, ISysCacheService cache, SqlSugarRepository rep, SqlSugarRepository repCtn, SqlSugarRepository repUser, SqlSugarRepository repTenant, SqlSugarRepository djycustomer, SqlSugarRepository djycustomercontact, SqlSugarRepository vesselinfo, SqlSugarRepository ctndetailrep , SqlSugarRepository bookingEDIExt, SqlSugarRepository bookinglog, SqlSugarRepository bookinglogdetail) { this._logger = logger; this._rep = rep; this._repCtn = repCtn; this._cache = cache; this._repUser = repUser; this._repTenant = repTenant; this._djycustomer = djycustomer; this._djycustomercontact = djycustomercontact; this._vesselinfo = vesselinfo; this._ctndetailrep = ctndetailrep; this._bookingEDIExt = bookingEDIExt; this._bookinglog = bookinglog; this._bookinglogdetail = bookinglogdetail; } #region 上传数据 /// /// 同步客户 /// /// 参数 /// [HttpPost("/DataSync/SyncCustomer"), ApiUser(ApiCode = "SyncCustomer")] public async Task SyncCustomer(DjyCustomerSyncDto model) { if (string.IsNullOrWhiteSpace(model.ShortName)) { throw Oops.Bah("简称未录入"); } var m = await _djycustomer.AsQueryable().Filter(null, true).Where(x => x.ShortName == model.ShortName).FirstAsync(); var entity = model.Adapt(); if (m == null) { await _djycustomer.InsertAsync(entity); foreach (var item in model.ContactList) { var contact = item.Adapt(); contact.CustomerId = entity.Id; await _djycustomercontact.InsertAsync(contact); } } else { entity.Id = m.Id; await _djycustomer.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); await _djycustomercontact.DeleteAsync(x => x.CustomerId == entity.Id); foreach (var item in model.ContactList) { var contact = item.Adapt(); contact.CustomerId = entity.Id; await _djycustomercontact.InsertAsync(contact); } } return entity.Id; } /// /// 同步船期 /// /// /// [HttpPost("/DataSync/SyncVesselDate"), ApiUser(ApiCode = "SyncVesselDate")] public async Task SyncVesselDate(DjyVesselInfoDto model) { if (string.IsNullOrWhiteSpace(model.BSNO)) { throw Oops.Bah("BSNO未录入"); } var m = await _vesselinfo.AsQueryable().Filter(null, true).Where(x => x.BSNO == model.BSNO).FirstAsync(); var entity = model.Adapt(); entity.Vessel = model.Vessel.ToUpper().Trim(); if (m == null) { await _vesselinfo.InsertAsync(entity); } else { entity.Id = m.Id; await _vesselinfo.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } return entity.Id; } /// /// 同步订舱 /// /// /// [SqlSugarUnitOfWork] [HttpPost("/DataSync/SyncBooking"), ApiUser(ApiCode = "SyncBooking")] public async Task SyncBooking(SyncBookingOrderDto model) { if (string.IsNullOrWhiteSpace(model.BSNO)) { throw Oops.Bah("主单BSNO未录入"); } if (string.IsNullOrWhiteSpace(model.CreatedUserName)) { throw Oops.Bah("未录入创建人"); } var userlist = _repUser.AsQueryable().Filter(null, true).ToListAsync(); var user = _repUser.AsQueryable().Filter(null, true).Where(x => x.Name == model.CreatedUserName.Trim()).FirstAsync(); if (user.Result== null) { throw Oops.Bah("未匹配到创建人"); } var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.BSNO == model.BSNO).FirstAsync(); if (order == null) { #region 新增 if (string.IsNullOrWhiteSpace(model.MBLNO)) { throw Oops.Bah("请填写提单号!"); } JsonUtil.PropToUpper(model, "ORDNO", "BSSTATUS", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); JsonUtil.TrimFields(model); if (model.ctnInputs != null) { var groupList = model.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); model.CNTRTOTAL = string.Join(" / ", groupList); } var et = await _rep.Where(x => x.MBLNO == model.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == model.HBLNO && x.ParentId == 0).FirstAsync(); if (et != null) { throw Oops.Bah("当前提单号已存在,请勿重复录入!"); } var entity = model.Adapt(); entity.CreatedUserId = user.Result.Id; entity.CreatedUserName = user.Result.Name; entity.CreatedTime = DateTime.Now; await _rep.InsertAsync(entity); if (model.ctnInputs != null) { foreach (var item in model.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = entity.Id; await _repCtn.InsertAsync(ctnentity); //这里保存有可能没有添加多品名,所有箱下没有货物信息 if (item.ctnDetailInputs != null) { foreach (var it in item.ctnDetailInputs) { var ctndetail = it.Adapt(); ctndetail.CTNID = ctnentity.Id; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (model.BookingEDIExt != null) { //写入EDI扩展 var ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = entity.Id; ediExtEntity.CreatedUserId = user.Result.Id; ediExtEntity.CreatedUserName = user.Result.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } ////添加booking日志 await _bookinglog.InsertAsync(new BookingLog { Type = "Add", BookingId = entity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Result.Id, CreatedUserName = "系统" }); //分单 if (model.childrens != null) { foreach (var item in model.childrens) { if (string.IsNullOrWhiteSpace(item.MBLNO)) { throw Oops.Bah("请填写提单号!"); } if (string.IsNullOrWhiteSpace(item.HBLNO)) { throw Oops.Bah("请填写分提单号!"); } JsonUtil.PropToUpper(item, "ORDNO", "BSSTATUS", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); JsonUtil.TrimFields(item); if (model.ctnInputs != null) { var groupList = item.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); item.CNTRTOTAL = string.Join(" / ", groupList); } var fdet = await _rep.Where(x => x.MBLNO == model.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == model.HBLNO && x.ParentId == entity.Id).FirstAsync(); if (fdet != null) { throw Oops.Bah($"当前分单中提单号({item.MBLNO}_{item.HBLNO})已存在,请勿重复录入!"); } var fdentity = item.Adapt(); fdentity.CreatedUserId = user.Result.Id; fdentity.CreatedUserName = user.Result.Name; fdentity.CreatedTime = DateTime.Now; fdentity.ParentId = entity.Id; await _rep.InsertAsync(fdentity); if (item.ctnInputs != null) { foreach (var it in item.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = fdentity.Id; await _repCtn.InsertAsync(ctnentity); //这里保存有可能没有添加多品名,所有箱下没有货物信息 if (it.ctnDetailInputs != null) { foreach (var dit in it.ctnDetailInputs) { var ctndetail = dit.Adapt(); ctndetail.CTNID = ctnentity.Id; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (item.BookingEDIExt != null) { //写入EDI扩展 var ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = fdentity.Id; ediExtEntity.CreatedUserId = user.Result.Id; ediExtEntity.CreatedUserName = user.Result.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } ////添加booking日志 await _bookinglog.InsertAsync(new BookingLog { Type = "Add", BookingId = fdentity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Result.Id, CreatedUserName = "系统" }); } } return entity.Id; #endregion } else { #region 编辑 if (string.IsNullOrWhiteSpace(model.MBLNO)) { throw Oops.Bah("请填写提单号!"); } JsonUtil.PropToUpper(model, "ORDNO", "BSSTATUS", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); JsonUtil.TrimFields(model); if (model.ctnInputs != null) { var groupList = model.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); model.CNTRTOTAL = string.Join(" / ", groupList); } var main = await _rep.AsQueryable().Filter(null, true).Where(x => x.BSNO == model.BSNO).FirstAsync(); var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.MBLNO == model.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == model.HBLNO && x.BSNO != model.BSNO).FirstAsync(); if (et != null) { throw Oops.Bah("当前提单号已存在,请勿重复录入!"); } var entity = model.Adapt(); entity.Id = main.Id; entity.UpdatedUserName = user.Result.Name; entity.UpdatedUserId = user.Result.Id; entity.UpdatedTime = DateTime.Now; await _rep.AsUpdateable(entity).IgnoreColumns(it => new { it.ParentId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); var ctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == main.Id).Select(x => x.Id).ToListAsync(); await _repCtn.DeleteAsync(x => x.BILLID == main.Id); await _ctndetailrep.DeleteAsync(x => ctnlist.Contains((long)x.CTNID)); if (model.ctnInputs != null) { foreach (var item in model.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = main.Id; await _repCtn.InsertAsync(ctnentity); if (item.ctnDetailInputs != null) { foreach (var it in item.ctnDetailInputs) { var ctndetail = it.Adapt(); ctndetail.CTNID = ctnentity.Id; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (model.BookingEDIExt != null) { //检索EDI扩展 var ediExtEntity = _bookingEDIExt.FirstOrDefault(u => u.BookingId == main.Id); if (ediExtEntity == null) { //写入EDI扩展 ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = main.Id; ediExtEntity.CreatedUserId = user.Result.Id; ediExtEntity.CreatedUserName = user.Result.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } else { //更新EDI扩展 var currEdiExtEntity = model.BookingEDIExt.Adapt(); currEdiExtEntity.Id = ediExtEntity.Id; await _bookingEDIExt.AsUpdateable(currEdiExtEntity).IgnoreColumns(it => new { it.BookingId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } } bool flag = true; long bid = 0; foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(entity)) { string name = descriptor.Name; if (name == "TenantId" || name == "CreatedTime" || name == "UpdatedTime" || name == "CreatedUserId" || name == "CreatedUserName") { continue; } object value = descriptor.GetValue(entity); var oldvalue = main.GetType().GetProperty(name).GetValue(main, null); if (name == "KGS" || name == "CBM") { if (Convert.ToDecimal(value) == Convert.ToDecimal(oldvalue)) { continue; } } string _oldvalue = oldvalue != null ? oldvalue.ToString() : ""; string _value = value != null ? value.ToString() : ""; if (_oldvalue != _value && !string.IsNullOrWhiteSpace(descriptor.Description)) { if (flag) { ////添加booking日志 bid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog { Type = "Edit", BookingId = entity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Result.Id, CreatedUserName = user.Result.Name }); flag = false; } await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail { PId = bid, Field = descriptor.Description, OldValue = _oldvalue, NewValue = _value, }); } } //分单 if (model.childrens != null) { foreach (var item in model.childrens) { if (string.IsNullOrWhiteSpace(item.MBLNO)) { throw Oops.Bah("请填写提单号!"); } JsonUtil.PropToUpper(item, "ORDNO", "BSSTATUS", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); JsonUtil.TrimFields(item); if (item.ctnInputs != null) { var groupList = item.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); item.CNTRTOTAL = string.Join(" / ", groupList); } var fdmain = await _rep.AsQueryable().Filter(null, true).Where(x => x.BSNO == item.BSNO).FirstAsync(); var fdet = await _rep.Where(x => x.MBLNO == item.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == item.HBLNO && x.BSNO != fdmain.BSNO).FirstAsync(); if (fdet != null) { throw Oops.Bah($"当前提单号{fdet.MBLNO}_{fdet.HBLNO}已存在,请勿重复录入!"); } var fdentity = model.Adapt(); fdentity.Id = fdmain.Id; fdentity.UpdatedUserName = user.Result.Name; fdentity.UpdatedUserId = user.Result.Id; fdentity.UpdatedTime = DateTime.Now; await _rep.AsUpdateable(fdentity).IgnoreColumns(it => new { it.ParentId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); var fdctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == fdmain.Id).Select(x => x.Id).ToListAsync(); await _repCtn.DeleteAsync(x => x.BILLID == fdmain.Id); await _ctndetailrep.DeleteAsync(x => fdctnlist.Contains((long)x.CTNID)); if (item.ctnInputs != null) { foreach (var it in model.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = fdmain.Id; await _repCtn.InsertAsync(ctnentity); if (it.ctnDetailInputs != null) { foreach (var it_ in it.ctnDetailInputs) { var ctndetail = it_.Adapt(); ctndetail.CTNID = ctnentity.Id; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (item.BookingEDIExt != null) { //检索EDI扩展 var ediExtEntity = _bookingEDIExt.FirstOrDefault(u => u.BookingId == fdmain.Id); if (ediExtEntity == null) { //写入EDI扩展 ediExtEntity = item.BookingEDIExt.Adapt(); ediExtEntity.BookingId = fdmain.Id; ediExtEntity.CreatedUserId = user.Result.Id; ediExtEntity.CreatedUserName = user.Result.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } else { //更新EDI扩展 var currEdiExtEntity = model.BookingEDIExt.Adapt(); currEdiExtEntity.Id = ediExtEntity.Id; await _bookingEDIExt.AsUpdateable(currEdiExtEntity).IgnoreColumns(it => new { it.BookingId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } } bool fdflag = true; long fdbid = 0; foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(fdentity)) { string name = descriptor.Name; if (name == "TenantId" || name == "CreatedTime" || name == "UpdatedTime" || name == "CreatedUserId" || name == "CreatedUserName") { continue; } object value = descriptor.GetValue(fdentity); var oldvalue = fdmain.GetType().GetProperty(name).GetValue(main, null); if (name == "KGS" || name == "CBM") { if (Convert.ToDecimal(value) == Convert.ToDecimal(oldvalue)) { continue; } } string _oldvalue = oldvalue != null ? oldvalue.ToString() : ""; string _value = value != null ? value.ToString() : ""; if (_oldvalue != _value && !string.IsNullOrWhiteSpace(descriptor.Description)) { if (fdflag) { ////添加booking日志 fdbid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog { Type = "Edit", BookingId = fdentity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Result.Id, CreatedUserName = user.Result.Name, }); fdflag = false; } await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail { PId = fdbid, Field = descriptor.Description, OldValue = _oldvalue, NewValue = _value, }); } } } } return main.Id; #endregion } } #endregion #region 下载数据 #endregion #region 其他 /// /// 测试用 /// /// [HttpGet("/DataSync/Test"), ApiUser(ApiCode = "Test")] public async Task Test() { return $"当前用户:{UserManager.UserId} {UserManager.Name} ,当前租户:{UserManager.TENANT_ID} {UserManager.TENANT_NAME},管理员类型:{(UserManager.IsSuperAdmin ? "超级管理员" : (UserManager.IsTenantAdmin ? "租户管理员" : "普通用户"))}"; } #endregion } }