StkBalanceDtlService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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(parm.KeyFlag != null, d => d.KeyFlag == parm.KeyFlag);
  55. predicate.AndIF(!string.IsNullOrEmpty(parm.BnSnCode), d => d.MaterialSpec.Contains(parm.BnSnCode));
  56. //先判断搜索条件中有没有bincode
  57. if (!string.IsNullOrEmpty(parm.BinCode))
  58. {
  59. //把basbin表检索到list
  60. List<BasBin> bins = Context.Queryable<BasBin>().ToList();
  61. //查找包含搜索条件的basbin数据
  62. var newBasBins = bins.FindAll(b => b.BinCode.Contains(parm.BinCode));
  63. //提取符合条件的basbin,并返回其id
  64. long[] BasBinIds = newBasBins.Select(x => x.BinId).ToArray();
  65. //添加转化完成的检索条件,即符合basbinId的数据
  66. predicate.And(d => BasBinIds.Contains(d.BinId));
  67. }
  68. //搜索条件查询语法参考Sqlsugar
  69. var response = Queryable()
  70. .LeftJoin<BasRegion>((d, region) => d.RegionId == region.RegionId)
  71. .LeftJoin<BasBin>((d, region, bin) => d.BinId == bin.BinId)
  72. .Where(predicate.ToExpression())
  73. .Select((d, region, bin) => new StkBalanceDtl
  74. {
  75. RegionId = d.RegionId.SelectAll(),
  76. BinId = d.BinId.SelectAll(),
  77. RegionName = region.RegionName,
  78. RegionCode = region.RegionCode,
  79. BinCode = bin.BinCode,
  80. })
  81. .ToPage<StkBalanceDtl, StkBalanceDtlDto>(parm);
  82. return response;
  83. }
  84. /// <summary>
  85. /// 查询库存管理/库存统计列表
  86. /// </summary>
  87. /// <param name="parm"></param>
  88. /// <returns></returns>
  89. public PagedInfo<StkBalanceDtlDto> StatList(StkBalanceDtlQueryDto parm)
  90. {
  91. //开始拼装查询条件
  92. var predicate = Expressionable.Create<StkBalanceDtl>();
  93. predicate.AndIF(parm.RegionId > 0, d => d.RegionId == parm.RegionId);
  94. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialCode), d => d.MaterialCode.Contains(parm.MaterialCode));
  95. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialName), d => d.MaterialName.Contains(parm.MaterialName));
  96. predicate.AndIF(!string.IsNullOrEmpty(parm.MaterialSpec), d => d.MaterialSpec.Contains(parm.MaterialSpec));
  97. predicate.AndIF(parm.KeyFlag != null, d => d.KeyFlag == parm.KeyFlag);
  98. predicate.AndIF(!string.IsNullOrEmpty(parm.BnSnCode), d => d.MaterialSpec.Contains(parm.BnSnCode));
  99. //搜索条件查询语法参考Sqlsugar
  100. var response = Queryable()
  101. .GroupBy(d => new { d.MaterialCode })
  102. .LeftJoin<BasRegion>((d, region) => d.RegionId == region.RegionId)
  103. .Where(predicate.ToExpression())
  104. .Select((d, region) => new StkBalanceDtl
  105. {
  106. RegionId = d.RegionId.SelectAll(),
  107. RegionName = region.RegionName,
  108. SumQty = SqlFunc.AggregateSum(d.BalanceQty),
  109. })
  110. .ToPage<StkBalanceDtl, StkBalanceDtlDto>(parm);
  111. return response;
  112. }
  113. public List<GroupByKey> GetKeyStatistics()
  114. {
  115. //开始拼装查询条件
  116. var predicate = Expressionable.Create<StkBalanceDtl>();
  117. //predicate.And(d => d.CreateTime >= BeginTime && d.CreateTime <= EndTime);
  118. //搜索条件查询语法参考Sqlsugar
  119. var response = Queryable()
  120. .GroupBy(d => new { d.KeyFlag })
  121. .Where(predicate.ToExpression())
  122. .Select(d => new GroupByKey
  123. {
  124. KeyFlag = d.KeyFlag,
  125. SumQty = SqlFunc.AggregateSum(d.BalanceQty),
  126. })
  127. .ToList();
  128. return response;
  129. }
  130. public List<GroupByCategory> GetCategoryStatistics()
  131. {
  132. //开始拼装查询条件
  133. var predicate = Expressionable.Create<StkBalanceDtl>();
  134. //predicate.And(d => d.CreateTime >= BeginTime && d.CreateTime <= EndTime);
  135. //搜索条件查询语法参考Sqlsugar
  136. var response = Queryable()
  137. .GroupBy(d => new { d.Category })
  138. .Where(predicate.ToExpression())
  139. .Select(d => new GroupByCategory
  140. {
  141. Category = d.Category,
  142. SumQty = SqlFunc.AggregateSum(d.BalanceQty),
  143. })
  144. .ToList();
  145. return response;
  146. }
  147. /// <summary>
  148. /// 添加库存管理/库存明细表
  149. /// </summary>
  150. /// <param name="model"></param>
  151. /// <returns></returns>
  152. public int AddStkBalanceDtl(StkBalanceDtl model)
  153. {
  154. return Add(model, true);
  155. }
  156. /// <summary>
  157. /// 修改库存管理/库存明细表
  158. /// </summary>
  159. /// <param name="model"></param>
  160. /// <returns></returns>
  161. public int UpdateStkBalanceDtl(StkBalanceDtl model)
  162. {
  163. //var response = Update(w => w.BalanceId == model.BalanceId, it => new StkBalanceDtl()
  164. //{
  165. // RegionId = model.RegionId,
  166. // BinId = model.BinId,
  167. // DeliverNo = model.DeliverNo,
  168. // BomNo = model.BomNo,
  169. // MaterialCode = model.MaterialCode,
  170. // MaterialName = model.MaterialName,
  171. // MaterialSpec = model.MaterialSpec,
  172. // Category = model.Category,
  173. // KeyFlag = model.KeyFlag,
  174. // BnSnCode = model.BnSnCode,
  175. // BalanceQty = model.BalanceQty,
  176. // Status = model.Status,
  177. // UpdateBy = model.UpdateBy,
  178. // UpdateTime = model.UpdateTime,
  179. // Remark = model.Remark,
  180. //});
  181. //return response;
  182. return Update(model, true);
  183. }
  184. /// <summary>
  185. /// 清空库存管理/库存明细表
  186. /// </summary>
  187. /// <returns></returns>
  188. public void TruncateStkBalanceDtl()
  189. {
  190. Truncate();
  191. }
  192. #endregion
  193. #region 2023 0524 孙亚龙 新增
  194. public List<StkBalanceDtlDto> GetBalanceDtlList(GetOutOperateBalanceQueryDto parm)
  195. {
  196. /*
  197. * 库存查找规则:
  198. * 1、先按照 bom号、物料号、Bn\Sn码 的条件查找库存
  199. * 2、如果存在指定bom号的库存数据,则直接返回
  200. * 3、如果不存在指定bom号的库存数据,则需要按照物料号、Bn\Sn码 的条件查找库存,然后把结果返回
  201. *
  202. */
  203. #region 按照 bom号、物料号、Bn\Sn码 的条件查找库存
  204. //开始拼装查询条件
  205. var predicate = Expressionable.Create<StkBalanceDtl>();
  206. predicate.AndIF(parm != null && !string.IsNullOrEmpty(parm.MaterialCode), x => x.MaterialCode == parm.MaterialCode || x.MaterialSpec == parm.MaterialCode);
  207. predicate.AndIF(parm != null && !string.IsNullOrEmpty(parm.BomNo), x => x.BomNo == parm.BomNo);
  208. predicate.AndIF(parm != null && !string.IsNullOrEmpty(parm.BnSnCode), x => x.BnSnCode == parm.BnSnCode);
  209. predicate.AndIF(parm.IsForAssemble, x => x.Status == 88);
  210. predicate.AndIF(!parm.IsForAssemble, x => x.Status == 55);
  211. //predicate.And(x => x.BalanceQty >= parm.Qty);
  212. //搜索条件查询语法参考Sqlsugar
  213. var response = Queryable()
  214. .Where(predicate.ToExpression())
  215. .OrderBy(x => x.BalanceId)
  216. .OrderBy(x => x.BalanceQty)
  217. .ToList();
  218. if (response.Count > 0)
  219. {
  220. return response.Adapt<List<StkBalanceDtlDto>>();
  221. }
  222. #endregion 按照 bom号、物料号、Bn\Sn码 的条件查找库存
  223. #region 按照物料号、Bn\Sn码 的条件查找库存
  224. var predicate1 = Expressionable.Create<StkBalanceDtl>();
  225. predicate1.AndIF(parm != null && !string.IsNullOrEmpty(parm.MaterialCode), x => x.MaterialCode == parm.MaterialCode || x.MaterialSpec == parm.MaterialCode);
  226. predicate1.AndIF(parm != null && !string.IsNullOrEmpty(parm.BnSnCode), x => x.BnSnCode == parm.BnSnCode);
  227. predicate1.AndIF(parm.IsForAssemble, x => x.Status == 88);
  228. predicate1.AndIF(!parm.IsForAssemble, x => x.Status == 55);
  229. response = Queryable()
  230. .Where(predicate1.ToExpression())
  231. .OrderBy(x => x.BalanceId)
  232. .OrderBy(x => x.BalanceQty)
  233. .ToList();
  234. return response.Adapt<List<StkBalanceDtlDto>>();
  235. #endregion 按照物料号、Bn\Sn码 的条件查找库存
  236. }
  237. #endregion
  238. }
  239. }