添加电子标签任务手动上报任务数量的功能;优化部分功能

This commit is contained in:
葛林强 2026-01-28 14:49:13 +08:00
parent 918b393aad
commit 22f6b76083
11 changed files with 263 additions and 11 deletions

View File

@ -22,3 +22,17 @@
电子标签状态:立即点亮的直接定时任务点亮,未激活的要扫码触发
电子标签区域标签状态:正在捡选(橙色) ----> 这片区域捡选完成(蓝色) ----> 所有任务完成(绿色)
**网络请求**
上报仓库任务状态地址配置:<span style="color:#F87654">系统名称_STOCK_TASK_STATUS_CALLBACK</span>
输送线上报任务状态地址配置:<span style="color:#F87654">系统名称_CONVEY_TASK_STATUS_CALLBACK</span>
电子标签上报任务状态地址配置:<span style="color:#F87654">系统名称_ETAG_TASK_STATUS_CALLBACK</span>
申请仓库任务状态地址配置:<span style="color:#F87654">系统名称_STOCK_LOGIN_REQ</span>

View File

@ -11,7 +11,7 @@
Target Server Version : 80404 (8.4.4)
File Encoding : 65001
Date: 28/01/2026 14:14:07
Date: 28/01/2026 14:49:06
*/
SET NAMES utf8mb4;
@ -1083,13 +1083,14 @@ CREATE TABLE `t_app_etag_task_bak` (
`goods_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '物料编号',
`goods_name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '物料名称',
`light_num` decimal(10,2) NOT NULL COMMENT '点亮数量',
`confirm_num` decimal(10,2) DEFAULT NULL COMMENT '确认数量',
`task_status` int NOT NULL COMMENT '任务状态',
`task_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务来源',
`light_model` int NOT NULL DEFAULT '1' COMMENT '点亮模式:\n1 - 立即点亮;\n2 - 暂存待触发;',
`task_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '任务来源',
`create_person` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL COMMENT '创建时间',
`light_time` datetime DEFAULT NULL COMMENT '点亮时间',
`confirm_time` datetime DEFAULT NULL COMMENT '确认时间',
`confirm_num` decimal(10,2) DEFAULT NULL COMMENT '确认数量',
`confirm_person` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '确认人',
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
`remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注',
@ -1100,6 +1101,11 @@ CREATE TABLE `t_app_etag_task_bak` (
-- Records of t_app_etag_task_bak
-- ----------------------------
BEGIN;
INSERT INTO `t_app_etag_task_bak` (`task_id`, `task_group`, `task_type`, `vehicle_no`, `order_id`, `location`, `goods_id`, `goods_name`, `light_num`, `confirm_num`, `task_status`, `light_model`, `task_source`, `create_person`, `create_time`, `light_time`, `confirm_time`, `confirm_person`, `completed_time`, `remark`) VALUES ('00000014656', '78412W24122300002', 1, 'SF1649488540362', '78412S230314000006', 'GZ-J2-01-04-03', '3110246', '消毒液1.8L', 6.00, NULL, 1, 1, 'WMS_API', 'WMS', '2024-12-24 14:32:43', NULL, NULL, NULL, NULL, NULL);
INSERT INTO `t_app_etag_task_bak` (`task_id`, `task_group`, `task_type`, `vehicle_no`, `order_id`, `location`, `goods_id`, `goods_name`, `light_num`, `confirm_num`, `task_status`, `light_model`, `task_source`, `create_person`, `create_time`, `light_time`, `confirm_time`, `confirm_person`, `completed_time`, `remark`) VALUES ('00000014666', '78412W24122300002', 1, 'SF1613717093943', '78412S230314000009', 'GZ-J2-01-04-03', '3110246', '消毒液1.8L', 1.00, NULL, 9, 1, 'WMS_API', 'WMS', '2024-12-24 14:32:43', NULL, NULL, NULL, NULL, NULL);
INSERT INTO `t_app_etag_task_bak` (`task_id`, `task_group`, `task_type`, `vehicle_no`, `order_id`, `location`, `goods_id`, `goods_name`, `light_num`, `confirm_num`, `task_status`, `light_model`, `task_source`, `create_person`, `create_time`, `light_time`, `confirm_time`, `confirm_person`, `completed_time`, `remark`) VALUES ('00000gdfgd789', '78412W24122300002', 1, 'SF1613717093943', '78412S230314000009', 'GZ-J2-01-04-03', '3110246', '消毒液1.8L', 1.00, NULL, 9, 1, 'WMS_API', 'WMS', '2024-12-24 14:32:43', NULL, NULL, NULL, NULL, NULL);
INSERT INTO `t_app_etag_task_bak` (`task_id`, `task_group`, `task_type`, `vehicle_no`, `order_id`, `location`, `goods_id`, `goods_name`, `light_num`, `confirm_num`, `task_status`, `light_model`, `task_source`, `create_person`, `create_time`, `light_time`, `confirm_time`, `confirm_person`, `completed_time`, `remark`) VALUES ('17666465187009010000', '1766646518792010000', 1, 'V0001', '7878', 'L-0101', '555', 'yyy', 1.00, NULL, 1, 1, '', 'dev', '2025-12-25 15:08:39', NULL, NULL, NULL, NULL, '1111');
INSERT INTO `t_app_etag_task_bak` (`task_id`, `task_group`, `task_type`, `vehicle_no`, `order_id`, `location`, `goods_id`, `goods_name`, `light_num`, `confirm_num`, `task_status`, `light_model`, `task_source`, `create_person`, `create_time`, `light_time`, `confirm_time`, `confirm_person`, `completed_time`, `remark`) VALUES ('17688745645710000', '1768876802098010000', 1, 'Z0001', NULL, 'A01-00-21', NULL, NULL, 1.00, NULL, 1, 1, '', 'dev', '2026-01-20 10:40:02', NULL, NULL, NULL, NULL, NULL);
COMMIT;
-- ----------------------------

View File

@ -46,4 +46,21 @@ public class AppEtagTaskBakDao extends ServiceImpl<AppEtagTaskBakMapper, AppEtag
return null;
}
}
/**
* 查询任务ID
* @param taskId 任务ID
* @return 任务列表
*/
@Override
public List<AppEtagTaskBak> queryByTaskId(String taskId) {
LambdaQueryWrapper<AppEtagTaskBak> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppEtagTaskBak::getTaskId, taskId);
queryWrapper.orderByAsc(AppEtagTaskBak::getCreateTime);
try {
return baseMapper.selectList(queryWrapper);
} catch (Exception e) {
return null;
}
}
}

View File

@ -10,4 +10,5 @@ import java.util.List;
public interface AppEtagTaskBakService extends IService<AppEtagTaskBak> {
Tuple2<Long, List<AppEtagTaskBak>> queryEtagTask(EtagTaskQueryReq request, Integer pageIndex, Integer pageSize);
List<AppEtagTaskBak> queryByTaskId(String taskId); // 根据任务ID查询
}

View File

@ -1,5 +1,7 @@
package org.wcs.serve.controller.app;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -59,9 +61,6 @@ public class EtagTaskController {
return etagTaskService.updateEtagTask(request);
}
/**
* 查询电子标签任务 ---- 备份表
* @param request 查询参数
@ -75,6 +74,17 @@ public class EtagTaskController {
}
/**
* 确认标签任务
* @param taskId 任务ID
* @param confirmNum 确认数量
* @return 响应
*/
@PutMapping("/uploadTaskConfirmNum")
public AppServeResponse uploadTaskConfirmNum(@RequestParam("taskId") @NotBlank(message = "任务ID不允许未为空") String taskId, @RequestParam("confirmNum") @NotNull(message = "确认数不能为空") @Min(value = 0, message = "确认数不能小于0") Integer confirmNum) {
return etagTaskService.uploadTaskConfirmNum(taskId, confirmNum);
}
}

View File

@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.wcs.business.pub.ReportStandard;
import org.wcs.constant.ConstantData;
import org.wcs.constant.enums.database.EtagTaskLightModelEnum;
import org.wcs.constant.enums.database.EtagTaskStatusEnum;
@ -152,4 +153,49 @@ public class EtagTaskService implements IEtagTaskService {
pageDataResponse.setData(AppBeanUtils.copyListProperties(queryEtagTaskTuple.item2, EtagTaskBakVo::new));
return AppServeResponseFactory.success("查询成功", pageDataResponse);
}
/**
* 上传任务确认数
*
* @param taskId 任务ID
* @param confirmNum 确认数
* @return 响应
*/
@Override
public AppServeResponse uploadTaskConfirmNum(String taskId, Integer confirmNum) {
Object userIdObj = StpUtil.getLoginId();
if(userIdObj == null) {
return AppServeResponseFactory.unauthorized("用户未登录");
}
String operationUserId = userIdObj.toString();
// 真正进行的表
List<AppEtagTask> etagTasks = etagTaskService.queryByTaskId(taskId);
if(etagTasks == null) {
return AppServeResponseFactory.fail("数据服务异常");
}
if(!etagTasks.isEmpty()) {
AppEtagTask etagTask = etagTasks.getFirst();
Tuple2<String, String> report = ReportStandard.etagTaskReport(etagTask, confirmNum, operationUserId + "手动上报");
if(AppStringUtils.isEmpty(report.item1)) {
return AppServeResponseFactory.success("已经执行上报动作");
}
return AppServeResponseFactory.fail(report.item1);
}
// 备份表
List<AppEtagTaskBak> etagBakTasks = etagTaskBakService.queryByTaskId(taskId);
if(etagBakTasks == null) {
return AppServeResponseFactory.fail("数据服务异常");
}
if(!etagBakTasks.isEmpty()) {
AppEtagTaskBak etagBakTask = etagBakTasks.getFirst();
AppEtagTask etagTask = new AppEtagTask();
AppBeanUtils.copyProperties(etagBakTask, etagTask);
Tuple2<String, String> report = ReportStandard.etagTaskReport(etagTask, confirmNum, operationUserId + "手动上报");
if(AppStringUtils.isEmpty(report.item1)) {
return AppServeResponseFactory.success("已经执行上报动作");
}
return AppServeResponseFactory.fail(report.item1);
}
return AppServeResponseFactory.fail("任务不存在");
}
}

View File

@ -17,4 +17,5 @@ public interface IEtagTaskService {
AppServeResponse addEtagTask(AddEtagTaskReq request); // 新增电子标签任务
AppServeResponse updateEtagTask(UpdateEtagTaskReq request); // 更新电子标签任务数据
AppServeDataResponse<PageDataResponse<EtagTaskBakVo>> queryEtagTaskBak(EtagTaskQueryReq request, Integer pageIndex, Integer pageSize); // 查询电子标签任务
AppServeResponse uploadTaskConfirmNum(String taskId, Integer confirmNum); // 上传确认信息
}

View File

@ -35,4 +35,14 @@ export default class EtagTaskApi {
}
})
};
// 上传任务确认
static uploadTaskConfirm(taskId: string, confirmNum: number) {
return axiosInstance.put('/app/etagTask/uploadTaskConfirmNum', null, {
params: {
taskId: taskId,
confirmNum: confirmNum
}
})
}
}

View File

@ -55,7 +55,22 @@ const save = () => {
//
const confirm = () => {
MessageUtils.confirmMessageBox('确定手动上报?', '操作确认').then(() => {
const loadingInstance = MessageUtils.loading();
EtagTaskApi.uploadTaskConfirm(formData.value.taskId ?? '', confirmNum.value).then((res) => {
const responseString = JSON.stringify(res.data);
const response = JSON.parse(responseString) as AppServeResponse;
if (response && response.code == AppServeResponseCodeEnum.SUCCESS) {
MessageUtils.successMessage('操作成功');
emit('reLoadingTableData');
close();
return;
}
MessageUtils.warningMessageBox(response.msg, '警告');
}).catch(() => {}).finally(() => {
loadingInstance.close();
});
}).catch(() => {});
}

View File

@ -0,0 +1,133 @@
<script setup lang="ts">
import {useI18n} from "vue-i18n";
import {computed, ref} from "vue";
import type {IAppEtagTask} from "@/model/table/IAppEtagTask.ts";
import {EtagTaskTypeFormatter} from "@/plugin/formatter/EtagTaskTypeFormatter.ts";
import EtagTaskLightModelFormatter from "@/plugin/formatter/EtagTaskLightModelFormatter.ts";
import MessageUtils from "@/utils/MessageUtils.ts";
import EtagTaskApi from "@/api/etagTask.ts";
import type {AppServeResponse} from "@/interface/api/AppServeResponse.ts";
import {AppServeResponseCodeEnum} from "@/constant/enums/AppServeResponseCodeEnum.ts";
import EtagTaskStatusFormatter from "@/plugin/formatter/EtagTaskStatusFormatter.ts";
import {StarFilled} from "@element-plus/icons-vue";
const modelValue = defineModel('modelValue', {required: true, default: false});
const props = defineProps<{formData: IAppEtagTask}>();
const emit = defineEmits(['reLoadingTableData']);
const close = () => {
modelValue.value = false;
};
const { t } = useI18n();
const etagTaskTypeFormatter = new EtagTaskTypeFormatter();
const etagTaskStatusFormatter = new EtagTaskStatusFormatter();
const etagTagTaskLightModelFormatter = new EtagTaskLightModelFormatter();
const formData = computed(() => props.formData); //
const confirmNum = ref<number>(0); //
//
const confirm = () => {
MessageUtils.confirmMessageBox('确定手动上报?', '操作确认').then(() => {
const loadingInstance = MessageUtils.loading();
EtagTaskApi.uploadTaskConfirm(formData.value.taskId ?? '', confirmNum.value).then((res) => {
const responseString = JSON.stringify(res.data);
const response = JSON.parse(responseString) as AppServeResponse;
if (response && response.code == AppServeResponseCodeEnum.SUCCESS) {
MessageUtils.successMessage('操作成功');
emit('reLoadingTableData');
close();
return;
}
MessageUtils.warningMessageBox(response.msg, '警告');
}).catch(() => {}).finally(() => {
loadingInstance.close();
});
}).catch(() => {});
}
</script>
<template>
<div>
<el-dialog :model-value="modelValue" :title="t('tabPage.etagTask.editEtagTask')" @close="close" :close-on-click-modal="false">
<el-scrollbar style="height:50vh">
<el-row>
<el-col :span="12">
<el-form :model="formData" label-position="right" label-width="120px" require-asterisk-position="right">
<el-form-item :label="t('tabPage.etagTask.taskId') + ''" required>
<el-text type="primary">{{formData.taskId}}</el-text>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.taskType') + ''" required>
<el-select v-model="formData.taskType" placeholder="" style="width: 250px" clearable>
<el-option v-for="item in etagTaskTypeFormatter.etagTaskType" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.vehicleNo') + ''" required>
<el-input v-model="formData.vehicleNo" placeholder=""></el-input>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.orderId') + ''">
<el-input v-model="formData.orderId" placeholder=""></el-input>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.location') + ''" required>
<el-input v-model="formData.location" placeholder=""></el-input>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.goodsId') + ''">
<el-input v-model="formData.goodsId" placeholder=""></el-input>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.goodsName') + ''">
<el-input v-model="formData.goodsName" placeholder=""></el-input>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.lightNum') + ''" required>
<el-input-number :min="1" :max="32000" v-model="formData.lightNum" placeholder=""></el-input-number>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.confirmNum') + ''" required>
<el-input-number :min="0" :max="32000" v-model="formData.confirmNum" placeholder=""></el-input-number>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.taskStatus') + ''" required>
<el-select v-model="formData.taskStatus" placeholder="" style="width: 250px" clearable>
<el-option v-for="item in etagTaskStatusFormatter.etagTaskStatus" :label="item.label" :key="item.value" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="t('tabPage.etagTask.lightModel') + ''" required>
<el-select v-model="formData.lightModel" placeholder="" style="width: 250px" clearable>
<el-option v-for="item in etagTagTaskLightModelFormatter.etagTaskLightModel" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="t('baseColName.remark') + ''">
<el-input v-model="formData.remark"></el-input>
</el-form-item>
</el-form>
</el-col>
<el-col :span="11" :offset="1">
<el-row>
<el-form>
<el-form-item :label="t('tabPage.etagTask.confirmNum') + ''">
<el-input-number :min="1" :max="32000" v-model="confirmNum" placeholder=""></el-input-number>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="confirm">{{t('tabPage.etagTask.report')}}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-divider>
<el-icon><star-filled /></el-icon>
</el-divider>
</el-col>
</el-row>
</el-scrollbar>
<template #footer>
<el-button-group>
<el-button type="danger" @click="close">{{t('baseButton.close')}}</el-button>
</el-button-group>
</template>
</el-dialog>
</div>
</template>
<style scoped>
</style>

View File

@ -12,8 +12,7 @@ import type {PageDataResponse} from "@/interface/api/PageDataResponse.ts";
import type {AppServeDataResponse} from "@/interface/api/AppServeDataResponse.ts";
import {AppServeResponseCodeEnum} from "@/constant/enums/AppServeResponseCodeEnum.ts";
import {FormatterUtils} from "@/utils/FormatterUtils.ts";
import AddEtagTask from "@/components/page/etagTask/AddEtagTask.vue";
import EditEtagTask from "@/components/page/etagTask/EditEtagTask.vue";
import EditEtagTaskBak from "@/components/page/etagTask/EditEtagTaskBak.vue";
const { t } = useI18n();
const pageSize = ref<number>(100); //
@ -189,7 +188,7 @@ const edit = (row: IAppEtagTask) => {
</el-row>
</div>
<!-- 编辑标签任务-->
<EditEtagTask v-model="showEditDialog" @reLoadingTableData="query" :formData="editFormData" />
<EditEtagTaskBak v-model="showEditDialog" @reLoadingTableData="query" :formData="editFormData" />
</template>
<style scoped>