add:增加近期的一些新增需求实现;

This commit is contained in:
2026-07-10 14:17:13 +08:00
parent 5364667e63
commit 343d183c56
32 changed files with 512 additions and 197 deletions

View File

@@ -382,6 +382,11 @@ public class NDCAgvServiceImpl implements NDCAgvService {
if ("7".equals(carno) || "8".equals(carno)) { if ("7".equals(carno) || "8".equals(carno)) {
tempList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel())); tempList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel()));
} }
if (Integer.parseInt(carno) > 6) {
tempList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel()));
} else if (Integer.parseInt(carno) < 7) {
tempList.removeIf(r -> "四号站点(RT)".equals(r.getLabel()));
}
if (ObjectUtil.isNotEmpty(tempList)) { if (ObjectUtil.isNotEmpty(tempList)) {
temp = tempList.get(0); temp = tempList.get(0);
satation = Integer.parseInt(temp.getPara1()); satation = Integer.parseInt(temp.getPara1());

View File

@@ -176,6 +176,10 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
if (StringUtils.isBlank(task.getCar_no())) { if (StringUtils.isBlank(task.getCar_no())) {
task.setCar_no(String.valueOf(carno)); task.setCar_no(String.valueOf(carno));
} }
//分配车辆时间
if (StringUtils.isBlank(task.getPut_y())) {
task.setPut_y(DateUtil.now());
}
taskserver.update(task); taskserver.update(task);
logServer.deviceExecuteLog(this.device_code, "", "", "agvphase" + "反馈:" + data); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase" + "反馈:" + data);
//车辆状态归零 //车辆状态归零
@@ -273,32 +277,48 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
LocalTime now = LocalTime.now(); LocalTime now = LocalTime.now();
// 判断当前时间是否在时间段内 // 判断当前时间是否在时间段内
boolean isInRange = !now.isBefore(startTime) && !now.isAfter(endTime); boolean isInRange = !now.isBefore(startTime) && !now.isAfter(endTime);
int electric = 0; int electricMin = 0, electricMax = 0;
//早上8-22点 //早上8-22点
if (isInRange) { if (isInRange) {
electric = Integer.parseInt(paramService.findByCode(AcsConfig.ELECTRIC).getValue()); String electricStr = paramService.findByCode(AcsConfig.ELECTRIC).getValue();
if (electricStr.contains("-")) {
String[] range = electricStr.split("-");
electricMin = Integer.parseInt(range[0].trim());
electricMax = Integer.parseInt(range[1].trim());
} else { } else {
electric = Integer.parseInt(paramService.findByCode(AcsConfig.ELECTRIC2).getValue()); electricMax = Integer.parseInt(electricStr.trim());
} }
if (electric_qty > 0 && electric_qty < electric) { } else {
log.info("当前车辆{}电量为{}低于{},开始判断是否需要充电!", this.agvaddr, electric_qty, electric); String electricStr = paramService.findByCode(AcsConfig.ELECTRIC2).getValue();
if (electricStr.contains("-")) {
String[] range = electricStr.split("-");
electricMin = Integer.parseInt(range[0].trim());
electricMax = Integer.parseInt(range[1].trim());
} else {
electricMax = Integer.parseInt(electricStr.trim());
}
}
if (electric_qty > 0 && electric_qty >= electricMin && electric_qty <= electricMax) {
log.info("当前车辆{}电量为{}在充电区间{}-{}内,开始判断是否需要充电!", this.agvaddr, electric_qty, electricMin, electricMax);
//判断是否已下发充电任务 //判断是否已下发充电任务
Dict dict1 = dictService.getDictByName3("station", String.valueOf(this.agvaddr), null); Dict dict1 = dictService.getDictByName3("station", String.valueOf(this.agvaddr), null);
log.info("当前车辆{}电量为{}低于{},开始查询分配充电桩信息", this.agvaddr, electric_qty, electric); log.info("当前车辆{}电量为{}在充电区间{}-{},开始查询分配充电桩信息", this.agvaddr, electric_qty, electricMin, electricMax);
if (ObjectUtil.isNotEmpty(dict1)) { if (ObjectUtil.isNotEmpty(dict1)) {
log.info("当前车辆{}已分配充电桩{},退出后续判断", this.agvaddr, dict1.getPara1()); log.info("当前车辆{}已分配充电桩{},退出后续判断", this.agvaddr, dict1.getPara1());
} else { } else {
List<Dict> dictList = dictService.getDictByName2("station"); List<Dict> dictList = dictService.getDictByName2("station");
if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr == 7 || this.agvaddr == 8)) { if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr > 6)) {
dictList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel())); dictList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel()));
} else if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr < 7)) {
dictList.removeIf(r -> "四号站点(RT)".equals(r.getLabel()));
} }
if (ObjectUtils.isNotEmpty(dictList)) { if (ObjectUtils.isNotEmpty(dictList)) {
log.info("当前车辆{}电量为{}低于{},充电桩数量", this.agvaddr, electric_qty, dictList.size()); log.info("当前车辆{}电量为{}在充电区间{}-{},充电桩数量{}", this.agvaddr, electric_qty, electricMin, electricMax, dictList.size());
log.info("当前车辆{}成功分配充电桩:{},准备下发充电任务", this.agvaddr, dictList.get(0).getLabel()); log.info("当前车辆{}成功分配充电桩:{},准备下发充电任务", this.agvaddr, dictList.get(0).getLabel());
ndcAgvService.charge(String.valueOf(this.agvaddr)); ndcAgvService.charge(String.valueOf(this.agvaddr));
isCharge = true; isCharge = true;
} else { } else {
log.info("当前车辆{}电量为{}低于{},但无空闲充电桩!", this.agvaddr, electric_qty, electric); log.info("当前车辆{}电量为{}在充电区间{}-{},但无空闲充电桩!", this.agvaddr, electric_qty, electricMin, electricMax);
} }
} }
} }
@@ -382,14 +402,14 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
JSONObject post = new JSONObject(); JSONObject post = new JSONObject();
JSONObject zh_cn = new JSONObject(); JSONObject zh_cn = new JSONObject();
// 设置标题 // 设置标题
zh_cn.put("title", "AMR报警"); zh_cn.put("title", "AMR消息");
// 设置内容 // 设置内容
JSONArray contentArray = new JSONArray(); JSONArray contentArray = new JSONArray();
JSONArray contentRow1 = new JSONArray(); JSONArray contentRow1 = new JSONArray();
// 第一行:报警信息: 【AMR故障报警】 // 第一行:报警信息: 【AMR报警】
JSONObject tagText1 = new JSONObject(); JSONObject tagText1 = new JSONObject();
tagText1.put("tag", "text"); tagText1.put("tag", "text");
tagText1.put("text", "报警信息: 【AMR故障报警】"); tagText1.put("text", "报警信息: 【AMR报警】");
// 第二行:设备编码 // 第二行:设备编码
JSONObject tagText2 = new JSONObject(); JSONObject tagText2 = new JSONObject();
tagText2.put("tag", "text"); tagText2.put("tag", "text");

View File

@@ -1061,12 +1061,10 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
if (StrUtil.isEmpty(entity.getRoute_plan_code())) { if (StrUtil.isEmpty(entity.getRoute_plan_code())) {
entity.setRoute_plan_code(task.getRoute_plan_code()); entity.setRoute_plan_code(task.getRoute_plan_code());
} }
// != 0 为agv任务 1=magic 2=NDC 3=XZ,4=ZHEDA // != 0 为agv任务 1=magic 2=NDC 3=XZ,4=ZHEDA
if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), CommonFinalParam.ONE) if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), CommonFinalParam.ONE)
&& !StrUtil.equals(entity.getSend_status(), "2")) { && !StrUtil.equals(entity.getSend_status(), "2")) {
flag = true; flag = true;
} else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), "2")) { } else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), "2")) {
// NDC agv指令不当场取消指令,需要等agv上报 // NDC agv指令不当场取消指令,需要等agv上报
if (StrUtil.isEmpty(entity.getAgv_jobno())) { if (StrUtil.isEmpty(entity.getAgv_jobno())) {
@@ -1085,9 +1083,7 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
} else { } else {
flag = true; flag = true;
} }
if (flag) { if (flag) {
if (StrUtil.equals(entity.getInstruction_type(), "7")) { if (StrUtil.equals(entity.getInstruction_type(), "7")) {
CancelTaskRequest cancelTaskRequest = new CancelTaskRequest(); CancelTaskRequest cancelTaskRequest = new CancelTaskRequest();
cancelTaskRequest.setOrderId(entity.getInstruction_code()); cancelTaskRequest.setOrderId(entity.getInstruction_code());
@@ -1110,17 +1106,16 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
cancelTaskRequest.setTaskType(type); cancelTaskRequest.setTaskType(type);
acsToLiKuService.cancelTask(cancelTaskRequest); acsToLiKuService.cancelTask(cancelTaskRequest);
} }
String currentUsername = SecurityUtils.getCurrentUsername(); String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now(); String now = DateUtil.now();
entity.setUpdate_time(now); entity.setUpdate_time(now);
entity.setRemark("该指令由人工取消");
entity.setUpdate_by(currentUsername); entity.setUpdate_by(currentUsername);
entity.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex()); entity.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex());
InstructionMybatis ins = ConvertUtil.convert(entity, InstructionMybatis.class); InstructionMybatis ins = ConvertUtil.convert(entity, InstructionMybatis.class);
instructionMapper.updateById(ins); instructionMapper.updateById(ins);
DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class);
DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class);
// 如果是无光电的设备 指令完成变更起点、终点状态 // 如果是无光电的设备 指令完成变更起点、终点状态
JSONObject jo = new JSONObject(); JSONObject jo = new JSONObject();
jo.put("device_code", entity.getStart_device_code()); jo.put("device_code", entity.getStart_device_code());
@@ -1136,7 +1131,6 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
jo.put("batch", entity.getBatch()); jo.put("batch", entity.getBatch());
jo.put("islock", "false"); jo.put("islock", "false");
deviceService.changeDeviceStatus(jo); deviceService.changeDeviceStatus(jo);
JSONObject jo1 = new JSONObject(); JSONObject jo1 = new JSONObject();
jo1.put("device_code", entity.getNext_device_code()); jo1.put("device_code", entity.getNext_device_code());
jo.put("hasGoodStatus", "0"); jo.put("hasGoodStatus", "0");
@@ -1144,7 +1138,6 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
jo.put("batch", ""); jo.put("batch", "");
jo1.put("islock", "false"); jo1.put("islock", "false");
deviceService.changeDeviceStatus(jo1); deviceService.changeDeviceStatus(jo1);
String instnextdevice = entity.getNext_device_code(); String instnextdevice = entity.getNext_device_code();
Device device = appService.findDeviceByCode(instnextdevice); Device device = appService.findDeviceByCode(instnextdevice);
if (device == null) { if (device == null) {
@@ -1226,6 +1219,7 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
String now = DateUtil.now(); String now = DateUtil.now();
entity.setUpdate_time(now); entity.setUpdate_time(now);
entity.setUpdate_by(currentUsername); entity.setUpdate_by(currentUsername);
entity.setRemark("指令被NDC取消不做任务联动取消。");
entity.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex()); entity.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex());
InstructionMybatis ins = ConvertUtil.convert(entity, InstructionMybatis.class); InstructionMybatis ins = ConvertUtil.convert(entity, InstructionMybatis.class);

View File

@@ -142,6 +142,14 @@ public class TaskController {
return new ResponseEntity<>(HttpStatus.CREATED); return new ResponseEntity<>(HttpStatus.CREATED);
} }
@Log("修改任务优先级")
/** 修改任务优先级 */
@PostMapping(value = "/updatePriority")
public ResponseEntity<Object> updatePriority(@RequestBody JSONObject json) {
taskService.updatePriority(json);
return new ResponseEntity<>(HttpStatus.OK);
}
@SaIgnore @SaIgnore
@Log("查询缓存所有任务") @Log("查询缓存所有任务")
/** 查询缓存任务 */ /** 查询缓存任务 */

View File

@@ -516,5 +516,13 @@ public interface TaskService extends CommonService<Task> {
/**
* 修改任务优先级(批量)
*
* @param json 包含 taskIds 列表和 priority
*/
void updatePriority(JSONObject json);
List<JSONObject> queryTaskSheet(Map whereJson); List<JSONObject> queryTaskSheet(Map whereJson);
} }

View File

@@ -380,13 +380,13 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
} }
switch (timeIndex) { switch (timeIndex) {
case "1": // 1-3分钟包含1和3 case "1": // 1-3分钟包含1和3
return duration >= 1 && duration <= 3; return duration >= 1 && duration < 3;
case "2": // 3-5分钟大于3小于等于5 case "2": // 3-5分钟大于3小于等于5
return duration > 3 && duration <= 5; return duration >= 3 && duration < 5;
case "3": // 5-8分钟大于5小于等于8 case "3": // 5-8分钟大于5小于等于8
return duration > 5 && duration <= 8; return duration >= 5 && duration < 8;
case "4": // 大于8分钟 case "4": // 大于8分钟
return duration > 8; return duration >= 8;
default: default:
return true; return true;
} }
@@ -844,6 +844,59 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
taskMapper.updateById(task); taskMapper.updateById(task);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void updatePriority(JSONObject json) {
List<String> taskIds = (List<String>) json.get("taskIds");
Integer priority = json.getInteger("priority");
String startPointCode = json.getString("start_point_code");
if (taskIds == null || taskIds.isEmpty()) {
throw new BadRequestException("请至少选择一个任务");
}
if (priority == null || priority < 0 || priority >= 99) {
throw new BadRequestException("优先级必须为0-98之间的整数");
}
// 如果传入了起点编码,查找同一排(相同前缀)的其他待执行任务并合并
if (StrUtil.isNotBlank(startPointCode)) {
// 提取前缀,如 "BCPRK1-1" → "BCPRK1"
String prefix = startPointCode.split("-", 2)[0];
// 仅对起点任务BCPRK/CPRK进行合并
if (prefix.contains("BCPRK") || prefix.contains("CPRK")) {
List<Task> samePrefixTasks = new LambdaQueryChainWrapper<>(taskMapper)
.eq(Task::getTask_status, "0")
.eq(Task::getIs_delete, "0")
.likeRight(Task::getStart_device_code, prefix + "-")
.list();
if (!samePrefixTasks.isEmpty()) {
Set<String> mergedIds = new HashSet<>(taskIds);
for (Task t : samePrefixTasks) {
mergedIds.add(t.getTask_id());
}
taskIds = new ArrayList<>(mergedIds);
}
}
}
String currentUsername = SecurityUtils.getCurrentUsername();
String now = DateUtil.now();
for (String taskId : taskIds) {
TaskDto entity = this.findById(taskId);
if (entity == null) {
throw new BadRequestException(LangProcess.msg("error_sysAuth"));
}
if (!"0".equals(entity.getTask_status())) {
throw new BadRequestException("只能修改待执行任务的优先级");
}
TaskDto updateDto = new TaskDto();
updateDto.setTask_id(taskId);
updateDto.setPriority(String.valueOf(priority));
updateDto.setUpdate_time(now);
updateDto.setUpdate_by(currentUsername);
updateDto.setTemperature(currentUsername + "" + now + "手动修改了优先级:"+priority);
Task task = ConvertUtil.convert(updateDto, Task.class);
taskMapper.updateById(task);
}
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteAll(String[] ids) throws Exception { public void deleteAll(String[] ids) throws Exception {
@@ -855,7 +908,7 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void finishByHand(String id) { public void finishByHand(String id) {
id =id+"-"; id = id + "-";
this.finish(id); this.finish(id);
} }
@@ -887,16 +940,10 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
} }
Task task = ConvertUtil.convert(entity, Task.class); Task task = ConvertUtil.convert(entity, Task.class);
if (StringUtils.isNotBlank(entity.getTo_x())) { if (StringUtils.isNotBlank(entity.getTo_x())) {
DateTime toXTime = DateUtil.parse(entity.getTo_x()); task.setTo_z(calcDuration(entity.getTo_x(), now));
DateTime nowTime = DateUtil.parse(now);
long diffMs = nowTime.getTime() - toXTime.getTime();
if (diffMs < 0) {
diffMs = 0;
} }
long totalSeconds = diffMs / 1000; if (StringUtils.isNotBlank(entity.getPut_y())) {
long minutes = totalSeconds / 60; task.setPut_z(calcDuration(entity.getPut_y(), now));
long seconds = totalSeconds % 60;
task.setTo_z(String.format("%d.%02d", minutes, seconds));
} }
taskMapper.updateById(task); taskMapper.updateById(task);
//移除任务缓存信息 //移除任务缓存信息
@@ -907,9 +954,29 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) {
this.feedWmsTaskStatus(entity); this.feedWmsTaskStatus(entity);
} }
} }
/**
* 计算从指定时间到当前时间的耗时,格式为 分.秒(如 3.05
* @param fromTime 起始时间字符串
* @param now 当前时间字符串
* @return 格式化耗时,若 fromTime 为空则返回 null
*/
private String calcDuration(String fromTime, String now) {
if (StringUtils.isBlank(fromTime)) {
return null;
}
DateTime fromDateTime = DateUtil.parse(fromTime);
DateTime nowDateTime = DateUtil.parse(now);
long diffMs = nowDateTime.getTime() - fromDateTime.getTime();
if (diffMs < 0) {
diffMs = 0;
}
long totalSeconds = diffMs / 1000;
long minutes = totalSeconds / 60;
long seconds = totalSeconds % 60;
return String.format("%d.%02d", minutes, seconds);
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -938,7 +1005,7 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
entity.setUpdate_time(now); entity.setUpdate_time(now);
entity.setUpdate_by(currentUsername); entity.setUpdate_by(currentUsername);
entity.setTask_status(TaskStatusEnum.CANCEL.getIndex()); entity.setTask_status(TaskStatusEnum.CANCEL.getIndex());
entity.setRemark("该任务由人工手动取消");
Task task = ConvertUtil.convert(entity, Task.class); Task task = ConvertUtil.convert(entity, Task.class);
taskMapper.updateById(task); taskMapper.updateById(task);
//移除任务缓存信息 //移除任务缓存信息
@@ -1774,10 +1841,12 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
// 计算实际运行总时长(to_z累加,单位:分钟) // 计算实际运行总时长(to_z累加,单位:分钟)
// to_z格式为 "5.19" 表示 5分钟19秒,需要正确解析 // to_z格式为 "5.19" 表示 5分钟19秒,需要正确解析
long totalRunningSeconds = carTasks.stream() long totalRunningSeconds = carTasks.stream()
.filter(t -> StrUtil.isNotEmpty(t.getTo_z())) .filter(t -> StrUtil.isNotEmpty(t.getPut_z()) || StrUtil.isNotEmpty(t.getTo_z()))
.mapToLong(t -> { .mapToLong(t -> {
// 优先使用 put_z若为空则使用 to_z
String timeStr = StrUtil.isNotEmpty(t.getPut_z()) ? t.getPut_z() : t.getTo_z();
try { try {
String[] parts = t.getTo_z().split("\\."); String[] parts = timeStr.split("\\.");
int minutes = Integer.parseInt(parts[0]); int minutes = Integer.parseInt(parts[0]);
int seconds = parts.length > 1 ? Integer.parseInt(parts[1]) : 0; int seconds = parts.length > 1 ? Integer.parseInt(parts[1]) : 0;
return minutes * 60 + seconds; // 转换为秒 return minutes * 60 + seconds; // 转换为秒

View File

@@ -143,6 +143,21 @@ public class AutoCreateInst {
.lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex())
.eq(InstructionMybatis::getIs_delete, "0") .eq(InstructionMybatis::getIs_delete, "0")
.list(); .list();
//将执行中的任务也加入指令列表参与起点校验
List<TaskDto> executingTasks = taskserver.queryAllByStatus("1");
if (CollectionUtils.isNotEmpty(executingTasks)) {
// 收集已有指令中的起始点,避免重复
Set<String> existingStartPoints = activeInstructions.stream()
.map(InstructionMybatis::getStart_device_code)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
List<InstructionMybatis> executingInstructionList = executingTasks.stream()
.filter(t -> t.getStart_device_code() != null)
.filter(t -> !existingStartPoints.contains(t.getStart_device_code()))
.map(t -> InstructionMybatis.builder().start_device_code(t.getStart_device_code()).build())
.collect(Collectors.toList());
activeInstructions.addAll(executingInstructionList);
}
//起点重复检查 //起点重复检查
if (isStartTask && checkinsList(activeInstructions, start_point)) { if (isStartTask && checkinsList(activeInstructions, start_point)) {
blockedPoints.add(start_point); blockedPoints.add(start_point);

View File

@@ -127,7 +127,7 @@ file:
avatarMaxSize: 5 avatarMaxSize: 5
logging: logging:
file: file:
path: D:\log\beian\acs # /Users/onepiece/myFile/acs_logs path: D:\log\huayu\acs # /Users/onepiece/myFile/acs_logs
config: classpath:logback-spring.xml config: classpath:logback-spring.xml
lucene: lucene:
index: index:

View File

@@ -6,7 +6,7 @@ spring:
freemarker: freemarker:
check-template-location: false check-template-location: false
profiles: profiles:
active: prod active: dev
# active: dev # active: dev
# active: prod # active: prod
jackson: jackson:

View File

@@ -43,7 +43,7 @@ https://juejin.cn/post/6844903775631572999
<!--日志文件输出的文件名--> <!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数--> <!--日志文件保留天数-->
<maxHistory>30</maxHistory> <maxHistory>180</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来--> <!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>120MB</maxFileSize> <maxFileSize>120MB</maxFileSize>
<!--所有日志最多占多大容量--> <!--所有日志最多占多大容量-->
@@ -167,6 +167,7 @@ https://juejin.cn/post/6844903775631572999
<root level="debug"> <root level="debug">
<appender-ref ref="asyncLuceneAppender"/> <appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>
<appender-ref ref="asyncFileAppender"/>
</root> </root>
<logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="ERROR" additivity="false"> <logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="ERROR" additivity="false">
<appender-ref ref="asyncLuceneAppender"/> <appender-ref ref="asyncLuceneAppender"/>

View File

@@ -103,5 +103,13 @@ export function queryTaskSheet(data) {
}) })
} }
export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload, queryTaskSheet } export function updatePriority(data) {
return request({
url: 'api/task/updatePriority',
method: 'post',
data
})
}
export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload, queryTaskSheet, updatePriority }

View File

@@ -320,7 +320,7 @@
<el-table-column prop="start_point_code2" :label="$t('TaskRecord.table.Starting_point_two')" :min-width="flexWidth('start_point_code2',crud.data,$t('TaskRecord.table.Starting_point_two'))" /> <el-table-column prop="start_point_code2" :label="$t('TaskRecord.table.Starting_point_two')" :min-width="flexWidth('start_point_code2',crud.data,$t('TaskRecord.table.Starting_point_two'))" />
<el-table-column prop="next_point_code2" :label="$t('TaskRecord.table.Endpoint_two')" :min-width="flexWidth('next_point_code2',crud.data,$t('TaskRecord.table.Endpoint_two'))" /> <el-table-column prop="next_point_code2" :label="$t('TaskRecord.table.Endpoint_two')" :min-width="flexWidth('next_point_code2',crud.data,$t('TaskRecord.table.Endpoint_two'))" />
<el-table-column prop="interaction_json" :label="$t('task.select.Interaction_json')" :show-overflow-tooltip="true" width="150px" /> <el-table-column prop="interaction_json" :label="$t('task.select.Interaction_json')" :show-overflow-tooltip="true" width="150px" />
<el-table-column prop="matarial" :label="$t('TaskRecord.table.Material')" /> <el-table-column prop="temperature" :label="$t('优先级修改记录')" width="135" />
<el-table-column prop="quantity" :label="$t('TaskRecord.table.Quantity')" /> <el-table-column prop="quantity" :label="$t('TaskRecord.table.Quantity')" />
<el-table-column prop="remark" :label="$t('task.select.Remark')" /> <el-table-column prop="remark" :label="$t('task.select.Remark')" />
<el-table-column prop="create_by" :label="$t('task.select.Creator')" /> <el-table-column prop="create_by" :label="$t('task.select.Creator')" />

View File

@@ -123,6 +123,17 @@
> >
{{ $t('auto.common.synchronous') }} {{ $t('auto.common.synchronous') }}
</el-button> </el-button>
<el-button
slot="right"
v-permission="['admin','task:edit']"
class="filter-item"
size="mini"
type="warning"
icon="el-icon-edit"
@click="handlePriorityClick"
>
{{ $t('修改优先级') }}
</el-button>
</crudOperation> </crudOperation>
<!--表单组件--> <!--表单组件-->
<el-dialog :close-on-click-modal="false" :visible.sync="formDia" :title="crud.status.title" width="1100px"> <el-dialog :close-on-click-modal="false" :visible.sync="formDia" :title="crud.status.title" width="1100px">
@@ -133,22 +144,22 @@
<el-form-item v-if="false" label="任务标识" prop="task_id"> <el-form-item v-if="false" label="任务标识" prop="task_id">
<el-input v-model="form.task_id" style="width: 240px;" /> <el-input v-model="form.task_id" style="width: 240px;" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('task.txt_box.Material_type')"> <!-- <el-form-item :label="$t('task.txt_box.Material_type')">-->
<el-select <!-- <el-select-->
v-model="form.material" <!-- v-model="form.material"-->
style="width: 370px;" <!-- style="width: 370px;"-->
filterable <!-- filterable-->
:placeholder="$t('task.select.Placeholder')" <!-- :placeholder="$t('task.select.Placeholder')"-->
@change="isDisabled=false" <!-- @change="isDisabled=false"-->
> <!-- >-->
<el-option <!-- <el-option-->
v-for="item in dict.material_type" <!-- v-for="item in dict.material_type"-->
:key="item.id" <!-- :key="item.id"-->
:label="item.label" <!-- :label="item.label"-->
:value="item.value" <!-- :value="item.value"-->
/> <!-- />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="$t('task.txt_box.car_type')"> <el-form-item :label="$t('task.txt_box.car_type')">
<el-select <el-select
v-model="form.car_type" v-model="form.car_type"
@@ -165,9 +176,9 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('task.txt_box.car_width')"> <!-- <el-form-item :label="$t('task.txt_box.car_width')">-->
<el-input v-model="form.car_width" style="width: 370px;" @change="isDisabled=false" /> <!-- <el-input v-model="form.car_width" style="width: 370px;" @change="isDisabled=false" />-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="$t('task.txt_box.Task_type')"> <el-form-item :label="$t('task.txt_box.Task_type')">
<el-select <el-select
v-model="form.task_type" v-model="form.task_type"
@@ -200,40 +211,40 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('task.txt_box.AGV_system')"> <!-- <el-form-item :label="$t('task.txt_box.AGV_system')">-->
<el-select <!-- <el-select-->
v-model="form.agv_system_type" <!-- v-model="form.agv_system_type"-->
style="width: 370px;" <!-- style="width: 370px;"-->
filterable <!-- filterable-->
clearable <!-- clearable-->
:placeholder="$t('task.select.Placeholder')" <!-- :placeholder="$t('task.select.Placeholder')"-->
@change="isDisabled=false" <!-- @change="isDisabled=false"-->
> <!-- >-->
<el-option <!-- <el-option-->
v-for="item in dict.agv_system_type" <!-- v-for="item in dict.agv_system_type"-->
:key="item.id" <!-- :key="item.id"-->
:label="item.label" <!-- :label="item.label"-->
:value="item.value" <!-- :value="item.value"-->
/> <!-- />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="$t('task.txt_box.Routing_scheme')"> <!-- <el-form-item :label="$t('task.txt_box.Routing_scheme')">-->
<el-select <!-- <el-select-->
v-model="form.route_plan_code" <!-- v-model="form.route_plan_code"-->
style="width: 370px;" <!-- style="width: 370px;"-->
filterable <!-- filterable-->
:placeholder="$t('task.select.Placeholder')" <!-- :placeholder="$t('task.select.Placeholder')"-->
default-first-option <!-- default-first-option-->
@change="isDisabled=false" <!-- @change="isDisabled=false"-->
> <!-- >-->
<el-option <!-- <el-option-->
v-for="item in routeList" <!-- v-for="item in routeList"-->
:key="item.plan_code" <!-- :key="item.plan_code"-->
:label="item.plan_name" <!-- :label="item.plan_name"-->
:value="item.plan_code" <!-- :value="item.plan_code"-->
/> <!-- />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="$t('task.txt_box.agv_action_type')"> <el-form-item :label="$t('task.txt_box.agv_action_type')">
<el-select <el-select
v-model="form.agv_action_type" v-model="form.agv_action_type"
@@ -350,9 +361,9 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="行架任务类型"> <!-- <el-form-item label="行架任务类型">-->
<el-input v-model="form.truss_type" style="width: 370px;" @change="isDisabled=false" /> <!-- <el-input v-model="form.truss_type" style="width: 370px;" @change="isDisabled=false" />-->
</el-form-item> <!-- </el-form-item>-->
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<div class="grid-content bg-purple-light" /> <div class="grid-content bg-purple-light" />
@@ -459,30 +470,30 @@
<el-form-item :label="$t('task.txt_box.Vehicle_number')"> <el-form-item :label="$t('task.txt_box.Vehicle_number')">
<el-input v-model="form.vehicle_code" style="width: 370px;" @change="isDisabled=false" /> <el-input v-model="form.vehicle_code" style="width: 370px;" @change="isDisabled=false" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('task.txt_box.empty_shaft_position')"> <!-- <el-form-item :label="$t('task.txt_box.empty_shaft_position')">-->
<el-select <!-- <el-select-->
v-model="form.empty_site" <!-- v-model="form.empty_site"-->
style="width: 370px;" <!-- style="width: 370px;"-->
filterable <!-- filterable-->
clearable <!-- clearable-->
:placeholder="$t('task.txt_box.empty_shaft_position')" <!-- :placeholder="$t('task.txt_box.empty_shaft_position')"-->
> <!-- >-->
<el-option <!-- <el-option-->
v-for="item in dict.empty_shaft_position" <!-- v-for="item in dict.empty_shaft_position"-->
:key="item.id" <!-- :key="item.id"-->
:label="item.label" <!-- :label="item.label"-->
:value="item.value" <!-- :value="item.value"-->
/> <!-- />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="$t('task.txt_box.extension_field')"> <!-- <el-form-item :label="$t('task.txt_box.extension_field')">-->
<div> <!-- <div>-->
<el-button @click="openDialog">{{ $t('task.select.Placeholder') }}</el-button> <!-- <el-button @click="openDialog">{{ $t('task.select.Placeholder') }}</el-button>-->
</div> <!-- </div>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="$t('task.select.Description')" prop="description"> <!-- <el-form-item :label="$t('task.select.Description')" prop="description">-->
<el-input v-model="form.remark" style="width: 370px;" type="textarea" @change="isDisabled=false" /> <!-- <el-input v-model="form.remark" style="width: 370px;" type="textarea" @change="isDisabled=false" />-->
</el-form-item> <!-- </el-form-item>-->
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
@@ -543,6 +554,21 @@
</div> </div>
</el-form> </el-form>
</el-dialog> </el-dialog>
<!-- 修改优先级弹框 -->
<el-dialog :close-on-click-modal="false" :visible.sync="priorityDialogVisible" title="修改优先级" width="500px">
<el-form ref="priorityForm" :model="priorityForm" :rules="priorityRules" size="small" label-width="120px">
<el-form-item label="任务号" prop="task_code">
<el-input v-model="priorityForm.task_code" style="width: 300px;" disabled />
</el-form-item>
<el-form-item label="优先级" prop="priority">
<el-input v-model.number="priorityForm.priority" style="width: 300px;" type="number" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="priorityDialogVisible=false">{{ $t('task.select.Cancel') }}</el-button>
<el-button type="primary" @click="submitPriority">{{ $t('task.select.Confirm') }}</el-button>
</div>
</el-dialog>
<!--表格渲染--> <!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler"> <el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" width="25" /> <el-table-column type="selection" width="25" />
@@ -653,7 +679,7 @@
</template> </template>
<script> <script>
import crudTask from '@/api/acs/task/task' import crudTask, { updatePriority } from '@/api/acs/task/task'
import CRUD, { crud, header, presenter } from '@crud/crud' import CRUD, { crud, header, presenter } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
@@ -800,6 +826,28 @@ export default {
value: '' value: ''
}], }],
dialogVisible: false, dialogVisible: false,
priorityDialogVisible: false,
priorityForm: {
task_code: '',
priority: 1
},
priorityRules: {
priority: [
{ required: true, message: '请输入优先级', trigger: 'blur' },
{ type: 'number', message: '优先级必须为数字', trigger: 'blur' },
{ validator: (rule, value, callback) => {
if (value === '' || value === null) {
callback(new Error('请输入优先级'))
} else if (!Number.isInteger(value)) {
callback(new Error('优先级必须为整数'))
} else if (value < 0 || value >= 99) {
callback(new Error('优先级必须小于99'))
} else {
callback()
}
}, trigger: 'blur' }
]
},
rules: { rules: {
start_point_code: [ start_point_code: [
{ required: true, message: '起点不能为空', trigger: 'change' } { required: true, message: '起点不能为空', trigger: 'change' }
@@ -919,6 +967,63 @@ export default {
console.log(err.response.data.message) console.log(err.response.data.message)
}) })
}, },
handlePriorityClick() {
const selections = this.crud.selections
if (!selections || selections.length === 0) {
this.crud.notify('请至少选择一条待执行的任务', CRUD.NOTIFICATION_TYPE.WARNING)
return
}
// 校验所有选中的任务状态必须为 '0'(待执行)
const invalidSelections = selections.filter(item => item.task_status !== '0')
if (invalidSelections.length > 0) {
this.crud.notify('只能选择状态为"就绪"的任务', CRUD.NOTIFICATION_TYPE.WARNING)
return
}
// 取第一个选中任务的 task_code 展示
this.priorityForm.task_code = selections[0].task_code
this.priorityForm.priority = selections[0].priority ? Number(selections[0].priority) : 1
this.priorityDialogVisible = true
},
submitPriority() {
this.$refs.priorityForm.validate((valid) => {
if (!valid) return
const selections = this.crud.selections
const taskIds = selections.map(item => item.task_id)
const priority = this.priorityForm.priority
const firstTask = selections[0]
const doUpdate = (batchStartPointCode) => {
const params = { taskIds, priority }
if (batchStartPointCode) {
params.start_point_code = batchStartPointCode
}
updatePriority(params).then(res => {
this.crud.notify('修改成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.priorityDialogVisible = false
this.crud.toQuery()
}).catch(err => {
console.log(err)
})
}
// 检查是否为起点任务,询问是否批量更新同一排
const startDeviceCode = firstTask.start_device_code
const isStartTask = startDeviceCode &&
(startDeviceCode.includes('BCPRK') || startDeviceCode.includes('CPRK'))
if (isStartTask) {
const prefix = startDeviceCode.split('-')[0]
this.$confirm(
'检测该任务起点【' + prefix + '】的同一排存在多个任务,是否一起修改优先级?',
'提示',
{ confirmButtonText: '是,一起修改', cancelButtonText: '否,仅修改当前', type: 'warning' }
).then(() => {
doUpdate(startDeviceCode)
}).catch(() => {
doUpdate()
})
} else {
doUpdate()
}
})
},
reload() { reload() {
crudTask.reload().then(res => { crudTask.reload().then(res => {
this.crud.toQuery() this.crud.toQuery()

View File

@@ -342,6 +342,8 @@
{{ scope.row.is_used?'是':'否' }} {{ scope.row.is_used?'是':'否' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="in_order_seq" label="入库排序" :min-width="flexWidth('in_order_seq',crud.data,'入库排序')" />
<el-table-column prop="out_order_seq" label="出库排序" :min-width="flexWidth('out_order_seq',crud.data,'出库排序')" />
<el-table-column prop="create_name" label="创建人" :min-width="flexWidth('create_name',crud.data,'创建人')" /> <el-table-column prop="create_name" label="创建人" :min-width="flexWidth('create_name',crud.data,'创建人')" />
<el-table-column prop="create_time" label="创建时间" :min-width="flexWidth('create_time',crud.data,'创建时间')" /> <el-table-column prop="create_time" label="创建时间" :min-width="flexWidth('create_time',crud.data,'创建时间')" />
<el-table-column prop="update_name" label="修改人" :min-width="flexWidth('update_name',crud.data,'修改人')" /> <el-table-column prop="update_name" label="修改人" :min-width="flexWidth('update_name',crud.data,'修改人')" />

View File

@@ -12,6 +12,7 @@ import lombok.NoArgsConstructor;
public class StructattrChangeDto { public class StructattrChangeDto {
String inv; String inv;
String structCode; String structCode;
String cTStructCode;
String storagevehicleCode; String storagevehicleCode;
Boolean inBound; Boolean inBound;
String taskType; String taskType;

View File

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
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.commons.lang3.StringUtils;
import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException; import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil; import org.nl.common.utils.IdUtil;
@@ -539,16 +540,41 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
@Override @Override
public void changeStruct(StructattrChangeDto changeDto) { public void changeStruct(StructattrChangeDto changeDto) {
String now = DateUtil.now(); String now = DateUtil.now();
UpdateWrapper<Structattr> wrapper = new UpdateWrapper<Structattr>() boolean inBound = changeDto.getInBound();
.set("update_time", now) String mainCode = changeDto.getStructCode();
.set("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")) //1.主库位
.set("storagevehicle_code", changeDto.getStoragevehicleCode()) UpdateWrapper<Structattr> mainWrapper = new UpdateWrapper<>();
.eq("struct_code", changeDto.getStructCode()); mainWrapper.set("update_time", now).set("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
//如果是整出 .set("inv_type", null)
if (!changeDto.getInBound()) { .set("inv_id", null)
wrapper.set("storagevehicle_code", null); .set("inv_code", null);
if (inBound) {
mainWrapper.set("storagevehicle_code", changeDto.getStoragevehicleCode());
} else {
mainWrapper.set("storagevehicle_code", null);
}
mainWrapper.eq("struct_code", mainCode);
this.update(mainWrapper);
//如果是超托
if (mainCode != null && mainCode.startsWith("CT") && StringUtils.isNotBlank(changeDto.getCTStructCode())) {
List<String> subCodes = Arrays.stream(changeDto.getCTStructCode().split(","))
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
if (!subCodes.isEmpty()) {
UpdateWrapper<Structattr> subWrapper = new UpdateWrapper<>();
// 子库位只更新时间、锁状态,以及出库时清空库存
subWrapper.set("update_time", now)
.set("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
.set("inv_type", null)
.set("inv_id", null)
.set("inv_code", null);
if (!inBound) {
subWrapper.set("storagevehicle_code", null);
}
subWrapper.in("struct_code", subCodes);
this.update(subWrapper);
}
} }
this.update(wrapper);
List<GroupPlate> groupPlates = iMdPbGroupplateService.list(new QueryWrapper<GroupPlate>() List<GroupPlate> groupPlates = iMdPbGroupplateService.list(new QueryWrapper<GroupPlate>()
.eq("storagevehicle_code", changeDto.getStoragevehicleCode()) .eq("storagevehicle_code", changeDto.getStoragevehicleCode())
.lt("status", IOSEnum.GROUP_PLATE_STATUS.code("出库"))); .lt("status", IOSEnum.GROUP_PLATE_STATUS.code("出库")));

View File

@@ -126,7 +126,7 @@ public class BackInTask extends AbstractTask {
throw new BadRequestException("该任务不存在"); throw new BadRequestException("该任务不存在");
} }
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成的任务!"); throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
} }
this.cancelTask(taskObj); this.cancelTask(taskObj);
} }

View File

@@ -170,7 +170,7 @@ public class CheckBackMoveTask extends AbstractTask {
throw new BadRequestException("该任务不存在"); throw new BadRequestException("该任务不存在");
} }
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成的任务!"); throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
} }
this.cancelTask(taskObj); this.cancelTask(taskObj);
} }

View File

@@ -147,6 +147,9 @@ public class CheckInTask extends AbstractTask {
if (ObjectUtil.isEmpty(taskObj)) { if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在"); throw new BadRequestException("该任务不存在");
} }
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
}
this.cancelTask(taskObj); this.cancelTask(taskObj);
} }
@Transactional @Transactional

View File

@@ -189,6 +189,9 @@ public class CheckMoveTask extends AbstractTask {
} }
@Transactional @Transactional
public void cancelTask(SchBaseTask taskObj) { public void cancelTask(SchBaseTask taskObj) {
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
}
// 更新盘点明细状态 // 更新盘点明细状态
iStIvtCheckdtlService.update( iStIvtCheckdtlService.update(
new UpdateWrapper<StIvtCheckdtl>().lambda() new UpdateWrapper<StIvtCheckdtl>().lambda()

View File

@@ -148,6 +148,9 @@ public class CheckOutTask extends AbstractTask {
} }
@Transactional @Transactional
public void cancelTask(SchBaseTask taskObj) { public void cancelTask(SchBaseTask taskObj) {
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
}
// 更新任务状态 // 更新任务状态
taskObj.setRemark("已取消"); taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode()); taskObj.setTask_status(TaskStatus.CANCELED.getCode());

View File

@@ -125,7 +125,7 @@ public class MoveTask extends AbstractTask {
throw new BadRequestException("该任务不存在"); throw new BadRequestException("该任务不存在");
} }
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成的任务!"); throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
} }
this.cancelTask(taskObj); this.cancelTask(taskObj);
} }

View File

@@ -127,7 +127,7 @@ public class PdaPointTask extends AbstractTask {
throw new BadRequestException("该任务不存在"); throw new BadRequestException("该任务不存在");
} }
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成的任务!"); throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
} }
this.cancelTask(taskObj); this.cancelTask(taskObj);
} }

View File

@@ -167,6 +167,9 @@ public class StInTask extends AbstractTask {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj) { public void cancelTask(SchBaseTask taskObj) {
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
}
rawAssistIStorService.taskCancel(taskObj); rawAssistIStorService.taskCancel(taskObj);
//删除托盘和组盘 //删除托盘和组盘
GroupPlate groupPlate=new GroupPlate(); GroupPlate groupPlate=new GroupPlate();

View File

@@ -149,6 +149,9 @@ public class StOutTask extends AbstractTask {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj) { public void cancelTask(SchBaseTask taskObj) {
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
}
outBillService.taskCancel(taskObj); outBillService.taskCancel(taskObj);
// 取消任务 // 取消任务
taskService.update(new LambdaUpdateWrapper<SchBaseTask>() taskService.update(new LambdaUpdateWrapper<SchBaseTask>()

View File

@@ -125,7 +125,7 @@ public class VehicleInTask extends AbstractTask {
throw new BadRequestException("该任务不存在"); throw new BadRequestException("该任务不存在");
} }
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) { if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成的任务!"); throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
} }
this.cancelTask(taskObj); this.cancelTask(taskObj);
} }

View File

@@ -140,7 +140,9 @@ public class VehicleOutTask extends AbstractTask {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj) { public void cancelTask(SchBaseTask taskObj) {
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成状态的任务该任务已下发ACS请在ACS系统上取消。");
}
// 取消任务 // 取消任务
taskService.update(new LambdaUpdateWrapper<SchBaseTask>() taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code("")) .set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code(""))

View File

@@ -994,18 +994,19 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
iStructattrService.update(wrapper); iStructattrService.update(wrapper);
} }
//解锁库位 //解锁库位
JSONObject finish_map = new JSONObject(); String cTStructCode = task.getPoint_code2();
finish_map.put("struct_code", structCode); //超托需要更新多个库位
finish_map.put("storagevehicle_code", storagevehicleCode); if (task.getPoint_code2().contains("CT")) {
finish_map.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<Structattr>().eq(Structattr::getStruct_code,task.getPoint_code2()));
finish_map.put("inv_type", null); if (structattr == null) {
finish_map.put("inv_id", null); throw new BadRequestException("未找到库位信息");
finish_map.put("inv_code", null); }
iStructattrService.updateStatusByCode("1", finish_map); cTStructCode = String.join(",",task.getPoint_code2(),structattr.getRemark(), structattr.getRemark1());
}
//库存变动 //库存变动
StructattrChangeDto changeDto = StructattrChangeDto.builder() StructattrChangeDto changeDto = StructattrChangeDto.builder()
.inv(iostorinvId) .inv(iostorinvId)
.storagevehicleCode(storagevehicleCode) .storagevehicleCode(storagevehicleCode).cTStructCode(cTStructCode)
.structCode(structCode).taskType(task.getConfig_code()).inBound(true).build(); .structCode(structCode).taskType(task.getConfig_code()).inBound(true).build();
iStructattrService.changeStruct(changeDto); iStructattrService.changeStruct(changeDto);
// 完成当前分配明细 // 完成当前分配明细

View File

@@ -68,7 +68,6 @@ import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
;
/** /**
* @author dsh * @author dsh
@@ -1439,27 +1438,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id, iostorinv_id)); IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper<IOStorInv>().eq(IOStorInv::getIostorinv_id, iostorinv_id));
//获取单据编号 //获取单据编号
String bill_code = ioStorInv.getBill_code(); String bill_code = ioStorInv.getBill_code();
//
String source_name = ioStorInv.getSource_name(); String source_name = ioStorInv.getSource_name();
//解锁库位
JSONObject finish_map = new JSONObject();
String lockStructCode = item.getStruct_code();
//超托需要更新多个库位
if (item.getStruct_code().contains("CT")) {
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<Structattr>().eq(Structattr::getStruct_code, item.getStruct_code()));
if (structattr == null) {
throw new BadRequestException("未找到库位信息");
}
lockStructCode = String.join(",",item.getStruct_code(),structattr.getRemark(), structattr.getRemark1());
}
finish_map.put("struct_code", lockStructCode);
finish_map.put("storagevehicle_code", null);
finish_map.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
finish_map.put("inv_type", null);
finish_map.put("inv_id", null);
finish_map.put("inv_code", null);
iStructattrService.updateStatusByCode("1", finish_map);
//终点修改点位状态 //终点修改点位状态
SchBasePoint point_code2 = new SchBasePoint(); SchBasePoint point_code2 = new SchBasePoint();
point_code2 = iSchBasePointService.getByCode(task.getPoint_code2()); point_code2 = iSchBasePointService.getByCode(task.getPoint_code2());
@@ -1481,11 +1460,21 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
logDto.setLog_type("INFO"); logDto.setLog_type("INFO");
logDto.setParams("任务完成:" + task.getTask_code() + ",解锁库位成功:-------------------" + point_code2); logDto.setParams("任务完成:" + task.getTask_code() + ",解锁库位成功:-------------------" + point_code2);
logMapper.insert(logDto); logMapper.insert(logDto);
//解锁库位
String cTStructCode = item.getStruct_code();
//超托需要更新多个库位
if (item.getStruct_code().contains("CT")) {
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<Structattr>().eq(Structattr::getStruct_code, item.getStruct_code()));
if (structattr == null) {
throw new BadRequestException("未找到库位信息");
}
cTStructCode = String.join(",",item.getStruct_code(),structattr.getRemark(), structattr.getRemark1());
}
//库存变动:根据冻结数更新物料库存 //库存变动:根据冻结数更新物料库存
StructattrChangeDto changeDto = StructattrChangeDto.builder() StructattrChangeDto changeDto = StructattrChangeDto.builder()
.inv(item.getIostorinv_id()) .inv(item.getIostorinv_id())
.storagevehicleCode(item.getStoragevehicle_code()) .storagevehicleCode(item.getStoragevehicle_code())
.structCode(item.getStruct_code()).taskType(task.getConfig_code()).inBound(false).build(); .structCode(item.getStruct_code()).cTStructCode(cTStructCode).taskType(task.getConfig_code()).inBound(false).build();
iStructattrService.changeStruct(changeDto); iStructattrService.changeStruct(changeDto);
// 查询该明细下是否还有未完成的分配明细 // 查询该明细下是否还有未完成的分配明细
int countDis = ioStorInvDisMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDis.class) int countDis = ioStorInvDisMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDis.class)
@@ -1557,7 +1546,6 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
lockStructCode = String.join(",",task.getPoint_code1(),structattr.getRemark(), structattr.getRemark1()); lockStructCode = String.join(",",task.getPoint_code1(),structattr.getRemark(), structattr.getRemark1());
} }
finish_map.put("struct_code", lockStructCode); finish_map.put("struct_code", lockStructCode);
finish_map.put("storagevehicle_code",null);
finish_map.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); finish_map.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
finish_map.put("inv_type", null); finish_map.put("inv_type", null);
finish_map.put("inv_id", null); finish_map.put("inv_id", null);

View File

@@ -35,11 +35,15 @@ import org.nl.wms.sch_manage.service.util.tasks.CheckInTask;
import org.nl.wms.sch_manage.service.util.tasks.CheckOutTask; import org.nl.wms.sch_manage.service.util.tasks.CheckOutTask;
import org.nl.wms.sch_manage.service.util.tasks.MoveTask; import org.nl.wms.sch_manage.service.util.tasks.MoveTask;
import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask; import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask;
import org.nl.wms.system_manage.service.logging.dao.SysLog;
import org.nl.wms.system_manage.service.logging.dao.mapper.SysLogMapper;
import org.nl.wms.warehouse_manage.enums.IOSConstant; import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum; import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService; import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService; import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.record.service.IStIvtStructivtflowService;
import org.nl.wms.warehouse_manage.record.service.dao.StIvtStructivtflow;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.IStIvtCheckmstService; import org.nl.wms.warehouse_manage.service.IStIvtCheckmstService;
import org.nl.wms.warehouse_manage.service.IStIvtMoveinvService; import org.nl.wms.warehouse_manage.service.IStIvtMoveinvService;
@@ -61,6 +65,10 @@ import java.util.List;
@Slf4j @Slf4j
@Service @Service
public class WmsToIWmsServiceImpl implements WmsToIWmsService { public class WmsToIWmsServiceImpl implements WmsToIWmsService {
@Autowired
private IStIvtStructivtflowService stIvtStructivtflowService;
@Autowired
private SysLogMapper logMapper;
@Autowired @Autowired
private IStructattrService iStructattrService; private IStructattrService iStructattrService;
@Autowired @Autowired
@@ -267,6 +275,7 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
@Override @Override
@Transactional
public WmstoIWmsResponse inventory(JSONObject parm) { public WmstoIWmsResponse inventory(JSONObject parm) {
log.info("WMS发起盘点请求参数为-------------------" + parm.toString()); log.info("WMS发起盘点请求参数为-------------------" + parm.toString());
JSONArray tableData = parm.getJSONArray("tableData"); JSONArray tableData = parm.getJSONArray("tableData");
@@ -278,11 +287,14 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
throw new BadRequestException("未传入载具或仓位信息!"); throw new BadRequestException("未传入载具或仓位信息!");
} }
Structattr struct = iStructattrService.getByCode(structCode); Structattr struct = iStructattrService.getByCode(structCode);
if (ObjectUtils.isEmpty(struct.getStoragevehicle_code())) {
throw new BadRequestException("该仓位未存放托盘,暂不能盘点!");
}
if (!storageCode.equals(struct.getStoragevehicle_code())) { if (!storageCode.equals(struct.getStoragevehicle_code())) {
throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storageCode + ",现在存放的托盘号:" + struct.getStoragevehicle_code()); throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storageCode + ",现在存放的托盘号:" + struct.getStoragevehicle_code());
} }
if (!"0".equals(struct.getLock_type())) { if (!"0".equals(struct.getLock_type())) {
throw new BadRequestException("传入仓位被锁定或有任务,需要检查仓位或任务列表,暂不能盘点!" + structCode); throw new BadRequestException("传入仓位被锁定或有任务未完成,需要检查仓位或任务列表,暂不能盘点!" + structCode);
} }
GroupPlate groupPlate = iMdPbGroupplateService.getByCode(storageCode); GroupPlate groupPlate = iMdPbGroupplateService.getByCode(storageCode);
String oldQty = groupPlate.getQty().toString(); String oldQty = groupPlate.getQty().toString();
@@ -298,30 +310,65 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
log.info("WMS执行盘点操作-------------------" + "仓位:" + structCode + ",托盘:" + storageCode + ",当前数量:" + oldQty + ",盘点数量:" + qty + ",无需调整"); log.info("WMS执行盘点操作-------------------" + "仓位:" + structCode + ",托盘:" + storageCode + ",当前数量:" + oldQty + ",盘点数量:" + qty + ",无需调整");
return result; return result;
} }
List<JSONObject> updateIvtList = new ArrayList<>(); // List<JSONObject> updateIvtList = new ArrayList<>();
JSONObject jsonIvt = new JSONObject(); // JSONObject jsonIvt = new JSONObject();
if (newQty.compareTo(BigDecimal.ZERO) == 0) { // if (newQty.compareTo(oldQtyDecimal)< 0) {
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_SUB_CANUSE_IVT); // jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_SUB_CANUSE_IVT);
jsonIvt.put("change_qty", groupPlate.getQty()); // jsonIvt.put("change_qty", groupPlate.getQty());
groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("出库")); // groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("出库"));
} else { // } else if (newQty.compareTo(oldQtyDecimal) > 0) {
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_CANUSE_IVT); // jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_CANUSE_IVT);
BigDecimal changeQty = newQty.subtract(groupPlate.getQty()); // BigDecimal changeQty = newQty.subtract(groupPlate.getQty());
jsonIvt.put("change_qty", changeQty.abs()); // jsonIvt.put("change_qty", changeQty.abs());
} // }
jsonIvt.put("storagevehicle_code", storageCode); // jsonIvt.put("storagevehicle_code", storageCode);
jsonIvt.put("material_id", groupPlate.getMaterial_id()); // jsonIvt.put("material_id", groupPlate.getMaterial_id());
jsonIvt.put("pcsn", groupPlate.getPcsn()); // jsonIvt.put("pcsn", groupPlate.getPcsn());
jsonIvt.put("qty_unit_id", groupPlate.getQty_unit_id()); // jsonIvt.put("qty_unit_id", groupPlate.getQty_unit_id());
jsonIvt.put("qty_unit_name", groupPlate.getQty_unit_name()); // jsonIvt.put("qty_unit_name", groupPlate.getQty_unit_name());
jsonIvt.put("remark", "盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty); // jsonIvt.put("remark", "盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty);
updateIvtList.add(jsonIvt); // updateIvtList.add(jsonIvt);
iMdPbGroupplateService.updateIvt(updateIvtList); //置空
if (newQty.compareTo(BigDecimal.ZERO) == 0) { if (newQty.compareTo(BigDecimal.ZERO) == 0) {
iStructattrService.update(new UpdateWrapper<Structattr>().lambda().eq(Structattr::getStruct_code, structCode)
.set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getLock_type, "0"));
groupPlate.setQty(BigDecimal.ZERO); groupPlate.setQty(BigDecimal.ZERO);
groupPlate.setRemark("盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty); groupPlate.setRemark("盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty);
iMdPbGroupplateService.update(groupPlate); }else {
groupPlate.setQty(newQty);
} }
iMdPbGroupplateService.update(groupPlate);
//日志记录
SysLog logDto = new SysLog();
logDto.setRequest_ip("10.62.10.18");
logDto.setAddress("10.62.10.18");
logDto.setMethod("inventory");
logDto.setUsername("MES");
logDto.setDescription("操作成功!");
logDto.setBrowser("");
logDto.setLog_id(cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextIdStr());
logDto.setCreate_time(DateUtil.now());
logDto.setLog_type("INFO");
logDto.setParams("MES系统请求执行盘点操作-------------------" + "盘点调整,仓位:" + structCode + ",托盘:" + storageCode + ",变更前数量:" + oldQty + ",变更后数量:" + qty);
logMapper.insert(logDto);
//库存变动记录
StIvtStructivtflow record = new StIvtStructivtflow();
record.setId(IdUtil.getStringId());
record.setUpdate_time(DateUtil.now());
record.setVehicle_code(storageCode);
record.setMaterial_id(groupPlate.getMaterial_id());
record.setPcsn(groupPlate.getPcsn());
record.setQty(newQty);
record.setChange_qty(newQty.subtract(oldQtyDecimal).abs());
record.setFrozen_qty(oldQtyDecimal);
record.setUnit_id(groupPlate.getQty_unit_id());
record.setStruct_code(structCode);
record.setTask_type("MoveTask");
record.setStor_code(struct.getStor_code());
record.setSect_code(struct.getSect_code());
record.setGrowth(newQty.compareTo(oldQtyDecimal) > 0);
stIvtStructivtflowService.save(record);
WmstoIWmsResponse result = new WmstoIWmsResponse(); WmstoIWmsResponse result = new WmstoIWmsResponse();
result.setCode(String.valueOf(HttpStatus.OK.value())); result.setCode(String.valueOf(HttpStatus.OK.value()));
result.setMsg("盘点操作执行成功!"); result.setMsg("盘点操作执行成功!");

View File

@@ -11,7 +11,7 @@ spring:
freemarker: freemarker:
check-template-location: false check-template-location: false
profiles: profiles:
active: prod active: dev
# active: dev # active: dev
# active: prod # active: prod
jackson: jackson:

View File

@@ -36,7 +36,7 @@ https://juejin.cn/post/6844903775631572999
<!--日志文件输出的文件名--> <!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数--> <!--日志文件保留天数-->
<maxHistory>30</maxHistory> <maxHistory>180</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来--> <!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>120MB</maxFileSize> <maxFileSize>120MB</maxFileSize>
<!--所有日志最多占多大容量--> <!--所有日志最多占多大容量-->