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.

271 lines
12 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.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;
namespace Myshipping.Core.Service
{
/// <summary>
/// 客户服务
/// </summary>
[ApiDescriptionSettings(Name = "DjyCustomer", Order = 1)]
public class DjyCustomerService : IDjyCustomerService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<DjyCustomer> _rep;
private readonly SqlSugarRepository<DjyCustomerContact> _repContact;
private readonly ILogger<DjyCustomerService> _logger;
public DjyCustomerService(SqlSugarRepository<DjyCustomer> rep, SqlSugarRepository<DjyCustomerContact> repContact, ILogger<DjyCustomerService> logger)
{
_rep = rep;
_repContact = repContact;
_logger = logger;
}
/// <summary>
/// 分页查询客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/DjyCustomer/page")]
public async Task<dynamic> Page([FromQuery] QueryDjyCustomerInput input)
{
var entities = await _rep.AsQueryable().Filter(null, true)
.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();
}
/// <summary>
/// 增加客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/DjyCustomer/add"), SqlSugarUnitOfWork]
public async Task<long> 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<DjyCustomer>();
await _rep.InsertAsync(entity);
var contactList = input.Contacts.Adapt<List<DjyCustomerContact>>();
contactList.ForEach(x => x.CustomerId = entity.Id);
await _repContact.InsertAsync(contactList);
return entity.Id;
}
/// <summary>
/// 更新客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/DjyCustomer/edit"), SqlSugarUnitOfWork]
public async Task<long> 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<DjyCustomer>();
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
await _repContact.DeleteAsync(x => x.CustomerId == input.Id);
var contactList = input.Contacts.Adapt<List<DjyCustomerContact>>();
contactList.ForEach(x => x.CustomerId = entity.Id);
await _repContact.InsertAsync(contactList);
return entity.Id;
}
/// <summary>
/// 删除客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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 _rep.DeleteAsync(entity);
}
}
/// <summary>
/// 获取客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/DjyCustomer/detail")]
public async Task<DjyCustomerOutput> Detail([FromQuery] GetDjyCustomerInput input)
{
Log.Information($"查询客户详情:{input.Id}");
_logger.LogInformation($"查询客户详情:{input.Id}");
var cust = await _rep.FirstOrDefaultAsync(u => u.Id == input.Id);
if (cust == null)
{
throw Oops.Oh(ErrorCode.D1002);
}
var custOut = cust.Adapt<DjyCustomerOutput>();
custOut.Contacts = _repContact.Where(x => x.CustomerId == input.Id).OrderBy(x => x.Sort).ToList().Adapt<List<DjyCustomerContactOutput>>();
return custOut;
}
/// <summary>
/// 根据客户id获取所有联系人
/// </summary>
/// <param name="customerId"></param>
/// <returns></returns>
[HttpGet("/DjyCustomer/contacts")]
public async Task<List<DjyCustomerContactOutput>> ListContact(long customerId)
{
var list = await _repContact.Where(x => x.CustomerId == customerId).OrderBy(x => x.Sort).ToListAsync();
return list.Adapt<List<DjyCustomerContactOutput>>();
}
///// <summary>
///// 获取客户列表
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//[HttpGet("/DjyCustomer/list")]
//public async Task<dynamic> List([FromQuery] QueryDjyCustomerInput input)
//{
// return await _rep.ToListAsync();
//}
/// <summary>
/// 下拉筛选
/// </summary>
/// <param name="keyword">关键字</param>
/// <param name="type">类型参考字典参数客户属性djy_cust_prop</param>
/// <returns></returns>
[HttpGet("/DjyCustomer/Suggest")]
public async Task<dynamic> Suggest(string keyword, string type)
{
//List<long> userlist = await DataFilterExtensions.GetDataScopeIdList();
var entities = await _rep.AsQueryable().Filter(null, true)
.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();
}
/// <summary>
/// 检索往来单位(包含车队)
/// </summary>
/// <param name="queryItem">检索值</param>
/// <param name="queryType">检索类型数组(可传多个) fleet-车队customs_broker-报关行</param>
/// <param name="top">默认最大行数</param>
/// <returns>返回回执</returns>
[HttpGet("/DjyCustomer/QuerytDjyCustomerInfo")]
public async Task<List<DjyCustomerOutput>> QuerytDjyCustomerInfo([FromQuery] string queryItem, [FromQuery] string[] queryType, [FromQuery] int top = 10)
{
List<DjyCustomerOutput> list = new List<DjyCustomerOutput>();
try
{
string sqlWhere = "1=1";
if (!string.IsNullOrWhiteSpace(queryItem))
{
sqlWhere += $" and (CodeName like '%{queryItem.Trim()}%' or ShortName like '%{queryItem.Trim()}%' or FullName like '%{queryItem.Trim()}%')";
}
if (queryType.Length > 0)
{
sqlWhere += $" and PropString REGEXP '" + string.Join("|", queryType) + "'";
}
var entityList = await _rep.AsQueryable().Where(sqlWhere).Take(top).OrderBy(a => a.FullName)
.ToListAsync();
if (entityList.Count > 0)
{
list = entityList.Adapt<List<DjyCustomerOutput>>();
var custsArg = list.Select(a => a.Id).ToArray();
var contactList = _repContact.AsQueryable()
.Where(a => custsArg.Contains(a.CustomerId.Value)).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<List<DjyCustomerContactOutput>>();
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;
}
}
}