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.Core.Entity; using System.Collections.Generic; using Furion.FriendlyException; using Furion.Logging; using Microsoft.Extensions.Logging; using System; using System.Text.RegularExpressions; using NPOI.Util; using StackExchange.Profiling.Internal; using Microsoft.AspNetCore.Authorization; using static NPOI.HSSF.Util.HSSFColor; using TinyPinyin; using Myshipping.Core.Const; namespace Myshipping.Core.Service { /// /// 客户服务 /// [ApiDescriptionSettings(Name = "DjyCustomer", Order = 1)] public class DjyCustomerService : IDjyCustomerService, IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _repContact; private readonly SqlSugarRepository _repAddr; private readonly SqlSugarRepository _repCustomerParamValue; private readonly ISysCacheService _cache; private readonly ISysDataUserMenu _sysDataUserMenuService; private readonly ILogger _logger; public DjyCustomerService(SqlSugarRepository rep, SqlSugarRepository repContact, ILogger logger, SqlSugarRepository addrRepContact, ISysCacheService cache, ISysDataUserMenu sysDataUserMenuService, SqlSugarRepository repCustomerParamValue) { _rep = rep; _repContact = repContact; _logger = logger; _repAddr = addrRepContact; _cache = cache; _sysDataUserMenuService = sysDataUserMenuService; _repCustomerParamValue = repCustomerParamValue; } /// /// 分页查询客户 /// /// /// [HttpGet("/DjyCustomer/page")] public async Task Page([FromQuery] QueryDjyCustomerInput input) { var queryable = _rep.AsQueryable().Filter(null, true); // 判断是否启用了委托单位查看控制权限 var tenantParamList = await _cache.GetAllTenantParam(); var isEnableCustomerAuthority = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == TenantParamCode.IS_ENABLE_CUSTOMER_AUTHORITY)?.ItemCode == "YES"; if (isEnableCustomerAuthority) { List userList = await _sysDataUserMenuService.GetDataScopeList(MenuConst.MenuDjyCustomer); if (userList?.Any() == true) { List userListStr = userList.Select(x => x.ToString()).ToList(); queryable.Where(u => userList.Contains((long)u.CreatedUserId) || userListStr.Contains(u.OPID) || userListStr.Contains(u.SALEID) || userListStr.Contains(u.DOCID) || userListStr.Contains(u.CUSTSERVICEID)); } } var entities = await queryable .WhereIF(!string.IsNullOrWhiteSpace(input.CodeName), u => u.CodeName.Contains(input.CodeName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ShortName), u => u.ShortName.Contains(input.ShortName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.FullName), u => u.FullName.Contains(input.FullName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Chief), u => u.Chief.Contains(input.Chief.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Tel), u => u.Tel.Contains(input.Tel.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Email), u => u.Email.Contains(input.Email.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.QQ), u => u.QQ.Contains(input.QQ.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.WebUrl), u => u.WebUrl.Contains(input.WebUrl.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Province), u => u.Province.Contains(input.Province.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.City), u => u.City.Contains(input.City.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Addr), u => u.Addr.Contains(input.Addr.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.FullNameEN), u => u.FullNameEN.Contains(input.FullNameEN.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.AddrEN), u => u.AddrEN.Contains(input.AddrEN.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.PropString), u => u.PropString.Contains(input.PropString.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.InvTitle), u => u.InvTitle.Contains(input.InvTitle.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.TaxNO), u => u.TaxNO.Contains(input.TaxNO.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.InvAddrTel), u => u.InvAddrTel.Contains(input.InvAddrTel.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.RMBBank), u => u.RMBBank.Contains(input.RMBBank.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.RmbAccount), u => u.RmbAccount.Contains(input.RmbAccount.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.USDBank), u => u.USDBank.Contains(input.USDBank.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.USDAccount), u => u.USDAccount.Contains(input.USDAccount.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ServiceItem), u => u.ServiceItem.Contains(input.ServiceItem.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SALE), u => u.SALE.Contains(input.SALE.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.ShortName.Contains(input.SearchValue.Trim()) || u.CodeName.Contains(input.SearchValue.Trim())) .Where(u => u.TenantId == UserManager.TENANT_ID) //权限范围目前不支持根据模块设置,客户模块暂时写死本公司数据 .ToPagedListAsync(input.PageNo, input.PageSize); return entities.XnPagedResult(); } /// /// 增加客户 /// /// /// [HttpPost("/DjyCustomer/add"), SqlSugarUnitOfWork] public async Task Add(AddDjyCustomerInput input) { //var find = await _rep.FirstOrDefaultAsync(u => u.CodeName == input.CodeName); //if (find != null) //{ // throw Oops.Oh($"助记码已存在:{input.CodeName}"); //} var entity = input.Adapt(); if (entity.Level == "R3" && !string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R3,客服为空"); } if ((entity.Level == "R1" || entity.Level == "R2") && string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R1/R2,客服必填"); } await _rep.InsertAsync(entity); var contactList = input.Contacts.Adapt>(); contactList.ForEach(x => x.CustomerId = entity.Id); await _repContact.InsertAsync(contactList); //地址 var addrList = input.Addrs.Adapt>(); addrList.ForEach(x => x.CustomerId = entity.Id); await _repAddr.InsertAsync(addrList); return entity.Id; } /// /// 更新客户 /// /// /// [HttpPost("/DjyCustomer/edit"), SqlSugarUnitOfWork] public async Task Update(UpdateDjyCustomerInput input) { var find = await _rep.FirstOrDefaultAsync(u => u.Id == input.Id); if (find == null) { throw Oops.Oh(ErrorCode.D1002); } //find = await _rep.FirstOrDefaultAsync(u => u.CodeName == input.CodeName && u.Id != input.Id); //if (find != null) //{ // throw Oops.Oh($"助记码已存在:{input.CodeName}"); //} var entity = input.Adapt(); if (entity.Level == "R3" && !string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R3,客服为空"); } if ((entity.Level == "R1" || entity.Level == "R2") && string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R1/R2,客服必填"); } await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); //await _repContact.DeleteAsync(x => x.CustomerId == input.Id); //var contactList = input.Contacts.Adapt>(); //contactList.ForEach(x => x.CustomerId = entity.Id); //await _repContact.InsertAsync(contactList); var dbContact = await _repContact.AsQueryable().Where(x => x.CustomerId == input.Id).ToListAsync(); foreach (var dtoUser in input.Contacts) { if (dtoUser.Id > 0) { var contact = dbContact.First(x => x.Id == dtoUser.Id); dtoUser.Adapt(contact); contact.CustomerId = entity.Id; await _repContact.UpdateAsync(contact); dbContact.Remove(contact); } else { var contact = dtoUser.Adapt(); contact.CustomerId = entity.Id; await _repContact.InsertAsync(contact); } } foreach (var contact in dbContact) { await _repContact.DeleteAsync(contact); } //地址 await _repAddr.DeleteAsync(x => x.CustomerId == input.Id); var addrList = input.Addrs.Adapt>(); addrList.ForEach(x => x.CustomerId = entity.Id); await _repAddr.InsertAsync(addrList); return entity.Id; } /// /// 删除客户 /// /// /// [HttpPost("/DjyCustomer/delete"), SqlSugarUnitOfWork] public async Task Delete(GetDjyCustomerInput input) { var entity = await _rep.FirstOrDefaultAsync(u => u.Id == input.Id); if (entity == null) { throw Oops.Oh(ErrorCode.D1002); } else { await _repContact.DeleteAsync(x => x.CustomerId == input.Id); await _repAddr.DeleteAsync(x => x.CustomerId == input.Id); await _rep.DeleteAsync(entity); } } /// /// 获取客户 /// /// /// [HttpGet("/DjyCustomer/detail")] public async Task Detail([FromQuery] GetDjyCustomerInput input) { Log.Information($"查询客户详情:{input.Id}"); _logger.LogInformation($"查询客户详情:{input.Id}"); var cust = await _rep.AsQueryable().Filter(null, true) .WhereIF(input.Id > 0, x => x.Id == input.Id) .WhereIF(input.Id == 0, x => x.CodeName == input.CodeName && x.ShortName == input.ShortName) .FirstAsync(); if (cust == null) { throw Oops.Oh(ErrorCode.D1002); } var custOut = cust.Adapt(); custOut.Contacts = _repContact.AsQueryable().Filter(null, true).Where(x => x.CustomerId == cust.Id).OrderBy(x => x.Sort).ToList().Adapt>(); custOut.Addrs = _repAddr.AsQueryable().Filter(null, true).Where(x => x.CustomerId == cust.Id).ToList().Adapt>(); custOut.ParamValueList = _repCustomerParamValue.AsQueryable().Filter(null, true).Where(x => x.CustomerId == cust.Id).ToList().Adapt>(); return custOut; } /// /// 根据客户id,获取所有联系人 /// /// /// [HttpGet("/DjyCustomer/contacts")] public async Task> ListContact(long customerId) { var list = await _repContact.Where(x => x.CustomerId == customerId).OrderBy(x => x.Sort).ToListAsync(); return list.Adapt>(); } ///// ///// 获取客户列表 ///// ///// ///// //[HttpGet("/DjyCustomer/list")] //public async Task List([FromQuery] QueryDjyCustomerInput input) //{ // return await _rep.ToListAsync(); //} /// /// 下拉筛选 /// /// 关键字 /// 类型,参考字典参数:客户属性(djy_cust_prop) /// [HttpGet("/DjyCustomer/Suggest")] public async Task Suggest(string keyword, string type) { var queryable = _rep.AsQueryable().Filter(null, true); // 判断是否启用了委托单位查看控制权限 var tenantParamList = await _cache.GetAllTenantParam(); var isEnableCustomerAuthority = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == TenantParamCode.IS_ENABLE_CUSTOMER_AUTHORITY)?.ItemCode == "YES"; if (isEnableCustomerAuthority) { List userList = await _sysDataUserMenuService.GetDataScopeList(MenuConst.MenuDjyCustomer); if (userList?.Any() == true) { List userListStr = userList.Select(x => x.ToString()).ToList(); queryable.Where(u => userList.Contains((long)u.CreatedUserId) || userListStr.Contains(u.OPID) || userListStr.Contains(u.SALEID) || userListStr.Contains(u.DOCID) || userListStr.Contains(u.CUSTSERVICEID)); } } var entities = await queryable .Where(x => x.TenantId == UserManager.TENANT_ID) .WhereIF(!string.IsNullOrWhiteSpace(type), u => u.PropString.Contains(type)) .WhereIF(!string.IsNullOrWhiteSpace(keyword), u => u.CodeName.Contains(keyword) || u.ShortName.Contains(keyword)) .ToPagedListAsync(1, 10); return entities.XnPagedResult(); } /// /// 检索往来单位(包含车队) /// /// 检索值 /// 检索类型数组(可传多个) fleet-车队;customs_broker-报关行 /// 默认最大行数 /// 返回回执 [HttpGet("/DjyCustomer/QuerytDjyCustomerInfo")] public async Task> QuerytDjyCustomerInfo([FromQuery] string queryItem, [FromQuery] string[] queryType, [FromQuery] int top = 40) { List list = new List(); try { var entityList = await _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(queryItem), x => x.CodeName.Contains(queryItem) || x.ShortName.Contains(queryItem) || x.FullName.Contains(queryItem)) .WhereIF(queryType.Length > 0, x => x.PropString.Contains(queryType.FirstOrDefault())) .Take(top).OrderBy(a => a.FullName) .ToListAsync(); if (entityList.Count > 0) { list = entityList.Adapt>(); var custsArg = list.Select(a => a.Id).ToArray(); var contactList = _repContact.AsQueryable() .Where(a => custsArg.Contains(a.CustomerId.Value)).ToList(); var addrList = _repAddr.AsQueryable() .Where(a => custsArg.Contains(a.CustomerId)).ToList(); list = list.GroupJoin(contactList, l => l.Id, r => r.CustomerId.Value, (l, r) => { var curList = r.ToList(); if (curList.Count > 0) l.Contacts = curList.Adapt>(); return l; }).ToList(); if (addrList.Count > 0) { list = list.GroupJoin(addrList, l => l.Id, r => r.CustomerId, (l, r) => { var curList = r.ToList(); if (curList.Count > 0) { l.Addrs = curList.Adapt>(); } if (!string.IsNullOrWhiteSpace(l.Addr)) { if (l.Addrs == null) l.Addrs = new List(); l.Addrs.Add(new DjyCustomerAddrInput { CustomerId = l.Id, Addr = l.Addr, }); } return l; }).ToList(); } } } catch (Exception ex) { _logger.LogError("检索车队异常,请求:queryItem={0};queryType={1};top={2} 异常:{3}", queryItem, queryType, top, ex.Message); throw Oops.Bah("检索车队异常,异常{msg}", ex.Message); } return list; } public async Task> QueryDjyCustomerByProp(string propStringCode) { string propStringStr = string.Concat('[', propStringCode, ']'); var entityList = await _rep.AsQueryable() .Where(x => x.PropString.Contains(propStringStr)) .Select(x => new { code = x.CodeName, name = x.ShortName }) .ToListAsync(); return entityList.Select(x => new ValueTuple(x.code, x.name)).ToList(); } /// /// 批量更新客户信息 /// [HttpPost("/DjyCustomer/BatchUpdate")] public async Task BatchUpdate(BatchUpdateInput input) { if (input.CustomnerIdList == null || input.CustomnerIdList.Count == 0) { throw Oops.Oh("客户列表为空"); } var updateable = _rep.Context.Updateable(); if (input.IsSetCUSTSERVICE) { updateable.SetColumns(x => x.CUSTSERVICE == input.CUSTSERVICE); updateable.SetColumns(x => x.CUSTSERVICEID == input.CUSTSERVICEID); } if (input.IsSetSALE) { updateable.SetColumns(x => x.SALE == input.SALE); updateable.SetColumns(x => x.SALEID == input.SALEID); } if (input.IsSetOP) { updateable.SetColumns(x => x.OP == input.OP); updateable.SetColumns(x => x.OPID == input.OPID); } if (input.IsSetDOC) { updateable.SetColumns(x => x.DOC == input.DOC); updateable.SetColumns(x => x.DOCID == input.DOCID); } if (input.IsSetBUSINESS) { updateable.SetColumns(x => x.BUSINESS == input.BUSINESS); updateable.SetColumns(x => x.BUSINESSID == input.BUSINESSID); } if (input.IsSetCUSTSERVICE || input.IsSetSALE || input.IsSetOP || input.IsSetDOC || input.IsSetBUSINESS) { await updateable.Where(x => input.CustomnerIdList.Contains(x.Id)).ExecuteCommandAsync(); } } #region 接收客户端租户、用户的数据到运营端委托单位 /// /// 接收客户端租户、用户的数据到运营端委托单位 /// /// [HttpPost("/DjyCustomer/RecCustomerUserSync"), AllowAnonymous, ApiUser(ApiCode = "DjyBookingReceiveApi")] public async Task RecCustomerUserSync(DjyCustomerFromCustomerDto dto) { var cust = await _rep.AsQueryable().Filter(null, true).FirstAsync(x => x.CustSysId == dto.Id); if (cust == null) { var shortName = dto.Name; var idx = shortName.IndexOf("有限公司"); if (idx > -1) { shortName = shortName.Substring(0, idx); } cust = new DjyCustomer() { CustSysId = dto.Id, FullName = dto.Name, Email = dto.Email, Tel = dto.Phone, CodeName = PinyinHelper.GetPinyinInitials(shortName), ShortName = shortName, DjyGid = dto.DjyGid, PropString = "[consignor]" }; await _rep.InsertAsync(cust); } var dbContactList = await _repContact.AsQueryable().Filter(null, true).Where(x => x.CustomerId == cust.Id).ToListAsync(); foreach (var usr in dto.UserList) { DjyCustomerContact contact = dbContactList.FirstOrDefault(x => x.CustSysId == usr.Id); //不存在,新增 if (contact == null) { contact = new DjyCustomerContact() { CustomerId = cust.Id, Name = usr.Name, Email = usr.Email, Tel = usr.Phone, CustSysId = usr.Id, DjyGid = usr.DjyGid }; await _repContact.InsertAsync(contact); } else { contact.CustomerId = cust.Id; contact.Name = usr.Name; contact.Email = usr.Email; contact.Tel = usr.Phone; contact.CustSysId = usr.Id; contact.DjyGid = usr.DjyGid; await _repContact.UpdateAsync(contact); dbContactList.Remove(contact); } } //删除没有的用户 foreach (var contact in dbContactList) { await _repContact.DeleteAsync(contact); } } #endregion /// /// 委托单位(订舱代理)、联系人船司属性,获取联系人信息 /// [HttpPost("/DjyCustomer/GetCustomerContactByProp")] public async Task GetCustomerContactByProp(long custId, string carrier) { return await _repContact.AsQueryable() .Where(x => x.CustomerId == custId) .Where(x => x.CarrierProp == carrier) .Select(x => new { x.Id, x.Name, x.Email }) .ToListAsync(); } } }