From f10cf167372f2d8c4c0e14f42f361d7ab96d8347 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 03 七月 2026 13:59:00 +0800
Subject: [PATCH] Merge branch 'dev_pro2.0' of http://114.132.189.42:9002/r/mom-pro2-before into dev_pro2.0
---
src/views/mes/process-design/template/modules/parameter-select-dialog.vue | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 207 insertions(+), 0 deletions(-)
diff --git a/src/views/mes/process-design/template/modules/parameter-select-dialog.vue b/src/views/mes/process-design/template/modules/parameter-select-dialog.vue
new file mode 100644
index 0000000..b4f87c6
--- /dev/null
+++ b/src/views/mes/process-design/template/modules/parameter-select-dialog.vue
@@ -0,0 +1,207 @@
+<script lang="ts" setup>
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { MesPdParameterApi } from '#/api/mes/pro/processdesign/parameter';
+
+import { nextTick, ref } from 'vue';
+
+import { DICT_TYPE } from '../../../../../packages/constants/src';
+
+import { Button, message, Modal } from 'ant-design-vue';
+
+import { useVbenVxeGrid } from '#/adapter/vxe-table';
+import { getParameterPage } from '#/api/mes/pro/processdesign/parameter';
+
+defineOptions({ name: 'PdParameterSelectDialog' });
+
+const emit = defineEmits<{
+ selected: [rows: MesPdParameterApi.Parameter[]];
+}>();
+
+const open = ref(false);
+const selectedRows = ref<MesPdParameterApi.Parameter[]>([]);
+const preSelectedIds = ref<number[]>([]);
+
+/** 鑾峰彇澶氶�夎褰曪紝鍖呭惈 VXE reserve 璺ㄩ〉璁板綍 */
+function getMultipleSelectedRows() {
+ const selectedMap = new Map<number, MesPdParameterApi.Parameter>();
+ const records = [
+ ...(gridApi.grid.getCheckboxReserveRecords?.() ?? []),
+ ...(gridApi.grid.getCheckboxRecords?.() ?? []),
+ ] as MesPdParameterApi.Parameter[];
+ records.forEach((row) => {
+ if (row.id) {
+ selectedMap.set(row.id, row);
+ }
+ });
+ return [...selectedMap.values()];
+}
+
+/** 澶勭悊鍕鹃�夊彉鍖� */
+function handleCheckboxSelectChange() {
+ selectedRows.value = getMultipleSelectedRows();
+}
+
+/** 澶氶�夋ā寮忎笅鍒囨崲琛屽嬀閫� */
+async function toggleMultipleRow(row: MesPdParameterApi.Parameter) {
+ const selected = gridApi.grid.isCheckedByCheckboxRow(row);
+ await gridApi.grid.setCheckboxRow(row, !selected);
+ selectedRows.value = getMultipleSelectedRows();
+}
+
+/** 澶勭悊琛屽弻鍑� */
+async function handleCellDblclick({ row }: { row: MesPdParameterApi.Parameter }) {
+ await toggleMultipleRow(row);
+}
+
+const [Grid, gridApi] = useVbenVxeGrid({
+ formOptions: {
+ schema: [
+ {
+ fieldName: 'code',
+ label: '鍙傛暟缂栫爜',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '璇疯緭鍏ュ弬鏁扮紪鐮�',
+ },
+ },
+ {
+ fieldName: 'name',
+ label: '鍙傛暟鍚嶇О',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '璇疯緭鍏ュ弬鏁板悕绉�',
+ },
+ },
+ ],
+ },
+ gridOptions: {
+ columns: [
+ { type: 'checkbox', width: 50 },
+ { field: 'code', title: '鍙傛暟缂栫爜', minWidth: 150 },
+ { field: 'name', title: '鍙傛暟鍚嶇О', minWidth: 180 },
+ {
+ field: 'type',
+ title: '鍙傛暟绫诲瀷',
+ width: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.MES_PD_PARAM_TYPE },
+ },
+ },
+ { field: 'unit', title: '鍗曚綅', width: 80 },
+ {
+ field: 'requiredFlag',
+ title: '鏄惁蹇呭~',
+ width: 90,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ ],
+ height: 520,
+ keepSource: true,
+ checkboxConfig: {
+ highlight: true,
+ range: true,
+ reserve: true,
+ },
+ proxyConfig: {
+ ajax: {
+ query: async ({ page }, formValues) => {
+ return await getParameterPage({
+ pageNo: page.currentPage,
+ pageSize: page.pageSize,
+ ...formValues,
+ });
+ },
+ },
+ },
+ rowConfig: {
+ keyField: 'id',
+ isHover: true,
+ },
+ toolbarConfig: {
+ refresh: true,
+ search: true,
+ },
+ } as VxeTableGridOptions<MesPdParameterApi.Parameter>,
+ gridEvents: {
+ cellDblclick: handleCellDblclick,
+ checkboxAll: handleCheckboxSelectChange,
+ checkboxChange: handleCheckboxSelectChange,
+ },
+});
+
+/** 鍥炴樉棰勯�夊弬鏁� */
+async function applyPreSelection() {
+ if (preSelectedIds.value.length === 0) {
+ return;
+ }
+ const rows = gridApi.grid.getTableData().fullData as MesPdParameterApi.Parameter[];
+ for (const row of rows) {
+ if (row.id === undefined || row.id === null || !preSelectedIds.value.includes(row.id)) {
+ continue;
+ }
+ await gridApi.grid.setCheckboxRow(row, true);
+ }
+ selectedRows.value = getMultipleSelectedRows();
+}
+
+/** 閲嶇疆鏌ヨ鍜岄�夋嫨鐘舵�� */
+async function resetQueryState() {
+ selectedRows.value = [];
+ await gridApi.grid.clearCheckboxRow();
+ await gridApi.grid.clearCheckboxReserve();
+ await gridApi.formApi.resetForm();
+}
+
+/** 鎵撳紑鍙傛暟閫夋嫨寮圭獥 */
+async function openModal(selectedIds?: number[]) {
+ open.value = true;
+ preSelectedIds.value = selectedIds || [];
+ await nextTick();
+ await resetQueryState();
+ await gridApi.query();
+ await nextTick();
+ await applyPreSelection();
+}
+
+/** 鍏抽棴鍙傛暟閫夋嫨寮圭獥 */
+async function closeModal() {
+ open.value = false;
+ await resetQueryState();
+}
+
+/** 纭閫夋嫨鍙傛暟 */
+function handleConfirm() {
+ const rows = getMultipleSelectedRows();
+ if (rows.length === 0) {
+ message.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+ return;
+ }
+ emit('selected', rows);
+ open.value = false;
+}
+
+defineExpose({ open: openModal });
+</script>
+
+<template>
+ <Modal
+ v-model:open="open"
+ title="宸ヨ壓鍙傛暟閫夋嫨"
+ width="70%"
+ :destroy-on-close="true"
+ @ok="handleConfirm"
+ @cancel="closeModal"
+ >
+ <Grid table-title="宸ヨ壓鍙傛暟鍒楄〃" />
+ <template #footer>
+ <Button @click="closeModal"> 鍙栨秷 </Button>
+ <Button type="primary" @click="handleConfirm"> 纭畾 </Button>
+ </template>
+ </Modal>
+</template>
--
Gitblit v1.9.3