ZhongTianSxDataService.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using wms.sqlsugar.model.sx;
  6. using Wms.Screen.DataService.Interface;
  7. using Wms.Screen.Dto.ZhongTian;
  8. using Wms.Screen.Dto.ZhongTian.Request;
  9. using Wms.Screen.Dto.ZhongTian.Response;
  10. using Wms.Screen.SqlSugar.ZhongTian;
  11. using Wms.Screen.SqlSugar.ZhongTian.SX;
  12. using BillInvnow = wms.sqlsugar.model.sx.BillInvnow;
  13. using WCS_TaskOld = wms.sqlsugar.model.sx.WCS_TaskOld;
  14. namespace Wms.Screen.DataService.Impl
  15. {
  16. public class ZhongTianSxDataService : IZhongTianSxDataService
  17. {
  18. public static string[] Grades = new string[] { "C", "D" };
  19. private SqlSugarClient _db;
  20. public ZhongTianSxDataService(SqlSugarClient db)
  21. {
  22. _db = db;
  23. }
  24. public List<ReverseErrorInfo> GetReverseErrorInfo()
  25. {
  26. throw new NotImplementedException();
  27. }
  28. public List<WCS_TaskOld> GetSxEquips(GetEquipsRequest reqEntity)
  29. {
  30. var list = _db.Queryable<WCS_TaskOld>().With(SqlWith.NoLock).Where(p => p.Status != (int)TaskStatus.Finish && p.Status != (int)TaskStatus.Cancel && !string.IsNullOrEmpty(p.Device))
  31. .SplitTable(tabs => tabs.Take(2))?.ToList();
  32. return list ?? new List<WCS_TaskOld>();
  33. }
  34. public List<LocationUsageReportViewDto> GetSxLocationUsageReportList()
  35. {
  36. int _sort = 1;
  37. var list = _db.Queryable<BaseWarecell, BaseWarehouse>((warecell, warehouse) => new object[] {
  38. JoinType.Left,warecell.WarehouseId == warehouse.Id })
  39. .GroupBy((warecell, warehouse) => new
  40. {
  41. warecell.StateNum,
  42. warecell.IsStop,
  43. warecell.Tunnel,
  44. warecell.Floor,
  45. warehouse.Id,
  46. warehouse.Name
  47. }).Select((warecell, warehouse) => new
  48. {
  49. Status = warecell.StateNum,
  50. warecell.Tunnel,
  51. warecell.IsStop,
  52. HouseId = warehouse.Id,
  53. Floor = warecell.Floor,
  54. warehouse.Name,
  55. Total = SqlFunc.AggregateCount(warecell.Tunnel),
  56. })
  57. .MergeTable().ToList().OrderBy(o => o.Tunnel);
  58. //基表:巷道、货架标识和仓库名称为维度查找总货位
  59. var baseTemp = list.GroupBy(s => new { s.Tunnel, s.HouseId, s.Name, s.Floor }).Select(m => new { m.Key.Name, m.Key.Tunnel, m.Key.Floor, Total = m.Sum(n => n.Total) }).ToList();
  60. //关联表:巷道和仓库名称为维度,查找可用货位:未停用.已锁定也算有效货位
  61. var useLocation = list.Where(s => s.IsStop == 0).GroupBy(s => new { s.Tunnel, s.HouseId, s.Name, s.Floor }).Select(m => new { m.Key.Name, m.Key.Tunnel, m.Key.Floor, Total = m.Sum(n => n.Total) }).ToList();
  62. //关联表:巷道和仓库名称为维度,查找锁定货位
  63. var lockLocation = list.Where(s => s.Status == (int)SXLocationState.LocationState_StockIn || s.Status == (int)SXLocationState.LocationState_StockOut || s.Status == (int)SXLocationState.LocationState_StockMove).GroupBy(s => new { s.Tunnel, s.HouseId, s.Name, s.Floor }).Select(m => new { m.Key.Name, m.Key.Tunnel, m.Key.Floor, Total = m.Sum(n => n.Total) }).ToList();
  64. //关联表:巷道和仓库名称为维度,查找停用货位
  65. var stopLocation = list.Where(s => s.IsStop == 1).GroupBy(s => new { s.Tunnel, s.HouseId, s.Name, s.Floor }).Select(m => new { m.Key.Name, m.Key.Tunnel, m.Key.Floor, Total = m.Sum(n => n.Total) }).ToList();
  66. //关联表:巷道和仓库名称为维度,查找物料货位
  67. var materialLocation = list.Where(s => s.Status == (int)SXLocationState.LocationState_Full).GroupBy(s => new { s.Tunnel, s.HouseId, s.Name, s.Floor }).Select(m => new { m.Key.Name, m.Key.Tunnel, m.Key.Floor, Total = m.Sum(n => n.Total) }).ToList();
  68. var locationUsageReportViewDtos = from basetemp in baseTemp
  69. join uselocation in useLocation on new { basetemp.Tunnel, basetemp.Name, basetemp.Floor } equals new { uselocation.Tunnel, uselocation.Name, uselocation.Floor } into useinfo
  70. join locklocation in lockLocation on new { basetemp.Tunnel, basetemp.Name, basetemp.Floor } equals new { locklocation.Tunnel, locklocation.Name, locklocation.Floor } into lockinfo
  71. from lockinfoif in lockinfo.DefaultIfEmpty()
  72. join stoplocation in stopLocation on new { basetemp.Tunnel, basetemp.Name, basetemp.Floor } equals new { stoplocation.Tunnel, stoplocation.Name, stoplocation.Floor } into stopinfo
  73. from stopinfoif in stopinfo.DefaultIfEmpty()
  74. join materiallocation in materialLocation on new { basetemp.Tunnel, basetemp.Name, basetemp.Floor } equals new { materiallocation.Tunnel, materiallocation.Name, materiallocation.Floor } into materialinfo
  75. from materialinfoif in materialinfo.DefaultIfEmpty()
  76. orderby basetemp.Name
  77. select new LocationUsageReportViewDto()
  78. {
  79. Sort = _sort++,
  80. Tunnel = basetemp.Tunnel.ToString(),
  81. Floor = basetemp.Floor.ToString(),
  82. WarehouseName = basetemp.Name,
  83. AllLocationTotal = basetemp.Total,
  84. CanUseLocation = useinfo.FirstOrDefault() == null ? 0 : useinfo.First().Total,
  85. LockLocation = lockinfoif == null ? 0 : lockinfoif.Total,
  86. StopLocation = stopinfoif == null ? 0 : stopinfoif.Total,
  87. MaterilLocation = materialinfoif == null ? 0 : materialinfoif.Total
  88. };
  89. return locationUsageReportViewDtos.OrderBy(p => p.WarehouseName).ToList();
  90. }
  91. public List<ProductPackRule> GetSxProductPackRule(GetWorkPlanBillListRequest reqEntity)
  92. {
  93. var list = _db.Queryable<BillInvnow>().Where(p => p.TorsChkChordIsGood == "NG" || p.TorsChkFlatnessIsGood == "NG" || p.TorsChkValueIsGood == "NG")
  94. .Select((p) => new ProductPackRule()
  95. {
  96. BoxNo = p.CLBarCode,
  97. HWSpec = p.HWTypeCode,
  98. //EnchaseState = p.ZXStateCode,
  99. //PackRule = p.PackRule,
  100. //FullCount = product.FullCountQty,
  101. //EmptyCount = product.EmptyCountQty,
  102. //IsSolder = product.IsSolder.ToString(),
  103. }).ToList();
  104. return list;
  105. }
  106. public List<SXTaskInfoDto> GetSxRunWcsTaskInfo(GetWcsTaskInfoRequest request)
  107. {
  108. var listin = _db.Queryable<WCS_TaskInfo, BillInvinit, PalletLayerMath>((wcstask, stock, math) => new object[] {
  109. JoinType.Left, wcstask.BarCode == stock.ContGrpBarCode,
  110. JoinType.Left, wcstask.BarCode == stock.ContGrpBarCode,
  111. JoinType.Left, wcstask.BarCode == math.ContBarCode,
  112. }).With(SqlWith.NoLock)
  113. .Where((wcstask, stock, math) => wcstask.Status < TaskStatus.Finish && wcstask.Status >= TaskStatus.帘线扫码 && wcstask.Type == TaskType.EnterDepot)
  114. .OrderBy((wcstask, stock, math) => wcstask.AddTime, OrderByType.Desc)
  115. .Select((wcstask, stock, math) => new SXTaskInfoDto
  116. {
  117. TaskCode = wcstask.ID.ToString(),
  118. TaskType = wcstask.Type == TaskType.EnterDepot ? "入库" : wcstask.Type == TaskType.OutDepot ? "出库" : wcstask.Type == TaskType.TransferDepot ? "移库" : "移动",
  119. TaskStateEnum = wcstask.Status,
  120. HWBarCode = wcstask.BarCode,
  121. HWSpec = stock.HWTypeCode,
  122. SKU = math.SkuCode,
  123. Layer = math.Layer,
  124. BeginPosition = wcstask.AddrFrom,
  125. EndPosition = wcstask.AddrTo,
  126. DocCode = stock.InDocsNo,
  127. CreatedTime = wcstask.AddTime,
  128. AddTime = wcstask.AddTime.ToString(),
  129. BoxBarCode = "",
  130. BusType = wcstask.BusType,
  131. Floor = wcstask.Floor,
  132. Grade = stock.Grade,
  133. MatCode = wcstask.MaterialCode,
  134. MaterialCode = wcstask.MaterialCode,
  135. Tunnel = wcstask.Tunnel,
  136. NextPosition = wcstask.AddrNext,
  137. }).Distinct().ToList();
  138. var listout = _db.Queryable<WCS_TaskInfo, BillInvinit, PalletLayerMath>((wcstask, stock, math) => new object[] {
  139. JoinType.Left, wcstask.BarCode == stock.ContGrpBarCode,
  140. JoinType.Left, wcstask.BarCode == stock.ContGrpBarCode,
  141. JoinType.Left, wcstask.BarCode == math.ContBarCode,
  142. }).With(SqlWith.NoLock)
  143. .Where((wcstask, stock, math) => wcstask.Status < TaskStatus.Finish && wcstask.Type == TaskType.OutDepot)
  144. .OrderBy((wcstask, stock, math) => wcstask.AddTime, OrderByType.Desc)
  145. .Select((wcstask, stock, math) => new SXTaskInfoDto
  146. {
  147. TaskCode = wcstask.ID.ToString(),
  148. TaskType = wcstask.Type == TaskType.EnterDepot ? "入库" : wcstask.Type == TaskType.OutDepot ? "出库" : wcstask.Type == TaskType.TransferDepot ? "移库" : "移动",
  149. TaskStateEnum = wcstask.Status,
  150. HWBarCode = wcstask.BarCode,
  151. HWSpec = stock.HWTypeCode,
  152. SKU = math.SkuCode,
  153. Layer = math.Layer,
  154. BeginPosition = wcstask.AddrFrom,
  155. EndPosition = wcstask.AddrTo,
  156. DocCode = stock.InDocsNo,
  157. CreatedTime = wcstask.AddTime,
  158. AddTime = wcstask.AddTime.ToString(),
  159. BoxBarCode = "",
  160. BusType = wcstask.BusType,
  161. Floor = wcstask.Floor,
  162. Grade = stock.Grade,
  163. MatCode = wcstask.MaterialCode,
  164. MaterialCode = wcstask.MaterialCode,
  165. Tunnel = wcstask.Tunnel,
  166. NextPosition = wcstask.AddrNext
  167. }).Distinct().ToList();
  168. var list = listin.Union(listout).ToList();
  169. foreach (var item in list)
  170. {
  171. item.TaskState = Enum.GetName(typeof(TaskStatus), item.TaskStateEnum);
  172. }
  173. return list.ToList();
  174. }
  175. public List<SXStockDto> GetExceptionStockInfo()
  176. {
  177. var lists = _db.Queryable<BillInvnow, BaseWarecell, BaseWarehouse>((billInvnow, warecell, warehouse) => new object[] {
  178. JoinType.Left,billInvnow.ContGrpId == warecell.ContGrpId && billInvnow.WarehouseId ==warecell.WarehouseId , JoinType.Left, billInvnow.WarehouseId==warehouse.Id})
  179. .Where((billInvnow, warecell, warehouse) => billInvnow.TorsChkChordIsGood.Equals("NG") || billInvnow.TorsChkFlatnessIsGood.Equals("NG") || billInvnow.TorsChkValueIsGood.Equals("NG"))
  180. .Where((billInvnow, warecell, warehouse) => Grades.Contains(billInvnow.Grade))
  181. .Select((billInvnow, warecell, warehouse) => new SXStockDto
  182. {
  183. ContGrpBarCode = billInvnow.ContGrpBarCode,
  184. Code = warecell.Code,
  185. Tunnel = warecell.Tunnel,
  186. BoxBarCode = billInvnow.BoxBarCode,
  187. ContGrpType = billInvnow.ContGrpType,
  188. SkuCode = billInvnow.SkuCode,
  189. InvStateCode = billInvnow.InvStateCode,
  190. MatCode = billInvnow.MatCode,
  191. Grade = billInvnow.Grade,
  192. HWTypeCode = billInvnow.HWTypeCode,
  193. }).Take(200).ToList();
  194. return lists;
  195. }
  196. public List<WCSTaskInfo> GetPalletizingTasks()
  197. {
  198. var predicate = Expressionable.Create<WCSTaskInfo>();
  199. predicate = predicate.And(m => m.Status < 30);
  200. predicate = predicate.And(m => SqlFunc.Subqueryable<Palletizing>().Where(s => s.Id == m.PalletizingId && s.PalletizState != 1).Any());
  201. var list = _db.Queryable<WCSTaskInfo>().With(SqlWith.NoLock).Where(predicate.ToExpression()).ToList();
  202. return list;
  203. }
  204. /// <summary>
  205. /// 获取扭转统计信息
  206. /// </summary>
  207. /// <returns></returns>
  208. public TorStaticsInfo GetTorStaticsInfo()
  209. {
  210. var result = new TorStaticsInfo();
  211. //获取库中扭转不合格盘
  212. result.TorNoGood = _db.Queryable<BillInvnow, BaseWarecell>((billInvnow, warecell) => new object[] {
  213. JoinType.Inner,billInvnow.ContGrpId == warecell.ContGrpId }).With(SqlWith.NoLock)
  214. .Where((billInvnow, warecell) => billInvnow.TorsChkChordIsGood.Equals("NG") || billInvnow.TorsChkFlatnessIsGood.Equals("NG") || billInvnow.TorsChkValueIsGood.Equals("NG"))
  215. .Where((billInvnow, warecell) => billInvnow.InvStateCode == "InvEcecState_In" && !billInvnow.AddWho.Contains("测试"))
  216. .Count();
  217. var TorschkDate = _db.Queryable<SysConfig>().Where(p => p.Code == "TorsChkDateCount").First();
  218. var time1 = decimal.Parse(TorschkDate.SContent);
  219. var time2 = decimal.Parse(TorschkDate.Default1);
  220. var startTime = DateTime.Now.Date.AddDays(-1).AddMilliseconds(-1);
  221. //库中满足时效待检测盘
  222. result.TorTobe = _db.Queryable<BillInvnow, BaseWarecell>((billInvnow, warecell) => new object[] {
  223. JoinType.Inner,billInvnow.ContGrpId == warecell.ContGrpId }).With(SqlWith.NoLock)
  224. .Where((billInvnow, warecell) => billInvnow.IsTorsChk == true)
  225. .Where((billInvnow, warecell) => billInvnow.InvStateCode == "InvEcecState_In" && !billInvnow.ProductMachCode.Contains("R") && billInvnow.ContUsageQty <= 0 && billInvnow.TorsChkQty < 1).ToList()
  226. .Where((billInvnow, warecell) => billInvnow.ProductTime <= startTime)
  227. .Count();
  228. //库中未满足时效待检测盘
  229. result.TorNoTobe = _db.Queryable<BillInvnow, BaseWarecell>((billInvnow, warecell) => new object[] {
  230. JoinType.Inner,billInvnow.ContGrpId == warecell.ContGrpId }).With(SqlWith.NoLock)
  231. .Where((billInvnow, warecell) => billInvnow.IsTorsChk == true)
  232. .Where((billInvnow, warecell) => billInvnow.InvStateCode == "InvEcecState_In" && !billInvnow.ProductMachCode.Contains("R") && billInvnow.ContUsageQty <= 0 && billInvnow.TorsChkQty < 1).ToList()
  233. .Where((billInvnow, warecell) => billInvnow.ProductTime > startTime)
  234. .Count();
  235. //库中未满足时效待检测盘(今天出库检测)
  236. result.TodayTorNoTobe = _db.Queryable<BillInvnow, BaseWarecell>((billInvnow, warecell) => new object[] {
  237. JoinType.Inner,billInvnow.ContGrpId == warecell.ContGrpId }).With(SqlWith.NoLock)
  238. .Where((billInvnow, warecell) => billInvnow.IsTorsChk == true)
  239. .Where((billInvnow, warecell) => billInvnow.InvStateCode == "InvEcecState_In" && !billInvnow.ProductMachCode.Contains("R") && billInvnow.ContUsageQty <= 0 && billInvnow.TorsChkQty < 1).ToList()
  240. .Where((billInvnow, warecell) => billInvnow.ProductTime <= startTime)
  241. .Count();
  242. result.ToroOuting = _db.Queryable<WCS_TaskOld>().With(SqlWith.NoLock).Where(p => p.Status != (int)TaskStatus.Finish && p.Status != (int)TaskStatus.Cancel && p.BusType == "扭转检测")
  243. .SplitTable(tabs => tabs.Take(2)).Count() - _db.Queryable<TorschWbCount>().With(SqlWith.NoLock).Sum(p => p.WbCount);
  244. if (result.ToroOuting < 0)
  245. {
  246. result.ToroOuting = 0;
  247. }
  248. result.ToroIning = _db.Queryable<BillInvnow>().With(SqlWith.NoLock).Where(p => p.Memo == "扭转回库" && p.InvStateCode == "InvEcecState_BuildUp").Count();
  249. result.TimeOuthw = _db.Queryable<BillInvnow, BaseWarecell>((inv, cell) => new object[] {
  250. JoinType.Left,inv.ContGrpBarCode == cell.ContGrpBarCode }).With(SqlWith.NoLock)
  251. .Where((inv, cell) => cell.IsStop == 0 && cell.StateNum == 2 && ((inv.ProductMachCode.Contains("R") && inv.OneInTime < DateTime.Now.AddHours(-72))
  252. || (!inv.ProductMachCode.Contains("R") && inv.ProductTime < DateTime.Now.AddHours(-72))))
  253. .ToList().Count;
  254. return result;
  255. }
  256. public List<TunnelDto> GetTunnelStopList()
  257. {
  258. return _db.Queryable<SysConfig>().Where(p => p.SType == "InStop" || p.SType == "OutStop").Select(m => new TunnelDto()
  259. {
  260. Id = m.Id.ToString(),
  261. WareHouseName = "时效库",
  262. Code = m.Code,
  263. Name = m.Name,
  264. Tunnel = m.Default1,
  265. Floor = m.Default2,
  266. Statu = string.IsNullOrEmpty(m.SContent) ? "0" : "1",
  267. StatuName = string.IsNullOrEmpty(m.SContent) ? "启用" : "禁用",
  268. SType = m.SType,
  269. Memo = m.Memo,
  270. AddTime = m.AddTime,
  271. EditTime = m.EditTime,
  272. }).ToList();
  273. }
  274. public SysConfig GetSysConfig(string code)
  275. {
  276. return _db.Queryable<SysConfig>().Where(p => p.Code == code).First();
  277. }
  278. public List<BaseTorchbandinfo> GetTorStaticsInfo(string maccode)
  279. {
  280. var result = new List<BaseTorchbandinfo>();
  281. result = _db.Queryable<BaseTorchbandinfo>().With(SqlWith.NoLock).Where(p => p.Machine.Contains(maccode)).ToList();
  282. return result;
  283. }
  284. public TorschWbCount GetTorschWbCount(string maccode)
  285. {
  286. var result = new TorschWbCount();
  287. result = _db.Queryable<TorschWbCount>().With(SqlWith.NoLock).Where(p => p.Code.Contains(maccode)).First();
  288. return result == null ? new TorschWbCount() : result;
  289. }
  290. /// <summary>
  291. /// 时效当前库存分布(非控制盘)
  292. /// </summary>
  293. /// <returns></returns>
  294. public List<CurStockInfo> GetCurStockInfo()
  295. {
  296. var lists = _db.Queryable<BillInvnow>()
  297. .With(SqlWith.NoLock)
  298. .Where((billInvnow) => billInvnow.InvStateCode == SXInvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(billInvnow.PreStock) && ((billInvnow.IsControlpanel == false) || (billInvnow.IsControlpanel == true && billInvnow.InDocsNo.StartsWith("CHA"))))
  299. .Select((billInvnow) => new CurStockInfo
  300. {
  301. MatName = billInvnow.MatName,
  302. MatCode = billInvnow.MatCode,
  303. DocNo = billInvnow.InDocsNo,
  304. WbGroupCode = billInvnow.WbGroupCode,
  305. Wind = billInvnow.Wind,
  306. HWType = billInvnow.HWTypeCode,
  307. //IsTorsChk = billInvnow.IsTorsChk.ToString(),
  308. IsBlack = billInvnow.IsBlack.ToString(),
  309. //Rule = boxrule.PackRule,
  310. Grade = billInvnow.Grade,
  311. ContGrpBarCode = billInvnow.ContGrpBarCode
  312. }).MergeTable().ToList().Distinct(new CompareStock());
  313. var doclist = _db.Context.Queryable<BillPboxrule>().With(SqlWith.NoLock).Select(p => new CurStockInfo() { DocNo = p.DocsNo, SKU = p.SkuCode }).Distinct().ToList();
  314. var newCurStockInfoLists = from st in lists
  315. join doc in doclist on st.DocNo equals doc.DocNo into tempstock
  316. from nst in tempstock.DefaultIfEmpty()
  317. select new CurStockInfo
  318. {
  319. MatName = st.MatName,
  320. MatCode = st.MatCode,
  321. DocNo = nst == null ? "" : nst.DocNo,
  322. WbGroupCode = st.WbGroupCode,
  323. Wind = st.Wind,
  324. HWType = st.HWType,
  325. //IsTorsChk = billInvnow.IsTorsChk.ToString(),
  326. IsBlack = st.IsBlack.ToString(),
  327. //Rule = boxrule.PackRule,
  328. Grade = st.Grade,
  329. ContGrpBarCode = st.ContGrpBarCode,
  330. SKU = nst == null ? "" : nst.DocNo,
  331. };
  332. var list = new List<CurStockInfo>();
  333. var boxlist = _db.Queryable<BillPboxrule>().With(SqlWith.NoLock).ToList();
  334. foreach (var item in newCurStockInfoLists.GroupBy(p => new { p.SKU, p.MatCode, p.DocNo, p.WbGroupCode, p.Grade }).ToList())
  335. {
  336. list.Add(new CurStockInfo()
  337. {
  338. SKU = item.Key.SKU ?? "",
  339. MatName = item.First().MatName,
  340. DocNo = item.Key.DocNo,
  341. WbGroupCode = item.Key.WbGroupCode ?? "",
  342. NoBCount = new List<string>() { item.Count(p => p.IsBlack == "0" && p.Wind == "R") + "R", item.Count(p => p.IsBlack == "0" && p.Wind == "L") + "L" },
  343. BCount = new List<string>() { item.Count(p => p.IsBlack == "1" && p.Wind == "R") + "R", item.Count(p => p.IsBlack == "1" && p.Wind == "L") + "L" },
  344. Grade = item.Key.Grade ?? "",
  345. //Rule = item.Key.Rule ?? "",
  346. FinCount = boxlist.Where(p => p.DocsNo == item.Key.DocNo && p.ZXStateCode == "2").Count(),
  347. NoFinCount = boxlist.Where(p => p.DocsNo == item.Key.DocNo && p.ZXStateCode != "2").Count(),
  348. Count = item.Count(p => !string.IsNullOrEmpty(p.ContGrpBarCode))
  349. });
  350. }
  351. return list.OrderBy(o => o.SKU).ThenBy(o => o.WbGroupCode).ThenBy(o => o.Wind).ThenBy(o => o.HWType).ThenBy(o => o.Grade).ToList();
  352. }
  353. /// <summary>
  354. /// 时效当前库存分布(控制盘)
  355. /// </summary>
  356. /// <returns></returns>
  357. public List<CurStockInfo> GetCurStockInfoControl()
  358. {
  359. var lists = _db.Queryable<BillInvnow, BillPboxrule>((billInvnow, boxrule) => new object[] {
  360. JoinType.Left,billInvnow.InDocsNo == boxrule.DocsNo,JoinType.Left})
  361. .With(SqlWith.NoLock)
  362. .Where((billInvnow, boxrule) => billInvnow.InvStateCode == SXInvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(billInvnow.PreStock) && billInvnow.IsControlpanel == true && billInvnow.Grade == "A")
  363. .Select((billInvnow, boxrule) => new CurStockInfo
  364. {
  365. SKU = boxrule.SkuCode,
  366. MatName = billInvnow.MatName,
  367. MatCode = billInvnow.MatCode,
  368. DocNo = billInvnow.InDocsNo,
  369. WbGroupCode = billInvnow.WbGroupCode,
  370. Wind = billInvnow.Wind,
  371. HWType = billInvnow.HWTypeCode,
  372. //IsTorsChk = billInvnow.IsTorsChk.ToString(),
  373. IsBlack = billInvnow.IsBlack.ToString(),
  374. //Rule = boxrule.PackRule,
  375. Grade = billInvnow.Grade,
  376. ContGrpBarCode = billInvnow.ContGrpBarCode,
  377. ProductTime = billInvnow.ProductTime,
  378. }).MergeTable().ToList().Distinct(new CompareStock());
  379. var list = new List<CurStockInfo>();
  380. var boxlist = _db.Queryable<BillPboxrule>().With(SqlWith.NoLock).ToList();
  381. foreach (var item in lists.GroupBy(p => new { p.SKU, p.MatCode, p.WbGroupCode, p.Grade }).ToList())
  382. {
  383. list.Add(new CurStockInfo()
  384. {
  385. SKU = item.Key.SKU ?? "",
  386. MatName = item.First().MatName,
  387. WbGroupCode = item.Key.WbGroupCode ?? "",
  388. HaveBlack = new List<string>() {
  389. "("+ item.Count(p => p.IsBlack == "1" && p.Wind == "R" && p.ProductTime >= DateTime.Now.Date.AddDays(-2).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddDays(-1).AddHours(8)) + "R"+"/"+ item.Count(p => p.IsBlack == "1" && p.Wind == "L" && p.ProductTime >= DateTime.Now.Date.AddDays(-2).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddDays(-1).AddHours(8)) + "L" +")",
  390. "("+ item.Count(p => p.IsBlack == "1" && p.Wind == "R" && p.ProductTime >= DateTime.Now.Date.AddDays(-1).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddHours(8)) + "R"+"/"+ item.Count(p => p.IsBlack == "1" && p.Wind == "L" && p.ProductTime >= DateTime.Now.Date.AddDays(-1).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddHours(8)) + "L" +")",
  391. "("+ item.Count(p => p.IsBlack == "1" && p.Wind == "R" && p.ProductTime >= DateTime.Now.Date.AddHours(13)) + "R"+"/"+ item.Count(p => p.IsBlack == "1" && p.Wind == "L" && p.ProductTime >= DateTime.Now.Date.AddHours(13)) + "L" +")",
  392. },
  393. Grade = item.Key.Grade ?? "",
  394. //Rule = item.Key.Rule ?? "",
  395. Count = item.Count(p => !string.IsNullOrEmpty(p.ContGrpBarCode)),
  396. TodayQty = new List<string>() { item.Count(p => p.IsBlack == "0" && p.Wind == "R" && p.ProductTime >= DateTime.Now.Date.AddHours(13)) + "R", item.Count(p => p.IsBlack == "0" && p.Wind == "L" && p.ProductTime >= DateTime.Now.Date.AddHours(13)) + "L" },
  397. YesterdayQty = new List<string>() { item.Count(p => p.IsBlack == "0" && p.Wind == "R" && p.ProductTime >= DateTime.Now.Date.AddDays(-1).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddHours(8)) + "R", item.Count(p => p.IsBlack == "0" && p.Wind == "L" && p.ProductTime >= DateTime.Now.Date.AddDays(-1).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddHours(8)) + "L" },
  398. BeforeYesterdayQty = new List<string>() { item.Count(p => p.IsBlack == "0" && p.Wind == "R" && p.ProductTime >= DateTime.Now.Date.AddDays(-2).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddDays(-1).AddHours(8)) + "R", item.Count(p => p.IsBlack == "0" && p.Wind == "L" && p.ProductTime >= DateTime.Now.Date.AddDays(-2).AddHours(13) && p.ProductTime <= DateTime.Now.Date.AddDays(-1).AddHours(8)) + "L" },
  399. });
  400. }
  401. return list.OrderBy(o => o.SKU).ThenBy(o => o.WbGroupCode).ThenBy(o => o.Wind).ThenBy(o => o.HWType).ThenBy(o => o.Grade).ToList();
  402. }
  403. }
  404. }