From cca940a6460bc4ec4266df4e413b05921d1f2e1d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 16 四月 2026 09:55:16 +0800
Subject: [PATCH] 中兴实强 1.新增生产订单时候查询工序接口传参修改
---
src/views/basicData/product/ProductSelectDialog.vue | 149 +++++++++++++++++++++++++++++++------------------
1 files changed, 95 insertions(+), 54 deletions(-)
diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index 246cd88..358e6e4 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -1,28 +1,12 @@
<template>
- <el-dialog
- v-model="visible"
- title="閫夋嫨浜у搧"
- width="900px"
- destroy-on-close
- :close-on-click-modal="false"
- >
+ <el-dialog v-model="visible" title="閫夋嫨浜у搧" width="900px" destroy-on-close :close-on-click-modal="false">
<el-form :inline="true" :model="query" class="mb-2">
<el-form-item label="浜у搧澶х被">
- <el-input
- v-model="query.productName"
- placeholder="杈撳叆浜у搧澶х被"
- clearable
- @keyup.enter="onSearch"
- />
+ <el-input v-model="query.productName" placeholder="杈撳叆浜у搧澶х被" clearable @keyup.enter="onSearch" />
</el-form-item>
<el-form-item label="鍨嬪彿鍚嶇О">
- <el-input
- v-model="query.model"
- placeholder="杈撳叆鍨嬪彿鍚嶇О"
- clearable
- @keyup.enter="onSearch"
- />
+ <el-input v-model="query.model" placeholder="杈撳叆鍨嬪彿鍚嶇О" clearable @keyup.enter="onSearch" />
</el-form-item>
<el-form-item>
@@ -32,47 +16,34 @@
</el-form>
<!-- 鍒楄〃 -->
- <el-table
- v-loading="loading"
- :data="tableData"
- height="420"
- highlight-current-row
- row-key="id"
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="55" />
- <el-table-column type="index" label="#" width="60"/>
- <el-table-column prop="productName" label="浜у搧澶х被" min-width="160"/>
- <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200"/>
- <el-table-column prop="unit" label="鍗曚綅" min-width="160"/>
+ <el-table ref="tableRef" v-loading="loading" :data="tableData" height="420" highlight-current-row row-key="id"
+ @selection-change="handleSelectionChange" @select="handleSelect">
+ <el-table-column type="selection" width="55" :reserve-selection="true" />
+ <el-table-column type="index" label="搴忓彿" width="60" />
+ <el-table-column prop="productName" label="浜у搧澶х被" min-width="160" />
+ <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200" />
+ <el-table-column prop="unit" label="鍗曚綅" min-width="160" />
</el-table>
<div class="mt-3 flex justify-end">
- <el-pagination
- background
- layout="total, sizes, prev, pager, next, jumper"
- :total="total"
- v-model:page-size="page.pageSize"
- v-model:current-page="page.pageNum"
- :page-sizes="[10, 20, 50, 100]"
- @size-change="onPageChange"
- @current-change="onPageChange"
- />
+ <el-pagination background layout="total, sizes, prev, pager, next, jumper" :total="total"
+ v-model:page-size="page.pageSize" v-model:current-page="page.pageNum" :page-sizes="[10, 20, 50, 100]"
+ @size-change="onPageChange" @current-change="onPageChange" />
</div>
<template #footer>
- <el-button @click="close()">鍙栨秷</el-button>
<el-button type="primary" :disabled="multipleSelection.length === 0" @click="onConfirm">
纭畾
</el-button>
+ <el-button @click="close()">鍙栨秷</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
-import {computed, onMounted, reactive, ref, watch} from "vue";
-import {ElMessage} from "element-plus";
-import {productModelList} from '@/api/basicData/productModel'
+import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
+import { ElMessage } from "element-plus";
+import { productModelList } from '@/api/basicData/productModel'
export type ProductRow = {
id: number;
@@ -83,6 +54,7 @@
const props = defineProps<{
modelValue: boolean;
+ single?: boolean;
}>();
const emit = defineEmits(['update:modelValue', 'confirm']);
@@ -105,14 +77,70 @@
const loading = ref(false);
const tableData = ref<ProductRow[]>([]);
const total = ref(0);
-const multipleSelection = ref<ProductRow[]>([])
+const multipleSelection = ref<ProductRow[]>([]);
+const selectedMap = ref<Map<number, ProductRow>>(new Map());
+const tableRef = ref();
function close() {
visible.value = false;
}
+function syncCurrentPageSelection() {
+ nextTick(() => {
+ if (!tableRef.value) {
+ return;
+ }
+
+ tableData.value.forEach((item) => {
+ tableRef.value.toggleRowSelection(item, selectedMap.value.has(item.id));
+ });
+ });
+}
+
const handleSelectionChange = (val: ProductRow[]) => {
- multipleSelection.value = val
+ if (props.single && val.length > 1) {
+ const lastSelected = val[val.length - 1];
+ multipleSelection.value = [lastSelected];
+ selectedMap.value = new Map(lastSelected ? [[lastSelected.id, lastSelected]] : []);
+ nextTick(() => {
+ if (tableRef.value) {
+ tableRef.value.clearSelection();
+ if (lastSelected) {
+ tableRef.value.toggleRowSelection(lastSelected, true);
+ }
+ }
+ });
+ return;
+ }
+
+ const currentPageIds = new Set(tableData.value.map((item) => item.id));
+ currentPageIds.forEach((id) => {
+ selectedMap.value.delete(id);
+ });
+ val.forEach((item) => {
+ selectedMap.value.set(item.id, item);
+ });
+ multipleSelection.value = Array.from(selectedMap.value.values());
+}
+
+const handleSelect = (selection: ProductRow[], row: ProductRow) => {
+ if (!props.single) {
+ return;
+ }
+
+ if (selection.includes(row)) {
+ multipleSelection.value = [row];
+ selectedMap.value = new Map([[row.id, row]]);
+ nextTick(() => {
+ if (tableRef.value) {
+ tableData.value.forEach((item) => {
+ if (item.id !== row.id) {
+ tableRef.value.toggleRowSelection(item, false);
+ }
+ });
+ }
+ });
+ }
}
function onSearch() {
@@ -133,30 +161,43 @@
function onConfirm() {
if (multipleSelection.value.length === 0) {
- ElMessage.warning("璇烽�夋嫨涓�鏉′骇鍝�");
+ ElMessage.warning("璇烽�夋嫨浜у搧");
return;
}
- emit("confirm", multipleSelection.value);
+ if (props.single && multipleSelection.value.length > 1) {
+ ElMessage.warning("鍙兘閫夋嫨涓�涓骇鍝�");
+ return;
+ }
+ emit("confirm", props.single ? [multipleSelection.value[0]] : multipleSelection.value);
close();
}
async function loadData() {
loading.value = true;
try {
- multipleSelection.value = []; // 缈婚〉/鎼滅储鍚庢竻绌洪�夋嫨鏇寸鍚堥鏈�
- const res = await productModelList({
+ const res: any = await productModelList({
productName: query.productName.trim(),
model: query.model.trim(),
current: page.pageNum,
size: page.pageSize,
});
- tableData.value = res.records;
- total.value = res.total;
+ tableData.value = res.records || [];
+ total.value = res.total || 0;
+ syncCurrentPageSelection();
} finally {
loading.value = false;
}
}
+watch(() => props.modelValue, (visible) => {
+ if (visible) {
+ multipleSelection.value = [];
+ selectedMap.value = new Map();
+ page.pageNum = 1;
+ loadData();
+ }
+});
+
onMounted(() => {
loadData()
})
--
Gitblit v1.9.3