StkBalanceDtlService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. using System;
  2. using SqlSugar;
  3. using Infrastructure.Attribute;
  4. using ZR.Model;
  5. using ZR.Repository;
  6. using System.Linq;
  7. using Infrastructure;
  8. using System.Collections.Generic;
  9. using ZR.Model.System;
  10. using Org.BouncyCastle.Math.EC.Rfc7748;
  11. using ZR.Service.Business.IBusinessService.Balance;
  12. using ZR.Model.Dto.Balance;
  13. using ZR.Model.Models.BaseSet;
  14. using ZR.Model.Models.Balance;
  15. using Mapster;
  16. using ZR.Model.Models.InStore;
  17. using ZR.Model.Models.Statistics;
  18. namespace ZR.Service.Business.Balance
  19. {
  20. /// <summary>
  21. /// 库存管理/库存明细表Service业务层处理
  22. ///
  23. /// @author admin
  24. /// @date 2023-04-27
  25. /// </summary>
  26. [AppService(ServiceType = typeof(IStkBalanceDtlService), ServiceLifetime = LifeTime.Transient)]
  27. public class StkBalanceDtlService : BaseService<StkBalanceDtl>, IStkBalanceDtlService
  28. {
  29. #region 业务逻辑代码
  30. /// <summary>
  31. /// 查询库存管理/库存明细表列表
  32. /// </summary>
  33. /// <param name="parm"></param>
  34. /// <returns></returns>
  35. public PagedInfo<StkBalanceDtlDto> GetList(StkBalanceDtlQueryDto parm)
  36. {
  37. //开始拼装查询条件
  38. var predicate = Expressionable.Create<StkBalanceDtl>();
  39. if (parm.BeginTime != null && parm.EndTime != null)
  40. {
  41. parm.BeginTime = parm.BeginTime.Value.ToLocalTime();
  42. parm.EndTime = parm.EndTime.Value.ToLocalTime();
  43. predicate.And(d => d.CreateTime >= parm.BeginTime && d.CreateTime <= parm.EndTime);
  44. }
  45. predicate.AndIF(parm.RegionId > 0, d => d.RegionId == parm.RegionId);
  46. //predicate.AndIF(parm.BinId > 0, d => d.BinId == parm.BinId);
  47. //predicate.AndIF(!string.IsNullOrEmpty(parm.BinCode), d => d.BinCode.Contains(parm.BinCode));
  48. predicate.AndIF(!string.IsNullOrEmpty(parm.BomNo), d => d.BomNo.Contains(parm.BomNo));
  49. predicate.AndIF(!string.IsNullOrEmpty(parm.DeliverNo), d => d.DeliverNo.Contains(parm.DeliverNo));
  50. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialCode), d => d.MaterialCode.Contains(parm.MaterialCode));
  51. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialName), d => d.MaterialName.Contains(parm.MaterialName));
  52. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialSpec), d => d.MaterialSpec.Contains(parm.MaterialSpec));
  53. predicate.AndIF(parm.Status != null, d => d.Status == parm.Status);
  54. predicate.AndIF(!string.IsNullOrEmpty(parm.Category), d => d.Category == parm.Category);
  55. predicate.AndIF(parm.KeyFlag != null, d => d.KeyFlag == parm.KeyFlag);
  56. predicate.AndIF(!string.IsNullOrEmpty(parm.BnSnCode), d => d.MaterialSpec.Contains(parm.BnSnCode));
  57. //先判断搜索条件中有没有bincode
  58. if (!string.IsNullOrEmpty(parm.BinCode))
  59. {
  60. //把basbin表检索到list
  61. List<BasBin> bins = Context.Queryable<BasBin>().ToList();
  62. //查找包含搜索条件的basbin数据
  63. var newBasBins = bins.FindAll(b => b.BinCode.Contains(parm.BinCode));
  64. //提取符合条件的basbin,并返回其id
  65. long[] BasBinIds = newBasBins.Select(x => x.BinId).ToArray();
  66. //添加转化完成的检索条件,即符合basbinId的数据
  67. predicate.And(d => BasBinIds.Contains(d.BinId));
  68. }
  69. //搜索条件查询语法参考Sqlsugar
  70. var response = Queryable()
  71. .LeftJoin<BasRegion>((d, region) => d.RegionId == region.RegionId)
  72. .LeftJoin<BasBin>((d, region, bin) => d.BinId == bin.BinId)
  73. .Where(predicate.ToExpression())
  74. .Select((d, region, bin) => new StkBalanceDtl
  75. {
  76. RegionId = d.RegionId.SelectAll(),
  77. BinId = d.BinId.SelectAll(),
  78. RegionName = region.RegionName,
  79. RegionCode = region.RegionCode,
  80. BinCode = bin.BinCode,
  81. })
  82. .ToPage<StkBalanceDtl, StkBalanceDtlDto>(parm);
  83. return response;
  84. }
  85. /// <summary>
  86. /// 查询库存管理/库存统计列表
  87. /// </summary>
  88. /// <param name="parm"></param>
  89. /// <returns></returns>
  90. public PagedInfo<StkBalanceDtlDto> StatList(StkBalanceDtlQueryDto parm)
  91. {
  92. //开始拼装查询条件
  93. var predicate = Expressionable.Create<StkBalanceDtl>();
  94. predicate.AndIF(parm.RegionId > 0, d => d.RegionId == parm.RegionId);
  95. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialCode), d => d.MaterialCode.Contains(parm.MaterialCode));
  96. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialName), d => d.MaterialName.Contains(parm.MaterialName));
  97. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialSpec), d => d.MaterialSpec.Contains(parm.MaterialSpec));
  98. predicate.AndIF(parm.KeyFlag != null, d => d.KeyFlag == parm.KeyFlag);
  99. predicate.AndIF(!string.IsNullOrEmpty(parm.Category), d => d.Category == parm.Category);
  100. predicate.AndIF(!string.IsNullOrEmpty(parm.BnSnCode), d => d.MaterialSpec.Contains(parm.BnSnCode));
  101. //搜索条件查询语法参考Sqlsugar
  102. var response = Queryable()
  103. .GroupBy(d => new { d.MaterialCode })
  104. .LeftJoin<BasRegion>((d, region) => d.RegionId == region.RegionId)
  105. .Where(predicate.ToExpression())
  106. .Select((d, region) => new StkBalanceDtl
  107. {
  108. RegionId = d.RegionId.SelectAll(),
  109. RegionName = region.RegionName,
  110. SumQty = SqlFunc.AggregateSum(d.BalanceQty),
  111. })
  112. .ToPage<StkBalanceDtl, StkBalanceDtlDto>(parm);
  113. return response;
  114. }
  115. public List<GroupByKey> GetKeyStatistics()
  116. {
  117. //开始拼装查询条件
  118. var predicate = Expressionable.Create<StkBalanceDtl>();
  119. //predicate.And(d => d.CreateTime >= BeginTime && d.CreateTime <= EndTime);
  120. //搜索条件查询语法参考Sqlsugar
  121. var response = Queryable()
  122. .GroupBy(d => new { d.KeyFlag })
  123. .Where(predicate.ToExpression())
  124. .Select(d => new GroupByKey
  125. {
  126. KeyFlag = d.KeyFlag,
  127. SumQty = SqlFunc.AggregateSum(d.BalanceQty),
  128. })
  129. .ToList();
  130. return response;
  131. }
  132. public List<GroupByCategory> GetCategoryStatistics()
  133. {
  134. //开始拼装查询条件
  135. var predicate = Expressionable.Create<StkBalanceDtl>();
  136. //predicate.And(d => d.CreateTime >= BeginTime && d.CreateTime <= EndTime);
  137. //搜索条件查询语法参考Sqlsugar
  138. var response = Queryable()
  139. .GroupBy(d => new { d.Category })
  140. .Where(predicate.ToExpression())
  141. .Select(d => new GroupByCategory
  142. {
  143. Category = d.Category,
  144. SumQty = SqlFunc.AggregateSum(d.BalanceQty),
  145. })
  146. .ToList();
  147. return response;
  148. }
  149. /// <summary>
  150. /// 添加库存管理/库存明细表
  151. /// </summary>
  152. /// <param name="model"></param>
  153. /// <returns></returns>
  154. public int AddStkBalanceDtl(StkBalanceDtl model)
  155. {
  156. return Add(model, true);
  157. }
  158. public int AddStkBalanceDtlReturnIdentity(StkBalanceDtl model)
  159. {
  160. return AddReturnIdentity(model, true);
  161. }
  162. /// <summary>
  163. /// 修改库存管理/库存明细表
  164. /// </summary>
  165. /// <param name="model"></param>
  166. /// <returns></returns>
  167. public int UpdateStkBalanceDtl(StkBalanceDtl model)
  168. {
  169. //var response = Update(w => w.BalanceId == model.BalanceId, it => new StkBalanceDtl()
  170. //{
  171. // RegionId = model.RegionId,
  172. // BinId = model.BinId,
  173. // DeliverNo = model.DeliverNo,
  174. // BomNo = model.BomNo,
  175. // MaterialCode = model.MaterialCode,
  176. // MaterialName = model.MaterialName,
  177. // MaterialSpec = model.MaterialSpec,
  178. // Category = model.Category,
  179. // KeyFlag = model.KeyFlag,
  180. // BnSnCode = model.BnSnCode,
  181. // BalanceQty = model.BalanceQty,
  182. // Status = model.Status,
  183. // UpdateBy = model.UpdateBy,
  184. // UpdateTime = model.UpdateTime,
  185. // Remark = model.Remark,
  186. //});
  187. //return response;
  188. return Update(model, true);
  189. }
  190. /// <summary>
  191. /// 清空库存管理/库存明细表
  192. /// </summary>
  193. /// <returns></returns>
  194. public void TruncateStkBalanceDtl()
  195. {
  196. Truncate();
  197. }
  198. #endregion
  199. #region 2023 0524 孙亚龙 新增
  200. public List<StkBalanceDtlDto> GetBalanceDtlList(GetOutOperateBalanceQueryDto parm)
  201. {
  202. /*
  203. * 库存查找规则:
  204. * 1、先按照 bom号、物料号、Bn\Sn码 的条件查找库存
  205. * 2、如果存在指定bom号的库存数据,则直接返回
  206. * 3、如果不存在指定bom号的库存数据,则需要按照物料号、Bn\Sn码 的条件查找库存,然后把结果返回
  207. *
  208. */
  209. #region 按照 bom号、物料号、Bn\Sn码 的条件查找库存
  210. //开始拼装查询条件
  211. var predicate = Expressionable.Create<StkBalanceDtl>();
  212. predicate.AndIF(parm != null && !string.IsNullOrEmpty(parm.MaterialCode), x => x.MaterialCode == parm.MaterialCode || x.MaterialSpec == parm.MaterialCode);
  213. predicate.AndIF(parm != null && !string.IsNullOrEmpty(parm.BomNo), x => x.BomNo == parm.BomNo);
  214. predicate.AndIF(parm != null && !string.IsNullOrEmpty(parm.BnSnCode), x => x.BnSnCode == parm.BnSnCode);
  215. predicate.AndIF(parm.IsForAssemble, x => x.Status < 99 && x.OutQty > 0);
  216. predicate.AndIF(!parm.IsForAssemble, x => x.Status == 55);
  217. //predicate.And(x => x.BalanceQty >= parm.Qty);
  218. //搜索条件查询语法参考Sqlsugar
  219. var response = Queryable()
  220. .Where(predicate.ToExpression())
  221. .OrderBy(x => x.BalanceId)
  222. .OrderBy(x => x.BalanceQty)
  223. .ToList();
  224. if (response.Count > 0)
  225. {
  226. return response.Adapt<List<StkBalanceDtlDto>>();
  227. }
  228. #endregion 按照 bom号、物料号、Bn\Sn码 的条件查找库存
  229. #region 按照物料号、Bn\Sn码 的条件查找库存
  230. var predicate1 = Expressionable.Create<StkBalanceDtl>();
  231. predicate1.AndIF(parm != null && !string.IsNullOrEmpty(parm.MaterialCode), x => x.MaterialCode == parm.MaterialCode || x.MaterialSpec == parm.MaterialCode);
  232. predicate1.AndIF(parm != null && !string.IsNullOrEmpty(parm.BnSnCode), x => x.BnSnCode == parm.BnSnCode);
  233. predicate1.AndIF(parm.IsForAssemble, x => x.Status < 99 && x.OutQty > 0);
  234. predicate1.AndIF(!parm.IsForAssemble, x => x.Status == 55);
  235. response = Queryable()
  236. .Where(predicate1.ToExpression())
  237. .OrderBy(x => x.BalanceId)
  238. .OrderBy(x => x.BalanceQty)
  239. .ToList();
  240. return response.Adapt<List<StkBalanceDtlDto>>();
  241. #endregion 按照物料号、Bn\Sn码 的条件查找库存
  242. }
  243. #endregion
  244. }
  245. }