WcsToWmsApiService.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. package com.ruoyi.ams.xuankuang.service;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.comparator.CompareUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.baomidou.mybatisplus.core.toolkit.IdWorker;
  6. import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
  7. import com.ruoyi.ams.asn.domain.WmsDocAsnHeader;
  8. import com.ruoyi.ams.asn.mapper.WmsDocAsnDetailsMapper;
  9. import com.ruoyi.ams.asn.mapper.WmsDocAsnHeaderMapper;
  10. import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService;
  11. import com.ruoyi.ams.inv.service.IInvLotLocIdService;
  12. import com.ruoyi.ams.task.domain.WcsTask;
  13. import com.ruoyi.ams.task.service.IWcsTaskService;
  14. import com.ruoyi.ams.xuankuang.domain.dto.LocationCoordDTO;
  15. import com.ruoyi.ams.xuankuang.domain.form.*;
  16. import com.ruoyi.ams.xuankuang.facade.IUnpackingMachineFacade;
  17. import com.ruoyi.base.constant.Constant;
  18. import com.ruoyi.base.domain.BaseLocationInfo;
  19. import com.ruoyi.base.domain.vo.BaseLocationLotattDTO;
  20. import com.ruoyi.base.service.IBaseLocationInfoService;
  21. import com.ruoyi.base.service.IBaseSkuService;
  22. import com.ruoyi.base.utils.IdSequenceUtils;
  23. import com.ruoyi.common.core.domain.AjaxResult;
  24. import com.ruoyi.common.exception.base.BaseException;
  25. import com.ruoyi.common.utils.StringUtils;
  26. import com.ruoyi.hard.xuankang.StirringTankClient;
  27. import com.ruoyi.hard.xuankang.UnpackingMachineSubClient;
  28. import io.jsonwebtoken.lang.Assert;
  29. import lombok.extern.slf4j.Slf4j;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import java.math.BigDecimal;
  34. import java.util.Date;
  35. import java.util.List;
  36. import static com.ruoyi.ams.xuankuang.service.BaseLocationInfoSubService.OUT_ZONES;
  37. /**
  38. * @author HuKang
  39. * @version 1.0
  40. * @date 2023/3/30 15:42
  41. */
  42. @Slf4j
  43. @Service
  44. public class WcsToWmsApiService {
  45. @Autowired
  46. private IBaseSkuService iBaseSkuService;
  47. @Autowired
  48. private IBaseLocationInfoService iBaseLocationInfoService;
  49. @Autowired
  50. private BaseLocationInfoSubService baseLocationInfoSubService;
  51. @Autowired
  52. private InvLotLocIdSubService InvLotLocIdSubService;
  53. @Autowired
  54. private WcsTaskSubService wcsTaskSubService;
  55. @Autowired
  56. private IWcsTaskService iWcsTaskService;
  57. @Autowired
  58. private WmsDocAsnHeaderMapper wmsDocAsnHeaderMapper;
  59. @Autowired
  60. private WmsDocAsnDetailsMapper wmsDocAsnDetailsMapper;
  61. @Autowired
  62. private IUnpackingMachineFacade unpackingMachineFacade;
  63. @Autowired
  64. private IdSequenceUtils idSequenceUtils;
  65. @Autowired
  66. private StirringTankClient stirringTankClient;
  67. @Autowired
  68. private UnpackingMachineSubClient unpackingMachineSubClient;
  69. @Autowired
  70. private IWcsTaskService wcsTaskService;
  71. @Autowired
  72. private IWmsDocAsnDetailsService wmsDocAsnDetailsService;
  73. @Autowired
  74. private WmsDocAsnSubService wmsDocAsnSubService;
  75. @Autowired
  76. private AgvCallProxyService agvCallProxyService;
  77. @Autowired
  78. private IInvLotLocIdService invLotLocIdService;
  79. /**
  80. * 组盘上报
  81. *
  82. * @param stackingCompletion
  83. * @return
  84. */
  85. @Transactional
  86. public synchronized AjaxResult stackingCompletion(StackingCompletionForm stackingCompletion) {
  87. // 上报类型
  88. int reportType = stackingCompletion.getReportType();
  89. // 托盘号
  90. String palletNo = stackingCompletion.getPalletNo();
  91. // Wcs物料类型
  92. String materialType = stackingCompletion.getMaterialType();
  93. // wms物料编码
  94. String sku = iBaseSkuService.selectBaseSkuByMaterialType(materialType).getSku();
  95. // 数量
  96. Double qty = (double) stackingCompletion.getQty();
  97. // 入库单号
  98. String asnNo = stackingCompletion.getRelatedWmsNo();
  99. // 任务号
  100. String wcsNo = stackingCompletion.getWcsNo();
  101. if (asnNo.equals("")) {
  102. AjaxResult ajaxResult1 = generateAShippingOrder(sku, new BigDecimal(qty));
  103. // 判重
  104. WcsTask wcsTaskQuery = new WcsTask();
  105. //AsnNO
  106. wcsTaskQuery.setExt1(ajaxResult1.getData().toString());
  107. wcsTaskQuery.setExt2(palletNo);
  108. wcsTaskQuery.setExt3(wcsNo);
  109. WcsTask wcsTask = iWcsTaskService.selectWcsTaskByModel(wcsTaskQuery);
  110. if (wcsTask != null) {
  111. String locationTo = wcsTask.getLocationTo();
  112. BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, Constant.WAREHOUSE_ID);
  113. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  114. locationCoordinateVo.setTaskNo(wcsTask.getTaskNo());
  115. locationCoordinateVo.setLocationId(baseLocationInfo.getLocationNo());
  116. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationInfo.getShiftNo()));
  117. locationCoordinateVo.setCol(Integer.valueOf(baseLocationInfo.getRowNo()));
  118. locationCoordinateVo.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
  119. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  120. }
  121. // 推荐目标库位
  122. BaseLocationLotattDTO baseLocationLotattVO = baseLocationInfoSubService.recommendAReceiptLocation(sku);
  123. if (baseLocationLotattVO == null) {
  124. AjaxResult.error("没有可以推荐的目标库位!");
  125. }
  126. //TODO recommendAReceiptLocation,获取库位时,判断同列库存是否是相同入库日期的,不同相同日期不可放
  127. // 生成任务
  128. String taskNo = "";
  129. AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()
  130. , baseLocationLotattVO.getId().toString()
  131. , ajaxResult1.getData().toString()
  132. , palletNo
  133. , wcsNo);
  134. if (!ajaxResult.isSuccess()) {
  135. return ajaxResult;
  136. }
  137. taskNo = ajaxResult.get("data").toString();
  138. // 入库缓存位生成库存
  139. InvLotLocIdSubService.initInv(Constant.LOC_STAGE_CACHE.toString(), sku, palletNo, ajaxResult1.getData().toString(), taskNo, qty);
  140. // 反馈
  141. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  142. locationCoordinateVo.setTaskNo(taskNo);
  143. locationCoordinateVo.setLocationId(baseLocationLotattVO.getLocationNo());
  144. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationLotattVO.getShiftNo()));
  145. locationCoordinateVo.setCol(Integer.valueOf(baseLocationLotattVO.getRowNo()));
  146. locationCoordinateVo.setRow(Integer.valueOf(baseLocationLotattVO.getRowIndex()));
  147. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  148. }
  149. // 判重
  150. WcsTask wcsTaskQuery = new WcsTask();
  151. wcsTaskQuery.setExt1(asnNo);
  152. wcsTaskQuery.setExt2(palletNo);
  153. wcsTaskQuery.setExt3(wcsNo);
  154. WcsTask wcsTask = iWcsTaskService.selectWcsTaskByModel(wcsTaskQuery);
  155. if (wcsTask != null) {
  156. String locationTo = wcsTask.getLocationTo();
  157. BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, Constant.WAREHOUSE_ID);
  158. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  159. locationCoordinateVo.setTaskNo(wcsTask.getTaskNo());
  160. locationCoordinateVo.setLocationId(baseLocationInfo.getLocationNo());
  161. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationInfo.getShiftNo()));
  162. locationCoordinateVo.setCol(Integer.valueOf(baseLocationInfo.getRowNo()));
  163. locationCoordinateVo.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
  164. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  165. }
  166. // 推荐目标库位
  167. BaseLocationLotattDTO baseLocationLotattVO = baseLocationInfoSubService.recommendAReceiptLocation(sku);
  168. if (baseLocationLotattVO == null) {
  169. AjaxResult.error("没有可以推荐的目标库位!");
  170. }
  171. // 生成任务
  172. String taskNo = "";
  173. AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()
  174. , baseLocationLotattVO.getId().toString()
  175. , asnNo
  176. , palletNo
  177. , wcsNo);
  178. if (!ajaxResult.isSuccess()) {
  179. return ajaxResult;
  180. }
  181. taskNo = ajaxResult.get("data").toString();
  182. // 入库缓存位生成库存
  183. InvLotLocIdSubService.initInv(Constant.LOC_STAGE_CACHE.toString(), sku, palletNo, asnNo, taskNo, qty);
  184. // 反馈
  185. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  186. locationCoordinateVo.setTaskNo(taskNo);
  187. locationCoordinateVo.setLocationId(baseLocationLotattVO.getLocationNo());
  188. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationLotattVO.getShiftNo()));
  189. locationCoordinateVo.setCol(Integer.valueOf(baseLocationLotattVO.getRowNo()));
  190. locationCoordinateVo.setRow(Integer.valueOf(baseLocationLotattVO.getRowIndex()));
  191. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  192. }
  193. /**
  194. * 空托仓位请求
  195. *
  196. * @param emptyPalletLocForm
  197. * @return
  198. */
  199. @Transactional
  200. public synchronized AjaxResult emptyPalletLoc(EmptyPalletLocForm emptyPalletLocForm) {
  201. // 空托仓位请求类型
  202. int taskType = emptyPalletLocForm.getTaskType();
  203. // 任务号
  204. String wcsNo = emptyPalletLocForm.getWcsNo();
  205. if (taskType == 0) {
  206. return AjaxResult.error("未传入空托仓位请求类型");
  207. }
  208. if (taskType == 1) {
  209. // 判重
  210. WcsTask wcsTaskQuery = new WcsTask();
  211. wcsTaskQuery.setExt1("");
  212. wcsTaskQuery.setExt2("");
  213. wcsTaskQuery.setExt3(wcsNo);
  214. WcsTask wcsTask = iWcsTaskService.selectWcsTaskByModel(wcsTaskQuery);
  215. if (wcsTask != null) {
  216. String locationTo = wcsTask.getLocationTo();
  217. BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, Constant.WAREHOUSE_ID);
  218. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  219. locationCoordinateVo.setTaskNo(wcsTask.getTaskNo());
  220. locationCoordinateVo.setLocationId(baseLocationInfo.getLocationNo());
  221. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationInfo.getShiftNo()));
  222. locationCoordinateVo.setCol(Integer.valueOf(baseLocationInfo.getRowNo()));
  223. locationCoordinateVo.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
  224. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  225. }
  226. BaseLocationInfo baseLocationInfo = selectLocationInfo();
  227. if (baseLocationInfo == null) {
  228. AjaxResult.error("没有可以推荐的目标库位!");
  229. }
  230. // 生成任务
  231. String taskNo = "";
  232. AjaxResult ajaxResult = wcsTaskSubService.addWcsTask(Constant.LOC_STAGE_CACHE.toString()
  233. , baseLocationInfo.getId().toString()
  234. , ""
  235. , ""
  236. , wcsNo);
  237. if (!ajaxResult.isSuccess()) {
  238. return ajaxResult;
  239. }
  240. taskNo = ajaxResult.get("data").toString();
  241. // 入库缓存位生成库存
  242. InvLotLocIdSubService.initInv(Constant.LOC_STAGE_CACHE.toString(), Constant.PALLET_TYPE, "", "", taskNo, 1.0);
  243. // 反馈
  244. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  245. locationCoordinateVo.setTaskNo(taskNo);
  246. locationCoordinateVo.setLocationId(baseLocationInfo.getLocationNo());
  247. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationInfo.getShiftNo()));
  248. locationCoordinateVo.setCol(Integer.valueOf(baseLocationInfo.getRowNo()));
  249. locationCoordinateVo.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
  250. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  251. }
  252. if (taskType == 2) {
  253. BaseLocationLotattDTO baseLocationLotatt = allocateLocationInfo();
  254. Assert.isTrue(ObjectUtil.isNotNull(baseLocationLotatt), "仓库中无库存");
  255. String palletNo = ObjectUtil.isNotNull(baseLocationLotatt.getLotattVO())
  256. ? baseLocationLotatt.getLotattVO().getLotatt07() : StringUtils.EMPTY;
  257. // 生成四向车出库任务
  258. String taskNo = IdWorker.getIdStr();
  259. wcsTaskSubService.addWcsOutTask(taskNo, baseLocationLotatt.getLocationNo(), Constant.LOC_SORTATION_CACHE.toString(), "", palletNo, wcsNo);
  260. Assert.isTrue( ObjectUtil.isNotNull(baseLocationLotatt.getId()), "仓库中无库存");
  261. invLotLocIdService.operateTraceIdByLocationId(String.valueOf(baseLocationLotatt.getId()), taskNo);
  262. LocationCoordDTO locationCoordinateVo1 = new LocationCoordDTO();
  263. locationCoordinateVo1.setTaskNo(taskNo);
  264. locationCoordinateVo1.setLocationId(baseLocationLotatt.getLocationNo());
  265. locationCoordinateVo1.setFloor(Integer.valueOf(baseLocationLotatt.getShiftNo()));
  266. locationCoordinateVo1.setCol(Integer.valueOf(baseLocationLotatt.getRowNo()));
  267. locationCoordinateVo1.setRow(Integer.valueOf(baseLocationLotatt.getRowIndex()));
  268. return AjaxResult.success("仓位获取成功", locationCoordinateVo1);
  269. }
  270. return AjaxResult.success();
  271. }
  272. protected BaseLocationLotattDTO allocateLocationInfo() {
  273. List<BaseLocationLotattDTO> baseLocationLotattList = baseLocationInfoSubService.selectAllocatingInventoryAccordingConditionsOrderBy(OUT_ZONES, Constant.PALLET_TYPE);
  274. Assert.isTrue(CollectionUtil.isNotEmpty(baseLocationLotattList), "there is no stock in the warehouse");
  275. return filterInv1(baseLocationLotattList);
  276. }
  277. protected BaseLocationInfo selectLocationInfo() {
  278. return baseLocationInfoSubService.recommendAReceiptLocation(Constant.PALLET_TYPE);
  279. }
  280. /**
  281. * 任务状态反馈
  282. *
  283. * @param taskStatusForm
  284. * @return
  285. */
  286. public AjaxResult taskStatusResponse(TaskStatusForm taskStatusForm) {
  287. String taskNo = taskStatusForm.getTaskNo();
  288. int status = taskStatusForm.getStatus();
  289. wcsTaskSubService.callBack(taskNo, status, null);
  290. return AjaxResult.success();
  291. }
  292. /**
  293. * 匹配库存
  294. *
  295. * @param locationLotattList
  296. * @return
  297. */
  298. public synchronized BaseLocationLotattDTO filterInv1(List<BaseLocationLotattDTO> locationLotattList) {
  299. return locationLotattList.parallelStream()
  300. .filter(item -> ObjectUtil.isNotNull(item)
  301. && StringUtils.equals(Constant.PALLET_TYPE, item.getSku())
  302. && CompareUtil.compare(item.getQty(), 1F) == 0).findFirst().orElse(null);
  303. }
  304. /**
  305. * 生成入库单
  306. *
  307. * @param sku
  308. * @param qty
  309. * @return
  310. */
  311. public AjaxResult generateAShippingOrder(String sku, BigDecimal qty) {
  312. WmsDocAsnHeader wmsDocAsnHeader = new WmsDocAsnHeader();
  313. //生成单头
  314. String asnNo = idSequenceUtils.generateId("ASNNO");
  315. wmsDocAsnHeader.setAsnNo(asnNo);
  316. wmsDocAsnHeader.setEdiSendFlag("N");
  317. wmsDocAsnHeader.setAsnType(Constant.ASN_TYP.HK.getValue());
  318. wmsDocAsnHeader.setCreateTime(new Date());
  319. wmsDocAsnHeader.setAsnStatus(Constant.ASN_STS.STS10.getValue());
  320. wmsDocAsnHeader.setCreateBy("Wms");
  321. wmsDocAsnHeaderMapper.insertWmsDocAsnHeader(wmsDocAsnHeader);
  322. //生成明细
  323. WmsDocAsnDetails wmsDocAsnDetails = new WmsDocAsnDetails();
  324. wmsDocAsnDetails.setAsnNo(asnNo);
  325. wmsDocAsnDetails.setAsnLineNo(1l);
  326. wmsDocAsnDetails.setSku(sku);
  327. wmsDocAsnDetails.setCreateTime(new Date());
  328. wmsDocAsnDetails.setExpectedQty(qty);
  329. wmsDocAsnDetails.setExpectedQtyEach(qty);
  330. wmsDocAsnDetails.setReceivedQty(new BigDecimal(0));
  331. wmsDocAsnDetails.setReceivedQtyEach(new BigDecimal(0));
  332. wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS10.getValue());
  333. wmsDocAsnDetails.setCreateTime(new Date());
  334. wmsDocAsnDetails.setCreateBy("Wms");
  335. wmsDocAsnDetailsMapper.insertWmsDocAsnDetails(wmsDocAsnDetails);
  336. return AjaxResult.success("操作成功!", asnNo);
  337. }
  338. /**
  339. * 拆包机开启接口
  340. *
  341. * @param lineOpenNotificationForm
  342. * @return
  343. */
  344. public AjaxResult lineOpenNotification(LineOpenNotificationForm lineOpenNotificationForm) {
  345. String lineId = lineOpenNotificationForm.getLineId();
  346. boolean[] booleans = stirringTankClient.readTank14();
  347. return unpackingMachineFacade.unpackingMachineOpen(lineId, booleans) ? AjaxResult.success() : AjaxResult.error();
  348. }
  349. public AjaxResult turnOffTheUnpacker(LineOpenNotificationForm lineOpenNotificationForm){
  350. switch (lineOpenNotificationForm.getLineId()) {
  351. case "1":
  352. return turnOffTheUnpacker();
  353. case "2":
  354. return turnOffTheUnpacker1();
  355. case "3":
  356. return turnOffTheUnpacker2();
  357. case "4":
  358. return turnOffTheUnpacker3();
  359. case "5":
  360. return turnOffTheUnpacker4();
  361. default:
  362. throw new BaseException("lineId is not exist ......");
  363. }
  364. }
  365. /**
  366. * 正常关闭1号拆包机
  367. *
  368. * @return
  369. */
  370. public AjaxResult turnOffTheUnpacker() {
  371. new Thread(() -> {
  372. try {
  373. Thread.sleep(300000);
  374. //写关闭拆包机信号
  375. unpackingMachineSubClient.writeV141_2();
  376. //写仓库注入碳酸钠完成
  377. stirringTankClient.writeTank05();
  378. } catch (InterruptedException e) {
  379. e.printStackTrace();
  380. }
  381. }).start();
  382. return AjaxResult.success();
  383. }
  384. /**
  385. * 正常关闭2号拆包机
  386. *
  387. * @return
  388. */
  389. public AjaxResult turnOffTheUnpacker1() {
  390. new Thread(() -> {
  391. try {
  392. Thread.sleep(300000);
  393. //写关闭拆包机信号
  394. unpackingMachineSubClient.writeV141_3();
  395. //写仓库注入丁黄药完成
  396. stirringTankClient.writeTank05_1();
  397. } catch (InterruptedException e) {
  398. e.printStackTrace();
  399. }
  400. }).start();
  401. return AjaxResult.success();
  402. }
  403. /**
  404. * 正常关闭3号拆包机
  405. *
  406. * @return
  407. */
  408. public AjaxResult turnOffTheUnpacker2() {
  409. new Thread(() -> {
  410. try {
  411. Thread.sleep(300000);
  412. //写关闭拆包机信号
  413. unpackingMachineSubClient.writeV141_4();
  414. //写仓库注入六偏磷酸钠完成
  415. stirringTankClient.writeTank05_3();
  416. } catch (InterruptedException e) {
  417. e.printStackTrace();
  418. }
  419. }).start();
  420. return AjaxResult.success();
  421. }
  422. /**
  423. * 正常关闭4号拆包机
  424. *
  425. * @return
  426. */
  427. public AjaxResult turnOffTheUnpacker3() {
  428. new Thread(() -> {
  429. try {
  430. Thread.sleep(300000);
  431. //写关闭拆包机信号
  432. unpackingMachineSubClient.writeV141_5();
  433. //写仓库注入硫酸铵完成
  434. stirringTankClient.writeTank05_4();
  435. } catch (InterruptedException e) {
  436. e.printStackTrace();
  437. }
  438. }).start();
  439. return AjaxResult.success();
  440. }
  441. /**
  442. * 正常关闭5号拆包机
  443. *
  444. * @return
  445. */
  446. public AjaxResult turnOffTheUnpacker4() {
  447. new Thread(() -> {
  448. try {
  449. Thread.sleep(300000);
  450. //写关闭拆包机信号
  451. unpackingMachineSubClient.writeV141_6();
  452. //写仓库注入乙黄药完成
  453. stirringTankClient.writeTank05_5();
  454. } catch (InterruptedException e) {
  455. e.printStackTrace();
  456. }
  457. }).start();
  458. return AjaxResult.success();
  459. }
  460. /**
  461. * 异常关闭1号拆包机
  462. *
  463. * @return
  464. */
  465. public AjaxResult turnOffTheUnpackererror() {
  466. //写仓库注入碳酸钠失败
  467. stirringTankClient.writeTank04();
  468. stirringTankClient.writeTank05f();
  469. //写关闭拆包机信号
  470. unpackingMachineSubClient.writeV141_2();
  471. return AjaxResult.success();
  472. }
  473. /**
  474. * 异常关闭2号拆包机
  475. *
  476. * @return
  477. */
  478. public AjaxResult turnOffTheUnpackererror1() {
  479. //写仓库注入丁黄药失败
  480. stirringTankClient.writeTank04_1();
  481. stirringTankClient.writeTank05_1f();
  482. unpackingMachineSubClient.writeV141_3();
  483. return AjaxResult.success();
  484. }
  485. /**
  486. * 异常关闭3号拆包机
  487. *
  488. * @return
  489. */
  490. public AjaxResult turnOffTheUnpackererror2() {
  491. //写仓库注入六偏磷酸钠失败
  492. stirringTankClient.writeTank04_3();
  493. stirringTankClient.writeTank05_3f();
  494. unpackingMachineSubClient.writeV141_4();
  495. return AjaxResult.success();
  496. }
  497. /**
  498. * 异常关闭4号拆包机
  499. *
  500. * @return
  501. */
  502. public AjaxResult turnOffTheUnpackererror3() {
  503. //写仓库注入硫酸铵失败
  504. stirringTankClient.writeTank04_4();
  505. stirringTankClient.writeTank05_4f();
  506. unpackingMachineSubClient.writeV141_5();
  507. return AjaxResult.success();
  508. }
  509. /**
  510. * 异常关闭5号拆包机
  511. *
  512. * @return
  513. */
  514. public AjaxResult turnOffTheUnpackererror4() {
  515. //写仓库注入乙黄药失败
  516. stirringTankClient.writeTank04_5();
  517. stirringTankClient.writeTank05_5f();
  518. unpackingMachineSubClient.writeV141_6();
  519. return AjaxResult.success();
  520. }
  521. /**
  522. * 更新数据接口
  523. *
  524. * @param updateForm
  525. * @return
  526. */
  527. public AjaxResult updateAsnData(UpdateForm updateForm) {
  528. String asnNo = updateForm.getDocNo();
  529. String asnLineNo = updateForm.getLineNo();
  530. Integer num = updateForm.getNum();
  531. WmsDocAsnDetails wmsDocAsnDetails = wmsDocAsnDetailsMapper.selectWmsDocAsnDetailsByAsnLineNo(asnNo, asnLineNo);
  532. wmsDocAsnDetails.setExpectedQty(new BigDecimal(num));
  533. wmsDocAsnDetails.setExpectedQtyEach(new BigDecimal(num));
  534. wmsDocAsnDetailsMapper.updateWmsDocAsnDetails(wmsDocAsnDetails);
  535. return AjaxResult.success();
  536. }
  537. /**
  538. * 安全交握,Wcs回调通知agv是否可以执行
  539. * @param callbackForm
  540. * @return
  541. */
  542. public Boolean callbackNotice(CallbackTaskForm callbackForm) {
  543. Assert.isTrue(StringUtils.equals(Constant.SAFE_CODE.PASS.getCode(), callbackForm.getSafeCode()),
  544. "当前任务未执行");
  545. return wcsTaskService.updateTaskStatus(callbackForm.getTaskNo(),
  546. Constant.TASK_STS.TASK_CREATE.getValue(), Constant.TASK_STS.TASK_WAIT.getValue());
  547. }
  548. /**
  549. * 出库任务下发
  550. * @return
  551. */
  552. public AjaxResult outboundRequest(OutboundForm outboundForm) {
  553. String locationFrom = "100733";
  554. String locationTo = "";
  555. String palletNo = outboundForm.getPalletNo();
  556. String wcsId = outboundForm.getWcsId();
  557. AjaxResult ajaxResult = agvCallProxyService.barrelsOutOfStorage(locationFrom, locationTo, palletNo,wcsId);
  558. if (ajaxResult.isSuccess()){
  559. return AjaxResult.success("任务创建成功");
  560. }
  561. return AjaxResult.error("任务创建失败");
  562. }
  563. /**
  564. * 回调卸货完成前
  565. * @return
  566. */
  567. public AjaxResult agvCallbackWCSBeforeUnloadingIsCompleted() {
  568. // 查询出状态为10,包含物料信息为丁铵黑药的入库单
  569. WmsDocAsnDetails wmsDocAsnDetails = new WmsDocAsnDetails();
  570. wmsDocAsnDetails.setSku("C4H9O2PSSNH4");
  571. wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS10.getValue());
  572. WmsDocAsnDetails wmsDocAsnDetails1 = wmsDocAsnDetailsService.selectWmsDocAsnDetailsByModel(wmsDocAsnDetails);
  573. String asnNo = wmsDocAsnDetails1.getAsnNo();
  574. // 根据入库单号(Ext1)查询出所对应的任务
  575. WcsTask wcsTask = new WcsTask();
  576. wcsTask.setExt1(asnNo);
  577. WcsTask wcsTask1 = wcsTaskService.selectWcsTaskByModel(wcsTask);
  578. // 根据查出来的任务编号反馈wcs卸货完成
  579. String taskNo = wcsTask1.getTaskNo();
  580. wmsDocAsnSubService.wmsAgvCallbackIntask(taskNo);
  581. return AjaxResult.success();
  582. }
  583. }