// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using Admin.NET.Core.Service;
using Microsoft.AspNetCore.Http;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using Mapster;
using SqlSugar;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Furion.DynamicApiController;
using Furion.DependencyInjection;
using Admin.NET.Core;
using FZCZTB.NET.MD.CutomerMd.Extend;
using cylsg.utility;
namespace FZCZTB.Net.CustomerSYSTem;
///
/// 企业资料服务 🧩
///
[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)]
public class FBS_CusExtendService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _fBS_CusExtendRep;
private readonly ISqlSugarClient _sqlSugarClient;
private readonly SysDictTypeService _sysDictTypeService;
private readonly FBS_EnterpriseTypeService _EnterpriseTypeService;
public FBS_CusExtendService(SqlSugarRepository fBS_CusExtendRep,
ISqlSugarClient sqlSugarClient,
SysDictTypeService sysDictTypeService,
FBS_EnterpriseTypeService fBS_EnterpriseTypeService )
{
_fBS_CusExtendRep = fBS_CusExtendRep;
_sqlSugarClient = sqlSugarClient;
_sysDictTypeService = sysDictTypeService;
_EnterpriseTypeService = fBS_EnterpriseTypeService;
}
///
///
///
///
[DisplayName("页面其他初始化资料")]
[ApiDescriptionSettings(Name = "GetParam"), HttpGet]
public async Task GetParam()
{
return new FBS_CusExtendParam()
{
EnterpriseTypes = await _EnterpriseTypeService.GetTreeData(),
StepsTypeItems = CommonHelper.GetEnumItemsWithAttributes()
};
}
///
/// 分页查询企业资料 🔖
///
///
///
[DisplayName("分页查询企业资料")]
[ApiDescriptionSettings(Name = "Page"), HttpPost]
public async Task> Page(PageFBS_CusExtendInput input)
{
input.Keyword = input.Keyword?.Trim();
var query = _fBS_CusExtendRep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.EnterpriseType.Contains(input.Keyword) || u.TransactionCode.Contains(input.Keyword) || u.BusinessLicense.Contains(input.Keyword) || u.EnterpriseName.Contains(input.Keyword) || u.UnifiedSocialCreditCode.Contains(input.Keyword) || u.RegisteredCapital.Contains(input.Keyword) || u.LegalRepresentativeName.Contains(input.Keyword) || u.LegalRepresentativeIdCard.Contains(input.Keyword) || u.LegalRepresentativeIdNumber.Contains(input.Keyword) || u.LegalRepresentativePhone.Contains(input.Keyword) || u.Residence.Contains(input.Keyword) || u.EnterprisePhone.Contains(input.Keyword) || u.MainBusiness.Contains(input.Keyword) || u.EnterpriseEmail.Contains(input.Keyword) || u.OperatorName.Contains(input.Keyword) || u.OperatorIdCard.Contains(input.Keyword) || u.OperatorIdNumber.Contains(input.Keyword) || u.OperatorPhone.Contains(input.Keyword) || u.BankName.Contains(input.Keyword) || u.BankAccount.Contains(input.Keyword))
.WhereIF(!string.IsNullOrWhiteSpace(input.EnterpriseType), u => u.EnterpriseType.Contains(input.EnterpriseType.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.TransactionCode), u => u.TransactionCode.Contains(input.TransactionCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BusinessLicense), u => u.BusinessLicense.Contains(input.BusinessLicense.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.EnterpriseName), u => u.EnterpriseName.Contains(input.EnterpriseName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.UnifiedSocialCreditCode), u => u.UnifiedSocialCreditCode.Contains(input.UnifiedSocialCreditCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.RegisteredCapital), u => u.RegisteredCapital.Contains(input.RegisteredCapital.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativeName), u => u.LegalRepresentativeName.Contains(input.LegalRepresentativeName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativeIdCard), u => u.LegalRepresentativeIdCard.Contains(input.LegalRepresentativeIdCard.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativeIdNumber), u => u.LegalRepresentativeIdNumber.Contains(input.LegalRepresentativeIdNumber.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.LegalRepresentativePhone), u => u.LegalRepresentativePhone.Contains(input.LegalRepresentativePhone.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Residence), u => u.Residence.Contains(input.Residence.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.EnterprisePhone), u => u.EnterprisePhone.Contains(input.EnterprisePhone.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MainBusiness), u => u.MainBusiness.Contains(input.MainBusiness.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.EnterpriseEmail), u => u.EnterpriseEmail.Contains(input.EnterpriseEmail.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.OperatorName), u => u.OperatorName.Contains(input.OperatorName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.OperatorIdCard), u => u.OperatorIdCard.Contains(input.OperatorIdCard.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.OperatorIdNumber), u => u.OperatorIdNumber.Contains(input.OperatorIdNumber.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.OperatorPhone), u => u.OperatorPhone.Contains(input.OperatorPhone.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BankName), u => u.BankName.Contains(input.BankName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BankAccount), u => u.BankAccount.Contains(input.BankAccount.Trim()))
.WhereIF(input.CustomerId != null, u => u.CustomerId == input.CustomerId)
.WhereIF(input.EstablishmentTimeRange?.Length == 2, u => u.EstablishmentTime >= input.EstablishmentTimeRange[0] && u.EstablishmentTime <= input.EstablishmentTimeRange[1])
.WhereIF(input.steps != null, u => u.steps == input.steps)
.Select();
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
}
///
/// 获取企业资料详情 ℹ️
///
///
///
[DisplayName("获取企业资料详情")]
[ApiDescriptionSettings(Name = "Detail"), HttpGet]
public async Task Detail([FromQuery] QueryByIdFBS_CusExtendInput input)
{
return await _fBS_CusExtendRep.GetFirstAsync(u => u.Id == input.Id);
}
///
/// 增加企业资料 ➕
///
///
///
[DisplayName("增加企业资料")]
[ApiDescriptionSettings(Name = "Add"), HttpPost]
public async Task Add(AddFBS_CusExtendInput input)
{
var entity = input.Adapt();
return await _fBS_CusExtendRep.InsertAsync(entity) ? entity.Id : 0;
}
///
/// 更新企业资料 ✏️
///
///
///
[DisplayName("更新企业资料")]
[ApiDescriptionSettings(Name = "Update"), HttpPost]
public async Task Update(UpdateFBS_CusExtendInput input)
{
var entity = input.Adapt();
await _fBS_CusExtendRep.AsUpdateable(entity)
.ExecuteCommandAsync();
}
///
/// 删除企业资料 ❌
///
///
///
[DisplayName("删除企业资料")]
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
public async Task Delete(DeleteFBS_CusExtendInput input)
{
var entity = await _fBS_CusExtendRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
//await _fBS_CusExtendRep.FakeDeleteAsync(entity); //假删除
await _fBS_CusExtendRep.DeleteAsync(entity); //真删除
}
///
/// 批量删除企业资料 ❌
///
///
///
[DisplayName("批量删除企业资料")]
[ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
public async Task BatchDelete([Required(ErrorMessage = "主键列表不能为空")]List input)
{
var exp = Expressionable.Create();
foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
var list = await _fBS_CusExtendRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
// return await _fBS_CusExtendRep.FakeDeleteAsync(list); //假删除
return await _fBS_CusExtendRep.DeleteAsync(list); //真删除
}
///
/// 导出企业资料记录 🔖
///
///
///
[DisplayName("导出企业资料记录")]
[ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
public async Task Export(PageFBS_CusExtendInput input)
{
var list = (await Page(input)).Items?.Adapt>() ?? new();
if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList();
//var stepsDictMap = _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = "CusExtendStep" }).Result.ToDictionary(x => x.Value, x => x.Label);
//list.ForEach(e => {
// e.stepsDictLabel = stepsDictMap.GetValueOrDefault(e.steps ?? CusExtendStep.UNExamine, e.steps);
//});
return ExcelHelper.ExportTemplate(list, "企业资料导出记录");
}
///
/// 下载企业资料数据导入模板 ⬇️
///
///
[DisplayName("下载企业资料数据导入模板")]
[ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify]
public IActionResult DownloadTemplate()
{
return ExcelHelper.ExportTemplate(new List(), "企业资料导入模板");
}
private static readonly object _fBS_CusExtendImportLock = new object();
///
/// 导入企业资料记录 💾
///
///
[DisplayName("导入企业资料记录")]
[ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
public IActionResult ImportData([Required] IFormFile file)
{
lock (_fBS_CusExtendImportLock)
{
var stepsDictMap = _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = "CusExtendStep" }).Result.ToDictionary(x => x.Label!, x => x.Value);
var stream = ExcelHelper.ImportData(file, (list, markerErrorAction) =>
{
_sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
{
//// 映射字典值
//foreach(var item in pageItems) {
// if (string.IsNullOrWhiteSpace(item.stepsDictLabel)) continue;
// item.steps = stepsDictMap.GetValueOrDefault(item.stepsDictLabel);
// if (item.steps == null) item.Error = "审核步骤字典映射失败";
//}
// 校验并过滤必填基本类型为null的字段
var rows = pageItems.Where(x => {
if (!string.IsNullOrWhiteSpace(x.Error)) return false;
if (x.CustomerId == null){
x.Error = "用户ID不能为空";
return false;
}
if (!string.IsNullOrWhiteSpace(x.Error)) return false;
if (x.steps == null){
x.Error = "审核步骤不能为空";
return false;
}
return true;
}).Adapt>();
var storageable = _fBS_CusExtendRep.Context.Storageable(rows)
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterpriseType), "企业类型 不能为空")
.SplitError(it => it.Item.EnterpriseType?.Length > 255, "企业类型 长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.TransactionCode), "交易主体code不能为空")
.SplitError(it => it.Item.TransactionCode?.Length > 255, "交易主体code长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.BusinessLicense), "营业执照文件路径不能为空")
.SplitError(it => it.Item.BusinessLicense?.Length > 255, "营业执照文件路径长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterpriseName), "企业名称不能为空")
.SplitError(it => it.Item.EnterpriseName?.Length > 255, "企业名称长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.UnifiedSocialCreditCode), "统一社会信用代码不能为空")
.SplitError(it => it.Item.UnifiedSocialCreditCode?.Length > 255, "统一社会信用代码长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.RegisteredCapital), "注册资金不能为空")
.SplitError(it => it.Item.RegisteredCapital?.Length > 255, "注册资金长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativeName), "法定代表人姓名不能为空")
.SplitError(it => it.Item.LegalRepresentativeName?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativeIdCard), "法定代表人身份证文件路径不能为空")
.SplitError(it => it.Item.LegalRepresentativeIdCard?.Length > 255, "法定代表人身份证文件路径长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativeIdNumber), "法定代表人姓名不能为空")
.SplitError(it => it.Item.LegalRepresentativeIdNumber?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.LegalRepresentativePhone), "法定代表人姓名不能为空")
.SplitError(it => it.Item.LegalRepresentativePhone?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.Residence), "企业住所不能为空")
.SplitError(it => it.Item.Residence?.Length > 255, "企业住所长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterprisePhone), "企业联系电话不能为空")
.SplitError(it => it.Item.EnterprisePhone?.Length > 255, "企业联系电话长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.EnterpriseEmail), "企业邮箱不能为空")
.SplitError(it => it.Item.EnterpriseEmail?.Length > 255, "企业邮箱长度不能超过255个字符")
.SplitError(it => it.Item.OperatorName?.Length > 255, "业务经办人姓名长度不能超过255个字符")
.SplitError(it => it.Item.OperatorIdCard?.Length > 255, "业务经办人身份证文件路径或标识长度不能超过255个字符")
.SplitError(it => it.Item.OperatorIdNumber?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitError(it => it.Item.OperatorPhone?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.BankName), "法定代表人姓名不能为空")
.SplitError(it => it.Item.BankName?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitError(it => string.IsNullOrWhiteSpace(it.Item.BankAccount), "法定代表人姓名不能为空")
.SplitError(it => it.Item.BankAccount?.Length > 255, "法定代表人姓名长度不能超过255个字符")
.SplitInsert(_ => true)
.ToStorage();
storageable.AsInsertable.ExecuteCommand();// 不存在插入
storageable.AsUpdateable.ExecuteCommand();// 存在更新
// 标记错误信息
markerErrorAction.Invoke(storageable, pageItems, rows);
});
});
return stream;
}
}
}