From aaf1b546b30d3098cc08f9d8fb6fc4c61b43dfd9 Mon Sep 17 00:00:00 2001 From: "huojin\\hj" <982011> Date: Fri, 15 Aug 2025 09:36:10 +0800 Subject: [PATCH] no message --- application.pid | 1 - pom.xml | 8 +- .../appupdate/rest/NioF3AppController.java | 2 +- .../service/impl/NioF3AppServiceImpl.java | 16 +-- .../com/youchain/basicdata/domain/Point.java | 11 +- .../basicdata/repository/AreaRepository.java | 42 +++--- .../basicdata/repository/PointRepository.java | 46 +++--- .../basicdata/requset/PointImportReq.java | 20 +++ .../basicdata/rest/PointController.java | 15 +- .../basicdata/service/PointService.java | 15 ++ .../service/impl/PointServiceImpl.java | 133 +++++++++++++++++- .../com/youchain/businessdata/domain/Les.java | 4 + .../businessdata/inputJson/LesRequest.java | 1 + .../repository/LesRepository.java | 24 ++-- .../businessdata/service/dto/LesDto.java | 5 + .../service/impl/KMReServiceImpl.java | 5 +- .../service/impl/LesServiceImpl.java | 47 ++++--- .../service/impl/TaskServiceImpl.java | 3 - .../com/youchain/utils/SmartStringUtil.java | 40 ++++++ .../resources/config/application-prod.yml | 13 +- .../src/main/resources/config/application.yml | 15 +- 21 files changed, 352 insertions(+), 114 deletions(-) delete mode 100644 application.pid create mode 100644 youchain-system/src/main/java/com/youchain/basicdata/requset/PointImportReq.java create mode 100644 youchain-system/src/main/java/com/youchain/utils/SmartStringUtil.java diff --git a/application.pid b/application.pid deleted file mode 100644 index 8eafbc7..0000000 --- a/application.pid +++ /dev/null @@ -1 +0,0 @@ -186180 \ No newline at end of file diff --git a/pom.xml b/pom.xml index ec6a835..c33dba7 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,7 @@ org.apache.poi poi-ooxml - 5.2.0 + 4.1.2 xerces @@ -199,6 +199,12 @@ 6.11 + + + cn.idev.excel + fastexcel + 1.2.0 + diff --git a/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java b/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java index 3b6ee31..9871145 100644 --- a/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java +++ b/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java @@ -69,7 +69,7 @@ public class NioF3AppController { public ResponseEntity findByLinePoint(@RequestBody LinePoint linePoint) { try { List lesList = nioF3AppService.findByLinePoint(linePoint.getDstPositionCode()); - return new ResponseEntity<>(ApiResult.success(lesList), HttpStatus.OK); + return new ResponseEntity<>(lesList, HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(ApiResult.fail(e.getMessage()), HttpStatus.BAD_REQUEST); } diff --git a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java index 166933d..44f15d7 100644 --- a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java @@ -45,14 +45,14 @@ public class NioF3AppServiceImpl implements NioF3AppService { List lesList = validateLes(bindSmall.getSrcPositionCode(), bindSmall.getOnlineNo()); List lesIds = lesList.stream().map(Les::getId).collect(Collectors.toList()); - // 获取目标点位 - String endPointCode = getEndPointCode(lesList); + // 获取停靠点 + String beatCode = getBeatCode(lesList); AgvTask agvTask; synchronized (bindSmall.getSrcPositionCode().intern()) { // 验证起点是否有Agv任务 validateAgvTask(bindSmall.getSrcPositionCode()); // 生成任务 - agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindSmall.getSrcPositionCode(), endPointCode, "TUGGER"); + agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindSmall.getSrcPositionCode(), beatCode, "TUGGER"); // 绑定任务 bindLesAgvTask(agvTask.getId(), lesIds); } @@ -99,9 +99,9 @@ public class NioF3AppServiceImpl implements NioF3AppService { } } - private String getEndPointCode(List lesList) { + private String getBeatCode(List lesList) { return lesList.stream() - .map(Les::getDstPositionCode) // 提取目标字段 + .map(Les::getBeatCode) // 提取目标字段 .distinct() // 去重 .collect(Collectors.joining(",")); // 用逗号拼接字符串 } @@ -129,14 +129,14 @@ public class NioF3AppServiceImpl implements NioF3AppService { validateBoxNos(lesList, boxNos); //获取目标点位 - String endPointCode = getEndPointCode(lesList); + String beatCode = getBeatCode(lesList); AgvTask agvTask; synchronized (bindLarge.getSrcPositionCode().intern()) { // 验证起点是否有Agv任务 validateAgvTask(bindLarge.getSrcPositionCode()); // 生成任务 - agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindLarge.getSrcPositionCode(), endPointCode, "TUGGER"); + agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindLarge.getSrcPositionCode(), beatCode, "TUGGER"); // 绑定任务 bindLesAgvTask(agvTask.getId(), lesIds); } @@ -209,7 +209,7 @@ public class NioF3AppServiceImpl implements NioF3AppService { public List findByLinePoint(String dstPositionCode) { List lesList = lesRepository.findByLinePoint(dstPositionCode); if (lesList.isEmpty()) { - throw new BadRequestException("PDA扫描的停靠点未匹配到LES任务"); + throw new BadRequestException(dstPositionCode+"停靠点无任务"); } return lesList; } 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 f355bc7..657fa51 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 @@ -17,10 +17,14 @@ package com.youchain.basicdata.domain; import com.youchain.base.BaseEntity; import com.youchain.modules.system.domain.Dept; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import cn.hutool.core.bean.BeanUtil; import io.swagger.annotations.ApiModelProperty; import cn.hutool.core.bean.copier.CopyOptions; +import lombok.NoArgsConstructor; + import javax.persistence.*; import java.io.Serializable; @@ -30,8 +34,11 @@ import java.io.Serializable; * @author liuxue * @date 2023-07-26 **/ -@Entity @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity @Table(name="base_point") public class Point extends BaseEntity implements Serializable { @@ -58,7 +65,7 @@ public class Point extends BaseEntity implements Serializable { private String description; @Column(name = "`beat_code`") - @ApiModelProperty(value = "冷却区区域编码") + @ApiModelProperty(value = "停靠点") private String beatCode; @Column(name = "`item_code`") 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 47dbea3..655532b 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,34 @@ /* -* 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 com.youchain.basicdata.domain.Point; 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; /** -* @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 { + @Query("from Area area where area.enabled=true and area.name in :names") + List findByNames(List names); } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java b/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java index 068783c..2414267 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java @@ -1,21 +1,22 @@ /* -* 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.Point; +import com.youchain.basicdata.domain.Stock; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @@ -23,22 +24,27 @@ import org.springframework.data.jpa.repository.Query; import java.util.List; import java.util.Map; +import java.util.Set; /** -* @website https://eladmin.vip -* @author liuxue -* @date 2023-07-26 -**/ + * @author liuxue + * @website https://eladmin.vip + * @date 2023-07-26 + **/ public interface PointRepository extends JpaRepository, JpaSpecificationExecutor { - @Query(" from Point p where p.code = :code and p.enabled = true") + @Query("from Point p where p.code = :code and p.enabled = true") Point findByCode(String code); - @Query(" from Point p where p.enabled=true " + + @Query("from Point p where p.enabled=true " + "and (:code is null or p.code = :code) " + "and (:status is null or p.status = :status) " + "and (:type is null or p.type = :type) " + "and (:areaName is null or p.area.name = :areaName)") List queryPoints(String code, String status, String type, String areaName); + + + @Query("from Point point where point.enabled=true and point.code in :codes") + List findByCodes(List codes); } diff --git a/youchain-system/src/main/java/com/youchain/basicdata/requset/PointImportReq.java b/youchain-system/src/main/java/com/youchain/basicdata/requset/PointImportReq.java new file mode 100644 index 0000000..220978f --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/basicdata/requset/PointImportReq.java @@ -0,0 +1,20 @@ +package com.youchain.basicdata.requset; + +import cn.idev.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class PointImportReq { + + @ExcelProperty("库区名称") + private String name; + + @ExcelProperty("库位编码") + private String code; + + @ExcelProperty("停靠点") + private String beatCode; + + @ExcelProperty("类型") + private String type; +} 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 c6b883d..811568e 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 @@ -17,10 +17,8 @@ package com.youchain.basicdata.rest; import com.youchain.annotation.Log; import com.youchain.basicdata.domain.Point; -import com.youchain.basicdata.service.AreaService; import com.youchain.basicdata.service.PointService; import com.youchain.basicdata.service.dto.PointQueryCriteria; -import com.youchain.config.FileProperties; import com.youchain.exception.handler.ApiResult; import com.youchain.utils.*; import lombok.extern.slf4j.Slf4j; @@ -37,9 +35,6 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import javax.servlet.http.HttpServletResponse; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.OK; - /** * @author liuxue * @website https://eladmin.vip @@ -63,11 +58,15 @@ public class PointController { } @Log("导入点位") - @PostMapping(value = "/import_point") + @PostMapping(value = "/importPoint") @ApiOperation("导入点位") - @PreAuthorize("@el.check('point:importPoint')") public ResponseEntity importPoint(@RequestParam("file") MultipartFile multipartFile) { - return null; + try { + String result = pointService.importPoint(multipartFile); + return new ResponseEntity<>(ApiResult.success(result, null), HttpStatus.OK); + }catch (Exception e){ + return new ResponseEntity<>(ApiResult.fail(e.getMessage()), HttpStatus.BAD_REQUEST); + } } @GetMapping diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/PointService.java b/youchain-system/src/main/java/com/youchain/basicdata/service/PointService.java index 1cf95a8..821b7ae 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/PointService.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/PointService.java @@ -19,6 +19,8 @@ import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.service.dto.PointDto; import com.youchain.basicdata.service.dto.PointQueryCriteria; import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; + import java.util.Map; import java.util.List; import java.io.IOException; @@ -81,6 +83,13 @@ public interface PointService { */ void download(List all, HttpServletResponse response) throws IOException; + /** + * 导入点位 + * + * @param multipartFile 文件 + */ + String importPoint(MultipartFile multipartFile); + /** * 验证点位是否存在 * @@ -118,5 +127,11 @@ public interface PointService { */ Point queryPoint(String code, String status, String type, String areaName); + /** + * 批量查询点位 + * + * @param codes 点位集合 + */ + Map findByCodes(List codes); } 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 d926006..be629a5 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 @@ -15,8 +15,13 @@ */ package com.youchain.basicdata.service.impl; +import cn.idev.excel.FastExcel; +import com.youchain.basicdata.domain.Area; import com.youchain.basicdata.domain.Point; +import com.youchain.basicdata.repository.AreaRepository; +import com.youchain.basicdata.requset.PointImportReq; import com.youchain.exception.BadRequestException; +import com.youchain.modules.system.domain.Dept; import com.youchain.utils.*; import lombok.RequiredArgsConstructor; import com.youchain.basicdata.repository.PointRepository; @@ -25,15 +30,18 @@ import com.youchain.basicdata.service.dto.PointDto; import com.youchain.basicdata.service.dto.PointQueryCriteria; import com.youchain.basicdata.service.mapstruct.PointMapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; import java.util.*; import java.io.IOException; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; /** @@ -49,6 +57,7 @@ import javax.servlet.http.HttpServletResponse; public class PointServiceImpl implements PointService { private final PointRepository pointRepository; + private final AreaRepository areaRepository; private final PointMapper pointMapper; @Override @@ -122,7 +131,119 @@ public class PointServiceImpl implements PointService { } @Override - @Cacheable(key = "#position", unless = "#result == null") + @Transactional(rollbackFor = Exception.class) + public String importPoint(MultipartFile multipartFile) { + List dataList; + try { + dataList = FastExcel.read(multipartFile.getInputStream()).head(PointImportReq.class) + .sheet() + .doReadSync(); + } catch (IOException e) { + throw new BadRequestException("数据格式存在问题,无法读取"); + } + if (CollectionUtils.isEmpty(dataList)) { + throw new BadRequestException("数据为空"); + } + + //获取文件中所有库区名称 + List names = dataList.stream() + .map(PointImportReq::getName) + .distinct() + .collect(Collectors.toList()); + + //查找数据库中存在的库区 + List areaList = areaRepository.findByNames(names); + List exitingAreaNames = areaList.stream().map(Area::getName).collect(Collectors.toList()); + + //获取不存在的库区名称 + List diffAreaNames = SmartStringUtil.getDifference(names, exitingAreaNames); + if (!diffAreaNames.isEmpty()) { + throw new BadRequestException("WMS不存在的库区集合,请维护:" + diffAreaNames); + } + + Map existingAreaMap = areaList.stream().collect(Collectors.toMap(Area::getName, area -> area)); + + //获取文件中所有库位编码 + List codes = dataList.stream() + .map(PointImportReq::getCode) + .distinct() + .collect(Collectors.toList()); + + + //获取已存在的点位 + Map existingPointMap = this.findByCodes(codes); + + //新增容器集合 + List pointsToCreate = new ArrayList<>(); + + //修改容器集合 + List pointsToUpdate = new ArrayList<>(); + + for (PointImportReq pointImportReq : dataList) { + Area area = existingAreaMap.get(pointImportReq.getName()); + String code = pointImportReq.getCode(); + String type = pointImportReq.getType(); + String beatCode = pointImportReq.getBeatCode(); + //判断是否已存在容器 + if (existingPointMap.containsKey(code)) { + //修改容器 + Point point = existingPointMap.get(code); + pointsToUpdate.add(updatePoint(point, area, beatCode, type)); + } else { + //新增容器 + Point point = createPoint(code, beatCode, type, area, UserUtils.getDept()); + pointsToCreate.add(point); + existingPointMap.put(code, point); + } + } + + + //批量新增容器 + if (!pointsToCreate.isEmpty()) { + pointRepository.saveAll(pointsToCreate); + } + + //批量更新容器 + if (!pointsToUpdate.isEmpty()) { + pointRepository.saveAll(pointsToUpdate); + } + return ("导入成功:" + " 新增(" + pointsToCreate.size() + ")修改(" + pointsToUpdate.size() + ")"); + } + + private Point createPoint(String code, String beatCode, String type, Area area, Dept dept) { + if ("缓存点".equals(type)) { + type = BaseStatus.STORAGE; + + } else if ("线边点位".equals(type)) { + type = BaseStatus.BOX; + } + return Point.builder() + .code(code) + .name(code) + .status(BaseStatus.FREE) + .beatCode(beatCode) + .area(area) + .enabled(true) + .dept(dept) + .type(type) + .heat(0.0) + .build(); + } + + private Point updatePoint(Point point, Area area, String beatCode, String type) { + if ("缓存点".equals(type)) { + type = BaseStatus.STORAGE; + + } else if ("线边点位".equals(type)) { + type = BaseStatus.BOX; + } + point.setArea(area); + point.setBeatCode(beatCode); + point.setType(type); + return point; + } + + @Override public Point validatePoint(String position) { Point point = pointRepository.findByCode(position); if (point == null) { @@ -158,4 +279,14 @@ public class PointServiceImpl implements PointService { } return pointList.get(0); } + + @Override + public Map findByCodes(List codes) { + List pointList = pointRepository.findByCodes(codes); + Map pointMap = new HashMap<>(); + for (Point point : pointList) { + pointMap.put(point.getCode(), point); + } + return pointMap; + } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java b/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java index 44b51f0..e780750 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java @@ -71,6 +71,10 @@ public class Les extends BaseEntity implements Serializable { @ApiModelProperty(value = "终点库位") private String dstPositionCode; + @Column(name = "`beat_code`") + @ApiModelProperty(value = "停靠点") + private String beatCode; + @Column(name = "`dst_type`") @ApiModelProperty(value = "终点类型") private String dstType; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/inputJson/LesRequest.java b/youchain-system/src/main/java/com/youchain/businessdata/inputJson/LesRequest.java index daa1dab..b938337 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/inputJson/LesRequest.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/inputJson/LesRequest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; import java.util.List; /** * @description:LES入参 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java index 764190a..5fbbf8e 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java @@ -3,35 +3,37 @@ package com.youchain.businessdata.repository; import com.youchain.businessdata.domain.Les; import com.youchain.appupdate.response.LesTask; import org.springframework.data.jpa.repository.*; - -import javax.persistence.LockModeType; import java.util.List; public interface LesRepository extends JpaRepository, JpaSpecificationExecutor { - @Query(value = "select les from Les les where les.taskCode=:taskCode ") + @Query(value = "from Les les where les.taskCode=:taskCode ") Les findByTaskCode(String taskCode); - @Query(value = " from Les les where les.agvTaskId is null and les.onlineNo=:onlineNo and les.srcPositionCode=:srcPositionCode and les.status='OPEN' ") + @Query(value = "from Les les where les.srcPositionCode=:srcPositionCode and les.onlineNo=:onlineNo and les.agvTaskId is null and les.status='OPEN' ") List findByOnlineNo(String srcPositionCode, String onlineNo); - @Query(value = " from Les les where les.agvTaskId=:agvTaskId and les.dstPositionCode=:currentPositionCode and les.status='OPEN' ") - List findByAgvTaskId(Long agvTaskId, String currentPositionCode); + @Query(value = "from Les les where les.agvTaskId=:agvTaskId and les.beatCode=:beatCode and les.status='OPEN' ") + List findByAgvTaskId(Long agvTaskId, String beatCode); + + @Query(value = "from Les les where les.srcPositionCode=:srcPositionCode and les.boxNo in (:boxNos) and les.agvTaskId is null and les.status='OPEN' ") + List findByBoxNoAndPoint(String srcPositionCode, List boxNos); @Query(value = "select " + "new com.youchain.appupdate.response.LesTask(les.id,les.onlineNo,les.createTime," + "les.routeCode,les.dstPositionCode,les.boxNo,les.materialCode,les.caseNum) " + "from Les les " + "where les.agvTaskId > 0 " + - "and les.dstPositionCode = :dstPositionCode " + + "and les.beatCode = :beatCode " + "and les.status = 'ARRIVED'") - List findByLinePoint(String dstPositionCode); - - @Query(value = " from Les les where les.agvTaskId is null and les.srcPositionCode=:srcPositionCode and les.boxNo in (:boxNos) and les.status='OPEN' ") - List findByBoxNoAndPoint(String srcPositionCode, List boxNos); + List findByLinePoint(String beatCode); @Modifying @Query("update Les set agvTaskId = :agvTaskId where id in :ids") void batchUpdateAgvTaskId(Long agvTaskId,List ids); + @Modifying + @Query("update Les set status = :status,arrivedTime=now() where id in :lesIds") + void batchUpdateStatus(String status,List lesIds); + } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesDto.java b/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesDto.java index 7c98e6c..f0c743a 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesDto.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesDto.java @@ -1,7 +1,9 @@ package com.youchain.businessdata.service.dto; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.persistence.Column; import java.sql.Timestamp; @Data @@ -41,6 +43,9 @@ public class LesDto { //终点库位 private String dstPositionCode; + //停靠点 + private String beatCode; + //终点类型 private String dstType; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java index e3a5309..5f73eda 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java @@ -489,15 +489,12 @@ public class KMReServiceImpl implements KMReService { * @param agvTask 任务 */ private void handleArrivedContainer(AgvTask agvTask, String currentPosition) { - // 验证当前点位 - pointService.validatePoint(currentPosition); // 记录当前节点 lesService.arrivedLes(agvTask.getId(), currentPosition); - agvTask.setStatus(BizStatus.ARRIVED); // 更新点位路径 updateSlotCode(agvTask, currentPosition); - + agvTask.setStatus(BizStatus.ARRIVED); agvTaskService.update(agvTask); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java index 909583b..b1e195f 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java @@ -2,6 +2,7 @@ package com.youchain.businessdata.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.service.PointService; import com.youchain.businessdata.domain.Les; import com.youchain.businessdata.inputJson.LesRequest; @@ -17,6 +18,7 @@ import com.youchain.modules.system.repository.DictRepository; import com.youchain.utils.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataAccessException; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -24,9 +26,11 @@ import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.sql.SQLIntegrityConstraintViolationException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; @Service @Slf4j @@ -107,21 +111,22 @@ public class LesServiceImpl implements LesService { //验证参数有效性 validateParams(lesRequest); + //目标库位 + Point dstPoint = validatePositionCode(lesRequest); + //验证任务是否存在 String taskCode = lesRequest.getTaskCode(); validateLes(taskCode); - String materialCode = lesRequest.getMaterialCode();//物料代码 //有物料走料箱上线场景;无物料走其余场景 if (StringUtils.isNotEmpty(materialCode)) { try { - createLes(lesRequest); + createLes(lesRequest, dstPoint); } catch (Exception e) { throw new BadRequestException(taskCode + "任务号系统已接收,请勿重复操作"); } - } else { //直接转发给AGV sendLesTask(JSON.toJSONString(lesRequest)); @@ -188,15 +193,10 @@ public class LesServiceImpl implements LesService { public void arrivedLes(Long agvTaskId, String currentPositionCode) { List lesList = lesRepository.findByAgvTaskId(agvTaskId, currentPositionCode); if (lesList.isEmpty()) { - throw new BadRequestException("系统未识别到任务"); - } - for (Les les : lesList) { - les.setStatus(BizStatus.ARRIVED); - les.setArrivedTime(new Timestamp(new Date().getTime())); - } - if (!lesList.isEmpty()) { - lesRepository.saveAll(lesList); + throw new BadRequestException(currentPositionCode + "停靠点未识别到任务"); } + List lesIds = lesList.stream().map(Les::getId).collect(Collectors.toList()); + lesRepository.batchUpdateStatus(BizStatus.ARRIVED,lesIds); } /** @@ -225,18 +225,22 @@ public class LesServiceImpl implements LesService { if (lesRequest.getPositionCodePath() == null || lesRequest.getPositionCodePath().isEmpty() || lesRequest.getPositionCodePath().size() < 2) { throw new BadRequestException("节点不能为空且长度至少为2"); } - - //节点集合 - List positionCodes = lesRequest.getPositionCodePath(); - //验证起点 - PositionCodeRequest srcPosition = positionCodes.get(0); - pointService.validatePoint(srcPosition.getPositionCode()); - //验证目标库位 - PositionCodeRequest dstPosition = positionCodes.get(1); - pointService.validatePoint(dstPosition.getPositionCode()); } } + private Point validatePositionCode(LesRequest lesRequest) { + //节点集合 + List positionCodes = lesRequest.getPositionCodePath(); + //验证起点 + PositionCodeRequest srcPosition = positionCodes.get(0); + pointService.validatePoint(srcPosition.getPositionCode()); + //验证目标库位 + PositionCodeRequest dstPosition = positionCodes.get(1); + pointService.validatePoint(dstPosition.getPositionCode()); + return pointService.validatePoint(dstPosition.getPositionCode()); + } + + /** * 验证任务号是否存在 * @@ -250,7 +254,7 @@ public class LesServiceImpl implements LesService { } @Transactional(rollbackFor = Exception.class) - public void createLes(LesRequest lesRequest) { + public void createLes(LesRequest lesRequest, Point dstPoint) { //节点集合 List positionCodes = lesRequest.getPositionCodePath(); //起点对象 @@ -271,6 +275,7 @@ public class LesServiceImpl implements LesService { .srcType(srcPosition.getType()) .dstPositionCode(dstPosition.getPositionCode()) .dstType(dstPosition.getType()) + .beatCode(dstPoint.getBeatCode()) .build(); lesRepository.save(les); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java index d0c63d9..c14f69b 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java @@ -19,11 +19,8 @@ package com.youchain.businessdata.service.impl; import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Stock; -import com.youchain.basicdata.service.StockService; import com.youchain.businessdata.domain.*; -import com.youchain.businessdata.repository.PickDetailRepository; import com.youchain.businessdata.service.*; -import com.youchain.exception.BadRequestException; import com.youchain.utils.*; import com.youchain.businessdata.repository.TaskRepository; import com.youchain.businessdata.service.dto.TaskDto; diff --git a/youchain-system/src/main/java/com/youchain/utils/SmartStringUtil.java b/youchain-system/src/main/java/com/youchain/utils/SmartStringUtil.java new file mode 100644 index 0000000..0e3a336 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/utils/SmartStringUtil.java @@ -0,0 +1,40 @@ +package com.youchain.utils; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class SmartStringUtil { + /** + * 获取两个列表的相同的元素 + * + * @param list1 第一个列表 + * @param list2 第二个列表 + * @return 相同元素 + */ + public static List getIntersection(List list1, List list2) { + return list1.stream() + .filter(list2::contains) + .collect(Collectors.toList()); + } + + /** + * 找到 list1 中存在但 list2 中不存在的元素 + * + * @param list1 第一个列表 + * @param list2 第二个列表 + * @return 不同 + */ + public static List getDifference(List list1, List list2) { + Set existingLocationCodesSet = new HashSet<>(list2); + return list1.stream() + .filter(code -> !existingLocationCodesSet.contains(code)) + .collect(Collectors.toList()); + } + + public static boolean containsAllIgnoreCase(List requiredColumns, List headers) { + Set headersSet = new HashSet<>(headers); + return headersSet.containsAll(requiredColumns); + } +} diff --git a/youchain-system/src/main/resources/config/application-prod.yml b/youchain-system/src/main/resources/config/application-prod.yml index 353e555..af62e22 100644 --- a/youchain-system/src/main/resources/config/application-prod.yml +++ b/youchain-system/src/main/resources/config/application-prod.yml @@ -4,7 +4,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.0.159}:${DB_PORT:3306}/${DB_NAME:nio_wms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false + url: jdbc:log4jdbc:mysql://${DB_HOST:47.117.45.79}:${DB_PORT:3306}/${DB_NAME:nio_wms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false username: ${DB_USER:root} password: ${DB_PWD:Youchain@56} # 初始连接数 @@ -45,7 +45,7 @@ spring: enabled: true # 记录慢SQL log-slow-sql: true - slow-sql-millis: 1000 + slow-sql-millis: 10000 merge-sql: true wall: config: @@ -119,17 +119,14 @@ file: path: ~/file/ avatar: ~/avatar/ linux: - path: /home/eladmin/file/ - avatar: /home/eladmin/avatar/ + path: /home/f3/eladmin/file/ + avatar: /home/f3/eladmin/avatar/ windows: path: C:\eladmin\file\ avatar: C:\eladmin\avatar\ # 文件大小 /M - maxSize: 100 + maxSize: 200 avatarMaxSize: 5 minidao: base-package: org.jeecg.modules.jmreport.desreport.dao* db-type: mysql -task: - onOff: - zCJXBTask: false diff --git a/youchain-system/src/main/resources/config/application.yml b/youchain-system/src/main/resources/config/application.yml index 9a4528c..9ca521e 100644 --- a/youchain-system/src/main/resources/config/application.yml +++ b/youchain-system/src/main/resources/config/application.yml @@ -6,7 +6,7 @@ spring: freemarker: check-template-location: false profiles: - active: dev + active: prod jackson: time-zone: GMT+8 data: @@ -35,13 +35,14 @@ spring: redis: #数据库索引 - database: ${REDIS_DB:3} - #host: ${REDIS_HOST:192.168.0.159} - #password: ${REDIS_PWD:} - #port: ${REDIS_PORT:6379} + database: ${REDIS_DB:1} + host: ${REDIS_HOST:47.117.45.79} + password: ${REDIS_PWD:123456} + + #database: ${REDIS_DB:3} + #host: ${REDIS_HOST:127.0.0.1} + #password: ${REDIS_PWD:} - host: ${REDIS_HOST:127.0.0.1} - password: ${REDIS_PWD:} port: ${REDIS_PORT:6379} #连接超时时间 timeout: 5000