ProjectPriceService.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using Microsoft.AspNetCore.Mvc;
  2. using NPOI.SS.Formula.Functions;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using ZhonTai.Admin.Core.Consts;
  9. using ZhonTai.Admin.Core.Dto;
  10. using ZhonTai.Admin.Domain.Project;
  11. using ZhonTai.Admin.Services.Project.Dto;
  12. using ZhonTai.Common.Extensions;
  13. using ZhonTai.DynamicApi;
  14. using ZhonTai.DynamicApi.Attributes;
  15. namespace ZhonTai.Admin.Services.Project
  16. {
  17. /// <summary>
  18. /// 项目价格设置服务
  19. /// </summary>
  20. [Order(10)]
  21. [DynamicApi(Area = AdminConsts.AreaName)]
  22. public partial class ProjectPriceService : BaseService, IProjectService, IDynamicApi
  23. {
  24. private readonly IProjectRepository _projectRepository;
  25. private readonly IProjectPriceRepository _projectPriceRepository;
  26. private readonly IProjectConfigRepository _projectConfigRepository;
  27. public ProjectPriceService(IProjectRepository projectRepository, IProjectPriceRepository projectPriceRepository, IProjectConfigRepository projectConfigRepository)
  28. {
  29. _projectRepository = projectRepository;
  30. _projectPriceRepository = projectPriceRepository;
  31. _projectConfigRepository = projectConfigRepository;
  32. }
  33. #region 公司默认抽成比例
  34. /// <summary>
  35. /// 查询公司抽成比例
  36. /// </summary>
  37. /// <returns></returns>
  38. [HttpGet]
  39. public async Task<CompanyDrawOutput> GetCompanyDrawAsync()
  40. {
  41. await ProjectPriceInitAsync();
  42. var list = await _projectConfigRepository.Select.Where(m => m.ProjectId == 0 && m.ProjectPriceId == 0 && m.Status == 1)
  43. .ToListAsync(a => new
  44. {
  45. a.Id,
  46. a.DrawRatio,
  47. a.EffectDate
  48. });
  49. CompanyDrawOutput output = new CompanyDrawOutput();
  50. if (list.Count > 1)
  51. {
  52. DateTime dtnow = DateTime.Today;
  53. var current = list.FirstOrDefault(m => m.EffectDate <= dtnow);
  54. var next = list.FirstOrDefault(m => m.EffectDate > dtnow);
  55. output.CurrentRatio = current.DrawRatio;
  56. output.NextRatio = next.DrawRatio;
  57. output.NextEffectDate = next.EffectDate;
  58. }
  59. else
  60. {
  61. output.CurrentRatio = list[0].DrawRatio;
  62. output.NextRatio = 0;
  63. }
  64. return output;
  65. }
  66. /// <summary>
  67. /// 修改公司抽成比例
  68. /// </summary>
  69. /// <returns></returns>
  70. [HttpPost]
  71. public async Task EditCompanyDrawAsync(CompanyDrawInput input)
  72. {
  73. CheckDrawRatio(input.DrawRatio);
  74. CheckDrawRatioEffect(input.EffectDate);
  75. //删除旧的未生效记录
  76. var listDeleteId = await _projectConfigRepository.Select.Where(m => m.ProjectId == 0 && m.ProjectPriceId == 0 && m.Status == 1 && m.EffectDate > DateTime.Today)
  77. .ToListAsync(m => m.Id);
  78. if (listDeleteId.Count > 0)
  79. {
  80. await _projectConfigRepository.SoftDeleteAsync(m => listDeleteId.Contains(m.Id));
  81. }
  82. //添加新的比例
  83. await _projectConfigRepository.InsertAsync(new ProjectConfigEntity()
  84. {
  85. ProjectId = 0,
  86. ProjectPriceId = 0,
  87. DrawRatio = input.DrawRatio,
  88. EffectDate = input.EffectDate,
  89. Status = 1
  90. });
  91. }
  92. #endregion
  93. #region 项目抽成比例
  94. /// <summary>
  95. /// 查询项目分页
  96. /// </summary>
  97. /// <param name="input"></param>
  98. /// <returns></returns>
  99. [HttpPost]
  100. public async Task<PageOutput<GetProjectPricePageOutput>> GetProjectPageAsync(PageInput<GetProjectPricePageInput> input)
  101. {
  102. var list = await _projectRepository.Select
  103. .Count(out var total)
  104. .OrderByDescending(true, a => a.Id)
  105. .Page(input.CurrentPage, input.PageSize)
  106. .ToListAsync(a => new GetProjectPricePageOutput()
  107. {
  108. Id = a.Id,
  109. Name = a.Name,
  110. Logo = a.Logo,
  111. Prices = _projectPriceRepository.Select.Where(m => m.ProjectId == a.Id).ToList<PriceGetPageOutput_Price>()
  112. });
  113. var data = new PageOutput<GetProjectPricePageOutput>()
  114. {
  115. List = Mapper.Map<List<GetProjectPricePageOutput>>(list),
  116. Total = total
  117. };
  118. return data;
  119. }
  120. /// <summary>
  121. /// 项目价格设价
  122. /// </summary>
  123. /// <param name="input"></param>
  124. /// <returns></returns>
  125. [HttpPost]
  126. public async Task<long> SetProjectPriceAsync(ProjectPriceSetInput input)
  127. {
  128. //验证项目价格信息是否存在
  129. var price = await _projectPriceRepository.GetAsync(input.Id);
  130. if (!(price?.Id > 0))
  131. {
  132. throw ResultOutput.Exception("信息不存在,请刷新后重试!");
  133. }
  134. if (input.DrawPriceWay == 1)
  135. {
  136. //抽成比例
  137. if (input.DrawRatio < 0 || input.DrawRatio > 100)
  138. {
  139. throw ResultOutput.Exception("抽成比例有效范围在0-100");
  140. }
  141. var amount = UtilConvertExtension.ToDecimalCutWithN(price.Price * input.DrawRatio * 0.01m, 0, 1);
  142. await _projectPriceRepository.UpdateDiy.SetSource(new ProjectPriceEntity()
  143. {
  144. DrawPriceWay = input.DrawPriceWay,
  145. DrawRatio = input.DrawRatio,
  146. DrawPrice = amount,
  147. Id = price.Id
  148. }).UpdateColumns(a => new { a.DrawPriceWay, a.DrawRatio, a.DrawPrice, a.ModifiedTime }).ExecuteAffrowsAsync();
  149. }
  150. else if (input.DrawPriceWay == 2)
  151. {
  152. //抽成金额
  153. if (input.DrawPrice > price.Price || input.DrawPrice < 0)
  154. {
  155. throw ResultOutput.Exception("设置有效的抽成金额");
  156. }
  157. await _projectPriceRepository.UpdateDiy.SetSource(new ProjectPriceEntity()
  158. {
  159. DrawPriceWay = input.DrawPriceWay,
  160. DrawRatio = 0,
  161. DrawPrice = input.DrawPrice,
  162. Id = price.Id
  163. }).UpdateColumns(a => new { a.DrawPriceWay, a.DrawRatio, a.DrawPrice, a.ModifiedTime }).ExecuteAffrowsAsync(); ;
  164. }
  165. else
  166. {
  167. throw ResultOutput.Exception("无效的设价方式!");
  168. }
  169. return 1;
  170. }
  171. #endregion
  172. #region 校验
  173. /// <summary>
  174. /// 校验抽成比例
  175. /// </summary>
  176. /// <param name="drawRatio"></param>
  177. private void CheckDrawRatio(decimal drawRatio)
  178. {
  179. //抽成比例
  180. if (drawRatio < 0 || drawRatio > 100)
  181. {
  182. throw ResultOutput.Exception("抽成比例有效范围在0-100");
  183. }
  184. }
  185. /// <summary>
  186. /// 校验抽成比例生效时间
  187. /// </summary>
  188. /// <param name="effectDate"></param>
  189. private void CheckDrawRatioEffect(DateTime effectDate)
  190. {
  191. //生效时间
  192. if (effectDate <= DateTime.Today)
  193. {
  194. throw ResultOutput.Exception("生效日期,最短为次日生效");
  195. }
  196. }
  197. /// <summary>
  198. /// 初始化公司抽成信息
  199. /// </summary>
  200. /// <returns></returns>
  201. private async Task ProjectPriceInitAsync()
  202. {
  203. var count = await _projectConfigRepository.Select.Where(m => m.ProjectId == 0 && m.ProjectPriceId == 0).CountAsync();
  204. if (count <= 0)
  205. {
  206. await _projectConfigRepository.InsertAsync(new ProjectConfigEntity()
  207. {
  208. ProjectId = 0,
  209. ProjectPriceId = 0,
  210. DrawRatio = 5,
  211. EffectDate = DateTime.Today,
  212. Status = 1
  213. });
  214. }
  215. }
  216. #endregion
  217. }
  218. }