using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; 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.Common; using NCC.Extend.Entitys.Dto.LqKdKdjlb; using NCC.Extend.Entitys.Enum; using NCC.Extend.Entitys.lq_jinsanjiao_user; using NCC.Extend.Entitys.lq_kd_deductinfo; using NCC.Extend.Entitys.lq_kd_jksyj; using NCC.Extend.Entitys.lq_kd_kdjlb; using NCC.Extend.Entitys.lq_kd_kjbsyj; using NCC.Extend.Entitys.lq_kd_pxmx; using NCC.Extend.Entitys.lq_khxx; using NCC.Extend.Entitys.lq_xmzl; using NCC.Extend.Interfaces.LqKdKdjlb; using NCC.Extend.Utils; using NCC.FriendlyException; using NCC.JsonSerialization; using NCC.System.Entitys.Permission; using SqlSugar; using Yitter.IdGenerator; namespace NCC.Extend.LqKdKdjlb { /// /// 开单记录表服务 /// [ApiDescriptionSettings(Tag = "绿纤开单记录表服务", Name = "LqKdKdjlb", Order = 200)] [Route("api/Extend/[controller]")] public class LqKdKdjlbService : ILqKdKdjlbService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _lqKdKdjlbRepository; private readonly ISqlSugarRepository _lqKdJksyjRepository; private readonly ISqlSugarRepository _lqKdKjbsyjRepository; private readonly ISqlSugarRepository _lqKdPxmxRepository; private readonly SqlSugarScope _db; private readonly IUserManager _userManager; private readonly WeChatBotService _weChatBotService; private readonly LqKdKdjlbStringGenerator _stringGenerator; /// /// 初始化一个类型的新实例 /// public LqKdKdjlbService( ISqlSugarRepository lqKdKdjlbRepository, ISqlSugarRepository lqKdJksyjRepository, ISqlSugarRepository lqKdKjbsyjRepository, ISqlSugarRepository lqKdPxmxRepository, IUserManager userManager, WeChatBotService weChatBotService, LqKdKdjlbStringGenerator stringGenerator ) { _lqKdKdjlbRepository = lqKdKdjlbRepository; _db = _lqKdKdjlbRepository.Context; _lqKdJksyjRepository = lqKdJksyjRepository; _lqKdKjbsyjRepository = lqKdKjbsyjRepository; _lqKdPxmxRepository = lqKdPxmxRepository; _userManager = userManager; _weChatBotService = weChatBotService; _stringGenerator = stringGenerator; } #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 lqKdPxmxList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); // 3. 查询健康师业绩列表 var lqKdJksyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); // 4. 查询科技部老师业绩列表 var lqKdKjbsyjList = await _db.Queryable().Where(w => w.Glkdbh == entity.Id).ToListAsync(); // 5. 构建品项明细输出,每个品项关联对应的业绩信息 var pxmxOutputList = new List(); foreach (var pxmx in lqKdPxmxList) { var pxmxOutput = new LqKdPxmxInfoOutput { id = pxmx.Id, glkdbh = pxmx.Glkdbh, px = pxmx.Px, pxmc = pxmx.Pxmc, pxjg = pxmx.Pxjg, projectNumber = pxmx.ProjectNumber, isEnabled = pxmx.IsEnabled, sourceType = pxmx.SourceType, memberId = pxmx.MemberId, createTime = pxmx.CreateTIme, totalPrice = pxmx.TotalPrice, actualPrice = pxmx.ActualPrice, }; // 关联该品项的健康师业绩 var jksyjForPx = lqKdJksyjList.Where(j => j.Kdpxid == pxmx.Id).ToList(); pxmxOutput.lqKdJksyjList = jksyjForPx.Adapt>(); // 关联该品项的科技部老师业绩 var kjbsyjForPx = lqKdKjbsyjList.Where(k => k.Kdpxid == pxmx.Id).ToList(); pxmxOutput.lqKdKjbsyjList = kjbsyjForPx.Adapt>(); pxmxOutputList.Add(pxmxOutput); } // 6. 设置输出结果 output.lqKdPxmxList = pxmxOutputList; // 7. 设置全局业绩列表(用于兼容性,但主要使用品项关联的业绩) output.lqKdJksyjList = lqKdJksyjList.Adapt>(); output.lqKdKjbsyjList = lqKdKjbsyjList.Adapt>(); return output; } catch (Exception ex) { Console.WriteLine($"获取开单记录失败: {ex.Message}"); throw NCCException.Oh(ErrorCode.COM1000, "获取开单记录失败"); } } #endregion #region 获取开单记录表列表 /// /// 获取开单记录表列表 /// /// 请求参数 /// [HttpGet("")] public async Task GetList([FromQuery] LqKdKdjlbListQueryInput input) { var sidx = input.sidx == null ? "id" : input.sidx; List queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject>() : null; DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null; DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null; var data = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) .WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Equals(input.djmd)) .WhereIF(!string.IsNullOrEmpty(input.jsj), p => p.Jsj.Equals(input.jsj)) .WhereIF(queryKdrq != null, p => p.Kdrq >= new DateTime(startKdrq.ToDate().Year, startKdrq.ToDate().Month, startKdrq.ToDate().Day, 0, 0, 0)) .WhereIF(queryKdrq != null, p => p.Kdrq <= new DateTime(endKdrq.ToDate().Year, endKdrq.ToDate().Month, endKdrq.ToDate().Day, 23, 59, 59)) .WhereIF(!string.IsNullOrEmpty(input.gjlx), p => p.Gjlx.Equals(input.gjlx)) .WhereIF(!string.IsNullOrEmpty(input.hgjg), p => p.Hgjg.Equals(input.hgjg)) .WhereIF(!string.IsNullOrEmpty(input.zdyj), p => p.Zdyj.Equals(input.zdyj)) .WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj)) .WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk)) .WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs)) .WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs)) .WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy)) .WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd)) .WhereIF(!string.IsNullOrEmpty(input.khly), p => p.Khly.Equals(input.khly)) .WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr)) .WhereIF(!string.IsNullOrEmpty(input.sfskdd), p => p.Sfskdd.Equals(input.sfskdd)) .WhereIF(!string.IsNullOrEmpty(input.jj), p => p.Jj.Contains(input.jj)) .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) .WhereIF(!string.IsNullOrEmpty(input.kdhy), p => p.Kdhy.Equals(input.kdhy)) .WhereIF(!string.IsNullOrEmpty(input.kdhyc), p => p.Kdhyc.Contains(input.kdhyc)) .WhereIF(!string.IsNullOrEmpty(input.kdhysjh), p => p.Kdhysjh.Contains(input.kdhysjh)) .WhereIF(!string.IsNullOrEmpty(input.jksyj), p => p.Jksyj.Contains(input.jksyj)) .WhereIF(!string.IsNullOrEmpty(input.kjblsyj), p => p.Kjblsyj.Contains(input.kjblsyj)) .WhereIF(!string.IsNullOrEmpty(input.pxxx), p => p.Pxxx.Contains(input.pxxx)) .WhereIF(!string.IsNullOrEmpty(input.F_FIleUrl), p => p.F_FIleUrl.Contains(input.F_FIleUrl)) .Select(it => new LqKdKdjlbListOutput { id = it.Id, djmd = it.Djmd, jsj = it.Jsj, kdrq = it.Kdrq, gjlx = it.Gjlx, hgjg = it.Hgjg, zdyj = it.Zdyj, sfyj = it.Sfyj, qk = it.Qk, ckfs = it.Ckfs, fkfs = it.Fkfs, fkyy = it.Fkyy, fkpd = it.Fkpd, khly = it.Khly, tjr = it.Tjr, deductAmount = it.DeductAmount, sfskdd = it.Sfskdd, jj = it.Jj, bz = it.Bz, kdhy = it.Kdhy, kdhyc = it.Kdhyc, kdhysjh = it.Kdhysjh, jksyj = it.Jksyj, kjblsyj = it.Kjblsyj, pxxx = it.Pxxx, IsEffective = it.IsEffective, }) .MergeTable() .OrderBy(sidx + " " + input.sort) .ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } #endregion #region 新建开单记录表 /// /// 新建开单记录表 /// /// 参数 /// [HttpPost("")] public async Task Create([FromBody] LqKdKdjlbCrInput input) { var userInfo = await _userManager.GetUserInfo(); var entity = input.Adapt(); entity.Id = YitIdHelper.NextId().ToString(); entity.CreateTime = DateTime.Now; entity.UpdateTime = DateTime.Now; try { //开启事务 _db.BeginTran(); //新增开单记录表记录 entity.CreateUser = userInfo.userId; entity.DeductAmount = input.lqKdKdjlbDeductList.Sum(x => x.Amount ?? 0);//计算储扣总金额 var newEntity = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync(); //循环品相信息 // 收集所有需要插入的实体,然后批量插入 var allPxmxEntities = new List(); var allJksyjEntities = new List(); var allKjbsyjEntities = new List(); var allDeductEntities = new List(); // 处理扣款信息列表 foreach (var item in input.lqKdKdjlbDeductList) { var lqKdDeductEntity = new LqKdDeductinfoEntity { Id = YitIdHelper.NextId().ToString(), BillingId = newEntity.Id, DeductId = item.DeductId, DeductType = item.DeductType, Amount = item.Amount, }; allDeductEntities.Add(lqKdDeductEntity); } // 处理品项明细列表 foreach (var item in input.lqKdPxmxList) { // 创建品项明细实体 var lqKdPxmxEntity = new LqKdPxmxEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = newEntity.Id, CreateTIme = DateTime.Now, MemberId = entity.Kdhy, IsEnabled = 0, ProjectNumber = item.projectNumber, TotalPrice = (decimal)(item.pxjg * item.projectNumber), Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, SourceType = item.sourceType, ActualPrice = item.actualPrice, }; allPxmxEntities.Add(lqKdPxmxEntity); // 收集该品项关联的健康师业绩 if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any()) { foreach (var ijks_tem in item.lqKdJksyjList) { allJksyjEntities.Add( new LqKdJksyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = newEntity.Id, Jks = ijks_tem.jks, Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, Yjsj = input.kdrq, Jsj_id = ijks_tem.jsj_id, Kdpxid = lqKdPxmxEntity.Id, } ); } } // 收集该品项关联的科技部老师业绩 if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any()) { foreach (var ikjbs_tem in item.lqKdKjbsyjList) { allKjbsyjEntities.Add( new LqKdKjbsyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = newEntity.Id, Kjbls = ikjbs_tem.kjbls, Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, Yjsj = input.kdrq, Kdpxid = lqKdPxmxEntity.Id, } ); } } } //通过会员id查询会员信息 var memberInfo = await _db.Queryable().Where(u => u.Id == entity.Kdhy).FirstAsync(); //通过开单记录表查询这个会员开单金额 var kdAmount = await _db.Queryable().Where(u => u.Kdhy == entity.Kdhy).SumAsync(u => u.Sfyj); //如果开单金额小于500,为散客,如果大于500,为会员 if (kdAmount < 500) { memberInfo.Khlx = MemberTypeEnum.散客.GetHashCode().ToString(); } else { memberInfo.Khlx = MemberTypeEnum.会员.GetHashCode().ToString(); } await _db.Updateable(memberInfo).ExecuteCommandAsync(); // 批量插入扣款信息 if (allDeductEntities.Any()) { await _db.Insertable(allDeductEntities).ExecuteCommandAsync(); } // 批量插入品项明细 if (allPxmxEntities.Any()) { await _db.Insertable(allPxmxEntities).ExecuteCommandAsync(); } // 批量插入健康师业绩 if (allJksyjEntities.Any()) { await _db.Insertable(allJksyjEntities).ExecuteCommandAsync(); } // 批量插入科技部老师业绩 if (allKjbsyjEntities.Any()) { await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); } //关闭事务 _db.CommitTran(); // 生成开单记录字符串并发送到企业微信 try { var entityInfo = await GetInfo(newEntity.Id); if (entityInfo != null) { var orderRecordString = _stringGenerator.GenerateOrderRecordString(entityInfo); Console.WriteLine("开单记录字符串生成成功:"); Console.WriteLine(orderRecordString); // 发送到企业微信群 try { var sendResult = await _weChatBotService.SendOrderRecordMessage(orderRecordString); if (sendResult) { Console.WriteLine("开单记录已成功发送到企业微信群"); } else { Console.WriteLine("开单记录发送到企业微信群失败"); } } catch (Exception wechatEx) { Console.WriteLine($"发送企业微信消息异常: {wechatEx.Message}"); } } } catch (Exception ex) { // 字符串生成失败不影响主流程,只记录日志 Console.WriteLine($"生成开单记录字符串失败: {ex.Message}"); } } catch (Exception ex) { //回滚事务 _db.RollbackTran(); Console.WriteLine($"开单创建失败: {ex.Message}"); Console.WriteLine($"异常堆栈: {ex.StackTrace}"); throw NCCException.Oh(ErrorCode.COM1000); } } #endregion #region 获取开单记录表无分页列表 /// /// 获取开单记录表无分页列表 /// /// 请求参数 /// [NonAction] public async Task GetNoPagingList([FromQuery] LqKdKdjlbListQueryInput input) { var sidx = input.sidx == null ? "id" : input.sidx; List queryKdrq = input.kdrq != null ? input.kdrq.Split(',').ToObeject>() : null; DateTime? startKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.First()) : null; DateTime? endKdrq = queryKdrq != null ? Ext.GetDateTime(queryKdrq.Last()) : null; var data = await _db.Queryable() .WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id)) .WhereIF(!string.IsNullOrEmpty(input.djmd), p => p.Djmd.Equals(input.djmd)) .WhereIF(!string.IsNullOrEmpty(input.jsj), p => p.Jsj.Equals(input.jsj)) .WhereIF(queryKdrq != null, p => p.Kdrq >= new DateTime(startKdrq.ToDate().Year, startKdrq.ToDate().Month, startKdrq.ToDate().Day, 0, 0, 0)) .WhereIF(queryKdrq != null, p => p.Kdrq <= new DateTime(endKdrq.ToDate().Year, endKdrq.ToDate().Month, endKdrq.ToDate().Day, 23, 59, 59)) .WhereIF(!string.IsNullOrEmpty(input.gjlx), p => p.Gjlx.Equals(input.gjlx)) .WhereIF(!string.IsNullOrEmpty(input.hgjg), p => p.Hgjg.Equals(input.hgjg)) .WhereIF(!string.IsNullOrEmpty(input.zdyj), p => p.Zdyj.Equals(input.zdyj)) .WhereIF(!string.IsNullOrEmpty(input.sfyj), p => p.Sfyj.Equals(input.sfyj)) .WhereIF(!string.IsNullOrEmpty(input.qk), p => p.Qk.Equals(input.qk)) .WhereIF(!string.IsNullOrEmpty(input.ckfs), p => p.Ckfs.Equals(input.ckfs)) .WhereIF(!string.IsNullOrEmpty(input.fkfs), p => p.Fkfs.Equals(input.fkfs)) .WhereIF(!string.IsNullOrEmpty(input.fkyy), p => p.Fkyy.Equals(input.fkyy)) .WhereIF(!string.IsNullOrEmpty(input.fkpd), p => p.Fkpd.Contains(input.fkpd)) .WhereIF(!string.IsNullOrEmpty(input.khly), p => p.Khly.Equals(input.khly)) .WhereIF(!string.IsNullOrEmpty(input.tjr), p => p.Tjr.Contains(input.tjr)) .WhereIF(!string.IsNullOrEmpty(input.sfskdd), p => p.Sfskdd.Equals(input.sfskdd)) .WhereIF(!string.IsNullOrEmpty(input.jj), p => p.Jj.Contains(input.jj)) .WhereIF(!string.IsNullOrEmpty(input.bz), p => p.Bz.Contains(input.bz)) .WhereIF(!string.IsNullOrEmpty(input.kdhy), p => p.Kdhy.Equals(input.kdhy)) .WhereIF(!string.IsNullOrEmpty(input.kdhyc), p => p.Kdhyc.Contains(input.kdhyc)) .WhereIF(!string.IsNullOrEmpty(input.kdhysjh), p => p.Kdhysjh.Contains(input.kdhysjh)) .WhereIF(!string.IsNullOrEmpty(input.jksyj), p => p.Jksyj.Contains(input.jksyj)) .WhereIF(!string.IsNullOrEmpty(input.kjblsyj), p => p.Kjblsyj.Contains(input.kjblsyj)) .WhereIF(!string.IsNullOrEmpty(input.pxxx), p => p.Pxxx.Contains(input.pxxx)) .WhereIF(!string.IsNullOrEmpty(input.F_FIleUrl), p => p.F_FIleUrl.Contains(input.F_FIleUrl)) .Select(it => new LqKdKdjlbListOutput { id = it.Id, djmd = it.Djmd, jsj = it.Jsj, kdrq = it.Kdrq, gjlx = it.Gjlx, hgjg = it.Hgjg, zdyj = it.Zdyj, sfyj = it.Sfyj, qk = it.Qk, ckfs = it.Ckfs, deductAmount = it.DeductAmount, fkfs = it.Fkfs, fkyy = it.Fkyy, fkpd = it.Fkpd, khly = it.Khly, tjr = it.Tjr, sfskdd = it.Sfskdd, jj = it.Jj, bz = it.Bz, kdhy = it.Kdhy, kdhyc = it.Kdhyc, kdhysjh = it.Kdhysjh, jksyj = it.Jksyj, kjblsyj = it.Kjblsyj, pxxx = it.Pxxx, F_FIleUrl = it.F_FIleUrl, }) .MergeTable() .OrderBy(sidx + " " + input.sort) .ToListAsync(); return data; } #endregion #region 导出开单记录表 /// /// 导出开单记录表 /// /// 请求参数 /// [HttpGet("Actions/Export")] public async Task Export([FromQuery] LqKdKdjlbListQueryInput input) { var userInfo = await _userManager.GetUserInfo(); var exportData = new List(); if (input.dataType == 0) { var data = Clay.Object(await this.GetList(input)); exportData = data.Solidify>().list; } else { exportData = await this.GetNoPagingList(input); } List paramList = "[{\"value\":\"开单编号\",\"field\":\"id\"},{\"value\":\"开单会员\",\"field\":\"kdhy\"},{\"value\":\"开单会员名称\",\"field\":\"kdhyc\"},{\"value\":\"会员手机号\",\"field\":\"kdhysjh\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"金三角\",\"field\":\"jsj\"},{\"value\":\"开单日期\",\"field\":\"kdrq\"},{\"value\":\"顾客类型\",\"field\":\"gjlx\"},{\"value\":\"合作机构\",\"field\":\"hgjg\"},{\"value\":\"整单业绩\",\"field\":\"zdyj\"},{\"value\":\"实付业绩\",\"field\":\"sfyj\"},{\"value\":\"欠款\",\"field\":\"qk\"},{\"value\":\"储扣方式\",\"field\":\"ckfs\"},{\"value\":\"储扣明细\",\"field\":\"ckmx\"},{\"value\":\"付款方式\",\"field\":\"fkfs\"},{\"value\":\"付款医院\",\"field\":\"fkyy\"},{\"value\":\"付款判断\",\"field\":\"fkpd\"},{\"value\":\"客户来源\",\"field\":\"khly\"},{\"value\":\"推荐人\",\"field\":\"tjr\"},{\"value\":\"是否首开订单\",\"field\":\"sfskdd\"},{\"value\":\"简介\",\"field\":\"jj\"},{\"value\":\"备注\",\"field\":\"bz\"},{\"value\":\"健康师业绩\",\"field\":\"jksyj\"},{\"value\":\"科技部老师业绩\",\"field\":\"kjblsyj\"},{\"value\":\"品项信息\",\"field\":\"pxxx\"},{\"value\":\"方案其他\",\"field\":\"F_FIleUrl\"},]".ToList(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = "开单记录表.xls"; excelconfig.HeadFont = "微软雅黑"; excelconfig.HeadPoint = 10; excelconfig.IsAllSizeColumn = true; excelconfig.ColumnModel = new List(); List selectKeyList = input.selectKey.Split(',').ToList(); foreach (var item in selectKeyList) { var isExist = paramList.Find(p => p.field == item); if (isExist != null) { excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value }); } } var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName; ExcelExportHelper.Export(exportData, excelconfig, addPath); var fileName = _userManager.UserId + "|" + addPath + "|xls"; var output = new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC") }; return output; } #endregion #region 批量删除开单记录表 /// /// 批量删除开单记录表 /// /// 主键数组 /// [HttpPost("batchRemove")] public async Task BatchRemove([FromBody] List ids) { var entitys = await _db.Queryable().In(it => it.Id, ids).ToListAsync(); if (entitys.Count > 0) { try { //开启事务 _db.BeginTran(); //批量删除开单记录表 await _db.Deleteable().In(d => d.Id, ids).ExecuteCommandAsync(); //清空子表数据 await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync(); //清空子表数据 await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync(); //清空子表数据 await _db.Deleteable().In(u => u.Glkdbh, ids).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } catch (Exception) { //回滚事务 _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1002); } } } #endregion #region 更新开单记录表 /// /// 更新开单记录表 /// /// /// 更新开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 示例请求: /// ```json /// { /// "id": "开单编号", /// "djmd": "单据门店", /// "jsj": "金三角", /// "kdrq": "2025-01-11", /// "lqKdPxmxList": [ /// { /// "px": "品项编号", /// "pxmc": "品项名称", /// "pxjg": 100.00, /// "projectNumber": 1, /// "sourceType": "购买", /// "lqKdJksyjList": [ /// { /// "jks": "健康师", /// "jksxm": "健康师姓名", /// "jksyj": "100" /// } /// ] /// } /// ] /// } /// ``` /// /// 参数说明: /// - id: 开单记录主键ID /// - input: 开单记录更新参数,包含品项明细和业绩信息 /// /// 开单记录主键ID /// 开单记录更新参数 /// 无返回值 /// 更新成功 /// 参数错误或数据验证失败 /// 服务器内部错误 [HttpPut("{id}")] public async Task Update(string id, [FromBody] LqKdKdjlbUpInput input) { var entity = input.Adapt(); try { //开启事务 _db.BeginTran(); //更新开单记录表记录 await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); //清空原有数据 await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); // 收集所有需要插入的实体,然后批量插入 var allPxmxEntities = new List(); var allJksyjEntities = new List(); var allKjbsyjEntities = new List(); // 处理品项明细列表 if (input.lqKdPxmxList != null && input.lqKdPxmxList.Any()) { foreach (var item in input.lqKdPxmxList) { // 创建品项明细实体 var lqKdPxmxEntity = new LqKdPxmxEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, CreateTIme = DateTime.Now, MemberId = entity.Kdhy, IsEnabled = 0, ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber, TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)), Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, SourceType = item.sourceType, }; allPxmxEntities.Add(lqKdPxmxEntity); // 收集该品项关联的健康师业绩 if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any()) { foreach (var ijks_tem in item.lqKdJksyjList) { allJksyjEntities.Add( new LqKdJksyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, Jks = ijks_tem.jks, Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, Yjsj = DateTime.Now, Jsj_id = ijks_tem.jsj_id, Kdpxid = lqKdPxmxEntity.Id, } ); } } // 收集该品项关联的科技部老师业绩 if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any()) { foreach (var ikjbs_tem in item.lqKdKjbsyjList) { allKjbsyjEntities.Add( new LqKdKjbsyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, Kjbls = ikjbs_tem.kjbls, Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, Yjsj = DateTime.Now, Kdpxid = lqKdPxmxEntity.Id, } ); } } } } // 批量插入品项明细 if (allPxmxEntities.Any()) { await _db.Insertable(allPxmxEntities).ExecuteCommandAsync(); } // 批量插入健康师业绩 if (allJksyjEntities.Any()) { await _db.Insertable(allJksyjEntities).ExecuteCommandAsync(); } // 批量插入科技部老师业绩 if (allKjbsyjEntities.Any()) { await _db.Insertable(allKjbsyjEntities).ExecuteCommandAsync(); } //关闭事务 _db.CommitTran(); } catch (Exception) { //回滚事务 _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1001); } } #endregion #region 删除开单记录表 /// /// 删除开单记录表 /// /// [HttpDelete("{id}")] public async Task Delete(string id) { var entity = await _db.Queryable().FirstAsync(p => p.Id == id); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); try { //开启事务 _db.BeginTran(); //删除开单记录表记录 await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync(); //清空子表数据 await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); //清空子表数据 await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); //清空子表数据 await _db.Deleteable().Where(u => u.Glkdbh == id).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } catch (Exception) { //回滚事务 _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1002); } } #endregion #region 获取扣款类型枚举内容 /// /// 获取扣款类型枚举内容 /// /// 扣款类型枚举列表 [HttpGet("deduct-types")] public List GetDeductTypes() { return Enum.GetValues() .Select(e => new EnumOutput { Value = (int)e, Name = e.ToString(), Description = e.GetDescription(), }) .ToList(); } #endregion #region 修改开单记录,不做删除,仅健康师业绩、科技部老师业绩信息 /// /// 修改开单记录,不做删除,仅健康师业绩、科技部老师业绩信息 /// /// /// 更新开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息 /// /// 示例请求: /// ```json /// { /// "id": "开单编号", /// "djmd": "单据门店", /// "jsj": "金三角", /// "kdrq": "2025-01-11", /// "lqKdPxmxList": [ /// { /// "px": "品项编号", /// "pxmc": "品项名称", /// "pxjg": 100.00, /// "projectNumber": 1, /// "sourceType": "购买", /// "lqKdJksyjList": [ /// { /// "jks": "健康师", /// "jksxm": "健康师姓名", /// "jksyj": "100" /// } /// ] /// } /// ] /// } /// ``` /// /// 参数说明: /// - id: 开单记录主键ID /// - input: 开单记录更新参数,包含品项明细和业绩信息 /// /// 开单记录主键ID /// 开单记录更新参数 /// 无返回值 /// 更新成功 /// 参数错误或数据验证失败 /// 服务器内部错误 [HttpPut("UpdateForNoDelete/{id}")] public async Task UpdateForNoDelete(string id, [FromBody] LqKdKdjlbUpInput input) { var entity = input.Adapt(); entity.Id = id; // 确保ID正确设置 try { //开启事务 _db.BeginTran(); // 更新开单记录主表 await _db.Updateable(entity) .IgnoreColumns(ignoreAllNullColumns: true) .IgnoreColumns(x => x.CreateTime) // 不更新创建时间 .ExecuteCommandAsync(); // 处理品项明细列表 - 更新或插入 if (input.lqKdPxmxList != null && input.lqKdPxmxList.Any()) { foreach (var item in input.lqKdPxmxList) { // 检查品项明细是否已存在 var existingPxmx = await _db.Queryable() .Where(x => x.Glkdbh == id && x.Px == item.px) .FirstAsync(); if (existingPxmx != null) { // 更新现有品项明细 existingPxmx.ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber; existingPxmx.TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)); existingPxmx.Pxmc = item.pxmc; existingPxmx.Pxjg = item.pxjg; existingPxmx.SourceType = item.sourceType; await _db.Updateable(existingPxmx).ExecuteCommandAsync(); // 更新该品项关联的健康师业绩 if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any()) { // 先删除该品项的所有健康师业绩 await _db.Deleteable() .Where(x => x.Kdpxid == existingPxmx.Id) .ExecuteCommandAsync(); // 重新插入健康师业绩 var jksyjEntities = item.lqKdJksyjList.Select(ijks_tem => new LqKdJksyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, Jks = ijks_tem.jks, Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, Yjsj = DateTime.Now, Jsj_id = ijks_tem.jsj_id, Kdpxid = existingPxmx.Id, }).ToList(); if (jksyjEntities.Any()) { await _db.Insertable(jksyjEntities).ExecuteCommandAsync(); } } // 更新该品项关联的科技部老师业绩 if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any()) { // 先删除该品项的所有科技部老师业绩 await _db.Deleteable() .Where(x => x.Kdpxid == existingPxmx.Id) .ExecuteCommandAsync(); // 重新插入科技部老师业绩 var kjbsyjEntities = item.lqKdKjbsyjList.Select(ikjbs_tem => new LqKdKjbsyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, Kjbls = ikjbs_tem.kjbls, Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, Yjsj = DateTime.Now, Kdpxid = existingPxmx.Id, }).ToList(); if (kjbsyjEntities.Any()) { await _db.Insertable(kjbsyjEntities).ExecuteCommandAsync(); } } } else { // 插入新的品项明细 var newPxmxEntity = new LqKdPxmxEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, CreateTIme = DateTime.Now, MemberId = entity.Kdhy, IsEnabled = 0, ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber, TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)), Px = item.px, Pxmc = item.pxmc, Pxjg = item.pxjg, SourceType = item.sourceType, }; await _db.Insertable(newPxmxEntity).ExecuteCommandAsync(); // 插入该品项关联的健康师业绩 if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any()) { var jksyjEntities = item.lqKdJksyjList.Select(ijks_tem => new LqKdJksyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, Jks = ijks_tem.jks, Jksxm = ijks_tem.jksxm, Jkszh = ijks_tem.jkszh, Jksyj = ijks_tem.jksyj, Yjsj = DateTime.Now, Jsj_id = ijks_tem.jsj_id, Kdpxid = newPxmxEntity.Id, }).ToList(); await _db.Insertable(jksyjEntities).ExecuteCommandAsync(); } // 插入该品项关联的科技部老师业绩 if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any()) { var kjbsyjEntities = item.lqKdKjbsyjList.Select(ikjbs_tem => new LqKdKjbsyjEntity { Id = YitIdHelper.NextId().ToString(), Glkdbh = entity.Id, Kjbls = ikjbs_tem.kjbls, Kjblsxm = ikjbs_tem.kjblsxm, Kjblszh = ikjbs_tem.kjblszh, Kjblsyj = ikjbs_tem.kjblsyj, Yjsj = DateTime.Now, Kdpxid = newPxmxEntity.Id, }).ToList(); await _db.Insertable(kjbsyjEntities).ExecuteCommandAsync(); } } } } //关闭事务 _db.CommitTran(); } catch (Exception) { //回滚事务 _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1001); } } #endregion #region 作废开单记录 /// /// 作废开单记录 /// /// 开单记录主键ID /// 无返回值 /// 作废成功 /// 参数错误,开单记录ID不能为空 /// 开单记录不存在 /// 服务器内部错误 [HttpPut("Cancel/{id}")] public async Task Cancel(string id) { if (string.IsNullOrEmpty(id)) { throw NCCException.Oh("开单记录ID不能为空"); } try { //开启事务 _db.BeginTran(); // 查询开单记录 var entity = await _db.Queryable().FirstAsync(p => p.Id == id); if (entity == null) { throw NCCException.Oh("开单记录不存在"); } // 检查是否已经作废 if (entity.IsEffective == 0) { throw NCCException.Oh("该开单记录已经作废"); } // 标记开单记录为无效 entity.IsEffective = 0; await _db.Updateable(entity).ExecuteCommandAsync(); // 标记对应开单明细表为无效 await _db.Updateable().SetColumns(it => new LqKdPxmxEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync(); // 标记健康师业绩为无效 await _db.Updateable().SetColumns(it => new LqKdJksyjEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync(); // 标记科技部老师业绩为无效 await _db.Updateable().SetColumns(it => new LqKdKjbsyjEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } catch (Exception ex) when (!(ex is NCCException)) { //回滚事务 _db.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1001); } } #endregion } }