PtController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. using AutoMapper;
  2. using MathNet.Numerics.Distributions;
  3. using Microsoft.AspNetCore.Http;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Newtonsoft.Json;
  6. using System.Reflection.Emit;
  7. using wms.dto;
  8. using wms.dto.request;
  9. using wms.dto.request.pt;
  10. using wms.dto.request.pt.dto;
  11. using wms.dto.request.share;
  12. using wms.dto.response;
  13. using wms.dto.response.pt;
  14. using wms.service.IService;
  15. using wms.sqlsugar;
  16. using wms.sqlsugar.model.pt;
  17. using wms.util.Ext;
  18. namespace wms.api.Controllers
  19. {
  20. /// <summary>
  21. /// 盘条库控制器
  22. /// </summary>
  23. [Route("api/[controller]/[action]")]
  24. [ApiController]
  25. public class PtController : BaseController
  26. {
  27. private readonly IPTService _ptService;
  28. private readonly ILogger<PtController> _logger;
  29. private readonly IMapper _mapper;
  30. static object lockerPurchaseBillTrans = new object();
  31. static object lockerErpUnlockStock = new object();
  32. static object lockerProductionStockOut = new object();
  33. static object lockerProductionFeedBack = new object();
  34. static object lockerStockChange = new object();
  35. static object lockerProductionBack = new object();
  36. static object lockerPtPurchTaskIn = new object();
  37. static object lockerPtApplyStockInLoc = new object();
  38. static object lockerPtCompleteTask = new object();
  39. static object lockerPtSrmPickOutCompleted = new object();
  40. static object lockerSyncMaterInfoList = new object();
  41. static object lockerPtWcsProductionOutTask = new object();
  42. static object lockerGetPtTunnelList = new object();
  43. public PtController(IPTService ptService, ILogger<PtController> logger, IMapper mapper) : base(ptService)
  44. {
  45. _ptService = ptService;
  46. _logger = logger;
  47. _mapper = mapper;
  48. }
  49. /// <summary>
  50. /// 同步物料基础信息
  51. /// </summary>
  52. /// <param name="reqDto"></param>
  53. /// <returns></returns>
  54. [HttpPost]
  55. public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
  56. {
  57. var result = new SRes();
  58. //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
  59. PTSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  60. if (reqBody.SyncType == 1)
  61. {
  62. reqBody.PageIndex = 1;
  63. while (resbody.ResData.Any())
  64. {
  65. _ptService.SyncMaterInfo(resbody.ResData);
  66. reqBody.PageIndex++;
  67. resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  68. }
  69. }
  70. else if (reqBody.SyncType == 2)
  71. {
  72. //拿到增量
  73. var increconf = _ptService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
  74. if (increconf != null)
  75. {
  76. reqBody.StartTime = DateTime.Parse(increconf.SContent);
  77. //reqBody.Count = int.Parse(increconf.Remark);
  78. resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  79. if (resbody.ResData.Any())
  80. {
  81. if (_ptService.SyncMaterInfo(resbody.ResData))
  82. {
  83. var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
  84. _ptService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<ptSysConfig>()
  85. {
  86. Columns = it => new ptSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
  87. WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
  88. });
  89. }
  90. }
  91. else
  92. {
  93. result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
  94. result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
  95. }
  96. }
  97. else
  98. {
  99. result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
  100. result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
  101. }
  102. }
  103. else
  104. {
  105. if (!string.IsNullOrEmpty(reqBody.MatCode))
  106. {
  107. resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  108. if (resbody.ResData.Any())
  109. {
  110. if (_ptService.SyncMaterInfo(resbody.ResData))
  111. {
  112. }
  113. }
  114. }
  115. }
  116. return result.ToCamelCaseString();
  117. }
  118. /// <summary>
  119. /// 采购到货单/采购退货单/到货重挂清单接口
  120. /// </summary>
  121. /// <param name="request"></param>
  122. /// <returns></returns>
  123. [HttpPost]
  124. public SRes PurchaseBillTrans(PurchaseBillTransReqest reqDto)
  125. {
  126. return ConcurrencyReqControl<PurchaseBillTransReqest, SRes>(lockerPurchaseBillTrans, "PurchaseBillTrans" + reqDto.BillCode, reqDto.BillCode, reqDto, _ptService.PurchaseBillTrans);
  127. }
  128. /// <summary>
  129. /// 盘条主数据接收
  130. /// </summary>
  131. /// <param name="reqDto"></param>
  132. /// <returns></returns>
  133. [HttpPost]
  134. public SRes PtSyncMaterInfoList(PtSyncMaterInfoListRequest reqDto)
  135. {
  136. var res = new SRes();
  137. return ConcurrencyReqControl<PtSyncMaterInfoListRequest, SRes>(lockerSyncMaterInfoList, "PtSyncMaterInfoList", "物料主数据推送", reqDto, _ptService.GetSyncMaterInfo);
  138. }
  139. /// <summary>
  140. /// 采购到货单入库反馈/采购退货出库反馈/异常出库重挂反馈接口
  141. /// </summary>
  142. /// <param name="request"></param>
  143. /// <returns></returns>
  144. [HttpPost]
  145. public SRes PurchaseBillTransFeedBack(PtAutoPurchData request)
  146. {
  147. var res = new SRes();
  148. //自动推送
  149. if (request.Type == "1")
  150. {
  151. var list = _ptService.GetBillFeedbackList();
  152. if (!list.Any())
  153. {
  154. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  155. res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
  156. }
  157. //采购入库单
  158. if (list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()).ToList().Any())
  159. {
  160. var purch = list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()).ToList();
  161. PurchaseBillTransFeedBackRequest purchaseBill = new PurchaseBillTransFeedBackRequest();
  162. var dtolist = _mapper.Map<List<PurchaseBillTransFeedBackRequestItem>>(purch);
  163. var purchs = purch.First();
  164. purchaseBill.ListInfo = dtolist;
  165. purchaseBill.BillCode = purchs.DocsNo;
  166. purchaseBill.BillType = purchs.TypeCode;
  167. purchaseBill.ReqId = purchs.ReqNo;
  168. var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(purchaseBill));
  169. var ids = purch.Select(p => p.Id).ToList();
  170. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  171. {
  172. _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
  173. {
  174. Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  175. WhereExpression = it => ids.Contains(it.Id)
  176. });
  177. }
  178. else
  179. {
  180. _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
  181. {
  182. Columns = it => new ptBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  183. WhereExpression = it => ids.Contains(it.Id)
  184. });
  185. }
  186. }
  187. //重挂
  188. else if (list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()).ToList().Any())
  189. {
  190. var purch = list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()).ToList();
  191. PurchaseBillTransFeedBackRequest purchaseBill = new PurchaseBillTransFeedBackRequest();
  192. var dtolist = _mapper.Map<List<PurchaseBillTransFeedBackRequestItem>>(purch);
  193. var purchs = purch.First();
  194. purchaseBill.ListInfo = dtolist;
  195. purchaseBill.BillCode = purchs.DocsNo;
  196. purchaseBill.BillType = purchs.TypeCode;
  197. purchaseBill.ReqId = purchs.ReqNo;
  198. var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(purchaseBill));
  199. var ids = purch.Select(p => p.Id).ToList();
  200. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  201. {
  202. _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
  203. {
  204. Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  205. WhereExpression = it => ids.Contains(it.Id)
  206. });
  207. }
  208. else
  209. {
  210. _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
  211. {
  212. Columns = it => new ptBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  213. WhereExpression = it => ids.Contains(it.Id)
  214. });
  215. }
  216. }
  217. }
  218. return res;
  219. }
  220. /// <summary>
  221. /// 放行单传输接口
  222. /// </summary>
  223. /// <param name="request"></param>
  224. /// <returns></returns>
  225. [HttpPost]
  226. public ErpUnlockStockResponse ErpUnlockStock(ErpUnlockStockRequest reqDto)
  227. {
  228. return ConcurrencyReqControl<ErpUnlockStockRequest, ErpUnlockStockResponse>(lockerErpUnlockStock, "ErpUnlockStock" + reqDto.BillCode, reqDto.BillCode, reqDto, _ptService.ErpUnlockStock);
  229. }
  230. /// <summary>
  231. /// 生产领料单传输接口
  232. /// </summary>
  233. /// <param name="request"></param>
  234. /// <returns></returns>
  235. [HttpPost]
  236. public SRes ProductionStockOut(ProductionStockOutRequest reqDto)
  237. {
  238. return ConcurrencyReqControl<ProductionStockOutRequest, SRes>(lockerProductionStockOut, "ProductionStockOut" + reqDto.BillCode, reqDto.BillCode, reqDto, _ptService.ProductionStockOut);
  239. }
  240. /// <summary>
  241. /// 自动叫料
  242. /// </summary>
  243. /// <param name="request"></param>
  244. /// <returns></returns>
  245. [HttpPost]
  246. public SRes WcsProductionOutRequest(WcsProductionOutRequest request)
  247. {
  248. return ConcurrencyReqControl<WcsProductionOutRequest, SRes>(lockerPtWcsProductionOutTask, "WcsProductionOutRequest" + request.Endquip, request.Endquip, request, _ptService.WcsProductionOutRequest);
  249. }
  250. /// <summary>
  251. /// 生产领料/退料/改判反馈接口
  252. /// </summary>
  253. /// <param name="request"></param>
  254. /// <returns></returns>
  255. [HttpPost]
  256. public SRes ProductionFeedBack(ProductionFeedBackRequest reqDto)
  257. {
  258. return ConcurrencyReqControl<ProductionFeedBackRequest, SRes>(lockerProductionFeedBack, "ProductionFeedBack" + reqDto.BillCode, reqDto.BillCode, reqDto, _ptService.ProductionFeedBack);
  259. }
  260. /// <summary>
  261. /// 库存改判
  262. /// </summary>
  263. /// <param name="reqDto"></param>
  264. /// <returns></returns>
  265. [HttpPost]
  266. public SRes StockChange(PtStockChangeRequest reqDto)
  267. {
  268. return ConcurrencyReqControl<PtStockChangeRequest, SRes>(lockerStockChange, "ProductionFeedBack" + reqDto.BillCode, reqDto.BillCode, reqDto, _ptService.StockChange);
  269. }
  270. /// <summary>
  271. /// 生产退料单接口
  272. /// </summary>
  273. /// <param name="reqDto"></param>
  274. /// <returns></returns>
  275. [HttpPost]
  276. public SRes ProductionBack(ProductionBackRequest reqDto)
  277. {
  278. return ConcurrencyReqControl<ProductionBackRequest, SRes>(lockerProductionBack, "ProductionBack" + reqDto.BillCode, reqDto.BillCode, reqDto, _ptService.ProductionBack);
  279. }
  280. [HttpPost]
  281. public SRes WareCellInit(int row, int col, int deot, int rowcount, int tun)
  282. {
  283. return _ptService.WareCellInit(row, col, deot, rowcount, tun);
  284. }
  285. /// <summary>
  286. /// 实时库存查询接口
  287. /// </summary>
  288. /// <param name="reqDto"></param>
  289. /// <returns></returns>
  290. [HttpPost]
  291. public PTGetCurStockListResponse GetPtCurStockList(PtGetCurStockListRequest reqDto)
  292. {
  293. return _ptService.GetCurStockList(reqDto);
  294. }
  295. #region 盘条PDA功能
  296. /// <summary>
  297. /// 盘条解绑
  298. /// </summary>
  299. /// <param name="request"></param>
  300. /// <returns></returns>
  301. [HttpPost]
  302. public SRes<int> Unbounding(PtUnboundRequest request)
  303. {
  304. return _ptService.Unbounding(request);
  305. }
  306. /// <summary>
  307. /// pda单据查询
  308. /// </summary>
  309. /// <param name="request"></param>
  310. /// <returns></returns>
  311. [HttpPost]
  312. public string GetDocumentsAll(PtDocumentsRequest request)
  313. {
  314. return _ptService.GetPageDocumentsList(request).ToCamelCaseString();
  315. }
  316. /// <summary>
  317. /// pda单据明细查询(传单号)
  318. /// </summary>
  319. /// <param name="request"></param>
  320. /// <returns></returns>
  321. [HttpPost]
  322. public string GetDocumentDetails(PtDocumentsRequest request)
  323. {
  324. return _ptService.GetDocumentDetailListByDocsNo(request).ToCamelCaseString();
  325. }
  326. /// <summary>
  327. /// pda指定出库确定
  328. /// </summary>
  329. /// <param name="request"></param>
  330. /// <returns></returns>
  331. [HttpPost]
  332. public string PdaManualTask(PtManualTaskRequest request)
  333. {
  334. request.BusType = TaskBusType.TaskBusType_HJ_PdaManualOut.GetDescription();
  335. return _ptService.ManualTask(request);
  336. }
  337. /// <summary>
  338. /// pda质检领料出库确定
  339. /// </summary>
  340. /// <param name="request"></param>
  341. /// <returns></returns>
  342. [HttpPost]
  343. public string PdaQualityTask(PtManualTaskRequest request)
  344. {
  345. request.BusType = TaskBusType.TaskBusType_HJ_QualityOut.GetDescription();
  346. return _ptService.ManualTask(request);
  347. }
  348. /// <summary>
  349. /// pda重挂出库确定
  350. /// </summary>
  351. /// <param name="request"></param>
  352. /// <returns></returns>
  353. [HttpPost]
  354. public string PdaInactionStockTask(PtManualTaskRequest request)
  355. {
  356. request.BusType = TaskBusType.TaskBusType_HJ_AnewOut.GetDescription();
  357. return _ptService.ManualTask(request);
  358. }
  359. /// <summary>
  360. /// 获取设备报警信息
  361. /// </summary>
  362. /// <param name="request"></param>
  363. /// <returns></returns>
  364. [HttpPost]
  365. public string GetEquipErrorInfo(PtErrorInfoRequest request)
  366. {
  367. return "";
  368. }
  369. /// <summary>
  370. /// 获取物料报警信息
  371. /// </summary>
  372. /// <param name="request"></param>
  373. /// <returns></returns>
  374. [HttpPost]
  375. public string GetMaterErrorInfo(PtErrorInfoRequest request)
  376. {
  377. return "";
  378. }
  379. /// <summary>
  380. /// 获取业务报警信息
  381. /// </summary>
  382. /// <param name="request"></param>
  383. /// <returns></returns>
  384. [HttpPost]
  385. public string GetBusinessErrorInfo(PtErrorInfoRequest request)
  386. {
  387. return "";
  388. }
  389. /// <summary>
  390. /// 组盘
  391. /// </summary>
  392. /// <param name="request"></param>
  393. /// <returns></returns>
  394. [HttpPost]
  395. public string PdaGroupStock(PtGroupInTaskRequest request)
  396. {
  397. return _ptService.PdaGroupStock(request);
  398. }
  399. /// <summary>
  400. /// 生成入库任务
  401. /// </summary>
  402. /// <param name="request"></param>
  403. /// <returns></returns>
  404. [HttpPost]
  405. public string PdaInsterInTask(PtGroupInTaskRequest request)
  406. {
  407. return _ptService.PdaInsterInTask(request);
  408. }
  409. #endregion
  410. /// <summary>
  411. /// PDA 采购入库
  412. /// </summary>
  413. /// <param name="request"></param>
  414. /// <returns></returns>
  415. [HttpPost]
  416. public SRes PdaPurchaseTask(PtUnboundRequest request)
  417. {
  418. lock (lockerPtPurchTaskIn)
  419. {
  420. return _ptService.PtPurchaseTask(request);
  421. }
  422. }
  423. #region WCS调用
  424. /// <summary>
  425. /// 获取巷道
  426. /// </summary>
  427. /// <param name="reqEntity"></param>
  428. /// <returns></returns>
  429. [HttpPost]
  430. public SRes<string> GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity)
  431. {
  432. lock (lockerGetPtTunnelList)
  433. {
  434. return _ptService.GetPtTunnelPriorityList(reqEntity);
  435. }
  436. }
  437. /// <summary>
  438. /// 分配货位
  439. /// </summary>
  440. /// <param name="reqEntity"></param>
  441. /// <returns></returns>
  442. [HttpPost]
  443. public SRes<PtApplyStockInLocResponse> ApplyStockInLoc(PtApplyStockInLocRequest reqEntity)
  444. {
  445. return ConcurrencyReqControl<PtApplyStockInLocRequest, SRes<PtApplyStockInLocResponse>>(lockerPtApplyStockInLoc, "PtApplyStockInLoc" + reqEntity.TunnelNum, "分配货位" + reqEntity.PickUpEquipmentNo, reqEntity, _ptService.PtApplyStockInLoc);
  446. }
  447. /// <summary>
  448. /// 完成任务
  449. /// </summary>
  450. /// <param name="reqEntity"></param>
  451. /// <returns></returns>
  452. [HttpPost]
  453. public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
  454. {
  455. lock (lockerPtCompleteTask)
  456. {
  457. return _ptService.PtCompleteTask(reqDto);
  458. }
  459. }
  460. /// <summary>
  461. /// 堆垛机出库放货完成
  462. /// </summary>
  463. /// <param name="reqEntity"></param>
  464. /// <returns></returns>
  465. [HttpPost]
  466. public SRes<int> SrmPickOutCompleted(PtSrmPickOutCompletedRequest reqDto)
  467. {
  468. lock (lockerPtSrmPickOutCompleted)
  469. {
  470. return _ptService.PtSrmPickOutCompleted(reqDto);
  471. }
  472. }
  473. #endregion
  474. }
  475. }