add:增加近期的一些新增需求实现;
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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("查询缓存所有任务")
|
||||||
/** 查询缓存任务 */
|
/** 查询缓存任务 */
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; // 转换为秒
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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"/>
|
||||||
|
|||||||
@@ -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="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')" />
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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,'修改人')" />
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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("出库")));
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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>()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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("是"))
|
||||||
|
|||||||
@@ -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);
|
||||||
// 完成当前分配明细
|
// 完成当前分配明细
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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("盘点操作执行成功!");
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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>
|
||||||
<!--所有日志最多占多大容量-->
|
<!--所有日志最多占多大容量-->
|
||||||
|
|||||||
Reference in New Issue
Block a user