Browse Source

展会接口

master
yuliang 5 months ago
parent
commit
3e8afc8641
  1. 26
      servo/src/main/java/com/galaxis/rcs/common/entity/ApiTask.java
  2. 68
      servo/src/main/java/com/galaxis/rcs/common/query/QApiTask.java
  3. 319
      servo/src/main/java/com/yvan/workbench/controller/ApiController.java
  4. 253
      servo/src/main/java/com/yvan/workbench/controller/RR.java
  5. 1
      servo/src/main/resources/application.yml
  6. 2
      servo/src/test/java/com/yvan/workbench/BaseTest.java
  7. 2
      servo/src/test/java/com/yvan/workbench/CodegenTest.java

26
servo/src/main/java/com/galaxis/rcs/common/entity/ApiTask.java

@ -0,0 +1,26 @@
package com.galaxis.rcs.common.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 接口任务(api_task)
*/
@Data
public class ApiTask implements Serializable {
/** 任务id */
private Long taskId;
/** 环境id */
private Long envId;
/** 任务类型 0 入库 1 出库 2礼品出库 3礼品回库 */
private Integer taskType;
/** 任务状态 0创建 1执行中 2完成 3错误 4取消 */
private Integer taskStatus;
/** 托盘号 */
private String lpn;
/** 创建时间 */
private Date createAt;
/** */
private Date updateAt;
}

68
servo/src/main/java/com/galaxis/rcs/common/query/QApiTask.java

@ -0,0 +1,68 @@
package com.galaxis.rcs.common.query;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.*;
import com.querydsl.sql.*;
import java.sql.Types;
import com.galaxis.rcs.common.entity.ApiTask;
import java.util.Date;
/**
* 接口任务(api_task)
*/
@SuppressWarnings("ALL")
public class QApiTask extends RelationalPathBase<ApiTask> {
/** api_task表 */
public static final QApiTask apiTask = new QApiTask("api_task");
/** 任务id */
public final NumberPath<Long> taskId = createNumber("taskId", Long.class);
/** 环境id */
public final NumberPath<Long> envId = createNumber("envId", Long.class);
/** 任务类型 0 入库 1 出库 2礼品出库 3礼品回库 */
public final NumberPath<Integer> taskType = createNumber("taskType", Integer.class);
/** 任务状态 0创建 1执行中 2完成 3错误 4取消 */
public final NumberPath<Integer> taskStatus = createNumber("taskStatus", Integer.class);
/** 托盘号 */
public final StringPath lpn = createString("lpn");
/** 创建时间 */
public final DateTimePath<Date> createAt = createDateTime("createAt", Date.class);
/** */
public final DateTimePath<Date> updateAt = createDateTime("updateAt", Date.class);
public QApiTask(String variable) {
super(ApiTask.class, forVariable(variable), "rcs2_tw_zhanghui", "api_task");
addMetadata();
}
public QApiTask(String variable, String schema, String table) {
super(ApiTask.class, forVariable(variable), schema, table);
addMetadata();
}
public QApiTask(String variable, String schema) {
super(ApiTask.class, forVariable(variable), schema, "api_task");
addMetadata();
}
public QApiTask(Path<? extends ApiTask> path) {
super(path.getType(), path.getMetadata(), "rcs2_tw_zhanghui", "api_task");
addMetadata();
}
public QApiTask(PathMetadata metadata) {
super(ApiTask.class, metadata, "rcs2_tw_zhanghui", "api_task");
addMetadata();
}
private void addMetadata() {
addMetadata(taskId, ColumnMetadata.named("task_id").withIndex(1).ofType(Types.BIGINT).withSize(19));
addMetadata(envId, ColumnMetadata.named("env_id").withIndex(2).ofType(Types.BIGINT).withSize(19));
addMetadata(taskType, ColumnMetadata.named("task_type").withIndex(3).ofType(Types.INTEGER).withSize(10));
addMetadata(taskStatus, ColumnMetadata.named("task_status").withIndex(4).ofType(Types.INTEGER).withSize(10));
addMetadata(lpn, ColumnMetadata.named("lpn").withIndex(5).ofType(Types.VARCHAR).withSize(64));
addMetadata(createAt, ColumnMetadata.named("create_at").withIndex(6).ofType(Types.TIMESTAMP).withSize(3));
addMetadata(updateAt, ColumnMetadata.named("update_at").withIndex(7).ofType(Types.TIMESTAMP).withSize(3));
}
}

319
servo/src/main/java/com/yvan/workbench/controller/ApiController.java

@ -0,0 +1,319 @@
package com.yvan.workbench.controller;
import com.galaxis.rcs.inv.InvManager;
import com.querydsl.core.util.StringUtils;
import org.clever.core.Conv;
import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL;
import org.clever.web.mvc.annotation.RequestBody;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import static com.galaxis.rcs.common.query.QLccBasContainer.lccBasContainer;
import static com.galaxis.rcs.common.query.QLccBasLocation.lccBasLocation;
import static com.galaxis.rcs.common.query.QLccInvLpn.lccInvLpn;
import static com.galaxis.rcs.common.query.QApiTask.apiTask;
/**
* 接口
*/
public class ApiController {
private final static String catalogCode = "f1";
private final static String projectUUID = "tw_zh";
private final static long envId = 13;
private final static String inPos = "504_506";
private final static String outPos = "504_503";
// 礼品托盘
private final static String giftLpn = "GLPN";
// 礼品托盘位
private final static String gifPos = "500_500";
static final QueryDSL queryDSL = DaoFactory.getQueryDSL();
private static final AtomicBoolean cl2Running = new AtomicBoolean(false);
private static final AtomicBoolean clxRunning = new AtomicBoolean(false);
private final static Thread cl2DemoTask = new Thread(() -> {
String gstore = "504_501";
String agvId = "1";
String[] demoLocList = {"rack1/0/1/0", "rack1/1/1/0", "rack1/2/1/0", "rack1/3/1/0"};
while (true) {
if (!cl2Running.get()) {
continue;
}
// 查询车上是否有托盘
long aInvCount = queryDSL.select(lccInvLpn).from(lccInvLpn)
.where(lccInvLpn.locCode.eq(agvId)
.and(lccInvLpn.qty.gt(0))
.and(lccInvLpn.envId.eq(envId)))
.fetchCount();
// 查询地堆上是否有托盘
long gInvCount = queryDSL.select(lccInvLpn).from(lccInvLpn)
.where(lccInvLpn.locCode.eq(gstore)
.and(lccInvLpn.qty.gt(0))
.and(lccInvLpn.envId.eq(envId)))
.fetchCount();
List<String> emptyLocList = queryDSL.select(lccBasLocation.locCode).from(lccBasLocation)
.where(lccBasLocation.locCode.in(demoLocList).and(lccBasLocation.envId.eq(envId)))
.where(lccBasLocation.locCode.notIn(
queryDSL.select(lccInvLpn.locCode).from(lccInvLpn)
.where(lccInvLpn.qty.gt(0).and(lccInvLpn.envId.eq(envId))
))).fetch();
// if (gInvCount <= 0) {
// emptyLocList.add(gstore);
// }
Map<String, Object> params = new HashMap<>();
params.put("projectUUID", "tw_zh");
params.put("envId", envId);
params.put("agvId", agvId);
try {
if (aInvCount >= 1) {
// 随机一个可用货位
double a = Math.random() * emptyLocList.size();
String locCode = emptyLocList.get(Conv.asInteger(a));
params.put("targetStoreLoc", locCode);
RcsController.agvUnload(params);
RcsController.waitTaskFinish(params);
Thread.sleep(1000);
} else {
// 如果入库口有托盘
long gInboundInvCount = queryDSL.select(lccInvLpn).from(lccInvLpn)
.where(lccInvLpn.locCode.eq(inPos)
.and(lccInvLpn.qty.gt(0))
.and(lccInvLpn.envId.eq(envId)))
.fetchCount();
if (gInboundInvCount >= 1) {
double a = Math.random() * emptyLocList.size();
String locCode = emptyLocList.get(Conv.asInteger(a));
params.put("fromStoreLoc", inPos);
params.put("targetStoreLoc", locCode);
RcsController.agvCarry(params);
RcsController.waitTaskFinish(params);
Thread.sleep(1000);
} else if (gInvCount >= 1){
double a = Math.random() * emptyLocList.size();
String locCode = emptyLocList.get(Conv.asInteger(a));
params.put("fromStoreLoc", gstore);
params.put("targetStoreLoc", locCode);
RcsController.agvCarry(params);
RcsController.waitTaskFinish(params);
Thread.sleep(1000);
} else {
}
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
private final static Thread clxDemoTask = new Thread(() -> {
String gstore = "500_500";
String agvId = "2";
String[] demoLocList = {"rack1/0/2/0", "rack1/1/2/0", "rack1/2/2/0", "rack1/3/2/0"};
while (true) {
if (!clxRunning.get()) {
continue;
}
}
});
public static RR<?> in_bound(@RequestBody Map<String, Object> params) {
//"pos": "1",
//"lpn": "托盘号,可以为空",
//"car_no": "cl2"
String pos = Conv.asString(params.get("pos"));
String lpn = Conv.asString(params.get("lpn"));
String carNo = Conv.asString(params.get("car_no"));
lpn = queryDSL.select(lccBasContainer.lpn).from(lccBasContainer)
.where(lccBasContainer.envId.eq(envId).and(lccBasContainer.containerType.eq("pallet")))
.where(lccBasContainer.lpn.notIn(
queryDSL.select(lccInvLpn.lpn).from(lccInvLpn)
.where(lccInvLpn.envId.eq(envId).and(lccInvLpn.qty.gt(0)))
)).fetchFirst();
if (StringUtils.isNullOrEmpty(lpn)) {
return RR.fail("当前库存已满,无法入库");
}
try {
InvManager.invSave(envId, 0L, lpn, inPos, 1);
} catch (Exception e) {
return RR.fail("当前入库位有货,无法入库");
}
queryDSL.insert(apiTask)
.set(apiTask.envId, envId)
.set(apiTask.taskType, 0)
.set(apiTask.taskStatus, 0)
.set(apiTask.lpn, lpn).execute();
return RR.success();
}
// 出库
public static RR<?> out_bound(@RequestBody Map<String, Object> params) {
//"pos": "1",
//"lpn": "托盘号,可以为空",
//"car_no": "cl2"
String pos = Conv.asString(params.get("pos"));
String lpn = Conv.asString(params.get("lpn"));
String carNo = Conv.asString(params.get("car_no"));
long count = queryDSL.select(lccInvLpn).from(lccInvLpn)
.innerJoin(lccBasContainer).on(lccInvLpn.lpn.eq(lccBasContainer.lpn))
.where(lccInvLpn.envId.eq(envId).and(lccBasContainer.containerType.eq("pallet")))
.fetchCount();
if (count < 2) {
return RR.fail("当前库存不足,无法出库");
}
count = queryDSL.select(lccInvLpn).from(lccInvLpn)
.where(lccInvLpn.locCode.eq(outPos).and(lccInvLpn.envId.eq(envId)).and(lccInvLpn.qty.gt(0)))
.fetchCount();
if (count >= 1) {
return RR.fail("当前出库位有货,无法出库");
}
queryDSL.insert(apiTask)
.set(apiTask.envId, envId)
.set(apiTask.taskType, 1)
.set(apiTask.taskStatus, 0)
.set(apiTask.lpn, lpn).execute();
return RR.success();
}
// 礼品位请求
public static RR<?> gift_slot(@RequestBody Map<String, Object> params) {
String carNo = Conv.asString(params.get("car_no"));
// 查询礼品所在货位
long count = queryDSL.select(lccInvLpn).from(lccInvLpn)
.where(lccInvLpn.envId.eq(envId).and(lccInvLpn.lpn.eq(giftLpn)).and(lccInvLpn.qty.gt(0)).and(lccInvLpn.locCode.eq(gifPos)))
.fetchCount();
if (count >= 1) {
return RR.fail("当前礼品托盘在礼品位");
}
// 取消礼品位请求的任务
queryDSL.update(apiTask).set(apiTask.taskStatus, 4)
.where(apiTask.taskType.in(2, 3).and(apiTask.taskStatus.eq(0)))
.execute();
count = queryDSL.select(apiTask).from(apiTask)
.where(apiTask.taskType.in(2, 3).and(apiTask.taskStatus.eq(1)))
.fetchCount();
if (count >= 1) {
return RR.fail("当前礼品位有任务,请等待");
}
queryDSL.insert(apiTask)
.set(apiTask.envId, envId)
.set(apiTask.taskType, 2)
.set(apiTask.taskStatus, 0)
.set(apiTask.lpn, giftLpn).execute();
return RR.success();
}
// 礼品回库
public static RR<?> gift_back(@RequestBody Map<String, Object> params) {
String carNo = Conv.asString(params.get("car_no"));
// 查询礼品所在货位
long count = queryDSL.select(lccInvLpn).from(lccInvLpn)
.where(lccInvLpn.envId.eq(envId).and(lccInvLpn.lpn.eq(giftLpn)).and(lccInvLpn.qty.gt(0)).and(lccInvLpn.locCode.eq(gifPos)))
.fetchCount();
if (count <= 0) {
return RR.fail("当前礼品托盘不在礼品位");
}
// 取消礼品位请求的任务
queryDSL.update(apiTask).set(apiTask.taskStatus, 4)
.where(apiTask.taskType.in(2, 3).and(apiTask.taskStatus.eq(0)))
.execute();
count = queryDSL.select(apiTask).from(apiTask)
.where(apiTask.taskType.in(2, 3).and(apiTask.taskStatus.eq(1)))
.fetchCount();
if (count >= 1) {
return RR.fail("当前礼品位有任务,请等待");
}
queryDSL.insert(apiTask)
.set(apiTask.envId, envId)
.set(apiTask.taskType, 3)
.set(apiTask.taskStatus, 0)
.set(apiTask.lpn, giftLpn).execute();
return RR.success();
}
// 启动演示
public static RR<?> demo_start(@RequestBody Map<String, Object> params) {
String carNo = Conv.asString(params.get("car_no"));
if (StringUtils.isNullOrEmpty(carNo)) {
cl2Running.set(true);
clxRunning.set(true);
} else if (carNo.equals("cl2")) {
cl2Running.set(true);
} else if (carNo.equals("clx")) {
clxRunning.set(true);
} else {
return RR.fail("参数错误, car_no 必须为空字符串 或者 cl2 或者 clx");
}
if (!cl2DemoTask.isAlive()) {
cl2DemoTask.start();
}
if (!clxDemoTask.isAlive()) {
clxDemoTask.start();
}
return RR.success();
}
// 停止演示
public static RR<?> demo_stop(@RequestBody Map<String, Object> params) {
String carNo = Conv.asString(params.get("car_no"));
if (StringUtils.isNullOrEmpty(carNo)) {
cl2Running.set(false);
clxRunning.set(false);
} else if (carNo.equals("cl2")) {
cl2Running.set(false);
} else if (carNo.equals("clx")) {
clxRunning.set(false);
} else {
return RR.fail("参数错误, car_no 必须为空字符串 或者 cl2 或者 clx");
}
return RR.success();
}
// 充电
public static RR<?> move_to_charger(@RequestBody Map<String, Object> params) {
return RR.success();
}
}

253
servo/src/main/java/com/yvan/workbench/controller/RR.java

@ -0,0 +1,253 @@
package com.yvan.workbench.controller;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.clever.core.model.response.BaseResponse;
import org.clever.core.validator.FieldError;
import java.io.PrintWriter;
import java.io.Serial;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
/**
* ajax异步请求的响应消息<br/>
* <p/>
* 作者LiZW <br/>
* 创建时间2016-5-8 21:32 <br/>
*/
@JsonInclude(Include.NON_NULL)
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Data
public class RR<T> extends BaseResponse {
@Serial
private static final long serialVersionUID = 1L;
public static <T> RR<T> success(T data, String msg) {
return new RR<>(data, msg);
}
public static <T> RR<T> success(T data) {
return new RR<>(data, "操作成功");
}
public static RR<?> success() {
return new RR<>(true, "操作成功");
}
public static <T> RR<T> fail(String msg) {
return new RR<>(false, msg);
}
public static <T> RR<T> fail(Throwable throwable, String exceptionMessage) {
return new RR<>(throwable, exceptionMessage);
}
public static RR<?> fail() {
return new RR<>(false, "操作失败");
}
public static <T> RR<T> create(boolean success, String msg) {
return new RR<>(success, msg);
}
/**
* 下次请求是否需要验证码
*/
private boolean isNeedValidateCode = false;
/**
* 操作是否成功
*/
private boolean success = false;
/**
* 请求响应返回的数据
*/
private T data;
/**
* 请求成功后跳转地址
*/
private String successUrl;
/**
* 请求失败后跳转地址
*/
private String failUrl;
/**
* 操作成功消息
*/
private String msg;
/**
* 服务器是否发生异常
*/
private boolean hasException = false;
/**
* 服务端异常消息
*/
private String exceptionMessage;
/**
* 服务端异常的堆栈信息
*/
private String exceptionStack;
/**
* 请求数据验证的错误消息
*/
private List<FieldError> fieldErrors;
/**
* 默认构造默认请求操作失败 success=false
*/
public RR() {
}
/**
* 请求服务端发生异常(hasException = true)使用的构造方法<br/>
*
* @param throwable 请求的异常对象
* @param exceptionMessage 请求的异常时的消息
*/
public RR(Throwable throwable, String exceptionMessage) {
this(null, false, null, true, throwable, exceptionMessage);
}
/**
* 服务端请求完成并且操作成功(success = true)<br/>
*
* @param data 请求响应数据
* @param msg success=true时请求成功时的消息
*/
public RR(T data, String msg) {
this(data, true, msg, false, null, null);
}
/**
* 服务端请求没有发生异常时使用的构造方法<br/>
*
* @param success 请求结果是否成功
* @param msg success=true时请求成功时的消息
* @param msg success=false时请求失败时的消息
*/
public RR(boolean success, String msg) {
this(null, success, msg, false, null, null);
}
/**
* 服务端请求完成没有发生异常时使用的构造方法<br/>
*
* @param data 请求响应数据
* @param success 请求结果是否成功
* @param msg success=true时请求成功时的消息
* @param msg success=false时请求失败时的消息
*/
public RR(T data, boolean success, String msg) {
this(data, success, msg, false, null, null);
}
/**
* @param data 请求响应数据
* @param success 请求结果是否成功
* @param msg success=true时请求成功时的消息
* @param msg success=false时请求失败时的消息
* @param hasException 是否发生服务器异常
* @param throwable 请求的异常对象
* @param exceptionMessage 请求的异常时的消息
*/
public RR(T data, boolean success, String msg, boolean hasException, Throwable throwable, String exceptionMessage) {
this.data = data;
this.success = success;
this.msg = msg;
this.msg = msg;
this.hasException = hasException;
this.exceptionStack = getStackTraceAsString(throwable);
this.exceptionMessage = exceptionMessage;
}
/**
* 增加验证错误消息<br/>
*/
public RR<?> addFieldError(FieldError fieldError) {
if (this.fieldErrors == null) {
this.fieldErrors = new ArrayList<>();
}
this.fieldErrors.add(fieldError);
return this;
}
/**
* 设置异常信息<br/>
* 1.请求失败 success=false<br/>
* 2.设置 hasException = true
* 3.给返回的异常堆栈属性赋值(exceptionStack)<br/>
*
* @param e 异常对象
*/
public void setException(Throwable e) {
if (e != null) {
this.success = false;
this.hasException = true;
}
this.exceptionStack = getStackTraceAsString(e);
}
/**
* 将ErrorStack转化为String(获取异常的堆栈信息)<br/>
*
* @param e 异常对象
* @return 异常的堆栈信息
*/
private static String getStackTraceAsString(Throwable e) {
if (e == null) {
return "";
}
StringWriter stringWriter = new StringWriter();
e.printStackTrace(new PrintWriter(stringWriter));
return stringWriter.toString();
}
/*--------------------------------------------------------------
* gettersetter
* -------------------------------------------------------------*/
/**
* 设置请求是否成功<br/>
* <b>
* 设置true,置空msg<br/>
* 设置false,置空msg<br/>
* </b>
*/
public void setSuccess(boolean success) {
this.success = success;
if (success) {
this.msg = null;
} else {
this.msg = null;
}
}
/**
* 设置请求成功返回的消息置空msg
*/
public void setSuccessMessage(String msg) {
if (msg != null) {
this.msg = msg;
this.msg = null;
} else {
this.msg = null;
}
}
/**
* 设置请求失败返回的消息置空msg
*/
public void setFailMessage(String msg) {
if (msg != null) {
this.msg = msg;
this.msg = null;
} else {
this.msg = null;
}
}
}

1
servo/src/main/resources/application.yml

@ -161,6 +161,7 @@ web:
- '/**/*.woff2' - '/**/*.woff2'
- '/**/.git' - '/**/.git'
- '/ok' - '/ok'
- '/api/workbench'
ignore-auth-paths: ['/ok'] ignore-auth-paths: ['/ok']
ignore-auth-failed-paths: ignore-auth-failed-paths:
- '/api/**' - '/api/**'

2
servo/src/test/java/com/yvan/workbench/BaseTest.java

@ -11,7 +11,7 @@ public class BaseTest {
public static HikariConfig mysqlConfig() { public static HikariConfig mysqlConfig() {
HikariConfig hikariConfig = new HikariConfig(); HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
hikariConfig.setJdbcUrl("jdbc:mysql://180.100.199.56:8306/rcs2_tw_zhanghui"); hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/rcs2_tw_zhanghui");
hikariConfig.setUsername("rcs2_tw_zhanghui"); hikariConfig.setUsername("rcs2_tw_zhanghui");
hikariConfig.setPassword("Rcs2_tw_zhanghui"); hikariConfig.setPassword("Rcs2_tw_zhanghui");
hikariConfig.setAutoCommit(false); hikariConfig.setAutoCommit(false);

2
servo/src/test/java/com/yvan/workbench/CodegenTest.java

@ -29,7 +29,7 @@ public class CodegenTest {
// .addTable("rcs_task_biz") // .addTable("rcs_task_biz")
// .addTable("rcs_task_device") // .addTable("rcs_task_device")
// .addTable("rcs_task_plan"); // .addTable("rcs_task_plan");
.addTable("lcc_bas_location"); .addTable("api_task");
CodegenUtils.genCode(jdbc, config); CodegenUtils.genCode(jdbc, config);
log.info("-->"); log.info("-->");
jdbc.close(); jdbc.close();

Loading…
Cancel
Save