提交 d692b0a9 authored 作者: liuluyu's avatar liuluyu

更新tb5字段

上级 320bc7ff
...@@ -2,20 +2,42 @@ ...@@ -2,20 +2,42 @@
<div> <div>
<vxe-grid ref="refGrid" v-bind="gridOptions" v-on="gridEvents" :footerData="setFooterData"> <vxe-grid ref="refGrid" v-bind="gridOptions" v-on="gridEvents" :footerData="setFooterData">
<template #select="{ row, column }"> <template #select="{ row, column }">
<vxe-select v-model="row[column.field]" filterable> <vxe-select v-model="row[column.field]" filterable @change="handleCol4Change(row, column, $event)">
<vxe-option v-for="(opt, optIndex) in column.editRender.options" :key="optIndex" :label="opt" :value="opt"></vxe-option> <vxe-option v-for="(opt, optIndex) in column.editRender.options" :key="optIndex" :label="opt" :value="opt"></vxe-option>
</vxe-select> </vxe-select>
</template> </template>
<template #select_dynamic="{ row, column }">
<div style="display: flex; flex-wrap: wrap; gap: 8px; align-items: center">
<vxe-select v-model="row[column.field]" filterable :disabled="!column.editRender.getOptions?.(row)?.length" style="min-width: 120px">
<vxe-option v-for="(opt, optIndex) in column.editRender.getOptions?.(row) || []" :key="optIndex" :label="opt" :value="opt" />
</vxe-select>
<vxe-input
v-if="
(row.COL4 === '软件类(银行业)' || row.COL4 === '软件类(保险业)') &&
(row.COL5 === '其他' || !(column.editRender.getOptions?.(row) || []).includes(row.COL5))
"
v-model="row[column.field]"
placeholder="请输入"
style="min-width: 150px"
/>
</div>
</template>
<template #other_input="{ row, column }">
<vxe-input v-model="row[column.field]" placeholder="请输入" :disabled="row.COL4 !== '其他'" />
</template>
<template #default_select="{ row, column }"> <template #default_select="{ row, column }">
<span>{{ row[column.field] }}</span> <span>{{ row[column.field] }}</span>
</template> </template>
<template #default_other="{ row, column }">
<span v-if="row.COL4 === '其他'">{{ row[column.field] }}</span>
</template>
<template #footer_seq="{ row,column }"> <template #footer_seq="{ row, column }">
<span style="color: blue;">{{ row[column.field] }}</span> <span style="color: blue">{{ row[column.field] }}</span>
</template> </template>
<template #footer_num="{ row,column }"> <template #footer_num="{ row, column }">
<span style="color: red;">{{ row[column.field] }}</span> <span style="color: red">{{ row[column.field] }}</span>
</template> </template>
<template #action="{ row, rowIndex }"> <template #action="{ row, rowIndex }">
...@@ -27,106 +49,113 @@ ...@@ -27,106 +49,113 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, computed,ref } from 'vue' import { reactive, computed, ref } from 'vue';
import type { VxeGridProps, VxeTablePropTypes, VxeGridListeners } from 'vxe-table' import type { VxeGridProps, VxeTablePropTypes, VxeGridListeners } from 'vxe-table';
import type { VxeSelectProps } from 'vxe-pc-ui' import type { VxeSelectProps } from 'vxe-pc-ui';
const props = defineProps({ const props = defineProps({
title: String, title: String,
data: { data: {
type: Array as () => any[], type: Array as () => any[],
default: () => [] default: () => [],
}, },
columns: { columns: {
type: Array as () => any[], type: Array as () => any[],
required: true required: true,
}, },
footerData: { footerData: {
type: Array as () => any[], type: Array as () => any[],
default: () => [] default: () => [],
}, },
showFooter: { showFooter: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
height: { height: {
default: '' default: '',
},
rowHeight: {
type: [Number, String],
default: 40,
}, },
});
}) const formData = reactive({});
const formData = reactive({}) const formFooterData = reactive({});
const formFooterData = reactive({}) const handleCol4Change = (row, column, value) => {
if (column.field === 'COL4') {
row.COL5 = '';
}
};
const sumNum = (list: any[], field: string) => { const sumNum = (list: any[], field: string) => {
let count = 0 let count = 0;
list.forEach(item => { list.forEach((item) => {
if (item[field]) { if (item[field]) {
count += Number(item[field]) count += Number(item[field]);
} }
}) });
return count return count;
} };
const gridOptions = reactive<VxeGridProps<any> & { editConfig: VxeTablePropTypes.EditConfig<any> }>({ const gridOptions = reactive<VxeGridProps<any> & { editConfig: VxeTablePropTypes.EditConfig<any> }>({
border: true, border: true,
showOverflow: true, showOverflow: true,
showFooter:props.showFooter, showFooter: props.showFooter,
loading: false, loading: false,
editConfig: { editConfig: {
enabled: true, enabled: true,
trigger: 'click', trigger: 'click',
mode: 'row' mode: 'row',
}, },
height:props.height, height: props.height,
rowConfig: { rowConfig: {
useKey: true, useKey: true,
resizable: true resizable: true,
height: props.rowHeight,
}, },
columnConfig: { columnConfig: {
useKey: true, useKey: true,
resizable: true resizable: true,
}, },
toolbarConfig: { toolbarConfig: {
zoom: true, zoom: true,
custom: true, custom: true,
buttons: [ buttons: [{ name: '添加', mode: 'text', status: 'primary', code: 'myAdd', icon: 'vxe-icon-add' }],
{ name: "添加", mode: "text", status: "primary", code: 'myAdd', icon: "vxe-icon-add" },
]
}, },
columns: props.columns, columns: props.columns,
data: props.data || [], data: props.data || [],
footerData:props.footerData||[] footerData: props.footerData || [],
}) });
const setFooterData = computed(() => { const setFooterData = computed(() => {
if (!props.footerData || !props.footerData.length) return []; if (!props.footerData || !props.footerData.length) return [];
const footer = [...props.footerData]; const footer = [...props.footerData];
const result = []; const result = [];
footer.forEach(item => { footer.forEach((item) => {
// 创建基础行对象 // 创建基础行对象
const row = { const row = {
[item.labelField]: item.labelValue [item.labelField]: item.labelValue,
}; };
// 计算需要求和的字段 // 计算需要求和的字段
if (item.tp === 'sum' && gridOptions.data?.length) { if (item.tp === 'sum' && gridOptions.data?.length) {
item.fields.forEach(field => { item.fields.forEach((field) => {
row[field] = sumNum(gridOptions.data, field); row[field] = sumNum(gridOptions.data, field);
formFooterData[item.xmlCode[field]] = row[field] formFooterData[item.xmlCode[field]] = row[field];
}); });
} }
// 如果需要计算平均值 // 如果需要计算平均值
if (item.tp === 'avg' && gridOptions.data?.length) { if (item.tp === 'avg' && gridOptions.data?.length) {
item.fields.forEach(field => { item.fields.forEach((field) => {
const sum = sumNum(gridOptions.data, field); const sum = sumNum(gridOptions.data, field);
row[field] = sum / gridOptions.data.length; row[field] = sum / gridOptions.data.length;
formFooterData[item.xmlCode[field]] = row[field] formFooterData[item.xmlCode[field]] = row[field];
}); });
} }
...@@ -134,42 +163,42 @@ const setFooterData = computed(() => { ...@@ -134,42 +163,42 @@ const setFooterData = computed(() => {
}); });
return result; return result;
}); });
const safeAddNewRecord = async () => { const safeAddNewRecord = async () => {
try { try {
const newRecord: Record<string, any> = {} const newRecord: Record<string, any> = {};
gridOptions.data?.unshift(newRecord) gridOptions.data?.unshift(newRecord);
} catch (error) { } catch (error) {
console.error('添加记录出错:', error) console.error('添加记录出错:', error);
} }
} };
const insertRow = async (row: any, ind: number) => { const insertRow = async (row: any, ind: number) => {
gridOptions.data?.splice(ind+1, 0, {}) gridOptions.data?.splice(ind + 1, 0, {});
refGrid.value.setEditRow(gridOptions.data[ind+1]) refGrid.value.setEditRow(gridOptions.data[ind + 1]);
} };
const removeRow = async (row: any, ind: number) => { const removeRow = async (row: any, ind: number) => {
cancelRow(); cancelRow();
gridOptions.data?.splice(ind, 1) gridOptions.data?.splice(ind, 1);
} };
const gridEvents: VxeGridListeners = { const gridEvents: VxeGridListeners = {
toolbarButtonClick (params) { toolbarButtonClick(params) {
if(params.code=="myAdd") { if (params.code == 'myAdd') {
safeAddNewRecord() safeAddNewRecord();
}
} }
} },
};
const refGrid = ref() const refGrid = ref();
const getFormData = async () => { const getFormData = async () => {
await cancelRow() await cancelRow();
const fieldNames = getAllFields(props.columns) const fieldNames = getAllFields(props.columns);
const newDatas = gridOptions.data?.map(obj => { const newDatas =
gridOptions.data?.map((obj) => {
return fieldNames.reduce((acc, field) => { return fieldNames.reduce((acc, field) => {
if (field in obj && obj[field] !== undefined && obj[field] !== null) { if (field in obj && obj[field] !== undefined && obj[field] !== null) {
acc[field] = obj[field]; acc[field] = obj[field];
...@@ -181,27 +210,27 @@ const getFormData = async () => { ...@@ -181,27 +210,27 @@ const getFormData = async () => {
return { return {
...formData, ...formData,
datas: newDatas, datas: newDatas,
footer: formFooterData footer: formFooterData,
};
}; };
};
const setFormData = (dataVale) => { const setFormData = (dataVale) => {
gridOptions.data = dataVale gridOptions.data = dataVale;
} };
const cancelRow = async () => { const cancelRow = async () => {
const $grid = refGrid.value const $grid = refGrid.value;
if (!$grid) { if (!$grid) {
return return;
} }
await $grid.clearEdit() await $grid.clearEdit();
} };
function getAllFields(columns: any[]): string[] { function getAllFields(columns: any[]): string[] {
const fields: string[] = []; const fields: string[] = [];
function traverse(items: any[]) { function traverse(items: any[]) {
items.forEach(item => { items.forEach((item) => {
if (item.field) { if (item.field) {
fields.push(item.field); fields.push(item.field);
} }
...@@ -212,14 +241,12 @@ function getAllFields(columns: any[]): string[] { ...@@ -212,14 +241,12 @@ function getAllFields(columns: any[]): string[] {
} }
traverse(columns); traverse(columns);
return fields.filter(field => field); return fields.filter((field) => field);
} }
defineExpose({ defineExpose({
getFormData, getFormData,
setFormData setFormData,
}) });
</script>
-
</script>-
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论