CpController.cs 64 KB

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