Commit 86e6cb7030c926402c8e0cbbdde56d57ca567d47

Authored by “wangming”
1 parent 0b87d248

对开单加上了是否有效的逻辑,完善了开单业绩统计的部分

netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdDeductinfo/LqKdDeductinfoCrInput.cs
@@ -9,6 +9,11 @@ namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo @@ -9,6 +9,11 @@ namespace NCC.Extend.Entitys.Dto.LqKdDeductinfo
9 public class LqKdDeductinfoCrInput 9 public class LqKdDeductinfoCrInput
10 { 10 {
11 /// <summary> 11 /// <summary>
  12 + /// 扣减编号
  13 + /// </summary>
  14 + public string id { get; set; }
  15 +
  16 + /// <summary>
12 /// 扣减类型 17 /// 扣减类型
13 /// </summary> 18 /// </summary>
14 [Required(ErrorMessage = "扣减类型不能为空")] 19 [Required(ErrorMessage = "扣减类型不能为空")]
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_jksyj/LqKdJksyjEntity.cs
@@ -64,5 +64,11 @@ namespace NCC.Extend.Entitys.lq_kd_jksyj @@ -64,5 +64,11 @@ namespace NCC.Extend.Entitys.lq_kd_jksyj
64 /// </summary> 64 /// </summary>
65 [SugarColumn(ColumnName = "F_kdpxid")] 65 [SugarColumn(ColumnName = "F_kdpxid")]
66 public string Kdpxid { get; set; } 66 public string Kdpxid { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 是否有效
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_IsEffective")]
  72 + public int IsEffective { get; set; } = 1;
67 } 73 }
68 } 74 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kdjlb/LqKdKdjlbEntity.cs
@@ -52,7 +52,7 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb @@ -52,7 +52,7 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
52 /// </summary> 52 /// </summary>
53 [SugarColumn(ColumnName = "zdyj")] 53 [SugarColumn(ColumnName = "zdyj")]
54 public decimal Zdyj { get; set; } 54 public decimal Zdyj { get; set; }
55 - 55 +
56 56
57 /// <summary> 57 /// <summary>
58 /// 实付业绩 58 /// 实付业绩
@@ -197,5 +197,12 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb @@ -197,5 +197,12 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
197 /// </summary> 197 /// </summary>
198 [SugarColumn(ColumnName = "F_UpdateTime")] 198 [SugarColumn(ColumnName = "F_UpdateTime")]
199 public DateTime UpdateTime { get; set; } 199 public DateTime UpdateTime { get; set; }
  200 +
  201 + /// <summary>
  202 + /// 是否有效
  203 + /// </summary>
  204 + [SugarColumn(ColumnName = "F_IsEffective")]
  205 + public int IsEffective { get; set; } = 1;
  206 +
200 } 207 }
201 } 208 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_kjbsyj/LqKdKjbsyjEntity.cs
@@ -64,5 +64,11 @@ namespace NCC.Extend.Entitys.lq_kd_kjbsyj @@ -64,5 +64,11 @@ namespace NCC.Extend.Entitys.lq_kd_kjbsyj
64 /// </summary> 64 /// </summary>
65 [SugarColumn(ColumnName = "F_LaborCost")] 65 [SugarColumn(ColumnName = "F_LaborCost")]
66 public decimal? LaborCost { get; set; } 66 public decimal? LaborCost { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 是否有效
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_IsEffective")]
  72 + public int IsEffective { get; set; } = 1;
67 } 73 }
68 } 74 }
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_kd_pxmx/LqKdPxmxEntity.cs
@@ -82,5 +82,11 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx @@ -82,5 +82,11 @@ namespace NCC.Extend.Entitys.lq_kd_pxmx
82 /// </summary> 82 /// </summary>
83 [SugarColumn(ColumnName = "F_ActualPrice")] 83 [SugarColumn(ColumnName = "F_ActualPrice")]
84 public decimal ActualPrice { get; set; } 84 public decimal ActualPrice { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 是否有效
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "F_IsEffective")]
  90 + public int IsEffective { get; set; } = 1;
85 } 91 }
86 } 92 }
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
@@ -799,5 +799,270 @@ namespace NCC.Extend.LqKdKdjlb @@ -799,5 +799,270 @@ namespace NCC.Extend.LqKdKdjlb
799 .ToList(); 799 .ToList();
800 } 800 }
801 #endregion 801 #endregion
  802 +
  803 + #region 修改开单记录,不做删除,仅健康师业绩、科技部老师业绩信息
  804 + /// <summary>
  805 + /// 修改开单记录,不做删除,仅健康师业绩、科技部老师业绩信息
  806 + /// </summary>
  807 + /// <remarks>
  808 + /// 更新开单记录及其关联的品项明细、健康师业绩、科技部老师业绩信息
  809 + ///
  810 + /// 示例请求:
  811 + /// ```json
  812 + /// {
  813 + /// "id": "开单编号",
  814 + /// "djmd": "单据门店",
  815 + /// "jsj": "金三角",
  816 + /// "kdrq": "2025-01-11",
  817 + /// "lqKdPxmxList": [
  818 + /// {
  819 + /// "px": "品项编号",
  820 + /// "pxmc": "品项名称",
  821 + /// "pxjg": 100.00,
  822 + /// "projectNumber": 1,
  823 + /// "sourceType": "购买",
  824 + /// "lqKdJksyjList": [
  825 + /// {
  826 + /// "jks": "健康师",
  827 + /// "jksxm": "健康师姓名",
  828 + /// "jksyj": "100"
  829 + /// }
  830 + /// ]
  831 + /// }
  832 + /// ]
  833 + /// }
  834 + /// ```
  835 + ///
  836 + /// 参数说明:
  837 + /// - id: 开单记录主键ID
  838 + /// - input: 开单记录更新参数,包含品项明细和业绩信息
  839 + /// </remarks>
  840 + /// <param name="id">开单记录主键ID</param>
  841 + /// <param name="input">开单记录更新参数</param>
  842 + /// <returns>无返回值</returns>
  843 + /// <response code="200">更新成功</response>
  844 + /// <response code="400">参数错误或数据验证失败</response>
  845 + /// <response code="500">服务器内部错误</response>
  846 + [HttpPut("UpdateForNoDelete/{id}")]
  847 + public async Task UpdateForNoDelete(string id, [FromBody] LqKdKdjlbUpInput input)
  848 + {
  849 + var entity = input.Adapt<LqKdKdjlbEntity>();
  850 + entity.Id = id; // 确保ID正确设置
  851 +
  852 + try
  853 + {
  854 + //开启事务
  855 + _db.BeginTran();
  856 +
  857 + // 更新开单记录主表
  858 + await _db.Updateable(entity)
  859 + .IgnoreColumns(ignoreAllNullColumns: true)
  860 + .IgnoreColumns(x => x.CreateTime) // 不更新创建时间
  861 + .ExecuteCommandAsync();
  862 +
  863 + // 处理品项明细列表 - 更新或插入
  864 + if (input.lqKdPxmxList != null && input.lqKdPxmxList.Any())
  865 + {
  866 + foreach (var item in input.lqKdPxmxList)
  867 + {
  868 + // 检查品项明细是否已存在
  869 + var existingPxmx = await _db.Queryable<LqKdPxmxEntity>()
  870 + .Where(x => x.Glkdbh == id && x.Px == item.px)
  871 + .FirstAsync();
  872 +
  873 + if (existingPxmx != null)
  874 + {
  875 + // 更新现有品项明细
  876 + existingPxmx.ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber;
  877 + existingPxmx.TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber));
  878 + existingPxmx.Pxmc = item.pxmc;
  879 + existingPxmx.Pxjg = item.pxjg;
  880 + existingPxmx.SourceType = item.sourceType;
  881 + await _db.Updateable(existingPxmx).ExecuteCommandAsync();
  882 +
  883 + // 更新该品项关联的健康师业绩
  884 + if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any())
  885 + {
  886 + // 先删除该品项的所有健康师业绩
  887 + await _db.Deleteable<LqKdJksyjEntity>()
  888 + .Where(x => x.Kdpxid == existingPxmx.Id)
  889 + .ExecuteCommandAsync();
  890 +
  891 + // 重新插入健康师业绩
  892 + var jksyjEntities = item.lqKdJksyjList.Select(ijks_tem => new LqKdJksyjEntity
  893 + {
  894 + Id = YitIdHelper.NextId().ToString(),
  895 + Glkdbh = entity.Id,
  896 + Jks = ijks_tem.jks,
  897 + Jksxm = ijks_tem.jksxm,
  898 + Jkszh = ijks_tem.jkszh,
  899 + Jksyj = ijks_tem.jksyj,
  900 + Yjsj = DateTime.Now,
  901 + Jsj_id = ijks_tem.jsj_id,
  902 + Kdpxid = existingPxmx.Id,
  903 + }).ToList();
  904 +
  905 + if (jksyjEntities.Any())
  906 + {
  907 + await _db.Insertable(jksyjEntities).ExecuteCommandAsync();
  908 + }
  909 + }
  910 +
  911 + // 更新该品项关联的科技部老师业绩
  912 + if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any())
  913 + {
  914 + // 先删除该品项的所有科技部老师业绩
  915 + await _db.Deleteable<LqKdKjbsyjEntity>()
  916 + .Where(x => x.Kdpxid == existingPxmx.Id)
  917 + .ExecuteCommandAsync();
  918 +
  919 + // 重新插入科技部老师业绩
  920 + var kjbsyjEntities = item.lqKdKjbsyjList.Select(ikjbs_tem => new LqKdKjbsyjEntity
  921 + {
  922 + Id = YitIdHelper.NextId().ToString(),
  923 + Glkdbh = entity.Id,
  924 + Kjbls = ikjbs_tem.kjbls,
  925 + Kjblsxm = ikjbs_tem.kjblsxm,
  926 + Kjblszh = ikjbs_tem.kjblszh,
  927 + Kjblsyj = ikjbs_tem.kjblsyj,
  928 + Yjsj = DateTime.Now,
  929 + Kdpxid = existingPxmx.Id,
  930 + }).ToList();
  931 +
  932 + if (kjbsyjEntities.Any())
  933 + {
  934 + await _db.Insertable(kjbsyjEntities).ExecuteCommandAsync();
  935 + }
  936 + }
  937 + }
  938 + else
  939 + {
  940 + // 插入新的品项明细
  941 + var newPxmxEntity = new LqKdPxmxEntity
  942 + {
  943 + Id = YitIdHelper.NextId().ToString(),
  944 + Glkdbh = entity.Id,
  945 + CreateTIme = DateTime.Now,
  946 + MemberId = entity.Kdhy,
  947 + IsEnabled = 0,
  948 + ProjectNumber = item.projectNumber == 0 ? 1 : item.projectNumber,
  949 + TotalPrice = (decimal)(item.pxjg * (item.projectNumber == 0 ? 1 : item.projectNumber)),
  950 + Px = item.px,
  951 + Pxmc = item.pxmc,
  952 + Pxjg = item.pxjg,
  953 + SourceType = item.sourceType,
  954 + };
  955 + await _db.Insertable(newPxmxEntity).ExecuteCommandAsync();
  956 +
  957 + // 插入该品项关联的健康师业绩
  958 + if (item.lqKdJksyjList != null && item.lqKdJksyjList.Any())
  959 + {
  960 + var jksyjEntities = item.lqKdJksyjList.Select(ijks_tem => new LqKdJksyjEntity
  961 + {
  962 + Id = YitIdHelper.NextId().ToString(),
  963 + Glkdbh = entity.Id,
  964 + Jks = ijks_tem.jks,
  965 + Jksxm = ijks_tem.jksxm,
  966 + Jkszh = ijks_tem.jkszh,
  967 + Jksyj = ijks_tem.jksyj,
  968 + Yjsj = DateTime.Now,
  969 + Jsj_id = ijks_tem.jsj_id,
  970 + Kdpxid = newPxmxEntity.Id,
  971 + }).ToList();
  972 +
  973 + await _db.Insertable(jksyjEntities).ExecuteCommandAsync();
  974 + }
  975 +
  976 + // 插入该品项关联的科技部老师业绩
  977 + if (item.lqKdKjbsyjList != null && item.lqKdKjbsyjList.Any())
  978 + {
  979 + var kjbsyjEntities = item.lqKdKjbsyjList.Select(ikjbs_tem => new LqKdKjbsyjEntity
  980 + {
  981 + Id = YitIdHelper.NextId().ToString(),
  982 + Glkdbh = entity.Id,
  983 + Kjbls = ikjbs_tem.kjbls,
  984 + Kjblsxm = ikjbs_tem.kjblsxm,
  985 + Kjblszh = ikjbs_tem.kjblszh,
  986 + Kjblsyj = ikjbs_tem.kjblsyj,
  987 + Yjsj = DateTime.Now,
  988 + Kdpxid = newPxmxEntity.Id,
  989 + }).ToList();
  990 +
  991 + await _db.Insertable(kjbsyjEntities).ExecuteCommandAsync();
  992 + }
  993 + }
  994 + }
  995 + }
  996 +
  997 + //关闭事务
  998 + _db.CommitTran();
  999 + }
  1000 + catch (Exception)
  1001 + {
  1002 + //回滚事务
  1003 + _db.RollbackTran();
  1004 + throw NCCException.Oh(ErrorCode.COM1001);
  1005 + }
  1006 + }
  1007 + #endregion
  1008 +
  1009 + #region 作废开单记录
  1010 + /// <summary>
  1011 + /// 作废开单记录
  1012 + /// </summary>
  1013 + /// <param name="id">开单记录主键ID</param>
  1014 + /// <returns>无返回值</returns>
  1015 + /// <response code="200">作废成功</response>
  1016 + /// <response code="400">参数错误,开单记录ID不能为空</response>
  1017 + /// <response code="404">开单记录不存在</response>
  1018 + /// <response code="500">服务器内部错误</response>
  1019 + [HttpPut("Cancel/{id}")]
  1020 + public async Task Cancel(string id)
  1021 + {
  1022 + if (string.IsNullOrEmpty(id))
  1023 + {
  1024 + throw NCCException.Oh("开单记录ID不能为空");
  1025 + }
  1026 +
  1027 + try
  1028 + {
  1029 + //开启事务
  1030 + _db.BeginTran();
  1031 +
  1032 + // 查询开单记录
  1033 + var entity = await _db.Queryable<LqKdKdjlbEntity>().FirstAsync(p => p.Id == id);
  1034 + if (entity == null)
  1035 + {
  1036 + throw NCCException.Oh("开单记录不存在");
  1037 + }
  1038 +
  1039 + // 检查是否已经作废
  1040 + if (entity.IsEffective == 0)
  1041 + {
  1042 + throw NCCException.Oh("该开单记录已经作废");
  1043 + }
  1044 +
  1045 + // 标记开单记录为无效
  1046 + entity.IsEffective = 0;
  1047 + await _db.Updateable(entity).ExecuteCommandAsync();
  1048 + // 标记对应开单明细表为无效
  1049 + await _db.Updateable<LqKdPxmxEntity>().SetColumns(it => new LqKdPxmxEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync();
  1050 + // 标记健康师业绩为无效
  1051 + await _db.Updateable<LqKdJksyjEntity>().SetColumns(it => new LqKdJksyjEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync();
  1052 + // 标记科技部老师业绩为无效
  1053 + await _db.Updateable<LqKdKjbsyjEntity>().SetColumns(it => new LqKdKjbsyjEntity { IsEffective = 0 }).Where(it => it.Glkdbh == id).ExecuteCommandAsync();
  1054 + //关闭事务
  1055 + _db.CommitTran();
  1056 + }
  1057 + catch (Exception ex) when (!(ex is NCCException))
  1058 + {
  1059 + //回滚事务
  1060 + _db.RollbackTran();
  1061 + throw NCCException.Oh(ErrorCode.COM1001);
  1062 + }
  1063 + }
  1064 + #endregion
  1065 +
  1066 +
802 } 1067 }
803 } 1068 }
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
@@ -1238,6 +1238,7 @@ namespace NCC.Extend.LqStatistics @@ -1238,6 +1238,7 @@ namespace NCC.Extend.LqStatistics
1238 jsj.F_Id = jksyj.jsj_id 1238 jsj.F_Id = jksyj.jsj_id
1239 AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4) 1239 AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4)
1240 AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2) 1240 AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2)
  1241 + AND jksyj.F_IsEffective = 1
1241 ) 1242 )
1242 LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id 1243 LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
1243 WHERE jsj.yf = @statisticsMonth 1244 WHERE jsj.yf = @statisticsMonth
@@ -1429,7 +1430,7 @@ namespace NCC.Extend.LqStatistics @@ -1429,7 +1430,7 @@ namespace NCC.Extend.LqStatistics
1429 ) AS BasePerformance, 1430 ) AS BasePerformance,
1430 SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance 1431 SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance
1431 FROM lq_kd_jksyj jksyj 1432 FROM lq_kd_jksyj jksyj
1432 - INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id 1433 + INNER JOIN lq_kd_pxmx pxmx ON jksyj.F_kdpxid = pxmx.F_Id AND pxmx.F_IsEffective = 1
1433 INNER JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id 1434 INNER JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id
1434 INNER JOIN BASE_USER u ON jksyj.jkszh = u.F_Id 1435 INNER JOIN BASE_USER u ON jksyj.jkszh = u.F_Id
1435 LEFT JOIN lq_mdxx md ON u.F_MDID = md.F_Id 1436 LEFT JOIN lq_mdxx md ON u.F_MDID = md.F_Id
@@ -1446,6 +1447,7 @@ namespace NCC.Extend.LqStatistics @@ -1446,6 +1447,7 @@ namespace NCC.Extend.LqStatistics
1446 AND jksyj.jksyj != '0' 1447 AND jksyj.jksyj != '0'
1447 AND jksyj.F_kdpxid IS NOT NULL 1448 AND jksyj.F_kdpxid IS NOT NULL
1448 AND jksyj.F_kdpxid != '' 1449 AND jksyj.F_kdpxid != ''
  1450 + AND jksyj.F_IsEffective = 1
1449 AND YEAR(jksyj.yjsj) = @year 1451 AND YEAR(jksyj.yjsj) = @year
1450 AND MONTH(jksyj.yjsj) = @month 1452 AND MONTH(jksyj.yjsj) = @month
1451 GROUP BY 1453 GROUP BY
@@ -1636,27 +1638,6 @@ namespace NCC.Extend.LqStatistics @@ -1636,27 +1638,6 @@ namespace NCC.Extend.LqStatistics
1636 1638
1637 #endregion 1639 #endregion
1638 1640
1639 - /// <summary>  
1640 - /// 部门信息  
1641 - /// </summary>  
1642 - public class DepartmentInfo  
1643 - {  
1644 - /// <summary>  
1645 - /// 部门ID  
1646 - /// </summary>  
1647 - public string DepartmentId { get; set; }  
1648 -  
1649 - /// <summary>  
1650 - /// 部门名称  
1651 - /// </summary>  
1652 - public string DepartmentName { get; set; }  
1653 -  
1654 - /// <summary>  
1655 - /// 父部门ID  
1656 - /// </summary>  
1657 - public string ParentId { get; set; }  
1658 - }  
1659 -  
1660 #region 科技部开单业绩统计 1641 #region 科技部开单业绩统计
1661 1642
1662 /// <summary> 1643 /// <summary>
@@ -1706,13 +1687,14 @@ namespace NCC.Extend.LqStatistics @@ -1706,13 +1687,14 @@ namespace NCC.Extend.LqStatistics
1706 MAX(k.yjsj) AS LastOrderDate, 1687 MAX(k.yjsj) AS LastOrderDate,
1707 MIN(k.yjsj) AS FirstOrderDate 1688 MIN(k.yjsj) AS FirstOrderDate
1708 FROM lq_kd_kjbsyj k 1689 FROM lq_kd_kjbsyj k
1709 - LEFT JOIN lq_kd_pxmx pm ON k.F_kdpxid = pm.F_Id 1690 + LEFT JOIN lq_kd_pxmx pm ON k.F_kdpxid = pm.F_Id AND pm.F_IsEffective = 1
1710 WHERE k.kjbls IS NOT NULL 1691 WHERE k.kjbls IS NOT NULL
1711 AND k.kjblsxm IS NOT NULL 1692 AND k.kjblsxm IS NOT NULL
1712 AND k.yjsj IS NOT NULL 1693 AND k.yjsj IS NOT NULL
1713 AND k.kjblsyj IS NOT NULL 1694 AND k.kjblsyj IS NOT NULL
1714 AND k.kjblsyj != '' 1695 AND k.kjblsyj != ''
1715 AND k.kjblsyj != '0' 1696 AND k.kjblsyj != '0'
  1697 + AND k.F_IsEffective = 1
1716 AND YEAR(k.yjsj) = @year 1698 AND YEAR(k.yjsj) = @year
1717 AND MONTH(k.yjsj) = @month 1699 AND MONTH(k.yjsj) = @month
1718 GROUP BY 1700 GROUP BY
@@ -1893,5 +1875,27 @@ namespace NCC.Extend.LqStatistics @@ -1893,5 +1875,27 @@ namespace NCC.Extend.LqStatistics
1893 } 1875 }
1894 1876
1895 #endregion 1877 #endregion
  1878 +
  1879 + /// <summary>
  1880 + /// 部门信息
  1881 + /// </summary>
  1882 + public class DepartmentInfo
  1883 + {
  1884 + /// <summary>
  1885 + /// 部门ID
  1886 + /// </summary>
  1887 + public string DepartmentId { get; set; }
  1888 +
  1889 + /// <summary>
  1890 + /// 部门名称
  1891 + /// </summary>
  1892 + public string DepartmentName { get; set; }
  1893 +
  1894 + /// <summary>
  1895 + /// 父部门ID
  1896 + /// </summary>
  1897 + public string ParentId { get; set; }
  1898 + }
  1899 +
1896 } 1900 }
1897 } 1901 }