From e5e15bcb974db912d4885d0b4d0ceac9b17af5ac Mon Sep 17 00:00:00 2001 From: “wangming” <“wangming@antissoft.com”> Date: Fri, 10 Oct 2025 18:08:44 +0800 Subject: [PATCH] 优化系统功能和性能 --- netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs | 5 +++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs | 5 +++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs | 6 ++++++ netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs | 6 ++++++ netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs | 1 + netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs | 321 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------- netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs | 2 +- netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs | 5 +---- netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs | 2 +- 9 files changed, 298 insertions(+), 55 deletions(-) diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs index 9120030..6681439 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventCrInput.cs @@ -86,5 +86,10 @@ namespace NCC.Extend.Entitys.Dto.LqEvent /// 每个成员包含:用户ID、部门ID、战队名称等信息 /// public List Members { get; set; } = new List(); + + /// + /// 推送URL + /// + public string PushUrl { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs index 355f67c..05e6688 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqEvent/LqEventInfoOutput.cs @@ -46,6 +46,11 @@ namespace NCC.Extend.Entitys.Dto.LqEvent public int eventType { get; set; } /// + /// 推送URL + /// + public string pushUrl { get; set; } + + /// /// 拓客活动成员列表 /// public List Members { get; set; } = new List(); diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs index b5f5023..8eba20d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_event/LqEventEntity.cs @@ -50,5 +50,11 @@ namespace NCC.Extend.Entitys.lq_event /// [SugarColumn(ColumnName = "F_EventType")] public int EventType { get; set; } + + /// + /// 推送URL + /// + [SugarColumn(ColumnName = "F_PushUrl")] + public string PushUrl { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs index 22a02eb..79cedb8 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_deductinfo/LqKdDeductinfoEntity.cs @@ -40,5 +40,11 @@ namespace NCC.Extend.Entitys.lq_kd_deductinfo /// [SugarColumn(ColumnName = "F_Amount")] public decimal? Amount { get; set; } + + /// + /// 是否有效 + /// + [SugarColumn(ColumnName = "F_IsEffective")] + public int? IsEffective { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs index 78364c4..333e74d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqEventService.cs @@ -150,6 +150,7 @@ namespace NCC.Extend.LqEvent eventCoordinator = entity.EventCoordinator, eventNumber = entity.EventNumber, eventType = entity.EventType, + pushUrl = entity.PushUrl, }; // 3. 获取拓客活动成员信息 diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs index 4433755..2281a66 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs @@ -436,6 +436,199 @@ namespace NCC.Extend.LqKdKdjlb } #endregion + #region 新建开单记录表_备份 + /// + /// 新建开单记录表_备份 + /// + /// 参数 + /// + [HttpPost("Create_Bak")] + public async Task Create_Bak([FromBody] LqKdKdjlbCrInput input) + { + var userInfo = await _userManager.GetUserInfo(); + var entity = input.Adapt(); + var HealthInstructorNames = ""; + 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, + Yjsj = input.kdrq, + 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()) + { + //把jksxm保存到HealthInstructorNames + foreach (var ijks_tem in item.lqKdJksyjList) + { + HealthInstructorNames += ijks_tem.jksxm + ","; + 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, HealthInstructorNames); + 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 获取开单记录表无分页列表 /// /// 获取开单记录表无分页列表 @@ -1065,6 +1258,8 @@ namespace NCC.Extend.LqKdKdjlb 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(); + // 标记开单_储扣详细表为无效 + await _db.Updateable().SetColumns(it => new LqKdDeductinfoEntity { IsEffective = 0 }).Where(it => it.BillingId == id).ExecuteCommandAsync(); //关闭事务 _db.CommitTran(); } @@ -1141,65 +1336,94 @@ namespace NCC.Extend.LqKdKdjlb int errorCount = 0; var errorMessages = new List(); - // 2. 逐条处理历史会员权益数据 - foreach (var item in historyData) + // 2. 批量处理数据,每批1000条 + const int batchSize = 1000; + var totalBatches = (int)Math.Ceiling((double)historyData.Count / batchSize); + + for (int batchIndex = 0; batchIndex < totalBatches; batchIndex++) { - try - { - // 3. 生成开单记录ID - string kdjlbId = YitIdHelper.NextId().ToString(); + var batchData = historyData.Skip(batchIndex * batchSize).Take(batchSize).ToList(); - // 4. 创建开单记录 - var kdjlbEntity = new LqKdKdjlbEntity + var kdjlbEntities = new List(); + var pxmxEntities = new List(); + + foreach (var item in batchData) + { + try { - Id = kdjlbId, - Djmd = item.F_StoreId, // 直接使用F_StoreId - Kdhy = item.F_MemberId, - Kdhyc = item.会员名称, - Jsj = "暂无", - Kdhysjh = item.会员电话, - Kdrq = fixedDateTime, - Zdyj = Convert.ToDecimal(item.整单业绩 ?? 0), - Sfyj = Convert.ToDecimal(item.实付业绩 ?? 0), - Qk = Convert.ToDecimal(item.欠款 ?? 0), - CreateTime = fixedDateTime, - UpdateTime = fixedDateTime, - Sfskdd = "否", - IsEffective = 1, - Bz = "导入历史会员权益数据" - }; + // 3. 生成开单记录ID + string kdjlbId = YitIdHelper.NextId().ToString(); + + // 4. 创建开单记录 + var kdjlbEntity = new LqKdKdjlbEntity + { + Id = kdjlbId, + Djmd = (string)item.F_StoreId, // 直接使用F_StoreId + Kdhy = (string)item.F_MemberId, + Kdhyc = (string)item.会员名称, + Jsj = "暂无", + Kdhysjh = (string)item.会员电话, + Kdrq = fixedDateTime, + Zdyj = Convert.ToDecimal(item.整单业绩 ?? 0), + Sfyj = Convert.ToDecimal(item.实付业绩 ?? 0), + Qk = Convert.ToDecimal(item.欠款 ?? 0), + CreateTime = fixedDateTime, + UpdateTime = fixedDateTime, + Sfskdd = "否", + IsEffective = 1, + Bz = "导入历史会员权益数据" + }; + + kdjlbEntities.Add(kdjlbEntity); + + // 5. 创建品项明细 + string pxmxId = YitIdHelper.NextId().ToString(); - await _db.Insertable(kdjlbEntity).ExecuteCommandAsync(); + var pxmxEntity = new LqKdPxmxEntity + { + Id = pxmxId, + Glkdbh = kdjlbId, + Px = (string)item.F_ProjectId, + Pxmc = (string)item.品项名称, + Pxjg = Convert.ToDecimal(item.品项价格 ?? 0) / Convert.ToDecimal(item.品项次数 ?? 0), + ProjectNumber = Convert.ToDecimal(item.品项次数 ?? 0), + SourceType = (string)item.来源, + MemberId = (string)item.F_MemberId, + Yjsj = fixedDateTime, + CreateTIme = fixedDateTime, + IsEffective = 1, + IsEnabled = 0, + TotalPrice = Convert.ToDecimal(item.品项价格 ?? 0), + ActualPrice = Convert.ToDecimal(item.品项价格 ?? 0) + }; - // 5. 创建品项明细 - string pxmxId = YitIdHelper.NextId().ToString(); + pxmxEntities.Add(pxmxEntity); - var pxmxEntity = new LqKdPxmxEntity + successCount++; + } + catch (Exception ex) { - Id = pxmxId, - Glkdbh = kdjlbId, - Px = item.F_ProjectId, - Pxmc = item.品项名称, - Pxjg = Convert.ToDecimal(item.品项价格 ?? 0), - ProjectNumber = Convert.ToDecimal(item.品项次数 ?? 0), - SourceType = item.来源, - MemberId = item.F_MemberId, - Yjsj = fixedDateTime, - CreateTIme = fixedDateTime, - IsEffective = 1, - IsEnabled = 0, - TotalPrice = Convert.ToDecimal(item.品项价格 ?? 0) * Convert.ToDecimal(item.品项次数 ?? 0), - ActualPrice = Convert.ToDecimal(item.品项价格 ?? 0) * Convert.ToDecimal(item.品项次数 ?? 0) - }; + errorCount++; + errorMessages.Add($"处理记录 {(string)item.会员编号}-{(string)item.品项名称} 时出错: {ex.Message}"); + } + } - await _db.Insertable(pxmxEntity).ExecuteCommandAsync(); + // 6. 批量插入开单记录 + if (kdjlbEntities.Any()) + { + await _db.Insertable(kdjlbEntities).ExecuteCommandAsync(); + } - successCount++; + // 7. 批量插入品项明细 + if (pxmxEntities.Any()) + { + await _db.Insertable(pxmxEntities).ExecuteCommandAsync(); } - catch (Exception ex) + + // 8. 显示进度 + if (batchIndex % 10 == 0) { - errorCount++; - errorMessages.Add($"处理记录 {item.会员编号}-{item.品项名称} 时出错: {ex.Message}"); + Console.WriteLine($"已处理 {batchIndex + 1}/{totalBatches} 批次,成功 {successCount} 条,失败 {errorCount} 条"); } } @@ -1223,6 +1447,5 @@ namespace NCC.Extend.LqKdKdjlb } } #endregion - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index a16c2fe..b37d91f 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -719,7 +719,7 @@ namespace NCC.Extend.LqKhxx Lxdz = "", // 联系地址 Bz = "历史潜客导入", CreateTime = DateTime.Now, - ExpandUser = (string)item.拓客员工, // 拓客人员 + ExpandUser = (string)item.F_UserId, // 拓客人员 MainHealthUser = null, SubHealthUser = null }; diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs index 3bc9e1c..767a81d 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqTkjlbService.cs @@ -190,10 +190,7 @@ namespace NCC.Extend.LqTkjlb //找到input.expansionUserId的用户信息 var userInfo = await _db.Queryable().Where(u => u.Id == input.expansionUserId).FirstAsync(); //判断 岗位是否为健康师,如果是健康师,则设置拓客人员是健康师 - if (userInfo.Gw == "健康师") - { - MemberInfo.ExpandUser = input.expansionUserId; - } + MemberInfo.ExpandUser = input.expansionUserId; MemberInfo.Gsmd = eventUserInfo.StoreId; var memberResult = await _db.Insertable(MemberInfo).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync(); if (!(memberResult > 0)) diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs index 6333c0d..8194187 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqYcsdJsjService.cs @@ -237,7 +237,7 @@ namespace NCC.Extend.LqYcsdJsj var month = input.DateTime.ToString("yyyyMM"); // 先查询用户的金三角关联信息 - var jsjUser = await _db.Queryable().Where(x => x.UserId == input.UserId && x.DeleteMark == 0).FirstAsync(); + var jsjUser = await _db.Queryable().Where(x => x.UserId == input.UserId && x.DeleteMark == 0 && x.Month == month).FirstAsync(); if (jsjUser == null) { -- libgit2 0.21.4