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