优化
This commit is contained in:
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
<!-- <header-search id="header-search" class="right-menu-item" /> -->
|
<!-- <header-search id="header-search" class="right-menu-item" /> -->
|
||||||
<search-menu ref="searchMenuRef" />
|
<search-menu ref="searchMenuRef" />
|
||||||
<el-tooltip effect="dark" placement="bottom">
|
<el-tooltip effect="dark" placement="bottom">
|
||||||
<ProjectSelector />
|
<ProjectSelector />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<!-- <el-tooltip content="搜索" effect="dark" placement="bottom">
|
<!-- <el-tooltip content="搜索" effect="dark" placement="bottom">
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" />
|
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" />
|
||||||
<template #title>
|
<template #title>
|
||||||
<span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span>
|
<span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span>
|
||||||
|
<span class="bage" v-if="onlyOneChild.meta?.title == '我的待办' && total > 0">{{ total }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
</app-link>
|
</app-link>
|
||||||
@ -34,7 +35,11 @@ import { isExternal } from '@/utils/validate';
|
|||||||
import AppLink from './Link.vue';
|
import AppLink from './Link.vue';
|
||||||
import { getNormalPath } from '@/utils/ruoyi';
|
import { getNormalPath } from '@/utils/ruoyi';
|
||||||
import { RouteRecordRaw } from 'vue-router';
|
import { RouteRecordRaw } from 'vue-router';
|
||||||
|
import { pageByTaskWait } from '@/api/workflow/task';
|
||||||
|
import useUserStore from '@/store/modules/user';
|
||||||
|
import useNoticeStore from '@/store/modules/notice';
|
||||||
|
const userStore = useUserStore();
|
||||||
|
const noticeStore = storeToRefs(useNoticeStore());
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
item: {
|
item: {
|
||||||
type: Object as PropType<RouteRecordRaw>,
|
type: Object as PropType<RouteRecordRaw>,
|
||||||
@ -49,7 +54,21 @@ const props = defineProps({
|
|||||||
default: ''
|
default: ''
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
const total = ref(0);
|
||||||
|
onMounted(() => {
|
||||||
|
if (onlyOneChild.value.meta?.title == '我的待办') {
|
||||||
|
getWaitingList();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 获取我的待办
|
||||||
|
//分页
|
||||||
|
const getWaitingList = () => {
|
||||||
|
pageByTaskWait({ pageNum: 1, pageSize: 10 }).then((resp) => {
|
||||||
|
console.log(resp);
|
||||||
|
|
||||||
|
total.value = resp.total;
|
||||||
|
});
|
||||||
|
};
|
||||||
const onlyOneChild = ref<any>({});
|
const onlyOneChild = ref<any>({});
|
||||||
|
|
||||||
const hasOneShowingChild = (parent: RouteRecordRaw, children?: RouteRecordRaw[]) => {
|
const hasOneShowingChild = (parent: RouteRecordRaw, children?: RouteRecordRaw[]) => {
|
||||||
@ -64,12 +83,12 @@ const hasOneShowingChild = (parent: RouteRecordRaw, children?: RouteRecordRaw[])
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// When there is only one child router, the child router is displayed by default
|
// 只有一个子路由时默认显示子路由
|
||||||
if (showingChildren.length === 1) {
|
if (showingChildren.length === 1) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show parent if there are no child router to display
|
// 没有子路由可显示时显示父路由
|
||||||
if (showingChildren.length === 0) {
|
if (showingChildren.length === 0) {
|
||||||
onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };
|
onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };
|
||||||
return true;
|
return true;
|
||||||
@ -98,4 +117,48 @@ const hasTitle = (title: string | undefined): string => {
|
|||||||
}
|
}
|
||||||
return title;
|
return title;
|
||||||
};
|
};
|
||||||
|
//用深度监听 消息
|
||||||
|
watch(
|
||||||
|
() => noticeStore.state.value.notices,
|
||||||
|
(newVal) => {
|
||||||
|
if (onlyOneChild.value.meta?.title == '我的待办') {
|
||||||
|
// 延迟1秒
|
||||||
|
let time = setTimeout(() => {
|
||||||
|
getWaitingList();
|
||||||
|
clearTimeout(time);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.bage {
|
||||||
|
position: absolute;
|
||||||
|
top: 6px;
|
||||||
|
right: 36px;
|
||||||
|
padding: 0 6px;
|
||||||
|
height: 16px;
|
||||||
|
line-height: 16px;
|
||||||
|
background: #ff7a7a;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #fff;
|
||||||
|
white-space: nowrap;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-menu-item .el-menu-item__content {
|
||||||
|
position: relative;
|
||||||
|
padding-right: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-title {
|
||||||
|
display: inline-block;
|
||||||
|
max-width: calc(100% - 24px);
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
:collapse-transition="false"
|
:collapse-transition="false"
|
||||||
mode="vertical"
|
mode="vertical"
|
||||||
>
|
>
|
||||||
<sidebar-item v-for="(r, index) in sidebarRouters" :key="r.path + index" :item="r" :base-path="r.path" />
|
<sidebar-item v-for="(r, index) in sidebarRouters" :key="r.path + index" :item="r" :base-path="r.path" />
|
||||||
</el-menu>
|
</el-menu>
|
||||||
</transition>
|
</transition>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="工程名称" prop="projectName">
|
<el-form-item label="工程名称" prop="projectName">
|
||||||
<el-input v-model="form.projectName" placeholder="请输入工程名称" /> </el-form-item
|
<el-input v-model="form.projectName" disabled placeholder="请输入工程名称" /> </el-form-item
|
||||||
></el-col>
|
></el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="原卷册号" prop="volumeNo">
|
<el-form-item label="原卷册号" prop="volumeNo">
|
||||||
@ -254,7 +254,7 @@ const initFormData = {
|
|||||||
id: undefined,
|
id: undefined,
|
||||||
projectId: currentProject.value?.id,
|
projectId: currentProject.value?.id,
|
||||||
formNo: undefined,
|
formNo: undefined,
|
||||||
projectName: undefined,
|
projectName: currentProject.value?.name,
|
||||||
submitUnit: undefined,
|
submitUnit: undefined,
|
||||||
specialty: undefined,
|
specialty: undefined,
|
||||||
specialtyName: undefined,
|
specialtyName: undefined,
|
||||||
|
@ -85,9 +85,10 @@
|
|||||||
<el-input v-model="form.projectName" placeholder="请输入工程名称" />
|
<el-input v-model="form.projectName" placeholder="请输入工程名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="24">
|
||||||
|
<!-- 设备材料名称:从数量验收列表自动生成,禁用手动输入 -->
|
||||||
<el-form-item label="设备材料名称" prop="materialName">
|
<el-form-item label="设备材料名称" prop="materialName">
|
||||||
<el-input v-model="form.materialName" placeholder="请输入设备材料名称" />
|
<el-input v-model="form.materialName" placeholder="由数量验收列表中的名称自动生成" disabled style="cursor: not-allowed" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
@ -130,7 +131,7 @@
|
|||||||
:rules="[{ required: true, message: '名称不能为空', trigger: 'blur' }]"
|
:rules="[{ required: true, message: '名称不能为空', trigger: 'blur' }]"
|
||||||
>
|
>
|
||||||
<el-select v-model="item.name" placeholder="请选择名称" @change="(value) => getNameChange(value, index, item)">
|
<el-select v-model="item.name" placeholder="请选择名称" @change="(value) => getNameChange(value, index, item)">
|
||||||
<el-option v-for="item in optionsName" :key="item.id" :label="item.materialsName" :value="item.id" />
|
<el-option v-for="opt in optionsName" :key="opt.id" :label="opt.materialsName" :value="opt.materialsName" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@ -200,7 +201,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" :prop="`itemList.${index}.remark`">
|
||||||
<el-input v-model="item.remark" placeholder="请输入内容" />
|
<el-input v-model="item.remark" placeholder="请输入内容" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@ -304,7 +305,7 @@ const getInitFormData = () => {
|
|||||||
materialSource: '1',
|
materialSource: '1',
|
||||||
formCode: undefined,
|
formCode: undefined,
|
||||||
projectName: undefined,
|
projectName: undefined,
|
||||||
materialName: undefined,
|
materialName: '', // 初始化为空字符串
|
||||||
orderingUnit: undefined,
|
orderingUnit: undefined,
|
||||||
supplierUnit: undefined,
|
supplierUnit: undefined,
|
||||||
issueUnit: undefined,
|
issueUnit: undefined,
|
||||||
@ -327,7 +328,7 @@ const getInitFormData = () => {
|
|||||||
stockQuantity: undefined,
|
stockQuantity: undefined,
|
||||||
issuedQuantity: undefined,
|
issuedQuantity: undefined,
|
||||||
remainingQuantity: undefined,
|
remainingQuantity: undefined,
|
||||||
name: undefined,
|
name: undefined, // 数量验收的名称
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
materialsId: undefined
|
materialsId: undefined
|
||||||
}
|
}
|
||||||
@ -355,7 +356,7 @@ const data = reactive({
|
|||||||
rules: {
|
rules: {
|
||||||
formCode: [{ required: true, message: '请输入表单编号', trigger: 'blur' }],
|
formCode: [{ required: true, message: '请输入表单编号', trigger: 'blur' }],
|
||||||
projectName: [{ required: true, message: '请输入工程名称', trigger: 'blur' }],
|
projectName: [{ required: true, message: '请输入工程名称', trigger: 'blur' }],
|
||||||
materialName: [{ required: true, message: '请输入设备材料名称', trigger: 'blur' }],
|
materialName: [{ required: true, message: '请先在数量验收列表中选择名称', trigger: 'blur' }], // 确保有名称生成
|
||||||
orderingUnit: [{ required: true, message: '请输入订货单位', trigger: 'blur' }],
|
orderingUnit: [{ required: true, message: '请输入订货单位', trigger: 'blur' }],
|
||||||
supplierUnit: [{ required: true, message: '请输入供货单位', trigger: 'blur' }],
|
supplierUnit: [{ required: true, message: '请输入供货单位', trigger: 'blur' }],
|
||||||
issueUnit: [{ required: true, message: '请输入领料单位', trigger: 'blur' }],
|
issueUnit: [{ required: true, message: '请输入领料单位', trigger: 'blur' }],
|
||||||
@ -364,6 +365,24 @@ const data = reactive({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const { queryParams, form, rules } = toRefs(data);
|
const { queryParams, form, rules } = toRefs(data);
|
||||||
|
const optionsName: any = ref([]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 核心函数:从数量验收列表提取名称,用逗号拼接生成设备材料名称
|
||||||
|
*/
|
||||||
|
const computeMaterialName = () => {
|
||||||
|
if (!form.value.itemList || form.value.itemList.length === 0) {
|
||||||
|
form.value.materialName = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 过滤空名称,去重(可选,根据业务需求决定是否去重)
|
||||||
|
const validNames = form.value.itemList
|
||||||
|
.filter((item) => item.name && item.name.trim() !== '')
|
||||||
|
.map((item) => item.name.trim())
|
||||||
|
.filter((name, index, self) => self.indexOf(name) === index); // 去重(如需保留重复则删除这行)
|
||||||
|
|
||||||
|
form.value.materialName = validNames.join(',');
|
||||||
|
};
|
||||||
|
|
||||||
/** 查询物料领料单列表 */
|
/** 查询物料领料单列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
@ -377,8 +396,6 @@ const getList = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const optionsName: any = ref([]);
|
|
||||||
|
|
||||||
// 获取材料名称列表
|
// 获取材料名称列表
|
||||||
const getName = async () => {
|
const getName = async () => {
|
||||||
try {
|
try {
|
||||||
@ -391,17 +408,16 @@ const getName = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 材料名称选择变化处理
|
// 材料名称选择变化处理(修改select的value为名称,而非ID)
|
||||||
const getNameChange = (value, index, item) => {
|
const getNameChange = (value, index, item) => {
|
||||||
const data = optionsName.value.find((item) => item.id == value);
|
const selected = optionsName.value.find((opt) => opt.materialsName === value);
|
||||||
if (data) {
|
if (selected) {
|
||||||
form.value.itemList[index].name = data.materialsName;
|
item.name = selected.materialsName; // 直接赋值名称
|
||||||
form.value.itemList[index].materialsId = data.id;
|
item.materialsId = selected.id; // 保留ID用于后端
|
||||||
form.value.itemList[index].specification = data.typeSpecificationName;
|
item.specification = selected.typeSpecificationName;
|
||||||
form.value.itemList[index].unit = data.weightId;
|
item.unit = selected.weightId;
|
||||||
form.value.itemList[index].stockQuantity = data.inventoryNumber;
|
item.stockQuantity = Number(selected.inventoryNumber) || 0;
|
||||||
// 触发剩余数量计算
|
calculateRemaining(index); // 计算剩余数量
|
||||||
calculateRemaining(index);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -477,6 +493,8 @@ const reset = () => {
|
|||||||
if (form.value.itemList.length > 0) {
|
if (form.value.itemList.length > 0) {
|
||||||
watchItemChanges(0);
|
watchItemChanges(0);
|
||||||
}
|
}
|
||||||
|
// 初始计算一次材料名称
|
||||||
|
computeMaterialName();
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 监听条目变化,自动计算剩余数量 */
|
/** 监听条目变化,自动计算剩余数量 */
|
||||||
@ -522,6 +540,8 @@ const handleAdd = () => {
|
|||||||
reset();
|
reset();
|
||||||
dialog.visible = true;
|
dialog.visible = true;
|
||||||
dialog.title = '添加物料领料单';
|
dialog.title = '添加物料领料单';
|
||||||
|
// 新增时初始计算材料名称
|
||||||
|
computeMaterialName();
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 修改按钮操作 */
|
/** 修改按钮操作 */
|
||||||
@ -532,33 +552,41 @@ const handleUpdate = async (row?: MaterialIssueVO) => {
|
|||||||
const res = await getMaterialIssue(_id);
|
const res = await getMaterialIssue(_id);
|
||||||
Object.assign(form.value, res.data);
|
Object.assign(form.value, res.data);
|
||||||
|
|
||||||
// 确保itemList存在
|
// 确保itemList存在且格式正确
|
||||||
if (!form.value.itemList) {
|
if (!form.value.itemList) {
|
||||||
form.value.itemList = [];
|
form.value.itemList = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转换数据类型并计算剩余数量(关键修复)
|
// 转换数据类型并计算剩余数量
|
||||||
form.value.itemList = form.value.itemList.map((item) => ({
|
form.value.itemList = form.value.itemList.map((item) => ({
|
||||||
...item,
|
...item,
|
||||||
stockQuantity: Number(item.stockQuantity) || 0,
|
stockQuantity: Number(item.stockQuantity) || 0,
|
||||||
issuedQuantity: Number(item.issuedQuantity) || 0,
|
issuedQuantity: Number(item.issuedQuantity) || 0,
|
||||||
remainingQuantity: Number(item.remainingQuantity) || 0
|
remainingQuantity: Number(item.remainingQuantity) || 0,
|
||||||
|
name: item.name || '' // 确保名称不为undefined
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// 为每个条目添加监听并强制计算剩余数量
|
// 为每个条目添加监听并强制计算剩余数量
|
||||||
form.value.itemList.forEach((_, index) => {
|
form.value.itemList.forEach((_, index) => {
|
||||||
watchItemChanges(index);
|
watchItemChanges(index);
|
||||||
calculateRemaining(index); // 强制计算确保数据一致性
|
calculateRemaining(index);
|
||||||
});
|
});
|
||||||
// 手动触发一次验证(关键修复)
|
|
||||||
|
// 关键:编辑时从itemList重新计算设备材料名称(覆盖后端返回的旧值)
|
||||||
|
computeMaterialName();
|
||||||
|
|
||||||
|
// 手动触发一次验证
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (materialIssueFormRef.value) {
|
if (materialIssueFormRef.value) {
|
||||||
form.value.itemList.forEach((_, index) => {
|
form.value.itemList.forEach((_, index) => {
|
||||||
materialIssueFormRef.value.validateField(`itemList.${index}.issuedQuantity`);
|
materialIssueFormRef.value.validateField(`itemList.${index}.issuedQuantity`);
|
||||||
materialIssueFormRef.value.validateField(`itemList.${index}.remainingQuantity`);
|
materialIssueFormRef.value.validateField(`itemList.${index}.remainingQuantity`);
|
||||||
});
|
});
|
||||||
|
// 验证设备材料名称
|
||||||
|
materialIssueFormRef.value.validateField('materialName');
|
||||||
}
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
dialog.visible = true;
|
dialog.visible = true;
|
||||||
dialog.title = '修改物料领料单';
|
dialog.title = '修改物料领料单';
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -616,6 +644,8 @@ const addItem = () => {
|
|||||||
form.value.itemList.push(newItem);
|
form.value.itemList.push(newItem);
|
||||||
// 监听新条目
|
// 监听新条目
|
||||||
watchItemChanges(form.value.itemList.length - 1);
|
watchItemChanges(form.value.itemList.length - 1);
|
||||||
|
// 添加后重新计算材料名称
|
||||||
|
computeMaterialName();
|
||||||
};
|
};
|
||||||
|
|
||||||
// 删除数量验收条目
|
// 删除数量验收条目
|
||||||
@ -627,6 +657,8 @@ const removeItem = (index: number) => {
|
|||||||
}
|
}
|
||||||
form.value.itemList.splice(index, 1);
|
form.value.itemList.splice(index, 1);
|
||||||
itemWatchStopFns.value.splice(index, 1);
|
itemWatchStopFns.value.splice(index, 1);
|
||||||
|
// 删除后重新计算材料名称
|
||||||
|
computeMaterialName();
|
||||||
} else {
|
} else {
|
||||||
proxy?.$modal.msgWarning('至少需要保留一条数量验收记录');
|
proxy?.$modal.msgWarning('至少需要保留一条数量验收记录');
|
||||||
}
|
}
|
||||||
@ -652,6 +684,15 @@ const handleView = (row) => {
|
|||||||
wordllssueRef.value?.openDialog(row);
|
wordllssueRef.value?.openDialog(row);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 关键:监听数量验收列表变化,实时更新设备材料名称
|
||||||
|
watch(
|
||||||
|
() => form.value.itemList,
|
||||||
|
() => {
|
||||||
|
computeMaterialName();
|
||||||
|
},
|
||||||
|
{ deep: true, immediate: true } // deep监听数组内部变化,immediate初始执行
|
||||||
|
);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getList();
|
getList();
|
||||||
getName();
|
getName();
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true">
|
<el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true">
|
||||||
<el-form-item>
|
<!-- <el-form-item>
|
||||||
<el-badge :value="userSelectCount" :max="10" class="item">
|
<el-badge :value="userSelectCount" :max="10" class="item">
|
||||||
<el-button type="primary" @click="openUserSelect">选择申请人</el-button>
|
<el-button type="primary" @click="openUserSelect">选择申请人</el-button>
|
||||||
</el-badge>
|
</el-badge>
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
<el-form-item label="任务名称" prop="nodeName">
|
<el-form-item label="任务名称" prop="nodeName">
|
||||||
<el-input v-model="queryParams.nodeName" placeholder="请输入任务名称" @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.nodeName" placeholder="请输入任务名称" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
Reference in New Issue
Block a user