StkBalanceDtlService.cs 9.9 KB

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