WcsToWmsApiService.java 26 KB

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