using Mapster; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NCC.Common.Core.Manager; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.LqZjlMdsmxsz; using NCC.Extend.Entitys.Entity.lq_zjl_mdsmxsz; using NCC.Extend.Interfaces.LqZjlMdsmxsz; using NCC.System.Entitys.Permission; using NCC.Extend.Entitys.lq_mdxx; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Yitter.IdGenerator; using NCC.Common.Filter; using NCC.Common.Enum; using NCC.FriendlyException; namespace NCC.Extend { /// /// 事业部总经理门店生命线设置服务 /// [ApiDescriptionSettings(Tag = "事业部总经理门店生命线设置服务(已废弃)", Name = "LqZjlMdsmxsz", Order = 200)] [Route("api/Extend/[controller]")] public class LqZjlMdsmxszService : ILqZjlMdsmxszService, ITransient, IDynamicApiController { private readonly ISqlSugarClient _db; private readonly IUserManager _userManager; private readonly IHttpContextAccessor _httpContextAccessor; /// /// 构造函数 /// /// 数据库上下文 /// 用户管理器 /// HTTP上下文访问器 public LqZjlMdsmxszService( ISqlSugarClient db, IUserManager userManager, IHttpContextAccessor httpContextAccessor) { _db = db; _userManager = userManager; _httpContextAccessor = httpContextAccessor; } #region 根据总经理用户ID查询相关设置信息 /// /// 根据总经理用户ID查询相关设置信息 /// /// /// 根据总经理用户ID查询其管理的所有门店的生命线设置信息 /// /// 示例请求: /// GET /api/Extend/LqZjlMdsmxsz/GetByZjlUserid?zjlUserid=zjl001 /// /// 业务逻辑: /// 1. 根据总经理用户ID查询生命线设置记录 /// 2. 关联门店表获取门店详细信息 /// 3. 关联用户表获取总经理姓名 /// 4. 返回完整的设置信息列表 /// /// 总经理用户ID /// 总经理门店生命线设置列表 /// 成功返回设置列表 /// 参数错误 /// 服务器内部错误 [HttpGet("GetByZjlUserid")] public async Task GetByZjlUserid(string zjlUserid) { if (string.IsNullOrEmpty(zjlUserid)) { return new { list = new List() }; } var result = await _db.Queryable() .LeftJoin((smx, u) => smx.ZjlUserid == u.Id) .LeftJoin((smx, u, md) => smx.MdId == md.Id) .Where((smx, u, md) => smx.ZjlUserid == zjlUserid && smx.Deletemark == 0) .Select((smx, u, md) => new LqZjlMdsmxszListOutput { Id = smx.Id, ZjlUserid = smx.ZjlUserid, ZjlName = u.RealName, MdId = smx.MdId, Mdbm = md.Mdbm, Dm = md.Dm, Smx1 = smx.Smx1, Tcbl1 = smx.Tcbl1, Smx2 = smx.Smx2, Tcbl2 = smx.Tcbl2, Smx3 = smx.Smx3, Tcbl3 = smx.Tcbl3, Bz = smx.Bz, Cjsj = smx.Cjsj, Cjry = smx.Cjry, Xgsj = smx.Xgsj, Xgly = smx.Xgly }) .ToListAsync(); return new { list = result }; } #endregion #region 批量创建事业部总经理门店生命线设置 /// /// 批量创建事业部总经理门店生命线设置 /// /// /// 为指定总经理批量创建多个门店的生命线设置 /// /// 示例请求: /// ```json /// POST /api/Extend/LqZjlMdsmxsz/BatchCreate /// { /// "zjlUserid": "zjl001", /// "items": [ /// { /// "mdId": "md001", /// "smx1": 100000.00, /// "tcbBl": 3.50, /// "bz": "门店A生命线设置" /// }, /// { /// "mdId": "md002", /// "smx1": 150000.00, /// "tcbBl": 4.00, /// "bz": "门店B生命线设置" /// } /// ] /// } /// ``` /// /// 业务逻辑: /// 1. 验证总经理用户ID是否存在 /// 2. 验证门店ID是否有效 /// 3. 检查是否已存在相同的设置记录 /// 4. 批量插入新的设置记录 /// 5. 返回创建结果 /// /// 批量创建输入参数 /// 创建结果 /// 成功创建设置记录 /// 参数验证失败 /// 存在重复记录 /// 服务器内部错误 [HttpPost("BatchCreate")] public async Task BatchCreate(LqZjlMdsmxszBatchCreateInput input) { // 验证总经理用户是否存在 var userExists = await _db.Queryable() .Where(x => x.Id == input.ZjlUserid && x.DeleteMark == null) .AnyAsync(); if (!userExists) { return new { success = false, message = "总经理用户不存在" }; } // 验证门店ID是否有效 var mdIds = input.Items.Select(x => x.MdId).ToList(); var validMdIds = await _db.Queryable() .Where(x => mdIds.Contains(x.Id)) .Select(x => x.Id) .ToListAsync(); var invalidMdIds = mdIds.Except(validMdIds).ToList(); if (invalidMdIds.Any()) { return new { success = false, message = $"以下门店ID不存在: {string.Join(", ", invalidMdIds)}" }; } // 处理每个门店设置(支持新增和修改) var currentTime = DateTime.Now; var currentUser = _userManager.User?.Id ?? "system"; var addCount = 0; var updateCount = 0; foreach (var item in input.Items) { // 检查是否已存在 var existing = await _db.Queryable() .Where(x => x.ZjlUserid == input.ZjlUserid && x.MdId == item.MdId && x.Deletemark == 0) .FirstAsync(); if (existing != null) { // 更新现有记录 existing.Smx1 = item.Smx1; existing.Tcbl1 = item.Tcbl1; existing.Smx2 = item.Smx2; existing.Tcbl2 = item.Tcbl2; existing.Smx3 = item.Smx3; existing.Tcbl3 = item.Tcbl3; existing.Bz = item.Bz; existing.Xgsj = currentTime; existing.Xgly = currentUser; await _db.Updateable(existing).ExecuteCommandAsync(); updateCount++; } else { // 新增记录 var entity = new LqZjlMdsmxszEntity { Id = YitIdHelper.NextId().ToString(), ZjlUserid = input.ZjlUserid, MdId = item.MdId, Smx1 = item.Smx1, Tcbl1 = item.Tcbl1, Smx2 = item.Smx2, Tcbl2 = item.Tcbl2, Smx3 = item.Smx3, Tcbl3 = item.Tcbl3, Bz = item.Bz, Cjsj = currentTime, Cjry = currentUser, Deletemark = 0 }; await _db.Insertable(entity).ExecuteCommandAsync(); addCount++; } } return new { success = true, message = "设置成功", addCount = addCount, updateCount = updateCount, totalCount = addCount + updateCount }; } #endregion #region 获取总经理所在组织能管理的门店 /// /// 获取总经理所在组织能管理的门店 /// /// /// 根据总经理的组织权限,获取其能管理的所有门店列表 /// /// 示例请求: /// GET /api/Extend/LqZjlTcsz/ManagedStores /// /// 业务逻辑: /// 2. 根据用户组织ID获取下属组织列表 /// 3. 根据组织权限过滤门店数据 /// 4. 返回门店基本信息列表 /// /// 总经理能管理的门店列表 /// 成功返回门店列表 /// 未授权访问 /// 服务器内部错误 [HttpGet("ManagedStores/{userid}")] public async Task GetManagedStores(string userid) { var userOrganizeId = await _db.Queryable().Where(x => x.Id == userid && x.DeleteMark == null).Select(x => x.OrganizeId).FirstAsync(); // 根据组织权限获取门店 var stores = await _db.Queryable() .Where(s => s.Syb == userOrganizeId || s.Jyb == userOrganizeId || s.Kjb == userOrganizeId || s.Dxmb == userOrganizeId) .ToListAsync(); return new { list = stores }; } #endregion #region 分页查询 /// /// 获取所有总经理门店生命线设置数据(分页查询) /// /// 查询输入参数 /// 分页数据 [HttpGet("GetPageList")] public async Task GetPageList([FromQuery] LqZjlMdsmxszListQueryInput input) { var sidx = input.sidx == null ? "id" : input.sidx; var data = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.ZjlUserid), p => p.ZjlUserid.Contains(input.ZjlUserid)) .WhereIF(!string.IsNullOrEmpty(input.MdId), p => p.MdId.Contains(input.MdId)) .Select(it => new LqZjlMdsmxszListOutput { Id = it.Id, ZjlUserid = it.ZjlUserid, ZjlName = SqlFunc.Subqueryable().Where(x => x.Id == it.ZjlUserid).Select(x => x.RealName), MdId = it.MdId, Mdbm = SqlFunc.Subqueryable().Where(x => x.Id == it.MdId).Select(x => x.Mdbm), Dm = SqlFunc.Subqueryable().Where(x => x.Id == it.MdId).Select(x => x.Dm), Smx1 = it.Smx1, Tcbl1 = it.Tcbl1, Smx2 = it.Smx2, Tcbl2 = it.Tcbl2, Smx3 = it.Smx3, Tcbl3 = it.Tcbl3, Bz = it.Bz, Cjsj = it.Cjsj, Cjry = it.Cjry, Xgsj = it.Xgsj, Xgly = it.Xgly }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } #endregion #region 更新总经理门店生命线设置 /// /// 更新总经理门店生命线设置 /// [HttpPut("{id}")] public async Task Update(string id, [FromBody] LqZjlMdsmxszUpInput input) { var entity = await _db.Queryable() .Where(x => x.Id == id && x.Deletemark == 0) .FirstAsync(); if (entity == null) { throw NCCException.Oh(ErrorCode.COM1001); } // 更新字段 entity.Smx1 = input.Smx1; entity.Tcbl1 = input.Tcbl1; entity.Smx2 = input.Smx2; entity.Tcbl2 = input.Tcbl2; entity.Smx3 = input.Smx3; entity.Tcbl3 = input.Tcbl3; entity.Bz = input.Bz; entity.Xgsj = DateTime.Now; entity.Xgly = _userManager.User?.Id ?? "admin"; var isOk = await _db.Updateable(entity).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); } #endregion } }