diff --git a/netcore/src/Application/NCC.API/appsettings.json b/netcore/src/Application/NCC.API/appsettings.json index a074cfe..693026a 100644 --- a/netcore/src/Application/NCC.API/appsettings.json +++ b/netcore/src/Application/NCC.API/appsettings.json @@ -181,6 +181,11 @@ "scope": "snsapi_userinfo" } }, + "WeChatBot": { + "BotApiUrl": "http://wx.lvqianmeiye.com/api/Bot/send-text", + "WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=496f1add-122b-43fc-9e38-0ca79c48b33f", + "WebhookUrlTest": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6f8686ec-5011-4c1d-bae9-d82a2a2f4d83" + }, "NCC_App": { "CodeAreasName": "SubDev,Food,Extend,test", //系统文件路径(末尾必须带斜杆) diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs index 4aeee69..27eadbf 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListOutput.cs @@ -1,4 +1,8 @@ using System; +using System.Collections.Generic; +using NCC.Extend.Entitys.Dto.LqHytkMx; +using NCC.Extend.Entitys.Dto.LqHytkJksyj; +using NCC.Extend.Entitys.Dto.LqHytkKjbsyj; namespace NCC.Extend.Entitys.Dto.LqHytkHytk { @@ -102,5 +106,19 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// public string cancelRemark { get; set; } + /// + /// 退卡品项明细列表 + /// + public List lqHytkMxList { get; set; } + + /// + /// 健康师业绩列表 + /// + public List lqHytkJksyjList { get; set; } + + /// + /// 科技部老师业绩列表 + /// + public List lqHytkKjbsyjList { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs index 1369ba5..e3f808e 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqHytkHytk/LqHytkHytkListQueryInput.cs @@ -93,5 +93,14 @@ namespace NCC.Extend.Entitys.Dto.LqHytkHytk /// public int isEffective { get; set; } = 0; + /// + /// 健康师ID(可选,传入后只返回该健康师参与的退卡记录) + /// + public string jksId { get; set; } + + /// + /// 科技部老师ID(可选,传入后只返回该老师参与的退卡记录) + /// + public string kjblsId { get; set; } } } \ No newline at end of file diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/TechTeacherSimpleStatisticsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/TechTeacherSimpleStatisticsOutput.cs index e8ac726..ca4beb5 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/TechTeacherSimpleStatisticsOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/TechTeacherSimpleStatisticsOutput.cs @@ -41,5 +41,10 @@ namespace NCC.Extend.Entitys.Dto.LqStatistics /// 耗卡品项次数 /// public int ConsumeItemCount { get; set; } + + /// + /// 消耗手工费(耗卡手工费) + /// + public decimal ConsumeLaborCost { get; set; } } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs index 2ab5392..4e63238 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/MemberRemainingItemsOutput.cs @@ -25,6 +25,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk public string MemberName { get; set; } /// + /// /// 剩余品项列表 /// /// 按剩余数量降序排列的品项列表 @@ -71,6 +72,12 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk public string SourceType { get; set; } /// + /// 备注 + /// + /// 备注 + public string Remark { get; set; } + + /// /// 总购买数量 /// /// 该品项的总购买次数 diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs index ce5fd82..56bd52c 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs @@ -70,8 +70,35 @@ namespace NCC.Extend.LqHytkHytk /// /// 获取退卡信息列表 /// + /// + /// 获取退卡记录列表,支持根据健康师ID或科技部老师ID筛选,返回品项明细、健康师业绩和科技部老师业绩 + /// + /// 示例请求: + /// ```json + /// GET /api/Extend/LqHytkHytk?jksId=健康师ID&kjblsId=科技部老师ID&currentPage=1&pageSize=10 + /// ``` + /// + /// 参数说明: + /// - jksId: 健康师ID(可选,传入后只返回该健康师参与的退卡记录) + /// - kjblsId: 科技部老师ID(可选,传入后只返回该老师参与的退卡记录) + /// - id: 退卡编号(可选) + /// - md: 门店ID(可选) + /// - hy: 会员ID(可选) + /// - tksj: 退卡时间(可选,格式:yyyy-MM-dd,yyyy-MM-dd) + /// - currentPage: 当前页码(必填) + /// - pageSize: 每页数量(必填) + /// + /// 返回数据说明: + /// - 退卡基本信息:id、门店信息、会员信息、退卡金额、退卡时间等 + /// - lqHytkMxList: 退卡品项明细列表,每个明细包含品项信息、退款金额、项目次数等 + /// - lqHytkJksyjList: 健康师业绩列表,每个业绩包含健康师信息、业绩金额、手工费、退卡品项次数等 + /// - lqHytkKjbsyjList: 科技部老师业绩列表,每个业绩包含科技部老师信息、业绩金额、手工费、退卡品项次数等 + /// /// 查询参数 - /// + /// 分页的退卡记录列表,包含退卡基本信息、品项明细、健康师业绩、科技部老师业绩 + /// 成功返回退卡列表 + /// 参数错误 + /// 服务器内部错误 [HttpGet("")] public async Task GetList([FromQuery] LqHytkHytkListQueryInput input) { @@ -79,7 +106,48 @@ namespace NCC.Extend.LqHytkHytk 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() + + // 根据是否传入健康师ID或科技部老师ID,动态构建查询 + ISugarQueryable baseQuery = null; + + if (!string.IsNullOrEmpty(input.jksId) && !string.IsNullOrEmpty(input.kjblsId)) + { + // 同时传入健康师ID和科技部老师ID,需要同时关联两个业绩表(不过滤有效性) + baseQuery = _db.Queryable( + (jksyj, kjbsyj, hytk) => jksyj.Gltkbh == hytk.Id && kjbsyj.Gltkbh == hytk.Id) + .Where((jksyj, kjbsyj, hytk) => jksyj.Jkszh == input.jksId) + .Where((jksyj, kjbsyj, hytk) => kjbsyj.Kjblszh == input.kjblsId) + .Select((jksyj, kjbsyj, hytk) => hytk) + .Distinct() + .MergeTable(); + } + else if (!string.IsNullOrEmpty(input.jksId)) + { + // 只传入健康师ID,关联健康师业绩表(不过滤有效性) + baseQuery = _db.Queryable( + (jksyj, hytk) => jksyj.Gltkbh == hytk.Id) + .Where((jksyj, hytk) => jksyj.Jkszh == input.jksId) + .Select((jksyj, hytk) => hytk) + .Distinct() + .MergeTable(); + } + else if (!string.IsNullOrEmpty(input.kjblsId)) + { + // 只传入科技部老师ID,关联科技部老师业绩表(不过滤有效性) + baseQuery = _db.Queryable( + (kjbsyj, hytk) => kjbsyj.Gltkbh == hytk.Id) + .Where((kjbsyj, hytk) => kjbsyj.Kjblszh == input.kjblsId) + .Select((kjbsyj, hytk) => hytk) + .Distinct() + .MergeTable(); + } + else + { + // 没有传入健康师ID或科技部老师ID,使用原来的查询逻辑 + baseQuery = _db.Queryable(); + } + + var data = await baseQuery .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)) @@ -123,6 +191,104 @@ namespace NCC.Extend.LqHytkHytk .MergeTable() .OrderBy(sidx + " " + input.sort) .ToPagedListAsync(input.currentPage, input.pageSize); + + // 获取当前页的退卡记录ID列表 + var refundIds = data.list.Select(x => x.id).ToList(); + + // 批量查询品项明细(不过滤有效性,返回所有记录) + var itemDetails = new List(); + if (refundIds.Any()) + { + itemDetails = await _db.Queryable() + .Where(x => refundIds.Contains(x.RefundInfoId)) + .Select(x => new LqHytkMxInfoOutput + { + id = x.Id, + refundInfoId = x.RefundInfoId, + billingItemId = x.BillingItemId, + px = x.Px, + pxmc = x.Pxmc, + pxjg = x.Pxjg, + tkje = x.Tkje, + projectNumber = x.ProjectNumber, + isEffective = x.IsEffective, + sourceType = x.SourceType, + totalPrice = x.TotalPrice + }) + .ToListAsync(); + } + + // 批量查询健康师业绩(性能优化:一次性查询所有退卡的健康师业绩,不过滤有效性) + var jksyjList = new List(); + if (refundIds.Any()) + { + jksyjList = await _db.Queryable() + .Where(x => refundIds.Contains(x.Gltkbh)) + .Select(x => new LqHytkJksyjInfoOutput + { + id = x.Id, + gltkbh = x.Gltkbh, + jks = x.Jks, + jksxm = x.Jksxm, + jkszh = x.Jkszh, + jksyj = x.Jksyj, + tksj = x.Tksj, + F_jsjid = x.F_jsjid, + F_tkpxid = x.F_tkpxid, + F_LaborCost = x.F_LaborCost, + F_tkpxNumber = x.F_tkpxNumber + }) + .ToListAsync(); + } + + // 批量查询科技部老师业绩(性能优化:一次性查询所有退卡的科技部老师业绩,不过滤有效性) + var kjbsyjList = new List(); + if (refundIds.Any()) + { + kjbsyjList = await _db.Queryable() + .Where(x => refundIds.Contains(x.Gltkbh)) + .Select(x => new LqHytkKjbsyjInfoOutput + { + id = x.Id, + gltkbh = x.Gltkbh, + kjbls = x.Kjbls, + kjblsxm = x.Kjblsxm, + kjblszh = x.Kjblszh, + kjblsyj = x.Kjblsyj, + tksj = x.Tksj, + F_tkpxid = x.F_tkpxid, + F_LaborCost = x.F_LaborCost, + F_tkpxNumber = x.F_tkpxNumber + }) + .ToListAsync(); + } + + // 按退卡ID分组品项明细 + var itemDetailsGrouped = itemDetails.GroupBy(x => x.refundInfoId) + .ToDictionary(g => g.Key, g => g.ToList()); + + // 按退卡ID分组健康师业绩 + var jksyjGrouped = jksyjList.GroupBy(x => x.gltkbh) + .ToDictionary(g => g.Key, g => g.ToList()); + + // 按退卡ID分组科技部老师业绩 + var kjbsyjGrouped = kjbsyjList.GroupBy(x => x.gltkbh) + .ToDictionary(g => g.Key, g => g.ToList()); + + // 为每个退卡记录分配品项明细、健康师业绩和科技部老师业绩 + foreach (var item in data.list) + { + item.lqHytkMxList = itemDetailsGrouped.ContainsKey(item.id) + ? itemDetailsGrouped[item.id] + : new List(); + item.lqHytkJksyjList = jksyjGrouped.ContainsKey(item.id) + ? jksyjGrouped[item.id] + : new List(); + item.lqHytkKjbsyjList = kjbsyjGrouped.ContainsKey(item.id) + ? kjbsyjGrouped[item.id] + : new List(); + } + return PageResult.SqlSugarPageResult(data); } #endregion diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs index 6014901..cae73ad 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs @@ -454,10 +454,8 @@ namespace NCC.Extend.LqKdKdjlb { throw NCCException.Oh("健康师ID不能为空"); } - var sidx = input.sidx == null ? "kdrq" : input.sidx; var sort = string.IsNullOrEmpty(input.sort) ? "DESC" : input.sort; - // 解析时间范围 DateTime? startDate = null; DateTime? endDate = null; @@ -476,8 +474,7 @@ namespace NCC.Extend.LqKdKdjlb } // 通过健康师业绩表关联查询开单记录 - var data = await _db.Queryable( - (jksyj, kdjlb) => jksyj.Glkdbh == kdjlb.Id) + var data = await _db.Queryable((jksyj, kdjlb) => jksyj.Glkdbh == kdjlb.Id) .Where((jksyj, kdjlb) => jksyj.Jkszh == input.jksId) .WhereIF(input.isEffective != 0, (jksyj, kdjlb) => jksyj.IsEffective == input.isEffective && kdjlb.IsEffective == input.isEffective) .WhereIF(input.isEffective == 0, (jksyj, kdjlb) => jksyj.IsEffective == StatusEnum.有效.GetHashCode() && kdjlb.IsEffective == StatusEnum.有效.GetHashCode()) diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index ad22a1d..e7b3951 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -551,7 +551,8 @@ namespace NCC.Extend.LqKhxx x.Pxmc, x.Pxjg, x.SourceType, - x.ProjectNumber + x.ProjectNumber, + x.Remark }) .ToListAsync(); @@ -600,6 +601,7 @@ namespace NCC.Extend.LqKhxx ItemPrice = item.Pxjg, SourceType = item.SourceType, TotalPurchased = item.ProjectNumber, + Remark = item.Remark, ConsumedCount = consumedData.FirstOrDefault(c => c.BillingItemId == item.Id)?.TotalConsumed ?? 0, RefundedCount = refundedData.FirstOrDefault(r => r.BillingItemId == item.Id)?.TotalRefunded ?? 0, DeductCount = deductData.FirstOrDefault(d => d.BillingItemId == item.Id)?.TotalDeduct ?? 0, diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs index cd79bb8..5c813cf 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs @@ -831,8 +831,40 @@ namespace NCC.Extend.LqStatistics /// /// 获取科技部老师业绩统计 /// + /// + /// 统计科技部老师的开单业绩、消耗业绩、手工费等相关数据 + /// + /// 示例请求: + /// ```json + /// { + /// "startDate": "2025-01-01T00:00:00", + /// "endDate": "2025-01-31T23:59:59", + /// "teacherId": "科技部老师ID(可选)", + /// "teacherName": "科技部老师姓名(可选)" + /// } + /// ``` + /// + /// 参数说明: + /// - startDate: 开始日期(可选) + /// - endDate: 结束日期(可选) + /// - teacherId: 科技部老师ID(可选) + /// - teacherName: 科技部老师姓名(可选) + /// + /// 返回数据说明: + /// - DepartmentName: 部门名称(固定为"科技部") + /// - TeacherName: 老师姓名 + /// - ConsumeProjectCount: 消耗项目数 + /// - ConsumeAchievement: 消耗业绩 + /// - OrderAchievement: 开单业绩(开卡业绩) + /// - OrderItemCount: 开单品项次数 + /// - ConsumeItemCount: 耗卡品项次数 + /// - ConsumeLaborCost: 消耗手工费(耗卡手工费) + /// /// 查询参数 - /// 科技部老师业绩统计结果 + /// 科技部老师业绩统计结果列表,包含开单业绩、消耗业绩、手工费等数据 + /// 成功返回统计数据 + /// 参数错误 + /// 服务器内部错误 [HttpPost("GetTechTeacherStatistics")] [AllowAnonymous] public async Task> GetTechTeacherStatistics(TechTeacherStatisticsInput input) @@ -852,10 +884,21 @@ namespace NCC.Extend.LqStatistics // 2. 获取业绩流水数据 var flowQuery = _db.Queryable(); - // 老师过滤 + // 老师过滤(支持通过ID或账号匹配) if (!string.IsNullOrEmpty(input.TeacherId)) { - flowQuery = flowQuery.Where(x => x.TeacherId == input.TeacherId); + // 先通过用户ID查询账号,然后同时匹配ID和账号 + var teacherAccount = allTeachers.FirstOrDefault(t => t.TeacherId == input.TeacherId)?.TeacherAccount; + if (!string.IsNullOrEmpty(teacherAccount)) + { + // 同时匹配ID和账号(因为视图中的teacher_id可能是ID或账号) + flowQuery = flowQuery.Where(x => x.TeacherId == input.TeacherId || x.TeacherAccount == teacherAccount); + } + else + { + // 如果找不到账号,只匹配ID + flowQuery = flowQuery.Where(x => x.TeacherId == input.TeacherId); + } } if (!string.IsNullOrEmpty(input.TeacherName)) @@ -876,23 +919,25 @@ namespace NCC.Extend.LqStatistics var flowRecords = await flowQuery.ToListAsync(); - // 3. 按老师分组统计业绩数据 + // 3. 按老师账号分组统计业绩数据(包括耗卡手工费) + // 注意:视图中的teacher_id是kjbls,teacher_account是kjblszh,使用账号来匹配更准确 var teacherStatsDict = flowRecords .GroupBy(x => new { - x.TeacherId, - x.TeacherName, - x.TeacherAccount, + TeacherAccount = x.TeacherAccount ?? string.Empty, + TeacherId = x.TeacherId ?? string.Empty, + TeacherName = x.TeacherName ?? string.Empty, }) .ToDictionary( - g => g.Key, + g => g.Key.TeacherAccount ?? string.Empty, g => new { - ConsumeProjectCount = (int)g.Where(x => x.BusinessType == "耗卡").Sum(x => x.ProjectCount), + ConsumeProjectCount = (int)(g.Where(x => x.BusinessType == "耗卡").Sum(x => x.ProjectCount)), ConsumeAchievement = g.Where(x => x.BusinessType == "耗卡").Sum(x => x.Achievement), OrderAchievement = g.Where(x => x.BusinessType == "开卡").Sum(x => x.Achievement), OrderItemCount = g.Where(x => x.BusinessType == "开卡").Sum(x => x.ItemCount), ConsumeItemCount = g.Where(x => x.BusinessType == "耗卡").Sum(x => x.ItemCount), + ConsumeLaborCost = g.Where(x => x.BusinessType == "耗卡").Sum(x => x.LaborCost), } ); @@ -908,13 +953,10 @@ namespace NCC.Extend.LqStatistics if (!string.IsNullOrEmpty(input.TeacherName) && !teacher.TeacherName.Contains(input.TeacherName)) continue; + // 使用账号来匹配业绩数据(因为视图中的teacher_account是kjblszh) + var teacherAccount = teacher.TeacherAccount ?? string.Empty; var stats = teacherStatsDict.GetValueOrDefault( - new - { - TeacherId = teacher.TeacherId, - TeacherName = teacher.TeacherName, - TeacherAccount = teacher.TeacherAccount, - }, + teacherAccount, new { ConsumeProjectCount = 0, @@ -922,6 +964,7 @@ namespace NCC.Extend.LqStatistics OrderAchievement = 0m, OrderItemCount = 0, ConsumeItemCount = 0, + ConsumeLaborCost = 0m, } ); @@ -934,6 +977,7 @@ namespace NCC.Extend.LqStatistics OrderAchievement = stats.OrderAchievement, OrderItemCount = stats.OrderItemCount, ConsumeItemCount = stats.ConsumeItemCount, + ConsumeLaborCost = stats.ConsumeLaborCost, }; result.Add(teacherStats); @@ -3672,6 +3716,5 @@ namespace NCC.Extend.LqStatistics } #endregion - } } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs index ff2ed7d..63bccf5 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs @@ -1043,12 +1043,18 @@ namespace NCC.Extend.LqXhHyhk Kjblsyj = ikjbs_tem.kjblsyj, Yjsj = DateTime.Now, Hkpxid = lqXhPxmxEntity.Id, + // OriginalHdpxNumber = ikjbs_tem.hdpxNumber, + // OvertimeHdpxNumber = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0)), + // HdpxNumber = (decimal)((ikjbs_tem.hdpxNumber ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0))), OriginalHdpxNumber = ikjbs_tem.hdpxNumber, - OvertimeHdpxNumber = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0)), - HdpxNumber = (decimal)((ikjbs_tem.hdpxNumber ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0))), + OvertimeHdpxNumber = 0, + HdpxNumber = ikjbs_tem.hdpxNumber, + // OriginalLaborCost = ikjbs_tem.laborCost, + // OvertimeLaborCost = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0)), + // LaborCost = (decimal)((ikjbs_tem.laborCost ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0))), OriginalLaborCost = ikjbs_tem.laborCost, - OvertimeLaborCost = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0)), - LaborCost = (decimal)((ikjbs_tem.laborCost ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0))), + OvertimeLaborCost = 0, + LaborCost = ikjbs_tem.laborCost, IsEffective = StatusEnum.有效.GetHashCode(), } ); @@ -1328,12 +1334,18 @@ namespace NCC.Extend.LqXhHyhk Kjblsyj = ikjbs_tem.kjblsyj, Yjsj = DateTime.Now, Hkpxid = lqXhPxmxEntity.Id, + // OriginalHdpxNumber = ikjbs_tem.hdpxNumber, + // OvertimeHdpxNumber = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0)), + // HdpxNumber = (decimal)((ikjbs_tem.hdpxNumber ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0))), + // OriginalLaborCost = ikjbs_tem.laborCost, + // OvertimeLaborCost = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0)), + // LaborCost = (decimal)((ikjbs_tem.laborCost ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0))), OriginalHdpxNumber = ikjbs_tem.hdpxNumber, - OvertimeHdpxNumber = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0)), - HdpxNumber = (decimal)((ikjbs_tem.hdpxNumber ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.hdpxNumber ?? 0))), + OvertimeHdpxNumber = 0, + HdpxNumber = ikjbs_tem.hdpxNumber, OriginalLaborCost = ikjbs_tem.laborCost, - OvertimeLaborCost = (decimal)(entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0)), - LaborCost = (decimal)((ikjbs_tem.laborCost ?? 0) + (entity.OvertimeCoefficient * (ikjbs_tem.laborCost ?? 0))), + OvertimeLaborCost = 0, + LaborCost = ikjbs_tem.laborCost, IsEffective = StatusEnum.有效.GetHashCode(), }); } diff --git a/netcore/src/Modularity/Extend/NCC.Extend/Utils/WeChatBotService.cs b/netcore/src/Modularity/Extend/NCC.Extend/Utils/WeChatBotService.cs index 88c785a..7dc6b81 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/Utils/WeChatBotService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/Utils/WeChatBotService.cs @@ -3,6 +3,7 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; +using NCC; namespace NCC.Extend.Utils { @@ -12,17 +13,28 @@ namespace NCC.Extend.Utils public class WeChatBotService { private readonly HttpClient _httpClient; - private const string BOT_API_URL = "http://wx.lvqianmeiye.com/api/Bot/send-text"; - //正式地址 - //https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=581c22a6-cb67-42e5-8c76-b8e90052e188 - //测试地址 - //https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6f8686ec-5011-4c1d-bae9-d82a2a2f4d83 - private const string WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=496f1add-122b-43fc-9e38-0ca79c48b33f"; - private const string WEBHOOK_URL_TEST = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6f8686ec-5011-4c1d-bae9-d82a2a2f4d83"; + private readonly string _botApiUrl; + private readonly string _webhookUrl; + /// + /// 初始化企业微信机器人服务 + /// + /// HTTP客户端 public WeChatBotService(HttpClient httpClient) { _httpClient = httpClient; + + // 从配置文件中读取企业微信机器人配置 + _botApiUrl = App.Configuration["WeChatBot:BotApiUrl"] ?? "http://wx.lvqianmeiye.com/api/Bot/send-text"; + + // 从配置文件中读取Webhook地址(正式或测试地址,通过配置文件切换) + _webhookUrl = App.Configuration["WeChatBot:WebhookUrl"]; + + // 如果配置文件中没有配置,使用默认值 + if (string.IsNullOrEmpty(_webhookUrl)) + { + _webhookUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=496f1add-122b-43fc-9e38-0ca79c48b33f"; + } } /// @@ -36,8 +48,7 @@ namespace NCC.Extend.Utils { var requestData = new { - webhookUrl = WEBHOOK_URL, - // webhookUrl = WEBHOOK_URL_TEST, + webhookUrl = _webhookUrl, content = content, mentionedList = (string)null, mentionedMobileList = (string)null, @@ -46,7 +57,7 @@ namespace NCC.Extend.Utils var json = JsonConvert.SerializeObject(requestData); var httpContent = new StringContent(json, Encoding.UTF8, "application/json"); - var response = await _httpClient.PostAsync(BOT_API_URL, httpContent); + var response = await _httpClient.PostAsync(_botApiUrl, httpContent); if (response.IsSuccessStatusCode) {