using Furion.DynamicApiController; using Furion.FriendlyException; using Furion.Templates; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Myshipping.Application.Entity; using Myshipping.Application.Helper; using Myshipping.Application.Service.BookingOrder.Dto; using Myshipping.Core; using Myshipping.Core.Entity; using NPOI.OpenXmlFormats.Wordprocessing; using NPOI.SS.Formula.Functions; using NPOI.XWPF.UserModel; using Org.BouncyCastle.Crypto; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Myshipping.Application { /// /// 订舱业务参数 /// [ApiDescriptionSettings("Application", Name = "Para", Order = 10)] public class ParaService : IParaService, IDynamicApiController { private readonly SqlSugarRepository _paraGoodsInfoRepository; private readonly SqlSugarRepository _paraGoodsCategoryInfoRepository; private readonly SqlSugarRepository _paraContractNoInfoRepository; private readonly ILogger _logger; public ParaService(SqlSugarRepository paraGoodsInfoRepository, SqlSugarRepository paraGoodsCategoryInfoRepository, SqlSugarRepository paraContractNoInfoRepository, ILogger logger ) { _paraGoodsInfoRepository = paraGoodsInfoRepository; _paraGoodsCategoryInfoRepository = paraGoodsCategoryInfoRepository; _paraContractNoInfoRepository = paraContractNoInfoRepository; _logger = logger; } /// /// 保存品名参数 /// /// 品名参数 /// 返回回执 [HttpPost("/Para/SaveParaGoodsInfo")] public async Task SaveParaGoodsInfo(ParaGoodsDto model) { ParaGoodsInfo info = null; try { //判断代码不能重复 var sameList = _paraGoodsInfoRepository.AsQueryable() .Where(t => t.GOODS_CODE.Equals(model.GoodsCode, StringComparison.OrdinalIgnoreCase)).ToList(); if(sameList.Count > 0 && !string.IsNullOrWhiteSpace(model.Id) && sameList.Any(t=>t.Id != long.Parse(model.Id))) throw Oops.Oh($"商品编码【{model.GoodsCode}】已存在不能重复保存"); //如果填写了品名分配需要确认根据库中数据一致 if (!string.IsNullOrWhiteSpace(model.GoodsCategory)) { var categoryInfo = _paraGoodsCategoryInfoRepository.AsQueryable().First(t => t.GOODS_CATEGORY.Equals(model.GoodsCategory.Trim())); if (categoryInfo == null) throw Oops.Oh($"品名分类代码【{model.GoodsCategory}】不存在,请确认品名分类"); if (!string.IsNullOrWhiteSpace(model.GoodsCategoryName) && !categoryInfo.GOODS_CATEGORY_NAME.Equals(model.GoodsCategoryName.Trim())) throw Oops.Oh($"品名分类名称【{model.GoodsCategoryName}】错误,code={model.GoodsCategory}请确认品名分类"); } if (!string.IsNullOrWhiteSpace(model.Id)) { info = await _paraGoodsInfoRepository.AsQueryable().FirstAsync(t => t.Id == long.Parse(model.Id)); if(info == null) throw Oops.Oh($"品名信息获取失败,请确认{model.Id}对应记录是否存在"); info.GOODS_CODE = model.GoodsCode; info.GOODS_NAME_CN = model.GoodsNameCN; info.GOODS_NAME_EN = model.GoodsNameEN; info.GOODS_DESP = model.GoodsDesp; info.GOODS_CATEGORY = model.GoodsCategory; info.GOODS_CATEGORY_NAME = model.GoodsCategoryName; await _paraGoodsInfoRepository.AsUpdateable(info).IgnoreColumns(it => new { it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } else { info = model.Adapt(); await _paraGoodsInfoRepository.InsertAsync(info); } } catch (Exception ex) { throw Oops.Bah($"保存品名参数异常,{ex.Message}"); } return info.Id; } /// /// 作废品名参数 /// /// 品名参数主键数组 /// 返回回执 [HttpPost("/Para/DeleteParaGoodsInfo")] public async Task DeleteParaGoodsInfo([FromBody] long[] Ids) { try { //如果没有给主键直接抛异常 if (Ids.Length == 0) throw Oops.Oh("没有提供需要作废的主键信息"); var list = _paraGoodsInfoRepository.AsQueryable().Where(t => Ids.Contains(t.Id)).ToList(); if (list.Count != Ids.Length) { var noRecord = string.Join(",", Ids.GroupJoin(list, l => l, r => r.Id, (l, r) => { var currList = r.ToList(); if (r.Count() > 0) return string.Empty; return l.ToString(); }).Where(t => !string.IsNullOrWhiteSpace(t)).ToArray()); throw Oops.Oh($"以下主键信息 {noRecord} 检索失败或者已作废过"); } list.ForEach(async entity => { entity.IsDeleted = true; entity.UpdatedTime = DateTime.Now; entity.UpdatedUserId = UserManager.UserId; entity.UpdatedUserName = UserManager.Name; await _paraGoodsInfoRepository.AsUpdateable(entity).IgnoreColumns(it => new { it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); }); } catch (Exception ex) { throw Oops.Bah($"作废品名参数异常,{ex.Message}"); } return "作废成功"; } /// /// 主键获取品名参数 /// /// 品名主键 /// 返回回执 [HttpGet("/Para/GetParaGoodsInfo")] public async Task GetParaGoodsInfo([FromQuery]long Id) { ParaGoodsShowDto model = null; try { ParaGoodsInfo info = _paraGoodsInfoRepository.AsQueryable().First(t => t.Id == Id); if(info == null) throw Oops.Oh($"获取品名参数失败"); model = info.Adapt(); } catch (Exception ex) { throw Oops.Bah($"获取品名参数异常,{ex.Message}"); } return model; } /// /// 检索品名参数 /// /// 检索值 /// 默认最大行数 /// 返回回执 [HttpGet("/Para/QueryParaGoodsInfo")] public async Task> QueryParaGoodsInfo([FromQuery] string queryItem, [FromQuery] int top = 10) { List list = new List(); try { var query = _paraGoodsInfoRepository.AsQueryable(); if (!string.IsNullOrWhiteSpace(queryItem)) { query = query.Where(t => t.GOODS_CODE.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.GOODS_NAME_CN.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.GOODS_NAME_EN.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.GOODS_DESP.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.GOODS_CATEGORY.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.GOODS_CATEGORY_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) ); } query = query.OrderBy("GOODS_CODE asc"); var goodsList = await query.Take(top).ToListAsync(); if (goodsList.Count > 0) list = goodsList.Select(t => t.Adapt()).ToList(); } catch (Exception ex) { throw Oops.Bah($"保存品名参数异常,{ex.Message}"); } return list; } /// /// 品名参数台账查询 /// /// 品名参数台账查询请求 /// 返回结果 [HttpPost("/Para/GetParaGoodsPage")] public async Task GetParaGoodsPageAsync(QueryParaGoodsDto QuerySearch) { DateTime createBegin = DateTime.MinValue; DateTime createEnd = DateTime.MinValue; DateTime updateBegin = DateTime.MinValue; DateTime updateEnd = DateTime.MinValue; if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeBegin)) { if (!DateTime.TryParse(QuerySearch.CreateTimeBegin, out createBegin)) throw Oops.Oh($"创建开始日期格式错误,{QuerySearch.CreateTimeBegin}"); } if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeEnd)) { if (!DateTime.TryParse(QuerySearch.CreateTimeEnd, out createEnd)) throw Oops.Oh($"创建结束日期格式错误,{QuerySearch.CreateTimeEnd}"); createEnd = createEnd.AddDays(1); } if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeBegin)) { if (!DateTime.TryParse(QuerySearch.UpdateTimeBegin, out updateBegin)) throw Oops.Oh($"更新起始日期格式错误,{QuerySearch.UpdateTimeBegin}"); } if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeEnd)) { if (!DateTime.TryParse(QuerySearch.UpdateTimeEnd, out updateEnd)) throw Oops.Oh($"更新结束日期格式错误,{QuerySearch.UpdateTimeEnd}"); updateEnd = updateEnd.AddDays(1); } string entityOrderCol = "CreatedTime"; //这里因为返回给前端的台账数据是DTO,所以这里排序时候需要转换成Entity对应的字段 if (!string.IsNullOrWhiteSpace(QuerySearch.SortField)) entityOrderCol = MapsterExtHelper.GetAdaptProperty(QuerySearch.SortField); var entities = await _paraGoodsInfoRepository.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCode), t => t.GOODS_CODE.Contains(QuerySearch.GoodsCode.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsNameCN), t => t.GOODS_NAME_CN.Contains(QuerySearch.GoodsNameCN.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(createBegin != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value >= createBegin) .WhereIF(createEnd != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value < createEnd) .WhereIF(updateBegin != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value >= updateBegin) .WhereIF(updateEnd != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value < updateEnd) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsDesp), t => t.GOODS_DESP.Contains(QuerySearch.GoodsDesp.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsNameEN), t => t.GOODS_NAME_EN.Contains(QuerySearch.GoodsNameEN.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCategory), t => t.GOODS_CATEGORY.Equals(QuerySearch.GoodsCategory.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.CreatedUserName.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.UpdatedUserName.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc ")) .ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize); return entities.Adapt>(); } /// /// 保存品名分类参数 /// /// 品名分类参数 /// 返回回执 [HttpPost("/Para/SaveParaGoodsCategoryInfo")] public async Task SaveParaGoodsCategoryInfo(ParaGoodsCategoryDto model) { ParaGoodsCategoryInfo info = null; try { //判断代码不能重复 var sameList = _paraGoodsCategoryInfoRepository.AsQueryable() .Where(t => t.GOODS_CATEGORY.Equals(model.GoodsCategory, StringComparison.OrdinalIgnoreCase)).ToList(); if (sameList.Count > 0) { if (string.IsNullOrWhiteSpace(model.Id) || (!string.IsNullOrWhiteSpace(model.Id) && sameList.Any(t => t.Id != long.Parse(model.Id)))) { throw Oops.Oh($"商品分类代码【{model.GoodsCategory}】已存在不能重复保存"); } } if (!string.IsNullOrWhiteSpace(model.Id)) { info = await _paraGoodsCategoryInfoRepository.AsQueryable().FirstAsync(t => t.Id == long.Parse(model.Id)); if (info == null) throw Oops.Oh($"品名分类获取失败,请确认{model.Id}对应记录是否存在"); //如果填写了品名分配需要确认根据库中数据一致 if (!info.GOODS_CATEGORY.Equals(model.GoodsCategory, StringComparison.OrdinalIgnoreCase)) { var existsList = _paraGoodsCategoryInfoRepository.AsQueryable() .LeftJoin(_paraGoodsInfoRepository.AsQueryable(), (cate, goods) => cate.GOODS_CATEGORY == goods.GOODS_CATEGORY) .Where(cate => cate.Id == info.Id) .Select((cate, goods) => new { Cate = cate, Goods = goods }).ToList(); if (existsList.Any(t => t.Goods != null)) throw Oops.Oh($"原分类代码{info.GOODS_CATEGORY}已有对应品名参数,不能修改"); } info.GOODS_CATEGORY = model.GoodsCategory; info.GOODS_CATEGORY_NAME = model.GoodsCategoryName; await _paraGoodsCategoryInfoRepository.AsUpdateable(info).IgnoreColumns(it => new { it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } else { info = model.Adapt(); await _paraGoodsCategoryInfoRepository.InsertAsync(info); } } catch (Exception ex) { throw Oops.Bah($"保存品名分类参数异常,{ex.Message}"); } return info.Id; } /// /// 主键获取品名分类参数 /// /// 品名分类主键 /// 返回回执 [HttpGet("/Para/GetParaGoodsCategoryInfo")] public async Task GetParaGoodsCategoryInfo(long Id) { ParaGoodsCategoryShowDto model = null; try { ParaGoodsCategoryInfo info = _paraGoodsCategoryInfoRepository.AsQueryable().First(t => t.Id == Id); if (info == null) throw Oops.Oh($"获取品名分类参数失败"); model = info.Adapt(); } catch (Exception ex) { throw Oops.Bah($"获取品名分类参数异常,{ex.Message}"); } return model; } /// /// 检索品名分类参数 /// /// 检索值 /// 默认最大行数 /// 返回回执 [HttpGet("/Para/QueryParaGoodsCategoryInfo")] public async Task> QueryParaGoodsCategoryInfo([FromQuery] string queryItem, [FromQuery] int top = 10) { List list = new List(); try { var query = _paraGoodsCategoryInfoRepository.AsQueryable(); if (!string.IsNullOrWhiteSpace(queryItem)) { query = query.Where(t => t.GOODS_CATEGORY.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.GOODS_CATEGORY_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) ); } query = query.OrderBy("GOODS_CATEGORY asc"); var currList = await query.Take(top).ToListAsync(); if (currList.Count > 0) list = currList.Select(t => t.Adapt()).ToList(); } catch (Exception ex) { throw Oops.Bah($"保存品名参数异常,{ex.Message}"); } return list; } /// /// 作废品名分类参数 /// /// 品名分类参数主键数组 /// 返回回执 [HttpPost("/Para/DeleteParaGoodsCategoryInfo")] public async Task DeleteParaGoodsCategoryInfo(long[] Ids) { try { //如果没有给主键直接抛异常 if (Ids.Length == 0) throw Oops.Oh("没有提供需要作废的主键信息"); var list = _paraGoodsCategoryInfoRepository.AsQueryable().Where(t => Ids.Contains(t.Id)).ToList(); if (list.Count != Ids.Length) { var noRecord = string.Join(",", Ids.GroupJoin(list, l => l, r => r.Id, (l, r) => { var currList = r.ToList(); if (r.Count() > 0) return string.Empty; return l.ToString(); }).Where(t => !string.IsNullOrWhiteSpace(t)).ToArray()); throw Oops.Oh($"以下主键信息 {noRecord} 检索失败或者已作废过"); } //这里需要判断当前的品名分类是否已经对应到品名上,如果已有对应则不能直接作废 var existsList = _paraGoodsCategoryInfoRepository.EntityContext.Queryable() .InnerJoin((cate, goods) => cate.GOODS_CATEGORY == goods.GOODS_CATEGORY) .Where(cate => Ids.Contains(cate.Id)) .Select((cate, goods) => new { Cate = cate, Goods = goods }).ToList(); if(existsList.Count > 0) throw Oops.Oh($"以下分类代码已指定品名参数不能直接删除,{string.Join(",",existsList.Select(t=>t.Cate.GOODS_CATEGORY).Distinct().ToArray())}"); list.ForEach(async entity => { entity.IsDeleted = true; entity.UpdatedTime = DateTime.Now; entity.UpdatedUserId = UserManager.UserId; entity.UpdatedUserName = UserManager.Name; await _paraGoodsCategoryInfoRepository.AsUpdateable(entity).IgnoreColumns(it => new { it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); }); } catch (Exception ex) { throw Oops.Bah($"作废品名参数异常,{ex.Message}"); } return "作废成功"; } #region 品名分类参数台账查询 /// /// 品名分类参数台账查询 /// /// 品名分类参数台账查询请求 /// 返回结果 [HttpPost("/Para/GetParaGoodsCategoryPage")] public async Task GetParaGoodsCategoryPageAsync(QueryParaGoodsCategoryDto QuerySearch) { DateTime createBegin = DateTime.MinValue; DateTime createEnd = DateTime.MinValue; DateTime updateBegin = DateTime.MinValue; DateTime updateEnd = DateTime.MinValue; if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeBegin)) { if (!DateTime.TryParse(QuerySearch.CreateTimeBegin, out createBegin)) throw Oops.Oh($"创建开始日期格式错误,{QuerySearch.CreateTimeBegin}"); } if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeEnd)) { if (!DateTime.TryParse(QuerySearch.CreateTimeEnd, out createEnd)) throw Oops.Oh($"创建结束日期格式错误,{QuerySearch.CreateTimeEnd}"); createEnd = createEnd.AddDays(1); } if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeBegin)) { if (!DateTime.TryParse(QuerySearch.UpdateTimeBegin, out updateBegin)) throw Oops.Oh($"更新起始日期格式错误,{QuerySearch.UpdateTimeBegin}"); } if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeEnd)) { if (!DateTime.TryParse(QuerySearch.UpdateTimeEnd, out updateEnd)) throw Oops.Oh($"更新结束日期格式错误,{QuerySearch.UpdateTimeEnd}"); updateEnd = updateEnd.AddDays(1); } string entityOrderCol = "CreatedTime"; //这里因为返回给前端的台账数据是DTO,所以这里排序时候需要转换成Entity对应的字段 if (!string.IsNullOrWhiteSpace(QuerySearch.SortField)) entityOrderCol = MapsterExtHelper.GetAdaptProperty(QuerySearch.SortField); var entities = await _paraGoodsCategoryInfoRepository.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCategory), t => t.GOODS_CATEGORY.Contains(QuerySearch.GoodsCategory.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCategoryName), t => t.GOODS_CATEGORY_NAME.Contains(QuerySearch.GoodsCategoryName.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(createBegin != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value >= createBegin) .WhereIF(createEnd != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value < createEnd) .WhereIF(updateBegin != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value >= updateBegin) .WhereIF(updateEnd != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value < updateEnd) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.CreatedUserName.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.UpdatedUserName.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc ")) .ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize); return entities.Adapt>(); } #endregion #region 保存约号参数 /// /// 保存约号参数 /// /// 约号参数 /// 返回回执 [HttpPost("/Para/SaveParaContractNoInfo")] public async Task SaveParaContractNoInfo(ParaContractNoDto model) { ParaContractNoInfo info = null; try { ////判断代码不能重复 //var sameList = _paraContractNoInfoRepository.AsQueryable() // .Where(t => t.CONTRACT_NO.Equals(model.ContractNo, StringComparison.OrdinalIgnoreCase)).ToList(); //if (sameList.Count > 0) //{ // if (string.IsNullOrWhiteSpace(model.Id) || (!string.IsNullOrWhiteSpace(model.Id) && sameList.Any(t => t.Id != long.Parse(model.Id)))) // { // throw Oops.Oh($"合约号编号【{model.ContractNo}】已存在不能重复保存"); // } //} if (!string.IsNullOrWhiteSpace(model.Id)) { info = await _paraContractNoInfoRepository.AsQueryable().FirstAsync(t => t.Id == long.Parse(model.Id)); if (info == null) throw Oops.Oh($"约号获取失败,请确认{model.Id}对应记录是否存在"); info.CONTRACT_NO = model.ContractNo?.Trim(); info.CONTRACT_NAME = model.ContractName?.Trim(); info.CONTRACT_NOTE = model.ContractNote?.Trim(); info.LANE_CODE = model.LaneCode?.Trim(); info.LANE_CNAME = model.LaneCName?.Trim(); info.POD_CODE = model.PODCode?.Trim(); info.CARRIER_CODE = model.CarrierCode?.Trim(); info.CONTRACT_PARTY_CODE = model.ContractPartyCode?.Trim(); info.CONTRACT_PARTY_NAME = model.ContractPartyName?.Trim(); info.CONTRACT_LINK_NAME = model.ContractLinkName?.Trim(); info.CONTRACT_LINK_EMAIL = model.ContractLinkEmail?.Trim(); info.IS_OUR_OWN_PRICE = model.IsOurOwnPrice; await _paraContractNoInfoRepository.AsUpdateable(info).IgnoreColumns(it => new { it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } else { info = model.Adapt(); await _paraContractNoInfoRepository.InsertAsync(info); } } catch (Exception ex) { throw Oops.Bah($"保存约号参数异常,{ex.Message}"); } return info.Id; } #endregion #region 主键获取约号参数 /// /// 主键获取约号参数 /// /// 约号主键 /// 返回回执 [HttpGet("/Para/GetParaContractNoInfo")] public async Task GetParaContractNoInfo(long Id) { ParaContractNoShowDto model = null; try { ParaContractNoInfo info = _paraContractNoInfoRepository.AsQueryable().First(t => t.Id == Id); if (info == null) throw Oops.Oh($"获取约号参数失败"); model = info.Adapt(); } catch (Exception ex) { throw Oops.Bah($"获取约号参数异常,{ex.Message}"); } return model; } #endregion #region 检索约号参数 /// /// 检索约号参数 /// /// 检索值 /// 默认最大行数 /// 船公司代码 /// 航线代码 /// 航线中文 /// 目的港代码 /// 返回回执 [HttpGet("/Para/QuerytParaContractNoInfo")] public async Task> QuerytParaContractNoInfo([FromQuery] string queryItem, [FromQuery] int top = 10, [FromQuery] string carrier = "", [FromQuery] string lane = "", [FromQuery] string lanecname = "", [FromQuery] string pod = "") { List list = new List(); try { var query = _paraContractNoInfoRepository.AsQueryable(); if (!string.IsNullOrWhiteSpace(queryItem)) { query = query.Where(t => t.CONTRACT_NO.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.CONTRACT_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.CONTRACT_NOTE.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase)|| t.CONTRACT_PARTY_CODE.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.CONTRACT_PARTY_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.CONTRACT_LINK_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || t.CONTRACT_LINK_EMAIL.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) ); } if (!string.IsNullOrWhiteSpace(carrier)) { query = query.Where(t => t.CARRIER_CODE.Equals(carrier)); } //else //{ // throw Oops.Bah($"检索约号失败,船公司不能为空"); //} if (!string.IsNullOrWhiteSpace(lane)) { query = query.Where(t => string.IsNullOrWhiteSpace(t.LANE_CODE) || t.LANE_CODE.Contains(lane)); } if (!string.IsNullOrWhiteSpace(lanecname)) { query = query.Where(t => string.IsNullOrWhiteSpace(t.LANE_CNAME) || t.LANE_CNAME.Contains(lanecname)); } if (!string.IsNullOrWhiteSpace(pod)) { query = query.Where(t => string.IsNullOrWhiteSpace(t.POD_CODE) || t.POD_CODE.Contains(pod)); } query = query.OrderBy("CONTRACT_NO asc"); var currList = await query.Take(top).ToListAsync(); if (currList.Count > 0) list = currList.Select(t => t.Adapt()).ToList(); } catch (Exception ex) { throw Oops.Bah($"检索约号参数异常,{ex.Message}"); } return list; } #endregion #region 作废约号参数 /// /// 作废约号参数 /// /// 约号参数主键数组 /// 返回回执 [HttpPost("/Para/DeleteParaContractNoInfo")] public async Task DeleteParaContractNoInfo(long[] Ids) { try { //如果没有给主键直接抛异常 if (Ids.Length == 0) throw Oops.Oh("没有提供需要作废的主键信息"); var list = _paraContractNoInfoRepository.AsQueryable().Where(t => Ids.Contains(t.Id)).ToList(); if (list.Count != Ids.Length) { var noRecord = string.Join(",", Ids.GroupJoin(list, l => l, r => r.Id, (l, r) => { var currList = r.ToList(); if (r.Count() > 0) return string.Empty; return l.ToString(); }).Where(t => !string.IsNullOrWhiteSpace(t)).ToArray()); throw Oops.Oh($"以下主键信息 {noRecord} 检索失败或者已作废过"); } list.ForEach(async entity => { entity.IsDeleted = true; entity.UpdatedTime = DateTime.Now; entity.UpdatedUserId = UserManager.UserId; entity.UpdatedUserName = UserManager.Name; await _paraContractNoInfoRepository.AsUpdateable(entity).IgnoreColumns(it => new { it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); }); } catch (Exception ex) { throw Oops.Bah($"作废约号参数异常,{ex.Message}"); } return "作废成功"; } #endregion #region 约号参数台账查询 /// /// 约号参数台账查询 /// /// 约号参数台账查询请求 /// 返回结果 [HttpPost("/Para/GetParaContractNoPage")] public async Task GetParaContractNoPageAsync(QueryParaContractNoDto QuerySearch) { DateTime createBegin = DateTime.MinValue; DateTime createEnd = DateTime.MinValue; DateTime updateBegin = DateTime.MinValue; DateTime updateEnd = DateTime.MinValue; if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeBegin)) { if (!DateTime.TryParse(QuerySearch.CreateTimeBegin, out createBegin)) throw Oops.Oh($"创建开始日期格式错误,{QuerySearch.CreateTimeBegin}"); } if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeEnd)) { if (!DateTime.TryParse(QuerySearch.CreateTimeEnd, out createEnd)) throw Oops.Oh($"创建结束日期格式错误,{QuerySearch.CreateTimeEnd}"); createEnd = createEnd.AddDays(1); } if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeBegin)) { if (!DateTime.TryParse(QuerySearch.UpdateTimeBegin, out updateBegin)) throw Oops.Oh($"更新起始日期格式错误,{QuerySearch.UpdateTimeBegin}"); } if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeEnd)) { if (!DateTime.TryParse(QuerySearch.UpdateTimeEnd, out updateEnd)) throw Oops.Oh($"更新结束日期格式错误,{QuerySearch.UpdateTimeEnd}"); updateEnd = updateEnd.AddDays(1); } string entityOrderCol = "CreatedTime"; //这里因为返回给前端的台账数据是DTO,所以这里排序时候需要转换成Entity对应的字段 if (!string.IsNullOrWhiteSpace(QuerySearch.SortField)) entityOrderCol = MapsterExtHelper.GetAdaptProperty(QuerySearch.SortField); var entities = await _paraContractNoInfoRepository.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.ContractNo), t => t.CONTRACT_NO.Contains(QuerySearch.ContractNo.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.ContractName), t => t.CONTRACT_NAME.Contains(QuerySearch.ContractName.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.ContractNote), t => t.CONTRACT_NOTE.Contains(QuerySearch.ContractNote.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CarrierCode), t => t.CARRIER_CODE.Contains(QuerySearch.CarrierCode.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.PODCode), t => t.POD_CODE.Equals(QuerySearch.PODCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.LaneCName), t => t.LANE_CNAME.Contains(QuerySearch.LaneCName.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(createBegin != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value >= createBegin) .WhereIF(createEnd != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value < createEnd) .WhereIF(updateBegin != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value >= updateBegin) .WhereIF(updateEnd != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value < updateEnd) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.CreatedUserName.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.UpdatedUserName.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc ")) .ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize); return entities.Adapt>(); } #endregion } }