add:增加近期的一些新增需求实现;
This commit is contained in:
@@ -382,6 +382,11 @@ public class NDCAgvServiceImpl implements NDCAgvService {
|
||||
if ("7".equals(carno) || "8".equals(carno)) {
|
||||
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)) {
|
||||
temp = tempList.get(0);
|
||||
satation = Integer.parseInt(temp.getPara1());
|
||||
|
||||
@@ -176,6 +176,10 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
|
||||
if (StringUtils.isBlank(task.getCar_no())) {
|
||||
task.setCar_no(String.valueOf(carno));
|
||||
}
|
||||
//分配车辆时间
|
||||
if (StringUtils.isBlank(task.getPut_y())) {
|
||||
task.setPut_y(DateUtil.now());
|
||||
}
|
||||
taskserver.update(task);
|
||||
logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data);
|
||||
//车辆状态归零
|
||||
@@ -273,32 +277,48 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
|
||||
LocalTime now = LocalTime.now();
|
||||
// 判断当前时间是否在时间段内
|
||||
boolean isInRange = !now.isBefore(startTime) && !now.isAfter(endTime);
|
||||
int electric = 0;
|
||||
int electricMin = 0, electricMax = 0;
|
||||
//早上8-22点
|
||||
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 {
|
||||
electric = Integer.parseInt(paramService.findByCode(AcsConfig.ELECTRIC2).getValue());
|
||||
electricMax = Integer.parseInt(electricStr.trim());
|
||||
}
|
||||
if (electric_qty > 0 && electric_qty < electric) {
|
||||
log.info("当前车辆{}电量为{}低于{},开始判断是否需要充电!", this.agvaddr, electric_qty, electric);
|
||||
} else {
|
||||
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);
|
||||
log.info("当前车辆{}电量为{}低于{},开始查询分配充电桩信息", this.agvaddr, electric_qty, electric);
|
||||
log.info("当前车辆{}电量为{}在充电区间{}-{}内,开始查询分配充电桩信息", this.agvaddr, electric_qty, electricMin, electricMax);
|
||||
if (ObjectUtil.isNotEmpty(dict1)) {
|
||||
log.info("当前车辆{}已分配充电桩{},退出后续判断", this.agvaddr, dict1.getPara1());
|
||||
} else {
|
||||
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()));
|
||||
} else if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr < 7)) {
|
||||
dictList.removeIf(r -> "四号站点(RT)".equals(r.getLabel()));
|
||||
}
|
||||
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());
|
||||
ndcAgvService.charge(String.valueOf(this.agvaddr));
|
||||
isCharge = true;
|
||||
} 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 zh_cn = new JSONObject();
|
||||
// 设置标题
|
||||
zh_cn.put("title", "AMR报警");
|
||||
zh_cn.put("title", "AMR消息");
|
||||
// 设置内容
|
||||
JSONArray contentArray = new JSONArray();
|
||||
JSONArray contentRow1 = new JSONArray();
|
||||
// 第一行:报警信息: 【AMR故障报警】
|
||||
// 第一行:报警信息: 【AMR报警】
|
||||
JSONObject tagText1 = new JSONObject();
|
||||
tagText1.put("tag", "text");
|
||||
tagText1.put("text", "报警信息: 【AMR故障报警】");
|
||||
tagText1.put("text", "报警信息: 【AMR报警】");
|
||||
// 第二行:设备编码
|
||||
JSONObject tagText2 = new JSONObject();
|
||||
tagText2.put("tag", "text");
|
||||
|
||||
@@ -1061,12 +1061,10 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
|
||||
if (StrUtil.isEmpty(entity.getRoute_plan_code())) {
|
||||
entity.setRoute_plan_code(task.getRoute_plan_code());
|
||||
}
|
||||
|
||||
// != 0 为agv任务 1=magic 2=NDC 3=XZ,4=ZHEDA
|
||||
if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), CommonFinalParam.ONE)
|
||||
&& !StrUtil.equals(entity.getSend_status(), "2")) {
|
||||
flag = true;
|
||||
|
||||
} else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), "2")) {
|
||||
// NDC agv指令不当场取消指令,需要等agv上报
|
||||
if (StrUtil.isEmpty(entity.getAgv_jobno())) {
|
||||
@@ -1085,9 +1083,7 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
|
||||
} else {
|
||||
flag = true;
|
||||
}
|
||||
|
||||
if (flag) {
|
||||
|
||||
if (StrUtil.equals(entity.getInstruction_type(), "7")) {
|
||||
CancelTaskRequest cancelTaskRequest = new CancelTaskRequest();
|
||||
cancelTaskRequest.setOrderId(entity.getInstruction_code());
|
||||
@@ -1110,17 +1106,16 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
|
||||
cancelTaskRequest.setTaskType(type);
|
||||
acsToLiKuService.cancelTask(cancelTaskRequest);
|
||||
}
|
||||
|
||||
String currentUsername = SecurityUtils.getCurrentUsername();
|
||||
String now = DateUtil.now();
|
||||
entity.setUpdate_time(now);
|
||||
entity.setRemark("该指令由人工取消");
|
||||
entity.setUpdate_by(currentUsername);
|
||||
entity.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex());
|
||||
InstructionMybatis ins = ConvertUtil.convert(entity, InstructionMybatis.class);
|
||||
instructionMapper.updateById(ins);
|
||||
DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class);
|
||||
DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class);
|
||||
|
||||
// 如果是无光电的设备 指令完成变更起点、终点状态
|
||||
JSONObject jo = new JSONObject();
|
||||
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("islock", "false");
|
||||
deviceService.changeDeviceStatus(jo);
|
||||
|
||||
JSONObject jo1 = new JSONObject();
|
||||
jo1.put("device_code", entity.getNext_device_code());
|
||||
jo.put("hasGoodStatus", "0");
|
||||
@@ -1144,7 +1138,6 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
|
||||
jo.put("batch", "");
|
||||
jo1.put("islock", "false");
|
||||
deviceService.changeDeviceStatus(jo1);
|
||||
|
||||
String instnextdevice = entity.getNext_device_code();
|
||||
Device device = appService.findDeviceByCode(instnextdevice);
|
||||
if (device == null) {
|
||||
@@ -1226,6 +1219,7 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
|
||||
String now = DateUtil.now();
|
||||
entity.setUpdate_time(now);
|
||||
entity.setUpdate_by(currentUsername);
|
||||
entity.setRemark("指令被NDC取消,不做任务联动取消。");
|
||||
entity.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex());
|
||||
|
||||
InstructionMybatis ins = ConvertUtil.convert(entity, InstructionMybatis.class);
|
||||
|
||||
@@ -142,6 +142,14 @@ public class TaskController {
|
||||
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
|
||||
@Log("查询缓存所有任务")
|
||||
/** 查询缓存任务 */
|
||||
|
||||
@@ -516,5 +516,13 @@ public interface TaskService extends CommonService<Task> {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 修改任务优先级(批量)
|
||||
*
|
||||
* @param json 包含 taskIds 列表和 priority
|
||||
*/
|
||||
void updatePriority(JSONObject json);
|
||||
|
||||
|
||||
List<JSONObject> queryTaskSheet(Map whereJson);
|
||||
}
|
||||
|
||||
@@ -380,13 +380,13 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
|
||||
}
|
||||
switch (timeIndex) {
|
||||
case "1": // 1-3分钟(包含1和3)
|
||||
return duration >= 1 && duration <= 3;
|
||||
return duration >= 1 && duration < 3;
|
||||
case "2": // 3-5分钟(大于3,小于等于5)
|
||||
return duration > 3 && duration <= 5;
|
||||
return duration >= 3 && duration < 5;
|
||||
case "3": // 5-8分钟(大于5,小于等于8)
|
||||
return duration > 5 && duration <= 8;
|
||||
return duration >= 5 && duration < 8;
|
||||
case "4": // 大于8分钟
|
||||
return duration > 8;
|
||||
return duration >= 8;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
@@ -844,6 +844,59 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
|
||||
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
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void deleteAll(String[] ids) throws Exception {
|
||||
@@ -855,7 +908,7 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void finishByHand(String id) {
|
||||
id =id+"-";
|
||||
id = id + "-";
|
||||
this.finish(id);
|
||||
}
|
||||
|
||||
@@ -887,16 +940,10 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
|
||||
}
|
||||
Task task = ConvertUtil.convert(entity, Task.class);
|
||||
if (StringUtils.isNotBlank(entity.getTo_x())) {
|
||||
DateTime toXTime = DateUtil.parse(entity.getTo_x());
|
||||
DateTime nowTime = DateUtil.parse(now);
|
||||
long diffMs = nowTime.getTime() - toXTime.getTime();
|
||||
if (diffMs < 0) {
|
||||
diffMs = 0;
|
||||
task.setTo_z(calcDuration(entity.getTo_x(), now));
|
||||
}
|
||||
long totalSeconds = diffMs / 1000;
|
||||
long minutes = totalSeconds / 60;
|
||||
long seconds = totalSeconds % 60;
|
||||
task.setTo_z(String.format("%d.%02d", minutes, seconds));
|
||||
if (StringUtils.isNotBlank(entity.getPut_y())) {
|
||||
task.setPut_z(calcDuration(entity.getPut_y(), now));
|
||||
}
|
||||
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")) {
|
||||
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
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@@ -938,7 +1005,7 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
|
||||
entity.setUpdate_time(now);
|
||||
entity.setUpdate_by(currentUsername);
|
||||
entity.setTask_status(TaskStatusEnum.CANCEL.getIndex());
|
||||
|
||||
entity.setRemark("该任务由人工手动取消");
|
||||
Task task = ConvertUtil.convert(entity, Task.class);
|
||||
taskMapper.updateById(task);
|
||||
//移除任务缓存信息
|
||||
@@ -1774,10 +1841,12 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
|
||||
// 计算实际运行总时长(to_z累加,单位:分钟)
|
||||
// to_z格式为 "5.19" 表示 5分钟19秒,需要正确解析
|
||||
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 -> {
|
||||
// 优先使用 put_z,若为空则使用 to_z
|
||||
String timeStr = StrUtil.isNotEmpty(t.getPut_z()) ? t.getPut_z() : t.getTo_z();
|
||||
try {
|
||||
String[] parts = t.getTo_z().split("\\.");
|
||||
String[] parts = timeStr.split("\\.");
|
||||
int minutes = Integer.parseInt(parts[0]);
|
||||
int seconds = parts.length > 1 ? Integer.parseInt(parts[1]) : 0;
|
||||
return minutes * 60 + seconds; // 转换为秒
|
||||
|
||||
@@ -143,6 +143,21 @@ public class AutoCreateInst {
|
||||
.lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex())
|
||||
.eq(InstructionMybatis::getIs_delete, "0")
|
||||
.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)) {
|
||||
blockedPoints.add(start_point);
|
||||
|
||||
@@ -127,7 +127,7 @@ file:
|
||||
avatarMaxSize: 5
|
||||
logging:
|
||||
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
|
||||
lucene:
|
||||
index:
|
||||
|
||||
@@ -6,7 +6,7 @@ spring:
|
||||
freemarker:
|
||||
check-template-location: false
|
||||
profiles:
|
||||
active: prod
|
||||
active: dev
|
||||
# active: dev
|
||||
# active: prod
|
||||
jackson:
|
||||
|
||||
@@ -43,7 +43,7 @@ https://juejin.cn/post/6844903775631572999
|
||||
<!--日志文件输出的文件名-->
|
||||
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
||||
<!--日志文件保留天数-->
|
||||
<maxHistory>30</maxHistory>
|
||||
<maxHistory>180</maxHistory>
|
||||
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||
<maxFileSize>120MB</maxFileSize>
|
||||
<!--所有日志最多占多大容量-->
|
||||
@@ -167,6 +167,7 @@ https://juejin.cn/post/6844903775631572999
|
||||
<root level="debug">
|
||||
<appender-ref ref="asyncLuceneAppender"/>
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
<appender-ref ref="asyncFileAppender"/>
|
||||
</root>
|
||||
<logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="ERROR" additivity="false">
|
||||
<appender-ref ref="asyncLuceneAppender"/>
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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="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="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="remark" :label="$t('task.select.Remark')" />
|
||||
<el-table-column prop="create_by" :label="$t('task.select.Creator')" />
|
||||
|
||||
@@ -123,6 +123,17 @@
|
||||
>
|
||||
{{ $t('auto.common.synchronous') }}
|
||||
</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>
|
||||
<!--表单组件-->
|
||||
<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-input v-model="form.task_id" style="width: 240px;" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('task.txt_box.Material_type')">
|
||||
<el-select
|
||||
v-model="form.material"
|
||||
style="width: 370px;"
|
||||
filterable
|
||||
:placeholder="$t('task.select.Placeholder')"
|
||||
@change="isDisabled=false"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in dict.material_type"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="$t('task.txt_box.Material_type')">-->
|
||||
<!-- <el-select-->
|
||||
<!-- v-model="form.material"-->
|
||||
<!-- style="width: 370px;"-->
|
||||
<!-- filterable-->
|
||||
<!-- :placeholder="$t('task.select.Placeholder')"-->
|
||||
<!-- @change="isDisabled=false"-->
|
||||
<!-- >-->
|
||||
<!-- <el-option-->
|
||||
<!-- v-for="item in dict.material_type"-->
|
||||
<!-- :key="item.id"-->
|
||||
<!-- :label="item.label"-->
|
||||
<!-- :value="item.value"-->
|
||||
<!-- />-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<el-form-item :label="$t('task.txt_box.car_type')">
|
||||
<el-select
|
||||
v-model="form.car_type"
|
||||
@@ -165,9 +176,9 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('task.txt_box.car_width')">
|
||||
<el-input v-model="form.car_width" style="width: 370px;" @change="isDisabled=false" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="$t('task.txt_box.car_width')">-->
|
||||
<!-- <el-input v-model="form.car_width" style="width: 370px;" @change="isDisabled=false" />-->
|
||||
<!-- </el-form-item>-->
|
||||
<el-form-item :label="$t('task.txt_box.Task_type')">
|
||||
<el-select
|
||||
v-model="form.task_type"
|
||||
@@ -200,40 +211,40 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('task.txt_box.AGV_system')">
|
||||
<el-select
|
||||
v-model="form.agv_system_type"
|
||||
style="width: 370px;"
|
||||
filterable
|
||||
clearable
|
||||
:placeholder="$t('task.select.Placeholder')"
|
||||
@change="isDisabled=false"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in dict.agv_system_type"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('task.txt_box.Routing_scheme')">
|
||||
<el-select
|
||||
v-model="form.route_plan_code"
|
||||
style="width: 370px;"
|
||||
filterable
|
||||
:placeholder="$t('task.select.Placeholder')"
|
||||
default-first-option
|
||||
@change="isDisabled=false"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in routeList"
|
||||
:key="item.plan_code"
|
||||
:label="item.plan_name"
|
||||
:value="item.plan_code"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="$t('task.txt_box.AGV_system')">-->
|
||||
<!-- <el-select-->
|
||||
<!-- v-model="form.agv_system_type"-->
|
||||
<!-- style="width: 370px;"-->
|
||||
<!-- filterable-->
|
||||
<!-- clearable-->
|
||||
<!-- :placeholder="$t('task.select.Placeholder')"-->
|
||||
<!-- @change="isDisabled=false"-->
|
||||
<!-- >-->
|
||||
<!-- <el-option-->
|
||||
<!-- v-for="item in dict.agv_system_type"-->
|
||||
<!-- :key="item.id"-->
|
||||
<!-- :label="item.label"-->
|
||||
<!-- :value="item.value"-->
|
||||
<!-- />-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item :label="$t('task.txt_box.Routing_scheme')">-->
|
||||
<!-- <el-select-->
|
||||
<!-- v-model="form.route_plan_code"-->
|
||||
<!-- style="width: 370px;"-->
|
||||
<!-- filterable-->
|
||||
<!-- :placeholder="$t('task.select.Placeholder')"-->
|
||||
<!-- default-first-option-->
|
||||
<!-- @change="isDisabled=false"-->
|
||||
<!-- >-->
|
||||
<!-- <el-option-->
|
||||
<!-- v-for="item in routeList"-->
|
||||
<!-- :key="item.plan_code"-->
|
||||
<!-- :label="item.plan_name"-->
|
||||
<!-- :value="item.plan_code"-->
|
||||
<!-- />-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<el-form-item :label="$t('task.txt_box.agv_action_type')">
|
||||
<el-select
|
||||
v-model="form.agv_action_type"
|
||||
@@ -350,9 +361,9 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="行架任务类型">
|
||||
<el-input v-model="form.truss_type" style="width: 370px;" @change="isDisabled=false" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="行架任务类型">-->
|
||||
<!-- <el-input v-model="form.truss_type" style="width: 370px;" @change="isDisabled=false" />-->
|
||||
<!-- </el-form-item>-->
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<div class="grid-content bg-purple-light" />
|
||||
@@ -459,30 +470,30 @@
|
||||
<el-form-item :label="$t('task.txt_box.Vehicle_number')">
|
||||
<el-input v-model="form.vehicle_code" style="width: 370px;" @change="isDisabled=false" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('task.txt_box.empty_shaft_position')">
|
||||
<el-select
|
||||
v-model="form.empty_site"
|
||||
style="width: 370px;"
|
||||
filterable
|
||||
clearable
|
||||
:placeholder="$t('task.txt_box.empty_shaft_position')"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in dict.empty_shaft_position"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('task.txt_box.extension_field')">
|
||||
<div>
|
||||
<el-button @click="openDialog">{{ $t('task.select.Placeholder') }}</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<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-form-item>
|
||||
<!-- <el-form-item :label="$t('task.txt_box.empty_shaft_position')">-->
|
||||
<!-- <el-select-->
|
||||
<!-- v-model="form.empty_site"-->
|
||||
<!-- style="width: 370px;"-->
|
||||
<!-- filterable-->
|
||||
<!-- clearable-->
|
||||
<!-- :placeholder="$t('task.txt_box.empty_shaft_position')"-->
|
||||
<!-- >-->
|
||||
<!-- <el-option-->
|
||||
<!-- v-for="item in dict.empty_shaft_position"-->
|
||||
<!-- :key="item.id"-->
|
||||
<!-- :label="item.label"-->
|
||||
<!-- :value="item.value"-->
|
||||
<!-- />-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item :label="$t('task.txt_box.extension_field')">-->
|
||||
<!-- <div>-->
|
||||
<!-- <el-button @click="openDialog">{{ $t('task.select.Placeholder') }}</el-button>-->
|
||||
<!-- </div>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <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-form-item>-->
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
@@ -543,6 +554,21 @@
|
||||
</div>
|
||||
</el-form>
|
||||
</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-column type="selection" width="25" />
|
||||
@@ -653,7 +679,7 @@
|
||||
</template>
|
||||
|
||||
<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 crudOperation from '@crud/CRUD.operation'
|
||||
import rrOperation from '@crud/RR.operation'
|
||||
@@ -800,6 +826,28 @@ export default {
|
||||
value: ''
|
||||
}],
|
||||
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: {
|
||||
start_point_code: [
|
||||
{ required: true, message: '起点不能为空', trigger: 'change' }
|
||||
@@ -919,6 +967,63 @@ export default {
|
||||
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() {
|
||||
crudTask.reload().then(res => {
|
||||
this.crud.toQuery()
|
||||
|
||||
@@ -342,6 +342,8 @@
|
||||
{{ scope.row.is_used?'是':'否' }}
|
||||
</template>
|
||||
</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_time" label="创建时间" :min-width="flexWidth('create_time',crud.data,'创建时间')" />
|
||||
<el-table-column prop="update_name" label="修改人" :min-width="flexWidth('update_name',crud.data,'修改人')" />
|
||||
|
||||
@@ -12,6 +12,7 @@ import lombok.NoArgsConstructor;
|
||||
public class StructattrChangeDto {
|
||||
String inv;
|
||||
String structCode;
|
||||
String cTStructCode;
|
||||
String storagevehicleCode;
|
||||
Boolean inBound;
|
||||
String taskType;
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.common.utils.IdUtil;
|
||||
@@ -539,16 +540,41 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
|
||||
@Override
|
||||
public void changeStruct(StructattrChangeDto changeDto) {
|
||||
String now = DateUtil.now();
|
||||
UpdateWrapper<Structattr> wrapper = new UpdateWrapper<Structattr>()
|
||||
.set("update_time", now)
|
||||
.set("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"))
|
||||
.set("storagevehicle_code", changeDto.getStoragevehicleCode())
|
||||
.eq("struct_code", changeDto.getStructCode());
|
||||
//如果是整出
|
||||
if (!changeDto.getInBound()) {
|
||||
wrapper.set("storagevehicle_code", null);
|
||||
boolean inBound = changeDto.getInBound();
|
||||
String mainCode = changeDto.getStructCode();
|
||||
//1.主库位
|
||||
UpdateWrapper<Structattr> mainWrapper = new UpdateWrapper<>();
|
||||
mainWrapper.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) {
|
||||
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>()
|
||||
.eq("storagevehicle_code", changeDto.getStoragevehicleCode())
|
||||
.lt("status", IOSEnum.GROUP_PLATE_STATUS.code("出库")));
|
||||
|
||||
@@ -126,7 +126,7 @@ public class BackInTask extends AbstractTask {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成中的任务!");
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
this.cancelTask(taskObj);
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ public class CheckBackMoveTask extends AbstractTask {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成中的任务!");
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
this.cancelTask(taskObj);
|
||||
}
|
||||
|
||||
@@ -147,6 +147,9 @@ public class CheckInTask extends AbstractTask {
|
||||
if (ObjectUtil.isEmpty(taskObj)) {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
this.cancelTask(taskObj);
|
||||
}
|
||||
@Transactional
|
||||
|
||||
@@ -189,6 +189,9 @@ public class CheckMoveTask extends AbstractTask {
|
||||
}
|
||||
@Transactional
|
||||
public void cancelTask(SchBaseTask taskObj) {
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
// 更新盘点明细状态
|
||||
iStIvtCheckdtlService.update(
|
||||
new UpdateWrapper<StIvtCheckdtl>().lambda()
|
||||
|
||||
@@ -148,6 +148,9 @@ public class CheckOutTask extends AbstractTask {
|
||||
}
|
||||
@Transactional
|
||||
public void cancelTask(SchBaseTask taskObj) {
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
// 更新任务状态
|
||||
taskObj.setRemark("已取消");
|
||||
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
|
||||
|
||||
@@ -125,7 +125,7 @@ public class MoveTask extends AbstractTask {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成中的任务!");
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
this.cancelTask(taskObj);
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public class PdaPointTask extends AbstractTask {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成中的任务!");
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
this.cancelTask(taskObj);
|
||||
}
|
||||
|
||||
@@ -167,6 +167,9 @@ public class StInTask extends AbstractTask {
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void cancelTask(SchBaseTask taskObj) {
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
rawAssistIStorService.taskCancel(taskObj);
|
||||
//删除托盘和组盘
|
||||
GroupPlate groupPlate=new GroupPlate();
|
||||
|
||||
@@ -149,6 +149,9 @@ public class StOutTask extends AbstractTask {
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void cancelTask(SchBaseTask taskObj) {
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
outBillService.taskCancel(taskObj);
|
||||
// 取消任务
|
||||
taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
|
||||
|
||||
@@ -125,7 +125,7 @@ public class VehicleInTask extends AbstractTask {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
|
||||
throw new BadRequestException("只能取消生成中的任务!");
|
||||
throw new BadRequestException("只能取消生成状态的任务,该任务已下发ACS,请在ACS系统上取消。");
|
||||
}
|
||||
this.cancelTask(taskObj);
|
||||
}
|
||||
|
||||
@@ -140,7 +140,9 @@ public class VehicleOutTask extends AbstractTask {
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
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>()
|
||||
.set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code("是"))
|
||||
|
||||
@@ -994,18 +994,19 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
|
||||
iStructattrService.update(wrapper);
|
||||
}
|
||||
//解锁库位
|
||||
JSONObject finish_map = new JSONObject();
|
||||
finish_map.put("struct_code", structCode);
|
||||
finish_map.put("storagevehicle_code", storagevehicleCode);
|
||||
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);
|
||||
String cTStructCode = task.getPoint_code2();
|
||||
//超托需要更新多个库位
|
||||
if (task.getPoint_code2().contains("CT")) {
|
||||
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<Structattr>().eq(Structattr::getStruct_code,task.getPoint_code2()));
|
||||
if (structattr == null) {
|
||||
throw new BadRequestException("未找到库位信息");
|
||||
}
|
||||
cTStructCode = String.join(",",task.getPoint_code2(),structattr.getRemark(), structattr.getRemark1());
|
||||
}
|
||||
//库存变动
|
||||
StructattrChangeDto changeDto = StructattrChangeDto.builder()
|
||||
.inv(iostorinvId)
|
||||
.storagevehicleCode(storagevehicleCode)
|
||||
.storagevehicleCode(storagevehicleCode).cTStructCode(cTStructCode)
|
||||
.structCode(structCode).taskType(task.getConfig_code()).inBound(true).build();
|
||||
iStructattrService.changeStruct(changeDto);
|
||||
// 完成当前分配明细
|
||||
|
||||
@@ -68,7 +68,6 @@ import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* @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));
|
||||
//获取单据编号
|
||||
String bill_code = ioStorInv.getBill_code();
|
||||
//
|
||||
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();
|
||||
point_code2 = iSchBasePointService.getByCode(task.getPoint_code2());
|
||||
@@ -1481,11 +1460,21 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
|
||||
logDto.setLog_type("INFO");
|
||||
logDto.setParams("任务完成:" + task.getTask_code() + ",解锁库位成功:-------------------" + point_code2);
|
||||
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()
|
||||
.inv(item.getIostorinv_id())
|
||||
.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);
|
||||
// 查询该明细下是否还有未完成的分配明细
|
||||
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());
|
||||
}
|
||||
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);
|
||||
|
||||
@@ -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.MoveTask;
|
||||
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.IOSEnum;
|
||||
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.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.IStIvtCheckmstService;
|
||||
import org.nl.wms.warehouse_manage.service.IStIvtMoveinvService;
|
||||
@@ -61,6 +65,10 @@ import java.util.List;
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WmsToIWmsServiceImpl implements WmsToIWmsService {
|
||||
@Autowired
|
||||
private IStIvtStructivtflowService stIvtStructivtflowService;
|
||||
@Autowired
|
||||
private SysLogMapper logMapper;
|
||||
@Autowired
|
||||
private IStructattrService iStructattrService;
|
||||
@Autowired
|
||||
@@ -267,6 +275,7 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public WmstoIWmsResponse inventory(JSONObject parm) {
|
||||
log.info("WMS发起盘点请求,参数为:-------------------" + parm.toString());
|
||||
JSONArray tableData = parm.getJSONArray("tableData");
|
||||
@@ -278,11 +287,14 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
|
||||
throw new BadRequestException("未传入载具或仓位信息!");
|
||||
}
|
||||
Structattr struct = iStructattrService.getByCode(structCode);
|
||||
if (ObjectUtils.isEmpty(struct.getStoragevehicle_code())) {
|
||||
throw new BadRequestException("该仓位未存放托盘,暂不能盘点!");
|
||||
}
|
||||
if (!storageCode.equals(struct.getStoragevehicle_code())) {
|
||||
throw new BadRequestException("该仓位存放托盘与所传托盘的编码不对" + "传入的托盘号:" + storageCode + ",现在存放的托盘号:" + struct.getStoragevehicle_code());
|
||||
}
|
||||
if (!"0".equals(struct.getLock_type())) {
|
||||
throw new BadRequestException("传入仓位被锁定或有任务,需要检查仓位或任务列表,暂不能盘点!" + structCode);
|
||||
throw new BadRequestException("传入仓位被锁定或有任务未完成,需要检查仓位或任务列表,暂不能盘点!" + structCode);
|
||||
}
|
||||
GroupPlate groupPlate = iMdPbGroupplateService.getByCode(storageCode);
|
||||
String oldQty = groupPlate.getQty().toString();
|
||||
@@ -298,30 +310,65 @@ public class WmsToIWmsServiceImpl implements WmsToIWmsService {
|
||||
log.info("WMS执行盘点操作:-------------------" + "仓位:" + structCode + ",托盘:" + storageCode + ",当前数量:" + oldQty + ",盘点数量:" + qty + ",无需调整");
|
||||
return result;
|
||||
}
|
||||
List<JSONObject> updateIvtList = new ArrayList<>();
|
||||
JSONObject jsonIvt = new JSONObject();
|
||||
if (newQty.compareTo(BigDecimal.ZERO) == 0) {
|
||||
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_SUB_CANUSE_IVT);
|
||||
jsonIvt.put("change_qty", groupPlate.getQty());
|
||||
groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("出库"));
|
||||
} else {
|
||||
jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_CANUSE_IVT);
|
||||
BigDecimal changeQty = newQty.subtract(groupPlate.getQty());
|
||||
jsonIvt.put("change_qty", changeQty.abs());
|
||||
}
|
||||
jsonIvt.put("storagevehicle_code", storageCode);
|
||||
jsonIvt.put("material_id", groupPlate.getMaterial_id());
|
||||
jsonIvt.put("pcsn", groupPlate.getPcsn());
|
||||
jsonIvt.put("qty_unit_id", groupPlate.getQty_unit_id());
|
||||
jsonIvt.put("qty_unit_name", groupPlate.getQty_unit_name());
|
||||
jsonIvt.put("remark", "盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty);
|
||||
updateIvtList.add(jsonIvt);
|
||||
iMdPbGroupplateService.updateIvt(updateIvtList);
|
||||
// List<JSONObject> updateIvtList = new ArrayList<>();
|
||||
// JSONObject jsonIvt = new JSONObject();
|
||||
// if (newQty.compareTo(oldQtyDecimal)< 0) {
|
||||
// jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_SUB_CANUSE_IVT);
|
||||
// jsonIvt.put("change_qty", groupPlate.getQty());
|
||||
// groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("出库"));
|
||||
// } else if (newQty.compareTo(oldQtyDecimal) > 0) {
|
||||
// jsonIvt.put("type", IOSConstant.UPDATE_IVT_TYPE_ADD_CANUSE_IVT);
|
||||
// BigDecimal changeQty = newQty.subtract(groupPlate.getQty());
|
||||
// jsonIvt.put("change_qty", changeQty.abs());
|
||||
// }
|
||||
// jsonIvt.put("storagevehicle_code", storageCode);
|
||||
// jsonIvt.put("material_id", groupPlate.getMaterial_id());
|
||||
// jsonIvt.put("pcsn", groupPlate.getPcsn());
|
||||
// jsonIvt.put("qty_unit_id", groupPlate.getQty_unit_id());
|
||||
// jsonIvt.put("qty_unit_name", groupPlate.getQty_unit_name());
|
||||
// jsonIvt.put("remark", "盘点调整,仓位:" + structCode + ",原数量:" + oldQty + ",调整后数量:" + qty);
|
||||
// updateIvtList.add(jsonIvt);
|
||||
//置空
|
||||
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.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();
|
||||
result.setCode(String.valueOf(HttpStatus.OK.value()));
|
||||
result.setMsg("盘点操作执行成功!");
|
||||
|
||||
@@ -11,7 +11,7 @@ spring:
|
||||
freemarker:
|
||||
check-template-location: false
|
||||
profiles:
|
||||
active: prod
|
||||
active: dev
|
||||
# active: dev
|
||||
# active: prod
|
||||
jackson:
|
||||
|
||||
@@ -36,7 +36,7 @@ https://juejin.cn/post/6844903775631572999
|
||||
<!--日志文件输出的文件名-->
|
||||
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
||||
<!--日志文件保留天数-->
|
||||
<maxHistory>30</maxHistory>
|
||||
<maxHistory>180</maxHistory>
|
||||
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||
<maxFileSize>120MB</maxFileSize>
|
||||
<!--所有日志最多占多大容量-->
|
||||
|
||||
Reference in New Issue
Block a user