FjController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. using AutoMapper;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Newtonsoft.Json;
  5. using wms.dto;
  6. using wms.dto.request;
  7. using wms.dto.request.fj;
  8. using wms.dto.request.share;
  9. using wms.dto.response;
  10. using wms.dto.response.fj;
  11. using wms.service.IService;
  12. using wms.sqlsugar.model.fj;
  13. using wms.util.Ext;
  14. namespace wms.api.Controllers
  15. {
  16. /// <summary>
  17. /// 分拣库控制器
  18. /// </summary>
  19. [Route("api/[controller]/[action]")]
  20. [ApiController]
  21. public class FjController : BaseController
  22. {
  23. private readonly IFJService _fjService;
  24. private readonly ILogger<FjController> _logger;
  25. private readonly IMapper _mapper;
  26. static object lockerCurtainProductionOrder = new object();
  27. static object lockerCurtainOrderStartCheck = new object();
  28. static object lockerSpoolMaterialInfoTrans = new object();
  29. static object lockerCurtainProductionStockOut = new object();
  30. static object lockerProductionBack = new object();
  31. static object lockerErrorMaterialStockOut = new object();
  32. static object lockerBGradeMaterialStockOut = new object();
  33. static object lockerlockerStockChange = new object();
  34. static object lockerManualBuildStockTrans = new object();
  35. static object lockerBomInfoTrans = new object();
  36. static object lockerWetFormulaInfo = new object();
  37. public FjController(IFJService fjService, ILogger<FjController> logger, IMapper mapper) : base(fjService)
  38. {
  39. _fjService = fjService;
  40. _logger = logger;
  41. _mapper = mapper;
  42. }
  43. #region 暂时不用
  44. /// <summary>
  45. /// 同步物料基础信息
  46. /// </summary>
  47. /// <param name="reqDto"></param>
  48. /// <returns></returns>
  49. //[HttpPost]
  50. //public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
  51. //{
  52. // var result = new SRes();
  53. // //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
  54. // FJSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  55. // if (reqBody.SyncType == 1)
  56. // {
  57. // reqBody.PageIndex = 1;
  58. // while (resbody.ResData !=null && resbody.ResData.Any())
  59. // {
  60. // _fjService.SyncMaterInfo(resbody.ResData);
  61. // reqBody.PageIndex++;
  62. // resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  63. // }
  64. // }
  65. // else if (reqBody.SyncType == 2)
  66. // {
  67. // //拿到增量
  68. // var increconf = _fjService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
  69. // if (increconf != null)
  70. // {
  71. // reqBody.StartTime = DateTime.Parse(increconf.SContent);
  72. // //reqBody.Count = int.Parse(increconf.Remark);
  73. // resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  74. // if (resbody.ResData.Any())
  75. // {
  76. // if (_fjService.SyncMaterInfo(resbody.ResData))
  77. // {
  78. // var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
  79. // _fjService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<fjSysConfig>()
  80. // {
  81. // Columns = it => new fjSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
  82. // WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
  83. // });
  84. // }
  85. // }
  86. // else
  87. // {
  88. // result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
  89. // result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
  90. // }
  91. // }
  92. // else
  93. // {
  94. // result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
  95. // result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
  96. // }
  97. // }
  98. // else
  99. // {
  100. // if (!string.IsNullOrEmpty(reqBody.MatCode))
  101. // {
  102. // resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  103. // if (resbody.ResData.Any())
  104. // {
  105. // if (_fjService.SyncMaterInfo(resbody.ResData))
  106. // {
  107. // }
  108. // }
  109. // }
  110. // }
  111. // return result.ToCamelCaseString();
  112. //}
  113. /// <summary>
  114. /// BOM信息传输接口
  115. /// </summary>
  116. /// <param name="reqDto"></param>
  117. /// <returns></returns>
  118. //[HttpPost]
  119. //public SRes BomInfoTrans(BomInfoTransRequest reqDto)
  120. //{
  121. // return ConcurrencyReqControl<BomInfoTransRequest, SRes>(lockerBomInfoTrans, "BomInfoTrans" + reqDto.BomCode, reqDto.BomCode, reqDto, _fjService.BomInfoTrans);
  122. //}
  123. #endregion
  124. /// <summary>
  125. /// 物料主数据推送接口
  126. /// </summary>
  127. /// <param name="reqBody"></param>
  128. /// <returns></returns>
  129. [HttpPost]
  130. public SRes SyncMaterInfoList(FJSyncMaterInfoListRequest reqBody)
  131. {
  132. var res = new SRes();
  133. if (reqBody.ListInfo == null || !reqBody.ListInfo.Any())
  134. {
  135. res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
  136. res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
  137. return res;
  138. }
  139. _fjService.SyncMaterInfo(_mapper.Map<List<FJSyncMaterInfoResponseItem>>(reqBody.ListInfo));
  140. return res;
  141. }
  142. /// <summary>
  143. /// 机台信息同步接口
  144. /// </summary>
  145. /// <param name=""></param>
  146. /// <returns></returns>
  147. [HttpPost(Name = "SyncMachineInfo")]
  148. public SyncMachineInfoResponse SyncMachineInfo(SyncMachineInfoRequest reqDto)
  149. {
  150. SyncMachineInfoResponse resbody = JsonConvert.DeserializeObject<SyncMachineInfoResponse>(WmsServiceExportApi(reqDto));
  151. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode() && resbody.ResData != null && resbody.ResData.Any())
  152. {
  153. _fjService.SyncMachineInfo(resbody.ResData);
  154. }
  155. return resbody;
  156. }
  157. /// <summary>
  158. /// 湿拉配方信息同步接口
  159. /// </summary>
  160. /// <param name=""></param>
  161. /// <returns></returns>
  162. [HttpPost(Name = "WetFormulaInfo")]
  163. public SRes WetFormulaInfo(WetFormulaInfoRequest reqDto)
  164. {
  165. return ConcurrencyReqControl<WetFormulaInfoRequest, SRes>(lockerWetFormulaInfo, "WetFormulaInfo", reqDto.FeedCode, reqDto, _fjService.WetFormulaInfo);
  166. }
  167. /// <summary>
  168. /// 帘线生产工单信息传输接口
  169. /// </summary>
  170. /// <param name="reqDto"></param>
  171. /// <returns></returns>
  172. [HttpPost]
  173. public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
  174. {
  175. return ConcurrencyReqControl<CurtainProductionOrderRequest, SRes>(lockerCurtainProductionOrder, "CurtainProductionOrder", reqDto.BillCode, reqDto, _fjService.CurtainProductionOrder);
  176. }
  177. /// <summary>
  178. /// 湿拉工单启动验证
  179. /// </summary>
  180. /// <param name="reqDto"></param>
  181. /// <returns></returns>
  182. [HttpPost]
  183. public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto)
  184. {
  185. return ConcurrencyReqControl<CurtainOrderStartCheckRequest, SRes>(lockerCurtainOrderStartCheck, "CurtainOrderStartCheck", reqDto.BillCode, reqDto, _fjService.CurtainOrderStartCheck);
  186. }
  187. /// <summary>
  188. /// 湿拉工字轮/芯股信息传输接口
  189. /// </summary>
  190. /// <param name="reqDto"></param>
  191. /// <returns></returns>
  192. [HttpPost]
  193. public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto)
  194. {
  195. return ConcurrencyReqControl<SpoolMaterialInfoTransRequest, SRes>(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans", reqDto.SpoolCode, reqDto, _fjService.SpoolMaterialInfoTrans);
  196. }
  197. private SRes ComPushData(SRes resbody, List<long> ids)
  198. {
  199. var res = new SRes();
  200. try
  201. {
  202. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  203. {
  204. //更新推送表数据
  205. _fjService.UpdateBillPushinfoModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
  206. {
  207. Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1 },
  208. WhereExpression = it => ids.Contains(it.Id)
  209. });
  210. //删除单据表数据
  211. //_fjService.DeleteDoc(p => doccodelist.Contains(p.DocNo));
  212. }
  213. else
  214. {
  215. //更新推送表数据
  216. _fjService.UpdateBillPushinfoModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
  217. {
  218. Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
  219. WhereExpression = it => ids.Contains(it.Id)
  220. });
  221. }
  222. }
  223. catch (Exception ex)
  224. {
  225. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  226. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  227. _logger.LogInformation("反馈数据推送" + ex.ToString());
  228. }
  229. return res;
  230. }
  231. /// <summary>
  232. /// 湿拉工字轮入库反馈接口
  233. /// </summary>
  234. /// <param name="billcode"></param>
  235. /// <returns></returns>
  236. [HttpPost(Name = "WetProductStockInFeedBack")]
  237. public SRes WetProductStockInFeedBack()
  238. {
  239. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockIn.ToString());
  240. var dtolist = _mapper.Map<List<WetProductStockInFeedBackRequestItem>>(list);
  241. var dto = new WetProductStockInFeedBackRequest() { ListInfo = dtolist};
  242. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  243. return ComPushData(resbody, list.Select(p => p.Id).ToList());
  244. }
  245. /// <summary>
  246. /// 帘线叫料接口
  247. /// </summary>
  248. /// <param name="reqDto"></param>
  249. /// <returns></returns>
  250. [HttpPost(Name = "CurtainProductionStockOut")]
  251. public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto)
  252. {
  253. return ConcurrencyReqControl<CurtainProductionStockOutRequest, SRes>(lockerCurtainProductionStockOut, "CurtainProductionStockOut", reqDto.BillCode, reqDto, _fjService.CurtainProductionStockOut);
  254. }
  255. /// <summary>
  256. /// 叫料信息反馈接口
  257. /// </summary>
  258. /// <param name="billcode"></param>
  259. /// <returns></returns>
  260. [HttpPost(Name = "CurtainProductionStockOutFeedBack")]
  261. public SRes CurtainProductionStockOutFeedBack()
  262. {
  263. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockOut.ToString());
  264. var dtolist = _mapper.Map<List<CurtainProductionStockOutFeedBackRequestItem>>(list);
  265. var dto = new CurtainProductionStockOutFeedBackRequest() { ListInfo = dtolist };
  266. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  267. return ComPushData(resbody, list.Select(p => p.Id).ToList());
  268. }
  269. /// <summary>
  270. /// 生产退料/余料接口
  271. /// </summary>
  272. /// <param name="reqDto"></param>
  273. /// <returns></returns>
  274. [HttpPost]
  275. public SRes ProductionBack(FjProductionBackRequest reqDto)
  276. {
  277. return ConcurrencyReqControl<FjProductionBackRequest, SRes>(lockerProductionBack, "ProductionBack", reqDto.BillCode, reqDto, _fjService.ProductionBack);
  278. }
  279. /// <summary>
  280. /// 余料反馈接口
  281. /// </summary>
  282. /// <param name="billcode"></param>
  283. /// <returns></returns>
  284. [HttpPost]
  285. public SRes ProductionLeftFeedBack()
  286. {
  287. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_LeftStockIn.ToString());
  288. var dtolist = _mapper.Map<List<ProductionLeftFeedBackRequestItem>>(list);
  289. var dto = new ProductionLeftFeedBackRequest() { ListInfo = dtolist };
  290. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  291. return ComPushData(resbody, list.Select(p => p.Id).ToList());
  292. }
  293. /// <summary>
  294. /// 异常料出库单传输接口
  295. /// </summary>
  296. /// <param name="reqDto"></param>
  297. /// <returns></returns>
  298. [HttpPost]
  299. public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto)
  300. {
  301. return ConcurrencyReqControl<FjErrorMaterialStockOutRequest, SRes>(lockerErrorMaterialStockOut, "ErrorMaterialStockOut", reqDto.BillCode, reqDto, _fjService.ErrorMaterialStockOut);
  302. }
  303. /// <summary>
  304. /// 异常料出库反馈接口
  305. /// </summary>
  306. /// <param name="billcode"></param>
  307. /// <returns></returns>
  308. [HttpPost]
  309. public SRes ErrorMaterialStockOutFeedBack()
  310. {
  311. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_ErrStockOut.ToString());
  312. var dtolist = _mapper.Map<List<ErrorMaterialStockOutFeedBackRequestItem>>(list);
  313. var dto = new ErrorMaterialStockOutFeedBackRequest() { ListInfo = dtolist };
  314. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  315. return ComPushData(resbody, list.Select(p => p.Id).ToList());
  316. }
  317. /// <summary>
  318. /// B站叫料单传输接口
  319. /// </summary>
  320. /// <param name="reqDto"></param>
  321. /// <returns></returns>
  322. [HttpPost]
  323. public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto)
  324. {
  325. return ConcurrencyReqControl<BGradeMaterialStockOutRequest, SRes>(lockerBGradeMaterialStockOut, "BGradeMaterialStockOut", reqDto.BillCode, reqDto, _fjService.BGradeMaterialStockOut);
  326. }
  327. /// <summary>
  328. /// B站出库反馈接口
  329. /// </summary>
  330. /// <param name="billcode"></param>
  331. /// <returns></returns>
  332. [HttpPost]
  333. public SRes BGradeMaterialStockOutFeedBack()
  334. {
  335. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_BGradeStockOut.ToString());
  336. var dtolist = _mapper.Map<List<BGradeMaterialStockOutFeedBackRequestItem>>(list);
  337. var dto = new BGradeMaterialStockOutFeedBackRequest() { ListInfo = dtolist };
  338. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  339. return ComPushData(resbody, list.Select(p => p.Id).ToList());
  340. }
  341. /// <summary>
  342. /// 库存改判
  343. /// </summary>
  344. /// <param name="reqDto"></param>
  345. /// <returns></returns>
  346. [HttpPost]
  347. public SRes StockChange(FjStockChangeRequest reqDto)
  348. {
  349. return ConcurrencyReqControl<FjStockChangeRequest, SRes>(lockerlockerStockChange, "FJStockChange", reqDto.BillCode, reqDto, _fjService.StockChange);
  350. }
  351. /// <summary>
  352. /// 改判反馈接口
  353. /// </summary>
  354. /// <param name="request"></param>
  355. /// <returns></returns>
  356. [HttpPost]
  357. public SRes StockChangeFeedBack()
  358. {
  359. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockChanage.ToString());
  360. var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
  361. var dto = new StockChangeFeedBackRequest() { ListInfo = dtolist };
  362. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  363. return ComPushData(resbody, list.Select(p => p.Id).ToList());
  364. }
  365. /// <summary>
  366. /// 实时库存查询接口
  367. /// </summary>
  368. /// <param name="reqDto"></param>
  369. /// <returns></returns>
  370. [HttpPost(Name = "GetFJCurStockList")]
  371. public GetFJCurStockListResponse GetFJCurStockList(GetFJCurStockListRequest reqDto)
  372. {
  373. return _fjService.GetCurStockList(reqDto);
  374. }
  375. /// <summary>
  376. /// 回库反馈接口(出库途中改判的,入库之后再次上传入库信息)
  377. /// </summary>
  378. /// <param name="request"></param>
  379. /// <returns></returns>
  380. [HttpPost]
  381. public SRes StockChangeStockInFeedBack()
  382. {
  383. var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_ChanageBack.ToString());
  384. var dtolist = _mapper.Map<List<StockChangeStockInFeedBackRequestItem>>(list);
  385. var dto = new StockChangeStockInFeedBackRequest() { ListInfo = dtolist };
  386. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
  387. return resbody;
  388. }
  389. /// <summary>
  390. /// 人工组盘传输接口
  391. /// </summary>
  392. /// <param name="reqDto"></param>
  393. /// <returns></returns>
  394. [HttpPost]
  395. public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto)
  396. {
  397. return ConcurrencyReqControl<ManualBuildStockTransRequest, SRes>(lockerManualBuildStockTrans, "ManualBuildStockTrans", reqDto.PalletCode, reqDto, _fjService.ManualBuildStockTrans);
  398. }
  399. /// <summary>
  400. /// 条码信息查询接口
  401. /// </summary>
  402. /// <param name="req"></param>
  403. /// <returns></returns>
  404. [HttpPost]
  405. public string GetMesBarCodeInfo(string req)
  406. {
  407. return "";
  408. }
  409. }
  410. }