CpController.cs 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590
  1. using AutoMapper;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Newtonsoft.Json;
  4. using SqlSugar;
  5. using System.Text.RegularExpressions;
  6. using wms.api.Job;
  7. using wms.dto;
  8. using wms.dto.request;
  9. using wms.dto.request.cp;
  10. using wms.dto.request.cp.dto;
  11. using wms.dto.request.hj;
  12. using wms.dto.request.hj.dto;
  13. using wms.dto.request.pt.dto;
  14. using wms.dto.request.share;
  15. using wms.dto.response;
  16. using wms.dto.response.cp;
  17. using wms.service.IService;
  18. using wms.sqlsugar;
  19. using wms.sqlsugar.model.cp;
  20. using wms.util.Ext;
  21. using wms.util.Http;
  22. namespace wms.api.Controllers
  23. {
  24. [Route("api/[controller]/[action]")]
  25. [ApiController]
  26. public class CpController : BaseController
  27. {
  28. private readonly ICPService _cpService;
  29. private readonly ILogger<CpController> _logger;
  30. private readonly IMapper _mapper;
  31. private static object lockerSalesDocTrans = new object();
  32. private static object lockerSalesBackDocTrans = new object();
  33. private static object lockerComPushApiResInfo = new object();
  34. private static object lockerStockChange = new object();
  35. private static object lockerMesReleaseFlag = new object();
  36. private static object lockerStockStateChange = new object();
  37. private static object lockerPdaCpGroupStock = new object(); //pda空托or 物料 or 间隔板组盘
  38. private static object lockerPdaTrayTaskOut = new object(); //pda空托 or 间隔板出库
  39. private static object lockerWCS_InTaskInfo = new object(); //入库任务
  40. private static object lockerGetCpTunnelList = new object(); //巷道锁
  41. private static object lockerCpCompleteTask = new object();
  42. private static object lockerCpApplyStockInLoc = new object();
  43. private static object lockerCpManualTaskOut = new object();
  44. private static object lockerCpSrmPickOutCompleted = new object();
  45. private static object lockerMoveTask = new object();
  46. private static object lockerSalesDocOutTask = new object();
  47. private static object lockerCpSyncMaterInfoList = new object();
  48. private static object lockerCpCancelOrComplet = new object();
  49. private static object lockerCpCarryTask = new object();
  50. private static object lockerUpdatePuchState = new object();
  51. private static object lockerForceCancelTask = new object();
  52. private static object lockerDeleteStockInfo = new object();
  53. private static object lockerUpdateStockState = new object();
  54. private static object lockerUpdateCellState = new object();
  55. private static object lockerDataSwapCell = new object();
  56. private static object lockerDataBasePatch = new object();
  57. private static object lockerDataMoveCell = new object();
  58. private static object lockerErpCancelStock = new object();
  59. private static object lockerPdaStockInBack = new object();
  60. private static object lockerPreLockedStock = new object();
  61. private static object lockerMoveTaskInfo = new object();
  62. private static object lockerTrayPortageTask = new object();
  63. private static object lockerTrayPortageTaskCheck = new object();
  64. private static object lockerPalletAutoInTask = new object();
  65. private static object lockWcsUploadInfo = new object();
  66. private static object lockLabellingMachine = new object();
  67. private static object lockerHandErrTask = new object();
  68. private static object lockerPalletManualMoveTask = new object();
  69. private static object lockerFlowDataMoveJob = new object();
  70. private static object lockerProductBoxDetailUploadJob = new object();
  71. private Repository<cpSysJob> _sysJobrepository => new Repository<cpSysJob>();
  72. public CpController(ICPService cpService, ILogger<CpController> logger, IMapper mapper) : base(cpService)
  73. {
  74. _cpService = cpService;
  75. _logger = logger;
  76. _mapper = mapper;
  77. }
  78. /// <summary>
  79. /// 同步物料基础信息
  80. /// </summary>
  81. /// <param name="reqDto"></param>
  82. /// <returns></returns>
  83. [HttpPost]
  84. public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
  85. {
  86. var result = new SRes();
  87. //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
  88. CPSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  89. if (reqBody.SyncType == 1)
  90. {
  91. reqBody.PageIndex = 1;
  92. while (resbody.ResData.Any())
  93. {
  94. _cpService.SyncMaterInfo(resbody.ResData);
  95. reqBody.PageIndex++;
  96. resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  97. }
  98. }
  99. else if (reqBody.SyncType == 2)
  100. {
  101. //拿到增量
  102. var increconf = _cpService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
  103. if (increconf != null)
  104. {
  105. reqBody.StartTime = DateTime.Parse(increconf.SContent);
  106. //reqBody.Count = int.Parse(increconf.Remark);
  107. resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  108. if (resbody.ResData.Any())
  109. {
  110. if (_cpService.SyncMaterInfo(resbody.ResData))
  111. {
  112. var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
  113. _cpService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<cpSysConfig>()
  114. {
  115. Columns = it => new cpSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
  116. WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
  117. });
  118. }
  119. }
  120. else
  121. {
  122. result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
  123. result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
  124. }
  125. }
  126. else
  127. {
  128. result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
  129. result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
  130. }
  131. }
  132. else
  133. {
  134. if (!string.IsNullOrEmpty(reqBody.MatCode))
  135. {
  136. resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
  137. if (resbody.ResData.Any())
  138. {
  139. if (_cpService.SyncMaterInfo(resbody.ResData))
  140. {
  141. }
  142. }
  143. }
  144. }
  145. return result.ToCamelCaseString();
  146. }
  147. /// <summary>
  148. /// 成品库主数据接收
  149. /// </summary>
  150. /// <param name="request"></param>
  151. /// <returns></returns>
  152. [HttpPost]
  153. public SRes CpSyncMaterInfoList(CpSyncMaterInfoListRequest request)
  154. {
  155. return ConcurrencyReqControl<CpSyncMaterInfoListRequest, SRes>(lockerCpSyncMaterInfoList, "CpSyncMaterInfoList", request.MatCode, request, _cpService.SyncMaterInfoList);
  156. }
  157. /// <summary>
  158. /// 销售单信息传输接口
  159. /// </summary>
  160. /// <param name="reqDto"></param>
  161. /// <returns></returns>
  162. [HttpPost]
  163. public SRes SalesDocTrans(SalesDocTransRequest reqDto)
  164. {
  165. return ConcurrencyReqControl<SalesDocTransRequest, SRes>(lockerSalesDocTrans, "SalesDocTrans", reqDto.BillCode, reqDto, _cpService.SalesDocTrans);
  166. //if (res.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  167. //{
  168. // return ComPushApiResInfo(new ComPushApiResInfoRequest() { ApiId = "SalesDocTrans", ReqId = Guid.NewGuid().ToString(), ResCode = ResponseStatusCodeEnum.Sucess.GetDescription() });
  169. //}
  170. //else
  171. //{
  172. // return ComPushApiResInfo(new ComPushApiResInfoRequest() { ApiId = "SalesDocTrans", ReqId = Guid.NewGuid().ToString(), ResCode = ResponseStatusCodeEnum.Fail.GetDescription() });
  173. //}
  174. }
  175. /// <summary>
  176. /// 销售单下发出库任务
  177. /// </summary>
  178. /// <param name="request"></param>
  179. /// <returns></returns>
  180. [HttpPost]
  181. public SRes SalesDocOutTask(SalesDocOutTaskRequest request)
  182. {
  183. lock (lockerCpCompleteTask)
  184. {
  185. return ConcurrencyReqControl<SalesDocOutTaskRequest, SRes>(lockerSalesDocOutTask, "SalesDocOutTask", request.SalesDoc, request, _cpService.SalesDocOutTask);
  186. }
  187. }
  188. /// <summary>
  189. ///单据预锁库存(手动按钮触发)
  190. /// </summary>
  191. /// <param name="request"></param>
  192. /// <returns></returns>
  193. [HttpPost]
  194. public SRes PreLockedStock(PreLockedStockRequest request)
  195. {
  196. return ConcurrencyReqControl<PreLockedStockRequest, SRes>(lockerPreLockedStock, "PreLockedStock", request.BillCode, request, _cpService.PreLockedStock);
  197. }
  198. /// <summary>
  199. /// 销售出库信息反馈接口/呆滞料/异常料出库反馈接口
  200. /// </summary>
  201. /// <param name="request"></param>
  202. /// <returns></returns>
  203. [HttpPost]
  204. public SRes SalesDocTransFeedBack(SalesDocAutoPushRequest request)
  205. {
  206. var res = new SRes();
  207. if (request.Type == "1")
  208. {
  209. var SalesDoclists = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.SalesDoc.ToString()).OrderBy(p => p.AddTime).Take(10);
  210. var ErrorMateriallists = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.ErrorMaterial.ToString()).OrderBy(p => p.AddTime).Take(10);
  211. if (SalesDoclists.Any())
  212. {
  213. var doc = SalesDoclists.First();
  214. var SalesDoclist = SalesDoclists.Where(p => p.DocsNo == doc.DocsNo).ToList();
  215. List<string> boxlist = new List<string>();
  216. foreach (var item in SalesDoclist)
  217. {
  218. boxlist.Add(item.HWBarCode);
  219. }
  220. var salesDocTrans = new SalesDocTransFeedBackRequest()
  221. {
  222. BillCode = doc.DocsNo,
  223. BoxList = boxlist,
  224. Type = CpFackbeekType.SalesDoc.ToString()
  225. };
  226. WmsServiceExportMq(salesDocTrans);
  227. var ids = SalesDoclist.Select(p => p.Id).ToList();
  228. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  229. {
  230. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  231. WhereExpression = it => ids.Contains(it.Id)
  232. });
  233. }
  234. if (ErrorMateriallists.Any())
  235. {
  236. var doc = ErrorMateriallists.First();
  237. var ErrorMateriallist = ErrorMateriallists.Where(p => p.DocsNo == doc.DocsNo).ToList();
  238. List<string> boxlist = new List<string>();
  239. foreach (var item in ErrorMateriallist)
  240. {
  241. boxlist.Add(item.HWBarCode);
  242. }
  243. var errorMaterialTrans = new SalesDocTransFeedBackRequest()
  244. {
  245. BillCode = doc.DocsNo,
  246. BoxList = boxlist,
  247. Type = CpFackbeekType.ErrorMaterial.ToString()
  248. };
  249. WmsServiceExportMq(errorMaterialTrans);
  250. var ids = ErrorMateriallist.Select(p => p.Id).ToList();
  251. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  252. {
  253. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  254. WhereExpression = it => ids.Contains(it.Id)
  255. });
  256. }
  257. }
  258. return res;
  259. }
  260. /// <summary>
  261. /// 退售单信息传输接口
  262. /// </summary>
  263. /// <param name="reqDto"></param>
  264. /// <returns></returns>
  265. [HttpPost]
  266. public SRes SalesBackDocTrans(SalesDocTransRequest reqDto)
  267. {
  268. return ConcurrencyReqControl<SalesDocTransRequest, SRes>(lockerSalesBackDocTrans, "SalesBackDocTrans", reqDto.BillCode, reqDto, _cpService.SalesBackDocTrans);
  269. }
  270. /// <summary>
  271. /// 销售退货入库信息反馈接口
  272. /// </summary>
  273. /// <param name="request"></param>
  274. /// <returns></returns>
  275. [HttpPost]
  276. public SRes SalesBackDocTransFeedBack(string doccode)
  277. {
  278. var list = _cpService.GetBillFeedbackList(p => p.DocsNo == doccode);
  279. var dtolist = _mapper.Map<List<SalesDocTransFeedBackRequest>>(list);
  280. //var dto = new SalesDocTransFeedBackRequest() { ListInfo = dtolist };
  281. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
  282. return resbody;
  283. }
  284. /// <summary>
  285. /// 销售余料回库入库信息反馈接口
  286. /// </summary>
  287. /// <param name="request"></param>
  288. /// <returns></returns>
  289. [HttpPost]
  290. public SRes SalesLeftDocTransFeedBack(string doccode)
  291. {
  292. var list = _cpService.GetBillFeedbackList(p => p.DocsNo == doccode);
  293. var dtolist = _mapper.Map<List<SalesLeftDocTransFeedBackRequest>>(list);
  294. //var dto = new SalesDocTransFeedBackRequest() { ListInfo = dtolist };
  295. SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
  296. return resbody;
  297. }
  298. /// <summary>
  299. /// 接收回馈接口
  300. /// </summary>
  301. /// <param name="reqDto"></param>
  302. /// <returns></returns>
  303. [HttpPost]
  304. public SRes ComPushApiResInfo(ComPushApiResInfoRequest reqDto)
  305. {
  306. lock (lockerComPushApiResInfo)
  307. {
  308. return JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(reqDto));
  309. }
  310. }
  311. /// <summary>
  312. /// 呆滞料/异常料出库接口
  313. /// </summary>
  314. /// <param name="reqDto"></param>
  315. /// <returns></returns>
  316. [HttpPost]
  317. public SRes ErrorMaterialStockOut(ErrorMaterialStockOutRequest reqDto)
  318. {
  319. return ConcurrencyReqControl<ErrorMaterialStockOutRequest, SRes>(lockerComPushApiResInfo, "CpErrorMaterialStockOut", reqDto.BillCode, reqDto, _cpService.ErrorMaterialStockOut);
  320. }
  321. /// <summary>
  322. /// 库存改判
  323. /// </summary>
  324. /// <param name="reqDto"></param>
  325. /// <returns></returns>
  326. [HttpPost]
  327. public SRes StockChange(CpStockChangeRequest reqDto)
  328. {
  329. return ConcurrencyReqControl<CpStockChangeRequest, SRes>(lockerStockChange, "CpStockChange", reqDto.BillCode, reqDto, _cpService.StockChange);
  330. }
  331. /// <summary>
  332. /// MES放行标志
  333. /// </summary>
  334. /// <param name="reqDto"></param>
  335. /// <returns></returns>
  336. [HttpPost]
  337. public SRes MesReleaseFlag(MesReleaseFlagDto reqDto)
  338. {
  339. lock (lockerMesReleaseFlag) { return _cpService.MesReleaseFlag(reqDto); }
  340. }
  341. /// <summary>
  342. /// 改判反馈接口
  343. /// </summary>
  344. /// <param name="request"></param>
  345. /// <returns></returns>
  346. [HttpPost]
  347. public SRes StockChangeFeedBack(SalesDocAutoPushRequest request)
  348. {
  349. var res = new SRes();
  350. if (request.Type == "1")
  351. {
  352. var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.StateTrans.ToString()).OrderBy(p => p.AddTime).Take(5);
  353. if (!list.Any())
  354. {
  355. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  356. res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
  357. return res;
  358. }
  359. var doc = list.First();
  360. list = list.Where(p => p.DocsNo == doc.DocsNo);
  361. var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
  362. var StockChangeFeed = new dto.request.cp.StockChangeFeedBackRequest()
  363. {
  364. ListInfo = dtolist,
  365. BillCode = doc.DocsNo,
  366. ReqId = Guid.NewGuid().ToString()
  367. };
  368. var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(StockChangeFeed));
  369. var ids = list.Select(p => p.Id).ToList();
  370. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  371. {
  372. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  373. {
  374. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  375. WhereExpression = it => ids.Contains(it.Id)
  376. });
  377. }
  378. else
  379. {
  380. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  381. {
  382. Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  383. WhereExpression = it => ids.Contains(it.Id)
  384. });
  385. }
  386. }
  387. else
  388. {
  389. var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.StateTrans.ToString()).OrderBy(p => p.AddTime).Take(5);
  390. if (!list.Any())
  391. {
  392. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  393. res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
  394. return res;
  395. }
  396. var doc = list.First();
  397. list = list.Where(p => p.DocsNo == doc.DocsNo);
  398. var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
  399. var StockChangeFeed = new dto.request.cp.StockChangeFeedBackRequest()
  400. {
  401. ListInfo = dtolist,
  402. BillCode = doc.DocsNo,
  403. ReqId = Guid.NewGuid().ToString()
  404. };
  405. var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(StockChangeFeed));
  406. var ids = list.Select(p => p.Id).ToList();
  407. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  408. {
  409. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  410. {
  411. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "手动推送", EditTime = DateTime.Now },
  412. WhereExpression = it => ids.Contains(it.Id)
  413. });
  414. }
  415. else
  416. {
  417. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  418. {
  419. Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "手动推送", EditTime = DateTime.Now },
  420. WhereExpression = it => ids.Contains(it.Id)
  421. });
  422. }
  423. }
  424. return res;
  425. }
  426. /// <summary>
  427. /// 实时库存查询接口
  428. /// </summary>
  429. /// <param name="reqDto"></param>
  430. /// <returns></returns>
  431. [HttpPost]
  432. public CPGetCurStockListResponse GetCpCurStockList(CpGetCurStockListRequest reqDto)
  433. {
  434. return _cpService.GetCurStockList(reqDto);
  435. }
  436. /// <summary>
  437. /// 移库货位上报MES接口
  438. /// </summary>
  439. /// <param name="request"></param>
  440. /// <returns></returns>
  441. [HttpPost]
  442. public SRes MoveStockLocationFeedBack(SalesDocAutoPushRequest request)
  443. {
  444. var res = new SRes();
  445. if (request.Type == "1")
  446. {
  447. var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.MoveCell.ToString()).OrderBy(p => p.AddTime).Take(2);
  448. if (!list.Any())
  449. {
  450. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  451. res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
  452. return res;
  453. }
  454. var dtolist = _mapper.Map<List<MoveStockLocationFeedBackRequest>>(list);
  455. var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
  456. var ids = list.Select(p => p.Id).ToList();
  457. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  458. {
  459. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  460. {
  461. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  462. WhereExpression = it => ids.Contains(it.Id)
  463. });
  464. }
  465. else
  466. {
  467. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  468. {
  469. Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  470. WhereExpression = it => ids.Contains(it.Id)
  471. });
  472. }
  473. }
  474. else
  475. {
  476. var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.MoveCell.ToString()).OrderBy(p => p.AddTime).Take(2);
  477. if (!list.Any())
  478. {
  479. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  480. res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
  481. return res;
  482. }
  483. var dtolist = _mapper.Map<List<MoveStockLocationFeedBackRequest>>(list);
  484. var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
  485. var ids = list.Select(p => p.Id).ToList();
  486. if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  487. {
  488. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  489. {
  490. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  491. WhereExpression = it => ids.Contains(it.Id)
  492. });
  493. }
  494. else
  495. {
  496. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  497. {
  498. Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  499. WhereExpression = it => ids.Contains(it.Id)
  500. });
  501. }
  502. }
  503. return res;
  504. }
  505. /// <summary>
  506. /// 放行/冻结单传输接口
  507. /// </summary>
  508. /// <param name="reqDto"></param>
  509. /// <returns></returns>
  510. [HttpPost]
  511. public StockStateChangeResponse StockStateChange(StockStateChangeRequest reqDto)
  512. {
  513. return ConcurrencyReqControl<StockStateChangeRequest, StockStateChangeResponse>(lockerStockStateChange, "CpStockStateChange", reqDto.BillCode, reqDto, _cpService.StockStateChange);
  514. }
  515. /// <summary>
  516. /// 同步箱号信息(人工入库使用)
  517. /// </summary>
  518. /// <param name="reqBody"></param>
  519. /// <returns></returns>
  520. [HttpPost]
  521. public SRes BoxBuildStockTrans(BoxBuildStockTransRequest reqBody)
  522. {
  523. var res = new SRes();
  524. BoxBuildStockTransResponse resbody = JsonConvert.DeserializeObject<BoxBuildStockTransResponse>(WmsServiceExportApi(reqBody));
  525. if (resbody.Items.Any() && resbody.Items.First().lst_Children.Any())
  526. {
  527. var code = _mapper.Map<List<cpBoxItems>>(resbody.Items.First().lst_Children);
  528. code.ForEach(p =>
  529. {
  530. p.HuTotalWt = resbody.Items.FirstOrDefault().HuTotalWt;
  531. p.HuNetWt = resbody.Items.FirstOrDefault().HuNetWt;
  532. p.HuTareWt = resbody.Items.FirstOrDefault().HuTareWt;
  533. });
  534. _cpService.InsertBoxItems(code);
  535. }
  536. else
  537. {
  538. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  539. res.ResMsg = reqBody.HuNr + "MES返回明细" + ResponseStatusCodeEnum.Fail.GetDescription();
  540. }
  541. return res;
  542. }
  543. /// <summary>
  544. /// 成品入库反馈接口
  545. /// </summary>
  546. /// <param name="request"></param>
  547. /// <returns></returns>
  548. [HttpPost]
  549. public SRes ProductStockInBack(SalesDocAutoPushRequest request)
  550. {
  551. var res = new SRes();
  552. if (request.Type == "1")
  553. {
  554. var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.ProductStockIn.ToString()).OrderBy(p => p.AddTime).Take(1);
  555. if (!list.Any())
  556. {
  557. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  558. res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
  559. return res;
  560. }
  561. var product = new ProductStockInBackRequest()
  562. {
  563. HuNr = list.First().HWBarCode,
  564. StoreCode = list.First().WarehouseCode,
  565. StoreName = "成品库",
  566. LocatCode = list.First().WareCellCode
  567. };
  568. WmsServiceExportMq(product);
  569. var ids = list.Select(p => p.Id).ToList();
  570. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  571. {
  572. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  573. WhereExpression = it => ids.Contains(it.Id)
  574. });
  575. }
  576. return res;
  577. }
  578. /// <summary>
  579. /// ERP取消出库
  580. /// </summary>
  581. /// <param name="request"></param>
  582. /// <returns></returns>
  583. [HttpPost]
  584. public SRes ErpCancelStock(ErpCancelStockRequest request)
  585. {
  586. lock (lockerErpCancelStock)
  587. {
  588. return _cpService.ErpCancelStock(request);
  589. }
  590. }
  591. #region 手持机操作功能
  592. /// <summary>
  593. /// PDA 组盘绑定(只组盘)
  594. /// </summary>
  595. /// <param name="request"></param>
  596. /// <returns></returns>
  597. [HttpPost]
  598. public SRes PdaCpGroupStock(SouthPdaRequest request)
  599. {
  600. lock (lockerPdaCpGroupStock)
  601. {
  602. request.ContGrpBarCode = Regex.Replace(request.ContGrpBarCode.Trim(), @"[\r\n]", "");
  603. if (!string.IsNullOrEmpty(request.BoxCode))
  604. {
  605. request.BoxCode = Regex.Replace(request.BoxCode.Trim(), @"[\r\n]", "");
  606. var boxCode = _cpService.GetBoxCodedetails(request.BoxCode);
  607. if (!boxCode.Any())
  608. {
  609. var tt = BoxBuildStockTrans(new BoxBuildStockTransRequest() { HuNr = request.BoxCode });
  610. if (tt.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  611. {
  612. return new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = tt.ResMsg };
  613. }
  614. }
  615. else
  616. {
  617. _cpService.DeleteoldBoxcodeinfo(request.BoxCode);
  618. _logger.LogInformation("删除旧数据,获取最新数据" + request.BoxCode + "|" + request.ContGrpBarCode);
  619. var tt = BoxBuildStockTrans(new BoxBuildStockTransRequest() { HuNr = request.BoxCode });
  620. if (tt.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  621. {
  622. return new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = tt.ResMsg };
  623. }
  624. }
  625. }
  626. return _cpService.PdaGroupStock(request);
  627. }
  628. }
  629. /// <summary>
  630. /// 空托盘 or 间隔板出库
  631. /// </summary>
  632. /// <param name="request"></param>
  633. /// <returns></returns>
  634. [HttpPost]
  635. public SRes PdaTrayTaskOut(TrayGroupOutRequest request)
  636. {
  637. lock (lockerPdaTrayTaskOut)
  638. {
  639. return _cpService.PdaTrayTaskOut(request);
  640. }
  641. }
  642. /// <summary>
  643. /// PDA 退料
  644. /// </summary>
  645. /// <param name="request"></param>
  646. /// <returns></returns>
  647. [HttpPost]
  648. public SRes PdaStockInBack(SouthPdaRequest request)
  649. {
  650. lock (lockerPdaStockInBack)
  651. {
  652. return _cpService.PdaStockInBack(request);
  653. }
  654. }
  655. #endregion 手持机操作功能
  656. #region WCS调用
  657. /// <summary>
  658. /// 获取入库任务
  659. /// </summary>
  660. /// <param name="request"></param>
  661. /// <returns></returns>
  662. [HttpPost]
  663. public SRes WCS_InTaskInfo(TrayGroupOutRequest request)
  664. {
  665. return ConcurrencyReqControl<TrayGroupOutRequest, SRes>(lockerWCS_InTaskInfo, "WCS_InTaskInfo" + request.Equip, request.Code, request, _cpService.InsertWCSInTask);
  666. }
  667. /// <summary>
  668. /// WCS信息上传(称重)
  669. /// </summary>
  670. /// <param name="request"></param>
  671. /// <returns></returns>
  672. [HttpPost]
  673. public SRes WcsUploadInfo(WcsUploadInfoRequest request)
  674. {
  675. lock (lockWcsUploadInfo)
  676. {
  677. return _cpService.WcsUploadInfo(request);
  678. }
  679. }
  680. /// <summary>
  681. /// 贴标机信息传输
  682. /// </summary>
  683. /// <param name="request"></param>
  684. /// <returns></returns>
  685. [HttpPost]
  686. public SRes<LabellingMachineResponse> LabellingMachine(LabellingMachineRequest request)
  687. {
  688. lock (lockLabellingMachine)
  689. {
  690. return _cpService.LabellingMachine(request);
  691. }
  692. }
  693. /// <summary>
  694. /// 获取巷道
  695. /// </summary>
  696. /// <param name="reqEntity"></param>
  697. /// <returns></returns>
  698. [HttpPost]
  699. public SRes<string> GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity)
  700. {
  701. lock (lockerGetCpTunnelList)
  702. {
  703. return _cpService.GetCpTunnelPriorityList(reqEntity);
  704. }
  705. }
  706. /// <summary>
  707. /// 分配货位
  708. /// </summary>
  709. /// <param name="request"></param>
  710. /// <returns></returns>
  711. [HttpPost]
  712. public SRes<CpApplyStockInLocResponse> ApplyStockInLoc(CpApplyStockInLocRequest request)
  713. {
  714. return ConcurrencyReqControl<CpApplyStockInLocRequest, SRes<CpApplyStockInLocResponse>>(lockerCpApplyStockInLoc, "CpApplyStockInLoc", "分配货位" + request.TunnelNum, request, _cpService.CpApplyStockInLoc);
  715. }
  716. /// <summary>
  717. /// 完成任务
  718. /// </summary>
  719. /// <param name="reqEntity"></param>
  720. /// <returns></returns>
  721. [HttpPost]
  722. public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
  723. {
  724. lock (lockerCpCompleteTask)
  725. {
  726. var res = _cpService.CpCompleteTask(reqDto);
  727. //进程死锁失败的情况再重复调用一次
  728. if (res.ResCode == ResponseStatusCodeEnum.InnerServerErr.GetHashCode())
  729. {
  730. res = _cpService.CpCompleteTask(reqDto);
  731. }
  732. return res;
  733. }
  734. }
  735. /// <summary>
  736. /// 堆垛机出库放货完成
  737. /// </summary>
  738. /// <param name="request"></param>
  739. /// <returns></returns>
  740. [HttpPost]
  741. public SRes<int> SrmPickOutCompleted(CpSrmPickOutCompletedRequest request)
  742. {
  743. lock (lockerCpCompleteTask)
  744. {
  745. return _cpService.CpSrmPickOutCompleted(request);
  746. }
  747. }
  748. /// <summary>
  749. /// 移库任务申请
  750. /// </summary>
  751. /// <param name="request"></param>
  752. /// <returns></returns>
  753. [HttpPost]
  754. public SRes<WcsMoveTaskResponse> WcsMoveTask(WcsMoveTaskRequest request)
  755. {
  756. lock (lockerCpCompleteTask)
  757. {
  758. return _cpService.WcsMoveTask(request);
  759. }
  760. }
  761. /// <summary>
  762. /// 修改任务状态
  763. /// </summary>
  764. /// <param name="request"></param>
  765. /// <returns></returns>
  766. [HttpPost]
  767. public SRes UpdateTaskState(UpdateTaskStateRequest request)
  768. {
  769. lock (lockerMoveTaskInfo)
  770. {
  771. return _cpService.UpdateTaskState(request);
  772. }
  773. }
  774. /// <summary>
  775. /// 手动移库确定
  776. /// </summary>
  777. /// <param name="request"></param>
  778. /// <returns></returns>
  779. [HttpPost]
  780. public SRes MoveTaskInfo(MoveTaskRequest request)
  781. {
  782. lock (lockerMoveTaskInfo)
  783. {
  784. return _cpService.MoveTaskInfo(request);
  785. }
  786. }
  787. /// <summary>
  788. /// 成品库 取消/完成任务验证(只验证不做业务处理,开放wcs系统调用)
  789. /// </summary>
  790. /// <param name="request"></param>
  791. /// <returns></returns>
  792. [HttpPost]
  793. public SRes CancelTaskVerify(CancelTaskRequest request)
  794. {
  795. lock (lockerCpCancelOrComplet)
  796. {
  797. return _cpService.CpCancelTaskVerify(request);
  798. }
  799. }
  800. /// <summary>
  801. /// 成品库 执行任务(开放wcs调用,前端不调用)
  802. /// </summary>
  803. /// <param name="request"></param>
  804. /// <returns></returns>
  805. [HttpPost]
  806. public SRes CarryTaskInfo(CancelTaskRequest request)
  807. {
  808. lock (lockerCpCarryTask)
  809. {
  810. return _cpService.CpCarryTaskInfo(request);
  811. }
  812. }
  813. #endregion WCS调用
  814. /// <summary>
  815. /// 手动出库确定
  816. /// </summary>
  817. /// <param name="request"></param>
  818. /// <returns></returns>
  819. [HttpPost]
  820. public SRes ManualTask(CpManualTaskRequest request)
  821. {
  822. lock (lockerCpCompleteTask)
  823. {
  824. request.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription();
  825. return _cpService.ManualTask(request);
  826. }
  827. }
  828. /// <summary>
  829. /// 异常箱出库
  830. /// </summary>
  831. /// <param name="request"></param>
  832. /// <returns></returns>
  833. [HttpPost]
  834. public SRes ErrorManualTask(CpManualTaskRequest request)
  835. {
  836. lock (lockerCpCompleteTask)
  837. {
  838. request.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription();
  839. return _cpService.ErrorManualTask(request);
  840. }
  841. }
  842. /// <summary>
  843. /// 手动出库确定(MES调用)
  844. /// </summary>
  845. /// <param name="request"></param>
  846. /// <returns></returns>
  847. [HttpPost]
  848. public SRes MesManualTask(CpMesManualTaskRequest request)
  849. {
  850. lock (lockerCpCompleteTask)
  851. {
  852. return _cpService.MesManualTask(request);
  853. }
  854. }
  855. /// <summary>
  856. /// 成品货位初始化
  857. /// </summary>
  858. /// <param name="row"></param>
  859. /// <param name="col"></param>
  860. /// <param name="deot"></param>
  861. /// <param name="rowcount"></param>
  862. /// <param name="tun"></param>
  863. /// <returns></returns>
  864. [HttpPost]
  865. public SRes CpWareCellInit(int row, int col, int deot, int rowcount, int tun)
  866. {
  867. return _cpService.CpWareCellInit(row, col, deot, rowcount, tun);
  868. }
  869. #region 异常处理
  870. /// <summary>
  871. /// 强制取消任务
  872. /// </summary>
  873. /// <param name="request"></param>
  874. /// <returns></returns>
  875. [HttpPost]
  876. public SRes ForceCancelTask(ErrorTaskRequest request)
  877. {
  878. lock (lockerForceCancelTask)
  879. {
  880. return _cpService.ForceCancelTask(request);
  881. }
  882. }
  883. /// <summary>
  884. /// 删除库存信息
  885. /// </summary>
  886. /// <param name="request"></param>
  887. /// <returns></returns>
  888. [HttpPost]
  889. public SRes DeleteStockInfo(DetailCodeStrRequest request)
  890. {
  891. lock (lockerDeleteStockInfo)
  892. {
  893. return _cpService.DeleteStockInfo(request);
  894. }
  895. }
  896. /// <summary>
  897. /// 修改库存状态
  898. /// </summary>
  899. /// <param name="request"></param>
  900. /// <returns></returns>
  901. [HttpPost]
  902. public SRes UpdateStockState(DetailCodeStr1Requestdto request)
  903. {
  904. lock (lockerUpdateStockState)
  905. {
  906. return _cpService.UpdateStockState(request);
  907. }
  908. }
  909. /// <summary>
  910. /// 修改货位状态
  911. /// </summary>
  912. /// <param name="request"></param>
  913. /// <returns></returns>
  914. [HttpPost]
  915. public SRes UpdateCellState(DetailCodeStr1Requestdto request)
  916. {
  917. lock (lockerUpdateCellState)
  918. {
  919. return _cpService.UpdateCellState(request);
  920. }
  921. }
  922. /// <summary>
  923. /// 货位数据互换
  924. /// </summary>
  925. /// <param name="request"></param>
  926. /// <returns></returns>
  927. [HttpPost]
  928. public SRes DataSwapCell(DataSwapCellStrRequest request)
  929. {
  930. lock (lockerDataSwapCell)
  931. {
  932. return _cpService.DataSwapCell(request);
  933. }
  934. }
  935. /// <summary>
  936. /// 补数据
  937. /// </summary>
  938. /// <param name="request"></param>
  939. /// <returns></returns>
  940. [HttpPost]
  941. public SRes DataBasePatch(DataBasePatchRequest request)
  942. {
  943. lock (lockerDataBasePatch)
  944. {
  945. return _cpService.DataBasePatch(request);
  946. }
  947. }
  948. [HttpPost]
  949. public SRes UpdatePurchState(UpdatePurchStateRequestdto request)
  950. {
  951. lock (lockerUpdatePuchState)
  952. {
  953. return _cpService.UpdatePurchState(request);
  954. }
  955. }
  956. /// <summary>
  957. /// 货位数据转移
  958. /// </summary>
  959. /// <param name="request"></param>
  960. /// <returns></returns>
  961. [HttpPost]
  962. public SRes DataMoveCell(DataSwapCellStrRequest request)
  963. {
  964. lock (lockerDataMoveCell)
  965. {
  966. return _cpService.DataMoveCell(request);
  967. }
  968. }
  969. /// <summary>
  970. /// 修改任务目标地址
  971. /// </summary>
  972. /// <param name="request"></param>
  973. /// <returns></returns>
  974. [HttpPost]
  975. public SRes UpdateTaskAddrTo(UpdateTaskAddrToReq request)
  976. {
  977. lock (lockerUpdatePuchState)
  978. {
  979. return _cpService.UpdateTaskAddrTo(request);
  980. }
  981. }
  982. #endregion 异常处理
  983. #region 定时器
  984. /// <summary>
  985. /// 启用job
  986. /// </summary>
  987. /// <param name="req"></param>
  988. /// <returns></returns>
  989. [HttpPost]
  990. public string StartJob(AutoDetailRequest req)
  991. {
  992. var res = new SRes();
  993. var sysjob = _cpService.GetJobEntityByid(req.Id);
  994. if (sysjob == null)
  995. {
  996. res.ResCode = 0;
  997. res.ResMsg = "没有找到对应的定时任务";
  998. return res.ToCamelCaseString();
  999. }
  1000. JobScheduler.Start(sysjob.Code, Type.GetType("wms.api.Job.PostJob"), sysjob.CronExpression);
  1001. return res.ToCamelCaseString();
  1002. }
  1003. /// <summary>
  1004. /// 执行job
  1005. /// </summary>
  1006. /// <param name="reqEntity"></param>
  1007. /// <returns></returns>
  1008. [HttpPost]
  1009. public string ExecuteJob(DetailCodeStrRequest reqEntity)
  1010. {
  1011. var res = new SRes();
  1012. if (string.IsNullOrEmpty(reqEntity.Code))
  1013. {
  1014. res.ResCode = 0;
  1015. res.ResMsg = "参数错误";
  1016. return res.ToCamelCaseString();
  1017. }
  1018. var jobEntity = _cpService.GetJobEntityByCode(reqEntity.Code);
  1019. if (jobEntity == null)
  1020. {
  1021. res.ResCode = 0;
  1022. res.ResMsg = "没有找到该编码";
  1023. return res.ToCamelCaseString();
  1024. }
  1025. var jobapilist = _cpService.GetJobapilist(jobEntity.Id);
  1026. if (jobapilist.Any())
  1027. {
  1028. foreach (var item in jobapilist)
  1029. {
  1030. Task.Run(() => { HttpUtil.PostRequest(item.ApiUrl, item.RequestBody); });
  1031. }
  1032. }
  1033. return res.ToCamelCaseString();
  1034. }
  1035. /// <summary>
  1036. /// 分页Job列表
  1037. /// </summary>
  1038. /// <param name="reqEntity"></param>
  1039. /// <returns></returns>
  1040. [HttpPost]
  1041. public List<dto.response.hj.SysJobDto> GetSysJobList(wms.dto.request.hj.GetSysJobListRequest reqEntity)
  1042. {
  1043. var list = _sysJobrepository.GetList();
  1044. var listdto = _mapper.Map<List<dto.response.hj.SysJobDto>>(list);
  1045. if (listdto != null && listdto.Any())
  1046. {
  1047. for (int i = 0; i < list.Count; i++)
  1048. {
  1049. listdto[i].JobExecuteStatus = GetExecuteStatus(new DetailCodeRequest() { Code = listdto[i].Code });
  1050. }
  1051. return listdto;
  1052. }
  1053. return new List<dto.response.hj.SysJobDto>();
  1054. }
  1055. /// <summary>
  1056. /// 获取执行状态
  1057. /// </summary>
  1058. /// <param name="reqEntity"></param>
  1059. /// <returns></returns>
  1060. [HttpPost]
  1061. public string GetExecuteStatus(DetailCodeRequest reqEntity)
  1062. {
  1063. var jobInfo = _sysJobrepository.GetFirst(p => p.Code == reqEntity.Code);
  1064. var jobs = JobScheduler.GetJobList(Const.JobGroupName).Result;
  1065. if (jobs != null)
  1066. {
  1067. var temp = jobs.Where(p => p.JobName == jobInfo.Code);
  1068. if (temp.Any())
  1069. {
  1070. return temp.First().JobStatus;
  1071. }
  1072. else
  1073. {
  1074. return "Stop";
  1075. }
  1076. }
  1077. else
  1078. {
  1079. return "Stop";
  1080. }
  1081. }
  1082. #endregion 定时器
  1083. #region 时效调用接口
  1084. /// <summary>
  1085. /// 托盘搬运任务
  1086. /// </summary>
  1087. /// <param name="request"></param>
  1088. /// <returns></returns>
  1089. [HttpPost]
  1090. public SRes TrayPortageTask(TrayGroupOutRequest request)
  1091. {
  1092. lock (lockerPalletAutoInTask)
  1093. {
  1094. return _cpService.TrayPortageTask(request);
  1095. }
  1096. //return ConcurrencyReqControl<TrayGroupOutRequest, SRes>(lockerTrayPortageTask, "TrayPortageTask", request.Equip, request, _cpService.TrayPortageTask);
  1097. }
  1098. /// <summary>
  1099. /// 托盘搬运验证
  1100. /// </summary>
  1101. /// <param name="request"></param>
  1102. /// <returns></returns>
  1103. [HttpPost]
  1104. public SRes TrayPortageTaskCheck(TrayGroupOutRequest request)
  1105. {
  1106. lock (lockerTrayPortageTaskCheck)
  1107. {
  1108. return _cpService.TrayPortageTaskCheck(request);
  1109. }
  1110. //return ConcurrencyReqControl<TrayGroupOutRequest, SRes>(lockerTrayPortageTaskCheck, "TrayPortageTaskCheck", request.Equip, request, _cpService.TrayPortageTaskCheck);
  1111. }
  1112. /// <summary>
  1113. /// 成品自动入库(码垛完成入库)
  1114. /// </summary>
  1115. /// <param name="request"></param>
  1116. /// <returns></returns>
  1117. [HttpPost]
  1118. public SRes PalletAutoInTask(PalletAutoTaskRequest request)
  1119. {
  1120. lock (lockerPalletAutoInTask)
  1121. {
  1122. return _cpService.PalletAutoInTask(request);
  1123. }
  1124. //return ConcurrencyReqControl<PalletAutoTaskRequest, SRes>(lockerPalletAutoInTask, "PalletAutoInTask", request.Equip, request, _cpService.PalletAutoInTask);
  1125. }
  1126. #endregion 时效调用接口
  1127. /// <summary>
  1128. /// 成品整箱上传接口
  1129. /// </summary>
  1130. /// <param name="request"></param>
  1131. /// <returns></returns>
  1132. [HttpPost]
  1133. public SRes ProductBoxDetailUpload(SalesDocAutoPushRequest request)
  1134. {
  1135. lock (lockerProductBoxDetailUploadJob)
  1136. {
  1137. var res = new SRes();
  1138. if (request.Type == "1")
  1139. {
  1140. var list = _cpService.GetBoxItemsList(p => p.UpLoadFlag == 0 || p.UpLoadFlag == 2).Where(p => p.IsNeedUpLoadFlag == 1);
  1141. if (!list.Any())
  1142. {
  1143. return new SRes() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
  1144. }
  1145. foreach (var itemhunr in list.GroupBy(p => p.HuNr))
  1146. {
  1147. if (itemhunr.Key.Length > 12)//特殊装箱不上传mes
  1148. {
  1149. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1150. {
  1151. Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = "特殊装箱不上传mes" },
  1152. WhereExpression = it => it.HuNr == itemhunr.Key
  1153. });
  1154. continue;
  1155. }
  1156. ProductBoxDetailUploadRequestNew itemreq = new ProductBoxDetailUploadRequestNew()
  1157. {
  1158. LayerList = new List<LayerListItem>()
  1159. {
  1160. }
  1161. };
  1162. int ovcflag = 0;
  1163. foreach (var item in list.Where(p => p.HuNr == itemhunr.Key).GroupBy(p => new { p.Layer }))
  1164. {
  1165. itemreq.HuNr = item.First().HuNr;
  1166. itemreq.SKU = item.First().Sku;
  1167. itemreq.SkuDesc = item.First().Sku;
  1168. itemreq.Batch = item.First().Batch;
  1169. itemreq.Winding = item.First().Winding;
  1170. itemreq.TimeStamp = item.First().TimeStamp;
  1171. itemreq.MachineCode = item.First().EquNo;
  1172. itemreq.OvcValue = list.Where(p => p.HuNr == item.First().HuNr).Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString();
  1173. if (item.First().OvcFlag == 2)
  1174. {
  1175. if (ovcflag == 0)
  1176. {
  1177. var response = HttpUtil.PostRequest("http://10.30.44.3:8011/api/sx/GetTorsRange", JsonConvert.SerializeObject(new DetailCodeRequest() { Code = itemhunr.Key }));
  1178. var trayres = JsonConvert.DeserializeObject<SRes<GetTorsRangeRes>>(response);
  1179. if (decimal.Parse(itemreq.OvcValue) >= trayres.ResData.TorsValue - trayres.ResData.TorsRangeValue && decimal.Parse(itemreq.OvcValue) <= trayres.ResData.TorsValue + trayres.ResData.TorsRangeValue)
  1180. {
  1181. ovcflag = 2;
  1182. }
  1183. else
  1184. {
  1185. ovcflag = 1;
  1186. }
  1187. itemreq.OvcFlag = ovcflag.ToString();
  1188. }
  1189. }
  1190. else
  1191. {
  1192. itemreq.OvcFlag = item.First().OvcFlag.ToString();
  1193. }
  1194. var laydetail = new LayerListItem()
  1195. {
  1196. LayerCode = item.Key.Layer.ToString().PadLeft(2, '0'),
  1197. layerName = "第" + item.Key.Layer + "层",
  1198. OvcFlag = item.First().OvcFlag.ToString(),
  1199. OvcValue = item.Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString(),
  1200. SpoolList = new List<SpoolListItem>()
  1201. };
  1202. laydetail.SpoolList = list.Where(p => p.HuNr == item.First().HuNr && p.Layer == item.Key.Layer).Select(p => new SpoolListItem()
  1203. {
  1204. MatNo = p.CLBarCode,
  1205. SpoolNr = p.HWBarCode
  1206. }).ToList();
  1207. itemreq.LayerList.Add(laydetail);
  1208. }
  1209. _logger.LogInformation("推送箱号记录:" + itemreq.HuNr);
  1210. var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(itemreq));
  1211. if (resbody.ResCode == 200)
  1212. {
  1213. _logger.LogInformation("推送箱号:" + itemreq.HuNr + "反馈:" + JsonConvert.SerializeObject(resbody));
  1214. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1215. {
  1216. Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now },
  1217. WhereExpression = it => it.HuNr == itemhunr.Key
  1218. });
  1219. }
  1220. else
  1221. {
  1222. _logger.LogInformation("推送整箱数据反回" + JsonConvert.SerializeObject(resbody));
  1223. _cpService.UpdateErrorBoxinfo(itemhunr.Key, resbody.ResMsg);
  1224. if (resbody.ResMsg.Length > 400)
  1225. {
  1226. resbody.ResMsg = resbody.ResMsg.Substring(0, 400);
  1227. }
  1228. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1229. {
  1230. Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = resbody.ResMsg },
  1231. WhereExpression = it => it.HuNr == itemhunr.Key
  1232. });
  1233. }
  1234. }
  1235. }
  1236. return res;
  1237. }
  1238. }
  1239. /// <summary>
  1240. /// 异常数据重复上传接口
  1241. /// </summary>
  1242. /// <param name="request"></param>
  1243. /// <returns></returns>
  1244. [HttpPost]
  1245. public SRes ErrorRepeatProductBoxDetailUpload(SalesDocAutoPushRequest request)
  1246. {
  1247. var res = new SRes();
  1248. var list = _cpService.GetBoxItemsHistoryList(p => p.HuNr == request.Type);
  1249. if (!list.Any())
  1250. {
  1251. return new SRes() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
  1252. }
  1253. foreach (var itemhunr in list.GroupBy(p => p.HuNr))
  1254. {
  1255. ProductBoxDetailUploadRequestNew itemreq = new ProductBoxDetailUploadRequestNew()
  1256. {
  1257. LayerList = new List<LayerListItem>()
  1258. {
  1259. }
  1260. };
  1261. int ovcflag = 0;
  1262. foreach (var item in list.Where(p => p.HuNr == itemhunr.Key).GroupBy(p => new { p.Layer }))
  1263. {
  1264. itemreq.HuNr = item.First().HuNr;
  1265. itemreq.SKU = item.First().Sku;
  1266. itemreq.SkuDesc = item.First().Sku;
  1267. itemreq.Batch = item.First().Batch;
  1268. itemreq.Winding = item.First().Winding;
  1269. itemreq.TimeStamp = item.First().TimeStamp;
  1270. itemreq.MachineCode = item.First().EquNo;
  1271. itemreq.OvcValue = list.Where(p => p.HuNr == item.First().HuNr).Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString();
  1272. if (item.First().OvcFlag == 2)
  1273. {
  1274. if (ovcflag == 0)
  1275. {
  1276. var response = HttpUtil.PostRequest("http://10.30.44.3:8011/api/sx/GetTorsRange", JsonConvert.SerializeObject(new DetailCodeRequest() { Code = itemhunr.Key }));
  1277. var trayres = JsonConvert.DeserializeObject<SRes<GetTorsRangeRes>>(response);
  1278. if (decimal.Parse(itemreq.OvcValue) >= trayres.ResData.TorsValue - trayres.ResData.TorsRangeValue && decimal.Parse(itemreq.OvcValue) <= trayres.ResData.TorsValue + trayres.ResData.TorsRangeValue)
  1279. {
  1280. ovcflag = 2;
  1281. }
  1282. else
  1283. {
  1284. ovcflag = 1;
  1285. }
  1286. itemreq.OvcFlag = ovcflag.ToString();
  1287. }
  1288. }
  1289. else
  1290. {
  1291. itemreq.OvcFlag = item.First().OvcFlag.ToString();
  1292. }
  1293. var laydetail = new LayerListItem()
  1294. {
  1295. LayerCode = item.Key.Layer.ToString().PadLeft(2, '0'),
  1296. layerName = "第" + item.Key.Layer + "层",
  1297. OvcFlag = item.First().OvcFlag.ToString(),
  1298. OvcValue = item.Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString(),
  1299. SpoolList = new List<SpoolListItem>()
  1300. };
  1301. laydetail.SpoolList = list.Where(p => p.HuNr == item.First().HuNr && p.Layer == item.Key.Layer).Select(p => new SpoolListItem()
  1302. {
  1303. MatNo = p.CLBarCode,
  1304. SpoolNr = p.HWBarCode
  1305. }).ToList();
  1306. itemreq.LayerList.Add(laydetail);
  1307. }
  1308. _logger.LogInformation("推送箱号记录:" + itemreq.HuNr);
  1309. var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(itemreq));
  1310. if (resbody.ResCode == 200)
  1311. {
  1312. _logger.LogInformation("推送箱号:" + itemreq.HuNr + "反馈:" + resbody.ResMsg);
  1313. }
  1314. else
  1315. {
  1316. _logger.LogInformation("推送箱号:" + itemreq.HuNr + "反馈:" + resbody.ResMsg);
  1317. }
  1318. }
  1319. return res;
  1320. }
  1321. /// <summary>
  1322. /// 成品临时箱整箱上传接口
  1323. /// </summary>
  1324. /// <param name="request"></param>
  1325. /// <returns></returns>
  1326. [HttpPost]
  1327. public SRes TempProductBoxDetailUpload(SalesDocAutoPushRequest request)
  1328. {
  1329. var res = new SRes();
  1330. if (request.Type == "1")
  1331. {
  1332. var list = _cpService.GetBoxItemsList(p => p.UpLoadFlag == 0 || p.UpLoadFlag == 2).Where(p => p.IsNeedUpLoadFlag == 2);
  1333. if (!list.Any())
  1334. {
  1335. return new SRes() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
  1336. }
  1337. foreach (var item in list.GroupBy(p => p.HuNr))
  1338. {
  1339. if (item.Key.StartsWith("Test"))//特殊装箱不上传mes
  1340. {
  1341. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1342. {
  1343. Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = "特殊装箱不上传mes" },
  1344. WhereExpression = it => it.HuNr == item.Key
  1345. });
  1346. continue;
  1347. }
  1348. ProductBoxDetailUploadRequest itemreq = new ProductBoxDetailUploadRequest()
  1349. {
  1350. TempHuNr = item.Key,
  1351. Lst_SpoolNr = item.Select(p => p.HWBarCode).ToList()
  1352. };
  1353. var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(itemreq));
  1354. if (resbody.success == true)
  1355. {
  1356. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1357. {
  1358. Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now },
  1359. WhereExpression = it => it.HuNr == item.Key
  1360. });
  1361. }
  1362. else
  1363. {
  1364. if (item.Key.StartsWith("HAZDA"))
  1365. {
  1366. //如果是临时箱子则标记成异常,不再上传
  1367. _cpService.UpdateBoxFail(item.Key);
  1368. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1369. {
  1370. Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = "临时箱推送MES失败,自动设置成异常箱" },
  1371. WhereExpression = it => it.HuNr == item.Key
  1372. });
  1373. }
  1374. else
  1375. {
  1376. _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
  1377. {
  1378. Columns = it => new cpBoxItems { UpLoadFlag = 2, EditTime = DateTime.Now },
  1379. WhereExpression = it => it.HuNr == item.Key
  1380. });
  1381. }
  1382. }
  1383. }
  1384. }
  1385. return res;
  1386. }
  1387. /// <summary>
  1388. /// 监控遗留的库存数据
  1389. /// </summary>
  1390. /// <param name="request"></param>
  1391. /// <returns></returns>
  1392. [HttpPost]
  1393. public SRes MonitorLeftStock(WebErrorRequest request)
  1394. {
  1395. return _cpService.MonitorLeftStock(request);
  1396. }
  1397. /// <summary>
  1398. /// 手动出库数据反馈(分发)
  1399. /// </summary>
  1400. /// <param name="request"></param>
  1401. /// <returns></returns>
  1402. [HttpPost]
  1403. public SRes ManaelOutBack(SalesDocAutoPushRequest request)
  1404. {
  1405. var res = new SRes();
  1406. if (request.Type == "1")
  1407. {
  1408. var ManaelOut = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.ManualOut.ToString()).OrderBy(p => p.AddTime).FirstOrDefault();
  1409. if (ManaelOut == null)
  1410. {
  1411. res.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
  1412. res.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
  1413. return res;
  1414. }
  1415. var ManaelOutTrans = new ManaelOutBackRequest()
  1416. {
  1417. HuNr = ManaelOut.HWBarCode,
  1418. Type = CpFackbeekType.ManualOut.ToString(),
  1419. OutTime = ManaelOut.AddTime.ToString("yyyyMMddHHmmss")
  1420. };
  1421. WmsServiceExportPubMq(ManaelOutTrans);
  1422. _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
  1423. {
  1424. Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
  1425. WhereExpression = it => ManaelOut.Id == it.Id
  1426. });
  1427. }
  1428. return res;
  1429. }
  1430. /// <summary>
  1431. /// 验证箱号和托盘是否匹配
  1432. /// </summary>
  1433. /// <param name="request"></param>
  1434. /// <returns></returns>
  1435. [HttpPost]
  1436. public SRes VerifyBoxNum(VerifyBoxNumRequest request)
  1437. {
  1438. return _cpService.VerifyBoxNum(request);
  1439. }
  1440. /// <summary>
  1441. /// 成品库盘点报表生成
  1442. /// </summary>
  1443. /// <param name="request"></param>
  1444. /// <returns></returns>
  1445. [HttpPost]
  1446. public SRes GenInventoryReport(DetailCodeRequest request)
  1447. {
  1448. //0 30 8 ? * * 每天上午8:30触发
  1449. var res = new SRes();
  1450. DateTime lastDay = Convert.ToDateTime(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1);
  1451. if (lastDay.Day != DateTime.Now.Day)
  1452. {
  1453. res.ResMsg = "当前不是本月最后一天";
  1454. return res;
  1455. }
  1456. _cpService.GenInventoryReport();
  1457. return res;
  1458. }
  1459. /// <summary>
  1460. /// 成品人工口上成品码垛托盘PDA提交接口(MES调用)
  1461. /// </summary>
  1462. /// <param name="request"></param>
  1463. /// <returns></returns>
  1464. [HttpPost]
  1465. public SRes PalletManualMoveTask(PalletManualMoveTaskRequest request)
  1466. {
  1467. lock (lockerPalletManualMoveTask)
  1468. {
  1469. return _cpService.PalletManualMoveTask(request);
  1470. }
  1471. }
  1472. /// <summary>
  1473. /// 流水数据归档
  1474. /// </summary>
  1475. /// <param name="request"></param>
  1476. /// <returns></returns>
  1477. [HttpPost]
  1478. public SRes FlowDataMoveJob(SalesDocAutoPushRequest request)
  1479. {
  1480. lock (lockerFlowDataMoveJob)
  1481. {
  1482. return _cpService.FlowDataMoveJob(request);
  1483. }
  1484. }
  1485. /// <summary>
  1486. /// 触发自动校秤任务
  1487. /// </summary>
  1488. /// <returns></returns>
  1489. [HttpPost]
  1490. public SRes TriggerAutoCalibration()
  1491. {
  1492. return _cpService.TriggerAutoCalibration();
  1493. }
  1494. }
  1495. }