using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.FriendlyException;
using NCC.@(@Model.NameSpace).Interfaces.@Model.ClassName;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NCC.@(@Model.NameSpace).Entitys;
using NCC.@(@Model.NameSpace).Entitys.Dto.@Model.ClassName;
using Yitter.IdGenerator;
using NCC.Common.Helper;
using NCC.JsonSerialization;
@if(Model.IsExport){
@:using NCC.Common.Model.NPOI;
@:using NCC.Common.Configuration;
@:using NCC.DataEncryption;
@:using NCC.ClayObject;
}
@if(Model.IsBillRule || Model.DbLinkId != "0")
{
@:using NCC.System.Interfaces.System;
}
@if(Model.useDataPermission)
{
@:using NCC.System.Interfaces.Permission;
}
namespace NCC.@(@Model.NameSpace).@Model.ClassName
{
///
/// @(@Model.BusName)服务
///
[ApiDescriptionSettings(Tag = "@(@Model.NameSpace)",Name = "@Model.ClassName", Order = 200)]
[Route("api/@(@Model.NameSpace)/[controller]")]
public class @(@Model.ClassName)Service : I@(@Model.ClassName)Service, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository<@(@Model.MainTable)Entity> _@(@Model.LowerMainTable)Repository;
@foreach (var item in Model.TableRelations)
{
@:private readonly ISqlSugarRepository<@(@item.TableName)Entity> _@(@item.LowerTableName)Repository;
}
@if(Model.IsBillRule)
{
@:private readonly IBillRullService _billRuleService;
}
@if(Model.DbLinkId != "0"){
@:private readonly IDbLinkService _dbLinkService;
@:private readonly IDataBaseService _dataBaseService;
}
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
@if(Model.useDataPermission)
{
@:private readonly IAuthorizeService _authorizeService;
}
///
/// 初始化一个类型的新实例
///
public @(@Model.ClassName)Service(
ISqlSugarRepository<@(@Model.MainTable)Entity> @(@Model.LowerMainTable)Repository,
@foreach(var table in Model.TableRelations){
@:ISqlSugarRepository<@(@table.TableName)Entity> @(@table.LowerTableName)Repository,
}
@if(Model.IsBillRule)
{
@:IBillRullService billRuleService,
}
@if(Model.DbLinkId != "0")
{
@:IDbLinkService dbLinkService,
@:IDataBaseService dataBaseService,
}
@if(Model.useDataPermission)
{
@:IAuthorizeService authorizeService,
}
IUserManager userManager)
{
_@(@Model.LowerMainTable)Repository = @(@Model.LowerMainTable)Repository;
_db = _@(@Model.LowerMainTable)Repository.Context;
@foreach(var table in Model.TableRelations)
{
@:_@(@table.LowerTableName)Repository = @(@table.LowerTableName)Repository;
}
@if(Model.IsBillRule)
{
@:_billRuleService = billRuleService;
}
@if(Model.DbLinkId != "0")
{
@:_dbLinkService = dbLinkService;
@:_dataBaseService = dataBaseService;
}
@if(Model.useDataPermission)
{
@:_authorizeService = authorizeService;
}
_userManager = userManager;
}
@foreach(var item in Model.Function){
if(@item.FullName == "info"){
@:
@:///
@:/// 获取@(@Model.BusName)
@:///
@:/// 参数
@:///
@:[HttpGet("{id}")]
@:public async Task GetInfo(string id)
@:{
@if(Model.DbLinkId != "0")
{
@:var dbLink = await _dbLinkService.GetInfo("@(@Model.DbLinkId)");
@:_db.AddConnection(new ConnectionConfig()
@:{
@:ConfigId = dbLink.Id,
@:DbType = _dataBaseService.ToDbType(dbLink.DbType),
@:ConnectionString = _dataBaseService.ToConnectionString(dbLink),
@:InitKeyType = InitKeyType.Attribute,
@:IsAutoCloseConnection = true
@:});
@:_db.ChangeDatabase(dbLink.Id);
}
@:var entity = await _db.Queryable<@(@Model.MainTable)Entity>().FirstAsync(p => p.@Model.PrimaryKey == id);
@:var output = entity.Adapt<@(@Model.MainTable)InfoOutput>();
@foreach (var table in Model.TableRelations){
@:
@:var @(@table.LowerTableName)List = await _db.Queryable<@(@table.TableName)Entity>().Where(w => w.@(@table.TableField) == entity.@(@table.RelationField)).ToListAsync();
@:output.@(@table.LowerTableName)List = @(@table.LowerTableName)List.Adapt>();
}
@:return output;
@:}
}
else if(@item.FullName == "add"){
@:
@:///
@:/// 新建@(@Model.BusName)
@:///
@:/// 参数
@:///
@:[HttpPost("")]
@:public async Task Create([FromBody] @(@Model.MainTable)CrInput input)
@:{
@if(Model.DbLinkId != "0")
{
@:var dbLink = await _dbLinkService.GetInfo("@(@Model.DbLinkId)");
@:_db.AddConnection(new ConnectionConfig()
@:{
@:ConfigId = dbLink.Id,
@:DbType = _dataBaseService.ToDbType(dbLink.DbType),
@:ConnectionString = _dataBaseService.ToConnectionString(dbLink),
@:InitKeyType = InitKeyType.Attribute,
@:IsAutoCloseConnection = true
@:});
@:_db.ChangeDatabase(dbLink.Id);
}
@:var userInfo = await _userManager.GetUserInfo();
if(@Model.TableRelations.Count == 0){
@:var entity = input.Adapt<@(@Model.MainTable)Entity>();
@:entity.@(@Model.PrimaryKey) = YitIdHelper.NextId().ToString();
@foreach(var column in Model.TableField){
@if(column.NCCKey == "createTime"){
@:entity.@column.ColumnName = DateTime.Now;
}
else if(column.NCCKey == "createUser"){
@:entity.@column.ColumnName = _userManager.UserId;
}
else if(column.NCCKey == "currPosition")
{
@:entity.@column.ColumnName = userInfo.positionIds.FirstOrDefault() != null ? userInfo.positionIds.FirstOrDefault().id : null;
}
else if(column.NCCKey == "currOrganize")
{
@:entity.@column.ColumnName = userInfo.organizeId;
}
else if(column.NCCKey == "billRule")
{
@:entity.@(@column.ColumnName) = await _billRuleService.GetBillNumber("@(@column.Rule)");
}
}
@:var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
@:if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
}else{
@:var entity = input.Adapt<@(@Model.MainTable)Entity>();
@:entity.@(@Model.PrimaryKey) = YitIdHelper.NextId().ToString();
@foreach(var column in Model.TableField){
if(@column.NCCKey == "createTime"){
@:entity.@column.ColumnName = DateTime.Now;
}
else if(@column.NCCKey == "createUser"){
@:entity.@column.ColumnName = _userManager.UserId;
}
else if(column.NCCKey == "currPosition")
{
@:entity.@column.ColumnName = userInfo.positionIds.FirstOrDefault() != null ? userInfo.positionIds.FirstOrDefault().id : null;
}
else if(column.NCCKey == "currOrganize")
{
@:entity.@column.ColumnName = userInfo.organizeId;
}
else if(column.NCCKey == "billRule")
{
@:entity.@(@column.ColumnName) = await _billRuleService.GetBillNumber("@(@column.Rule)");
}
}
@:try
@:{
@://开启事务
@:_db.BeginTran();
@:
@://新增@(@Model.BusName)记录
@:var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
@foreach(var table in Model.TableRelations){
@:
@:var @(@table.LowerTableName)EntityList = input.@(@table.LowerTableName)List.Adapt>();
@:if(@(@table.LowerTableName)EntityList != null)
@:{
@:foreach (var item in @(@table.LowerTableName)EntityList)
@:{
@:item.@(@table.PrimaryKey) = YitIdHelper.NextId().ToString();
@:item.@(@table.TableField) = newEntity.@(@table.RelationField);
@foreach(var childer in table.ChilderColumnConfigList)
{
@if(childer.NCCKey == "billRule")
{
@:item.@(childer.ColumnName) = await _billRuleService.GetBillNumber("@(@childer.Rule)");
}
}
@:}
@:await _db.Insertable(@(@table.LowerTableName)EntityList).ExecuteCommandAsync();
@:}
}
@:
@://关闭事务
@:_db.CommitTran();
@:}
@:catch (Exception)
@:{
@://回滚事务
@:_db.RollbackTran();
@:throw NCCException.Oh(ErrorCode.COM1000);
@:}
}
@:}
}
else if(@item.FullName == "edit"){
@:
@:///
@:/// 更新@(@Model.BusName)
@:///
@:/// 主键
@:/// 参数
@:///
@:[HttpPut("{id}")]
@:public async Task Update(string id, [FromBody] @(@Model.MainTable)UpInput input)
@:{
@if(Model.DbLinkId != "0")
{
@:var dbLink = await _dbLinkService.GetInfo("@(@Model.DbLinkId)");
@:_db.AddConnection(new ConnectionConfig()
@:{
@:ConfigId = dbLink.Id,
@:DbType = _dataBaseService.ToDbType(dbLink.DbType),
@:ConnectionString = _dataBaseService.ToConnectionString(dbLink),
@:InitKeyType = InitKeyType.Attribute,
@:IsAutoCloseConnection = true
@:});
@:_db.ChangeDatabase(dbLink.Id);
}
if(@Model.TableRelations.Count == 0){
@:var entity = input.Adapt<@(@Model.MainTable)Entity>();
@foreach(var column in Model.TableField){
if(@column.NCCKey == "modifyTime"){
@:entity.@column.ColumnName = DateTime.Now;
}
else if(@column.NCCKey == "modifyUser"){
@:entity.@column.ColumnName = _userManager.UserId;
}
}
@:var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
@:if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
}else{
@:var entity = input.Adapt<@(@Model.MainTable)Entity>();
@foreach(var column in Model.TableField){
if(@column.NCCKey == "modifyTime"){
@:entity.@column.ColumnName = DateTime.Now;
}
else if(@column.NCCKey == "modifyUser"){
@:entity.@column.ColumnName = _userManager.UserId;
}
}
@:try
@:{
@://开启事务
@:_db.BeginTran();
@:
@://更新@(@Model.BusName)记录
@:await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
@foreach(var table in Model.TableRelations){
@:
@://清空原有数据
@:await _db.Deleteable<@(@table.TableName)Entity>().Where(u => u.@(@table.TableField) == id).ExecuteCommandAsync();
@://新增新数据
@:var @(@table.LowerTableName)EntityList = input.@(@table.LowerTableName)List.Adapt>();
@:if(@(@table.LowerTableName)EntityList != null)
@:{
@:foreach (var item in @(@table.LowerTableName)EntityList)
@:{
@:item.@(@table.PrimaryKey) = YitIdHelper.NextId().ToString();
@:item.@(@table.TableField) = entity.@(@table.RelationField);
@foreach(var childer in table.ChilderColumnConfigList)
{
@if(childer.NCCKey == "billRule")
{
@:item.@(childer.ColumnName) = await _billRuleService.GetBillNumber("@(@childer.Rule)");
}
}
@:}
@:await _db.Insertable(@(@table.LowerTableName)EntityList).ExecuteCommandAsync();
@:}
}
@:
@://关闭事务
@:_db.CommitTran();
@:}
@:catch (Exception)
@:{
@://回滚事务
@:_db.RollbackTran();
@:throw NCCException.Oh(ErrorCode.COM1001);
@:}
}
@:}
}
else if(@item.FullName=="remove"){
@:
@:///
@:/// 删除@(@Model.BusName)
@:///
@:///
@:[HttpDelete("{id}")]
@:public async Task Delete(string id)
@:{
@if(Model.DbLinkId != "0")
{
@:var dbLink = await _dbLinkService.GetInfo("@(@Model.DbLinkId)");
@:_db.AddConnection(new ConnectionConfig()
@:{
@:ConfigId = dbLink.Id,
@:DbType = _dataBaseService.ToDbType(dbLink.DbType),
@:ConnectionString = _dataBaseService.ToConnectionString(dbLink),
@:InitKeyType = InitKeyType.Attribute,
@:IsAutoCloseConnection = true
@:});
@:_db.ChangeDatabase(dbLink.Id);
}
if(@Model.TableRelations.Count == 0){
@:var entity = await _db.Queryable<@(@Model.MainTable)Entity>().FirstAsync(p => p.@Model.PrimaryKey == id);
@:_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
@:var isOk = await _db.Deleteable<@(@Model.MainTable)Entity>().Where(d => d.@(@Model.PrimaryKey) == id).ExecuteCommandAsync();
@:if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
}
else
{
@:var entity = await _db.Queryable<@(@Model.MainTable)Entity>().FirstAsync(p => p.@Model.PrimaryKey == id);
@:_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
@:try
@:{
@://开启事务
@:_db.BeginTran();
@:
@://删除@(@Model.BusName)记录
@:await _db.Deleteable<@(@Model.MainTable)Entity>().Where(d => d.@(@Model.PrimaryKey) == id).ExecuteCommandAsync();
@foreach(var table in Model.TableRelations){
@:
@://清空子表数据
@:await _db.Deleteable<@(@table.TableName)Entity>().Where(u => u.@(@table.TableField) == id).ExecuteCommandAsync();
}
@:
@://关闭事务
@:_db.CommitTran();
@:}
@:catch (Exception)
@:{
@://回滚事务
@:_db.RollbackTran();
@:throw NCCException.Oh(ErrorCode.COM1002);
@:}
}
@:}
}
else if(@item.FullName=="page"){
@:
@:///
@:/// 获取@(@Model.BusName)列表
@:///
@:/// 请求参数
@:///
@if(@item.IsInterface)
{
@:[HttpGet("")]
}
else
{
@:[NonAction]
}
@:public async Task GetList([FromQuery] @(@Model.MainTable)ListQueryInput input)
@:{
@if(Model.DbLinkId != "0")
{
@:var dbLink = await _dbLinkService.GetInfo("@(@Model.DbLinkId)");
@:_db.AddConnection(new ConnectionConfig()
@:{
@:ConfigId = dbLink.Id,
@:DbType = _dataBaseService.ToDbType(dbLink.DbType),
@:ConnectionString = _dataBaseService.ToConnectionString(dbLink),
@:InitKeyType = InitKeyType.Attribute,
@:IsAutoCloseConnection = true
@:});
@:_db.ChangeDatabase(dbLink.Id);
}
@if(Model.useDataPermission)
{
@:var authorizeWhere = new List();
@://数据权限过滤
@:if (_userManager.User.IsAdministrator == 0)
@:{
@:authorizeWhere = _authorizeService.GetCondition<@(@Model.MainTable)ListOutput>("");
@:}
}
@:var sidx = input.sidx == null ? "@(Model.DefaultSidx)" : input.sidx;
@foreach(var table in Model.TableField){
@if(table.NCCKey == "address" || table.NCCKey == "cascader")
{
@:var @(@table.LowerColumnName)List = input.@(@table.LowerColumnName) != null ? input.@(@table.LowerColumnName).Split(',').ToList().ToJson() :null;
}
if(@table.QueryWhether && @table.QueryType == 3){
switch(@table.NCCKey){
case "time":
@:List query@(@table.ColumnName) = input.@(@table.LowerColumnName) != null ? input.@(@table.LowerColumnName).Split(',').ToObeject>() : null;
@:var start@(@table.ColumnName) = query@(@table.ColumnName) != null ? query@(@table.ColumnName).First() : null;
@:var end@(@table.ColumnName) = query@(@table.ColumnName) != null ? query@(@table.ColumnName).Last() : null;
break;
case "numInput":
@:List