CpController.cs 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589
  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. public SRes TriggerAutoCalibration()
  1490. {
  1491. return _cpService.TriggerAutoCalibration();
  1492. }
  1493. }
  1494. }