package com.zy.acs.manager.core;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.zy.acs.manager.common.domain.TaskDto;
|
import com.zy.acs.manager.core.service.MainService;
|
import com.zy.acs.manager.core.service.MapService;
|
import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
|
import com.zy.acs.manager.manager.entity.*;
|
import com.zy.acs.manager.manager.enums.BusStsType;
|
import com.zy.acs.manager.manager.enums.LocStsType;
|
import com.zy.acs.manager.manager.enums.TaskStsType;
|
import com.zy.acs.manager.manager.enums.TaskTypeType;
|
import com.zy.acs.manager.manager.service.*;
|
import com.zy.acs.manager.system.controller.BaseController;
|
import com.zy.acs.manager.system.service.ConfigService;
|
import com.zy.acs.framework.common.Cools;
|
import com.zy.acs.framework.common.R;
|
import com.zy.acs.framework.common.SnowflakeIdWorker;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.List;
|
|
/**
|
* Created by vincent on 2023/6/20
|
*/
|
@RestController
|
@RequestMapping("/test")
|
public class TestController extends BaseController {
|
|
@Autowired
|
private BusService busService;
|
@Autowired
|
private MainService mainService;
|
@Autowired
|
private SnowflakeIdWorker snowflakeIdWorker;
|
@Autowired
|
private AgvModelService agvModelService;
|
@Autowired
|
private AgvService agvService;
|
@Autowired
|
private AgvDetailService agvDetailService;
|
@Autowired
|
private TaskService taskService;
|
@Autowired
|
private CodeService codeService;
|
@Autowired
|
private MapService mapService;
|
|
|
/*
|
TRUNCATE man_bus;
|
TRUNCATE man_task;
|
TRUNCATE man_action;
|
UPDATE man_loc SET loc_sts = 16 WHERE loc_sts = 18;
|
UPDATE man_loc SET loc_sts = 15 WHERE loc_sts = 17;
|
*/
|
|
@Value("${auto.move}")
|
private Boolean autoMove;
|
@Value("${auto.demo}")
|
private Boolean autoDemo;
|
@Value("${auto.demo1}")
|
private Boolean autoDemo1;
|
@Value("${auto.demo2}")
|
private Boolean autoDemo2;
|
@Value("${auto.size}")
|
private Integer autoSize;
|
@Autowired
|
private LocService locService;
|
@Autowired
|
private ConfigService configService;
|
|
// http://localhost:9090/test/auto/move
|
@GetMapping("/auto/move")
|
public R autoMove() {
|
this.autoMove = !this.autoMove;
|
return R.ok().add(Cools.add("autoMove", this.autoMove));
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
private void move1() throws InterruptedException {
|
if (!this.autoMove) { return; }
|
Agv agv = agvService.selectByUuid("1");
|
AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
|
if (taskService.count(new LambdaQueryWrapper<Task>()
|
.eq(Task::getAgvId, agv.getId())
|
.and(i -> {
|
i.eq(Task::getTaskSts, TaskStsType.WAITING.val())
|
.or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val())
|
.or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val());
|
})) > 0) {
|
return;
|
}
|
if (!agvService.judgeEnable(agv.getId())) {
|
return;
|
}
|
Code randomCode = this.getRandomCode(agvDetail);
|
if (null == randomCode) {
|
return;
|
}
|
if (mainService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
|
System.out.println(agv.getUuid() + "开始走行演示...");
|
}
|
}
|
// @Scheduled(cron = "0 */3 * * * ? ")
|
@Scheduled(cron = "0/1 * * * * ? ")
|
private void move2() throws InterruptedException {
|
if (!this.autoMove) { return; }
|
Agv agv = agvService.selectByUuid("2");
|
AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
|
if (taskService.count(new LambdaQueryWrapper<Task>()
|
.eq(Task::getAgvId, agv.getId())
|
.and(i -> {
|
i.eq(Task::getTaskSts, TaskStsType.WAITING.val())
|
.or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val())
|
.or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val());
|
})) > 0) {
|
return;
|
}
|
if (!agvService.judgeEnable(agv.getId())) {
|
return;
|
}
|
Code randomCode = this.getRandomCode(agvDetail);
|
if (null == randomCode) {
|
return;
|
}
|
if (mainService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
|
System.out.println(agv.getUuid() + "开始走行演示...");
|
}
|
}
|
|
public Code getRandomCode(AgvDetail agvDetail) {
|
Code startCode = codeService.getById(agvDetail.getRecentCode());
|
List<String> notInCodeList = new ArrayList<>();
|
notInCodeList.add("00000024");
|
notInCodeList.add("00000025");
|
notInCodeList.add("00000026");
|
notInCodeList.add("00000027");
|
notInCodeList.add("00000028");
|
notInCodeList.add("00000029");
|
notInCodeList.add("00000023");
|
notInCodeList.add("00000035");
|
List<Code> list = codeService.list(new LambdaQueryWrapper<Code>().notIn(Code::getData, notInCodeList));
|
Collections.shuffle(list);
|
for (Code endCode : list) {
|
List<String> pathList = mapService.validFeasibility(startCode, endCode);
|
if (pathList.size() >= 5) {
|
return endCode;
|
}
|
}
|
return list.stream().findFirst().orElse(null);
|
}
|
|
// http://localhost:9090/test/auto?size=1
|
@GetMapping("/auto")
|
public R auto(@RequestParam(value = "size", required = false) Integer size) {
|
if (null != size) {
|
this.autoSize = size;
|
}
|
this.autoDemo = !this.autoDemo;
|
return R.ok(Cools.add("autoDemo", this.autoDemo));
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
private void demo() throws InterruptedException {
|
if (!this.autoDemo) { return; }
|
int busLimit = configService.getVal("busLimit", Integer.class);
|
if (autoSize != null) {
|
busLimit = autoSize;
|
}
|
busLimit = 2;
|
AgvModel agvModel = agvModelService.list(new LambdaQueryWrapper<>()).stream().findFirst().orElse(null);
|
if (null != agvModel) {
|
busLimit = agvModel.getBackpack() * 2;
|
}
|
// 在库
|
int stock = 0;
|
List<Loc> stockList = locService.list(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getLocSts, LocStsType.STOCK.val())
|
.ge(Loc::getRow, 1)
|
.le(Loc::getRow, 2)
|
);
|
Collections.shuffle(stockList);
|
if (stockList.size() > busLimit) {
|
stockList = stockList.subList(0, busLimit);
|
}
|
stock = stockList.size();
|
if (stock == 0) { return;}
|
|
// 空闲
|
List<Loc> idleList = locService.list(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getLocSts, LocStsType.IDLE.val())
|
.ge(Loc::getRow, 1)
|
.le(Loc::getRow, 2)
|
);
|
Collections.shuffle(idleList);
|
if (idleList.size() > stock) {
|
idleList = idleList.subList(0, stock);
|
}
|
|
if (stockList.size() == idleList.size()) {
|
OpenBusSubmitParam param = new OpenBusSubmitParam();
|
param.setBatch("batchNo");
|
for (int i = 0; i < stock; i++) {
|
Loc stockLoc = stockList.get(i);
|
Loc idleLoc = idleList.get(i);
|
|
TaskDto taskDto = new TaskDto();
|
taskDto.setOriLoc(stockLoc.getLocNo());
|
taskDto.setDestLoc(idleLoc.getLocNo());
|
taskDto.setSeqNum(String.valueOf(snowflakeIdWorker.nextId()).substring(15, 19));
|
|
param.getTaskList().add(taskDto);
|
|
}
|
|
if (Cools.isEmpty(busService.selectBySts(BusStsType.RECEIVE, "autoDemo"))
|
&& Cools.isEmpty(busService.selectBySts(BusStsType.PROGRESS, "autoDemo"))
|
) {
|
mainService.generateBusAndTask(param, "autoDemo");
|
}
|
|
}
|
|
}
|
|
|
// http://localhost:9090/test/auto1?size=1
|
@GetMapping("/auto1")
|
public R auto1(@RequestParam(value = "size", required = false) Integer size) {
|
if (null != size) {
|
this.autoSize = size;
|
}
|
this.autoDemo1 = !this.autoDemo1;
|
return R.ok(Cools.add("autoDemo", this.autoDemo1));
|
}
|
|
@Scheduled(cron = "0/3 * * * * ? ")
|
private void demo1() throws InterruptedException {
|
if (!this.autoDemo1) { return; }
|
int busLimit = configService.getVal("busLimit", Integer.class);
|
if (autoSize != null) {
|
busLimit = autoSize;
|
}
|
// 在库
|
int stock = 0;
|
List<Loc> stockList = locService.list(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getLocSts, LocStsType.STOCK.val())
|
.ge(Loc::getRow, 1)
|
.le(Loc::getRow, 2)
|
);
|
Collections.shuffle(stockList);
|
if (stockList.size() > busLimit) {
|
stockList = stockList.subList(0, busLimit);
|
}
|
stock = stockList.size();
|
if (stock == 0) { return;}
|
|
// 空闲
|
List<Loc> idleList = locService.list(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getLocSts, LocStsType.IDLE.val())
|
.ge(Loc::getRow, 1)
|
.le(Loc::getRow, 2)
|
);
|
Collections.shuffle(idleList);
|
if (idleList.size() > stock) {
|
idleList = idleList.subList(0, stock);
|
}
|
|
if (stockList.size() == idleList.size()) {
|
OpenBusSubmitParam param = new OpenBusSubmitParam();
|
param.setBatch("batchNo");
|
for (int i = 0; i < stock; i++) {
|
Loc stockLoc = stockList.get(i);
|
Loc idleLoc = idleList.get(i);
|
|
TaskDto taskDto = new TaskDto();
|
taskDto.setOriLoc(stockLoc.getLocNo());
|
taskDto.setDestLoc(idleLoc.getLocNo());
|
taskDto.setSeqNum(String.valueOf(snowflakeIdWorker.nextId()).substring(15, 19));
|
|
param.getTaskList().add(taskDto);
|
|
}
|
|
if (Cools.isEmpty(busService.selectBySts(BusStsType.RECEIVE, "autoDemo1"))
|
&& Cools.isEmpty(busService.selectBySts(BusStsType.PROGRESS, "autoDemo1"))
|
) {
|
mainService.generateBusAndTask(param, "autoDemo1");
|
}
|
|
}
|
|
}
|
|
// http://localhost:9090/test/auto2?size=1
|
@GetMapping("/auto2")
|
public R auto2(@RequestParam(value = "size", required = false) Integer size) {
|
if (null != size) {
|
this.autoSize = size;
|
}
|
this.autoDemo2 = !this.autoDemo2;
|
return R.ok(Cools.add("autoDemo", this.autoDemo2));
|
}
|
|
@Scheduled(cron = "0/3 * * * * ? ")
|
private void demo2() throws InterruptedException {
|
if (!this.autoDemo2) { return; }
|
int busLimit = configService.getVal("busLimit", Integer.class);
|
if (autoSize != null) {
|
busLimit = autoSize;
|
}
|
// 在库
|
int stock = 0;
|
List<Loc> stockList = locService.list(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getLocSts, LocStsType.STOCK.val())
|
.ge(Loc::getRow, 3)
|
.le(Loc::getRow, 4)
|
);
|
Collections.shuffle(stockList);
|
if (stockList.size() > busLimit) {
|
stockList = stockList.subList(0, busLimit);
|
}
|
stock = stockList.size();
|
if (stock == 0) { return;}
|
|
// 空闲
|
List<Loc> idleList = locService.list(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getLocSts, LocStsType.IDLE.val())
|
.ge(Loc::getRow, 3)
|
.le(Loc::getRow, 4)
|
);
|
Collections.shuffle(idleList);
|
if (idleList.size() > stock) {
|
idleList = idleList.subList(0, stock);
|
}
|
|
if (stockList.size() == idleList.size()) {
|
OpenBusSubmitParam param = new OpenBusSubmitParam();
|
param.setBatch("batchNo");
|
for (int i = 0; i < stock; i++) {
|
Loc stockLoc = stockList.get(i);
|
Loc idleLoc = idleList.get(i);
|
|
TaskDto taskDto = new TaskDto();
|
taskDto.setOriLoc(stockLoc.getLocNo());
|
taskDto.setDestLoc(idleLoc.getLocNo());
|
taskDto.setSeqNum(String.valueOf(snowflakeIdWorker.nextId()).substring(15, 19));
|
|
param.getTaskList().add(taskDto);
|
|
}
|
|
if (Cools.isEmpty(busService.selectBySts(BusStsType.RECEIVE, "autoDemo2"))
|
&& Cools.isEmpty(busService.selectBySts(BusStsType.PROGRESS, "autoDemo2"))
|
) {
|
mainService.generateBusAndTask(param, "autoDemo2");
|
}
|
|
}
|
|
}
|
|
}
|