diff --git a/src/resources/plugins/TsSheet/form/component/formtableinputer/column-item.vue b/src/resources/plugins/TsSheet/form/component/formtableinputer/column-item.vue index d18008a7d3957a540f16992ce77ce75bf515b915..1564bde7d2cb379cd3e396bf45cefa31fd8d8f45 100644 --- a/src/resources/plugins/TsSheet/form/component/formtableinputer/column-item.vue +++ b/src/resources/plugins/TsSheet/form/component/formtableinputer/column-item.vue @@ -118,6 +118,11 @@ export default { reactionValueData: { type: Object, default: () => {} + }, + expressionData: { + // 表达式的值 + type: Object, + default: () => {} } }, data() { @@ -559,7 +564,7 @@ export default { }; }, formData() { - return {...(this.reactionValueData || {}), ...(this.rowData || {})}; + return {...(this.reactionValueData || {}), ...(this.rowData || {}), ...(this.expressionData || {})}; }, formItemUuid() { return this.formItem && this.formItem.uuid; diff --git a/src/resources/plugins/TsSheet/form/component/formtableinputer/expression-mixin.js b/src/resources/plugins/TsSheet/form/component/formtableinputer/expression-mixin.js new file mode 100644 index 0000000000000000000000000000000000000000..d99de2266ee32083c9a8d3799eaf5130cdeedd5b --- /dev/null +++ b/src/resources/plugins/TsSheet/form/component/formtableinputer/expression-mixin.js @@ -0,0 +1,66 @@ +export default { + methods: { + handleExpressionData({expression, formData = {}}) { + let expressionFormData = {}; + const { type = '', jsValue = '', list = [] } = expression || {}; + if (type === 'strExpression') { + list.forEach(item => { + if (item.mappingMode === 'formCommonComponent') { + const uuidList = item.value.split('#'); + const formItemValue = formData[uuidList[0]] || ''; + const uuid = uuidList[0]; + if (!this.$utils.isEmpty(formItemValue)) { + if (Array.isArray(formItemValue)) { + let multipleValueList = []; + formItemValue.forEach(a => { + if (typeof a === 'object') { + if (uuidList[1]) { + multipleValueList.push(a[uuidList[1]]); + } else { + multipleValueList.push(a['value']); + } + } else { + multipleValueList.push(a); + } + }); + expressionFormData[uuid] = multipleValueList; + } else if (typeof formItemValue === 'object') { + if (uuidList[1]) { + expressionFormData[uuidList[1]] = formItemValue[uuidList[1]] || ''; + } else { + expressionFormData[uuid] = formItemValue; + } + } else { + expressionFormData[uuid] = formItemValue; + } + } + } + }); + } else if (type === 'jsExpression' && jsValue) { + expressionFormData = this._getFormlabelMapping(formData); + } + return expressionFormData; + }, + _getFormlabelMapping(formData) { + let data = {}; + const whiteList = ['formtext', 'formdate', 'formtime', 'formselect', 'formradio', 'formnumber']; + this.formItemList.forEach(item => { + if (whiteList.includes(item.handler)) { + data[item.uuid] = formData[item.uuid]; + } else { + if (item.config && item.config.dataConfig) { + const findItem = item.config.dataConfig.find(a => a.uuid === this.formItem.uuid); + if (findItem) { + item.config.dataConfig.forEach(a => { + if (whiteList.includes(a.handler)) { + data[a.uuid] = formData[a.uuid]; + } + }); + } + } + } + }); + return data; + } + } +}; diff --git a/src/resources/plugins/TsSheet/form/component/formtableinputer/index.vue b/src/resources/plugins/TsSheet/form/component/formtableinputer/index.vue index fea45a5866d4b31e2889f2eebc4f3f733b6b215c..72f461c1353d476b3e4c10ec441c031df94d1f77 100644 --- a/src/resources/plugins/TsSheet/form/component/formtableinputer/index.vue +++ b/src/resources/plugins/TsSheet/form/component/formtableinputer/index.vue @@ -130,6 +130,7 @@ :extraUuid="extra.uuid" :reactionData="getReactionData(extra, row)" :reactionValueData="reactionValuesMap[extra.uuid]" + :expressionData="getExpressionData(extra)" class="form-item-width" @change="changeRow" @getCurrentRowData="getCurrentRowData" @@ -163,6 +164,7 @@ import base from '../base.vue'; import validmixin from '../common/validate-mixin.js'; import conditionMixin from './condition-mixin.js'; +import expressionMixin from './expression-mixin.js'; import TableImportExportMixin from './table-import-export-mixin.js'; export default { name: '', @@ -172,7 +174,7 @@ export default { ColumnItem: () => import('@/resources/plugins/TsSheet/form/component/formtableinputer/column-item.vue') }, extends: base, - mixins: [validmixin, conditionMixin, TableImportExportMixin], + mixins: [validmixin, conditionMixin, expressionMixin, TableImportExportMixin], props: { readonly: { type: Boolean, default: false }, disabled: { type: Boolean, default: false } @@ -684,6 +686,17 @@ export default { return result; }; }, + getExpressionData() { + return (extra) => { + const { handler, config = {} } = extra || {}; + const { expression } = config || {}; + let resultData = {}; + if (handler === 'formexpression') { + resultData = this.handleExpressionData({expression: expression, formData: this.formData}); + } + return resultData; + }; + }, frozenFormItemList() { return Object.freeze([...this.formItemList || []]); // 解构不影响原数据 },