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

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

View File

@@ -382,6 +382,11 @@ public class NDCAgvServiceImpl implements NDCAgvService {
if ("7".equals(carno) || "8".equals(carno)) {
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());

View File

@@ -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");

View File

@@ -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);

View File

@@ -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("查询缓存所有任务")
/** 查询缓存任务 */

View File

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

View File

@@ -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; // 转换为秒

View File

@@ -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);

View File

@@ -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:

View File

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

View File

@@ -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"/>

View File

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

View File

@@ -320,7 +320,7 @@
<el-table-column prop="start_point_code2" :label="$t('TaskRecord.table.Starting_point_two')" :min-width="flexWidth('start_point_code2',crud.data,$t('TaskRecord.table.Starting_point_two'))" />
<el-table-column prop="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')" />

View File

@@ -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()

View File

@@ -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,'修改人')" />

View File

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

View File

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.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("出库")));

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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());

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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>()

View File

@@ -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);
}

View File

@@ -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(""))

View File

@@ -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);
// 完成当前分配明细

View File

@@ -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);

View File

@@ -35,11 +35,15 @@ import org.nl.wms.sch_manage.service.util.tasks.CheckInTask;
import org.nl.wms.sch_manage.service.util.tasks.CheckOutTask;
import org.nl.wms.sch_manage.service.util.tasks.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("盘点操作执行成功!");

View File

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

View File

@@ -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>
<!--所有日志最多占多大容量-->