package com.zy.acs.manager.manager.controller;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.zy.acs.common.utils.GsonUtils;
|
import com.zy.acs.framework.common.Cools;
|
import com.zy.acs.framework.common.R;
|
import com.zy.acs.framework.common.SnowflakeIdWorker;
|
import com.zy.acs.framework.exception.CoolException;
|
import com.zy.acs.manager.common.constant.MapItemType;
|
import com.zy.acs.manager.common.domain.MapAgvDto;
|
import com.zy.acs.manager.common.domain.MapCodeDto;
|
import com.zy.acs.manager.common.domain.MapDto;
|
import com.zy.acs.manager.common.domain.MapRouteDto;
|
import com.zy.acs.manager.common.exception.BusinessException;
|
import com.zy.acs.manager.core.domain.BackpackDto;
|
import com.zy.acs.manager.core.service.MapService;
|
import com.zy.acs.manager.core.service.floyd.FloydNavigateService;
|
import com.zy.acs.manager.manager.controller.param.MapDataParam;
|
import com.zy.acs.manager.manager.controller.param.MapParam;
|
import com.zy.acs.manager.manager.controller.result.MapAgvVo;
|
import com.zy.acs.manager.manager.entity.Map;
|
import com.zy.acs.manager.manager.entity.*;
|
import com.zy.acs.manager.manager.enums.AgvStsType;
|
import com.zy.acs.manager.manager.enums.TaskStsType;
|
import com.zy.acs.manager.manager.mapper.MapMapper;
|
import com.zy.acs.manager.manager.service.*;
|
import com.zy.acs.manager.system.controller.BaseController;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.*;
|
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* Created by vincent on 2023/6/1
|
*/
|
@RestController
|
@RequestMapping("/api/map")
|
public class MapController extends BaseController {
|
|
@Autowired
|
private CodeService codeService;
|
@Autowired
|
private RouteService routeService;
|
@Autowired
|
private CodeGapService codeGapService;
|
@Autowired
|
private AgvService agvService;
|
@Autowired
|
private AgvDetailService agvDetailService;
|
@Autowired
|
private FloydNavigateService floydNavigateService;
|
@Autowired
|
private MapService mapService;
|
@Autowired
|
private TaskService taskService;
|
@Autowired
|
private MapMapper mapMapper;
|
@Autowired
|
private SnowflakeIdWorker snowflakeIdWorker;
|
@Autowired
|
private LocService locService;
|
|
@PreAuthorize("hasAuthority('manager:loc:list')")
|
@PostMapping("/data/fetch")
|
public R fetch(@RequestParam(required = false) Long zoneId, @RequestParam(required = false) Integer floor) {
|
// code
|
List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>().eq(Code::getStatus, 1));
|
List<MapItem> mapCodeItems = new ArrayList<>();
|
codeList.forEach(code -> {
|
MapItem mapItem = new MapItem();
|
mapItem.setType(MapItemType.POINT.toString());
|
mapItem.setNo(code.getData());
|
mapItem.setUuid(code.getUuid());
|
mapItem.setPositionX(code.getX());
|
mapItem.setPositionY(code.getY());
|
mapCodeItems.add(mapItem);
|
});
|
// common
|
Map activeMap = mapMapper.selectActive(zoneId, floor);
|
return R.ok().add(Cools
|
.add("point", GsonUtils.toJson(mapCodeItems))
|
.add("common", activeMap.getData())
|
);
|
}
|
|
@PreAuthorize("hasAuthority('manager:loc:update')")
|
@PostMapping("/data/save")
|
@Transactional
|
public R save(@RequestBody MapDataParam param) {
|
Date now = new Date();
|
Long userId = getLoginUserId();
|
// previous
|
Map previousMap = mapMapper.selectActive(param.getZoneId(), param.getFloor());
|
if (null != previousMap) {
|
previousMap.setActive(0);
|
previousMap.setUpdateTime(now);
|
previousMap.setUpdateBy(userId);
|
if (0 == mapMapper.updateById(previousMap)) {
|
throw new CoolException("Save Fail");
|
}
|
}
|
// current
|
Map map = new Map();
|
map.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
|
map.setZoneId(param.getZoneId());
|
map.setFloor(param.getFloor());
|
map.setData(GsonUtils.toJson(param.getItemList()));
|
map.setActive(1);
|
map.setUpdateBy(userId);
|
map.setCreateBy(userId);
|
if (0 == mapMapper.insert(map)) {
|
throw new CoolException("Save Fail");
|
}
|
return R.ok("Save Success");
|
}
|
|
@PostMapping("/shelf/group")
|
public R shelfGroup(@RequestParam(required = false) Integer row, @RequestParam(required = false) Integer bay) {
|
if (null == row || null == bay) {
|
return R.error();
|
}
|
List<Loc> locList = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getRow, row).eq(Loc::getBay, bay).orderByAsc(Loc::getLev));
|
return R.ok().add(locList);
|
}
|
|
@PostMapping("/agv/info")
|
public R agvInfo(@RequestParam(required = false) String agvNo) {
|
if (Cools.isEmpty(agvNo)) {
|
return R.error();
|
}
|
Agv agv = agvService.selectByUuid(agvNo);
|
AgvDetail agvDetail = agvDetailService.selectByAgvNo(agvNo);
|
MapAgvVo vo = new MapAgvVo();
|
vo.setAgvNo(agv.getUuid());
|
vo.setStatus(agv.getStatus());
|
if (null != agvDetail) {
|
vo.setOnline(agvService.judgeOnline(agvDetail.getAgvId()));
|
vo.setAgvStatus(agvDetail.getStatusDesc());
|
vo.setVol(String.valueOf(agvDetail.getVol()));
|
vo.setSoc(String.valueOf(agvDetail.getSoc()));
|
vo.setPos(agvDetail.getPos() != null && agvDetail.getPos() == 1);
|
vo.setCode(codeService.getById(agvDetail.getRecentCode()).getData());
|
vo.setDirection(agvDetail.getAgvAngle());
|
vo.setBackpack(GsonUtils.fromJsonToList(agvDetail.getBackpack(), BackpackDto.class));
|
}
|
List<Task> tasks = taskService.selectInSts(agv.getId(), TaskStsType.WAITING, TaskStsType.ASSIGN, TaskStsType.PROGRESS);
|
if (!Cools.isEmpty(tasks)) {
|
vo.setTaskIds(tasks.stream().map(Task::getId).collect(Collectors.toList()));
|
}
|
return R.ok().add(vo);
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@PreAuthorize("hasAuthority('map:save')")
|
@PostMapping("/save")
|
@Transactional
|
public R save(@RequestBody MapParam param) {
|
Date now = new Date();
|
|
// code -----------------------------------------------------------------
|
List<Code> codes = codeService.list();
|
List<Code> codeArr = param.getCodeArr();
|
for (Code code : codeArr) {
|
Code one = codeService.selectByData(code.getData());
|
if (one == null) {
|
if (!codeService.save(code)) {
|
throw new BusinessException(code.getData()+" save fail![Code]");
|
}
|
} else {
|
one.setUpdateTime(now);
|
if (!codeService.updateById(one)) {
|
throw new BusinessException(code.getData()+" update fail![Code]");
|
}
|
}
|
codes.removeIf(next -> code.getData().equals(next.getData()));
|
}
|
for (Code code : codes) {
|
if (!codeService.removeById(code.getId())) {
|
throw new BusinessException(code.getData()+" remove fail![Code]");
|
}
|
}
|
|
// code -----------------------------------------------------------------
|
// gap -----------------------------------------------------------------
|
List<Route> routes = routeService.list();
|
List<CodeGap> codeGaps = codeGapService.list();
|
|
List<MapParam.Route> routeArr = param.getRouteArr();
|
for (MapParam.Route paramRoute : routeArr) {
|
Code startCode = codeService.selectByData(paramRoute.getStartCode());
|
Code endCode = codeService.selectByData(paramRoute.getEndCode());
|
|
Route route = routeService.findByCodeOfBoth(startCode.getId(), endCode.getId());
|
if (route == null) {
|
route = new Route();
|
route.setUuid(startCode.getData()+"-"+endCode.getData());
|
route.setStartCode(startCode.getId());
|
route.setEndCode(endCode.getId());
|
route.setDirection(paramRoute.getType());
|
route.setCodeArr(JSON.toJSONString(Arrays.asList(startCode.getId(), endCode.getId())));
|
if (!routeService.save(route)) {
|
throw new BusinessException(route.getUuid()+" save fail![Route]");
|
}
|
} else {
|
route.setUpdateTime(now);
|
if (!routeService.updateById(route)) {
|
throw new BusinessException(route.getUuid()+" update fail![Route]");
|
}
|
}
|
|
Iterator<Route> iterator = routes.iterator();
|
while (iterator.hasNext()) {
|
Route next = iterator.next();
|
if ((next.getStartCode().equals(route.getStartCode()) && next.getEndCode().equals(route.getEndCode()))
|
|| (next.getStartCode().equals(route.getEndCode()) && next.getEndCode().equals(route.getStartCode()))) {
|
iterator.remove();
|
break;
|
}
|
}
|
|
|
CodeGap codeGap = codeGapService.findByCodeOfBoth(startCode.getId(), endCode.getId());
|
double distance = mapService.calculateDistance(startCode.getX(), startCode.getY(), endCode.getX(), endCode.getY());
|
if (null == codeGap) {
|
codeGap = new CodeGap();
|
codeGap.setCode0(startCode.getId());
|
codeGap.setCode1(endCode.getId());
|
codeGap.setDistance(distance);
|
if (!codeGapService.save(codeGap)) {
|
throw new BusinessException(route.getUuid()+" save fail![CodeGap]");
|
}
|
} else {
|
codeGap.setDistance(distance);
|
if (!codeGapService.updateById(codeGap)) {
|
throw new BusinessException(route.getUuid()+" update fail![CodeGap]");
|
}
|
}
|
|
Iterator<CodeGap> gapIterator = codeGaps.iterator();
|
while (gapIterator.hasNext()) {
|
CodeGap next = gapIterator.next();
|
if ((next.getCode0().equals(route.getStartCode()) && next.getCode1().equals(route.getEndCode()))
|
|| (next.getCode0().equals(route.getEndCode()) && next.getCode1().equals(route.getStartCode()))) {
|
gapIterator.remove();
|
break;
|
}
|
}
|
|
}
|
for (Route route : routes) {
|
if (!routeService.removeById(route.getId())) {
|
throw new BusinessException(route.getUuid()+" remove fail![Route]");
|
}
|
}
|
for (CodeGap codeGap : codeGaps) {
|
if (!codeGapService.removeById(codeGap.getId())) {
|
throw new BusinessException(codeGap.getId()+" remove fail![CodeGap]");
|
}
|
}
|
|
// agv -----------------------------------------------------------------
|
List<Agv> agvList = agvService.list();
|
List<MapParam.Agv> agvArr = param.getAgvArr();
|
for (MapParam.Agv agvParam : agvArr) {
|
if (Cools.isEmpty(agvParam.getPos())) {
|
throw new BusinessException(agvParam.getAgvNo() + " agv not in position!");
|
}
|
Code code = codeService.selectByData(agvParam.getPos());
|
Agv agv = agvService.selectByUuid(agvParam.getAgvNo());
|
if (agv == null) {
|
agv = new Agv();
|
agv.setAgvSts(AgvStsType.IDLE.val());
|
agv.setUuid(agvParam.getAgvNo());
|
agv.setStage(agvParam.getStage());
|
agv.setMemo(agvParam.getMemo());
|
if (!agvService.save(agv)) {
|
throw new BusinessException(agv.getUuid()+" save fail![Agv]");
|
}
|
agvDetailService.removeByAgvId(agv.getId());
|
AgvDetail agvDetail = new AgvDetail();
|
agvDetail.setAgvId(agv.getId());
|
agvDetail.setPos(1);
|
agvDetail.setCode(code.getId());
|
if (!agvDetailService.save(agvDetail)) {
|
throw new BusinessException(agv.getUuid()+" save fail![AgvDetail]");
|
}
|
} else {
|
agv.setStage(agvParam.getStage());
|
agv.setMemo(agvParam.getMemo());
|
agv.setUpdateTime(now);
|
if (!agvService.updateById(agv)) {
|
throw new BusinessException(agv.getUuid()+" update fail![Agv]");
|
}
|
AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
|
if (null == agvDetail) {
|
agvDetail = new AgvDetail();
|
agvDetail.setAgvId(agv.getId());
|
agvDetail.setPos(1);
|
agvDetail.setCode(code.getId());
|
if (!agvDetailService.save(agvDetail)) {
|
throw new BusinessException(agv.getUuid()+" save fail![AgvDetail]");
|
}
|
} else {
|
agvDetail.setPos(1);
|
agvDetail.setCode(code.getId());
|
agvDetail.setUpdateTime(now);
|
if (!agvDetailService.updateById(agvDetail)) {
|
throw new BusinessException(agv.getUuid()+" update fail![AgvDetail]");
|
}
|
}
|
}
|
|
agvList.removeIf(next -> agvParam.getAgvNo().equals(next.getUuid()));
|
}
|
for (Agv agv : agvList) {
|
if (!agvService.removeById(agv.getId())) {
|
throw new BusinessException(agv.getUuid()+" remove fail![Agv]");
|
}
|
}
|
|
|
floydNavigateService.generateMatrix();
|
return R.ok("保存成功");
|
}
|
|
@PreAuthorize("hasAuthority('map:load')")
|
@GetMapping("/load")
|
public R load() {
|
MapDto mapDto = new MapDto();
|
List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>().eq(Code::getStatus, 1));
|
for (Code code : codeList) {
|
MapCodeDto codeDto = new MapCodeDto();
|
codeDto.setData(code.getData());
|
codeDto.setScale(JSON.parseObject(code.getScale()));
|
codeDto.setX(code.getX());
|
codeDto.setY(code.getY());
|
codeDto.setMemo(code.getMemo());
|
mapDto.getCodeList().add(codeDto);
|
}
|
List<Route> routeList = routeService.list(new LambdaQueryWrapper<Route>().eq(Route::getStatus, 1));
|
for (Route route : routeList) {
|
MapRouteDto routeDto = new MapRouteDto();
|
routeDto.setUuid(route.getUuid());
|
routeDto.setStartCode(route.getStartCode$());
|
routeDto.setEndCode(route.getEndCode$());
|
routeDto.setDirection(route.getDirection());
|
mapDto.getRouteList().add(routeDto);
|
}
|
List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().ne(Agv::getAgvSts, AgvStsType.DISABLED.val()).eq(Agv::getStatus, 1));
|
for (Agv agv : agvList) {
|
AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
|
if (null == agvDetail) { continue; }
|
Code currCode = codeService.getById(agvDetail.getCode());
|
MapAgvDto agvDto = new MapAgvDto();
|
agvDto.setUuid(agv.getUuid());
|
agvDto.setCurrCode(currCode==null?null:currCode.getData());
|
agvDto.setStage(agv.getStage());
|
mapDto.getAgvList().add(agvDto);
|
}
|
return R.ok().add(mapDto);
|
}
|
|
}
|