添加电子标签接收任务的外部接口

This commit is contained in:
葛林强 2026-01-22 11:42:04 +08:00
parent 568ff5b261
commit 0214a4aaa4
9 changed files with 163 additions and 6 deletions

View File

@ -364,6 +364,7 @@ http://{ip}:{port}?taskId={taskId}
| ---------- | ------------ | -------- | ---- | -------- | ------------------------------------------------------------ | | ---------- | ------------ | -------- | ---- | -------- | ------------------------------------------------------------ |
| taskGroup | 任务组 | string | 64 | N | | | taskGroup | 任务组 | string | 64 | N | |
| taskType | 任务类型 | int | | Y | 枚举类型:<br />1 - 捡货<br />2 - 上架<br />3 - 盘点<br />4 - 清点<br />5 - 其他 | | taskType | 任务类型 | int | | Y | 枚举类型:<br />1 - 捡货<br />2 - 上架<br />3 - 盘点<br />4 - 清点<br />5 - 其他 |
| vehicleNo | 载具号 | string | 64 | Y | |
| lightModel | 点亮类型 | int | | Y | 枚举类型:<br />1 - 立即点亮<br />2 - 等待触发<br /><span style="color:#f455ee">根据流程确定,请与我们交流方案</span> | | lightModel | 点亮类型 | int | | Y | 枚举类型:<br />1 - 立即点亮<br />2 - 等待触发<br /><span style="color:#f455ee">根据流程确定,请与我们交流方案</span> |
| sysName | 上位系统名称 | string | 32 | Y | 固定值,请联系我们获取,否则将无法收到任务回告 | | sysName | 上位系统名称 | string | 32 | Y | 固定值,请联系我们获取,否则将无法收到任务回告 |
| taskList | 任务数据 | list | | Y | | | taskList | 任务数据 | list | | Y | |

View File

@ -18,4 +18,18 @@ public enum EtagTaskLightModelEnum {
this.code = code; this.code = code;
this.message = message; this.message = message;
} }
/**
* 校验是否是正确的枚举值
* @param code 枚举值
* @return 是否是正确的枚举值
*/
public static boolean isValid(Integer code) {
for (EtagTaskLightModelEnum value : EtagTaskLightModelEnum.values()) {
if (value.code.equals(code)) {
return true;
}
}
return false;
}
} }

View File

@ -21,4 +21,19 @@ public enum EtagTaskTypeEnum {
this.code = code; this.code = code;
this.message = message; this.message = message;
} }
/**
* 校验是否是正确的枚举值
*
* @param code code
* @return 是否合法
*/
public static boolean isValid(Integer code) {
for (EtagTaskTypeEnum value : EtagTaskTypeEnum.values()) {
if (value.code.equals(code)) {
return true;
}
}
return false;
}
} }

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.BatchResult;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.wcs.mapper.AppEtagTaskMapper; import org.wcs.mapper.AppEtagTaskMapper;
import org.wcs.mapper.intf.AppEtagTaskService; import org.wcs.mapper.intf.AppEtagTaskService;
@ -12,6 +13,7 @@ import org.wcs.model.bo.db.DataBaseActionResult;
import org.wcs.model.bo.tuple.Tuple2; import org.wcs.model.bo.tuple.Tuple2;
import org.wcs.model.dto.serve.etagTask.EtagTaskQueryReq; import org.wcs.model.dto.serve.etagTask.EtagTaskQueryReq;
import org.wcs.model.po.app.AppEtagTask; import org.wcs.model.po.app.AppEtagTask;
import org.wcs.utils.AppStringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@ -75,6 +77,26 @@ public class AppEtagTaskDao extends ServiceImpl<AppEtagTaskMapper, AppEtagTask>
} }
} }
/**
* 批量新增电子标签任务
* @param appEtagTaskList 新增参数
* @return 响应
*/
@Override
public DataBaseActionResult<Integer> insert(List<AppEtagTask> appEtagTaskList) {
if(appEtagTaskList == null || appEtagTaskList.isEmpty()) {
return new DataBaseActionResult<>(0, new Exception("参数错误"));
}
appEtagTaskList.forEach(appEtagTask -> appEtagTask.setCreateTime(LocalDateTime.now()));
try {
boolean saveBatch = super.saveBatch(appEtagTaskList);
return new DataBaseActionResult<>(saveBatch ? appEtagTaskList.size() : 0);
} catch (Exception e) {
log.error("批量新增电子标签任务失败", e);
return new DataBaseActionResult<>(0, e);
}
}
/** /**
* 修改电子标签任务 * 修改电子标签任务
* @param appEtagTask 修改参数 * @param appEtagTask 修改参数
@ -113,4 +135,24 @@ public class AppEtagTaskDao extends ServiceImpl<AppEtagTaskMapper, AppEtagTask>
return new DataBaseActionResult<>(0, e); return new DataBaseActionResult<>(0, e);
} }
} }
/**
* 根据任务ID查询任务
* @param taskId 任务ID
* @return 任务列表
*/
@Override
public List<AppEtagTask> queryByTaskId(String taskId) {
if(AppStringUtils.isEmpty(taskId)) {
return null;
}
try {
LambdaQueryWrapper<AppEtagTask> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppEtagTask::getTaskId, taskId);
queryWrapper.orderByAsc(AppEtagTask::getCreateTime);
return baseMapper.selectList(queryWrapper);
} catch (Exception e) {
return null;
}
}
} }

View File

@ -14,5 +14,7 @@ public interface AppEtagTaskService extends IService<AppEtagTask> {
Tuple2<Long, List<AppEtagTask>> queryEtagTask(EtagTaskQueryReq request, Integer pageIndex, Integer pageSize); Tuple2<Long, List<AppEtagTask>> queryEtagTask(EtagTaskQueryReq request, Integer pageIndex, Integer pageSize);
DataBaseActionResult<Integer> insert(AppEtagTask appEtagTask); // 插入新数据 DataBaseActionResult<Integer> insert(AppEtagTask appEtagTask); // 插入新数据
DataBaseActionResult<Integer> insert(List<AppEtagTask> appEtagTaskList); // 插入新数据
DataBaseActionResult<Integer> updateIgnoreNull(AppEtagTask appEtagTask); // 更新数据,忽略Null值 DataBaseActionResult<Integer> updateIgnoreNull(AppEtagTask appEtagTask); // 更新数据,忽略Null值
List<AppEtagTask> queryByTaskId(String taskId); // 通过任务ID查询
} }

View File

@ -30,6 +30,13 @@ public class AddEtagTaskReq {
@JsonProperty("taskType") @JsonProperty("taskType")
private Integer taskType; private Integer taskType;
/**
* 载具号
*/
@NotBlank(message = "载具号不能为空")
@JsonProperty("vehicleNo")
private String vehicleNo;
/** /**
* 点亮模式 * 点亮模式
*/ */
@ -49,7 +56,8 @@ public class AddEtagTaskReq {
*/ */
@Valid @Valid
@JsonProperty("taskItemList") @JsonProperty("taskItemList")
@Size.List(@Size(min = 1, message = "任务列表不能为空")) @Size(min = 1, message = "任务列表不能为空")
@NotNull(message = "任务列表不能为空")
private List<EtagTaskItem> taskItemList; private List<EtagTaskItem> taskItemList;
} }

View File

@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.wcs.model.dto.pub.AddConveyTaskReq; import org.wcs.model.dto.pub.AddConveyTaskReq;
import org.wcs.model.dto.pub.AddEtagTaskReq;
import org.wcs.model.dto.pub.AddStockTaskReq; import org.wcs.model.dto.pub.AddStockTaskReq;
import org.wcs.model.vo.pub.PubServeDataResponse; import org.wcs.model.vo.pub.PubServeDataResponse;
import org.wcs.model.vo.pub.PubServeResponse; import org.wcs.model.vo.pub.PubServeResponse;
@ -62,6 +63,16 @@ public class TaskController {
return taskService.addConveyTask(addConveyTaskReq); return taskService.addConveyTask(addConveyTaskReq);
} }
/**
* 添加电子标签任务
* @param addEtagTaskReq 添加任务数据
* @return 添加结果
*/
@PostMapping("addEtagTask")
public PubServeResponse addEtagTask(@RequestBody @Validated AddEtagTaskReq addEtagTaskReq) {
return taskService.addEtagTask(addEtagTaskReq);
}

View File

@ -1,20 +1,22 @@
package org.wcs.serve.service.pub.impl; package org.wcs.serve.service.pub.impl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.wcs.constant.enums.common.TrueOrFalseEnum; import org.wcs.constant.enums.common.TrueOrFalseEnum;
import org.wcs.constant.enums.database.ConveyTaskStatusEnum; import org.wcs.constant.enums.database.*;
import org.wcs.constant.enums.database.ConveyTaskTypeEnum;
import org.wcs.constant.enums.database.StockComposeTaskStatusEnum;
import org.wcs.constant.enums.database.StockComposeTaskTypeEnum;
import org.wcs.factory.PubServeResponseFactory; import org.wcs.factory.PubServeResponseFactory;
import org.wcs.helper.PlcTaskIdHelper; import org.wcs.helper.PlcTaskIdHelper;
import org.wcs.mapper.intf.AppConveyTaskService; import org.wcs.mapper.intf.AppConveyTaskService;
import org.wcs.mapper.intf.AppEtagTaskService;
import org.wcs.mapper.intf.AppStockComposeTaskBakService; import org.wcs.mapper.intf.AppStockComposeTaskBakService;
import org.wcs.mapper.intf.AppStockComposeTaskService; import org.wcs.mapper.intf.AppStockComposeTaskService;
import org.wcs.model.dto.pub.AddConveyTaskReq; import org.wcs.model.dto.pub.AddConveyTaskReq;
import org.wcs.model.dto.pub.AddEtagTaskReq;
import org.wcs.model.dto.pub.AddStockTaskReq; import org.wcs.model.dto.pub.AddStockTaskReq;
import org.wcs.model.dto.pub.EtagTaskItem;
import org.wcs.model.po.app.AppConveyTask; import org.wcs.model.po.app.AppConveyTask;
import org.wcs.model.po.app.AppEtagTask;
import org.wcs.model.po.app.AppStockComposeTask; import org.wcs.model.po.app.AppStockComposeTask;
import org.wcs.model.po.app.AppStockComposeTaskBak; import org.wcs.model.po.app.AppStockComposeTaskBak;
import org.wcs.model.vo.pub.PubServeDataResponse; import org.wcs.model.vo.pub.PubServeDataResponse;
@ -22,14 +24,15 @@ import org.wcs.model.vo.pub.PubServeResponse;
import org.wcs.model.vo.pub.task.StockTaskDetailVo; import org.wcs.model.vo.pub.task.StockTaskDetailVo;
import org.wcs.serve.service.pub.intf.ITaskService; import org.wcs.serve.service.pub.intf.ITaskService;
import org.wcs.utils.AppBeanUtils; import org.wcs.utils.AppBeanUtils;
import org.wcs.utils.AppObjectUtils;
import org.wcs.utils.AppStringUtils; import org.wcs.utils.AppStringUtils;
import org.wcs.utils.AppUUIDUtils; import org.wcs.utils.AppUUIDUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class TaskService implements ITaskService { public class TaskService implements ITaskService {
@ -40,6 +43,8 @@ public class TaskService implements ITaskService {
private final AppConveyTaskService conveyTaskService; // 箱式线任务服务 private final AppConveyTaskService conveyTaskService; // 箱式线任务服务
private final AppEtagTaskService etagTaskService; // 电子标签任务服务
/** /**
* 添加仓库任务 * 添加仓库任务
* @param addStockTaskReq 添加仓库任务请求 * @param addStockTaskReq 添加仓库任务请求
@ -199,5 +204,61 @@ public class TaskService implements ITaskService {
return insertRows > 0 ? PubServeResponseFactory.success("添加任务成功") : PubServeResponseFactory.fail("数据服务异常,请重试"); return insertRows > 0 ? PubServeResponseFactory.success("添加任务成功") : PubServeResponseFactory.fail("数据服务异常,请重试");
} }
/**
* 添加电子标签任务
* @param addEtagTaskReq 添加任务数据
* @return 添加结果
*/
@Override
public PubServeResponse addEtagTask(AddEtagTaskReq addEtagTaskReq) {
boolean validTaskTypeResult = EtagTaskTypeEnum.isValid(addEtagTaskReq.getTaskType());
if(!validTaskTypeResult) {
return PubServeResponseFactory.fail("任务类型不在支持的范围内");
}
boolean validLightModelResult = EtagTaskLightModelEnum.isValid(addEtagTaskReq.getLightModel());
if(!validLightModelResult) {
return PubServeResponseFactory.fail("点亮模式不在支持的范围内");
}
// 定义任务组
String taskGroup = addEtagTaskReq.getTaskGroup();
if(AppStringUtils.isEmpty(taskGroup)) {
taskGroup = AppUUIDUtils.getNewUUID();
}
List<AppEtagTask> newEtagTaskList = new ArrayList<>(); // 新增任务列表
List<EtagTaskItem> taskItemList = addEtagTaskReq.getTaskItemList();
for (EtagTaskItem etagTaskItem : taskItemList) {
// 检验任务是否存在
List<AppEtagTask> appEtagTasks = etagTaskService.queryByTaskId(etagTaskItem.getTaskId());
if(appEtagTasks == null) {
return PubServeResponseFactory.fail("数据服务异常,请重试");
}
if(!appEtagTasks.isEmpty()) {
log.info("收到一个重复的电子标签任务:{}", AppStringUtils.objectToString(etagTaskItem));
continue;
}
AppEtagTask appEtagTask = new AppEtagTask();
appEtagTask.setTaskId(etagTaskItem.getTaskId());
appEtagTask.setTaskGroup(taskGroup);
appEtagTask.setTaskType(addEtagTaskReq.getTaskType());
appEtagTask.setVehicleNo(addEtagTaskReq.getVehicleNo());
appEtagTask.setOrderId(etagTaskItem.getOrderId());
appEtagTask.setLocation(etagTaskItem.getLocation());
appEtagTask.setGoodsId(etagTaskItem.getGoodsId());
appEtagTask.setGoodsName(etagTaskItem.getGoodsName());
appEtagTask.setLightNum(BigDecimal.valueOf(etagTaskItem.getLightNum()));
appEtagTask.setTaskStatus(EtagTaskStatusEnum.NOT_ACTIVATED.getCode());
appEtagTask.setLightModel(addEtagTaskReq.getLightModel());
appEtagTask.setTaskSource(addEtagTaskReq.getSysName());
appEtagTask.setCreatePerson("?");
appEtagTask.setCreateTime(LocalDateTime.now());
newEtagTaskList.add(appEtagTask);
}
if(newEtagTaskList.isEmpty()) {
return PubServeResponseFactory.success("任务已存在,请勿重复发送");
}
Integer result = etagTaskService.insert(newEtagTaskList).result();
return result > 0 ? PubServeResponseFactory.success("添加成功") : PubServeResponseFactory.fail("数据服务异常,请重试");
}
} }

View File

@ -1,6 +1,7 @@
package org.wcs.serve.service.pub.intf; package org.wcs.serve.service.pub.intf;
import org.wcs.model.dto.pub.AddConveyTaskReq; import org.wcs.model.dto.pub.AddConveyTaskReq;
import org.wcs.model.dto.pub.AddEtagTaskReq;
import org.wcs.model.dto.pub.AddStockTaskReq; import org.wcs.model.dto.pub.AddStockTaskReq;
import org.wcs.model.vo.pub.PubServeDataResponse; import org.wcs.model.vo.pub.PubServeDataResponse;
import org.wcs.model.vo.pub.PubServeResponse; import org.wcs.model.vo.pub.PubServeResponse;
@ -13,4 +14,6 @@ public interface ITaskService {
PubServeResponse cancelStockTask(String taskId); // 取消仓库任务 PubServeResponse cancelStockTask(String taskId); // 取消仓库任务
PubServeResponse addConveyTask(AddConveyTaskReq addConveyTaskReq); // 添加箱式线任务 PubServeResponse addConveyTask(AddConveyTaskReq addConveyTaskReq); // 添加箱式线任务
PubServeResponse addEtagTask(AddEtagTaskReq addEtagTaskReq); // 添加电子标签任务
} }