diff --git a/antis-ncc-admin/src/views/departmentConsumePerformanceStatistics/index.vue b/antis-ncc-admin/src/views/departmentConsumePerformanceStatistics/index.vue
index a16b20f..d42b42d 100644
--- a/antis-ncc-admin/src/views/departmentConsumePerformanceStatistics/index.vue
+++ b/antis-ncc-admin/src/views/departmentConsumePerformanceStatistics/index.vue
@@ -47,7 +47,7 @@
-
+
@@ -60,7 +60,17 @@
{{ formatMoney(scope.row.ConsumePerformance) }}
-
+
+
+
+ {{ formatNumber(scope.row.HeadCount) }}
+
+
+
+
+ {{ formatNumber(scope.row.PersonCount) }}
+
+
{{ formatDateTime(scope.row.CreateTime) }}
@@ -200,6 +210,21 @@ export default {
maximumFractionDigits: 2
})
},
+ formatNumber(value) {
+ if (value === null || value === undefined) return '0'
+ const num = Number(value)
+ if (num === 0) return '0'
+ if (num % 1 === 0) {
+ // 整数
+ return num.toLocaleString('zh-CN')
+ } else {
+ // 小数
+ return num.toLocaleString('zh-CN', {
+ minimumFractionDigits: 1,
+ maximumFractionDigits: 2
+ })
+ }
+ },
formatDateTime(value) {
if (!value) return '-'
return new Date(value).toLocaleString('zh-CN')
diff --git a/antis-ncc-admin/src/views/salaryStatistics/index.vue b/antis-ncc-admin/src/views/salaryStatistics/index.vue
index 60e5a2c..5d8c7a2 100644
--- a/antis-ncc-admin/src/views/salaryStatistics/index.vue
+++ b/antis-ncc-admin/src/views/salaryStatistics/index.vue
@@ -57,25 +57,25 @@
-
+
-
+
{{ formatMoney(scope.row.TotalPerformance) }}
-
+
{{ formatMoney(scope.row.BasePerformance) }}
-
+
{{ formatMoney(scope.row.CooperationPerformance) }}
-
+
{{ formatMoney(scope.row.RewardPerformance) }}
@@ -83,17 +83,17 @@
-
+
{{ formatMoney(scope.row.NewCustomerPerformance) }}
-
+
{{ formatPercent(scope.row.NewCustomerConversionRate) }}
-
+
{{ formatPercent(scope.row.NewCustomerPoint) }}
@@ -102,240 +102,242 @@
-
+
{{ formatMoney(scope.row.UpgradePerformance) }}
-
+
{{ formatPercent(scope.row.UpgradePoint) }}
-
-
-
-
- {{ formatMoney(scope.row.Consumption) }}
-
+
+
+
+
+ {{ formatMoney(scope.row.Consumption) }}
+
+
+
-
-
+
+
{{ formatMoney(scope.row.StoreTotalPerformance) }}
-
+
{{ formatMoney(scope.row.TeamPerformance) }}
-
+
{{ formatPercent(scope.row.Percentage) }}
-
-
-
-
+
+
+
+
{{ formatPercent(scope.row.CommissionPoint) }}
-
+
{{ formatMoney(scope.row.BasePerformanceCommission) }}
-
+
{{ formatMoney(scope.row.CooperationPerformanceCommission) }}
-
+
{{ formatMoney(scope.row.ConsultantCommission) }}
-
+
{{ formatMoney(scope.row.StoreTZoneCommission) }}
-
+
{{ formatMoney(scope.row.TotalCommission) }}
-
+
{{ formatMoney(scope.row.HealthCoachBaseSalary) }}
-
+
{{ formatMoney(scope.row.HandworkFee) }}
-
+
{{ formatMoney(scope.row.OutherHandworkFee) }}
-
+
{{ formatMoney(scope.row.TransportationAllowance) }}
-
+
{{ formatMoney(scope.row.LessRest) }}
-
+
{{ formatMoney(scope.row.FullAttendance) }}
-
+
{{ formatMoney(scope.row.CalculatedGrossSalary) }}
-
+
{{ formatMoney(scope.row.GuaranteedSalary) }}
-
+
{{ formatMoney(scope.row.GuaranteedLeaveDeduction) }}
-
+
{{ formatMoney(scope.row.GuaranteedBaseSalary) }}
-
+
{{ formatMoney(scope.row.GuaranteedSupplement) }}
-
+
{{ formatMoney(scope.row.FinalGrossSalary) }}
-
+
{{ formatMoney(scope.row.MonthlyTrainingSubsidy) }}
-
+
{{ formatMoney(scope.row.MonthlyTransportSubsidy) }}
-
+
{{ formatMoney(scope.row.LastMonthTrainingSubsidy) }}
-
+
{{ formatMoney(scope.row.LastMonthTransportSubsidy) }}
-
+
{{ formatMoney(scope.row.TotalSubsidy) }}
-
+
{{ formatMoney(scope.row.MissingCard) }}
-
+
{{ formatMoney(scope.row.LateArrival) }}
-
+
{{ formatMoney(scope.row.LeaveDeduction) }}
-
+
{{ formatMoney(scope.row.SocialInsuranceDeduction) }}
-
+
{{ formatMoney(scope.row.RewardDeduction) }}
-
+
{{ formatMoney(scope.row.AccommodationDeduction) }}
-
+
{{ formatMoney(scope.row.StudyPeriodDeduction) }}
-
+
{{ formatMoney(scope.row.WorkClothesDeduction) }}
-
+
{{ formatMoney(scope.row.TotalDeduction) }}
-
+
{{ formatMoney(scope.row.Bonus) }}
-
+
{{ formatMoney(scope.row.ReturnPhoneDeposit) }}
-
+
{{ formatMoney(scope.row.ReturnAccommodationDeposit) }}
-
+
{{ formatMoney(scope.row.ActualSalary) }}
-
+
{{ formatMoney(scope.row.PaidAmount) }}
-
+
{{ formatMoney(scope.row.PendingAmount) }}
-
+
{{ formatMoney(scope.row.LastMonthSupplement) }}
-
+
{{ formatMoney(scope.row.MonthlyTotalPayment) }}
@@ -368,7 +370,7 @@ export default {
return {
loading: false,
tableData: [],
- tableHeight: 500,
+ tableHeight: 890,
queryParams: {
statisticsMonth: '',
storeName: '',
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
index 82b2a57..1f97e27 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKhxx/LqKhxxListQueryInput.cs
@@ -24,6 +24,11 @@ namespace NCC.Extend.Entitys.Dto.LqKhxx
public string id { get; set; }
///
+ /// 关键字
+ ///
+ public string keyWord { get; set; }
+
+ ///
/// 客户名称
///
public string khmc { get; set; }
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqSalaryStatistics/LqSalaryStatisticsListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqSalaryStatistics/LqSalaryStatisticsListOutput.cs
index c4ecf22..0837d43 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqSalaryStatistics/LqSalaryStatisticsListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqSalaryStatistics/LqSalaryStatisticsListOutput.cs
@@ -85,7 +85,7 @@ namespace NCC.Extend.Entitys.Dto.LqSalaryStatistics
///
/// 项目数
///
- public int ProjectCount { get; set; }
+ public decimal ProjectCount { get; set; }
///
/// 门店总业绩
@@ -125,17 +125,18 @@ namespace NCC.Extend.Entitys.Dto.LqSalaryStatistics
///
/// 到店人头
///
- public int AttendanceDays { get; set; }
+ public decimal CustomerCount { get; set; }
///
/// 在店天数
///
- public int StoreDays { get; set; }
+ public decimal WorkingDays { get; set; }
+
///
/// 请假天数
///
- public int LeaveDays { get; set; }
+ public decimal LeaveDays { get; set; }
///
/// 提点
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/LqDepartmentConsumePerformanceStatisticsListOutput.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/LqDepartmentConsumePerformanceStatisticsListOutput.cs
index 9294719..b849401 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/LqDepartmentConsumePerformanceStatisticsListOutput.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/LqDepartmentConsumePerformanceStatisticsListOutput.cs
@@ -55,7 +55,17 @@ namespace NCC.Extend.Entitys.Dto.LqStatistics
///
/// 订单数量
///
- public int OrderCount { get; set; }
+ public decimal OrderCount { get; set; }
+
+ ///
+ /// 人头数(月度去重客户数)
+ ///
+ public decimal HeadCount { get; set; }
+
+ ///
+ /// 人次(日度去重到店数)
+ ///
+ public decimal PersonCount { get; set; }
///
/// 创建时间
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
index 303ed67..12a67c6 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_hytk_mx/LqHytkMxEntity.cs
@@ -54,6 +54,13 @@ namespace NCC.Extend.Entitys.lq_hytk_mx
[SugarColumn(ColumnName = "tkje")]
public decimal? Tkje { get; set; }
+
+ ///
+ /// 退卡时间
+ ///
+ [SugarColumn(ColumnName = "tksj")]
+ public DateTime? Tksj { get; set; }
+
///
/// 项目次数
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
index d4ec98a..4877810 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
@@ -41,6 +41,13 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx
[SugarColumn(ColumnName = "pxjg")]
public decimal Pxjg { get; set; }
+
+ ///
+ /// 业绩时间
+ ///
+ [SugarColumn(ColumnName = "yjsj")]
+ public DateTime? Yjsj { get; set; }
+
///
/// 会员id
///
@@ -53,6 +60,9 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx
[SugarColumn(ColumnName = "F_CreateTIme")]
public DateTime? CreateTIme { get; set; }
+
+
+
///
/// 项目次数
///
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_salary_statistics/LqSalaryStatisticsEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_salary_statistics/LqSalaryStatisticsEntity.cs
index 03a8d8b..08b4960 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_salary_statistics/LqSalaryStatisticsEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_salary_statistics/LqSalaryStatisticsEntity.cs
@@ -141,25 +141,25 @@ namespace NCC.Extend.Entitys.lq_salary_statistics
/// 项目数
///
[SugarColumn(ColumnName = "F_ProjectCount")]
- public int ProjectCount { get; set; }
+ public decimal ProjectCount { get; set; }
///
/// 到店人头
///
[SugarColumn(ColumnName = "F_CustomerCount")]
- public int CustomerCount { get; set; }
+ public decimal CustomerCount { get; set; }
///
/// 在店天数
///
[SugarColumn(ColumnName = "F_WorkingDays")]
- public int WorkingDays { get; set; }
+ public decimal WorkingDays { get; set; }
///
/// 请假天数
///
[SugarColumn(ColumnName = "F_LeaveDays")]
- public int LeaveDays { get; set; }
+ public decimal LeaveDays { get; set; }
///
/// 提点
diff --git a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_department_consume_performance/LqStatisticsDepartmentConsumePerformanceEntity.cs b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_department_consume_performance/LqStatisticsDepartmentConsumePerformanceEntity.cs
index 5adf366..e34e6d4 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_department_consume_performance/LqStatisticsDepartmentConsumePerformanceEntity.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_department_consume_performance/LqStatisticsDepartmentConsumePerformanceEntity.cs
@@ -100,5 +100,17 @@ namespace NCC.Extend.Entitys.lq_statistics_department_consume_performance
///
[SugarColumn(ColumnName = "F_IsNewStore")]
public string IsNewStore { get; set; }
+
+ ///
+ /// 人头数(月度去重客户数)
+ ///
+ [SugarColumn(ColumnName = "F_HeadCount")]
+ public decimal HeadCount { get; set; }
+
+ ///
+ /// 人次(日度去重到店数)
+ ///
+ [SugarColumn(ColumnName = "F_PersonCount")]
+ public decimal PersonCount { get; set; }
}
}
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
index 7f8ba96..c27be94 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqHytkHytkService.cs
@@ -379,6 +379,7 @@ namespace NCC.Extend.LqHytkHytk
BillingItemId = item.billingItemId,
CreateTime = DateTime.Now,
CreateUser = userInfo.userId,
+ Tksj = input.tksj,
DeleteMark = 0,
Px = item.px,
Pxmc = item.pxmc,
@@ -475,7 +476,7 @@ namespace NCC.Extend.LqHytkHytk
#region 删除退卡信息
///
- /// 删除退卡信息
+ /// 删除退卡信息(逻辑删除)
///
/// 主键
///
@@ -491,6 +492,79 @@ namespace NCC.Extend.LqHytkHytk
}
#endregion
+ #region 物理删除退卡信息
+ ///
+ /// 物理删除退卡信息
+ ///
+ ///
+ /// 彻底删除退卡记录及其所有关联数据,包括:
+ /// - 退卡主表记录
+ /// - 退卡品项明细记录
+ /// - 退卡健康师业绩记录
+ /// - 退卡科技部老师业绩记录
+ ///
+ /// 注意:此操作不可逆,请谨慎使用
+ ///
+ /// 退卡记录主键ID
+ /// 删除结果
+ /// 删除成功
+ /// 退卡记录不存在
+ /// 服务器内部错误
+ [HttpDelete("physical/{id}")]
+ public async Task PhysicalDelete(string id)
+ {
+ try
+ {
+ // 检查退卡记录是否存在
+ var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
+ if (entity == null)
+ {
+ throw NCCException.Oh("退卡记录不存在");
+ }
+
+ // 开启事务
+ _db.BeginTran();
+
+ // 1. 删除退卡品项明细记录
+ await _db.Deleteable()
+ .Where(x => x.RefundInfoId == id)
+ .ExecuteCommandAsync();
+
+ // 2. 删除退卡健康师业绩记录
+ await _db.Deleteable()
+ .Where(x => x.Gltkbh == id)
+ .ExecuteCommandAsync();
+
+ // 3. 删除退卡科技部老师业绩记录
+ await _db.Deleteable()
+ .Where(x => x.Gltkbh == id)
+ .ExecuteCommandAsync();
+
+ // 4. 删除退卡主表记录
+ await _db.Deleteable()
+ .Where(x => x.Id == id)
+ .ExecuteCommandAsync();
+
+ // 提交事务
+ _db.CommitTran();
+
+ return new
+ {
+ success = true,
+ message = "退卡记录已彻底删除",
+ deletedId = id,
+ deletedTime = DateTime.Now
+ };
+ }
+ catch (Exception ex)
+ {
+ // 回滚事务
+ _db.RollbackTran();
+ throw NCCException.Oh($"物理删除退卡记录失败: {ex.Message}");
+ }
+ }
+ #endregion
+
#region 获取退卡信息详情
///
/// 获取退卡信息详情
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
index dc996ea..e09a318 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -292,6 +292,7 @@ namespace NCC.Extend.LqKdKdjlb
{
Id = YitIdHelper.NextId().ToString(),
Glkdbh = newEntity.Id,
+ Yjsj = input.kdrq,
CreateTIme = DateTime.Now,
MemberId = entity.Kdhy,
IsEnabled = 0,
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
index 8c244ed..8a5458e 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs
@@ -85,6 +85,7 @@ namespace NCC.Extend.LqKhxx
{
var sidx = input.sidx == null ? "id" : input.sidx;
var data = await _db.Queryable()
+ .WhereIF(!string.IsNullOrEmpty(input.keyWord), p => p.Khmc.Contains(input.keyWord) || p.Sjh.Contains(input.keyWord) || p.Dah.Contains(input.keyWord))
.WhereIF(!string.IsNullOrEmpty(input.id), p => p.Id.Contains(input.id))
.WhereIF(!string.IsNullOrEmpty(input.khmc), p => p.Khmc.Contains(input.khmc))
.WhereIF(!string.IsNullOrEmpty(input.sjh), p => p.Sjh.Contains(input.sjh))
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
index 7b1fc63..2741486 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
@@ -1413,72 +1413,135 @@ namespace NCC.Extend.LqStatistics
try
{
- // 使用数据库聚合方式,直接在数据库中完成所有统计计算
- // 按照开单记录统计,避免重复计算
+ // 使用子查询避免重复计算,按开单记录统计业绩
var sql = @"
SELECT
- jksyj.jkszh AS EmployeeId,
- u.F_REALNAME AS EmployeeName,
- u.F_MDID AS StoreId,
- COALESCE(md.dm, '') AS StoreName,
- COALESCE(jsj.F_Id, '') AS GoldTriangleId,
- COALESCE(jsj.jsj, '') AS GoldTriangleName,
- CASE
- WHEN jsjUser.is_leader = 1 THEN '顾问'
- ELSE COALESCE(u.F_GW, '')
- END AS Position,
- COUNT(DISTINCT jksyj.glkdbh) AS OrderCount,
- COUNT(DISTINCT CASE WHEN kd.sfskdd = '是' THEN jksyj.glkdbh END) AS FirstOrderCount,
- COUNT(DISTINCT CASE WHEN kd.sfskdd = '否' THEN jksyj.glkdbh END) AS UpgradeOrderCount,
- SUM(CASE WHEN kd.sfskdd = '是' THEN CAST(jksyj.jksyj AS DECIMAL(18,2)) ELSE 0 END) AS FirstOrderPerformance,
- SUM(CASE WHEN kd.sfskdd = '否' THEN CAST(jksyj.jksyj AS DECIMAL(18,2)) ELSE 0 END) AS UpgradeOrderPerformance,
- MAX(jksyj.yjsj) AS LastOrderDate,
- MIN(jksyj.yjsj) AS FirstOrderDate,
- SUM(
+ order_stats.EmployeeId,
+ order_stats.EmployeeName,
+ order_stats.StoreId,
+ order_stats.StoreName,
+ order_stats.GoldTriangleId,
+ order_stats.GoldTriangleName,
+ order_stats.Position,
+ order_stats.OrderCount,
+ order_stats.FirstOrderCount,
+ order_stats.UpgradeOrderCount,
+ order_stats.FirstOrderPerformance,
+ order_stats.UpgradeOrderPerformance,
+ order_stats.LastOrderDate,
+ order_stats.FirstOrderDate,
+ COALESCE(coop_stats.CooperationPerformance, 0) AS CooperationPerformance,
+ COALESCE(base_stats.BasePerformance, 0) AS BasePerformance,
+ order_stats.TotalPerformance
+ FROM (
+ -- 按开单记录统计基础数据,避免重复计算
+ SELECT
+ order_summary.jkszh AS EmployeeId,
+ u.F_REALNAME AS EmployeeName,
+ u.F_MDID AS StoreId,
+ COALESCE(md.dm, '') AS StoreName,
+ COALESCE(jsjUser.F_Id, '') AS GoldTriangleId,
+ COALESCE(jsjUser.jsj, '') AS GoldTriangleName,
CASE
- WHEN xmzl.fl3 = '合作业绩' THEN CAST(jksyj.jksyj AS DECIMAL(18,2))
- ELSE 0
- END
- ) AS CooperationPerformance,
- SUM(
- CASE
- WHEN xmzl.fl3 IS NULL OR xmzl.fl3 != '合作业绩' THEN CAST(jksyj.jksyj AS DECIMAL(18,2))
- ELSE 0
- END
- ) AS BasePerformance,
- SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance
- FROM lq_kd_jksyj jksyj
- INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id AND pxmx.F_IsEffective = 1
- INNER JOIN lq_kd_kdjlb kd ON jksyj.glkdbh = kd.F_Id
- INNER JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id
- INNER JOIN BASE_USER u ON jksyj.jkszh = u.F_Id
- LEFT JOIN lq_mdxx md ON u.F_MDID = md.F_Id
- LEFT JOIN lq_ycsd_jsj jsj ON u.F_MDID = jsj.md AND jsj.yf = @statisticsMonth
+ WHEN jsjUser.is_leader = 1 THEN '顾问'
+ ELSE COALESCE(u.F_GW, '')
+ END AS Position,
+ COUNT(*) AS OrderCount,
+ COUNT(CASE WHEN order_summary.sfskdd = '是' THEN 1 END) AS FirstOrderCount,
+ COUNT(CASE WHEN order_summary.sfskdd = '否' THEN 1 END) AS UpgradeOrderCount,
+ SUM(CASE WHEN order_summary.sfskdd = '是' THEN order_summary.order_performance ELSE 0 END) AS FirstOrderPerformance,
+ SUM(CASE WHEN order_summary.sfskdd = '否' THEN order_summary.order_performance ELSE 0 END) AS UpgradeOrderPerformance,
+ MAX(order_summary.yjsj) AS LastOrderDate,
+ MIN(order_summary.yjsj) AS FirstOrderDate,
+ SUM(order_summary.order_performance) AS TotalPerformance
+ FROM (
+ -- 先按开单记录汇总业绩,避免重复计算
+ SELECT
+ jksyj.jkszh,
+ jksyj.glkdbh,
+ kd.sfskdd,
+ MAX(jksyj.yjsj) as yjsj,
+ SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) as order_performance
+ FROM lq_kd_jksyj jksyj
+ INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id AND pxmx.F_IsEffective = 1
+ INNER JOIN lq_kd_kdjlb kd ON jksyj.glkdbh = kd.F_Id
+ WHERE jksyj.yjsj IS NOT NULL
+ AND jksyj.jksyj IS NOT NULL
+ AND jksyj.jksyj != ''
+ AND jksyj.jksyj != '0'
+ AND jksyj.F_kdpxid IS NOT NULL
+ AND jksyj.F_kdpxid != ''
+ AND jksyj.F_IsEffective = 1
+ AND YEAR(jksyj.yjsj) = @year
+ AND MONTH(jksyj.yjsj) = @month
+ GROUP BY jksyj.jkszh, jksyj.glkdbh, kd.sfskdd
+ ) order_summary
+ INNER JOIN BASE_USER u ON order_summary.jkszh = u.F_Id
+ LEFT JOIN lq_mdxx md ON u.F_MDID = md.F_Id
+ LEFT JOIN (
+ SELECT
+ jsjUser.user_id,
+ MIN(jsjUser.jsj_id) as F_Id,
+ MIN(jsj.jsj) as jsj,
+ MIN(jsjUser.is_leader) as is_leader
+ FROM lq_jinsanjiao_user jsjUser
+ INNER JOIN lq_ycsd_jsj jsj ON jsjUser.jsj_id COLLATE utf8mb4_general_ci = jsj.F_Id COLLATE utf8mb4_general_ci AND jsj.yf = @statisticsMonth
+ WHERE jsjUser.F_Month = @statisticsMonth
+ AND jsjUser.status = 'ACTIVE'
+ AND jsjUser.F_DeleteMark = 0
+ GROUP BY jsjUser.user_id
+ ) jsjUser ON order_summary.jkszh = jsjUser.user_id
+ GROUP BY
+ order_summary.jkszh,
+ u.F_REALNAME,
+ u.F_MDID,
+ md.dm,
+ jsjUser.F_Id,
+ jsjUser.jsj,
+ jsjUser.is_leader,
+ u.F_GW
+ ) order_stats
LEFT JOIN (
- SELECT DISTINCT user_id, F_Month, MAX(is_leader) as is_leader
- FROM lq_jinsanjiao_user
- WHERE F_Month = @statisticsMonth
- GROUP BY user_id, F_Month
- ) jsjUser ON jksyj.jkszh = jsjUser.user_id
- WHERE jksyj.yjsj IS NOT NULL
- AND jksyj.jksyj IS NOT NULL
- AND jksyj.jksyj != ''
- AND jksyj.jksyj != '0'
- AND jksyj.F_kdpxid IS NOT NULL
- AND jksyj.F_kdpxid != ''
- AND jksyj.F_IsEffective = 1
- AND YEAR(jksyj.yjsj) = @year
- AND MONTH(jksyj.yjsj) = @month
- GROUP BY
- jksyj.jkszh,
- u.F_REALNAME,
- u.F_MDID,
- md.dm,
- jsj.F_Id,
- jsj.jsj,
- jsjUser.is_leader,
- u.F_GW
- ORDER BY TotalPerformance DESC";
+ -- 合作业绩统计
+ SELECT
+ jksyj.jkszh AS EmployeeId,
+ SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS CooperationPerformance
+ FROM lq_kd_jksyj jksyj
+ INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id AND pxmx.F_IsEffective = 1
+ INNER JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id
+ WHERE jksyj.yjsj IS NOT NULL
+ AND jksyj.jksyj IS NOT NULL
+ AND jksyj.jksyj != ''
+ AND jksyj.jksyj != '0'
+ AND jksyj.F_kdpxid IS NOT NULL
+ AND jksyj.F_kdpxid != ''
+ AND jksyj.F_IsEffective = 1
+ AND YEAR(jksyj.yjsj) = @year
+ AND MONTH(jksyj.yjsj) = @month
+ AND xmzl.fl3 = '合作业绩'
+ GROUP BY jksyj.jkszh
+ ) coop_stats ON order_stats.EmployeeId = coop_stats.EmployeeId
+ LEFT JOIN (
+ -- 基础业绩统计
+ SELECT
+ jksyj.jkszh AS EmployeeId,
+ SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS BasePerformance
+ FROM lq_kd_jksyj jksyj
+ INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id AND pxmx.F_IsEffective = 1
+ LEFT JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id
+ WHERE jksyj.yjsj IS NOT NULL
+ AND jksyj.jksyj IS NOT NULL
+ AND jksyj.jksyj != ''
+ AND jksyj.jksyj != '0'
+ AND jksyj.F_kdpxid IS NOT NULL
+ AND jksyj.F_kdpxid != ''
+ AND jksyj.F_IsEffective = 1
+ AND YEAR(jksyj.yjsj) = @year
+ AND MONTH(jksyj.yjsj) = @month
+ AND (xmzl.fl3 IS NULL OR xmzl.fl3 != '合作业绩')
+ GROUP BY jksyj.jkszh
+ ) base_stats ON order_stats.EmployeeId = base_stats.EmployeeId
+ ORDER BY order_stats.TotalPerformance DESC";
// 解析统计月份
var year = int.Parse(statisticsMonth.Substring(0, 4));
@@ -2139,13 +2202,39 @@ namespace NCC.Extend.LqStatistics
@statisticsMonth as F_StatisticsMonth,
COALESCE(SUM(jksyj.jksyj), 0) as F_ConsumePerformance,
COALESCE(SUM(jksyj.F_kdpxNumber), 0) as F_ConsumeQuantity,
- COALESCE(SUM(jksyj.F_LaborCost), 0) as F_ManualFee
+ COALESCE(SUM(jksyj.F_LaborCost), 0) as F_ManualFee,
+ COALESCE(headcount_stats.F_HeadCount, 0) as F_HeadCount,
+ COALESCE(personcount_stats.F_PersonCount, 0) as F_PersonCount
FROM lq_xh_jksyj jksyj
INNER JOIN lq_xh_hyhk hyhk ON jksyj.glkdbh = hyhk.F_Id AND hyhk.F_IsEffective = 1
LEFT JOIN lq_mdxx md ON hyhk.md = md.F_Id
+ LEFT JOIN (
+ -- 人头统计:月度去重客户数
+ SELECT
+ jksyj.jkszh,
+ hyhk.md,
+ COUNT(DISTINCT hyhk.hy) as F_HeadCount
+ FROM lq_xh_jksyj jksyj
+ INNER JOIN lq_xh_hyhk hyhk ON jksyj.glkdbh = hyhk.F_Id AND hyhk.F_IsEffective = 1
+ WHERE jksyj.F_IsEffective = 1
+ AND DATE_FORMAT(hyhk.hksj, '%Y%m') = @statisticsMonth
+ GROUP BY jksyj.jkszh, hyhk.md
+ ) headcount_stats ON jksyj.jkszh = headcount_stats.jkszh AND hyhk.md = headcount_stats.md
+ LEFT JOIN (
+ -- 人次统计:日度去重到店数
+ SELECT
+ jksyj.jkszh,
+ hyhk.md,
+ COUNT(DISTINCT DATE(hyhk.hksj)) as F_PersonCount
+ FROM lq_xh_jksyj jksyj
+ INNER JOIN lq_xh_hyhk hyhk ON jksyj.glkdbh = hyhk.F_Id AND hyhk.F_IsEffective = 1
+ WHERE jksyj.F_IsEffective = 1
+ AND DATE_FORMAT(hyhk.hksj, '%Y%m') = @statisticsMonth
+ GROUP BY jksyj.jkszh, hyhk.md
+ ) personcount_stats ON jksyj.jkszh = personcount_stats.jkszh AND hyhk.md = personcount_stats.md
WHERE jksyj.F_IsEffective = 1
AND DATE_FORMAT(hyhk.hksj, '%Y%m') = @statisticsMonth
- GROUP BY jksyj.jkszh, jksyj.jksxm, hyhk.md, md.mdbm, md.dm";
+ GROUP BY jksyj.jkszh, jksyj.jksxm, hyhk.md, md.mdbm, md.dm, headcount_stats.F_HeadCount, personcount_stats.F_PersonCount";
var healthCoachData = await _db.Ado.SqlQueryAsync(healthCoachSql, new { statisticsMonth });
foreach (var item in healthCoachData)
@@ -2196,6 +2285,8 @@ namespace NCC.Extend.LqStatistics
ConsumeQuantity = Convert.ToDecimal(item.F_ConsumeQuantity ?? 0),
ManualFee = Convert.ToDecimal(item.F_ManualFee ?? 0),
IsNewStore = isNewStore,
+ HeadCount = Convert.ToDecimal(item.F_HeadCount ?? 0),
+ PersonCount = Convert.ToDecimal(item.F_PersonCount ?? 0),
CreateTime = DateTime.Now
});
}
@@ -2213,7 +2304,9 @@ namespace NCC.Extend.LqStatistics
@statisticsMonth as F_StatisticsMonth,
COALESCE(SUM(kjbsyj.kjblsyj), 0) as F_ConsumePerformance,
COALESCE(SUM(kjbsyj.F_hdpxNumber), 0) as F_ConsumeQuantity,
- COALESCE(SUM(kjbsyj.F_LaborCost), 0) as F_ManualFee
+ COALESCE(SUM(kjbsyj.F_LaborCost), 0) as F_ManualFee,
+ 0 as F_HeadCount,
+ 0 as F_PersonCount
FROM lq_xh_kjbsyj kjbsyj
INNER JOIN lq_xh_hyhk hyhk ON kjbsyj.glkdbh = hyhk.F_Id AND hyhk.F_IsEffective = 1
LEFT JOIN lq_mdxx md ON hyhk.md = md.F_Id
@@ -2270,6 +2363,8 @@ namespace NCC.Extend.LqStatistics
ConsumeQuantity = Convert.ToDecimal(item.F_ConsumeQuantity ?? 0),
ManualFee = Convert.ToDecimal(item.F_ManualFee ?? 0),
IsNewStore = isNewStore,
+ HeadCount = Convert.ToDecimal(item.F_HeadCount ?? 0),
+ PersonCount = Convert.ToDecimal(item.F_PersonCount ?? 0),
CreateTime = DateTime.Now
});
}
@@ -2408,24 +2503,47 @@ namespace NCC.Extend.LqStatistics
// 统计门店总业绩数据
var storePerformanceSql = @"
SELECT
- kd.djmd as F_StoreId,
- md.dm as F_StoreName,
- @statisticsMonth as F_StatisticsMonth,
- COALESCE(SUM(kd.zdyj), 0) as F_TotalPerformance,
- COALESCE(SUM(kd.qk), 0) as F_DebtAmount,
- COALESCE(SUM(kd.sfyj), 0) as F_TotalOrderPerformance,
- COALESCE(SUM(kd.F_DeductAmount), 0) as F_StorageDeductionAmount,
- COUNT(pxmx.F_Id) as F_ItemQuantity,
- COUNT(DISTINCT CASE WHEN kd.sfskdd = '是' THEN kd.F_Id END) as F_FirstOrderCount,
- COUNT(DISTINCT CASE WHEN kd.sfskdd = '否' THEN kd.F_Id END) as F_UpgradeOrderCount,
- SUM(CASE WHEN kd.sfskdd = '是' THEN COALESCE(kd.zdyj, 0) ELSE 0 END) as F_FirstOrderPerformance,
- SUM(CASE WHEN kd.sfskdd = '否' THEN COALESCE(kd.zdyj, 0) ELSE 0 END) as F_UpgradeOrderPerformance
- FROM lq_kd_kdjlb kd
- LEFT JOIN lq_mdxx md ON kd.djmd = md.F_Id
- LEFT JOIN lq_kd_pxmx pxmx ON kd.F_Id = pxmx.glkdbh AND pxmx.F_IsEffective = 1
- WHERE kd.F_IsEffective = 1
- AND DATE_FORMAT(kd.kdrq, '%Y%m') = @statisticsMonth
- GROUP BY kd.djmd, md.dm";
+ store_data.F_StoreId,
+ store_data.F_StoreName,
+ store_data.F_StatisticsMonth,
+ store_data.F_TotalPerformance,
+ store_data.F_DebtAmount,
+ store_data.F_TotalOrderPerformance,
+ store_data.F_StorageDeductionAmount,
+ COALESCE(item_data.F_ItemQuantity, 0) as F_ItemQuantity,
+ store_data.F_FirstOrderCount,
+ store_data.F_UpgradeOrderCount,
+ store_data.F_FirstOrderPerformance,
+ store_data.F_UpgradeOrderPerformance
+ FROM (
+ SELECT
+ kd.djmd as F_StoreId,
+ md.dm as F_StoreName,
+ @statisticsMonth as F_StatisticsMonth,
+ COALESCE(SUM(kd.zdyj), 0) as F_TotalPerformance,
+ COALESCE(SUM(kd.qk), 0) as F_DebtAmount,
+ COALESCE(SUM(kd.sfyj), 0) as F_TotalOrderPerformance,
+ COALESCE(SUM(kd.F_DeductAmount), 0) as F_StorageDeductionAmount,
+ COUNT(DISTINCT CASE WHEN kd.sfskdd = '是' THEN kd.F_Id END) as F_FirstOrderCount,
+ COUNT(DISTINCT CASE WHEN kd.sfskdd = '否' THEN kd.F_Id END) as F_UpgradeOrderCount,
+ SUM(CASE WHEN kd.sfskdd = '是' THEN COALESCE(kd.zdyj, 0) ELSE 0 END) as F_FirstOrderPerformance,
+ SUM(CASE WHEN kd.sfskdd = '否' THEN COALESCE(kd.zdyj, 0) ELSE 0 END) as F_UpgradeOrderPerformance
+ FROM lq_kd_kdjlb kd
+ LEFT JOIN lq_mdxx md ON kd.djmd = md.F_Id
+ WHERE kd.F_IsEffective = 1
+ AND DATE_FORMAT(kd.kdrq, '%Y%m') = @statisticsMonth
+ GROUP BY kd.djmd, md.dm
+ ) store_data
+ LEFT JOIN (
+ SELECT
+ kd.djmd as F_StoreId,
+ COUNT(pxmx.F_ProjectNumber) as F_ItemQuantity
+ FROM lq_kd_kdjlb kd
+ LEFT JOIN lq_kd_pxmx pxmx ON kd.F_Id = pxmx.glkdbh AND pxmx.F_IsEffective = 1
+ WHERE kd.F_IsEffective = 1
+ AND DATE_FORMAT(kd.kdrq, '%Y%m') = @statisticsMonth
+ GROUP BY kd.djmd
+ ) item_data ON store_data.F_StoreId = item_data.F_StoreId";
var storePerformanceData = await _db.Ado.SqlQueryAsync(storePerformanceSql, new { statisticsMonth });
@@ -2664,8 +2782,8 @@ namespace NCC.Extend.LqStatistics
UpgradePoint = x.UpgradePoint,
Consumption = x.Consumption,
ProjectCount = x.ProjectCount,
- AttendanceDays = x.CustomerCount,
- StoreDays = x.WorkingDays,
+ CustomerCount = x.CustomerCount,
+ WorkingDays = x.WorkingDays,
LeaveDays = x.LeaveDays,
CommissionPoint = x.CommissionPoint,
BasePerformanceCommission = x.BasePerformanceCommission,
@@ -2809,7 +2927,6 @@ namespace NCC.Extend.LqStatistics
s.F_TotalPerformance = p.F_TotalPerformance,
s.F_BasePerformance = p.F_BasePerformance,
s.F_CooperationPerformance = p.F_CooperationPerformance,
- s.F_ProjectCount = p.F_OrderCount,
s.F_NewCustomerPerformance = p.F_FirstOrderPerformance,
s.F_UpgradePerformance = p.F_UpgradeOrderPerformance
WHERE s.F_StatisticsMonth = @statisticsMonth";
@@ -2827,7 +2944,7 @@ namespace NCC.Extend.LqStatistics
ON s.F_StoreId COLLATE utf8mb4_unicode_ci = st.F_StoreId COLLATE utf8mb4_unicode_ci
AND s.F_StatisticsMonth = st.F_StatisticsMonth
SET
- s.F_StoreTotalPerformance = st.F_TotalPerformance
+ s.F_StoreTotalPerformance = st.F_TotalOrderPerformance
WHERE s.F_StatisticsMonth = @statisticsMonth";
await _db.Ado.ExecuteCommandAsync(storePerformanceSql, new
@@ -2854,9 +2971,60 @@ namespace NCC.Extend.LqStatistics
userId = _userManager.UserId
});
+ // 从个人消耗业绩统计表更新消耗数据
+ var consumePerformanceSql = @"
+ UPDATE lq_salary_statistics s
+ INNER JOIN lq_statistics_department_consume_performance cp
+ ON s.F_EmployeeId COLLATE utf8mb4_general_ci = cp.F_UserId COLLATE utf8mb4_general_ci
+ AND s.F_StatisticsMonth COLLATE utf8mb4_general_ci = cp.F_StatisticsMonth COLLATE utf8mb4_general_ci
+ SET
+ s.F_Consumption = cp.F_ConsumePerformance,
+ s.F_ProjectCount = cp.F_ConsumeQuantity,
+ s.F_HandworkFee = cp.F_ManualFee,
+ s.F_CustomerCount = cp.F_HeadCount
+ WHERE s.F_StatisticsMonth = @statisticsMonth";
+
+ await _db.Ado.ExecuteCommandAsync(consumePerformanceSql, new
+ {
+ statisticsMonth,
+ userId = _userManager.UserId
+ });
+
+ // 计算并更新底薪
+ await CalculateAndUpdateBaseSalary(statisticsMonth);
+
_logger.LogInformation($"从其他统计表更新工资数据完成 - 月份: {statisticsMonth}");
}
+ ///
+ /// 计算并更新健康师底薪
+ ///
+ private async Task CalculateAndUpdateBaseSalary(string statisticsMonth)
+ {
+ // 健康师底薪计算
+ var healthCoachSalarySql = @"
+ UPDATE lq_salary_statistics s
+ SET s.F_HealthCoachBaseSalary = CASE
+ -- 三星:月消耗达到40000元 且 项目数达到156个 → 底薪2400元
+ WHEN s.F_Consumption >= 40000 AND s.F_ProjectCount >= 156 THEN 2400
+ -- 二星:月消耗达到20000元 且 项目数达到126个 → 底薪2200元
+ WHEN s.F_Consumption >= 20000 AND s.F_ProjectCount >= 126 THEN 2200
+ -- 一星:月消耗达到10000元 或 项目数达到96个 → 底薪2000元
+ WHEN s.F_Consumption >= 10000 OR s.F_ProjectCount >= 96 THEN 2000
+ -- 0星:月消耗未达到10000元 且 项目数未达到96个 → 底薪1800元
+ ELSE 1800
+ END
+ WHERE s.F_StatisticsMonth = @statisticsMonth
+ AND s.F_Position = '健康师'";
+
+ await _db.Ado.ExecuteCommandAsync(healthCoachSalarySql, new
+ {
+ statisticsMonth
+ });
+
+ _logger.LogInformation($"健康师底薪计算完成 - 月份: {statisticsMonth}");
+ }
+
#endregion
#region 其他统计模块列表查询接口
@@ -3055,7 +3223,9 @@ namespace NCC.Extend.LqStatistics
Position = it.DepartmentType,
TotalPerformance = it.ConsumePerformance, // 使用ConsumePerformance作为总业绩
ConsumePerformance = it.ConsumePerformance,
- OrderCount = (int)it.ConsumeQuantity, // 使用ConsumeQuantity作为订单数量
+ OrderCount = it.ConsumeQuantity, // 使用ConsumeQuantity作为订单数量
+ HeadCount = it.HeadCount, // 人头数
+ PersonCount = it.PersonCount, // 人次
CreateTime = it.CreateTime.HasValue ? it.CreateTime.Value : DateTime.Now
}).ToList();
diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
index 5da604d..c06d665 100644
--- a/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
+++ b/netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
@@ -346,18 +346,7 @@ namespace NCC.Extend.LqXhHyhk
// 批量插入品项明细
if (allPxmxEntities.Any())
{
- // 分别处理插入和更新
- var existingEntities = allPxmxEntities.Where(e => !string.IsNullOrEmpty(e.Id)).ToList();
- var newEntities = allPxmxEntities.Where(e => string.IsNullOrEmpty(e.Id)).ToList();
-
- if (existingEntities.Any())
- {
- await _db.Updateable(existingEntities).ExecuteCommandAsync();
- }
- if (newEntities.Any())
- {
- await _db.Insertable(newEntities).ExecuteCommandAsync();
- }
+ await _db.Insertable(allPxmxEntities).ExecuteCommandAsync();
}
// 批量插入健康师业绩
if (allJksyjEntities.Any())