feat(wcs): 添加设备、仓库、任务明细查看功能

main
zch 4 days ago
parent c8d4c65203
commit 7530579692

@ -12,12 +12,12 @@
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="queryParams.deviceType" placeholder="请选择设备类型" clearable>
<el-option v-for="dict in wcs_device_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
<el-option v-for="dict in wcs_device_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="设备状态" prop="deviceStatus">
<el-select v-model="queryParams.deviceStatus" placeholder="请选择设备状态" clearable>
<el-option v-for="dict in wcs_device_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
<el-option v-for="dict in wcs_device_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item>
@ -36,10 +36,14 @@
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['wcs:deviceInfo:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['wcs:deviceInfo:edit']"></el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['wcs:deviceInfo:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['wcs:deviceInfo:remove']"></el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['wcs:deviceInfo:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['wcs:deviceInfo:export']"></el-button>
@ -56,17 +60,17 @@
<el-table-column label="所属主机" align="center" prop="hostName" />
<el-table-column label="设备类型" align="center" prop="deviceType">
<template #default="scope">
<dict-tag :options="wcs_device_type" :value="scope.row.deviceType"/>
<dict-tag :options="wcs_device_type" :value="scope.row.deviceType" />
</template>
</el-table-column>
<el-table-column label="设备状态" align="center" prop="deviceStatus">
<template #default="scope">
<dict-tag :options="wcs_device_status" :value="scope.row.deviceStatus"/>
<dict-tag :options="wcs_device_status" :value="scope.row.deviceStatus" />
</template>
</el-table-column>
<el-table-column label="是否标识" align="center" prop="isFlag">
<template #default="scope">
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag"/>
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
@ -77,8 +81,11 @@
</el-table-column>
<el-table-column label="创建人" align="center" prop="createByName" width="100" />
<el-table-column label="更新人" align="center" prop="updateByName" width="100" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="120">
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="160">
<template #default="scope">
<el-tooltip content="明细" placement="top">
<el-button link type="primary" icon="Tickets" @click="handleDetail(scope.row)" v-hasPermi="['wcs:deviceParam:list']"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wcs:deviceInfo:edit']"></el-button>
</el-tooltip>
@ -108,21 +115,21 @@
<el-col :span="12">
<el-form-item label="所属主机" prop="hostCode">
<el-select v-model="form.hostCode" placeholder="请选择所属主机" clearable style="width: 100%">
<el-option v-for="item in hostList" :key="item.objId" :label="item.hostName" :value="item.hostCode"/>
<el-option v-for="item in hostList" :key="item.objId" :label="item.hostName" :value="item.hostCode" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="form.deviceType" placeholder="请选择设备类型" clearable style="width: 100%">
<el-option v-for="dict in wcs_device_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
<el-option v-for="dict in wcs_device_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备状态" prop="deviceStatus">
<el-select v-model="form.deviceStatus" placeholder="请选择设备状态" clearable style="width: 100%">
<el-option v-for="dict in wcs_device_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
<el-option v-for="dict in wcs_device_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
@ -147,22 +154,50 @@
</div>
</template>
</el-dialog>
<el-drawer v-model="detailDrawer.visible" :title="detailDrawer.title" size="68%" append-to-body>
<el-table v-loading="detailLoading" border :data="deviceParamDetailList" height="calc(100vh - 150px)">
<el-table-column label="序号" align="center" type="index" width="60" />
<el-table-column label="参数编号" align="center" prop="paramCode" min-width="120" />
<el-table-column label="参数名称" align="center" prop="paramName" min-width="120" />
<el-table-column label="参数地址" align="center" prop="paramAddress" min-width="120" />
<el-table-column label="参数类型" align="center" prop="paramType" width="100" />
<el-table-column label="操作类型" align="center" prop="operationType" width="100">
<template #default="scope">
<dict-tag :options="wcs_operation_type" :value="scope.row.operationType" />
</template>
</el-table-column>
<el-table-column label="操作频率(ms)" align="center" prop="operationFrequency" width="120" />
<el-table-column label="是否标识" align="center" prop="isFlag" width="90">
<template #default="scope">
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="140" />
</el-table>
</el-drawer>
</div>
</template>
<script setup name="DeviceInfo" lang="ts">
import { listDeviceInfo, getDeviceInfo, delDeviceInfo, addDeviceInfo, updateDeviceInfo } from '@/api/wcs/deviceInfo';
import { getDeviceHostList } from '@/api/wcs/deviceHost';
import { listDeviceParam } from '@/api/wcs/deviceParam';
import { DeviceInfoVO, DeviceInfoQuery, DeviceInfoForm } from '@/api/wcs/deviceInfo/types';
import { DeviceHostVO } from '@/api/wcs/deviceHost/types';
import { DeviceParamVO } from '@/api/wcs/deviceParam/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { wcs_device_type, wcs_device_status, wcs_is_flag } = toRefs<any>(proxy?.useDict('wcs_device_type', 'wcs_device_status', 'wcs_is_flag'));
const { wcs_device_type, wcs_device_status, wcs_is_flag, wcs_operation_type } = toRefs<any>(
proxy?.useDict('wcs_device_type', 'wcs_device_status', 'wcs_is_flag', 'wcs_operation_type')
);
const deviceInfoList = ref<DeviceInfoVO[]>([]);
const hostList = ref<DeviceHostVO[]>([]);
const deviceParamDetailList = ref<DeviceParamVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const detailLoading = ref(false);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
@ -176,6 +211,10 @@ const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const detailDrawer = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: DeviceInfoForm = {
objId: undefined,
@ -185,8 +224,8 @@ const initFormData: DeviceInfoForm = {
deviceType: 0,
deviceStatus: 0,
isFlag: 1,
remark: undefined,
}
remark: undefined
};
const data = reactive<PageData<DeviceInfoForm, DeviceInfoQuery>>({
form: { ...initFormData },
queryParams: {
@ -201,9 +240,7 @@ const data = reactive<PageData<DeviceInfoForm, DeviceInfoQuery>>({
params: {}
},
rules: {
deviceCode: [
{ required: true, message: "设备编号不能为空", trigger: "blur" }
],
deviceCode: [{ required: true, message: '设备编号不能为空', trigger: 'blur' }]
}
});
@ -218,7 +255,7 @@ const getList = async () => {
} finally {
loading.value = false;
}
}
};
const getHostList = async () => {
try {
@ -226,52 +263,70 @@ const getHostList = async () => {
const res = await getDeviceHostList({ params: {} });
hostList.value = res.data || [];
} catch {
proxy?.$modal.msgError("获取设备主机下拉列表失败");
proxy?.$modal.msgError('获取设备主机下拉列表失败');
}
}
};
const cancel = () => {
reset();
dialog.visible = false;
}
};
const reset = () => {
form.value = { ...initFormData, isFlag: 1, deviceType: 0, deviceStatus: 0 };
deviceInfoFormRef.value?.resetFields();
}
};
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
};
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
};
const handleSelectionChange = (selection: DeviceInfoVO[]) => {
ids.value = selection.map(item => item.objId);
ids.value = selection.map((item) => item.objId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
};
const handleAdd = () => {
reset();
getHostList();
dialog.visible = true;
dialog.title = "添加设备信息";
}
dialog.title = '添加设备信息';
};
const handleUpdate = async (row?: DeviceInfoVO) => {
reset();
getHostList();
const _objId = row?.objId || ids.value[0]
const _objId = row?.objId || ids.value[0];
const res = await getDeviceInfo(_objId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改设备信息";
}
dialog.title = '修改设备信息';
};
const handleDetail = async (row: DeviceInfoVO) => {
detailDrawer.visible = true;
detailDrawer.title = `设备参数 - ${row.deviceCode}`;
deviceParamDetailList.value = [];
detailLoading.value = true;
try {
const res = await listDeviceParam({
pageNum: 1,
pageSize: 999,
deviceCode: row.deviceCode,
params: {}
});
deviceParamDetailList.value = res.rows || [];
} finally {
detailLoading.value = false;
}
};
const buildSubmitData = (): DeviceInfoForm => ({
objId: form.value.objId,
@ -290,36 +345,40 @@ const submitForm = () => {
buttonLoading.value = true;
const submitData = buildSubmitData();
if (submitData.objId) {
await updateDeviceInfo(submitData).finally(() => buttonLoading.value = false);
await updateDeviceInfo(submitData).finally(() => (buttonLoading.value = false));
} else {
await addDeviceInfo(submitData).finally(() => buttonLoading.value = false);
await addDeviceInfo(submitData).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess("操作成功");
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
}
};
const handleDelete = async (row?: DeviceInfoVO) => {
const _objIds = row?.objId || ids.value;
try {
await proxy?.$modal.confirm('是否确认删除设备信息编号为"' + _objIds + '"的数据项?');
await delDeviceInfo(_objIds);
proxy?.$modal.msgSuccess("删除成功");
proxy?.$modal.msgSuccess('删除成功');
await getList();
} catch (e) {
if (e !== 'cancel' && e !== 'close') {
proxy?.$modal.msgError("删除设备信息失败");
proxy?.$modal.msgError('删除设备信息失败');
}
}
}
};
const handleExport = () => {
proxy?.download('wcs/deviceInfo/export', {
...queryParams.value
}, `deviceInfo_${new Date().getTime()}.xlsx`)
}
proxy?.download(
'wcs/deviceInfo/export',
{
...queryParams.value
},
`deviceInfo_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();

@ -12,7 +12,7 @@
</el-form-item>
<el-form-item label="是否标识" prop="isFlag">
<el-select v-model="queryParams.isFlag" placeholder="请选择是否标识" clearable>
<el-option v-for="dict in wcs_is_flag" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
<el-option v-for="dict in wcs_is_flag" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item>
@ -31,10 +31,14 @@
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['wcs:storeInfo:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['wcs:storeInfo:edit']"></el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['wcs:storeInfo:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['wcs:storeInfo:remove']"></el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['wcs:storeInfo:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['wcs:storeInfo:export']"></el-button>
@ -50,7 +54,7 @@
<el-table-column label="仓库名称" align="center" prop="storeName" />
<el-table-column label="是否标识" align="center" prop="isFlag">
<template #default="scope">
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag"/>
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
@ -61,8 +65,11 @@
</el-table-column>
<el-table-column label="创建人" align="center" prop="createByName" width="100" />
<el-table-column label="更新人" align="center" prop="updateByName" width="100" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="120">
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="160">
<template #default="scope">
<el-tooltip content="明细" placement="top">
<el-button link type="primary" icon="Tickets" @click="handleDetail(scope.row)" v-hasPermi="['wcs:locationInfo:list']"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wcs:storeInfo:edit']"></el-button>
</el-tooltip>
@ -100,19 +107,49 @@
</div>
</template>
</el-dialog>
<el-drawer v-model="detailDrawer.visible" :title="detailDrawer.title" size="68%" append-to-body>
<el-table v-loading="detailLoading" border :data="locationDetailList" height="calc(100vh - 150px)">
<el-table-column label="序号" align="center" type="index" width="60" />
<el-table-column label="库位编号" align="center" prop="locationCode" min-width="120" />
<el-table-column label="库位名称" align="center" prop="locationName" min-width="120" />
<el-table-column label="库位区域" align="center" prop="locationArea" min-width="100" />
<el-table-column label="排" align="center" prop="locationRows" width="70" />
<el-table-column label="列" align="center" prop="locationColumns" width="70" />
<el-table-column label="层" align="center" prop="locationLayers" width="70" />
<el-table-column label="AGV定位" align="center" prop="agvPosition" min-width="120" />
<el-table-column label="物料信息" align="center" prop="materialName" min-width="120" />
<el-table-column label="托盘条码" align="center" prop="palletBarcode" min-width="120" />
<el-table-column label="库存数量" align="center" prop="stackCount" width="90" />
<el-table-column label="库位状态" align="center" prop="locationStatus" width="100">
<template #default="scope">
<dict-tag :options="wcs_location_status" :value="scope.row.locationStatus" />
</template>
</el-table-column>
<el-table-column label="是否标识" align="center" prop="isFlag" width="90">
<template #default="scope">
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag" />
</template>
</el-table-column>
</el-table>
</el-drawer>
</div>
</template>
<script setup name="StoreInfo" lang="ts">
import { listStoreInfo, getStoreInfo, delStoreInfo, addStoreInfo, updateStoreInfo } from '@/api/wcs/storeInfo';
import { listLocationInfo } from '@/api/wcs/locationInfo';
import { StoreInfoVO, StoreInfoQuery, StoreInfoForm } from '@/api/wcs/storeInfo/types';
import { LocationInfoVO } from '@/api/wcs/locationInfo/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { wcs_is_flag } = toRefs<any>(proxy?.useDict('wcs_is_flag'));
const { wcs_is_flag, wcs_location_status } = toRefs<any>(proxy?.useDict('wcs_is_flag', 'wcs_location_status'));
const storeInfoList = ref<StoreInfoVO[]>([]);
const locationDetailList = ref<LocationInfoVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const detailLoading = ref(false);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
@ -126,14 +163,18 @@ const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const detailDrawer = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: StoreInfoForm = {
objId: undefined,
storeCode: undefined,
storeName: undefined,
isFlag: 1,
remark: undefined,
}
remark: undefined
};
const data = reactive<PageData<StoreInfoForm, StoreInfoQuery>>({
form: { ...initFormData },
queryParams: {
@ -145,9 +186,7 @@ const data = reactive<PageData<StoreInfoForm, StoreInfoQuery>>({
params: {}
},
rules: {
storeCode: [
{ required: true, message: "仓库编号不能为空", trigger: "blur" }
],
storeCode: [{ required: true, message: '仓库编号不能为空', trigger: 'blur' }]
}
});
@ -162,84 +201,106 @@ const getList = async () => {
} finally {
loading.value = false;
}
}
};
const cancel = () => {
reset();
dialog.visible = false;
}
};
const reset = () => {
form.value = { ...initFormData, isFlag: 1 };
storeInfoFormRef.value?.resetFields();
}
};
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
};
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
};
const handleSelectionChange = (selection: StoreInfoVO[]) => {
ids.value = selection.map(item => item.objId);
ids.value = selection.map((item) => item.objId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
};
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加仓库信息";
}
dialog.title = '添加仓库信息';
};
const handleUpdate = async (row?: StoreInfoVO) => {
reset();
const _objId = row?.objId || ids.value[0]
const _objId = row?.objId || ids.value[0];
const res = await getStoreInfo(_objId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改仓库信息";
}
dialog.title = '修改仓库信息';
};
const handleDetail = async (row: StoreInfoVO) => {
detailDrawer.visible = true;
detailDrawer.title = `库位信息 - ${row.storeCode}`;
locationDetailList.value = [];
detailLoading.value = true;
try {
const res = await listLocationInfo({
pageNum: 1,
pageSize: 999,
storeCode: row.storeCode,
params: {}
});
locationDetailList.value = res.rows || [];
} finally {
detailLoading.value = false;
}
};
const submitForm = () => {
storeInfoFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.objId) {
await updateStoreInfo(form.value).finally(() => buttonLoading.value = false);
await updateStoreInfo(form.value).finally(() => (buttonLoading.value = false));
} else {
await addStoreInfo(form.value).finally(() => buttonLoading.value = false);
await addStoreInfo(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess("操作成功");
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
}
};
const handleDelete = async (row?: StoreInfoVO) => {
const _objIds = row?.objId || ids.value;
try {
await proxy?.$modal.confirm('是否确认删除仓库信息编号为"' + _objIds + '"的数据项?');
await delStoreInfo(_objIds);
proxy?.$modal.msgSuccess("删除成功");
proxy?.$modal.msgSuccess('删除成功');
await getList();
} catch (e) {
if (e !== 'cancel' && e !== 'close') {
proxy?.$modal.msgError("删除仓库信息失败");
proxy?.$modal.msgError('删除仓库信息失败');
}
}
}
};
const handleExport = () => {
proxy?.download('wcs/storeInfo/export', {
...queryParams.value
}, `storeInfo_${new Date().getTime()}.xlsx`)
}
proxy?.download(
'wcs/storeInfo/export',
{
...queryParams.value
},
`storeInfo_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();

@ -56,10 +56,14 @@
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['wcs:taskQueue:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['wcs:taskQueue:edit']"></el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['wcs:taskQueue:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['wcs:taskQueue:remove']"></el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['wcs:taskQueue:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['wcs:taskQueue:export']"></el-button>
@ -109,8 +113,11 @@
</el-table-column>
<el-table-column label="创建人" align="center" prop="createByName" width="100" />
<el-table-column label="更新人" align="center" prop="updateByName" width="100" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="120">
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" width="160">
<template #default="scope">
<el-tooltip content="明细" placement="top">
<el-button link type="primary" icon="Tickets" @click="handleDetail(scope.row)" v-hasPermi="['wcs:taskDetail:list']"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wcs:taskQueue:edit']"></el-button>
</el-tooltip>
@ -138,7 +145,12 @@
<el-col :span="12">
<el-form-item label="物料编号" prop="materialCode">
<el-select v-model="form.materialCode" placeholder="请选择物料" clearable filterable class="w-full" @change="handleMaterialChange">
<el-option v-for="item in materialList" :key="item.objId" :label="`${item.materialCode} / ${item.materialName}`" :value="item.materialCode" />
<el-option
v-for="item in materialList"
:key="item.objId"
:label="`${item.materialCode} / ${item.materialName}`"
:value="item.materialCode"
/>
</el-select>
</el-form-item>
</el-col>
@ -222,8 +234,20 @@
<el-table border :data="detailList" size="small">
<el-table-column label="物料编号" align="center" prop="materialCode" min-width="130">
<template #default="scope">
<el-select v-model="scope.row.materialCode" placeholder="物料" clearable filterable size="small" @change="handleDetailMaterialChange(scope.row)">
<el-option v-for="item in materialList" :key="item.objId" :label="`${item.materialCode} / ${item.materialName}`" :value="item.materialCode" />
<el-select
v-model="scope.row.materialCode"
placeholder="物料"
clearable
filterable
size="small"
@change="handleDetailMaterialChange(scope.row)"
>
<el-option
v-for="item in materialList"
:key="item.objId"
:label="`${item.materialCode} / ${item.materialName}`"
:value="item.materialCode"
/>
</el-select>
</template>
</el-table-column>
@ -314,11 +338,46 @@
</div>
</template>
</el-dialog>
<el-drawer v-model="detailDrawer.visible" :title="detailDrawer.title" size="68%" append-to-body>
<el-table v-loading="detailLoading" border :data="taskDetailDrawerList" height="calc(100vh - 150px)">
<el-table-column label="序号" align="center" type="index" width="60" />
<el-table-column label="物料编号" align="center" prop="materialCode" min-width="110" />
<el-table-column label="物料名称" align="center" prop="materialName" min-width="110" />
<el-table-column label="托盘条码" align="center" prop="palletBarcode" min-width="120" />
<el-table-column label="物料数量" align="center" prop="materialCount" width="90" />
<el-table-column label="任务类型" align="center" prop="taskType" width="100">
<template #default="scope">
<dict-tag :options="wcs_task_type" :value="scope.row.taskType" />
</template>
</el-table-column>
<el-table-column label="任务类别" align="center" prop="taskCategory" width="100">
<template #default="scope">
<dict-tag :options="wcs_task_category" :value="scope.row.taskCategory" />
</template>
</el-table-column>
<el-table-column label="起始位置" align="center" prop="startPoint" min-width="120" />
<el-table-column label="结束位置" align="center" prop="endPoint" min-width="120" />
<el-table-column label="路径编号" align="center" prop="pathCode" min-width="110" />
<el-table-column label="路径名称" align="center" prop="pathName" min-width="110" />
<el-table-column label="任务状态" align="center" prop="taskStatus" width="100">
<template #default="scope">
<dict-tag :options="wcs_task_status" :value="scope.row.taskStatus" />
</template>
</el-table-column>
<el-table-column label="是否标识" align="center" prop="isFlag" width="90">
<template #default="scope">
<dict-tag :options="wcs_is_flag" :value="scope.row.isFlag" />
</template>
</el-table-column>
</el-table>
</el-drawer>
</div>
</template>
<script setup name="TaskQueue" lang="ts">
import { listTaskQueue, getTaskQueue, delTaskQueue, addTaskQueue, updateTaskQueue } from '@/api/wcs/taskQueue';
import { listTaskDetail } from '@/api/wcs/taskDetail';
import { TaskQueueVO, TaskQueueQuery, TaskQueueForm } from '@/api/wcs/taskQueue/types';
import { TaskDetailForm, TaskDetailVO } from '@/api/wcs/taskDetail/types';
import { getMaterialInfoList } from '@/api/wcs/materialInfo';
@ -339,10 +398,12 @@ const { wcs_is_flag, wcs_task_category, wcs_task_type, wcs_task_status } = toRef
const taskQueueList = ref<TaskQueueVO[]>([]);
const detailList = ref<TaskDetailForm[]>([]);
const taskDetailDrawerList = ref<TaskDetailVO[]>([]);
const materialList = ref<MaterialInfoVO[]>([]);
const pathList = ref<PathInfoVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const detailLoading = ref(false);
const showSearch = ref(true);
const activeTab = ref('basic');
const ids = ref<Array<string | number>>([]);
@ -360,6 +421,10 @@ const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const detailDrawer = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: TaskQueueForm = {
objId: undefined,
@ -379,7 +444,7 @@ const initFormData: TaskQueueForm = {
remark: undefined,
createTime: undefined,
details: []
}
};
const data = reactive<PageData<TaskQueueForm, TaskQueueQuery>>({
form: { ...initFormData },
queryParams: {
@ -401,9 +466,7 @@ const data = reactive<PageData<TaskQueueForm, TaskQueueQuery>>({
params: {}
},
rules: {
taskCode: [
{ required: true, message: "任务编号不能为空", trigger: "blur" }
],
taskCode: [{ required: true, message: '任务编号不能为空', trigger: 'blur' }]
}
});
@ -419,99 +482,119 @@ const getList = async () => {
} finally {
loading.value = false;
}
}
};
const getMaterialList = async () => {
//
const res = await getMaterialInfoList({ isFlag: 1, params: {} });
materialList.value = res.data || [];
}
};
const getPathList = async () => {
// getPathInfoList
const res = await getPathInfoList({ isFlag: 1, params: {} });
pathList.value = res.data || [];
}
};
const loadFormOptions = async () => {
await Promise.all([getMaterialList(), getPathList()]);
}
};
const handleMaterialChange = (materialCode?: string) => {
const material = materialList.value.find(item => item.materialCode === materialCode);
const material = materialList.value.find((item) => item.materialCode === materialCode);
//
form.value.materialBarcode = material?.materialBarcode;
}
};
const handleDetailMaterialChange = (row: TaskDetailForm) => {
const material = materialList.value.find(item => item.materialCode === row.materialCode);
const material = materialList.value.find((item) => item.materialCode === row.materialCode);
//
row.materialBarcode = material?.materialBarcode;
}
};
const cancel = () => {
reset();
dialog.visible = false;
}
};
const reset = () => {
form.value = { ...initFormData, isFlag: 1, details: [] };
detailList.value = [];
activeTab.value = 'basic';
taskQueueFormRef.value?.resetFields();
}
};
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
};
const resetQuery = () => {
queryFormRef.value?.resetFields();
//
dateRange.value = getTodayCreatedTimeRange();
handleQuery();
}
};
const handleSelectionChange = (selection: TaskQueueVO[]) => {
ids.value = selection.map(item => item.objId);
ids.value = selection.map((item) => item.objId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
};
const handleAdd = async () => {
reset();
await loadFormOptions();
dialog.visible = true;
dialog.title = "添加实时任务队列";
}
dialog.title = '添加实时任务队列';
};
const handleUpdate = async (row?: TaskQueueVO) => {
reset();
await loadFormOptions();
const _objId = row?.objId || ids.value[0]
const _objId = row?.objId || ids.value[0];
const res = await getTaskQueue(_objId);
Object.assign(form.value, res.data);
detailList.value = res.data.details ? res.data.details.map((d: TaskDetailVO) => ({
objId: d.objId,
taskCode: d.taskCode,
materialCode: d.materialCode,
palletBarcode: d.palletBarcode,
materialBarcode: d.materialBarcode,
materialCount: d.materialCount,
taskType: d.taskType,
taskCategory: d.taskCategory,
startPoint: d.startPoint,
endPoint: d.endPoint,
isValidate: d.isValidate,
pathCode: d.pathCode,
taskStatus: d.taskStatus,
isFlag: d.isFlag,
remark: d.remark
})) : [];
detailList.value = res.data.details
? res.data.details.map((d: TaskDetailVO) => ({
objId: d.objId,
taskCode: d.taskCode,
materialCode: d.materialCode,
palletBarcode: d.palletBarcode,
materialBarcode: d.materialBarcode,
materialCount: d.materialCount,
taskType: d.taskType,
taskCategory: d.taskCategory,
startPoint: d.startPoint,
endPoint: d.endPoint,
isValidate: d.isValidate,
pathCode: d.pathCode,
taskStatus: d.taskStatus,
isFlag: d.isFlag,
remark: d.remark
}))
: [];
dialog.visible = true;
dialog.title = "修改实时任务队列";
}
dialog.title = '修改实时任务队列';
};
const handleDetail = async (row: TaskQueueVO) => {
detailDrawer.visible = true;
detailDrawer.title = `任务明细 - ${row.taskCode}`;
taskDetailDrawerList.value = [];
detailLoading.value = true;
try {
const res = await listTaskDetail({
pageNum: 1,
pageSize: 999,
taskCode: row.taskCode,
params: {}
});
taskDetailDrawerList.value = res.rows || [];
} finally {
detailLoading.value = false;
}
};
const handleAddDetail = () => {
detailList.value.push({
@ -531,11 +614,11 @@ const handleAddDetail = () => {
isFlag: 1,
remark: ''
});
}
};
const handleDelDetail = (index: number) => {
detailList.value.splice(index, 1);
}
};
const buildSubmitData = (): TaskQueueForm => ({
objId: form.value.objId,
@ -554,7 +637,7 @@ const buildSubmitData = (): TaskQueueForm => ({
isFlag: form.value.isFlag,
remark: form.value.remark,
//
details: detailList.value.map(item => ({
details: detailList.value.map((item) => ({
objId: item.objId,
taskCode: form.value.taskCode || '',
materialCode: item.materialCode,
@ -579,36 +662,40 @@ const submitForm = () => {
buttonLoading.value = true;
const submitData = buildSubmitData();
if (submitData.objId) {
await updateTaskQueue(submitData).finally(() => buttonLoading.value = false);
await updateTaskQueue(submitData).finally(() => (buttonLoading.value = false));
} else {
await addTaskQueue(submitData).finally(() => buttonLoading.value = false);
await addTaskQueue(submitData).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess("操作成功");
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
}
};
const handleDelete = async (row?: TaskQueueVO) => {
const _objIds = row?.objId || ids.value;
try {
await proxy?.$modal.confirm('是否确认删除实时任务队列编号为"' + _objIds + '"的数据项?');
await delTaskQueue(_objIds);
proxy?.$modal.msgSuccess("删除成功");
proxy?.$modal.msgSuccess('删除成功');
await getList();
} catch (e) {
if (e !== 'cancel' && e !== 'close') {
proxy?.$modal.msgError("删除实时任务队列失败");
proxy?.$modal.msgError('删除实时任务队列失败');
}
}
}
};
const handleExport = () => {
proxy?.download('wcs/taskQueue/export', {
...queryParams.value
}, `taskQueue_${new Date().getTime()}.xlsx`)
}
proxy?.download(
'wcs/taskQueue/export',
{
...queryParams.value
},
`taskQueue_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();

@ -24,7 +24,7 @@ export default defineConfig(({ mode, command }) => {
open: true,
proxy: {
[env.VITE_APP_BASE_API]: {
target: 'http://localhost:8080',
target: 'http://localhost:6798',
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')

Loading…
Cancel
Save