ZhongTianFjController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. using AutoMapper;
  2. using Bozhon.Wms.Util.Cache;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Newtonsoft.Json;
  5. using System.Collections.Generic;
  6. using System;
  7. using Wms.Screen.Dto.ZhongTian.Request;
  8. using Wms.Screen.Dto.ZhongTian.Response;
  9. using Wms.Screen.Dto.ZhongTian;
  10. using Wms.Screen.Service.IService;
  11. using System.Linq;
  12. using Wms.Screen.Dto;
  13. using Wms.Screen.DataService.Impl;
  14. namespace zt.screen.api.Controllers
  15. {
  16. /// <summary>
  17. /// 中天分拣看板
  18. /// </summary>
  19. [Route("api/[controller]/[action]")]
  20. [ApiController]
  21. public class ZhongTianFjController : ControllerBase
  22. {
  23. private IZhongTianFjService _zhongTianFjService;
  24. private IMapper _mapper;
  25. private Dictionary<string, RangeChecker> _dicRangeChecker;
  26. Dictionary<string, List<string>> _dicDevices;
  27. private readonly FreeRedis.RedisClient _freeRedisClient;
  28. public ZhongTianFjController(IZhongTianFjService zhongTianFjService, IMapper mapper, Dictionary<string, RangeChecker> dicRangeChecker, Dictionary<string, List<string>> dicDevices, FreeRedis.RedisClient freeRedisClient)
  29. {
  30. _zhongTianFjService = zhongTianFjService;
  31. _mapper = mapper;
  32. _dicRangeChecker = dicRangeChecker;
  33. _dicDevices = dicDevices;
  34. _freeRedisClient = freeRedisClient;
  35. }
  36. #region 查询配置文件信息
  37. /// <summary>
  38. /// 查询配置的车间设备信息
  39. /// </summary>
  40. /// <returns></returns>
  41. [HttpPost]
  42. public List<WorkShopWithEquipment> GetWorkShopWithEquipment()
  43. {
  44. List<WorkShopWithEquipment> workShopWithEquipmentList = new List<WorkShopWithEquipment>();
  45. workShopWithEquipmentList.AddRange(InOutEquipment.WorkShopWithEquipment);
  46. workShopWithEquipmentList.AddRange(InOutEquipment.YTWorkShopWithEquipment);
  47. return workShopWithEquipmentList;
  48. }
  49. #endregion
  50. #region 分拣看板
  51. /// <summary>
  52. /// 分拣看板
  53. /// </summary>
  54. /// <param name="strRequest"></param>
  55. /// <param name="workshop"></param>
  56. /// <param name="boardCode"></param>
  57. /// <returns></returns>
  58. [HttpPost]
  59. public List<dynamic> GetFjInfo(StrRequestDto request)
  60. {
  61. if (string.IsNullOrEmpty(request.StrRequest))
  62. {
  63. return new List<dynamic> { new object(), new object(), new object(), new object(), new object() };
  64. }
  65. var result = new List<dynamic>();
  66. if (request.StrRequest.Split(',').Contains("1")) //堆垛机状态
  67. {
  68. //查询设备状态
  69. result.Add(_zhongTianFjService.GetFjEquips(new GetEquipsRequest()
  70. {
  71. WarehouseCodeList = new List<string>() {
  72. Const.Fjhouse_putong,request.Workshop}
  73. }));
  74. }
  75. else
  76. {
  77. result.Add("");
  78. }
  79. if (request.StrRequest.Split(',').Contains("2")) //码垛信息
  80. {
  81. result.Add(_zhongTianFjService.GetMantuoBarCodeRate(request.Workshop));
  82. }
  83. else
  84. {
  85. result.Add("");
  86. }
  87. if (request.StrRequest.Split(',').Contains("3")) //任务信息
  88. {
  89. result.Add(_zhongTianFjService.GetBomSetGrpCurrentMaterialRateList(request.Workshop));
  90. }
  91. else
  92. {
  93. result.Add("");
  94. }
  95. if (request.StrRequest.Split(',').Contains("4")) //报警信息
  96. {
  97. List<string> equipNoList = new List<string>();
  98. InOutEquipment.WorkShopWithEquipment.Where(s => s.InOrOut == "Out" && InOutEquipment.DeopWithWOrkShops.FirstOrDefault().WorkShopList.Contains(s.WorkShop)).ToList().ForEach(
  99. n => equipNoList.AddRange(n.Equipments));
  100. //获取报警信息
  101. //设备号数据,做成配置
  102. result.Add(GetStockInAndOutRecordInfo(new GetEquipsRequest
  103. {
  104. EquCodeList = equipNoList.Distinct().ToList()
  105. }, request.Workshop));
  106. }
  107. else
  108. {
  109. result.Add("");
  110. }
  111. return result;
  112. }
  113. /// <summary>
  114. /// 分拣看板(统计信息)
  115. /// </summary>
  116. /// <returns></returns>
  117. [HttpPost]
  118. public List<dynamic> GetFjStatsInfo(StrRequestDto request)
  119. {
  120. if (string.IsNullOrEmpty(request.StrRequest))
  121. {
  122. return new List<dynamic> { new object(), new object(), new object(), new object(), new object() };
  123. }
  124. var result = new List<dynamic>();
  125. if (request.StrRequest.Split(',').Contains("1")) //货位分布占比
  126. {
  127. result.Add(_zhongTianFjService.GetLocaitonList(request.Workshop));
  128. }
  129. else
  130. {
  131. result.Add("");
  132. }
  133. if (request.StrRequest.Split(',').Contains("2")) //空满轮占比
  134. {
  135. //领料 涂布领料汇总,不区分车间
  136. // result.Add(_zhongTianHjService.GetEmptyFullDist());
  137. result.Add("");
  138. }
  139. else
  140. {
  141. result.Add("");
  142. }
  143. if (request.StrRequest.Split(',').Contains("3")) //7天出入库统计
  144. {
  145. var taskInfos = _zhongTianFjService.GeHistoryTaskInfo(new GeFJHistoryTaskInfoRequest()
  146. {
  147. WareHouse = request.Workshop,
  148. StartTime = DateTime.Now.AddDays(-6),
  149. EndTime = DateTime.Now
  150. });
  151. result.Add(taskInfos);
  152. }
  153. else
  154. {
  155. result.Add("");
  156. }
  157. if (request.StrRequest.Split(',').Contains("4")) //物料重量分布
  158. {
  159. //var taskInfos = _zhongTianHjService.GetFullWeightDist();
  160. //result.Add(taskInfos);
  161. var lists = _zhongTianFjService.GetInvSetGrpList();
  162. result.Add(lists);
  163. }
  164. else
  165. {
  166. result.Add("");
  167. }
  168. if (request.StrRequest.Split(',').Contains("5")) //报警信息
  169. {
  170. List<string> equipNoList = new List<string>();
  171. //获取报警信息
  172. //设备号数据,做成配置
  173. result.Add(GetStockInAndOutRecordInfo(new GetEquipsRequest
  174. {
  175. EquCodeList = equipNoList.Distinct().ToList()
  176. }, request.Workshop));
  177. }
  178. else
  179. {
  180. result.Add("");
  181. }
  182. return result;
  183. }
  184. #endregion
  185. #region 货位利用率
  186. /// <summary>
  187. /// 分拣货位利用率
  188. /// </summary>
  189. /// <param name="strRequest"></param>
  190. /// <returns></returns>
  191. [HttpPost]
  192. public PageResult<ZtLocationUsageReportViewDto> GetFjLocationStateList(StrRequestDto request)
  193. {
  194. return _zhongTianFjService.GetFjLocationUsageViewList(request.Workshop);
  195. }
  196. #endregion
  197. #region 异常信息汇总
  198. /// <summary>
  199. /// 分拣异常信息汇总
  200. /// </summary>
  201. /// <returns></returns>
  202. [HttpPost]
  203. public List<dynamic> GetTotalErrorInfo(StrRequestDto request)
  204. {
  205. var result = new List<dynamic>();
  206. List<string> equipNoList = new List<string>();
  207. InOutEquipment.WorkShopWithEquipment.Where(s => InOutEquipment.DeopWithWOrkShops.Where(m => m.Dept == "fj1").FirstOrDefault().WorkShopList.Contains(s.WorkShop)).ToList().ForEach(
  208. n => equipNoList.AddRange(n.Equipments));
  209. //报警信息
  210. result.Add(GetStockInAndOutRecordInfo(new GetEquipsRequest()
  211. {
  212. EquCodeList = equipNoList.Distinct().ToList()
  213. }, request.Workshop));
  214. return result;
  215. }
  216. #endregion
  217. #region 私有方法:将报表方法提取出来
  218. /// <summary>
  219. /// 报警信息
  220. /// </summary>
  221. /// <param name="reqEntity"></param>
  222. /// <returns></returns>
  223. private List<StockInAndOutRecordDto> GetStockInAndOutRecordInfo(GetEquipsRequest reqEntity, string warehouse)
  224. {
  225. var list = new List<StockInAndOutRecordDto>();
  226. try
  227. {
  228. _dicRangeChecker.TryGetValue(warehouse, out var range);
  229. _dicDevices.TryGetValue(warehouse, out var lists);
  230. var keylists = RedisHelper.Keys("BusinessAlarm**");
  231. foreach (var key in keylists)
  232. {
  233. var value = RedisHelper.Get(key);
  234. var dtolist = JsonConvert.DeserializeObject<List<BusinessDto>>(value);
  235. if (dtolist != null && dtolist.Any())
  236. {
  237. foreach (var item in dtolist)
  238. {
  239. if (int.TryParse(item.DevNo, out var devno))
  240. {
  241. if (range != null && range.IsInRanges(devno) && !string.IsNullOrEmpty(item.Con) && item.Time.Date == DateTime.Now.Date)
  242. {
  243. item.Con = item.Con.Substring(item.Con.LastIndexOf("内容:") + 3);
  244. list.Add(new StockInAndOutRecordDto { dateTime = item.Time.ToString("HH:mm:ss"), Message = item.DevNo + "," + item.Con });
  245. }
  246. }
  247. else
  248. {
  249. if (lists != null && lists.Contains(item.DevNo) && !string.IsNullOrEmpty(item.Con) && item.Time.Date == DateTime.Now.Date)
  250. {
  251. item.Con = item.Con.Substring(item.Con.LastIndexOf("内容:") + 3);
  252. list.Add(new StockInAndOutRecordDto { dateTime = item.Time.ToString("HH:mm:ss"), Message = item.DevNo + "," + item.Con });
  253. }
  254. else if ( !string.IsNullOrEmpty(item.Con) && item.Time.Date == DateTime.Now.Date)
  255. {
  256. item.Con = item.Con.Substring(item.Con.LastIndexOf("内容:") + 3);
  257. list.Add(new StockInAndOutRecordDto { dateTime = item.Time.ToString("HH:mm:ss"), Message = item.DevNo + "," + item.Con });
  258. }
  259. }
  260. }
  261. }
  262. }
  263. var alarm = _freeRedisClient.Get("Sorting:EquipmentAlarm");
  264. if (!string.IsNullOrWhiteSpace(alarm) && alarm != "[]")
  265. {
  266. var dtolist = JsonConvert.DeserializeObject<List<BusinessDto3>>(alarm);
  267. if (dtolist != null && dtolist.Any())
  268. {
  269. foreach (var msgdto in dtolist)
  270. {
  271. if (int.TryParse(msgdto.Code, out var devno))
  272. {
  273. if (range != null && range.IsInRanges(devno) && !string.IsNullOrEmpty(msgdto.Msg) && msgdto.Time.Date == DateTime.Now.Date)
  274. {
  275. list.Add(new StockInAndOutRecordDto { dateTime = msgdto.Time.ToString("HH:mm:ss"), Message = msgdto.Code + "," + msgdto.Msg });
  276. }
  277. }
  278. if (lists != null && lists.Contains(msgdto.Code) && !string.IsNullOrEmpty(msgdto.Msg) && msgdto.Time.Date == DateTime.Now.Date)
  279. {
  280. list.Add(new StockInAndOutRecordDto { dateTime = msgdto.Time.ToString("HH:mm:ss"), Message = msgdto.Code + "," + msgdto.Msg });
  281. }
  282. }
  283. }
  284. }
  285. list = list.OrderByDescending(o => o.dateTime).ToList();
  286. //foreach (var equipno in reqEntity.EquCodeList)
  287. //{
  288. // var msg1 = RedisHelper.Get("Alloy:EquipmentAlarm:" + equipno); //设备报警
  289. // if (!string.IsNullOrEmpty(msg1))
  290. // {
  291. // var msgdto = JsonConvert.DeserializeObject<I_WCS_PutDevInfoRequestDto>(msg1);
  292. // if (msgdto?.Msg == "0" || msgdto?.Msg == "无")
  293. // {
  294. // continue;
  295. // }
  296. // if (msgdto != null && !string.IsNullOrEmpty(msgdto.Msg) && msgdto.Time.Date == DateTime.Now.Date)
  297. // list.Add(new StockInAndOutRecordDto { dateTime = msgdto.Time.ToString("HH:mm:ss"), Message = msgdto.Code + "," + msgdto.Msg });
  298. // }
  299. //}
  300. //var msg2 = RedisHelper.Get("BusinessAlarm:SortingMainLineWorld"); //业务报警
  301. //var msgdto2 = JsonConvert.DeserializeObject<List<BusinessDto>>(msg2);
  302. //if (msgdto2 != null && msgdto2.Any())
  303. //{
  304. // foreach (var item in msgdto2)
  305. // {
  306. // if (!string.IsNullOrEmpty(item.Con) && item.Time.Date == DateTime.Now.Date)
  307. // {
  308. // item.Con = item.Con.Substring(item.Con.LastIndexOf("内容:") + 3);
  309. // if (item.Con.StartsWith("[SRM1]") || item.Con.StartsWith("[SRM2]") || item.Con.StartsWith("[SRM3]"))
  310. // {
  311. // item.Con = item.Con.Substring(item.Con.LastIndexOf("]") + 1);
  312. // }
  313. // else if (item.Con.StartsWith("1011") || item.Con.StartsWith("1012") || item.Con.StartsWith("1014") || item.Con.StartsWith("1016"))
  314. // {
  315. // item.Con = item.Con.Substring(4);
  316. // }
  317. // else if (item.Con.StartsWith("SRM1") || item.Con.StartsWith("SRM2") || item.Con.StartsWith("SRM3"))
  318. // {
  319. // item.Con = item.Con.Substring(4);
  320. // }
  321. // list.Add(new StockInAndOutRecordDto { dateTime = item.Time.ToString("HH:mm:ss"), Message = item.DevNo + "," + item.Con });
  322. // }
  323. // }
  324. //}
  325. //var msg3 = RedisHelper.Get("Alloy:BusinessAlarm:NoInteractionWorld"); //AGV交互报错信息
  326. //var msgdto3 = JsonConvert.DeserializeObject<List<BusinessDto>>(msg3);
  327. //if (msgdto3 != null && msgdto3.Any())
  328. //{
  329. // List<StockInAndOutRecordDto> agv = new List<StockInAndOutRecordDto>();
  330. // foreach (var item in msgdto3)
  331. // {
  332. // if (!string.IsNullOrEmpty(item.Con) && (DateTime.Now - item.Time).Minutes.ToString().GetHashCode() < 2)
  333. // {
  334. // var mes = item.Con.Substring(item.Con.LastIndexOf("内容:") + 3);
  335. // if (mes.StartsWith("[1011]--"))
  336. // {
  337. // mes = mes.Substring(mes.LastIndexOf("--") + 2);
  338. // }
  339. // agv.Add(new StockInAndOutRecordDto { dateTime = item.Time.ToString("HH:mm:ss"), Message = "海康报错信息" + "," + mes });
  340. // }
  341. // }
  342. // if (agv.Any())
  343. // {
  344. // var agv1 = agv.Select(p => p.Message).Distinct().ToList();
  345. // foreach (var item in agv1)
  346. // {
  347. // list.Add(new StockInAndOutRecordDto { dateTime = DateTime.Now.ToString("HH:mm:ss"), Message = item });
  348. // }
  349. // }
  350. //}
  351. }
  352. catch (Exception ex)
  353. {
  354. list.Add(new StockInAndOutRecordDto { dateTime = DateTime.Now.ToString("HH:mm:ss"), Message = $"缓存报警读取失败:{ex.Message}" });
  355. }
  356. if (list.Any())
  357. {
  358. list = list.OrderBy(p => p.Code).Distinct().ToList();
  359. }
  360. return list;
  361. }
  362. #endregion
  363. }
  364. }