From 60c35db2393b1cd8681016058facaef2a5482550 Mon Sep 17 00:00:00 2001 From: "HUOJIN\\92525" <925258474@qq.com> Date: Wed, 31 Jul 2024 17:21:20 +0800 Subject: [PATCH] no message --- .../appupdate/rest/BydAppController.java | 19 +- .../com/youchain/basicdata/domain/Point.java | 6 +- .../basicdata/repository/AreaRepository.java | 47 ++-- .../basicdata/rest/PointController.java | 49 +++-- .../basicdata/rest/StockController.java | 27 +-- .../basicdata/service/AreaService.java | 10 + .../basicdata/service/StockService.java | 18 +- .../service/impl/AreaServiceImpl.java | 75 ++++--- .../service/impl/ItemServiceImpl.java | 27 +-- .../service/impl/PointServiceImpl.java | 1 - .../service/impl/StockServiceImpl.java | 200 ++++-------------- .../repository/AsnDetailRepository.java | 8 +- .../businessdata/service/AgvTaskService.java | 12 +- .../service/AsnDetailService.java | 107 ++++++---- .../businessdata/service/PickService.java | 2 +- .../service/impl/AgvTaskServiceImpl.java | 89 ++++---- .../service/impl/AsnDetailServiceImpl.java | 13 +- .../service/impl/ItemKeyServiceImpl.java | 3 +- .../service/impl/PickServiceImpl.java | 28 ++- .../config/thread/AsyncTaskExecutePool.java | 6 +- .../config/thread/ThreadPoolExecutorUtil.java | 2 + .../youchain/utils/BatchCreateOrUpdate.java | 58 +++-- .../src/main/resources/config/application.yml | 12 +- .../EladminSystemApplicationTests.java | 11 - 24 files changed, 371 insertions(+), 459 deletions(-) diff --git a/youchain-system/src/main/java/com/youchain/appupdate/rest/BydAppController.java b/youchain-system/src/main/java/com/youchain/appupdate/rest/BydAppController.java index 679949d..946e888 100644 --- a/youchain-system/src/main/java/com/youchain/appupdate/rest/BydAppController.java +++ b/youchain-system/src/main/java/com/youchain/appupdate/rest/BydAppController.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; + import java.util.List; @@ -117,22 +118,18 @@ public class BydAppController { return successResponse("出场成功!"); } - - @PostMapping("/callAssemblyLine") - @Log("装配线叫料") - @ApiOperation("装配线叫料") + @PostMapping("/operationFeedback") + @Log("任务放行") + @ApiOperation("任务放行") @AnonymousAccess - public ResponseEntity callAssemblyLine(@RequestBody CallAssemblyLine callAssemblyLine) { + public ResponseEntity operationFeedback(@RequestBody ContainerIn containerIn) { try { - String orderNo = callAssemblyLine.getOrderNo();//工单号 - String itemCode = callAssemblyLine.getItemCode();//物料编号 - String workStation = callAssemblyLine.getWorkStation();//需求工位 - String pointCode = callAssemblyLine.getPointCode();//需求点位; - + String containerCode = containerIn.getContainerCode(); + stockService.operationFeedback(containerCode); + return successResponse("放行成功!"); } catch (Exception e) { return badRequest(e.getMessage()); } - return successResponse("入库成功!"); } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/domain/Point.java b/youchain-system/src/main/java/com/youchain/basicdata/domain/Point.java index f1aa9f8..8016150 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/domain/Point.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/domain/Point.java @@ -79,15 +79,15 @@ public class Point extends BaseEntity implements Serializable { private Dept dept; @Column(name = "`pos_x`") - @ApiModelProperty(value = "坐标X") + @ApiModelProperty(value = "排") private Double posX = 0d; @Column(name = "`pos_y`") - @ApiModelProperty(value = "坐标Y") + @ApiModelProperty(value = "列") private Double posY = 0d; @Column(name = "`pos_z`") - @ApiModelProperty(value = "坐标Z") + @ApiModelProperty(value = "层") private Double posZ = 0d; @Column(name = "`type`") diff --git a/youchain-system/src/main/java/com/youchain/basicdata/repository/AreaRepository.java b/youchain-system/src/main/java/com/youchain/basicdata/repository/AreaRepository.java index c1ec344..f58a0fa 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/repository/AreaRepository.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/repository/AreaRepository.java @@ -1,28 +1,37 @@ /* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.youchain.basicdata.repository; import com.youchain.basicdata.domain.Area; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Set; /** -* @website https://eladmin.vip -* @author HJL -* @date 2023-08-14 -**/ + * @author HJL + * @website https://eladmin.vip + * @date 2023-08-14 + **/ public interface AreaRepository extends JpaRepository, JpaSpecificationExecutor { -} \ No newline at end of file + @Query(" from Area a where a.code = :code and a.enabled = true ") + Area findByCode(String code); + + @Query(" from Area a where a.code in :areaCodes and a.enabled = true ") + List findByCodes(Set areaCodes); +} diff --git a/youchain-system/src/main/java/com/youchain/basicdata/rest/PointController.java b/youchain-system/src/main/java/com/youchain/basicdata/rest/PointController.java index c33ef90..bbc938f 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/rest/PointController.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/rest/PointController.java @@ -23,13 +23,13 @@ import com.youchain.annotation.AnonymousAccess; import com.youchain.annotation.Log; import com.youchain.appupdate.inputJson.CurrentPage; import com.youchain.basicdata.domain.Area; +import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.service.AreaService; import com.youchain.basicdata.service.PointService; import com.youchain.basicdata.service.dto.AreaDto; import com.youchain.basicdata.service.dto.PointQueryCriteria; import com.youchain.config.FileProperties; -import com.youchain.config.thread.ThreadPoolExecutorUtil; import com.youchain.exception.handler.ApiResult; import com.youchain.modules.system.domain.Dept; import com.youchain.utils.*; @@ -48,8 +48,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import static org.springframework.http.HttpStatus.BAD_REQUEST; @@ -101,24 +100,41 @@ public class PointController { List> readAll = reader.readAll(); try { Set pointCodes = new HashSet<>();//点位集合 + Set areaCodes = new HashSet<>();//库区集合 for (Map record : readAll) { String pointCode = record.get("编码").toString().trim(); + String areaCode = record.get("库区").toString().trim(); if (!StringUtils.isEmpty(pointCode)) { pointCodes.add(pointCode); } + if (!StringUtils.isEmpty(areaCode)) { + areaCodes.add(areaCode); + } } //获取已存在的点位 Map existingPoint = pointService.findByCodes(pointCodes); + //查找数据库中存在的库区 + List areaList = areaService.findByCodes(areaCodes); + Set newAreaCodes = areaList.stream().map(Area::getCode).collect(Collectors.toSet()); + + // 取areaCodes和newAreaCodes的差集,说明有不存在的库区 + Set diffItemCodes = areaCodes.stream().filter(code -> !newAreaCodes.contains(code)).collect(Collectors.toSet()); + + if (!diffItemCodes.isEmpty()) { + throw new IllegalArgumentException("WMS不存在的库区集合,请维护:" + diffItemCodes); + } + + Map existingArea = areaList.stream().collect(Collectors.toMap(Area::getCode, Area -> Area)); List pointsToCreate = new ArrayList<>();//新增点位集合 List pointsToUpdate = new ArrayList<>();//修改点位集合 for (Map record : readAll) { String pointCode = record.get("编码").toString().trim(); String areaCode = record.get("库区").toString().trim(); - Area area = redisObjectUtils.getObjectFromCache(areaCode, () -> areaService.findByCode(areaCode), areaCode + " 系统无此库区!"); + Area area = existingArea.get(areaCode); //判断是否已存在点位 if (existingPoint.containsKey(pointCode)) { Point point = existingPoint.get(pointCode); @@ -130,24 +146,15 @@ public class PointController { } } - //异步处理 - ExecutorService executor = ThreadPoolExecutorUtil.getPoll("point-import-job"); - CompletableFuture createFuture = CompletableFuture.runAsync(() -> { - //批量新增Mo票 - if (!pointsToCreate.isEmpty()) { - batchCreateOrUpdate.batchCreate(pointsToCreate); - } - }, executor); + //批量新增Mo票 + if (!pointsToCreate.isEmpty()) { + batchCreateOrUpdate.batchInsert(pointsToCreate); + } - CompletableFuture updateFuture = CompletableFuture.runAsync(() -> { - //批量更新Mo票 - if (!pointsToUpdate.isEmpty()) { - batchCreateOrUpdate.batchUpdate(pointsToUpdate); - } - }, executor); - // 等待所有操作完成 - CompletableFuture.allOf(createFuture, updateFuture).join(); - executor.shutdown();//关闭线程池 + //批量更新Mo票 + if (!pointsToUpdate.isEmpty()) { + batchCreateOrUpdate.batchUpdate(pointsToUpdate); + } return successRequest("导入成功:" + " 新增(" + pointsToCreate.size() + ")修改(" + pointsToUpdate.size() + ")", ""); } catch (Exception e) { return badRequest("导入失败:" + e.getMessage()); diff --git a/youchain-system/src/main/java/com/youchain/basicdata/rest/StockController.java b/youchain-system/src/main/java/com/youchain/basicdata/rest/StockController.java index cfab466..c0f3569 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/rest/StockController.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/rest/StockController.java @@ -41,8 +41,6 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import javax.servlet.http.HttpServletResponse; import static org.springframework.http.HttpStatus.BAD_REQUEST; @@ -74,6 +72,7 @@ public class StockController { public void exportStock(HttpServletResponse response, StockQueryCriteria criteria) throws IOException { stockService.download(stockService.queryAll(criteria), response); } + @Log("容器导入") @ApiOperation("容器导入") @PostMapping(value = "/import_stock") @@ -113,23 +112,15 @@ public class StockController { stocksToCreate.add(createStock(stockType, UserUtils.getDept(), record)); } } - ExecutorService executor = ThreadPoolExecutorUtil.getPoll("stock-import-job"); - CompletableFuture createFuture = CompletableFuture.runAsync(() -> { - //批量新增Mo票 - if (!stocksToCreate.isEmpty()) { - batchCreateOrUpdate.batchCreate(stocksToCreate); - } - }, executor); + //批量新增Mo票 + if (!stocksToCreate.isEmpty()) { + batchCreateOrUpdate.batchInsert(stocksToCreate); + } - CompletableFuture updateFuture = CompletableFuture.runAsync(() -> { - //批量更新Mo票 - if (!stocksToUpdate.isEmpty()) { - batchCreateOrUpdate.batchUpdate(stocksToUpdate); - } - }, executor); - // 等待所有操作完成 - CompletableFuture.allOf(createFuture, updateFuture).join(); - executor.shutdown();//关闭线程池 + //批量更新Mo票 + if (!stocksToUpdate.isEmpty()) { + batchCreateOrUpdate.batchUpdate(stocksToUpdate); + } return successRequest("导入成功:" + " 新增(" + stocksToCreate.size() + ")修改(" + stocksToUpdate.size() + ")", ""); } catch (Exception e) { diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/AreaService.java b/youchain-system/src/main/java/com/youchain/basicdata/service/AreaService.java index 7ad3612..8b6056b 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/AreaService.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/AreaService.java @@ -22,6 +22,7 @@ import org.springframework.data.domain.Pageable; import java.util.Map; import java.util.List; import java.io.IOException; +import java.util.Set; import javax.servlet.http.HttpServletResponse; /** @@ -61,6 +62,13 @@ public interface AreaService { */ Area findByCode(String code); + /** + * 根据code查询 + * @param areaCodes + * @return + */ + List findByCodes(Set areaCodes); + /** * 创建 * @param resources / @@ -89,4 +97,6 @@ public interface AreaService { void download(List all, HttpServletResponse response) throws IOException; Area toEntity(AreaDto areaDto); + + } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/StockService.java b/youchain-system/src/main/java/com/youchain/basicdata/service/StockService.java index 34944ad..46ecb80 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/StockService.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/StockService.java @@ -153,25 +153,15 @@ public interface StockService { void containerOut(String containerCode); /** - * 呼叫容器 + * 任务放行 * - * @param itemCode - * @param pointCode - * @param scene + * @param Code */ - void callContainer(String itemCode, String pointCode, int scene); + void operationFeedback(String Code); + Map findByCodes(Set stockCodes); - /** - * 扫描Mo - * - * @param mo - * @param stockCode - * @return - */ - String scanMo(String stockCode, String mo); - /** * 原材料入库 * diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/AreaServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/AreaServiceImpl.java index 7f613b9..5a2da18 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/AreaServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/AreaServiceImpl.java @@ -1,18 +1,18 @@ /* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.youchain.basicdata.service.impl; import com.youchain.basicdata.domain.Area; @@ -30,45 +30,43 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import java.util.List; -import java.util.Map; + +import java.util.*; import java.io.IOException; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.LinkedHashMap; /** -* @website https://eladmin.vip -* @description 服务实现 -* @author HJL -* @date 2023-08-14 -**/ + * @author HJL + * @website https://eladmin.vip + * @description 服务实现 + * @date 2023-08-14 + **/ @Service @RequiredArgsConstructor -public class AreaServiceImpl implements AreaService { +public class AreaServiceImpl implements AreaService { private final AreaRepository areaRepository; private final AreaMapper areaMapper; private final EntityManager entityMapper; @Override - public Map queryAll(AreaQueryCriteria criteria, Pageable pageable){ - Page page = areaRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable); + public Map queryAll(AreaQueryCriteria criteria, Pageable pageable) { + Page page = areaRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable); return PageUtil.toPage(page.map(areaMapper::toDto)); } @Override - public List queryAll(AreaQueryCriteria criteria){ - return areaMapper.toDto(areaRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder))); + public List queryAll(AreaQueryCriteria criteria) { + return areaMapper.toDto(areaRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder))); } @Override @Transactional public AreaDto findById(Long id) { Area area = areaRepository.findById(id).orElseGet(Area::new); - ValidationUtil.isNull(area.getId(),"Area","id",id); + ValidationUtil.isNull(area.getId(), "Area", "id", id); return areaMapper.toDto(area); } @@ -82,7 +80,7 @@ public class AreaServiceImpl implements AreaService { @Transactional(rollbackFor = Exception.class) public void update(Area resources) { Area area = areaRepository.findById(resources.getId()).orElseGet(Area::new); - ValidationUtil.isNull( area.getId(),"Area","id",resources.getId()); + ValidationUtil.isNull(area.getId(), "Area", "id", resources.getId()); area.copy(resources); areaRepository.save(area); } @@ -98,7 +96,7 @@ public class AreaServiceImpl implements AreaService { public void download(List all, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); for (AreaDto area : all) { - Map map = new LinkedHashMap<>(); + Map map = new LinkedHashMap<>(); map.put("库区编号", area.getCode()); map.put("库区名称", area.getName()); map.put("描述", area.getDescription()); @@ -124,13 +122,12 @@ public class AreaServiceImpl implements AreaService { } @Override - public Area findByCode(String code){ - String hql="select t from Area t where t.code='"+code+"' or t.name='"+code+"' "; - Query query=entityMapper.createQuery(hql); - List ts=query.getResultList(); - if(ts.size()>0){ - return ts.get(0); - } - return null; + public Area findByCode(String code) { + return areaRepository.findByCode(code); + } + + @Override + public List findByCodes(Set areaCodes) { + return areaRepository.findByCodes(areaCodes); } } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java index 1d18e89..9bec814 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/ItemServiceImpl.java @@ -36,8 +36,6 @@ import org.springframework.data.domain.Pageable; import java.io.File; import java.util.*; import java.io.IOException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.servlet.http.HttpServletResponse; @@ -225,24 +223,15 @@ public class ItemServiceImpl implements ItemService { } } - //异步处理 - ExecutorService executor = ThreadPoolExecutorUtil.getPoll("item-import-job"); - CompletableFuture createFuture = CompletableFuture.runAsync(() -> { - //批量新增物料 - if (!itemsToCreate.isEmpty()) { - batchCreateOrUpdate.batchCreate(itemsToCreate); - } - }, executor); + //批量新增物料 + if (!itemsToCreate.isEmpty()) { + batchCreateOrUpdate.batchInsert(itemsToCreate); + } - CompletableFuture updateFuture = CompletableFuture.runAsync(() -> { - //批量更新物料 - if (!itemsToUpdate.isEmpty()) { - batchCreateOrUpdate.batchUpdate(itemsToUpdate); - } - }, executor); - // 等待所有操作完成 - CompletableFuture.allOf(createFuture, updateFuture).join(); - executor.shutdown();//关闭线程池 + //批量更新物料 + if (!itemsToUpdate.isEmpty()) { + batchCreateOrUpdate.batchUpdate(itemsToUpdate); + } return ("导入成功:" + " 新增(" + itemsToCreate.size() + ")修改(" + itemsToUpdate.size() + ")"); } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java index b487c20..784a7ce 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java @@ -48,7 +48,6 @@ public class PointServiceImpl implements PointService { private final PointRepository pointRepository; private final PointMapper pointMapper; - private final EntityManager entityMapper; @Override public Map queryAll(PointQueryCriteria criteria, Pageable pageable) { diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java index 50bd141..d0e7920 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/StockServiceImpl.java @@ -27,13 +27,9 @@ import com.youchain.basicdata.repository.PointRepository; import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.vo.BarCodeVo; import com.youchain.businessdata.domain.*; -import com.youchain.businessdata.repository.AgvTaskRepository; -import com.youchain.businessdata.repository.InventoryRepository; -import com.youchain.businessdata.repository.PickDetailRepository; -import com.youchain.businessdata.repository.TaskRepository; +import com.youchain.businessdata.repository.*; import com.youchain.businessdata.service.*; import com.youchain.businessdata.service.dto.TaskDto; -import com.youchain.config.thread.ThreadPoolExecutorUtil; import com.youchain.utils.*; import lombok.RequiredArgsConstructor; import com.youchain.basicdata.repository.StockRepository; @@ -50,9 +46,8 @@ import org.springframework.data.domain.Pageable; import java.sql.Timestamp; import java.util.*; import java.io.IOException; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; @@ -75,10 +70,10 @@ public class StockServiceImpl implements StockService { private final InventoryRepository inventoryRepository; private final AgvTaskService agvTaskService; private final ItemService itemService; + private final ItemKeyService itemKeyService; private final InventoryService inventoryService; private final InventoryLogService inventoryLogService; private final AsnDetailService asnDetailService; - private final PickDetailService pickDetailService; private final TaskService taskService; private final StockTypeToAreaMap stockTypeToAreaMap; private final BatchCreateOrUpdate batchCreateOrUpdate; @@ -248,47 +243,10 @@ public class StockServiceImpl implements StockService { } @Override - @Transactional(rollbackFor = Exception.class) - public void callContainer(String itemCode, String pointCode, int scene) { - Point endPoint = validateSrcPoint(pointCode);//验证点位 - checkPointStatus(endPoint);//验证点位状态 - switch (scene) { - case 2: // 叫满车 - handleFullContainerCall(itemCode, endPoint); - break; - default: - throw new RuntimeException("无效的业务场景!"); - } + public void operationFeedback(String Code) { + } - @Override - @Transactional(rollbackFor = Exception.class) - public String scanMo(String stockCode, String mo) { - /* Map map = parseString(mo);//解析二维码 - String propC1 = map.get("Lot");//批次号 - String boxNumber = map.get("S");//箱号 - String propC3 = map.get("P");//工厂 - String propD1 = map.get("D");//生产日期 - double orderQty = Double.parseDouble(getStringCode(map.get("Q")));//数量 - if (asnDetailService.existsByboxNumber(boxNumber)) { - throw new RuntimeException(boxNumber + "箱号已入库,请勿重复操作!"); - } - Item item = validateItem(getStringCode(map.get("M")));//验证物料 - Stock stock = validateStock(stockCode);//验证容器 - validateStockStatus(stock, item);//验证容器物料是否一致 - validateStockAndItem(stock, item);//验证容器类型和物料类型是否匹配 - //容器类型:小件入库则入小件缓存区、大件入库则入大件缓存区 - if (!stockTypeToAreaMap.getStockTypeToAreaMap().containsKey(stock.getStockType())) { - throw new RuntimeException(stock.getStockType() + "容器类型错误!"); - } - AsnDetail asnDetail = asnDetailService.createAsnDetail(item, stock, null, propC1, boxNumber, propC3, Timestamp.valueOf(DateUtil.formatDateTime(DateUtil.parse(propD1))), orderQty, mo); - ItemKey itemKey = itemKeyService.getItemKey(item, asnDetail.getPropC1(), asnDetail.getOrderNumber());//生成Itemkey - createTask(item, itemKey, asnDetail, stock, null, null, null);//生成Task任务 - stock.setStatus(BaseStatus.USED); - update(stock); - return boxNumber;*/ - return ""; - } @Override @Transactional(rollbackFor = Exception.class) @@ -305,18 +263,11 @@ public class StockServiceImpl implements StockService { /**验证箱条码集合是否为同一物料,箱号是否重复*/ validateItemCodeAndOrderNumber(barCodeVos); - /**验证箱号是否已入库*/ - for (BarCodeVo barCodeVo : barCodeVos) { - if (asnDetailService.existsByboxNumber(barCodeVo.getBoxNumber())) { - throw new RuntimeException(barCodeVo.getBoxNumber() + "箱号已入库,请勿重复操作!"); - } - } - /**验证物料*/ String firstItemCode = barCodeVos.iterator().next().getItemCode(); Item item = validateItem(firstItemCode); - /*容器类型:小件入库则入小件缓存区、大件入库则入大件缓存区*/ + /*容器类型:托盘*/ validateStockType(stock.getStockType()); /**验证起点点位*/ @@ -342,6 +293,8 @@ public class StockServiceImpl implements StockService { /**更新库存和点位状态*/ updateStockAndPoints(stock, srcPoint, endPoint); + agvTaskService.sendAgvTaskCCImpl(agvTask);//发送任务 + } @@ -387,6 +340,14 @@ public class StockServiceImpl implements StockService { if (allUnique) { throw new RuntimeException("箱号不能重复!"); } + + Set barNumbers = barCodeVos.stream().map(BarCodeVo::getBoxNumber).collect(Collectors.toSet()); + List asnDetails = asnDetailService.existsByboxNumber(barNumbers); + if (!asnDetails.isEmpty()) { + Set newBarNumbers = asnDetails.stream().map(AsnDetail::getOrderNumber).collect(Collectors.toSet()); + throw new RuntimeException("箱号已入库,请勿重复入库:" + newBarNumbers); + } + } private void validateStockType(String stockType) { @@ -403,68 +364,32 @@ public class StockServiceImpl implements StockService { } private AgvTask createAndSendAgvTask(Stock stock, Point srcPoint, Point endPoint) { - AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE"); - /*String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), agvTaskService.sendAgvTaskImplJson(agvTask)); - if (StringUtils.isEmpty(resultJson)) { - throw new RuntimeException("AGV返回信息:下发任务接口调用失败!"); - } - JSONObject resulObject = JSON.parseObject(resultJson); - if (resulObject == null) { - throw new RuntimeException("AGV返回信息:下发任务接口返回为空!"); - } - - String code = resulObject.getString("code"); - String message = resulObject.getString("message");*/ - String code = "0"; - String message = ""; - if (!"0".equals(code)) { - throw new RuntimeException("AGV返回信息:" + message); - } + AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "FORKLIFT_MOVE"); agvTaskService.create(agvTask); return agvTask; } public void createAsnDetailsAndItemKeysAndTasks(List barCodeVos, Item item, Stock stock, Point srcPoint, Point endPoint, AgvTask agvTask) { - ExecutorService executor = ThreadPoolExecutorUtil.getPoll("materialIn-job"); - try { - List createAsnDetails = new ArrayList<>(); - List createItemKeys = new ArrayList<>(); - List createAsnTasks = new ArrayList<>(); - for (BarCodeVo barCodeVo : barCodeVos) { - AsnDetail asnDetail = createAsnDetail(item, stock, srcPoint, barCodeVo.getPropC1(), barCodeVo.getBoxNumber(), barCodeVo.getPropC3(), Timestamp.valueOf(DateUtil.formatDateTime(DateUtil.parse(barCodeVo.getPropD1()))), barCodeVo.getOrderQty(), barCodeVo.getMo()); - createAsnDetails.add(asnDetail); - ItemKey itemKey = createItemKey(item, barCodeVo.getPropC1(), barCodeVo.getBoxNumber()); - createItemKeys.add(itemKey); - Task task = createAsnTask(item, itemKey, asnDetail, stock, srcPoint, endPoint, agvTask); - createAsnTasks.add(task); - } + List createAsnDetails = new ArrayList<>(); + List createAsnTasks = new ArrayList<>(); + for (BarCodeVo barCodeVo : barCodeVos) { + AsnDetail asnDetail = createAsnDetail(item, stock, srcPoint, barCodeVo.getPropC1(), barCodeVo.getBoxNumber(), barCodeVo.getPropC3(), Timestamp.valueOf(DateUtil.formatDateTime(DateUtil.parse(barCodeVo.getPropD1()))), barCodeVo.getOrderQty(), barCodeVo.getMo()); + createAsnDetails.add(asnDetail); + ItemKey itemKey = itemKeyService.getItemKey(item, barCodeVo.getPropC1(), barCodeVo.getBoxNumber()); - CompletableFuture asnDetailFuture = CompletableFuture.runAsync(() -> { - if (!createAsnDetails.isEmpty()) { - batchCreateOrUpdate.batchCreate(createAsnDetails); - } - }, executor); - - CompletableFuture itemKeyFuture = asnDetailFuture.thenRunAsync(() -> { - if (!createItemKeys.isEmpty()) { - batchCreateOrUpdate.batchCreate(createItemKeys); - } - }, executor); - - - CompletableFuture taskFuture = itemKeyFuture.thenRunAsync(() -> { - if (!createAsnTasks.isEmpty()) { - batchCreateOrUpdate.batchCreate(createAsnTasks); - } - }, executor); - - taskFuture.join(); - } catch (Exception e) { - throw new RuntimeException("创建任务失败!", e); - } finally { - executor.shutdown(); + Task task = createAsnTask(item, itemKey, asnDetail, stock, srcPoint, endPoint, agvTask); + createAsnTasks.add(task); } + if (!createAsnDetails.isEmpty()) { + batchCreateOrUpdate.batchInsert(createAsnDetails); + } + + if (!createAsnTasks.isEmpty()) { + batchCreateOrUpdate.batchInsert(createAsnTasks); + } + + } private AsnDetail createAsnDetail(Item item, Stock stock, Point srcPoint, String propC1, String boxNumber, String propC3, Timestamp propD1, double orderQty, String mo) { @@ -485,6 +410,7 @@ public class StockServiceImpl implements StockService { } private ItemKey createItemKey(Item item, String propC1, String orderNumber) { + ItemKey newItemKey = new ItemKey(); newItemKey.setItem(item); newItemKey.setDept(item.getDept()); @@ -515,16 +441,6 @@ public class StockServiceImpl implements StockService { return task; } - private void validateStockAndItem(Stock stock, Item item) { - if (item.getGoodType().contains("大件") || item.getGoodType().contains("小件")) { - if (!item.getGoodType().substring(0, 2).equals(stock.getStockType().substring(0, 2))) { - throw new RuntimeException("物料类型和容器类型不匹配!"); - } - } - - - } - private Map parseString(String QRCode) { //P:工厂;V:客户编号;M:物料编号/PCS;B:BYD批次;Lot:供应商批次号;S:工单编号;PO:采购订单/箱号;Q:数量;D:生产日期;YX:有效天数; // 使用分号分隔字符串 @@ -616,7 +532,7 @@ public class StockServiceImpl implements StockService { Point endPoint = endPointList.get(0); AgvTask agvTask = new AgvTask(BizStatus.Cp_Off_Line, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE"); agvTaskService.create(agvTask); - agvTaskService.sendAgvTaskImpl(agvTask); + agvTaskService.sendAgvTaskHJImpl(agvTask); endPoint.setStatus(BaseStatus.USED); pointRepository.save(endPoint); stock.setStatus(BaseStatus.USED); @@ -651,8 +567,8 @@ public class StockServiceImpl implements StockService { List agvTaskList = agvTaskRepository.findRepeat(emptyStock.getCode()); if (agvTaskList.isEmpty()) { AgvTask agvTask = new AgvTask(BizStatus.EMPTY_IN, emptyStock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE"); - agvTaskService.create(agvTask); - agvTaskService.sendAgvTaskImpl(agvTask); + agvTaskRepository.save(agvTask); + agvTaskService.sendAgvTaskHJImpl(agvTask); // 更新点位状态 endPoint.setStatus(BaseStatus.USED); @@ -778,9 +694,9 @@ public class StockServiceImpl implements StockService { } Point endPoint = endPointList.get(0); - AgvTask agvTask = new AgvTask(BizStatus.FB_RETURN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, ""); + AgvTask agvTask = new AgvTask(BizStatus.FB_RETURN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "FORKLIFT_MOVE"); agvTaskService.create(agvTask); - agvTaskService.sendAgvTaskImpl(agvTask); + agvTaskService.sendAgvTaskCCImpl(agvTask); } private Item validateItem(String itemCode) { @@ -831,10 +747,6 @@ public class StockServiceImpl implements StockService { } } - private void sendAgvTaskAndHandleResponse(AgvTask agvTask) { - agvTaskService.sendAgvTaskImpl(agvTask); - } - private void updateStockAndPoints(Stock stock, Point srcPoint, Point endPoint) { stock.setStatus(BaseStatus.USED); @@ -848,36 +760,6 @@ public class StockServiceImpl implements StockService { pointRepository.save(srcPoint); } - private void handleFullContainerCall(String itemCode, Point endPoint) { - Item item = validateItem(itemCode);//验证物料 - String endPointAreaCode = endPoint.getArea().getCode(); - //只允许叫料区叫满车 - if (!isValidMCJLArea(endPointAreaCode)) { - throw new RuntimeException(endPoint.getCode() + "点位不能叫满车!"); - } - - List inventoryList = inventoryService.findByItemIdAndAreaCode(item.getId(), item.getGoodType()); - if (inventoryList.isEmpty()) { - throw new RuntimeException(itemCode + "物料无库存,呼叫失败!"); - } - PickDetail pickDetail = pickDetailService.createPickDetail(item, ""); - try { - pickDetailService.allocateAll(pickDetail.getId(), endPoint, item.getGoodType()); - List taskList = taskService.findByPickNotAllTask(pickDetail.getId()); - AgvTask agvTask = taskList.get(0).getAgvTask(); - sendAgvTaskAndHandleResponse(agvTask); - endPoint.setStatus(BaseStatus.USED); - pointRepository.save(endPoint); - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); - } - - - } - - private boolean isValidMCJLArea(String areaCode) { - return AreaNameDic.JLQ.equals(areaCode); - } /** * 验证AGV返回信息 @@ -923,7 +805,7 @@ public class StockServiceImpl implements StockService { pointRepository.save(point); stock.setStatus(BaseStatus.FREE); stock.setPoint(point); - update(stock); + stockRepository.save(stock); } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/AsnDetailRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/AsnDetailRepository.java index 59e7608..61fff21 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/AsnDetailRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/AsnDetailRepository.java @@ -33,9 +33,9 @@ public interface AsnDetailRepository extends JpaRepository, Jpa @Query(value = " from AsnDetail ad WHERE ad.stock.code =:code and ad.status=:status ") AsnDetail findByStock(String code, String status); - @Query(value = " from AsnDetail ad WHERE ad.orderNumber =:orderNumber ") - List findByOrderNumber(String orderNumber); + @Query(value = " from AsnDetail ad WHERE ad.orderNumber in :orderNumber and ad.status not in('CANCEL') ") + List findByOrderNumber(Set orderNumber); - @Query(value = " FROM AsnDetail ad WHERE ad.stock.code =?1 and ad.status not in('RECEIVED') ") - List findByStockCode(String stockCode); + /* @Query(value = " FROM AsnDetail ad WHERE ad.stock.code =?1 and ad.status not in('RECEIVED') ") + List findByStockCode(String stockCode);*/ } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java index 3629f1a..54c67e8 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java @@ -92,15 +92,21 @@ public interface AgvTaskService { AgvTask toEntity(AgvTaskDto agvTaskDto); + /** + * 发送叉车搬运接口任务 + * + * @param agvTasks + * @return + */ + void sendAgvTaskCCImpl(AgvTask agvTasks); + /** * 发送货架搬运接口任务 * * @param agvTasks * @return */ - String sendAgvTaskImpl(AgvTask agvTasks); - - String sendAgvTaskImplJson(AgvTask agvTasks); + void sendAgvTaskHJImpl(AgvTask agvTasks); /** * 发送料箱搬运接口任务 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/AsnDetailService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/AsnDetailService.java index ac4b892..ca56b82 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/AsnDetailService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/AsnDetailService.java @@ -1,18 +1,18 @@ /* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.youchain.businessdata.service; import com.youchain.basicdata.domain.Item; @@ -27,67 +27,76 @@ import java.sql.Timestamp; import java.util.Map; import java.util.List; import java.io.IOException; +import java.util.Set; import javax.servlet.http.HttpServletResponse; /** -* @website https://eladmin.vip -* @description 服务接口 -* @author hjl -* @date 2023-08-14 -**/ + * @author hjl + * @website https://eladmin.vip + * @description 服务接口 + * @date 2023-08-14 + **/ public interface AsnDetailService { /** - * 查询数据分页 - * @param criteria 条件 - * @param pageable 分页参数 - * @return Map - */ - Map queryAll(AsnDetailQueryCriteria criteria, Pageable pageable); + * 查询数据分页 + * + * @param criteria 条件 + * @param pageable 分页参数 + * @return Map + */ + Map queryAll(AsnDetailQueryCriteria criteria, Pageable pageable); /** - * 查询所有数据不分页 - * @param criteria 条件参数 - * @return List - */ + * 查询所有数据不分页 + * + * @param criteria 条件参数 + * @return List + */ List queryAll(AsnDetailQueryCriteria criteria); /** * 根据ID查询 + * * @param id ID * @return AsnDetailDto */ AsnDetailDto findById(Long id); /** - * 创建 - * @param resources / - * @return AsnDetailDto - */ + * 创建 + * + * @param resources / + * @return AsnDetailDto + */ AsnDetailDto create(AsnDetail resources); /** - * 编辑 - * @param resources / - */ + * 编辑 + * + * @param resources / + */ void update(AsnDetail resources); /** - * 多选删除 - * @param ids / - */ + * 多选删除 + * + * @param ids / + */ void deleteAll(Long[] ids); /** - * 导出数据 - * @param all 待导出的数据 - * @param response / - * @throws IOException / - */ + * 导出数据 + * + * @param all 待导出的数据 + * @param response / + * @throws IOException / + */ void download(List all, HttpServletResponse response) throws IOException; /** - *dto转实体 + * dto转实体 + * * @param detailDto * @return */ @@ -95,6 +104,7 @@ public interface AsnDetailService { /** * 根据code查找容器 + * * @param code * @return */ @@ -102,13 +112,15 @@ public interface AsnDetailService { /** * 自动生成AsnDetail + * * @param item * @return */ - AsnDetail createAsnDetail(Item item, Stock stock, Point srcPoint, String propC1, String gdh, String propC3, Timestamp propD1,Double orderQty,String Po); + AsnDetail createAsnDetail(Item item, Stock stock, Point srcPoint, String propC1, String gdh, String propC3, Timestamp propD1, Double orderQty, String Po); /** * 容器入场自动生成AsnDetail + * * @param item * @return */ @@ -116,8 +128,9 @@ public interface AsnDetailService { /** * 根据Mo查找AsnDetail + * * @param boxNumber * @return */ - boolean existsByboxNumber(String boxNumber); + List existsByboxNumber(Set boxNumber); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/PickService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/PickService.java index 87bc0ff..70dee7b 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/PickService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/PickService.java @@ -116,7 +116,7 @@ public interface PickService { * * @param yclbl 原材料备料 */ - void materialBL(Yclbl yclbl); + void materialBL(Yclbl yclbl) ; /** * 根据出库单备料 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java index 9663457..6b59b5d 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java @@ -142,7 +142,7 @@ public class AgvTaskServiceImpl implements AgvTaskService { * @return */ @Override - public synchronized String sendAgvTaskImpl(AgvTask agvTasks) { + public synchronized void sendAgvTaskCCImpl(AgvTask agvTasks) { JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); @@ -152,30 +152,30 @@ public class AgvTaskServiceImpl implements AgvTaskService { objMap.put("missionCode", agvTasks.getId());//任务编号 objMap.put("missionType", agvTasks.getJobType());//货 架 ( 托 盘 ) 移动 RACK_MOVE objMap.put("viewBoardType", "");// - objMap.put("robotType", "LIFT");//机器人功能类型 - JSONArray robotModels = new JSONArray(); - objMap.put("robotModels", robotModels);//机器人具体型号 - JSONArray robotIds = new JSONArray(); - objMap.put("robotIds", robotIds);//机器人编号 + objMap.put("containerCode", agvTasks.getStockCode());// + objMap.put("robotType", "FORKLIFT");//机器人功能类型 objMap.put("priority", "1");//数值越小,优先级越高,默认是 1 - objMap.put("containerModelCode", "");//容器模型编码 - objMap.put("containerCode", "");// - objMap.put("templateCode", "");//作业流程模板编号 - objMap.put("lockRobotAfterFinish", false);//是否需要流程结束后机器人保持任务锁定状态 - objMap.put("unlockRobotId", "");//解锁当前小车的在上个任务的锁定状态 - objMap.put("unlockMissionCode", "");//当前小车的上一个任务 - objMap.put("idleNode", "");//作业流程完成后,指定机器人停放区域/点 JSONArray missionDataArray = new JSONArray(); JSONObject missionDataObj = new JSONObject(new LinkedHashMap<>()); Map missionDataMap = new LinkedHashMap<>(); missionDataMap.put("sequence", 1);//序号 - missionDataMap.put("containerCode", agvTasks.getStockCode());//容器编号 - missionDataMap.put("startPosition", agvTasks.getStartSlotCode());//起始点 - missionDataMap.put("startPositionType", "NODE_POINT");//作业位置类型:点位:NODE_POINT - missionDataMap.put("endPosition", agvTasks.getEndSlotCode());//目标点 - missionDataMap.put("endPositionType", "NODE_POINT");//作业位置类型:点位:NODE_POINT + missionDataMap.put("position", agvTasks.getStartSlotCode());//点位 + missionDataMap.put("nodeType", "NODE_POINT");// + missionDataMap.put("stackNumber", 0); + missionDataMap.put("actionConfirm", false); missionDataObj.putAll(missionDataMap); missionDataArray.add(missionDataObj); + + JSONObject missionDataObj2 = new JSONObject(new LinkedHashMap<>()); + Map missionDataMap2 = new LinkedHashMap<>(); + missionDataMap2.put("sequence", 2);//序号 + missionDataMap2.put("position", agvTasks.getEndSlotCode());//目标点 + missionDataMap2.put("nodeType", "NODE_SLOT");// + missionDataMap2.put("stackNumber", 0); + missionDataMap2.put("actionConfirm", false); + missionDataObj2.putAll(missionDataMap2); + missionDataArray.add(missionDataObj2); + objMap.put("missionData", missionDataArray); jsonObject.putAll(objMap); String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), jsonObject.toString()); @@ -200,50 +200,56 @@ public class AgvTaskServiceImpl implements AgvTaskService { agvTasks.setStartTime(new Timestamp(new Date().getTime())); update(agvTasks); } - - - return resultJson; } @Override - public String sendAgvTaskImplJson(AgvTask agvTasks) { + public synchronized void sendAgvTaskHJImpl(AgvTask agvTasks) { JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); Map objMap = new LinkedHashMap<>(); objMap.put("orgId", agvTasks.getId());//库存组织 ID objMap.put("requestId", agvTasks.getId());//请求 id objMap.put("missionCode", agvTasks.getId());//任务编号 - objMap.put("missionType", agvTasks.getJobType());//货 架 ( 托 盘 ) 移动 RACK_MOVE - objMap.put("viewBoardType", "");//上视识别类型;需要 IDENTIFY_REQUIRE 不需要NORMAL + objMap.put("viewBoardType", "");//IDENTIFY_REQUIRE objMap.put("robotType", "LIFT");//机器人功能类型 - JSONArray robotModels = new JSONArray(); - objMap.put("robotModels", robotModels);//机器人具体型号 - JSONArray robotIds = new JSONArray(); - objMap.put("robotIds", robotIds);//机器人编号 objMap.put("priority", "1");//数值越小,优先级越高,默认是 1 - objMap.put("containerModelCode", "");//容器模型编码 - objMap.put("containerCode", "");//容器编号 - objMap.put("templateCode", "");//作业流程模板编号 - objMap.put("lockRobotAfterFinish", false);//是否需要流程结束后机器人保持任务锁定状态 - objMap.put("unlockRobotId", "");//解锁当前小车的在上个任务的锁定状态 - objMap.put("unlockMissionCode", "");//当前小车的上一个任务 - objMap.put("idleNode", "");//作业流程完成后,指定机器人停放区域/点 JSONArray missionDataArray = new JSONArray(); JSONObject missionDataObj = new JSONObject(new LinkedHashMap<>()); Map missionDataMap = new LinkedHashMap<>(); missionDataMap.put("sequence", 1);//序号 - missionDataMap.put("containerCode", agvTasks.getStockCode());//容器编号 - missionDataMap.put("startPosition", agvTasks.getStartSlotCode());//起始点 - missionDataMap.put("startPositionType", "NODE_POINT");//作业位置类型:点位:NODE_POINT - missionDataMap.put("endPosition", agvTasks.getEndSlotCode());//目标点 - missionDataMap.put("endPositionType", "NODE_POINT");//作业位置类型:点位:NODE_POINT + missionDataMap.put("containerCode", agvTasks.getStockCode());//容器 + missionDataMap.put("startPosition", agvTasks.getStartSlotCode());//点位 + missionDataMap.put("startPositionType", "NODE_POINT");// + missionDataMap.put("endPosition", agvTasks.getEndSlotCode());//点位 + missionDataMap.put("endPositionType", "NODE_POINT");// missionDataObj.putAll(missionDataMap); missionDataArray.add(missionDataObj); objMap.put("missionData", missionDataArray); jsonObject.putAll(objMap); - return jsonObject.toString(); + String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission(), jsonObject.toString()); + if (StringUtils.isEmpty(resultJson)) { + throw new RuntimeException("AGV返回信息:下发任务接口调用失败!"); + } + JSONObject resulObject = JSON.parseObject(resultJson); + if (resulObject == null) { + throw new RuntimeException("AGV返回信息:下发任务接口返回为空!"); + } + + String code = resulObject.getString("code"); + String message = resulObject.getString("message"); + if (!"0".equals(code)) { + throw new RuntimeException("AGV返回信息:" + message); + } else { + agvTasks.setJobForce(agvTasks.getId().toString());//任务组 + agvTasks.setJobForceAsc((1)); + agvTasks.setStatus(BizStatus.ATCALL); + agvTasks.setJobMessage(resultJson); + agvTasks.setReqMessage(jsonObject.toString()); + agvTasks.setStartTime(new Timestamp(new Date().getTime())); + update(agvTasks); + } } @Override @@ -412,6 +418,7 @@ public class AgvTaskServiceImpl implements AgvTaskService { case "ARRIVED": break; case "UP_CONTAINER": + case "FORK_UP": handleUpContainer(agvTask, containerCode);//容器顶升 break; case "COMPLETED": diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AsnDetailServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AsnDetailServiceImpl.java index 614c509..e24a1aa 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AsnDetailServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AsnDetailServiceImpl.java @@ -33,12 +33,9 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; +import java.util.*; import java.io.IOException; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.LinkedHashMap; import cn.hutool.core.date.DateUtil; @@ -182,11 +179,7 @@ public class AsnDetailServiceImpl implements AsnDetailService { } @Override - public boolean existsByboxNumber(String boxNumber) { - List asnDetailList = asnDetailRepository.findByOrderNumber(boxNumber); - if (asnDetailList.size() > 0) { - return true; - } - return false; + public List existsByboxNumber(Set boxNumber) { + return asnDetailRepository.findByOrderNumber(boxNumber); } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/ItemKeyServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/ItemKeyServiceImpl.java index b49a029..f91b9c7 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/ItemKeyServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/ItemKeyServiceImpl.java @@ -49,7 +49,6 @@ public class ItemKeyServiceImpl implements ItemKeyService { private final ItemKeyRepository itemKeyRepository; private final ItemKeyMapper itemKeyMapper; - private final EntityManager entityManager; @Override public Map queryAll(ItemKeyQueryCriteria criteria, Pageable pageable) { @@ -128,7 +127,7 @@ public class ItemKeyServiceImpl implements ItemKeyService { newItemKey.setDept(item.getDept()); newItemKey.setPropC1(propC1); newItemKey.setOrderNumber(orderNumber); - create(newItemKey); + itemKeyRepository.save(newItemKey); return newItemKey; } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java index 2467839..a5f5436 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/PickServiceImpl.java @@ -17,6 +17,7 @@ package com.youchain.businessdata.service.impl; import com.youchain.RequestData.ItemDate; import com.youchain.RequestData.Yclbl; +import com.youchain.RequestData.ZcData; import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.repository.ItemRepository; @@ -35,6 +36,8 @@ import com.youchain.businessdata.service.PickService; import com.youchain.businessdata.service.dto.PickDto; import com.youchain.businessdata.service.dto.PickQueryCriteria; import com.youchain.businessdata.service.mapstruct.PickMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; @@ -44,7 +47,9 @@ import java.util.*; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -56,6 +61,7 @@ import java.util.stream.Collectors; **/ @Service @RequiredArgsConstructor +@Slf4j public class PickServiceImpl implements PickService { private final PickRepository pickRepository; @@ -173,7 +179,6 @@ public class PickServiceImpl implements PickService { } @Override - @Transactional(rollbackFor = Exception.class) public void materialBL(Yclbl yclbl) { /** 验证参数有效性 */ @@ -189,9 +194,10 @@ public class PickServiceImpl implements PickService { List createPickDetails = new ArrayList<>(); AtomicInteger lineNo = new AtomicInteger(1); - /** 遍历成品集合 */ String orderNo = yclbl.getOrderNo(); String taskCode = yclbl.getTaskCode(); + + /** 遍历成品集合 */ yclbl.getBlzc().forEach(zcData -> { Pick pick = createPick(orderNo, taskCode, lineNo.getAndIncrement(), zcData.getCompleteCode(), zcData.getStation()); createPicks.add(pick); @@ -211,17 +217,23 @@ public class PickServiceImpl implements PickService { createPickDetails.add(pickDetail); }); - - if (!createPicks.isEmpty()) { - pickRepository.saveAll(createPicks); + /** 批量插入 */ + try { + batchCreateOrUpdate.batchInsert(createPicks); + } catch (Exception e) { + throw new RuntimeException("出库单创建失败!", e); } - if (!createPickDetails.isEmpty()) { - pickDetailRepository.saveAll(createPickDetails); + try { + batchCreateOrUpdate.batchInsert(createPickDetails); + } catch (Exception e) { + throw new RuntimeException("出库单明细创建失败!", e); } + } + /** * 验证参数有效性 * @@ -342,7 +354,7 @@ public class PickServiceImpl implements PickService { } task.setAgvTask(agvTask); taskRepository.save(task); - agvTaskService.sendAgvTaskImpl(agvTask); + agvTaskService.sendAgvTaskCCImpl(agvTask); } /*更新出库单状态*/ pick.setStatus(BizStatus.PICKUP); diff --git a/youchain-system/src/main/java/com/youchain/config/thread/AsyncTaskExecutePool.java b/youchain-system/src/main/java/com/youchain/config/thread/AsyncTaskExecutePool.java index 4c45445..7452f2b 100644 --- a/youchain-system/src/main/java/com/youchain/config/thread/AsyncTaskExecutePool.java +++ b/youchain-system/src/main/java/com/youchain/config/thread/AsyncTaskExecutePool.java @@ -20,11 +20,13 @@ import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; /** * 异步任务线程池装配类 + * * @author https://juejin.im/entry/5abb8f6951882555677e9da2 * @date 2019年10月31日15:06:18 */ @@ -55,8 +57,8 @@ public class AsyncTaskExecutePool implements AsyncConfigurer { @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return (throwable, method, objects) -> { - log.error("===="+throwable.getMessage()+"====", throwable); - log.error("exception method:"+method.getName()); + log.error("====" + throwable.getMessage() + "====", throwable); + log.error("exception method:" + method.getName()); }; } } diff --git a/youchain-system/src/main/java/com/youchain/config/thread/ThreadPoolExecutorUtil.java b/youchain-system/src/main/java/com/youchain/config/thread/ThreadPoolExecutorUtil.java index 2400196..689f9a8 100644 --- a/youchain-system/src/main/java/com/youchain/config/thread/ThreadPoolExecutorUtil.java +++ b/youchain-system/src/main/java/com/youchain/config/thread/ThreadPoolExecutorUtil.java @@ -15,6 +15,8 @@ */ package com.youchain.config.thread; +import org.springframework.stereotype.Service; + import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; diff --git a/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java b/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java index 42331bd..df71370 100644 --- a/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java +++ b/youchain-system/src/main/java/com/youchain/utils/BatchCreateOrUpdate.java @@ -1,50 +1,68 @@ package com.youchain.utils; -import org.springframework.stereotype.Component; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; -@Component +@Service public class BatchCreateOrUpdate { @PersistenceContext private EntityManager entityManager; + //配置文件中每次批量提交的数量 + @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}") + private int batchSize; + /** - * 批量插入实体。 + * 批量插入 * - * @param entities 要插入的实体列表 - * @param 实体类型 + * @param list 实体类集合 + * @param 表对应的实体类 */ - @Transactional(rollbackFor = Exception.class) - public void batchCreate(List entities) { - if (entities == null || entities.isEmpty()) { + @Transactional + public void batchInsert(List list) { + if (list == null || list.isEmpty()) { return; } - for (T entity : entities) { - entityManager.persist(entity); + + for (int i = 0; i < list.size(); i++) { + entityManager.persist(list.get(i)); + if (i % batchSize == 0) { + entityManager.flush(); + entityManager.clear(); + } + entityManager.flush(); + entityManager.clear(); } } - /** - * 批量更新实体。 + * 批量更新 * - * @param entities 要更新的实体列表 - * @param 实体类型 + * @param list 实体类集合 + * @param 表对应的实体类 */ - @Transactional(rollbackFor = Exception.class) - public void batchUpdate(List entities) { - if (entities == null || entities.isEmpty()) { + @Transactional + public void batchUpdate(List list) { + if (list == null || list.isEmpty()) { return; } - - for (T entity : entities) { - entityManager.merge(entity); + for (int i = 0; i < list.size(); i++) { + entityManager.merge(list.get(i)); + if (i % batchSize == 0) { + entityManager.flush(); + entityManager.clear(); + } } + entityManager.flush(); + entityManager.clear(); } } diff --git a/youchain-system/src/main/resources/config/application.yml b/youchain-system/src/main/resources/config/application.yml index aee462d..b97f608 100644 --- a/youchain-system/src/main/resources/config/application.yml +++ b/youchain-system/src/main/resources/config/application.yml @@ -6,8 +6,8 @@ spring: freemarker: check-template-location: false profiles: - #active: prod - active: dev + active: prod + #active: dev jackson: time-zone: GMT+8 data: @@ -36,11 +36,11 @@ spring: redis: #数据库索引 database: ${REDIS_DB:2} - #host: ${REDIS_HOST:192.168.100.102} - #password: ${REDIS_PWD:123456} + host: ${REDIS_HOST:192.168.100.102} + password: ${REDIS_PWD:123456} - host: ${REDIS_HOST:localhost} - password: ${REDIS_PWD:} + #host: ${REDIS_HOST:localhost} + #password: ${REDIS_PWD:} port: ${REDIS_PORT:6379} #连接超时时间 timeout: 5000 diff --git a/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java b/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java index 8cc36ce..9ec1d96 100644 --- a/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java +++ b/youchain-system/src/test/java/com/youchain/EladminSystemApplicationTests.java @@ -65,18 +65,7 @@ public class EladminSystemApplicationTests { System.out.println("集合中不存在分配成功的信息!"); } - CompletableFuture asnDetailFuture = CompletableFuture.runAsync(() -> { - System.out.println("新增asnDetail"); - }); - CompletableFuture itemKeyFuture = asnDetailFuture.thenRunAsync(() -> { - System.out.println("新增itemKey"); - }); - - CompletableFuture taskFuture = itemKeyFuture.thenRunAsync(() -> { - System.out.println("新增task"); - }); - taskFuture.join(); Set barCodeVos = new HashSet<>();