WcsToWmsApiService.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  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(), StringUtils.EMPTY, StringUtils.EMPTY,
  234. wcsNo, Constant.TaskType.EMPTY_PALLET.getDesc());
  235. if (!ajaxResult.isSuccess()) {
  236. return ajaxResult;
  237. }
  238. taskNo = ajaxResult.get("data").toString();
  239. // 入库缓存位生成库存
  240. InvLotLocIdSubService.initInv(Constant.LOC_STAGE_CACHE.toString(), Constant.PALLET_TYPE, "", "", taskNo, 1.0);
  241. // 反馈
  242. LocationCoordDTO locationCoordinateVo = new LocationCoordDTO();
  243. locationCoordinateVo.setTaskNo(taskNo);
  244. locationCoordinateVo.setLocationId(baseLocationInfo.getLocationNo());
  245. locationCoordinateVo.setFloor(Integer.valueOf(baseLocationInfo.getShiftNo()));
  246. locationCoordinateVo.setCol(Integer.valueOf(baseLocationInfo.getRowNo()));
  247. locationCoordinateVo.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
  248. return AjaxResult.success("仓位获取成功!", locationCoordinateVo);
  249. }
  250. if (taskType == 2) {
  251. BaseLocationLotattDTO baseLocationLotatt = allocateLocationInfo();
  252. Assert.isTrue(ObjectUtil.isNotNull(baseLocationLotatt), "仓库中无库存");
  253. String palletNo = ObjectUtil.isNotNull(baseLocationLotatt.getLotattVO())
  254. ? baseLocationLotatt.getLotattVO().getLotatt07() : StringUtils.EMPTY;
  255. // 生成四向车出库任务
  256. String taskNo = IdWorker.getIdStr();
  257. wcsTaskSubService.addWcsOutTask(taskNo, baseLocationLotatt.getLocationNo(),
  258. Constant.LOC_SORTATION_CACHE.toString(), "", palletNo, wcsNo, Constant.TaskType.EMPTY_PALLET.getDesc());
  259. Assert.isTrue( ObjectUtil.isNotNull(baseLocationLotatt.getId()), "仓库中无库存");
  260. invLotLocIdService.operateTraceIdByLocationId(String.valueOf(baseLocationLotatt.getId()), taskNo);
  261. LocationCoordDTO locationCoordinateVo1 = new LocationCoordDTO();
  262. locationCoordinateVo1.setTaskNo(taskNo);
  263. locationCoordinateVo1.setLocationId(baseLocationLotatt.getLocationNo());
  264. locationCoordinateVo1.setFloor(Integer.valueOf(baseLocationLotatt.getShiftNo()));
  265. locationCoordinateVo1.setCol(Integer.valueOf(baseLocationLotatt.getRowNo()));
  266. locationCoordinateVo1.setRow(Integer.valueOf(baseLocationLotatt.getRowIndex()));
  267. return AjaxResult.success("仓位获取成功", locationCoordinateVo1);
  268. }
  269. return AjaxResult.success();
  270. }
  271. protected BaseLocationLotattDTO allocateLocationInfo() {
  272. List<BaseLocationLotattDTO> baseLocationLotattList = baseLocationInfoSubService.selectAllocatingInventoryAccordingConditionsOrderBy(OUT_ZONES, Constant.PALLET_TYPE);
  273. Assert.isTrue(CollectionUtil.isNotEmpty(baseLocationLotattList), "there is no stock in the warehouse");
  274. return filterInv1(baseLocationLotattList);
  275. }
  276. protected BaseLocationInfo selectLocationInfo() {
  277. return baseLocationInfoSubService.recommendAReceiptLocation(Constant.PALLET_TYPE);
  278. }
  279. /**
  280. * 任务状态反馈
  281. *
  282. * @param taskStatusForm
  283. * @return
  284. */
  285. public AjaxResult taskStatusResponse(TaskStatusForm taskStatusForm) {
  286. String taskNo = taskStatusForm.getTaskNo();
  287. int status = taskStatusForm.getStatus();
  288. wcsTaskSubService.callBack(taskNo, status, null);
  289. return AjaxResult.success();
  290. }
  291. /**
  292. * 匹配库存
  293. *
  294. * @param locationLotattList
  295. * @return
  296. */
  297. public synchronized BaseLocationLotattDTO filterInv1(List<BaseLocationLotattDTO> locationLotattList) {
  298. return locationLotattList.parallelStream()
  299. .filter(item -> ObjectUtil.isNotNull(item)
  300. && StringUtils.equals(Constant.PALLET_TYPE, item.getSku())
  301. && CompareUtil.compare(item.getQty(), 1F) == 0).findFirst().orElse(null);
  302. }
  303. /**
  304. * 生成入库单
  305. *
  306. * @param sku
  307. * @param qty
  308. * @return
  309. */
  310. public AjaxResult generateAShippingOrder(String sku, BigDecimal qty) {
  311. WmsDocAsnHeader wmsDocAsnHeader = new WmsDocAsnHeader();
  312. //生成单头
  313. String asnNo = idSequenceUtils.generateId("ASNNO");
  314. wmsDocAsnHeader.setAsnNo(asnNo);
  315. wmsDocAsnHeader.setEdiSendFlag("N");
  316. wmsDocAsnHeader.setAsnType(Constant.ASN_TYP.HK.getValue());
  317. wmsDocAsnHeader.setCreateTime(new Date());
  318. wmsDocAsnHeader.setAsnStatus(Constant.ASN_STS.STS10.getValue());
  319. wmsDocAsnHeader.setCreateBy("Wms");
  320. wmsDocAsnHeaderMapper.insertWmsDocAsnHeader(wmsDocAsnHeader);
  321. //生成明细
  322. WmsDocAsnDetails wmsDocAsnDetails = new WmsDocAsnDetails();
  323. wmsDocAsnDetails.setAsnNo(asnNo);
  324. wmsDocAsnDetails.setAsnLineNo(1l);
  325. wmsDocAsnDetails.setSku(sku);
  326. wmsDocAsnDetails.setCreateTime(new Date());
  327. wmsDocAsnDetails.setExpectedQty(qty);
  328. wmsDocAsnDetails.setExpectedQtyEach(qty);
  329. wmsDocAsnDetails.setReceivedQty(new BigDecimal(0));
  330. wmsDocAsnDetails.setReceivedQtyEach(new BigDecimal(0));
  331. wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS10.getValue());
  332. wmsDocAsnDetails.setCreateTime(new Date());
  333. wmsDocAsnDetails.setCreateBy("Wms");
  334. wmsDocAsnDetailsMapper.insertWmsDocAsnDetails(wmsDocAsnDetails);
  335. return AjaxResult.success("操作成功!", asnNo);
  336. }
  337. /**
  338. * 拆包机开启接口
  339. *
  340. * @param lineOpenNotificationForm
  341. * @return
  342. */
  343. public AjaxResult lineOpenNotification(LineOpenNotificationForm lineOpenNotificationForm) {
  344. String lineId = lineOpenNotificationForm.getLineId();
  345. boolean[] booleans = stirringTankClient.readTank14();
  346. return unpackingMachineFacade.unpackingMachineOpen(lineId, booleans) ? AjaxResult.success() : AjaxResult.error();
  347. }
  348. public AjaxResult turnOffTheUnpacker(LineOpenNotificationForm lineOpenNotificationForm){
  349. switch (lineOpenNotificationForm.getLineId()) {
  350. case "1":
  351. return turnOffTheUnpacker();
  352. case "2":
  353. return turnOffTheUnpacker1();
  354. case "3":
  355. return turnOffTheUnpacker2();
  356. case "4":
  357. return turnOffTheUnpacker3();
  358. case "5":
  359. return turnOffTheUnpacker4();
  360. default:
  361. throw new BaseException("lineId is not exist ......");
  362. }
  363. }
  364. /**
  365. * 正常关闭1号拆包机
  366. *
  367. * @return
  368. */
  369. public AjaxResult turnOffTheUnpacker() {
  370. new Thread(() -> {
  371. try {
  372. Thread.sleep(300000);
  373. //写关闭拆包机信号
  374. unpackingMachineSubClient.writeV141_2();
  375. //写仓库注入碳酸钠完成
  376. stirringTankClient.writeTank05();
  377. } catch (InterruptedException e) {
  378. e.printStackTrace();
  379. }
  380. }).start();
  381. return AjaxResult.success();
  382. }
  383. /**
  384. * 正常关闭2号拆包机
  385. *
  386. * @return
  387. */
  388. public AjaxResult turnOffTheUnpacker1() {
  389. new Thread(() -> {
  390. try {
  391. Thread.sleep(300000);
  392. //写关闭拆包机信号
  393. unpackingMachineSubClient.writeV141_3();
  394. //写仓库注入丁黄药完成
  395. stirringTankClient.writeTank05_1();
  396. } catch (InterruptedException e) {
  397. e.printStackTrace();
  398. }
  399. }).start();
  400. return AjaxResult.success();
  401. }
  402. /**
  403. * 正常关闭3号拆包机
  404. *
  405. * @return
  406. */
  407. public AjaxResult turnOffTheUnpacker2() {
  408. new Thread(() -> {
  409. try {
  410. Thread.sleep(300000);
  411. //写关闭拆包机信号
  412. unpackingMachineSubClient.writeV141_4();
  413. //写仓库注入六偏磷酸钠完成
  414. stirringTankClient.writeTank05_3();
  415. } catch (InterruptedException e) {
  416. e.printStackTrace();
  417. }
  418. }).start();
  419. return AjaxResult.success();
  420. }
  421. /**
  422. * 正常关闭4号拆包机
  423. *
  424. * @return
  425. */
  426. public AjaxResult turnOffTheUnpacker3() {
  427. new Thread(() -> {
  428. try {
  429. Thread.sleep(300000);
  430. //写关闭拆包机信号
  431. unpackingMachineSubClient.writeV141_5();
  432. //写仓库注入硫酸铵完成
  433. stirringTankClient.writeTank05_4();
  434. } catch (InterruptedException e) {
  435. e.printStackTrace();
  436. }
  437. }).start();
  438. return AjaxResult.success();
  439. }
  440. /**
  441. * 正常关闭5号拆包机
  442. *
  443. * @return
  444. */
  445. public AjaxResult turnOffTheUnpacker4() {
  446. new Thread(() -> {
  447. try {
  448. Thread.sleep(300000);
  449. //写关闭拆包机信号
  450. unpackingMachineSubClient.writeV141_6();
  451. //写仓库注入乙黄药完成
  452. stirringTankClient.writeTank05_5();
  453. } catch (InterruptedException e) {
  454. e.printStackTrace();
  455. }
  456. }).start();
  457. return AjaxResult.success();
  458. }
  459. /**
  460. * 异常关闭1号拆包机
  461. *
  462. * @return
  463. */
  464. public AjaxResult turnOffTheUnpackererror() {
  465. //写仓库注入碳酸钠失败
  466. stirringTankClient.writeTank04();
  467. stirringTankClient.writeTank05f();
  468. //写关闭拆包机信号
  469. unpackingMachineSubClient.writeV141_2();
  470. return AjaxResult.success();
  471. }
  472. /**
  473. * 异常关闭2号拆包机
  474. *
  475. * @return
  476. */
  477. public AjaxResult turnOffTheUnpackererror1() {
  478. //写仓库注入丁黄药失败
  479. stirringTankClient.writeTank04_1();
  480. stirringTankClient.writeTank05_1f();
  481. unpackingMachineSubClient.writeV141_3();
  482. return AjaxResult.success();
  483. }
  484. /**
  485. * 异常关闭3号拆包机
  486. *
  487. * @return
  488. */
  489. public AjaxResult turnOffTheUnpackererror2() {
  490. //写仓库注入六偏磷酸钠失败
  491. stirringTankClient.writeTank04_3();
  492. stirringTankClient.writeTank05_3f();
  493. unpackingMachineSubClient.writeV141_4();
  494. return AjaxResult.success();
  495. }
  496. /**
  497. * 异常关闭4号拆包机
  498. *
  499. * @return
  500. */
  501. public AjaxResult turnOffTheUnpackererror3() {
  502. //写仓库注入硫酸铵失败
  503. stirringTankClient.writeTank04_4();
  504. stirringTankClient.writeTank05_4f();
  505. unpackingMachineSubClient.writeV141_5();
  506. return AjaxResult.success();
  507. }
  508. /**
  509. * 异常关闭5号拆包机
  510. *
  511. * @return
  512. */
  513. public AjaxResult turnOffTheUnpackererror4() {
  514. //写仓库注入乙黄药失败
  515. stirringTankClient.writeTank04_5();
  516. stirringTankClient.writeTank05_5f();
  517. unpackingMachineSubClient.writeV141_6();
  518. return AjaxResult.success();
  519. }
  520. /**
  521. * 更新数据接口
  522. *
  523. * @param updateForm
  524. * @return
  525. */
  526. public AjaxResult updateAsnData(UpdateForm updateForm) {
  527. String asnNo = updateForm.getDocNo();
  528. String asnLineNo = updateForm.getLineNo();
  529. Integer num = updateForm.getNum();
  530. WmsDocAsnDetails wmsDocAsnDetails = wmsDocAsnDetailsMapper.selectWmsDocAsnDetailsByAsnLineNo(asnNo, asnLineNo);
  531. wmsDocAsnDetails.setExpectedQty(new BigDecimal(num));
  532. wmsDocAsnDetails.setExpectedQtyEach(new BigDecimal(num));
  533. wmsDocAsnDetailsMapper.updateWmsDocAsnDetails(wmsDocAsnDetails);
  534. return AjaxResult.success();
  535. }
  536. /**
  537. * 安全交握,Wcs回调通知agv是否可以执行
  538. * @param callbackForm
  539. * @return
  540. */
  541. public Boolean callbackNotice(CallbackTaskForm callbackForm) {
  542. Assert.isTrue(StringUtils.equals(Constant.SAFE_CODE.PASS.getCode(), callbackForm.getSafeCode()),
  543. "当前任务未执行");
  544. return wcsTaskService.updateTaskStatus(callbackForm.getTaskNo(),
  545. Constant.TASK_STS.TASK_CREATE.getValue(), Constant.TASK_STS.TASK_WAIT.getValue());
  546. }
  547. /**
  548. * 出库任务下发
  549. * @return
  550. */
  551. public AjaxResult outboundRequest(OutboundForm outboundForm) {
  552. String locationFrom = "100733";
  553. String locationTo = "";
  554. String palletNo = outboundForm.getPalletNo();
  555. String wcsId = outboundForm.getWcsId();
  556. AjaxResult ajaxResult = agvCallProxyService.barrelsOutOfStorage(locationFrom, locationTo, palletNo,wcsId);
  557. if (ajaxResult.isSuccess()){
  558. return AjaxResult.success("任务创建成功");
  559. }
  560. return AjaxResult.error("任务创建失败");
  561. }
  562. /**
  563. * 回调卸货完成前
  564. * @return
  565. */
  566. public AjaxResult agvCallbackWCSBeforeUnloadingIsCompleted() {
  567. // 查询出状态为10,包含物料信息为丁铵黑药的入库单
  568. WmsDocAsnDetails wmsDocAsnDetails = new WmsDocAsnDetails();
  569. wmsDocAsnDetails.setSku("C4H9O2PSSNH4");
  570. wmsDocAsnDetails.setLineStatus(Constant.ASN_STS.STS10.getValue());
  571. WmsDocAsnDetails wmsDocAsnDetails1 = wmsDocAsnDetailsService.selectWmsDocAsnDetailsByModel(wmsDocAsnDetails);
  572. String asnNo = wmsDocAsnDetails1.getAsnNo();
  573. // 根据入库单号(Ext1)查询出所对应的任务
  574. WcsTask wcsTask = new WcsTask();
  575. wcsTask.setExt1(asnNo);
  576. WcsTask wcsTask1 = wcsTaskService.selectWcsTaskByModel(wcsTask);
  577. // 根据查出来的任务编号反馈wcs卸货完成
  578. String taskNo = wcsTask1.getTaskNo();
  579. wmsDocAsnSubService.wmsAgvCallbackIntask(taskNo);
  580. return AjaxResult.success();
  581. }
  582. }