DemandScheduleService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. using Yitter.IdGenerator;
  2. namespace Admin.NET.Plugin.AiDOP.Supply;
  3. /// <summary>
  4. /// 物料需求计划服务
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 305, Description = "物料需求计划")]
  7. [Route("api/Supply")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class DemandScheduleService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. private readonly SqlSugarRepository<DemandSchedule> _rep;
  14. private readonly UserManager _userManager;
  15. public DemandScheduleService(
  16. ISqlSugarClient db,
  17. SqlSugarRepository<DemandSchedule> rep,
  18. UserManager userManager)
  19. {
  20. _db = db;
  21. _rep = rep;
  22. _userManager = userManager;
  23. }
  24. [DisplayName("物料需求计划列表")]
  25. [HttpGet("demand-schedule/list")]
  26. public async Task<object> GetList([FromQuery] DemandScheduleListInput input)
  27. {
  28. var page = input.Page <= 0 ? 1 : input.Page;
  29. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  30. var offset = (page - 1) * pageSize;
  31. var pars = new List<SugarParameter>();
  32. var where = new List<string>
  33. {
  34. "(a.ishistoryversion = 'N' OR a.ishistoryversion IS NULL)",
  35. "IFNULL(a.IsDeleted,0)=0"
  36. };
  37. if (_userManager.TenantId > 0)
  38. {
  39. where.Add("a.tenant_id = @TenantId");
  40. pars.Add(new SugarParameter("@TenantId", _userManager.TenantId));
  41. }
  42. if (!string.IsNullOrWhiteSpace(input.ItemNum))
  43. {
  44. where.Add("a.itemnum LIKE @ItemNum");
  45. pars.Add(new SugarParameter("@ItemNum", $"%{input.ItemNum.Trim()}%"));
  46. }
  47. if (!string.IsNullOrWhiteSpace(input.Descr))
  48. {
  49. where.Add("b.Descr LIKE @Descr");
  50. pars.Add(new SugarParameter("@Descr", $"%{input.Descr.Trim()}%"));
  51. }
  52. if (!string.IsNullOrWhiteSpace(input.RequestDateFrom) && DateTime.TryParse(input.RequestDateFrom, out var reqFrom))
  53. {
  54. where.Add("a.requestdate >= @RequestDateFrom");
  55. pars.Add(new SugarParameter("@RequestDateFrom", reqFrom.Date));
  56. }
  57. var fromSql = $"""
  58. FROM ic_demandschedule a
  59. INNER JOIN ItemMaster b ON a.itemnum = b.ItemNum
  60. WHERE {string.Join(" AND ", where)}
  61. """;
  62. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) {fromSql}", pars);
  63. var list = await _db.Ado.SqlQueryAsync<DemandScheduleListRow>(
  64. $"""
  65. SELECT
  66. a.Id AS Id,
  67. a.itemnum AS ItemNum,
  68. b.Descr AS Descr,
  69. b.Descr1 AS Descr1,
  70. a.fversion AS FVersion,
  71. a.drawing AS Drawing,
  72. a.requestdate AS RequestDate,
  73. a.arrivaldate AS ArrivalDate,
  74. a.shortqty AS ShortQty,
  75. a.mesqty AS MesQty,
  76. a.locqty AS LocQty,
  77. a.sechedqty AS SechedQty,
  78. a.tosechedqty AS ToSechedQty,
  79. CASE IFNULL(a.status,'') WHEN 'P' THEN '已发布' ELSE '' END AS StatusText,
  80. CASE IFNULL(a.status,'') WHEN 'P' THEN DATE_FORMAT(a.update_time,'%Y-%m-%d') ELSE '' END AS PublishDate,
  81. IFNULL(a.status,'') AS Status,
  82. a.remarks AS Remarks,
  83. a.tenant_id AS TenantId,
  84. a.factory_id AS FactoryId,
  85. a.company_id AS CompanyId
  86. {fromSql}
  87. ORDER BY a.requestdate DESC, a.Id DESC
  88. LIMIT {pageSize} OFFSET {offset}
  89. """,
  90. pars);
  91. return new { total, page, pageSize, list };
  92. }
  93. [DisplayName("获取物料需求计划详情")]
  94. [HttpGet("demand-schedule/{id:long}")]
  95. public async Task<object> GetDetail(long id)
  96. {
  97. var tenantId = _userManager.TenantId;
  98. var row = await _rep.GetFirstAsync(x => x.Id == id && (x.IsDeleted == null || x.IsDeleted == 0) && (tenantId <= 0 || x.TenantId == tenantId));
  99. if (row == null) throw Oops.Oh("记录不存在");
  100. return row;
  101. }
  102. [DisplayName("保存物料需求计划")]
  103. [ApiDescriptionSettings(Name = "SaveDemandSchedule"), HttpPost("demand-schedule/save")]
  104. public async Task<object> Save([FromBody] DemandScheduleSaveInput input)
  105. {
  106. if (string.IsNullOrWhiteSpace(input.ItemNum)) throw Oops.Oh("物料编号不能为空");
  107. if (input.Id is null or 0)
  108. {
  109. var entity = input.Adapt<DemandSchedule>();
  110. entity.Id = YitIdHelper.NextId();
  111. entity.ItemNum = input.ItemNum?.Trim();
  112. entity.IsHistoryVersion = null;
  113. entity.Status ??= string.Empty;
  114. entity.IsDeleted ??= 0;
  115. entity.TenantId ??= _userManager.TenantId;
  116. entity.CompanyId ??= 1000;
  117. entity.CreateBy = _userManager.UserId;
  118. entity.CreateByName = _userManager.Account;
  119. entity.CreateTime = DateTime.Now;
  120. entity.UpdateBy = _userManager.UserId;
  121. entity.UpdateByName = _userManager.Account;
  122. entity.UpdateTime = DateTime.Now;
  123. entity.RequestDate = ParseDate(input.RequestDate);
  124. entity.ArrivalDate = ParseDate(input.ArrivalDate);
  125. await _rep.InsertAsync(entity);
  126. return new { id = entity.Id, message = "新增成功" };
  127. }
  128. else
  129. {
  130. var tenantId = _userManager.TenantId;
  131. var entity = await _rep.GetFirstAsync(x => x.Id == input.Id.Value && (x.IsDeleted == null || x.IsDeleted == 0) && (tenantId <= 0 || x.TenantId == tenantId))
  132. ?? throw Oops.Oh("记录不存在");
  133. entity.ItemNum = input.ItemNum?.Trim();
  134. entity.FVersion = input.FVersion;
  135. entity.Drawing = input.Drawing;
  136. entity.RequestDate = ParseDate(input.RequestDate);
  137. entity.ArrivalDate = ParseDate(input.ArrivalDate);
  138. entity.ShortQty = input.ShortQty;
  139. entity.MesQty = input.MesQty;
  140. entity.LocQty = input.LocQty;
  141. entity.SechedQty = input.SechedQty;
  142. entity.ToSechedQty = input.ToSechedQty;
  143. entity.Remarks = input.Remarks;
  144. entity.CompanyId = input.CompanyId ?? entity.CompanyId ?? 1000;
  145. entity.FactoryId = input.FactoryId ?? entity.FactoryId;
  146. entity.UpdateBy = _userManager.UserId;
  147. entity.UpdateByName = _userManager.Account;
  148. entity.UpdateTime = DateTime.Now;
  149. await _rep.UpdateAsync(entity);
  150. return new { id = entity.Id, message = "编辑成功" };
  151. }
  152. }
  153. [DisplayName("删除物料需求计划")]
  154. [HttpPost("demand-schedule/delete/{id:long}")]
  155. public async Task<object> Delete(long id)
  156. {
  157. var tenantId = _userManager.TenantId;
  158. var entity = await _rep.GetFirstAsync(x => x.Id == id && (x.IsDeleted == null || x.IsDeleted == 0) && (tenantId <= 0 || x.TenantId == tenantId))
  159. ?? throw Oops.Oh("记录不存在");
  160. entity.IsDeleted = 1;
  161. entity.UpdateBy = _userManager.UserId;
  162. entity.UpdateByName = _userManager.Account;
  163. entity.UpdateTime = DateTime.Now;
  164. await _rep.UpdateAsync(entity);
  165. return new { message = "删除成功" };
  166. }
  167. [DisplayName("勾选发布")]
  168. [HttpPost("demand-schedule/publish-selected")]
  169. public async Task<object> PublishSelected([FromBody] DemandScheduleBatchIdsInput input)
  170. {
  171. var ids = ParseIds(input.Ids);
  172. if (!ids.Any()) throw Oops.Oh("请选择要发布的数据");
  173. var tenantId = _userManager.TenantId;
  174. var affected = await _db.Updateable<DemandSchedule>()
  175. .SetColumns(x => new DemandSchedule
  176. {
  177. Status = "P",
  178. UpdateBy = _userManager.UserId,
  179. UpdateByName = _userManager.Account,
  180. UpdateTime = DateTime.Now
  181. })
  182. .Where(x => ids.Contains(x.Id) && (x.IsDeleted == null || x.IsDeleted == 0) && (x.Status == null || x.Status == "") && (tenantId <= 0 || x.TenantId == tenantId))
  183. .ExecuteCommandAsync();
  184. return new { affected, message = affected > 0 ? "发布成功" : "无可发布数据" };
  185. }
  186. [DisplayName("全部发布")]
  187. [HttpPost("demand-schedule/publish-all")]
  188. public async Task<object> PublishAll()
  189. {
  190. var query = _db.Updateable<DemandSchedule>()
  191. .SetColumns(x => new DemandSchedule
  192. {
  193. Status = "P",
  194. UpdateBy = _userManager.UserId,
  195. UpdateByName = _userManager.Account,
  196. UpdateTime = DateTime.Now
  197. })
  198. .Where(x => (x.IsDeleted == null || x.IsDeleted == 0) && (x.Status == null || x.Status == ""));
  199. if (_userManager.TenantId > 0)
  200. query = query.Where(x => x.TenantId == _userManager.TenantId);
  201. var affected = await query.ExecuteCommandAsync();
  202. return new { affected, message = affected > 0 ? "全部发布成功" : "无可发布数据" };
  203. }
  204. [DisplayName("取消发布")]
  205. [HttpPost("demand-schedule/unpublish-selected")]
  206. public async Task<object> UnPublishSelected([FromBody] DemandScheduleBatchIdsInput input)
  207. {
  208. var ids = ParseIds(input.Ids);
  209. if (!ids.Any()) throw Oops.Oh("请选择要取消发布的数据");
  210. var tenantId = _userManager.TenantId;
  211. var affected = await _db.Updateable<DemandSchedule>()
  212. .SetColumns(x => new DemandSchedule
  213. {
  214. Status = "",
  215. UpdateBy = _userManager.UserId,
  216. UpdateByName = _userManager.Account,
  217. UpdateTime = DateTime.Now
  218. })
  219. .Where(x => ids.Contains(x.Id) && (x.IsDeleted == null || x.IsDeleted == 0) && x.Status == "P" && (tenantId <= 0 || x.TenantId == tenantId))
  220. .ExecuteCommandAsync();
  221. return new { affected, message = affected > 0 ? "取消发布成功" : "无可取消发布数据" };
  222. }
  223. private static DateTime? ParseDate(string? value)
  224. {
  225. return DateTime.TryParse(value, out var dt) ? dt.Date : null;
  226. }
  227. private static List<long> ParseIds(string ids)
  228. {
  229. return ids.Split(',', StringSplitOptions.RemoveEmptyEntries)
  230. .Select(x => long.TryParse(x.Trim(), out var id) ? id : 0)
  231. .Where(x => x > 0)
  232. .Distinct()
  233. .ToList();
  234. }
  235. private sealed class DemandScheduleListRow
  236. {
  237. public long Id { get; set; }
  238. public string? ItemNum { get; set; }
  239. public string? Descr { get; set; }
  240. public string? Descr1 { get; set; }
  241. public string? FVersion { get; set; }
  242. public string? Drawing { get; set; }
  243. public DateTime? RequestDate { get; set; }
  244. public DateTime? ArrivalDate { get; set; }
  245. public decimal? ShortQty { get; set; }
  246. public decimal? MesQty { get; set; }
  247. public decimal? LocQty { get; set; }
  248. public decimal? SechedQty { get; set; }
  249. public decimal? ToSechedQty { get; set; }
  250. public string? Status { get; set; }
  251. public string? StatusText { get; set; }
  252. public string? PublishDate { get; set; }
  253. public string? Remarks { get; set; }
  254. public long? TenantId { get; set; }
  255. public long? FactoryId { get; set; }
  256. public long? CompanyId { get; set; }
  257. }
  258. }