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 9 public class LqKdDeductinfoCrInput
10 10 {
11 11 /// <summary>
  12 + /// 扣减编号
  13 + /// </summary>
  14 + public string id { get; set; }
  15 +
  16 + /// <summary>
12 17 /// 扣减类型
13 18 /// </summary>
14 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 64 /// </summary>
65 65 [SugarColumn(ColumnName = "F_kdpxid")]
66 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 52 /// </summary>
53 53 [SugarColumn(ColumnName = "zdyj")]
54 54 public decimal Zdyj { get; set; }
55   -
  55 +
56 56  
57 57 /// <summary>
58 58 /// 实付业绩
... ... @@ -197,5 +197,12 @@ namespace NCC.Extend.Entitys.lq_kd_kdjlb
197 197 /// </summary>
198 198 [SugarColumn(ColumnName = "F_UpdateTime")]
199 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 64 /// </summary>
65 65 [SugarColumn(ColumnName = "F_LaborCost")]
66 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 82 /// </summary>
83 83 [SugarColumn(ColumnName = "F_ActualPrice")]
84 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 799 .ToList();
800 800 }
801 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 1238 jsj.F_Id = jksyj.jsj_id
1239 1239 AND YEAR(jksyj.yjsj) = SUBSTRING(jsj.yf, 1, 4)
1240 1240 AND MONTH(jksyj.yjsj) = SUBSTRING(jsj.yf, 5, 2)
  1241 + AND jksyj.F_IsEffective = 1
1241 1242 )
1242 1243 LEFT JOIN lq_mdxx md ON jsj.md = md.F_Id
1243 1244 WHERE jsj.yf = @statisticsMonth
... ... @@ -1429,7 +1430,7 @@ namespace NCC.Extend.LqStatistics
1429 1430 ) AS BasePerformance,
1430 1431 SUM(CAST(jksyj.jksyj AS DECIMAL(18,2))) AS TotalPerformance
1431 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 1434 INNER JOIN lq_xmzl xmzl ON pxmx.px = xmzl.F_Id
1434 1435 INNER JOIN BASE_USER u ON jksyj.jkszh = u.F_Id
1435 1436 LEFT JOIN lq_mdxx md ON u.F_MDID = md.F_Id
... ... @@ -1446,6 +1447,7 @@ namespace NCC.Extend.LqStatistics
1446 1447 AND jksyj.jksyj != '0'
1447 1448 AND jksyj.F_kdpxid IS NOT NULL
1448 1449 AND jksyj.F_kdpxid != ''
  1450 + AND jksyj.F_IsEffective = 1
1449 1451 AND YEAR(jksyj.yjsj) = @year
1450 1452 AND MONTH(jksyj.yjsj) = @month
1451 1453 GROUP BY
... ... @@ -1636,27 +1638,6 @@ namespace NCC.Extend.LqStatistics
1636 1638  
1637 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 1641 #region 科技部开单业绩统计
1661 1642  
1662 1643 /// <summary>
... ... @@ -1706,13 +1687,14 @@ namespace NCC.Extend.LqStatistics
1706 1687 MAX(k.yjsj) AS LastOrderDate,
1707 1688 MIN(k.yjsj) AS FirstOrderDate
1708 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 1691 WHERE k.kjbls IS NOT NULL
1711 1692 AND k.kjblsxm IS NOT NULL
1712 1693 AND k.yjsj IS NOT NULL
1713 1694 AND k.kjblsyj IS NOT NULL
1714 1695 AND k.kjblsyj != ''
1715 1696 AND k.kjblsyj != '0'
  1697 + AND k.F_IsEffective = 1
1716 1698 AND YEAR(k.yjsj) = @year
1717 1699 AND MONTH(k.yjsj) = @month
1718 1700 GROUP BY
... ... @@ -1893,5 +1875,27 @@ namespace NCC.Extend.LqStatistics
1893 1875 }
1894 1876  
1895 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 }
... ...