using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Mapster; using Microsoft.AspNetCore.Mvc; using NCC.ClayObject; using NCC.Common.Configuration; using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Filter; using NCC.Common.Helper; using NCC.Common.Model.NPOI; using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.LqHytkHytk; using NCC.Extend.Entitys.Dto.LqHytkJksyj; using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; using NCC.Extend.Entitys.Dto.LqHytkMx; using NCC.Extend.Entitys.lq_hytk_hytk; using NCC.Extend.Entitys.lq_hytk_jksyj; using NCC.Extend.Entitys.lq_hytk_kjbsyj; using NCC.Extend.Entitys.lq_hytk_mx; using NCC.Extend.Interfaces.LqHytkHytk; using NCC.FriendlyException; using NCC.JsonSerialization; using SqlSugar; using Yitter.IdGenerator; namespace NCC.Extend.LqHytkHytk { /// /// 退卡_信息表服务 /// [ApiDescriptionSettings(Tag = "绿纤退卡信息表服务", Name = "LqHytkHytk", Order = 200)] [Route("api/Extend/[controller]")] public class LqHytkHytkService : ILqHytkHytkService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _lqHytkHytkRepository; private readonly ISqlSugarRepository _lqHytkMxRepository; private readonly ISqlSugarRepository _lqHytkJksyjRepository; private readonly ISqlSugarRepository _lqHytkKjbsyjRepository; private readonly SqlSugarScope _db; private readonly IUserManager _userManager; /// /// 初始化一个类型的新实例 /// public LqHytkHytkService( ISqlSugarRepository lqHytkHytkRepository, ISqlSugarRepository lqHytkMxRepository, ISqlSugarRepository lqHytkJksyjRepository, ISqlSugarRepository lqHytkKjbsyjRepository, IUserManager userManager ) { _lqHytkHytkRepository = lqHytkHytkRepository; _lqHytkMxRepository = lqHytkMxRepository; _lqHytkJksyjRepository = lqHytkJksyjRepository; _lqHytkKjbsyjRepository = lqHytkKjbsyjRepository; _db = _lqHytkHytkRepository.Context; _userManager = userManager; } #region 获取退卡信息列表 /// /// 获取退卡信息列表 /// /// 查询参数 /// [HttpGet("")] public async Task GetList([FromQuery] LqHytkHytkListQueryInput input) { var sidx = input.sidx == null ? "id" : input.sidx; List queryTksj = input.tksj != null ? input.tksj.Split(',').ToObeject>() : null; DateTime? startTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.First()) : null; DateTime? endTksj = queryTksj != null ? Ext.GetDateTime(queryTksj.Last()) : null; var data = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) .WhereIF(!string.IsNullOrEmpty(input.md), p => p.Md.Equals(input.md)) .WhereIF(!string.IsNullOrEmpty(input.mdbh), p => p.Mdbh.Contains(input.mdbh)) .WhereIF(!string.IsNullOrEmpty(input.mdmc), p => p.Mdmc.Contains(input.mdmc)) .WhereIF(!string.IsNullOrEmpty(input.hy), p => p.Hy.Equals(input.hy)) .WhereIF(!string.IsNullOrEmpty(input.hymc), p => p.Hymc.Contains(input.hymc)) .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh)) .WhereIF(!string.IsNullOrEmpty(input.gklx), p => p.Gklx.Contains(input.gklx)) .WhereIF(input.tkje.HasValue, p => p.Tkje == input.tkje) .WhereIF(input.sgfy.HasValue, p => p.Sgfy == input.sgfy) .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) .WhereIF(!string.IsNullOrEmpty(input.tkzt), p => p.Tkzt.Contains(input.tkzt)) .WhereIF(!string.IsNullOrEmpty(input.tkyy), p => p.Tkyy.Contains(input.tkyy)) .WhereIF(!string.IsNullOrEmpty(input.fileUrl), p => p.FileUrl.Contains(input.fileUrl)) .WhereIF(queryTksj != null, p => p.Tksj >= new DateTime(startTksj.ToDate().Year, startTksj.ToDate().Month, startTksj.ToDate().Day, 0, 0, 0)) .WhereIF(queryTksj != null, p => p.Tksj <= new DateTime(endTksj.ToDate().Year, endTksj.ToDate().Month, endTksj.ToDate().Day, 23, 59, 59)) .WhereIF(!string.IsNullOrEmpty(input.czry), p => p.Czry.Equals(input.czry)) .Select(it => new LqHytkHytkListOutput { id = it.Id, md = it.Md, mdbh = it.Mdbh, mdmc = it.Mdmc, hy = it.Hy, hymc = it.Hymc, hyzh = it.Hyzh, gklx = it.Gklx, tkje = it.Tkje, sgfy = it.Sgfy, bz = it.Bz, tkzt = it.Tkzt, tkyy = it.Tkyy, tksj = it.Tksj, czry = it.Czry, fileUrl = it.FileUrl, }) .MergeTable() .OrderBy(sidx + " " + input.sort) .ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } #endregion #region 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 创建退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// /// 创建退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 示例请求: /// ```json /// { /// "md": "门店ID", /// "mdbh": "门店编号", /// "mdmc": "门店名称", /// "hy": "会员ID", /// "hymc": "会员姓名", /// "hyzh": "会员账号", /// "gklx": "顾客类型", /// "tkje": 1000.00, /// "sgfy": 50.00, /// "bz": "备注", /// "tkzt": "退卡状态", /// "tkyy": "退卡原因", /// "lqHytkMxList": [ /// { /// "px": "品项编号", /// "pxmc": "品项名称", /// "pxjg": 100.00, /// "tkje": 100.00, /// "F_ProjectNumber": 1, /// "F_SourceType": "来源类型", /// "F_TotalPrice": 100.00, /// "lqHytkJksyjList": [ /// { /// "jks": "健康师", /// "jksxm": "健康师姓名", /// "jkszh": "健康师账号", /// "jksyj": 50.00, /// "F_jsjid": "金三角ID", /// "F_tkpxid": "项目资料ID", /// "F_LaborCost": 10.00, /// "F_tkpxNumber": 1 /// } /// ], /// "lqHytkKjbsyjList": [ /// { /// "kjbls": "科技部老师", /// "kjblsxm": "科技部老师姓名", /// "kjblszh": "科技部老师账号", /// "kjblsyj": 30.00, /// "F_tkpxid": "项目资料ID", /// "F_LaborCost": 5.00, /// "F_tkpxNumber": 1 /// } /// ] /// } /// ] /// } /// ``` /// /// 参数说明: /// - md: 门店ID /// - hy: 会员ID /// - lqHytkMxList: 退卡品项明细列表 /// /// 退卡创建参数 /// 无返回值 /// 创建成功 /// 参数错误或数据验证失败 /// 服务器内部错误 [HttpPost("")] public async Task Create([FromBody] LqHytkHytkCrInput input) { var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); entity.F_CreateTime = DateTime.Now; entity.F_CreateUser = userInfo.userId; entity.F_DeleteMark = 0; entity.Czry = userInfo.userId; try { // 开启事务 _db.BeginTran(); // 新增退卡主表记录 var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync(); // 收集所有需要插入的实体,然后批量插入 var allMxEntities = new List(); var allJksyjEntities = new List(); var allKjbsyjEntities = new List(); // 处理品项明细列表 if (input.lqHytkMxList != null && input.lqHytkMxList.Any()) { foreach (var item in input.lqHytkMxList) { // 创建品项明细实体 var lqHytkMxEntity = new LqHytkMxEntity { Id = YitIdHelper.NextId().ToString(), RefundInfoId = newEntity.Id, BillingItemId = item.billingItemId, CreateTime = DateTime.Now, CreateUser = userInfo.userId, DeleteMark = 0, Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, Tkje = item.tkje, ProjectNumber = item.F_ProjectNumber ?? 1, IsEnabled = item.F_IsEnabled ?? 1, SourceType = item.F_SourceType, TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), }; allMxEntities.Add(lqHytkMxEntity); // 收集该品项关联的健康师业绩 if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any()) { foreach (var ijks_tem in item.lqHytkJksyjList) { allJksyjEntities.Add( new LqHytkJksyjEntity { Id = YitIdHelper.NextId().ToString(), Gltkbh = newEntity.Id, Jks = ijks_tem.jks, Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, Tksj = DateTime.Now, F_jsjid = ijks_tem.F_jsjid, F_tkpxid = ijks_tem.F_tkpxid, F_LaborCost = ijks_tem.F_LaborCost, F_tkpxNumber = ijks_tem.F_tkpxNumber, F_CreateTime = DateTime.Now, F_CreateUser = userInfo.userId, F_DeleteMark = 0, CardReturn = lqHytkMxEntity.Id, } ); } } // 收集该品项关联的科技部老师业绩 if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any()) { foreach (var ikjbs_tem in item.lqHytkKjbsyjList) { allKjbsyjEntities.Add( new LqHytkKjbsyjEntity { Id = YitIdHelper.NextId().ToString(), Gltkbh = newEntity.Id, Kjbls = ikjbs_tem.kjbls, Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, Tksj = DateTime.Now, F_tkpxid = ikjbs_tem.F_tkpxid, F_LaborCost = ikjbs_tem.F_LaborCost, F_tkpxNumber = ikjbs_tem.F_tkpxNumber, F_CreateTime = DateTime.Now, F_CreateUser = userInfo.userId, F_DeleteMark = 0, CardReturn = lqHytkMxEntity.Id, } ); } } } } // 批量插入品项明细 if (allMxEntities.Any()) { await _db.Insertable(allMxEntities).ExecuteCommandAsync(); } // 批量插入健康师业绩 if (allJksyjEntities.Any()) { await _db.Insertable(allJksyjEntities).ExecuteCommandAsync(); } // 批量插入科技部老师业绩 if (allKjbsyjEntities.Any()) { await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); } // 关闭事务 _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } #endregion #region 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 更新退卡信息及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// /// 更新退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// 先删除原有的关联数据,再插入新的数据 /// /// 退卡ID /// 退卡更新参数 /// 无返回值 /// 更新成功 /// 参数错误或数据验证失败 /// 服务器内部错误 [HttpPut("{id}")] public async Task Update(string id, [FromBody] LqHytkHytkUpInput input) { var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); entity.Id = id; entity.F_ModifyTime = DateTime.Now; entity.F_ModifyUser = userInfo.userId; try { // 开启事务 _db.BeginTran(); // 更新退卡主表记录 await _db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync(); // 删除原有的关联数据 await _db.Deleteable().Where(x => x.RefundInfoId == id).ExecuteCommandAsync(); await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); await _db.Deleteable().Where(x => x.Gltkbh == id).ExecuteCommandAsync(); // 收集所有需要插入的实体,然后批量插入 var allMxEntities = new List(); var allJksyjEntities = new List(); var allKjbsyjEntities = new List(); // 处理品项明细列表 if (input.lqHytkMxList != null && input.lqHytkMxList.Any()) { foreach (var item in input.lqHytkMxList) { // 创建品项明细实体 var lqHytkMxEntity = new LqHytkMxEntity { Id = YitIdHelper.NextId().ToString(), RefundInfoId = id, BillingItemId = item.billingItemId, CreateTime = DateTime.Now, CreateUser = userInfo.userId, DeleteMark = 0, Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, Tkje = item.tkje, ProjectNumber = item.F_ProjectNumber ?? 1, IsEnabled = item.F_IsEnabled ?? 1, SourceType = item.F_SourceType, TotalPrice = item.F_TotalPrice ?? (item.pxjg * (item.F_ProjectNumber ?? 1)), }; allMxEntities.Add(lqHytkMxEntity); // 收集该品项关联的健康师业绩 if (item.lqHytkJksyjList != null && item.lqHytkJksyjList.Any()) { foreach (var ijks_tem in item.lqHytkJksyjList) { allJksyjEntities.Add( new LqHytkJksyjEntity { Id = YitIdHelper.NextId().ToString(), Gltkbh = id, Jks = ijks_tem.jks, Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, Tksj = DateTime.Now, F_jsjid = ijks_tem.F_jsjid, F_tkpxid = ijks_tem.F_tkpxid, F_LaborCost = ijks_tem.F_LaborCost, F_tkpxNumber = ijks_tem.F_tkpxNumber, F_CreateTime = DateTime.Now, F_CreateUser = userInfo.userId, F_DeleteMark = 0, } ); } } // 收集该品项关联的科技部老师业绩 if (item.lqHytkKjbsyjList != null && item.lqHytkKjbsyjList.Any()) { foreach (var ikjbs_tem in item.lqHytkKjbsyjList) { allKjbsyjEntities.Add( new LqHytkKjbsyjEntity { Id = YitIdHelper.NextId().ToString(), Gltkbh = id, Kjbls = ikjbs_tem.kjbls, Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, Tksj = DateTime.Now, F_tkpxid = ikjbs_tem.F_tkpxid, F_LaborCost = ikjbs_tem.F_LaborCost, F_tkpxNumber = ikjbs_tem.F_tkpxNumber, F_CreateTime = DateTime.Now, F_CreateUser = userInfo.userId, F_DeleteMark = 0, } ); } } } } // 批量插入品项明细 if (allMxEntities.Any()) { await _db.Insertable(allMxEntities).ExecuteCommandAsync(); } // 批量插入健康师业绩 if (allJksyjEntities.Any()) { await _db.Insertable(allJksyjEntities).ExecuteCommandAsync(); } // 批量插入科技部老师业绩 if (allKjbsyjEntities.Any()) { await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); } // 关闭事务 _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1005, ex.Message); } } #endregion #region 删除退卡信息 /// /// 删除退卡信息 /// /// 主键 /// [HttpDelete("{id}")] public async Task Delete(string id) { var entity = await _db.Queryable().FirstAsync(p => p.Id == id); if (entity != null) { entity.F_DeleteMark = 1; await _lqHytkHytkRepository.UpdateAsync(entity); } } #endregion #region 获取退卡信息详情 /// /// 获取退卡信息详情 /// /// /// 获取退卡记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// 按照退卡的完整格式返回数据,不包含汇总信息 /// /// 返回数据结构: /// - 主表信息:退卡基础信息、门店信息、会员信息、退卡金额等 /// - 品项明细列表:每个品项包含完整的项目信息(项目次数、是否有效、来源类型等) /// - 健康师业绩列表:按品项关联的健康师业绩信息 /// - 科技部老师业绩列表:按品项关联的科技部老师业绩信息 /// /// 退卡记录主键ID /// 退卡记录完整信息 /// 查询成功 /// 退卡记录不存在 /// 服务器内部错误 [HttpGet("{id}")] public async Task GetInfo(string id) { try { // 1. 查询主表信息 var entity = await _db.Queryable().FirstAsync(p => p.Id == id); if (entity == null) { throw NCCException.Oh(ErrorCode.COM1005, "退卡记录不存在"); } var output = entity.Adapt(); // 2. 查询品项明细列表 var lqHytkMxList = await _db.Queryable().Where(w => w.RefundInfoId == entity.Id).ToListAsync(); // 3. 查询健康师业绩列表 var lqHytkJksyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); // 4. 查询科技部老师业绩列表 var lqHytkKjbsyjList = await _db.Queryable().Where(w => w.Gltkbh == entity.Id).ToListAsync(); // 5. 构建品项明细输出,每个品项关联对应的业绩信息 var mxOutputList = new List(); foreach (var mx in lqHytkMxList) { var mxOutput = new LqHytkMxInfoOutput { id = mx.Id, refundInfoId = mx.RefundInfoId, billingItemId = mx.BillingItemId, px = mx.Px, pxmc = mx.Pxmc, pxjg = mx.Pxjg, tkje = mx.Tkje, projectNumber = mx.ProjectNumber, isEnabled = mx.IsEnabled, sourceType = mx.SourceType, totalPrice = mx.TotalPrice, }; // 关联该品项的健康师业绩 var jksyjForMx = lqHytkJksyjList.Where(j => j.CardReturn == mx.Id).ToList(); mxOutput.lqHytkJksyjList = jksyjForMx.Adapt>(); // 关联该品项的科技部老师业绩 var kjbsyjForMx = lqHytkKjbsyjList.Where(k => k.CardReturn == mx.Id).ToList(); mxOutput.lqHytkKjbsyjList = kjbsyjForMx.Adapt>(); mxOutputList.Add(mxOutput); } // 6. 设置输出结果 output.lqHytkMxList = mxOutputList; // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩) output.lqHytkJksyjList = lqHytkJksyjList.Adapt>(); output.lqHytkKjbsyjList = lqHytkKjbsyjList.Adapt>(); return output; } catch (Exception) { throw NCCException.Oh(ErrorCode.COM1000, "获取退卡记录失败"); } } #endregion } }