Compare commits

...

13 Commits

Author SHA1 Message Date
chy
aa853f539b 解决冲突 2026-02-12 09:32:15 +08:00
chy
e7dd16454c Merge branch 'zh'
# Conflicts:
#	src/components/LowDesign/src/LowReport/index.vue
#	src/views/lowdesign/reportDesign/designData.ts
2026-02-12 08:50:42 +08:00
demo
b40163b2e7 动态多维表头 2026-02-11 20:15:26 +08:00
mll
cecaaacf4b view表单斑马纹 2026-02-11 16:57:52 +08:00
mll
76987e8ea6 Merge branch 'main' of http://8.130.49.250:3000/admin/gr_report_web 2026-02-11 11:30:43 +08:00
mll
7555c7093d no message 2026-02-11 11:30:30 +08:00
5ae5353baa Merge pull request 'main_beta' (#4) from main_beta into main
Reviewed-on: #4
2026-02-11 10:04:32 +08:00
mll
09a300e98a Merge branch 'main' of http://8.130.49.250:3000/admin/gr_report_web 2026-02-10 22:17:30 +08:00
mll
7a496e6407 加隐藏列 2026-02-10 22:17:26 +08:00
chy
e69cffbdb6 Merge branch 'main_beta'
# Conflicts:
#	src/views/Home/Index20.vue
2026-02-10 09:52:20 +08:00
mll
bcac3326a3 维度隐藏列 2026-02-09 20:16:36 +08:00
chy
f9393dfca8 1 2026-02-09 18:11:10 +08:00
chy
67fe2e22fc 修改国际化 2026-02-09 13:36:16 +08:00
8 changed files with 451 additions and 82 deletions

2
.env
View File

@@ -1,5 +1,5 @@
# 标题
VITE_APP_TITLE=国瑞报表系统
VITE_APP_TITLE=国瑞药业报表系统
# 项目本地运行端口号
VITE_PORT=80

View File

@@ -4,7 +4,7 @@ VITE_NODE_ENV=production
VITE_DEV=false
# 请求路径
VITE_BASE_URL='http://127.0.0.1:48080'
VITE_BASE_URL='http://192.168.1.241'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server

View File

@@ -68,7 +68,7 @@
></InputTimeRange>
</template>
<template #header v-if="Object.keys(dimensionFields)?.length">
<div style="display:flex;margin-left:40px">
<div style="display:flex;margin-left:40px">
<el-checkbox-group @change="searchDimension" v-model="tableSearch['Group by']"
placeholder="请选择内容">
<template v-for="(item,key) in dimensionFields">
@@ -128,6 +128,7 @@ const tableInfo = ref<any>({})
const timerObj = ref<any>({})
const numberRange = ref<string[]>([])
const dateRange=ref<string[]>([])
const hideColumns=ref<string[]>([])
const dateTimeRange=ref<string[]>([])
const timeRange=ref<string[]>([])
const amountFieds=ref<any>({})
@@ -136,6 +137,7 @@ const crudRef = ref()
const dimensionFields=ref<any>({})
const exportLoading = ref(false)
const fieldList = ref<any[]>([]) // 添加fieldList引用
const hideFeilds= ref<any>({})
const permissions =
wsCache.get(CACHE_KEY.USER).lideeYunjipermissions?.[route.meta.menuDataId as string] || false
const selectIds = computed(() => {
@@ -170,13 +172,13 @@ const initTable = async () => {
loading.value = true
const { fieldList: apiFieldList, reportVo } = await ReportApi.getWebConfig(props.reportCode)
// 存储字段列表到响应式引用
fieldList.value = apiFieldList
const isHeight = reportVo.tableConfig?.includes('height')
const isPage = reportVo.dataConfig?.includes('page')
const isPermi = reportVo.dataConfig?.includes('authTrue')
const isHideExport = reportVo.tableConfig?.includes('hideExport')
hideColumns.value=[]
tableInfo.value = { ...reportVo, isPage, isHeight, isPermi, isHideExport }
tableOption.value = {
selection: !isHideExport,
@@ -189,40 +191,47 @@ const initTable = async () => {
border: reportVo.tableConfig.includes('border'),
stripe: reportVo.tableConfig.includes('stripe'),
showSummary:false,
stripe:true,
column: {}
}
//国际化处理
const fieldLengObj = assembleLengObj(apiFieldList, 'labelI18n', 'fieldCode', 'fieldName')
for (const key in fieldLengObj) {
mergeLocaleMessage(key, { [props.reportCode]: fieldLengObj[key] })
}
// 根据parentFieldCode判断表头结构
const hasSubFields = Array.isArray(apiFieldList) && apiFieldList.some(field => field.parentFieldCode && field.parentFieldCode !== '')
// 分离固定列和动态列
const fixedFields = apiFieldList.filter(f => f.isFixedColumn === 'Y')
const dynamicFields = apiFieldList.filter(f => f.isFixedColumn !== 'Y')
// 构建父子关系映射
const parentChildMap = new Map()
const childParentMap = new Map()
// 建立映射关系
apiFieldList.forEach(field => {
// 处理固定列
fixedFields.forEach((item) => {
const config: any = {
prop: item.fieldCode,
label: t(`${props.reportCode}.${item.fieldCode}`),
type: 'input',
overHidden: true,
isExport: item.isExport == 'Y',
search: item.queryIsWeb == 'Y',
fixed: true
}
tableOption.value.column[item.fieldCode] = config
})
// 构建父子关系映射(仅用于识别子字段配置)
const childFieldConfigs = new Map()
dynamicFields.forEach(field => {
if (field.parentFieldCode && field.parentFieldCode !== '') {
// 这是子字段
childParentMap.set(field.fieldCode, field.parentFieldCode)
if (!parentChildMap.has(field.parentFieldCode)) {
parentChildMap.set(field.parentFieldCode, [])
if (!childFieldConfigs.has(field.parentFieldCode)) {
childFieldConfigs.set(field.parentFieldCode, [])
}
parentChildMap.get(field.parentFieldCode).push(field.fieldCode)
childFieldConfigs.get(field.parentFieldCode).push(field)
}
})
//字段处理 - 构建正确的表头结构
apiFieldList.forEach((item, index) => {
// 跳过子字段,子字段会在父字段中处理
if (item.parentFieldCode && item.parentFieldCode !== '') {
return
}
// 处理动态列暂不构建children等数据返回后动态生成
dynamicFields.forEach((item, index) => {
if (item.parentFieldCode && item.parentFieldCode !== '') return
const config: any = {
prop: item.fieldCode,
@@ -232,23 +241,8 @@ const initTable = async () => {
isExport: item.isExport == 'Y',
sortable: item.isShowSort == 'Y' ? 'custom' : false,
search: item.queryIsWeb == 'Y',
}
// 如果该字段有子字段,添加子列配置
if (parentChildMap.has(item.fieldCode)) {
const childFields = parentChildMap.get(item.fieldCode)
config.children = childFields.map(childFieldCode => {
const childField = apiFieldList.find(f => f.fieldCode === childFieldCode)
return {
prop: childField.fieldCode,
label: t(`${props.reportCode}.${childField.fieldCode}`),
type: 'input',
overHidden: true,
isExport: childField.isExport == 'Y',
sortable: childField.isShowSort == 'Y' ? 'custom' : false,
search: childField.queryIsWeb == 'Y'
}
})
_hasChildConfig: childFieldConfigs.has(item.fieldCode),
_childConfigs: childFieldConfigs.get(item.fieldCode) || []
}
if(!!item.isAmount){
@@ -258,33 +252,29 @@ const initTable = async () => {
}
if(item.isDimension=='Y'){
dimensionFields.value[config.prop]=config
hideFeilds.value[config.prop]=item.isHideDimension
}
if(item.isHideCol == 'Y') {
config.hide = true
hideColumns.value.push( config.prop )
}
if (item.queryMode == 'RANGE') config.searchRange = true
if (['Integer', 'BigInt', 'BigDecimal'].includes(item.fieldType)) config.type = 'number'
else if (item.fieldType == 'Date') {
config.type = 'date'
config.format = 'YYYY-MM-DD'
config.valueFormat = 'YYYY-MM-DD'
if(config.searchRange){
dateRange.value.push(config.prop)
}
if(config.searchRange) dateRange.value.push(config.prop)
} else if (item.fieldType == 'Time') {
config.type = 'time'
config.format = 'HH:mm:ss'
config.valueFormat = 'HH:mm:ss'
if(config.searchRange){
timeRange.value.push(config.prop)
}
if(config.searchRange) timeRange.value.push(config.prop)
} else if (item.fieldType == 'DateTime') {
config.type = 'datetime'
config.format = 'YYYY-MM-DD HH:mm:ss'
config.valueFormat = 'YYYY-MM-DD HH:mm:ss'
if(config.searchRange){
dateTimeRange.value.push(config.prop)
}
if(config.searchRange) dateTimeRange.value.push(config.prop)
}
if (config.type == 'number' && config.searchRange) numberRange.value.push(config.prop)
@@ -294,13 +284,13 @@ const initTable = async () => {
if (item.queryMode == 'NE') config.searchLabel = `${config.label} !=`
tableOption.value.column[item.fieldCode] = config
})
isInit.value = true
searchChange()
initTableLayout()
}
const searchDimension=()=>{
searchChange()
}
const initTableLayout = () => {
@@ -366,28 +356,158 @@ const getTableData = async (isLoading = true) => {
if (isLoading) loading.value = true
const searchObj = await getSearchData()
try {
const data = await ReportApi.getTableList(props.reportCode, searchObj)
// 获取数据
let data = await ReportApi.getTableList(props.reportCode, searchObj)
// 功能测试CS_DTBT报表使用模拟数据
if (props.reportCode === 'CS_DTBT') {
data = {
records: [
{ "yuefen": "一月", "benyue": 100, "leiji": 110 },
{ "yuefen": "一月", "benyue": 120, "leiji": 130 },
{ "yuefen": "二月", "benyue": 140, "leiji": 150 },
{ "yuefen": "二月", "benyue": 160, "leiji": 170 },
{ "yuefen": "三月", "benyue": 180, "leiji": 190 },
{ "yuefen": "三月", "benyue": 200, "leiji": 210 },
{ "yuefen": "四月", "benyue": null, "leiji": null },
{ "yuefen": "四月", "benyue": 220, "leiji": 230 },
{ "yuefen": "五月", "benyue": 333, "leiji": 444 },
{ "yuefen": "六月", "benyue": 555, "leiji": 555 },
{ "yuefen": "六月", "benyue": 666, "leiji": 666 },
],
total: 6
}
}
if (tablePage.value) tablePage.value['total'] = data.total
// 处理包含子字段的数据
let processedData = data.records
// 根据字段配置判断是否需要处理子字段
const hasSubFields = Array.isArray(fieldList.value) && fieldList.value.length > 0 &&
fieldList.value.some(field => field.parentFieldCode && field.parentFieldCode !== '')
// 查找动态分组字段(用于生成一级表头)
const groupField = fieldList.value.find(f => f.isDynamicGroup === 'Y')
if (hasSubFields) {
processedData = data.records.map(record => {
const flatRecord = { ...record }
// 处理子字段数据
fieldList.value.forEach(field => {
if (field.parentFieldCode && field.parentFieldCode !== '') {
// 这是子字段,从父字段中提取数据
const parentData = record[field.parentFieldCode]
if (parentData && typeof parentData === 'object') {
flatRecord[field.fieldCode] = parentData[field.fieldCode]
}
// 动态生成二维表头
if (data.records && data.records.length > 0) {
const newColumns = {}
// 保留固定列
for (const colKey in tableOption.value.column) {
const colConfig = tableOption.value.column[colKey]
if (colConfig.fixed) {
newColumns[colKey] = colConfig
}
}
if (groupField) {
// 有分组字段,从数据中提取所有不重复的分组值(一级表头)
const groupValues = [...new Set(data.records.map(r => r[groupField.fieldCode]))].filter(Boolean)
// 找到所有子字段配置按sortNum排序
const childFields = fieldList.value
.filter(f =>
f.parentFieldCode &&
f.parentFieldCode !== '' &&
f.isFixedColumn !== 'Y'
)
.sort((a, b) => (a.sortNum || 0) - (b.sortNum || 0))
// 为每个分组值生成列
groupValues.forEach(groupValue => {
const parentProp = `group_${groupValue}`
newColumns[parentProp] = {
label: groupValue,
children: childFields.map(childField => ({
prop: `${parentProp}_${childField.fieldCode}`,
label: t(`${props.reportCode}.${childField.fieldCode}`),
type: ['Integer', 'BigInt', 'BigDecimal'].includes(childField.fieldType) ? 'number' : 'input',
overHidden: true,
isExport: childField.isExport == 'Y'
}))
}
})
} else {
// 没有分组字段,使用原有的逻辑
for (const colKey in tableOption.value.column) {
const colConfig = tableOption.value.column[colKey]
if (!colConfig.fixed) {
newColumns[colKey] = colConfig
}
}
}
tableOption.value.column = newColumns
}
// 将扁平数据按分组字段转换为二维表头数据
let processedData = []
if (groupField && data.records.length > 0) {
// 有分组字段,根据分组字段值进行分组
const fixedFields = fieldList.value.filter(f => f.isFixedColumn === 'Y')
const childFields = fieldList.value
.filter(f => f.parentFieldCode && f.parentFieldCode !== '' && f.isFixedColumn !== 'Y')
.sort((a, b) => (a.sortNum || 0) - (b.sortNum || 0))
// 获取所有分组值
const groupValues = [...new Set(data.records.map(r => r[groupField.fieldCode]))].filter(Boolean)
// 按分组字段值对数据进行分组
const groupedData = {}
data.records.forEach(record => {
const groupValue = record[groupField.fieldCode]
if (!groupedData[groupValue]) {
groupedData[groupValue] = []
}
groupedData[groupValue].push(record)
})
// 计算需要生成的行数(根据固定列配置或分组内最大数据量)
let rowCount = 1
if (fixedFields.length > 0 && fixedFields[0].fixedColumnValue) {
rowCount = fixedFields[0].fixedColumnValue.split(',').length
} else {
// 如果没有固定列,取每个分组中数据最多的数量
rowCount = Math.max(...Object.values(groupedData).map((arr: any[]) => arr.length))
}
// 按行处理数据
for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {
const flatRecord = {}
// 处理固定列
fixedFields.forEach(field => {
if (field.fixedColumnValue) {
const fixedValues = field.fixedColumnValue.split(',')
flatRecord[field.fieldCode] = fixedValues[rowIndex] || ''
}
})
// 处理动态列数据(根据分组字段值获取对应数据)
groupValues.forEach(groupValue => {
const groupRecords = groupedData[groupValue] || []
const record = groupRecords[rowIndex]
if (record) {
const parentProp = `group_${groupValue}`
childFields.forEach(childField => {
flatRecord[`${parentProp}_${childField.fieldCode}`] = record[childField.fieldCode]
})
}
})
processedData.push(flatRecord)
}
} else {
// 没有分组字段,直接处理数据
processedData = data.records.map((record, recordIndex) => {
const flatRecord = { ...record }
// 处理固定列
fieldList.value.forEach(field => {
if (field.isFixedColumn === 'Y' && field.fixedColumnValue) {
const fixedValues = field.fixedColumnValue.split(',')
flatRecord[field.fieldCode] = fixedValues[recordIndex] || ''
}
})
return flatRecord
})
}
@@ -467,6 +587,15 @@ const clearSearch = () => {
const searchChange = (params?, done?) => {
if (tablePage.value) tablePage.value['currentPage'] = 1
getTableData().finally(() => {
let field=tableSearch.value['Group by']
let hides=[]
if(field.length){
hides=Object.keys(hideFeilds.value).length?hideFeilds.value[field].split(','):[]
}
Object.keys(tableOption.value.column).forEach(key=>{
let item=tableOption.value.column[key]
item.hide=hides.includes(item.prop)||hideColumns.value.includes(item.prop)
})
if (done) done()
})
}

View File

@@ -69,7 +69,7 @@ export default {
noPermission: `抱歉,您无权访问此页面。`,
pageError: '抱歉,您访问的页面不存在。',
networkError: '抱歉,服务器报告错误。',
returnToHome: '返回首页'
returnToHome: '返回工作台'
},
permission: {
hasPermission: `请设置操作权限标签值`,
@@ -157,7 +157,7 @@ export default {
router: {
login: '登录',
socialLogin: '社交登录',
home: '首页',
home: '工作台',
analysis: '分析页',
workplace: '工作台'
},
@@ -275,7 +275,7 @@ export default {
},
exception: {
backLogin: '返回登录',
backHome: '返回首页',
backHome: '返回工作台',
subTitle403: '抱歉,您无权访问此页面。',
subTitle404: '抱歉,您访问的页面不存在。',
subTitle500: '抱歉,服务器报告错误。',

View File

@@ -183,6 +183,44 @@ export const useRenderVxeColumn = (useType = 'table') => {
)
}
},
LowSelectMultiple: {
default: (renderOpts, { row, column }, isStop = false) => {
const { dicData } = renderOpts
const value = row[column.field]
const valStr=value?dicData.filter(item=>value.includes(item.value)).map(item=>item.label).join(''):''
return <span>{valStr}</span>
},
edit: (renderOpts, { row, rowIndex, column }) => {
const { multiple, filterable, allowCreate, typeKey ,dicData} = renderOpts
interface DictItem {
label: string;
value: string | number;
[key: string]: any; // 兼容其他可能的字段
}
return (
<el-select
popper-class="vxe-table--ignore-clear"
v-model={row[column.field]}
placeholder={'请选择 ' + column.title}
multiple={multiple}
filterable={filterable}
collapseTags={true}
collapseTagsTooltip={true}
allowCreate={allowCreate}
clearable={true}
>
{dicData.map((item: DictItem, index: number) => (
<el-option
key={index} // 建议用 item.value 作为 key更稳定
label={item.label}
value={item.value}
/>
))}
</el-select>
)
}
},
LowSummaryBottomSql: {
default: (renderOpts, { row, column }, isStop = false) => {
const { dicObj } = renderOpts
@@ -266,6 +304,32 @@ export const useRenderVxeColumn = (useType = 'table') => {
</el-popover>
)
}
},
LowButton: {
default: (renderOpts, { row, column }) => {
const { buttonText, disabled } = renderOpts
const isDisabled = typeof disabled === 'function' ? disabled(row) : disabled
if (isDisabled) return <span style="color: #c0c4cc;">-</span>
return <span style="color: #409eff; cursor: pointer;">{buttonText || '操作'}</span>
},
edit: (renderOpts, { row, column }) => {
const { buttonText, buttonType, buttonSize, disabled } = renderOpts
const isDisabled = typeof disabled === 'function' ? disabled(row) : disabled
return (
<el-button
type={buttonType || 'primary'}
size={buttonSize || 'small'}
disabled={isDisabled}
onClick={() => {
if (renderOpts.events && renderOpts.events.click) {
renderOpts.events.click(row)
}
}}
>
{buttonText || '操作'}
</el-button>
)
}
}
}
for (const key in lowControl) {

View File

@@ -40,6 +40,65 @@
</template>
</template>
</DesignPopup>
<!-- 固定列行配置弹窗 -->
<DesignPopup
v-model="fixedColumnDialog.visible"
title="配置固定列内容"
width="600px"
:is-footer="true"
:handleClose="handleFixedColumnClose"
>
<template #default>
<div style="padding: 20px;">
<el-alert
title="提示"
type="info"
:closable="false"
style="margin-bottom: 20px;"
>
为该固定列的每一行配置不同的显示内容点击"添加行"按钮增加新行输入内容后保存
</el-alert>
<div style="margin-bottom: 15px;">
<ElButton type="primary" @click="addFixedColumnRow" size="small">
<Icon icon="ep:plus" />
添加行
</ElButton>
</div>
<div v-if="fixedColumnDialog.rows.length === 0" style="text-align: center; padding: 40px; color: #909399;">
暂无配置请点击"添加行"按钮添加内容
</div>
<div v-else style="max-height: 400px; overflow-y: auto;">
<div
v-for="(row, index) in fixedColumnDialog.rows"
:key="index"
style="display: flex; align-items: center; margin-bottom: 10px;"
>
<span style="width: 80px; color: #606266;"> {{ index + 1 }} </span>
<ElInput
v-model="row.value"
placeholder="请输入该行显示的内容"
style="flex: 1; margin-right: 10px;"
/>
<ElButton
type="danger"
size="small"
@click="removeFixedColumnRow(index)"
:icon="Delete"
>
删除
</ElButton>
</div>
</div>
</div>
</template>
<template #footer>
<ElButton @click="handleFixedColumnCancel"> </ElButton>
<ElButton type="primary" @click="handleFixedColumnSave"> </ElButton>
</template>
</DesignPopup>
</template>
<script setup lang="ts">
@@ -49,6 +108,7 @@ import { tableInfoOption, dicObj } from '../designData'
import { formattingLengStr } from '@/utils/lowDesign'
import { cloneDeep } from 'lodash-es'
import * as DictDataApi from '@/api/system/dict/dict.type'
import { Delete } from '@element-plus/icons-vue'
defineOptions({ name: 'TableInfo' })
const message = useMessage()
@@ -86,9 +146,18 @@ const tabsRef = ref()
// 父字段引用
const parentFieldMap = ref(new Map())
// 固定列行配置弹窗
const fixedColumnDialog = ref({
visible: false,
currentRow: null as any,
rows: [] as Array<{ value: string }>,
originalValue: '' // 保存原始值,用于取消时恢复
})
const fieldList = computed(() => {
let dicData: Array<{ label: string; value: string; type: string }> = []
infoData.value.basics.forEach((item) => {
if (item.fieldCode && item.isDb == 'Y')
dicData.push({
label: `${item.fieldCode}${item.fieldName ? '' + item.fieldName + '' : ''}`,
@@ -223,6 +292,61 @@ const addSubFieldRow = (parentField, parentRowIndex) => {
})
}
// 打开固定列行配置弹窗
const openFixedColumnDialog = (row) => {
fixedColumnDialog.value.currentRow = row
// 保存原始值
fixedColumnDialog.value.originalValue = row.fixedColumnValue || ''
// 将字符串转换为数组:按逗号分割
let rowsArray = []
if (row.fixedColumnValue && typeof row.fixedColumnValue === 'string' && row.fixedColumnValue.trim() !== '') {
rowsArray = row.fixedColumnValue.split(',').map(value => ({ value: value }))
}
fixedColumnDialog.value.rows = rowsArray
fixedColumnDialog.value.visible = true
}
// 添加固定列行
const addFixedColumnRow = () => {
fixedColumnDialog.value.rows.push({ value: '' })
}
// 删除固定列行
const removeFixedColumnRow = (index) => {
fixedColumnDialog.value.rows.splice(index, 1)
}
// 取消固定列配置
const handleFixedColumnCancel = () => {
// 恢复原始值
if (fixedColumnDialog.value.currentRow) {
fixedColumnDialog.value.currentRow.fixedColumnValue = fixedColumnDialog.value.originalValue
}
fixedColumnDialog.value.visible = false
}
// 处理弹窗关闭X按钮或遮罩层
const handleFixedColumnClose = (done: () => void) => {
// 恢复原始值
if (fixedColumnDialog.value.currentRow) {
fixedColumnDialog.value.currentRow.fixedColumnValue = fixedColumnDialog.value.originalValue
}
done()
}
// 保存固定列配置
const handleFixedColumnSave = () => {
if (fixedColumnDialog.value.currentRow) {
// 将数组转换为字符串:使用逗号拼接
const rowValues = fixedColumnDialog.value.rows.map(row => row.value)
fixedColumnDialog.value.currentRow.fixedColumnValue = rowValues.join(',')
message.success(`已保存固定列"${fixedColumnDialog.value.currentRow.fieldName}"的行配置(共${fixedColumnDialog.value.rows.length}行)`)
}
fixedColumnDialog.value.visible = false
}
const initEditInfoData = () => {
const data = tableInfoOption.formattingInitData(props.editInfoData)
const fieldList: any[] = []
@@ -257,7 +381,9 @@ const initEditInfoData = () => {
if (fieldItem.hasChildren === 'Y') {
fieldItem.hasChildren = 'Y'
}
if (!!fieldItem.isHideDimension&&Object.prototype.toString.call(fieldItem.isHideDimension) == '[object String]') {
fieldItem.isHideDimension=fieldItem.isHideDimension.split(',')
}
fieldList.push(fieldItem)
})
@@ -282,12 +408,14 @@ onMounted(() => {
})
}
}
tableInfoOption.infoColumn.fieldColumn.isHideDimension.editRender.dicData = infoData.value.basics.map(({fieldCode,fieldName})=>{
return {label:fieldName,value:fieldCode}
})
// 设置父字段下拉选项
const updateParentFieldOptions = () => {
// 获取所有parentFieldCode为空的字段作为可选父字段
// 获取所有parentFieldCode为空且非固定列的字段作为可选父字段
const parentFieldOptions = infoData.value.basics
.filter(field => !field.parentFieldCode && field.fieldCode && field.fieldName)
.filter(field => !field.parentFieldCode && field.fieldCode && field.fieldName && field.isFixedColumn !== 'Y')
.map(field => ({
label: `${field.fieldName}`,
value: field.fieldCode
@@ -461,6 +589,41 @@ onMounted(() => {
// 初始化父字段选项
updateParentFieldOptions()
// 添加固定列选项的change事件处理
tableInfoOption.infoColumn.fieldColumn.isFixedColumn.editRender.events = {
change: (row) => {
if (row.isFixedColumn === 'Y') {
// 固定列不能有父字段
if (row.parentFieldCode) {
handleParentFieldClear(row)
}
// 固定列不能有子字段
if (row.hasChildren === 'Y') {
row.hasChildren = 'N'
// 清除所有子字段的父子关系
infoData.value.basics.forEach(field => {
if (field.parentFieldCode === row.fieldCode) {
handleParentFieldClear(field)
}
})
}
} else {
// 取消固定列时清空固定列内容
row.fixedColumnValue = ''
}
updateParentFieldOptions()
}
}
// 添加固定列内容配置按钮的点击事件
tableInfoOption.infoColumn.fieldColumn.fixedColumnValue.editRender.events = {
click: (row) => {
if (row.isFixedColumn === 'Y') {
openFixedColumnDialog(row)
}
}
}
// 设置字典Code的下拉选项
DictDataApi.getSimpleDictTypeList().then((dicData) => {
const dicObj = {}

View File

@@ -152,15 +152,20 @@ const infoColumn = {
parentFieldName: { title: '父字段名称', width: 120, editRender: { name: 'LowSelect', dicData: [], filterable: true, clearable: true } },
labelI18n: { title: '国际化配置', width: 140, editRender: { name: 'LowMonacoEditorInput', events: {} } },
fieldType: { title: '字段类型', minWidth: 100, editRender: { name: 'LowSelect', verifyEdit: true, dicData: dicObj.fieldType, dicObj: getDicObj('fieldType') } },
isFixedColumn: { title: '固定列', width: 75, align: "center", editRender: { name: 'LowCheckbox' } },
fixedColumnValue: { title: '固定列内容', width: 110, align: "center", editRender: { name: 'LowButton', disabled: (row) => row.isFixedColumn !== 'Y', buttonText: '配置内容', buttonType: 'primary', buttonSize: 'small', events: {} } },
queryIsDb: { title: '接口查询', width: 75, align: "center", editRender: { name: 'LowCheckbox' } },
queryIsWeb: { title: '查询控件', width: 75, align: "center", editRender: { name: 'LowCheckbox' } },
queryMode: { title: '查询模式', width: 130, editRender: { name: 'LowSelect', verifyEdit: true, dicData: dicObj.queryMode, dicObj: getDicObj('queryMode') } },
dictCode: { title: '字典Code', width: 180, editRender: { name: 'LowSelect', verifyEdit: true, filterable: true, noStop: true, dicData: [] } },
isExport: { title: '是否可导出', width: 90, align: "center", editRender: { name: 'LowCheckbox' } },
isHideCol: { title: '隐藏列', width: 90, align: "center", editRender: { name: 'LowCheckbox' } },
isAmount: { title: '是否合计', width: 75, align: "center", editRender: { name: 'LowCheckboxSum' } },
isDimension: { title: '是否维度', width: 75, align: "center", editRender: { name: 'LowCheckbox' } },
isHideDimension: { title: '维度隐藏列', width: 180, editRender: { name: 'LowSelectMultiple', verifyEdit: true, filterable: true, multiple:true,dicData: [] } },
isShowSort: { title: '是否排序', width: 75, align: "center", editRender: { name: 'LowCheckbox' } },
isDynamicGroup: { title: '动态分组', width: 75, align: "center", editRender: { name: 'LowCheckbox' } },
hasChildren: { title: '子字段', width: 90, align: "center", editRender: { name: 'LowButton', disabled: (row) => row.isSubField === true, buttonText: '添加子字段', buttonType: 'primary', buttonSize: 'small' } },
},
}
@@ -179,6 +184,10 @@ for (const key in infoColumn) {
if (!keys.includes('hasChildren')) {
keys.push('hasChildren')
}
// 确保固定列内容字段被包含
if (!keys.includes('fixedColumnValue')) {
keys.push('fixedColumnValue')
}
}
infoApiKey[apiKey[key]] = keys
}
@@ -187,7 +196,11 @@ for (const key in infoColumn) {
//默认值
const infoDefaultData = {
basics: {
fieldCode: '', fieldName: '', parentFieldName: '', labelI18n: '', fieldType: 'String', queryIsDb: 'N', queryIsWeb: 'N', queryMode: 'LIKE', dictCode: '', isExport: 'Y', isShowSort: 'N', isAmount: '', isDimension: '', hasChildren: 'N', isSubField: false, parentFieldId: '', parentFieldCode: '',
// fieldCode: '', fieldName: '', parentFieldName: '', labelI18n: '', fieldType: 'String', queryIsDb: 'N', queryIsWeb: 'N', queryMode: 'LIKE', dictCode: '',isHideCol:'N', isExport: 'Y', isShowSort: 'N', isAmount: '', isDimension: '',isHideDimension:'', hasChildren: 'N', isSubField: false, parentFieldId: '', parentFieldCode: '',
fieldCode: '', fieldName: '', parentFieldName: '', labelI18n: '', fieldType: 'String', isFixedColumn: 'N', fixedColumnValue: '', queryIsDb: 'N', queryIsWeb: 'N', queryMode: 'LIKE', dictCode: '', isExport: 'Y', isShowSort: 'N', isAmount: '', isDimension: '', isDynamicGroup: 'N', hasChildren: 'N', isSubField: false, parentFieldId: '', parentFieldCode: '',
},
}

View File

@@ -349,7 +349,7 @@ const tableFormVerify = (type) => {
const index = Number(i)
const item = filedData[index]
item.sortNum = index + 1
item.isHideDimension?item.isHideDimension=item.isHideDimension.join(','):''
let messageText = ''
let tabKey = 'mysql'
// 子字段不能再包含子字段