lyflowchart 1.0.115 → 1.0.133
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ActionsConfig-BuvSvRbv.js +395 -0
- package/dist/ActionsConfig-BuvSvRbv.js.map +1 -0
- package/dist/ApprovalEditorModal-suKPJ-vN.js +48 -0
- package/dist/ApprovalEditorModal-suKPJ-vN.js.map +1 -0
- package/dist/CancelModal-BUi3ieI8.js +61 -0
- package/dist/CancelModal-BUi3ieI8.js.map +1 -0
- package/dist/Cell_click_approve-Dr83RkI-.js +244 -0
- package/dist/Cell_click_approve-Dr83RkI-.js.map +1 -0
- package/dist/JsonTags-BbWLqghI.js +66 -0
- package/dist/JsonTags-BbWLqghI.js.map +1 -0
- package/dist/MyProcess-FWGEwQcv.js +26434 -0
- package/dist/MyProcess-FWGEwQcv.js.map +1 -0
- package/dist/MyProcess.vue.d.ts +991 -0
- package/dist/approval-BW2WjPxY.js +167 -0
- package/dist/approval-BW2WjPxY.js.map +1 -0
- package/dist/approval-BaVHder3.js +18 -0
- package/dist/approval-BaVHder3.js.map +1 -0
- package/dist/approvalHistory-B2gpQbFC.js +868 -0
- package/dist/approvalHistory-B2gpQbFC.js.map +1 -0
- package/dist/approvalHistoryViewModal-DgLpv2ot.js +114 -0
- package/dist/approvalHistoryViewModal-DgLpv2ot.js.map +1 -0
- package/dist/approvalPageConfig-D0zPXOUf.js +2437 -0
- package/dist/approvalPageConfig-D0zPXOUf.js.map +1 -0
- package/dist/approveLeftConfig-BOU_UgHp.js +136 -0
- package/dist/approveLeftConfig-BOU_UgHp.js.map +1 -0
- package/dist/codeHistoryViewModal-BfSjIbEU.js +103 -0
- package/dist/codeHistoryViewModal-BfSjIbEU.js.map +1 -0
- package/dist/columnTables-DLwtgcC7.js +1272 -0
- package/dist/columnTables-DLwtgcC7.js.map +1 -0
- package/dist/components/Cell_click_approve.vue.d.ts +5 -0
- package/dist/components/Cell_click_data_source.vue.d.ts +6 -0
- package/dist/components/Process/common/bpmnUtils.d.ts +8 -0
- package/dist/components/Process/common/global.d.ts +16 -0
- package/dist/components/Process/common/index.d.ts +5 -0
- package/dist/components/Process/component/JsonTags2.vue.d.ts +60 -0
- package/dist/components/Process/component/ValueInput2.vue.d.ts +74 -0
- package/dist/components/Process/component/columnNameField2.vue.d.ts +51 -0
- package/dist/components/Process/component/data.d.ts +157 -0
- package/dist/components/Process/customPanel/CustomContextPad.d.ts +31 -0
- package/dist/components/Process/customPanel/CustomPalette.d.ts +89 -0
- package/dist/components/Process/customPanel/customTranslate.d.ts +1 -0
- package/dist/components/Process/customPanel/index.d.ts +8 -0
- package/dist/components/Process/designer.vue.d.ts +589 -0
- package/dist/components/Process/flowable/init.d.ts +1 -0
- package/dist/components/Process/index.vue.d.ts +812 -0
- package/dist/components/Process/lang/zh.d.ts +249 -0
- package/dist/components/Process/panel/ButtonsPanel.vue.d.ts +24 -0
- package/dist/components/Process/panel/PropertiesPanel.vue.d.ts +24 -0
- package/dist/components/Process/panel/commonPanel.vue.d.ts +40 -0
- package/dist/components/Process/panel/conditionPanel.vue.d.ts +271 -0
- package/dist/components/Process/panel/executionListener.vue.d.ts +66 -0
- package/dist/components/Process/panel/formPanel.vue.d.ts +7 -0
- package/dist/components/Process/panel/multiInstance.vue.d.ts +33 -0
- package/dist/components/Process/panel/otherPanel.vue.d.ts +17 -0
- package/dist/components/Process/panel/taskListener.vue.d.ts +64 -0
- package/dist/components/Process/panel/taskPanel.vue.d.ts +254 -0
- package/dist/components/Process/viewer/index.vue.d.ts +41 -0
- package/dist/components/approval/ApprovalEditorModal.vue.d.ts +26 -0
- package/dist/components/approval/CostCompanySelect.vue.d.ts +29 -0
- package/dist/components/approval/CostDepartmentSelect.vue.d.ts +35 -0
- package/dist/components/approval/CreateByCascader.vue.d.ts +27 -0
- package/dist/components/approval/CreateBySelect.vue.d.ts +35 -0
- package/dist/components/approval/PostionCascader.vue.d.ts +26 -0
- package/dist/components/approval/SystemTime.vue.d.ts +38 -0
- package/dist/components/approval/approvalViewId.d.ts +36 -0
- package/dist/components/approval/components/CancelModal.vue.d.ts +25 -0
- package/dist/components/approval/components/FormCodeInput.vue.d.ts +33 -0
- package/dist/components/approval/components/FormContextInput.vue.d.ts +33 -0
- package/dist/components/approval/components/FormFlowOrgInput.vue.d.ts +40 -0
- package/dist/components/approval/components/actionsBar.vue.d.ts +17 -0
- package/dist/components/approval/components/approvalHistory/approvalHistoryViewModal.vue.d.ts +41 -0
- package/dist/components/approval/components/approvalHistory/dataStoreSettingHistory.vue.d.ts +55 -0
- package/dist/components/approval/components/approvalHistory/dataStoreSettingHistoryViewModal.vue.d.ts +41 -0
- package/dist/components/approval/components/approvalHistory/flowHistoryViewModal.vue.d.ts +41 -0
- package/dist/components/approval/components/approvalHistory/flowSettingHistory.vue.d.ts +55 -0
- package/dist/components/approval/components/approvalHistory/index.vue.d.ts +212 -0
- package/dist/components/approval/components/approvalHistory/pageSettingHistory.vue.d.ts +55 -0
- package/dist/components/approval/components/approvalPageConfig/ActionsConfig.vue.d.ts +112 -0
- package/dist/components/approval/components/approvalPageConfig/BaseConditions.vue.d.ts +205 -0
- package/dist/components/approval/components/approvalPageConfig/CodeEditorWraper.vue.d.ts +51 -0
- package/dist/components/approval/components/approvalPageConfig/ColumnConfig.vue.d.ts +145 -0
- package/dist/components/approval/components/approvalPageConfig/ConditionFieldMulType.vue.d.ts +137 -0
- package/dist/components/approval/components/approvalPageConfig/JsonInput.vue.d.ts +38 -0
- package/dist/components/approval/components/approvalPageConfig/JsonTags.vue.d.ts +26 -0
- package/dist/components/approval/components/approvalPageConfig/JsonText.vue.d.ts +36 -0
- package/dist/components/approval/components/approvalPageConfig/approveLeftConfig.vue.d.ts +6 -0
- package/dist/components/approval/components/approvalPageConfig/baseConfig.vue.d.ts +10 -0
- package/dist/components/approval/components/approvalPageConfig/cellEdit.vue.d.ts +23 -0
- package/dist/components/approval/components/approvalPageConfig/configSync.vue.d.ts +76 -0
- package/dist/components/approval/components/approvalPageConfig/confirmInput.vue.d.ts +26 -0
- package/dist/components/approval/components/approvalPageConfig/defaultOperatorSelect.vue.d.ts +18 -0
- package/dist/components/approval/components/approvalPageConfig/index.vue.d.ts +11 -0
- package/dist/components/approval/components/approvalPageConfig/jsonConfig.vue.d.ts +16 -0
- package/dist/components/approval/components/approvalPageConfig/layoutSetting.vue.d.ts +9 -0
- package/dist/components/approval/components/approvalPageConfig/leftColumn.vue.d.ts +1184 -0
- package/dist/components/approval/components/approvalPageConfig/middleColumn.vue.d.ts +145 -0
- package/dist/components/approval/components/approvalPageConfig/operatorSelect.vue.d.ts +18 -0
- package/dist/components/approval/components/approvalPageConfig/searchConfig.vue.d.ts +166 -0
- package/dist/components/approval/components/approvalPageConfig/tableConfig.vue.d.ts +802 -0
- package/dist/components/approval/components/codeHistory/codeHistory.vue.d.ts +53 -0
- package/dist/components/approval/components/codeHistory/codeHistoryViewModal.vue.d.ts +32 -0
- package/dist/components/approval/components/columnDataList.vue.d.ts +454 -0
- package/dist/components/approval/components/columnForm.vue.d.ts +26 -0
- package/dist/components/approval/components/columnTables.vue.d.ts +502 -0
- package/dist/components/approval/components/columnUnknown.vue.d.ts +2 -0
- package/dist/components/approval/components/dataStoreConfig/ConditionConfig.vue.d.ts +199 -0
- package/dist/components/approval/components/dataStoreConfig/ValueInput.vue.d.ts +37 -0
- package/dist/components/approval/components/dataStoreConfig/dataSourceDetial.vue.d.ts +22 -0
- package/dist/components/approval/components/dataStoreConfig/dataStoreConfig.vue.d.ts +554 -0
- package/dist/components/approval/components/dataStoreConfig/dataStoreConfigItem.vue.d.ts +434 -0
- package/dist/components/approval/components/dataStoreConfig/dataStoreTest.vue.d.ts +39 -0
- package/dist/components/approval/components/dataStoreConfig/dataStoreTestsItem.vue.d.ts +17 -0
- package/dist/components/approval/components/dataStoreConfig/formField.vue.d.ts +28 -0
- package/dist/components/approval/components/dataStoreConfig/formFieldMulType.vue.d.ts +96 -0
- package/dist/components/approval/components/dataStoreConfig/selectExcelColumn.vue.d.ts +26 -0
- package/dist/components/approval/components/dataStoreConfig/selectExcelType.vue.d.ts +28 -0
- package/dist/components/approval/components/debugCode/debugCode.vue.d.ts +214 -0
- package/dist/components/approval/components/drawerDataList.vue.d.ts +504 -0
- package/dist/components/approval/components/drawerTablesList.vue.d.ts +551 -0
- package/dist/components/approval/components/flowConfig/flowConfig.vue.d.ts +1097 -0
- package/dist/components/approval/components/flowConfig/selectCcGroup.vue.d.ts +9 -0
- package/dist/components/approval/components/flowConfig/selectUsers.vue.d.ts +9 -0
- package/dist/components/approval/components/modelTablesList.vue.d.ts +551 -0
- package/dist/components/approval/components/pageConfigHistory.vue.d.ts +2 -0
- package/dist/components/approval/components/search.vue.d.ts +238 -0
- package/dist/components/approval/components/searchSummary.vue.d.ts +100 -0
- package/dist/components/approval/components/table.vue.d.ts +416 -0
- package/dist/components/approval/components/tableModal.vue.d.ts +84 -0
- package/dist/components/approval/configs/approval/default.d.ts +11 -0
- package/dist/components/approval/configs/approval/recordActions.d.ts +22 -0
- package/dist/components/approval/core.vue.d.ts +53 -0
- package/dist/components/approval/example_code/example_code.d.ts +11 -0
- package/dist/components/approval/index.d.ts +18 -0
- package/dist/components/approval/index.vue.d.ts +2 -0
- package/dist/components/approval/migrate/index.d.ts +1 -0
- package/dist/components/approval/migrate/v0001.d.ts +2 -0
- package/dist/components/approval/store/context.d.ts +48 -0
- package/dist/components/approval/store/debugCode.d.ts +7 -0
- package/dist/components/approval/store/settingsState.d.ts +15 -0
- package/dist/components/approval/typing.d.ts +210 -0
- package/dist/components/approval/useApprovalRecordActions.d.ts +83 -0
- package/dist/components/approval/utils.d.ts +164 -0
- package/dist/components/approval_for_details.vue.d.ts +9 -0
- package/dist/components/flow/ElInputTag/index.vue.d.ts +46 -0
- package/dist/components/flow/Expression/index.vue.d.ts +48 -0
- package/dist/components/flow/Role/index.vue.d.ts +68 -0
- package/dist/components/flow/User/index.vue.d.ts +76 -0
- package/dist/config/packed-config.d.ts +26 -0
- package/dist/constants.d.ts +1 -0
- package/dist/core-BOc9ch_5.js +1631 -0
- package/dist/core-BOc9ch_5.js.map +1 -0
- package/dist/dataStoreSettingHistoryViewModal-D_so-KLp.js +114 -0
- package/dist/dataStoreSettingHistoryViewModal-D_so-KLp.js.map +1 -0
- package/dist/debugCode-Cm9-WiUG.js +565 -0
- package/dist/debugCode-Cm9-WiUG.js.map +1 -0
- package/dist/debugCode-dD1YnQSD.js +11 -0
- package/dist/debugCode-dD1YnQSD.js.map +1 -0
- package/dist/default-VdDMlY4e.js +560 -0
- package/dist/default-VdDMlY4e.js.map +1 -0
- package/dist/example_code-C_xF8RRG.js +129 -0
- package/dist/example_code-C_xF8RRG.js.map +1 -0
- package/dist/flowHistoryViewModal-D8DJP7Te.js +109 -0
- package/dist/flowHistoryViewModal-D8DJP7Te.js.map +1 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.js +507 -26691
- package/dist/index.js.map +1 -1
- package/dist/init-plugin-fQTSQzui.js +48 -0
- package/dist/init-plugin-fQTSQzui.js.map +1 -0
- package/dist/init-plugin.d.ts +57 -0
- package/dist/leftColumn-CsPjufue.js +209 -0
- package/dist/leftColumn-CsPjufue.js.map +1 -0
- package/dist/lyflowchart.css +1 -1
- package/dist/middleColumn-C7M6-eVo.js +107 -0
- package/dist/middleColumn-C7M6-eVo.js.map +1 -0
- package/dist/recordActions-BgFlNsGU.js +51 -0
- package/dist/recordActions-BgFlNsGU.js.map +1 -0
- package/dist/settingsState-CI81PG-i.js +19 -0
- package/dist/settingsState-CI81PG-i.js.map +1 -0
- package/dist/style.d.ts +3 -0
- package/dist/styles.d.ts +7 -0
- package/dist/tableConfig-uLXue-BS.js +2408 -0
- package/dist/tableConfig-uLXue-BS.js.map +1 -0
- package/dist/tableModal-BcYfVL02.js +124 -0
- package/dist/tableModal-BcYfVL02.js.map +1 -0
- package/dist/useApprovalRecordActions-BQ6MgV2L.js +843 -0
- package/dist/useApprovalRecordActions-BQ6MgV2L.js.map +1 -0
- package/dist/utils/StrUtil.d.ts +52 -0
- package/dist/utils/function.d.ts +8 -0
- package/dist/utils-CLet2gLV.js +420 -0
- package/dist/utils-CLet2gLV.js.map +1 -0
- package/dist/v0001-OaBeBCXI.js +4 -0
- package/dist/v0001-OaBeBCXI.js.map +1 -0
- package/dist/{Cell_click_data_source-C8WEsBGB.js → viewer-Dv3kQsMf.js} +1839 -2724
- package/dist/viewer-Dv3kQsMf.js.map +1 -0
- package/dist/vue-print-next-HRweUmNi.js +683 -0
- package/dist/vue-print-next-HRweUmNi.js.map +1 -0
- package/package.json +39 -8
- package/dist/Cell_click_data_source-C8WEsBGB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalPageConfig-D0zPXOUf.js","names":[],"sources":["../src/components/approval/components/approvalPageConfig/jsonConfig.vue","../src/components/approval/components/approvalPageConfig/jsonConfig.vue","../src/components/approval/components/flowConfig/selectUsers.vue","../src/components/approval/components/flowConfig/selectUsers.vue","../src/components/approval/components/flowConfig/selectCcGroup.vue","../src/components/approval/components/flowConfig/selectCcGroup.vue","../src/components/approval/components/flowConfig/flowConfig.vue","../src/components/approval/components/flowConfig/flowConfig.vue","../src/components/approval/components/dataStoreConfig/formField.vue","../src/components/approval/components/dataStoreConfig/formField.vue","../src/components/approval/components/dataStoreConfig/selectExcelColumn.vue","../src/components/approval/components/dataStoreConfig/selectExcelColumn.vue","../src/components/approval/components/dataStoreConfig/selectExcelType.vue","../src/components/approval/components/dataStoreConfig/selectExcelType.vue","../src/components/approval/components/dataStoreConfig/ValueInput.vue","../src/components/approval/components/dataStoreConfig/ValueInput.vue","../src/components/approval/components/dataStoreConfig/formFieldMulType.vue","../src/components/approval/components/dataStoreConfig/formFieldMulType.vue","../src/components/approval/components/dataStoreConfig/ConditionConfig.vue","../src/components/approval/components/dataStoreConfig/ConditionConfig.vue","../src/components/approval/components/dataStoreConfig/dataSourceDetial.vue","../src/components/approval/components/dataStoreConfig/dataSourceDetial.vue","../src/components/approval/components/dataStoreConfig/dataStoreConfigItem.vue","../src/components/approval/components/dataStoreConfig/dataStoreConfigItem.vue","../src/components/approval/components/dataStoreConfig/dataStoreConfig.vue","../src/components/approval/components/dataStoreConfig/dataStoreConfig.vue","../src/components/approval/components/dataStoreConfig/dataStoreTestsItem.vue","../src/components/approval/components/dataStoreConfig/dataStoreTestsItem.vue","../src/components/approval/components/dataStoreConfig/dataStoreTest.vue","../src/components/approval/components/dataStoreConfig/dataStoreTest.vue","../src/components/approval/components/approvalPageConfig/baseConfig.vue","../src/components/approval/components/approvalPageConfig/baseConfig.vue","../src/components/approval/components/approvalPageConfig/index.vue","../src/components/approval/components/approvalPageConfig/index.vue"],"sourcesContent":["<template>\n <json-obj\n :value=\"dataSource\"\n @update:value=\"handleUpdate\"\n :mainMenuBar=\"true\"\n :mode=\"'text'\"\n :fullWidthButton=\"true\"\n :darkTheme=\"true\"\n ></json-obj>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\n\nexport default defineComponent({\n name: 'tableConfig',\n components: {\n },\n props: {\n dataSource: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:dataSource'],\n setup(props, { emit }) {\n const handleUpdate = value => {\n emit('update:dataSource', value);\n };\n return {\n handleUpdate,\n };\n },\n});\n</script>\n","<template>\n <json-obj\n :value=\"dataSource\"\n @update:value=\"handleUpdate\"\n :mainMenuBar=\"true\"\n :mode=\"'text'\"\n :fullWidthButton=\"true\"\n :darkTheme=\"true\"\n ></json-obj>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\n\nexport default defineComponent({\n name: 'tableConfig',\n components: {\n },\n props: {\n dataSource: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:dataSource'],\n setup(props, { emit }) {\n const handleUpdate = value => {\n emit('update:dataSource', value);\n };\n return {\n handleUpdate,\n };\n },\n});\n</script>\n","<template>\n <a-select\n v-model:value=\"value\"\n allowClear\n placeholder=\"请选择\"\n show-search\n :filter-option=\"filterOption\"\n size=\"small\"\n mode=\"multiple\"\n >\n <a-select-option\n v-for=\"item in dataSource\"\n :key=\"item.id\"\n :value=\"item.id\"\n :name=\"item.realname\"\n >\n {{ item.realname }}\n </a-select-option>\n </a-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { getApiData } from '@/init-plugin';\nimport { onMounted, ref, defineOptions } from 'vue';\n\ndefineOptions({\n name: 'selectUsers',\n});\nconst value = defineModel();\nconst props = defineProps();\nconst emit = defineEmits([]);\nconst dataSource = ref<any[]>([]);\nconst getDataSourceList = async () => {\n const res = await getApiData({ is_active: true }, '/org/query_person_list');\n dataSource.value = res.data;\n};\nconst filterOption = (input: string, option: any) => {\n return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n};\nonMounted(() => {\n getDataSourceList();\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"value\"\n allowClear\n placeholder=\"请选择\"\n show-search\n :filter-option=\"filterOption\"\n size=\"small\"\n mode=\"multiple\"\n >\n <a-select-option\n v-for=\"item in dataSource\"\n :key=\"item.id\"\n :value=\"item.id\"\n :name=\"item.realname\"\n >\n {{ item.realname }}\n </a-select-option>\n </a-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { getApiData } from '@/init-plugin';\nimport { onMounted, ref, defineOptions } from 'vue';\n\ndefineOptions({\n name: 'selectUsers',\n});\nconst value = defineModel();\nconst props = defineProps();\nconst emit = defineEmits([]);\nconst dataSource = ref<any[]>([]);\nconst getDataSourceList = async () => {\n const res = await getApiData({ is_active: true }, '/org/query_person_list');\n dataSource.value = res.data;\n};\nconst filterOption = (input: string, option: any) => {\n return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n};\nonMounted(() => {\n getDataSourceList();\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"value\"\n allowClear\n placeholder=\"请选择\"\n show-search\n :filter-option=\"filterOption\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in dataSource\"\n :key=\"item.id\"\n :value=\"item.id\"\n :name=\"item.name\"\n >\n {{ item.name }}\n </a-select-option>\n </a-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { getApiData } from '@/init-plugin';\nimport { onMounted, ref, defineOptions } from 'vue';\n\ndefineOptions({\n name: 'selectCcGroup',\n});\nconst value = defineModel();\nconst props = defineProps();\nconst emit = defineEmits([]);\nconst dataSource = ref<any[]>([]);\nconst getDataSourceList = async () => {\n const res = await getApiData({ is_active: true }, '/lyapprove/query_approval_position_list');\n dataSource.value = res.data;\n};\nconst filterOption = (input: string, option: any) => {\n return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n};\nonMounted(() => {\n getDataSourceList();\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"value\"\n allowClear\n placeholder=\"请选择\"\n show-search\n :filter-option=\"filterOption\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in dataSource\"\n :key=\"item.id\"\n :value=\"item.id\"\n :name=\"item.name\"\n >\n {{ item.name }}\n </a-select-option>\n </a-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { getApiData } from '@/init-plugin';\nimport { onMounted, ref, defineOptions } from 'vue';\n\ndefineOptions({\n name: 'selectCcGroup',\n});\nconst value = defineModel();\nconst props = defineProps();\nconst emit = defineEmits([]);\nconst dataSource = ref<any[]>([]);\nconst getDataSourceList = async () => {\n const res = await getApiData({ is_active: true }, '/lyapprove/query_approval_position_list');\n dataSource.value = res.data;\n};\nconst filterOption = (input: string, option: any) => {\n return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n};\nonMounted(() => {\n getDataSourceList();\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <div class=\"flow-config-wrap\">\n <a-form\n layout=\"horizontal\"\n size=\"small\"\n >\n <a-row :gutter=\"10\">\n <a-col :span=\"3\">\n <a-form-item label=\"开启流程\">\n <a-switch\n :checked=\"value.enable_flow\"\n @change=\"update_enable\"\n size=\"small\"\n ></a-switch>\n </a-form-item>\n </a-col>\n <a-col\n :span=\"21\"\n v-if=\"value.enable_flow\"\n >\n <a-form-item label=\"名称\">\n <a-input\n :value=\"value.name\"\n @update:value=\"update_name\"\n size=\"small\"\n ></a-input>\n </a-form-item>\n </a-col>\n </a-row>\n\n <template v-if=\"value.enable_flow\">\n <a-row :gutter=\"10\">\n <a-col :span=\"5\">\n <a-form-item label=\"抄送位置\">\n <a-select\n v-model:value=\"value.cc_position\"\n size=\"small\"\n >\n <a-select-option value=\"start\">审批发起时</a-select-option>\n <a-select-option value=\"finish\">审批通过后</a-select-option>\n <a-select-option value=\"start_finish\">审批发起时和审批通过后</a-select-option>\n </a-select>\n </a-form-item>\n </a-col>\n\n <a-col :span=\"5\">\n <a-form-item label=\"抄送组\">\n <select-cc-group v-model:value=\"value.cc_approval_position\" />\n </a-form-item>\n </a-col>\n <a-col :span=\"14\">\n <a-form-item label=\"抄送人\">\n <select-users v-model:value=\"value.cc_users\" />\n </a-form-item>\n </a-col>\n </a-row>\n </template>\n </a-form>\n\n <div\n class=\"process-wrap\"\n :style=\"{ height: height + 'px' }\"\n v-if=\"value.enable_flow\"\n >\n <my-process\n :value=\"value.content\"\n @update:value=\"change\"\n :fetch-users=\"handleFetchUsers\"\n user-row-key=\"id\"\n user-row-label=\"realname\"\n :show-save-button=\"false\"\n :fetch-roles=\"handleFetchRoles\"\n role-row-key=\"id\"\n role-row-label=\"name\"\n :fetch-depts=\"handleFetchDepts\"\n dept-row-key=\"id\"\n dept-row-label=\"name\"\n label=\"流程设计\"\n :process-id=\"menuFlag\"\n :process-name=\"value.name\"\n :form-data=\"formData\"\n :global-options=\"globalOptions\"\n />\n <!-- <MyProcessViewer :flowData=\"flowData\" height=\"300\"/>-->\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, reactive, PropType, computed } from 'vue';\nimport { useRequest, useUserStore } from '@/init-plugin';\nimport MyProcess from '@/MyProcess.vue';\nimport MyProcessViewer from '@/components/Process/viewer/index.vue';\nimport { debounce } from 'lodash';\nimport { FlowConfigType } from '../../typing';\nimport selectUsers from './selectUsers.vue';\nimport selectCcGroup from './selectCcGroup.vue';\nimport { globalOptions } from '../../utils';\n\nexport default defineComponent({\n name: 'ViewSettings',\n components: { MyProcess, MyProcessViewer, selectUsers, selectCcGroup },\n props: {\n value: {\n type: Object as PropType<FlowConfigType>,\n default: {},\n },\n menuFlag: {\n type: String,\n default: '',\n },\n dataSource: {\n type: Object,\n default: {},\n },\n },\n emits: ['update:value', 'update:flow_name'],\n\n setup(props, { emit }) {\n const request = useRequest();\n const userStore = useUserStore();\n const HDIFF = 260;\n const height = ref(window.innerHeight - HDIFF);\n const change = value => {\n const tmp = props.value || ({} as any);\n tmp.content = value;\n emit('update:value', tmp);\n };\n const update_name = value => {\n const tmp = props.value || ({} as any);\n tmp.name = value;\n emit('update:value', tmp);\n };\n const update_enable = value => {\n const tmp = props.value || ({} as any);\n tmp.enable_flow = value;\n emit('update:value', tmp);\n };\n const handleFetchUsers = async params => {\n console.log('xxxx handleFetchUsers params:', params);\n\n const res = await request.post('/sys/query_person_detail_list', {\n current: params.pageNum,\n pageSize: params.pageSize,\n name: params.userName,\n org_id: userStore.currentOrg.id,\n aim_org_id: userStore.currentOrg.id,\n is_active: true,\n is_pagination: true,\n });\n return {\n data: res.data,\n total: res.total,\n };\n };\n const onresize: any = debounce(() => {\n height.value = window.innerHeight - HDIFF;\n }, 200);\n const handleFetchRoles = async params => {\n console.log('xxxx handleFetchRoles params:', params);\n const res = await request.post('/lyapprove/query_approval_position_list', {\n current: params.pageNum,\n pageSize: params.pageSize,\n org_id: userStore.currentOrg.id,\n aim_org_id: userStore.currentOrg.id,\n });\n return {\n data: res.data,\n total: res.total,\n };\n };\n const handleFetchDepts = async () => {\n console.log('handleFetchRoles');\n // const res = await request.post('/org/query_group_by_org_list', {\n // current: 1,\n // pageSize: 2000,\n // org_id: userStore.currentOrg.id,\n // aim_org_id: userStore.currentOrg.id,\n // });\n const res = {\n data: [\n {\n id: '1',\n name: '公司总部',\n children: [\n {\n id: '2',\n name: '技术部',\n children: [\n { id: '4', name: '技术部1' },\n { id: '5', name: '人事部2' },\n ],\n },\n { id: '3', name: '人事部' },\n ],\n },\n ],\n total: 3,\n };\n return {\n data: res.data,\n total: res.total,\n };\n };\n\n const formData = computed(() => {\n const formObj = props.dataSource.columns.find((item: any) => item.type == 'form');\n return formObj?.form;\n });\n onMounted(() => {\n window.addEventListener('resize', onresize);\n onresize();\n });\n onUnmounted(() => {\n window.removeEventListener('resize', onresize);\n });\n\n const flowData = reactive({\n nodeData: [\n {\n key: '开始',\n completed: true,\n },\n {\n key: '节点1',\n completed: true,\n },\n {\n key: '节点2',\n completed: false,\n },\n ],\n xmlData:\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" xmlns:flowable=\"http://flowable.org/bpmn\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"http://www.flowable.org/processdef\">\\n <process id=\"flow_1noqmzzb\" name=\"并行网关流程回滚测试\" flowable:processCategory=\"leave\">\\n <startEvent id=\"start_event\" name=\"开始\">\\n <outgoing>Flow_1vdap9h</outgoing>\\n </startEvent>\\n <userTask id=\"Activity_1yr5v2c\" name=\"节点1\" flowable:assignee=\"${INITIATOR}\" flowable:dataType=\"fixed\" flowable:expId=\"1\">\\n <incoming>Flow_1vdap9h</incoming>\\n <outgoing>Flow_0h5bvp8</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_1vdap9h\" sourceRef=\"start_event\" targetRef=\"Activity_1yr5v2c\" />\\n <userTask id=\"Activity_0hzne0c\" name=\"节点2\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_0h5bvp8</incoming>\\n <outgoing>Flow_138vugq</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_0h5bvp8\" sourceRef=\"Activity_1yr5v2c\" targetRef=\"Activity_0hzne0c\" />\\n <parallelGateway id=\"Gateway_1f8o1fq\">\\n <incoming>Flow_138vugq</incoming>\\n <outgoing>Flow_0038zow</outgoing>\\n <outgoing>Flow_0ggd8de</outgoing>\\n <outgoing>Flow_10j69qn</outgoing>\\n </parallelGateway>\\n <sequenceFlow id=\"Flow_138vugq\" sourceRef=\"Activity_0hzne0c\" targetRef=\"Gateway_1f8o1fq\" />\\n <userTask id=\"Activity_1pqbtb0\" name=\"节点3-1\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_0038zow</incoming>\\n <outgoing>Flow_1joskka</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_0038zow\" sourceRef=\"Gateway_1f8o1fq\" targetRef=\"Activity_1pqbtb0\" />\\n <userTask id=\"Activity_0woqnpk\" name=\"节点3-2\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_0ggd8de</incoming>\\n <outgoing>Flow_0jp678o</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_0ggd8de\" sourceRef=\"Gateway_1f8o1fq\" targetRef=\"Activity_0woqnpk\" />\\n <userTask id=\"Activity_1pzy12o\" name=\"节点3-3\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_10j69qn</incoming>\\n <outgoing>Flow_0fbofr5</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_10j69qn\" sourceRef=\"Gateway_1f8o1fq\" targetRef=\"Activity_1pzy12o\" />\\n <parallelGateway id=\"Gateway_1bmfkgx\">\\n <incoming>Flow_1joskka</incoming>\\n <incoming>Flow_0jp678o</incoming>\\n <incoming>Flow_0fbofr5</incoming>\\n <outgoing>Flow_03jndts</outgoing>\\n </parallelGateway>\\n <sequenceFlow id=\"Flow_1joskka\" sourceRef=\"Activity_1pqbtb0\" targetRef=\"Gateway_1bmfkgx\" />\\n <sequenceFlow id=\"Flow_0jp678o\" sourceRef=\"Activity_0woqnpk\" targetRef=\"Gateway_1bmfkgx\" />\\n <sequenceFlow id=\"Flow_0fbofr5\" sourceRef=\"Activity_1pzy12o\" targetRef=\"Gateway_1bmfkgx\" />\\n <userTask id=\"Activity_0u70xd8\" name=\"节点4\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_03jndts</incoming>\\n </userTask>\\n <sequenceFlow id=\"Flow_03jndts\" sourceRef=\"Gateway_1bmfkgx\" targetRef=\"Activity_0u70xd8\" />\\n </process>\\n <bpmndi:BPMNDiagram id=\"BPMNDiagram_flow\">\\n <bpmndi:BPMNPlane id=\"BPMNPlane_flow\" bpmnElement=\"flow_1noqmzzb\">\\n <bpmndi:BPMNShape id=\"BPMNShape_start_event\" bpmnElement=\"start_event\" bioc:stroke=\"\">\\n <omgdc:Bounds x=\"-235\" y=\"95\" width=\"30\" height=\"30\" />\\n <bpmndi:BPMNLabel>\\n <omgdc:Bounds x=\"-232\" y=\"132\" width=\"22\" height=\"14\" />\\n </bpmndi:BPMNLabel>\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_1yr5v2c_di\" bpmnElement=\"Activity_1yr5v2c\">\\n <omgdc:Bounds x=\"-150\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_0hzne0c_di\" bpmnElement=\"Activity_0hzne0c\">\\n <omgdc:Bounds x=\"10\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Gateway_1f8o1fq_di\" bpmnElement=\"Gateway_1f8o1fq\">\\n <omgdc:Bounds x=\"175\" y=\"85\" width=\"50\" height=\"50\" />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_1pqbtb0_di\" bpmnElement=\"Activity_1pqbtb0\">\\n <omgdc:Bounds x=\"280\" y=\"-60\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_0woqnpk_di\" bpmnElement=\"Activity_0woqnpk\">\\n <omgdc:Bounds x=\"280\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_1pzy12o_di\" bpmnElement=\"Activity_1pzy12o\">\\n <omgdc:Bounds x=\"280\" y=\"210\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Gateway_1bmfkgx_di\" bpmnElement=\"Gateway_1bmfkgx\">\\n <omgdc:Bounds x=\"445\" y=\"85\" width=\"50\" height=\"50\" />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_0u70xd8_di\" bpmnElement=\"Activity_0u70xd8\">\\n <omgdc:Bounds x=\"560\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNEdge id=\"Flow_1vdap9h_di\" bpmnElement=\"Flow_1vdap9h\">\\n <di:waypoint x=\"-205\" y=\"110\" />\\n <di:waypoint x=\"-150\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0h5bvp8_di\" bpmnElement=\"Flow_0h5bvp8\">\\n <di:waypoint x=\"-50\" y=\"110\" />\\n <di:waypoint x=\"10\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_138vugq_di\" bpmnElement=\"Flow_138vugq\">\\n <di:waypoint x=\"110\" y=\"110\" />\\n <di:waypoint x=\"175\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0038zow_di\" bpmnElement=\"Flow_0038zow\">\\n <di:waypoint x=\"200\" y=\"85\" />\\n <di:waypoint x=\"200\" y=\"-20\" />\\n <di:waypoint x=\"280\" y=\"-20\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0ggd8de_di\" bpmnElement=\"Flow_0ggd8de\">\\n <di:waypoint x=\"225\" y=\"110\" />\\n <di:waypoint x=\"280\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_10j69qn_di\" bpmnElement=\"Flow_10j69qn\">\\n <di:waypoint x=\"200\" y=\"135\" />\\n <di:waypoint x=\"200\" y=\"250\" />\\n <di:waypoint x=\"280\" y=\"250\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_1joskka_di\" bpmnElement=\"Flow_1joskka\">\\n <di:waypoint x=\"380\" y=\"-20\" />\\n <di:waypoint x=\"470\" y=\"-20\" />\\n <di:waypoint x=\"470\" y=\"85\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0jp678o_di\" bpmnElement=\"Flow_0jp678o\">\\n <di:waypoint x=\"380\" y=\"110\" />\\n <di:waypoint x=\"445\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0fbofr5_di\" bpmnElement=\"Flow_0fbofr5\">\\n <di:waypoint x=\"380\" y=\"250\" />\\n <di:waypoint x=\"470\" y=\"250\" />\\n <di:waypoint x=\"470\" y=\"135\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_03jndts_di\" bpmnElement=\"Flow_03jndts\">\\n <di:waypoint x=\"495\" y=\"110\" />\\n <di:waypoint x=\"560\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n </bpmndi:BPMNPlane>\\n </bpmndi:BPMNDiagram>\\n</definitions>\\n',\n });\n return {\n flowData,\n formData,\n change,\n handleFetchUsers,\n handleFetchRoles,\n handleFetchDepts,\n update_name,\n update_enable,\n height,\n globalOptions,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.ant-tabs {\n display: flex;\n flex-direction: column;\n height: 100%;\n margin: 0;\n\n ::v-deep(.ant-tabs-content-holder) {\n overflow: auto;\n flex: 1;\n }\n\n ::v-deep(.ant-tabs-content-top) {\n height: 100%;\n }\n}\n.flow-config-wrap {\n height: 100%;\n overflow: hidden;\n}\n.process-wrap {\n overflow: auto;\n}\n</style>\n","<template>\n <div class=\"flow-config-wrap\">\n <a-form\n layout=\"horizontal\"\n size=\"small\"\n >\n <a-row :gutter=\"10\">\n <a-col :span=\"3\">\n <a-form-item label=\"开启流程\">\n <a-switch\n :checked=\"value.enable_flow\"\n @change=\"update_enable\"\n size=\"small\"\n ></a-switch>\n </a-form-item>\n </a-col>\n <a-col\n :span=\"21\"\n v-if=\"value.enable_flow\"\n >\n <a-form-item label=\"名称\">\n <a-input\n :value=\"value.name\"\n @update:value=\"update_name\"\n size=\"small\"\n ></a-input>\n </a-form-item>\n </a-col>\n </a-row>\n\n <template v-if=\"value.enable_flow\">\n <a-row :gutter=\"10\">\n <a-col :span=\"5\">\n <a-form-item label=\"抄送位置\">\n <a-select\n v-model:value=\"value.cc_position\"\n size=\"small\"\n >\n <a-select-option value=\"start\">审批发起时</a-select-option>\n <a-select-option value=\"finish\">审批通过后</a-select-option>\n <a-select-option value=\"start_finish\">审批发起时和审批通过后</a-select-option>\n </a-select>\n </a-form-item>\n </a-col>\n\n <a-col :span=\"5\">\n <a-form-item label=\"抄送组\">\n <select-cc-group v-model:value=\"value.cc_approval_position\" />\n </a-form-item>\n </a-col>\n <a-col :span=\"14\">\n <a-form-item label=\"抄送人\">\n <select-users v-model:value=\"value.cc_users\" />\n </a-form-item>\n </a-col>\n </a-row>\n </template>\n </a-form>\n\n <div\n class=\"process-wrap\"\n :style=\"{ height: height + 'px' }\"\n v-if=\"value.enable_flow\"\n >\n <my-process\n :value=\"value.content\"\n @update:value=\"change\"\n :fetch-users=\"handleFetchUsers\"\n user-row-key=\"id\"\n user-row-label=\"realname\"\n :show-save-button=\"false\"\n :fetch-roles=\"handleFetchRoles\"\n role-row-key=\"id\"\n role-row-label=\"name\"\n :fetch-depts=\"handleFetchDepts\"\n dept-row-key=\"id\"\n dept-row-label=\"name\"\n label=\"流程设计\"\n :process-id=\"menuFlag\"\n :process-name=\"value.name\"\n :form-data=\"formData\"\n :global-options=\"globalOptions\"\n />\n <!-- <MyProcessViewer :flowData=\"flowData\" height=\"300\"/>-->\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, reactive, PropType, computed } from 'vue';\nimport { useRequest, useUserStore } from '@/init-plugin';\nimport MyProcess from '@/MyProcess.vue';\nimport MyProcessViewer from '@/components/Process/viewer/index.vue';\nimport { debounce } from 'lodash';\nimport { FlowConfigType } from '../../typing';\nimport selectUsers from './selectUsers.vue';\nimport selectCcGroup from './selectCcGroup.vue';\nimport { globalOptions } from '../../utils';\n\nexport default defineComponent({\n name: 'ViewSettings',\n components: { MyProcess, MyProcessViewer, selectUsers, selectCcGroup },\n props: {\n value: {\n type: Object as PropType<FlowConfigType>,\n default: {},\n },\n menuFlag: {\n type: String,\n default: '',\n },\n dataSource: {\n type: Object,\n default: {},\n },\n },\n emits: ['update:value', 'update:flow_name'],\n\n setup(props, { emit }) {\n const request = useRequest();\n const userStore = useUserStore();\n const HDIFF = 260;\n const height = ref(window.innerHeight - HDIFF);\n const change = value => {\n const tmp = props.value || ({} as any);\n tmp.content = value;\n emit('update:value', tmp);\n };\n const update_name = value => {\n const tmp = props.value || ({} as any);\n tmp.name = value;\n emit('update:value', tmp);\n };\n const update_enable = value => {\n const tmp = props.value || ({} as any);\n tmp.enable_flow = value;\n emit('update:value', tmp);\n };\n const handleFetchUsers = async params => {\n console.log('xxxx handleFetchUsers params:', params);\n\n const res = await request.post('/sys/query_person_detail_list', {\n current: params.pageNum,\n pageSize: params.pageSize,\n name: params.userName,\n org_id: userStore.currentOrg.id,\n aim_org_id: userStore.currentOrg.id,\n is_active: true,\n is_pagination: true,\n });\n return {\n data: res.data,\n total: res.total,\n };\n };\n const onresize: any = debounce(() => {\n height.value = window.innerHeight - HDIFF;\n }, 200);\n const handleFetchRoles = async params => {\n console.log('xxxx handleFetchRoles params:', params);\n const res = await request.post('/lyapprove/query_approval_position_list', {\n current: params.pageNum,\n pageSize: params.pageSize,\n org_id: userStore.currentOrg.id,\n aim_org_id: userStore.currentOrg.id,\n });\n return {\n data: res.data,\n total: res.total,\n };\n };\n const handleFetchDepts = async () => {\n console.log('handleFetchRoles');\n // const res = await request.post('/org/query_group_by_org_list', {\n // current: 1,\n // pageSize: 2000,\n // org_id: userStore.currentOrg.id,\n // aim_org_id: userStore.currentOrg.id,\n // });\n const res = {\n data: [\n {\n id: '1',\n name: '公司总部',\n children: [\n {\n id: '2',\n name: '技术部',\n children: [\n { id: '4', name: '技术部1' },\n { id: '5', name: '人事部2' },\n ],\n },\n { id: '3', name: '人事部' },\n ],\n },\n ],\n total: 3,\n };\n return {\n data: res.data,\n total: res.total,\n };\n };\n\n const formData = computed(() => {\n const formObj = props.dataSource.columns.find((item: any) => item.type == 'form');\n return formObj?.form;\n });\n onMounted(() => {\n window.addEventListener('resize', onresize);\n onresize();\n });\n onUnmounted(() => {\n window.removeEventListener('resize', onresize);\n });\n\n const flowData = reactive({\n nodeData: [\n {\n key: '开始',\n completed: true,\n },\n {\n key: '节点1',\n completed: true,\n },\n {\n key: '节点2',\n completed: false,\n },\n ],\n xmlData:\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" xmlns:flowable=\"http://flowable.org/bpmn\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"http://www.flowable.org/processdef\">\\n <process id=\"flow_1noqmzzb\" name=\"并行网关流程回滚测试\" flowable:processCategory=\"leave\">\\n <startEvent id=\"start_event\" name=\"开始\">\\n <outgoing>Flow_1vdap9h</outgoing>\\n </startEvent>\\n <userTask id=\"Activity_1yr5v2c\" name=\"节点1\" flowable:assignee=\"${INITIATOR}\" flowable:dataType=\"fixed\" flowable:expId=\"1\">\\n <incoming>Flow_1vdap9h</incoming>\\n <outgoing>Flow_0h5bvp8</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_1vdap9h\" sourceRef=\"start_event\" targetRef=\"Activity_1yr5v2c\" />\\n <userTask id=\"Activity_0hzne0c\" name=\"节点2\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_0h5bvp8</incoming>\\n <outgoing>Flow_138vugq</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_0h5bvp8\" sourceRef=\"Activity_1yr5v2c\" targetRef=\"Activity_0hzne0c\" />\\n <parallelGateway id=\"Gateway_1f8o1fq\">\\n <incoming>Flow_138vugq</incoming>\\n <outgoing>Flow_0038zow</outgoing>\\n <outgoing>Flow_0ggd8de</outgoing>\\n <outgoing>Flow_10j69qn</outgoing>\\n </parallelGateway>\\n <sequenceFlow id=\"Flow_138vugq\" sourceRef=\"Activity_0hzne0c\" targetRef=\"Gateway_1f8o1fq\" />\\n <userTask id=\"Activity_1pqbtb0\" name=\"节点3-1\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_0038zow</incoming>\\n <outgoing>Flow_1joskka</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_0038zow\" sourceRef=\"Gateway_1f8o1fq\" targetRef=\"Activity_1pqbtb0\" />\\n <userTask id=\"Activity_0woqnpk\" name=\"节点3-2\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_0ggd8de</incoming>\\n <outgoing>Flow_0jp678o</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_0ggd8de\" sourceRef=\"Gateway_1f8o1fq\" targetRef=\"Activity_0woqnpk\" />\\n <userTask id=\"Activity_1pzy12o\" name=\"节点3-3\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_10j69qn</incoming>\\n <outgoing>Flow_0fbofr5</outgoing>\\n </userTask>\\n <sequenceFlow id=\"Flow_10j69qn\" sourceRef=\"Gateway_1f8o1fq\" targetRef=\"Activity_1pzy12o\" />\\n <parallelGateway id=\"Gateway_1bmfkgx\">\\n <incoming>Flow_1joskka</incoming>\\n <incoming>Flow_0jp678o</incoming>\\n <incoming>Flow_0fbofr5</incoming>\\n <outgoing>Flow_03jndts</outgoing>\\n </parallelGateway>\\n <sequenceFlow id=\"Flow_1joskka\" sourceRef=\"Activity_1pqbtb0\" targetRef=\"Gateway_1bmfkgx\" />\\n <sequenceFlow id=\"Flow_0jp678o\" sourceRef=\"Activity_0woqnpk\" targetRef=\"Gateway_1bmfkgx\" />\\n <sequenceFlow id=\"Flow_0fbofr5\" sourceRef=\"Activity_1pzy12o\" targetRef=\"Gateway_1bmfkgx\" />\\n <userTask id=\"Activity_0u70xd8\" name=\"节点4\" flowable:assignee=\"1\" flowable:dataType=\"fixed\">\\n <incoming>Flow_03jndts</incoming>\\n </userTask>\\n <sequenceFlow id=\"Flow_03jndts\" sourceRef=\"Gateway_1bmfkgx\" targetRef=\"Activity_0u70xd8\" />\\n </process>\\n <bpmndi:BPMNDiagram id=\"BPMNDiagram_flow\">\\n <bpmndi:BPMNPlane id=\"BPMNPlane_flow\" bpmnElement=\"flow_1noqmzzb\">\\n <bpmndi:BPMNShape id=\"BPMNShape_start_event\" bpmnElement=\"start_event\" bioc:stroke=\"\">\\n <omgdc:Bounds x=\"-235\" y=\"95\" width=\"30\" height=\"30\" />\\n <bpmndi:BPMNLabel>\\n <omgdc:Bounds x=\"-232\" y=\"132\" width=\"22\" height=\"14\" />\\n </bpmndi:BPMNLabel>\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_1yr5v2c_di\" bpmnElement=\"Activity_1yr5v2c\">\\n <omgdc:Bounds x=\"-150\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_0hzne0c_di\" bpmnElement=\"Activity_0hzne0c\">\\n <omgdc:Bounds x=\"10\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Gateway_1f8o1fq_di\" bpmnElement=\"Gateway_1f8o1fq\">\\n <omgdc:Bounds x=\"175\" y=\"85\" width=\"50\" height=\"50\" />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_1pqbtb0_di\" bpmnElement=\"Activity_1pqbtb0\">\\n <omgdc:Bounds x=\"280\" y=\"-60\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_0woqnpk_di\" bpmnElement=\"Activity_0woqnpk\">\\n <omgdc:Bounds x=\"280\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_1pzy12o_di\" bpmnElement=\"Activity_1pzy12o\">\\n <omgdc:Bounds x=\"280\" y=\"210\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Gateway_1bmfkgx_di\" bpmnElement=\"Gateway_1bmfkgx\">\\n <omgdc:Bounds x=\"445\" y=\"85\" width=\"50\" height=\"50\" />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNShape id=\"Activity_0u70xd8_di\" bpmnElement=\"Activity_0u70xd8\">\\n <omgdc:Bounds x=\"560\" y=\"70\" width=\"100\" height=\"80\" />\\n <bpmndi:BPMNLabel />\\n </bpmndi:BPMNShape>\\n <bpmndi:BPMNEdge id=\"Flow_1vdap9h_di\" bpmnElement=\"Flow_1vdap9h\">\\n <di:waypoint x=\"-205\" y=\"110\" />\\n <di:waypoint x=\"-150\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0h5bvp8_di\" bpmnElement=\"Flow_0h5bvp8\">\\n <di:waypoint x=\"-50\" y=\"110\" />\\n <di:waypoint x=\"10\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_138vugq_di\" bpmnElement=\"Flow_138vugq\">\\n <di:waypoint x=\"110\" y=\"110\" />\\n <di:waypoint x=\"175\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0038zow_di\" bpmnElement=\"Flow_0038zow\">\\n <di:waypoint x=\"200\" y=\"85\" />\\n <di:waypoint x=\"200\" y=\"-20\" />\\n <di:waypoint x=\"280\" y=\"-20\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0ggd8de_di\" bpmnElement=\"Flow_0ggd8de\">\\n <di:waypoint x=\"225\" y=\"110\" />\\n <di:waypoint x=\"280\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_10j69qn_di\" bpmnElement=\"Flow_10j69qn\">\\n <di:waypoint x=\"200\" y=\"135\" />\\n <di:waypoint x=\"200\" y=\"250\" />\\n <di:waypoint x=\"280\" y=\"250\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_1joskka_di\" bpmnElement=\"Flow_1joskka\">\\n <di:waypoint x=\"380\" y=\"-20\" />\\n <di:waypoint x=\"470\" y=\"-20\" />\\n <di:waypoint x=\"470\" y=\"85\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0jp678o_di\" bpmnElement=\"Flow_0jp678o\">\\n <di:waypoint x=\"380\" y=\"110\" />\\n <di:waypoint x=\"445\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_0fbofr5_di\" bpmnElement=\"Flow_0fbofr5\">\\n <di:waypoint x=\"380\" y=\"250\" />\\n <di:waypoint x=\"470\" y=\"250\" />\\n <di:waypoint x=\"470\" y=\"135\" />\\n </bpmndi:BPMNEdge>\\n <bpmndi:BPMNEdge id=\"Flow_03jndts_di\" bpmnElement=\"Flow_03jndts\">\\n <di:waypoint x=\"495\" y=\"110\" />\\n <di:waypoint x=\"560\" y=\"110\" />\\n </bpmndi:BPMNEdge>\\n </bpmndi:BPMNPlane>\\n </bpmndi:BPMNDiagram>\\n</definitions>\\n',\n });\n return {\n flowData,\n formData,\n change,\n handleFetchUsers,\n handleFetchRoles,\n handleFetchDepts,\n update_name,\n update_enable,\n height,\n globalOptions,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.ant-tabs {\n display: flex;\n flex-direction: column;\n height: 100%;\n margin: 0;\n\n ::v-deep(.ant-tabs-content-holder) {\n overflow: auto;\n flex: 1;\n }\n\n ::v-deep(.ant-tabs-content-top) {\n height: 100%;\n }\n}\n.flow-config-wrap {\n height: 100%;\n overflow: hidden;\n}\n.process-wrap {\n overflow: auto;\n}\n</style>\n","<template>\n <a-cascader\n :value=\"value\"\n :field-names=\"{ label: 'label', value: 'key', children: 'children' }\"\n :options=\"options\"\n placeholder=\"请选择字段\"\n size=\"small\"\n @change=\"handleChange\"\n />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType, ref, watch } from 'vue';\nexport default defineComponent({\n name: 'FormField',\n components: {},\n props: {\n value: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n options: {\n type: Array as PropType<any[]>,\n default: () => [],\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const handleChange = value => {\n if (value?.length > 0) {\n emit('update:value', value);\n } else {\n emit('update:value', null);\n }\n };\n return { handleChange };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-cascader\n :value=\"value\"\n :field-names=\"{ label: 'label', value: 'key', children: 'children' }\"\n :options=\"options\"\n placeholder=\"请选择字段\"\n size=\"small\"\n @change=\"handleChange\"\n />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType, ref, watch } from 'vue';\nexport default defineComponent({\n name: 'FormField',\n components: {},\n props: {\n value: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n options: {\n type: Array as PropType<any[]>,\n default: () => [],\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const handleChange = value => {\n if (value?.length > 0) {\n emit('update:value', value);\n } else {\n emit('update:value', null);\n }\n };\n return { handleChange };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"selectValue\"\n @change=\"handleChange($event, false)\"\n placeholder=\"请选择数据字段\"\n allow-clear\n >\n <a-select-option\n v-for=\"item in excelColumnList\"\n :key=\"item.column_index\"\n :value=\"item.column_index\"\n >\n [{{ item.column_index }}] {{ item.column_name }}\n </a-select-option>\n </a-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, PropType, ref, watch } from 'vue';\nimport { getApiData } from '@/init-plugin';\nimport { DataColumn } from '../../typing';\nexport default defineComponent({\n name: 'selectExcelType',\n components: {},\n props: {\n value: {\n type: Object as PropType<DataColumn>,\n },\n excel_type_id: {\n type: Number,\n },\n },\n emits: ['update:value', 'change'],\n\n setup(props, { emit }) {\n const KEYS = [\n 'column_index',\n 'column_name',\n 'data_type',\n 'data_length',\n 'column_is_null',\n 'char_column',\n 'zero_column',\n 'number_column',\n 'is_method_column',\n 'is_sid_column',\n ];\n const excelColumnList = ref<any>([]);\n const selectValue = ref<any>(props.value);\n const getExcelColumnList = async () => {\n if (!props.excel_type_id) {\n excelColumnList.value = [];\n selectValue.value = null;\n emit('update:value', null);\n return;\n }\n const conditions = [\n {\n field_name: 'excel_type_id',\n operator: 'eq',\n value: [props.excel_type_id],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_import_column',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n ];\n const res = await getApiData(\n {\n is_pagination: false,\n column_fields: ['column_index', 'column_name', 'data_type', 'is_method_column', 'is_sid_column'],\n sort_fields: ['-id'],\n conditions: [conditions],\n },\n '/costexcel/query_excel_column_config_list',\n );\n excelColumnList.value = res.data;\n handleChange(props.value?.column_index, true);\n };\n const handleChange = (value: any, is_watch = false) => {\n if (!value) {\n selectValue.value = null;\n emit('update:value', null);\n if (!is_watch) {\n emit('change', null);\n }\n return;\n }\n const findItem = excelColumnList.value.find((item: any) => item.column_index === value);\n if (findItem.column_index !== selectValue.value?.column_index) {\n selectValue.value = findItem.column_index;\n }\n if (!findItem) {\n selectValue.value = null;\n emit('update:value', null);\n if (!is_watch) {\n emit('change', null);\n }\n return;\n }\n const res = {};\n for (const key of KEYS) {\n res[key] = findItem[key];\n }\n emit('update:value', res);\n if (!is_watch) {\n emit('change', res);\n }\n };\n watch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue?.column_index === oldValue?.column_index) {\n return;\n }\n handleChange(newValue?.column_index, true);\n },\n );\n watch(\n () => props.excel_type_id,\n (newValue, oldValue) => {\n if (newValue === oldValue) {\n return;\n }\n getExcelColumnList();\n },\n {\n immediate: true,\n },\n );\n\n return {\n excelColumnList,\n selectValue,\n getExcelColumnList,\n handleChange,\n };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"selectValue\"\n @change=\"handleChange($event, false)\"\n placeholder=\"请选择数据字段\"\n allow-clear\n >\n <a-select-option\n v-for=\"item in excelColumnList\"\n :key=\"item.column_index\"\n :value=\"item.column_index\"\n >\n [{{ item.column_index }}] {{ item.column_name }}\n </a-select-option>\n </a-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, PropType, ref, watch } from 'vue';\nimport { getApiData } from '@/init-plugin';\nimport { DataColumn } from '../../typing';\nexport default defineComponent({\n name: 'selectExcelType',\n components: {},\n props: {\n value: {\n type: Object as PropType<DataColumn>,\n },\n excel_type_id: {\n type: Number,\n },\n },\n emits: ['update:value', 'change'],\n\n setup(props, { emit }) {\n const KEYS = [\n 'column_index',\n 'column_name',\n 'data_type',\n 'data_length',\n 'column_is_null',\n 'char_column',\n 'zero_column',\n 'number_column',\n 'is_method_column',\n 'is_sid_column',\n ];\n const excelColumnList = ref<any>([]);\n const selectValue = ref<any>(props.value);\n const getExcelColumnList = async () => {\n if (!props.excel_type_id) {\n excelColumnList.value = [];\n selectValue.value = null;\n emit('update:value', null);\n return;\n }\n const conditions = [\n {\n field_name: 'excel_type_id',\n operator: 'eq',\n value: [props.excel_type_id],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_import_column',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n ];\n const res = await getApiData(\n {\n is_pagination: false,\n column_fields: ['column_index', 'column_name', 'data_type', 'is_method_column', 'is_sid_column'],\n sort_fields: ['-id'],\n conditions: [conditions],\n },\n '/costexcel/query_excel_column_config_list',\n );\n excelColumnList.value = res.data;\n handleChange(props.value?.column_index, true);\n };\n const handleChange = (value: any, is_watch = false) => {\n if (!value) {\n selectValue.value = null;\n emit('update:value', null);\n if (!is_watch) {\n emit('change', null);\n }\n return;\n }\n const findItem = excelColumnList.value.find((item: any) => item.column_index === value);\n if (findItem.column_index !== selectValue.value?.column_index) {\n selectValue.value = findItem.column_index;\n }\n if (!findItem) {\n selectValue.value = null;\n emit('update:value', null);\n if (!is_watch) {\n emit('change', null);\n }\n return;\n }\n const res = {};\n for (const key of KEYS) {\n res[key] = findItem[key];\n }\n emit('update:value', res);\n if (!is_watch) {\n emit('change', res);\n }\n };\n watch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue?.column_index === oldValue?.column_index) {\n return;\n }\n handleChange(newValue?.column_index, true);\n },\n );\n watch(\n () => props.excel_type_id,\n (newValue, oldValue) => {\n if (newValue === oldValue) {\n return;\n }\n getExcelColumnList();\n },\n {\n immediate: true,\n },\n );\n\n return {\n excelColumnList,\n selectValue,\n getExcelColumnList,\n handleChange,\n };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"selectValue\"\n @change=\"handleChange($event, false)\"\n allowClear\n placeholder=\"请选择\"\n show-search\n :filter-option=\"filterOption\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in excelTypeList\"\n :key=\"item.id\"\n :value=\"item.id\"\n :name=\"item.name\"\n >\n {{ item.name }}\n </a-select-option>\n </a-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, PropType, ref, watch } from 'vue';\nimport { getApiData } from '@/init-plugin';\nexport default defineComponent({\n name: 'selectExcelType',\n components: {},\n props: {\n value: {\n type: Object as PropType<{\n id: number;\n name: string;\n flag: string;\n }>,\n },\n },\n emits: ['update:value', 'update:excelColumnList'],\n\n setup(props, { emit }) {\n const excelTypeList = ref<any>([]);\n const selectValue = ref<any>(null);\n const getExcelColumnList = async excel_type_id => {\n const conditions = [\n {\n field_name: 'excel_type_id',\n operator: 'eq',\n value: [excel_type_id],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_import_column',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n ];\n const res = await getApiData(\n {\n is_pagination: false,\n sort_fields: ['column_index'],\n conditions: [conditions],\n },\n '/costexcel/query_excel_column_config_list',\n );\n emit('update:excelColumnList', res.data);\n };\n const getExcelTypeList = async () => {\n const res = await getApiData({ is_active: true }, '/costexcel/query_excel_type_list');\n excelTypeList.value = res.data;\n handleChange(props.value?.id, true);\n };\n const handleChange = (value: any, is_watch = false) => {\n if (!value) {\n selectValue.value = null;\n emit('update:value', null);\n if (!is_watch) {\n emit('update:excelColumnList', null);\n }\n return;\n }\n const findItem = excelTypeList.value.find((item: any) => item.id === value);\n if (findItem.id !== selectValue.value) {\n selectValue.value = findItem.id;\n }\n if (!findItem) {\n emit('update:value', null);\n if (!is_watch) {\n emit('update:excelColumnList', null);\n }\n return;\n }\n const res = {\n id: findItem.id,\n name: findItem.name,\n flag: findItem.flag,\n };\n emit('update:value', res);\n if (!is_watch) {\n getExcelColumnList(res.id);\n }\n };\n watch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue?.id === oldValue?.id) {\n return;\n }\n handleChange(newValue?.id, true);\n },\n );\n const filterOption = (input: string, option: any) => {\n return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n };\n onMounted(() => {\n getExcelTypeList();\n });\n return {\n excelTypeList,\n selectValue,\n getExcelTypeList,\n handleChange,\n filterOption,\n };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-select\n v-model:value=\"selectValue\"\n @change=\"handleChange($event, false)\"\n allowClear\n placeholder=\"请选择\"\n show-search\n :filter-option=\"filterOption\"\n size=\"small\"\n >\n <a-select-option\n v-for=\"item in excelTypeList\"\n :key=\"item.id\"\n :value=\"item.id\"\n :name=\"item.name\"\n >\n {{ item.name }}\n </a-select-option>\n </a-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, PropType, ref, watch } from 'vue';\nimport { getApiData } from '@/init-plugin';\nexport default defineComponent({\n name: 'selectExcelType',\n components: {},\n props: {\n value: {\n type: Object as PropType<{\n id: number;\n name: string;\n flag: string;\n }>,\n },\n },\n emits: ['update:value', 'update:excelColumnList'],\n\n setup(props, { emit }) {\n const excelTypeList = ref<any>([]);\n const selectValue = ref<any>(null);\n const getExcelColumnList = async excel_type_id => {\n const conditions = [\n {\n field_name: 'excel_type_id',\n operator: 'eq',\n value: [excel_type_id],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_import_column',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n ];\n const res = await getApiData(\n {\n is_pagination: false,\n sort_fields: ['column_index'],\n conditions: [conditions],\n },\n '/costexcel/query_excel_column_config_list',\n );\n emit('update:excelColumnList', res.data);\n };\n const getExcelTypeList = async () => {\n const res = await getApiData({ is_active: true }, '/costexcel/query_excel_type_list');\n excelTypeList.value = res.data;\n handleChange(props.value?.id, true);\n };\n const handleChange = (value: any, is_watch = false) => {\n if (!value) {\n selectValue.value = null;\n emit('update:value', null);\n if (!is_watch) {\n emit('update:excelColumnList', null);\n }\n return;\n }\n const findItem = excelTypeList.value.find((item: any) => item.id === value);\n if (findItem.id !== selectValue.value) {\n selectValue.value = findItem.id;\n }\n if (!findItem) {\n emit('update:value', null);\n if (!is_watch) {\n emit('update:excelColumnList', null);\n }\n return;\n }\n const res = {\n id: findItem.id,\n name: findItem.name,\n flag: findItem.flag,\n };\n emit('update:value', res);\n if (!is_watch) {\n getExcelColumnList(res.id);\n }\n };\n watch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue?.id === oldValue?.id) {\n return;\n }\n handleChange(newValue?.id, true);\n },\n );\n const filterOption = (input: string, option: any) => {\n return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n };\n onMounted(() => {\n getExcelTypeList();\n });\n return {\n excelTypeList,\n selectValue,\n getExcelTypeList,\n handleChange,\n filterOption,\n };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-input\n :value=\"innerValue\"\n :placeholder=\"placeholder\"\n :style=\"style\"\n @update:value=\"updateValue\"\n >\n <template #addonAfter>\n <span :style=\"{ color: 'gray' }\">\n {{ valueType }}\n </span>\n </template>\n </a-input>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ValueInput',\n components: {},\n props: {\n value: { type: Object as any, required: true },\n placeholder: { type: String, default: '' },\n style: { type: Object as any, default: () => ({}) },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const innerValue = computed(() => {\n if (typeof props.value === 'string') {\n return props.value;\n }\n try {\n const tmp = JSON.stringify(props.value);\n return tmp;\n } catch (e) {\n return props.value;\n }\n });\n const updateValue = value => {\n try {\n const tmp = JSON.parse(value);\n emit('update:value', tmp);\n } catch (e) {\n emit('update:value', value);\n }\n };\n const valueType = computed(() => {\n return typeof props.value;\n });\n return { innerValue, updateValue, valueType };\n },\n});\n</script>\n\n<style lang=\"less\" scoped></style>\n","<template>\n <a-input\n :value=\"innerValue\"\n :placeholder=\"placeholder\"\n :style=\"style\"\n @update:value=\"updateValue\"\n >\n <template #addonAfter>\n <span :style=\"{ color: 'gray' }\">\n {{ valueType }}\n </span>\n </template>\n </a-input>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ValueInput',\n components: {},\n props: {\n value: { type: Object as any, required: true },\n placeholder: { type: String, default: '' },\n style: { type: Object as any, default: () => ({}) },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const innerValue = computed(() => {\n if (typeof props.value === 'string') {\n return props.value;\n }\n try {\n const tmp = JSON.stringify(props.value);\n return tmp;\n } catch (e) {\n return props.value;\n }\n });\n const updateValue = value => {\n try {\n const tmp = JSON.parse(value);\n emit('update:value', tmp);\n } catch (e) {\n emit('update:value', value);\n }\n };\n const valueType = computed(() => {\n return typeof props.value;\n });\n return { innerValue, updateValue, valueType };\n },\n});\n</script>\n\n<style lang=\"less\" scoped></style>\n","<template>\n <a-alert\n v-if=\"source_type === 'operation'\"\n type=\"info\"\n show-icon\n message=\"操作类型列:保存时自动填充「添加/修改」,无需配置\"\n :style=\"style\"\n size=\"small\"\n banner\n />\n <a-cascader\n v-else-if=\"source_type && source_type !== 'fixed'\"\n :value=\"value\"\n :field-names=\"{ label: 'label', value: 'key', children: 'children' }\"\n :options=\"options\"\n placeholder=\"请选择字段\"\n @change=\"handleSelectChange\"\n @clear=\"handleSelectChange(null)\"\n :default-value=\"[]\"\n :style=\"style\"\n size=\"small\"\n />\n <value-input\n v-else-if=\"source_type === 'fixed'\"\n :value=\"inputValue\"\n @update:value=\"handleInputChange\"\n :style=\"style\"\n size=\"small\"\n placeholder=\"输入值\"\n ></value-input>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType, watch } from 'vue';\nimport { DataStoreFieldType } from '../../typing';\nimport { globalOptions } from '../../utils';\nimport ValueInput from './ValueInput.vue';\nimport { isEmpty } from '@/utils/function';\nexport default defineComponent({\n name: 'FormFieldMulType',\n components: { ValueInput },\n props: {\n value: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n batch_form_key_path: {\n type: Array as PropType<string[]>,\n default: [],\n },\n source_type: {\n type: String as PropType<DataStoreFieldType | null>,\n default: null,\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n style: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const inputValue = computed((): string => {\n if (props.value?.length) {\n return props.value[0];\n } else {\n return '';\n }\n });\n\n const handleSelectChange = value => {\n if (value?.length > 0) {\n emit('update:value', value);\n } else {\n emit('update:value', null);\n }\n };\n const handleInputChange = value => {\n if (!isEmpty(value)) {\n emit('update:value', [value]);\n } else {\n emit('update:value', []);\n }\n };\n // 操作类型列:source_value 固定为空,由后端保存时自动填充\n watch(\n () => props.source_type,\n newVal => {\n if (newVal === 'operation') {\n emit('update:value', []);\n }\n },\n );\n const getFieldLevel = (groups: any[], batch_key_path: string[]) => {\n if (!groups) {\n return [];\n }\n let groupIndex = 0;\n const res = [];\n for (const group of groups) {\n groupIndex += 1;\n\n const newGroup = {\n key: group.key,\n label: group.group_name || '分组' + groupIndex,\n children: [],\n };\n let groupLevelBatchKeyPath = null;\n if (batch_key_path[0] === group.key) {\n groupLevelBatchKeyPath = batch_key_path.slice(1);\n }\n\n for (const field of group.children) {\n if (!field.key) {\n continue;\n }\n const newField: any = {\n key: field.key,\n label: field.label,\n };\n if (field.type === 'remotetablepro') {\n if (groupLevelBatchKeyPath && groupLevelBatchKeyPath[0] === field.key) {\n const children = getFieldLevel(field.children, groupLevelBatchKeyPath.slice(1));\n if (children.length > 0) {\n newField.children = children;\n newGroup.children.push(newField);\n }\n }\n } else if (field.type === 'formtemplate') {\n if (groupLevelBatchKeyPath && groupLevelBatchKeyPath[0] === field.key) {\n const children = getFieldLevel(\n field.form?.dynamicFieldList,\n groupLevelBatchKeyPath.slice(1),\n );\n if (children.length > 0) {\n newField.children = children;\n newGroup.children.push(newField);\n }\n }\n } else {\n newGroup.children.push(newField);\n }\n }\n if (newGroup.children.length > 0) {\n res.push(newGroup);\n }\n }\n return res;\n };\n const options = computed(() => {\n if (props.source_type === 'global') {\n return globalOptions;\n } else if (props.source_type === 'form') {\n const dynamicFieldList = props.formData?.dynamicFieldList || [];\n return getFieldLevel(dynamicFieldList, props.batch_form_key_path || []);\n }\n });\n\n return { handleSelectChange, options, inputValue, handleInputChange };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <a-alert\n v-if=\"source_type === 'operation'\"\n type=\"info\"\n show-icon\n message=\"操作类型列:保存时自动填充「添加/修改」,无需配置\"\n :style=\"style\"\n size=\"small\"\n banner\n />\n <a-cascader\n v-else-if=\"source_type && source_type !== 'fixed'\"\n :value=\"value\"\n :field-names=\"{ label: 'label', value: 'key', children: 'children' }\"\n :options=\"options\"\n placeholder=\"请选择字段\"\n @change=\"handleSelectChange\"\n @clear=\"handleSelectChange(null)\"\n :default-value=\"[]\"\n :style=\"style\"\n size=\"small\"\n />\n <value-input\n v-else-if=\"source_type === 'fixed'\"\n :value=\"inputValue\"\n @update:value=\"handleInputChange\"\n :style=\"style\"\n size=\"small\"\n placeholder=\"输入值\"\n ></value-input>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType, watch } from 'vue';\nimport { DataStoreFieldType } from '../../typing';\nimport { globalOptions } from '../../utils';\nimport ValueInput from './ValueInput.vue';\nimport { isEmpty } from '@/utils/function';\nexport default defineComponent({\n name: 'FormFieldMulType',\n components: { ValueInput },\n props: {\n value: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n batch_form_key_path: {\n type: Array as PropType<string[]>,\n default: [],\n },\n source_type: {\n type: String as PropType<DataStoreFieldType | null>,\n default: null,\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n style: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const inputValue = computed((): string => {\n if (props.value?.length) {\n return props.value[0];\n } else {\n return '';\n }\n });\n\n const handleSelectChange = value => {\n if (value?.length > 0) {\n emit('update:value', value);\n } else {\n emit('update:value', null);\n }\n };\n const handleInputChange = value => {\n if (!isEmpty(value)) {\n emit('update:value', [value]);\n } else {\n emit('update:value', []);\n }\n };\n // 操作类型列:source_value 固定为空,由后端保存时自动填充\n watch(\n () => props.source_type,\n newVal => {\n if (newVal === 'operation') {\n emit('update:value', []);\n }\n },\n );\n const getFieldLevel = (groups: any[], batch_key_path: string[]) => {\n if (!groups) {\n return [];\n }\n let groupIndex = 0;\n const res = [];\n for (const group of groups) {\n groupIndex += 1;\n\n const newGroup = {\n key: group.key,\n label: group.group_name || '分组' + groupIndex,\n children: [],\n };\n let groupLevelBatchKeyPath = null;\n if (batch_key_path[0] === group.key) {\n groupLevelBatchKeyPath = batch_key_path.slice(1);\n }\n\n for (const field of group.children) {\n if (!field.key) {\n continue;\n }\n const newField: any = {\n key: field.key,\n label: field.label,\n };\n if (field.type === 'remotetablepro') {\n if (groupLevelBatchKeyPath && groupLevelBatchKeyPath[0] === field.key) {\n const children = getFieldLevel(field.children, groupLevelBatchKeyPath.slice(1));\n if (children.length > 0) {\n newField.children = children;\n newGroup.children.push(newField);\n }\n }\n } else if (field.type === 'formtemplate') {\n if (groupLevelBatchKeyPath && groupLevelBatchKeyPath[0] === field.key) {\n const children = getFieldLevel(\n field.form?.dynamicFieldList,\n groupLevelBatchKeyPath.slice(1),\n );\n if (children.length > 0) {\n newField.children = children;\n newGroup.children.push(newField);\n }\n }\n } else {\n newGroup.children.push(newField);\n }\n }\n if (newGroup.children.length > 0) {\n res.push(newGroup);\n }\n }\n return res;\n };\n const options = computed(() => {\n if (props.source_type === 'global') {\n return globalOptions;\n } else if (props.source_type === 'form') {\n const dynamicFieldList = props.formData?.dynamicFieldList || [];\n return getFieldLevel(dynamicFieldList, props.batch_form_key_path || []);\n }\n });\n\n return { handleSelectChange, options, inputValue, handleInputChange };\n },\n});\n</script>\n<style scoped lang=\"less\"></style>\n","<template>\n <div class=\"qb-group\">\n <div class=\"qb-group-head\">\n <a-button\n size=\"small\"\n @click=\"addRule\"\n >\n 添加条件\n </a-button>\n <a-button\n size=\"small\"\n style=\"margin-left: 8px\"\n @click=\"addGroup\"\n >\n 添加分组\n </a-button>\n </div>\n <div\n class=\"qb-group-body\"\n v-if=\"value?.conditions\"\n >\n <div\n class=\"condition-item\"\n v-for=\"(child, idx) in value.conditions\"\n :key=\"idx\"\n >\n <span>\n <a-select\n v-if=\"idx > 0\"\n style=\"width: 110px\"\n :value=\"value?.type || 'and'\"\n :options=\"[\n { label: '并且', value: 'and' },\n { label: '或者', value: 'or' },\n ]\"\n @update:value=\"(v:string) => (value.type = v as any)\"\n />\n </span>\n <!-- 分组 -->\n <div\n v-if=\"child && typeof child === 'object' && 'type' in child\"\n class=\"qb-subgroup\"\n >\n <ConditionConfig\n v-model:value=\"value.conditions[idx]\"\n :formData=\"formData\"\n :batch_form_key_path=\"batch_form_key_path\"\n />\n <a-button\n danger\n size=\"small\"\n style=\"margin: 4px 0\"\n @click=\"removeAt(idx)\"\n >\n 删除分组\n </a-button>\n </div>\n <!-- 规则 -->\n <div\n v-else\n class=\"qb-rule\"\n >\n <a-select\n v-model:value=\"child.source_type\"\n placeholder=\"请选择\"\n style=\"width: 150px\"\n >\n <a-select-option value=\"global\">全局字段</a-select-option>\n <a-select-option value=\"form\">表单字段</a-select-option>\n </a-select>\n <form-field-mul-type\n v-model:value=\"child.source_value\"\n :batch_form_key_path=\"batch_form_key_path\"\n :source_type=\"child.source_type\"\n :form-data=\"formData\"\n />\n <!-- 运算符 -->\n <a-select\n :value=\"child.op\"\n style=\"width: 300px\"\n :options=\"operators\"\n @update:value=\"(v:string)=> (child.op = v)\"\n />\n\n <!-- 值输入区域 -->\n <template v-if=\"child.op === 'in'\">\n <JsonTags\n v-model:value=\"child.value\"\n style=\"min-width: 220px\"\n placeholder=\"输入多个值后回车\"\n />\n </template>\n <template v-else-if=\"child.op === 'between'\">\n <a-space :size=\"4\">\n <value-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[0] : undefined\"\n placeholder=\"起始值\"\n @update:value=\"(v:any)=> updateBetween(child, 0, v)\"\n />\n <span style=\"padding: 0 4px; color: #999\">~</span>\n <value-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[1] : undefined\"\n placeholder=\"结束值\"\n @update:value=\"(v:any)=> updateBetween(child, 1, v)\"\n />\n </a-space>\n </template>\n <template v-else-if=\"['is_blank', 'is_not_blank'].includes(child.op)\">\n <span style=\"min-width: 220px\"></span>\n </template>\n <template v-else>\n <value-input\n style=\"min-width: 220px\"\n :value=\"child.value\"\n placeholder=\"输入值\"\n @update:value=\"(v:any)=> (child.value = v)\"\n />\n </template>\n\n <a-button\n danger\n size=\"small\"\n @click=\"removeAt(idx)\"\n >\n 删除\n </a-button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType, onMounted } from 'vue';\nimport formFieldMulType from './formFieldMulType.vue';\nimport { cloneDeep } from 'lodash';\nimport ValueInput from './ValueInput.vue';\nimport JsonTags from '../approvalPageConfig/JsonTags.vue';\nimport { ConditionsConfig } from '../../typing';\n\nexport default defineComponent({\n name: 'ConditionConfig',\n components: {\n formFieldMulType,\n ValueInput,\n JsonTags,\n },\n props: {\n value: {\n type: Object as PropType<ConditionsConfig>,\n required: true,\n },\n batch_form_key_path: {\n type: Array as PropType<string[]>,\n default: [],\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const operators = [\n { label: '等于', value: '=' },\n { label: '不等于', value: '!=' },\n { label: '大于', value: '>' },\n { label: '大于或等于', value: '>=' },\n { label: '小于', value: '<' },\n { label: '小于或等于', value: '<=' },\n { label: '包含', value: 'in' },\n { label: '模糊匹配', value: 'like' },\n { label: '介于', value: 'between' },\n { label: '非空', value: 'is_not_blank' },\n { label: '为空', value: 'is_blank' },\n ];\n\n const addRule = () => {\n const tmp = cloneDeep(props.value);\n tmp.conditions = tmp.conditions || [];\n tmp.conditions.push({ source_type: null, source_value: null, op: '=', value: '' });\n emit('update:value', tmp);\n };\n const addGroup = () => {\n const tmp = cloneDeep(props.value);\n tmp.conditions = tmp.conditions || [];\n tmp.conditions.push({ type: 'and', conditions: [] });\n emit('update:value', tmp);\n };\n const removeAt = (idx: number) => {\n const tmp = cloneDeep(props.value);\n tmp.conditions = tmp.conditions || [];\n tmp.conditions.splice(idx, 1);\n emit('update:value', tmp);\n };\n const updateBetween = (rule: any, pos: number, v: any) => {\n const arr = Array.isArray(rule.value) ? rule.value : [undefined, undefined];\n arr[pos] = v;\n rule.value = arr;\n };\n onMounted(() => {\n if (!props.value) {\n emit('update:value', { conditions: [], type: 'and' });\n }\n });\n return {\n operators,\n addRule,\n addGroup,\n removeAt,\n updateBetween,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.qb-group {\n border-left: 2px solid #f0f0f0;\n padding-left: 8px;\n}\n.qb-group-head {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n}\n.qb-group-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.qb-rule {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n.qb-subgroup {\n padding: 6px 0 6px 8px;\n border-left: 2px dashed #f0f0f0;\n flex: 1;\n}\n.condition-item {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: 6px;\n}\n</style>\n","<template>\n <div class=\"qb-group\">\n <div class=\"qb-group-head\">\n <a-button\n size=\"small\"\n @click=\"addRule\"\n >\n 添加条件\n </a-button>\n <a-button\n size=\"small\"\n style=\"margin-left: 8px\"\n @click=\"addGroup\"\n >\n 添加分组\n </a-button>\n </div>\n <div\n class=\"qb-group-body\"\n v-if=\"value?.conditions\"\n >\n <div\n class=\"condition-item\"\n v-for=\"(child, idx) in value.conditions\"\n :key=\"idx\"\n >\n <span>\n <a-select\n v-if=\"idx > 0\"\n style=\"width: 110px\"\n :value=\"value?.type || 'and'\"\n :options=\"[\n { label: '并且', value: 'and' },\n { label: '或者', value: 'or' },\n ]\"\n @update:value=\"(v:string) => (value.type = v as any)\"\n />\n </span>\n <!-- 分组 -->\n <div\n v-if=\"child && typeof child === 'object' && 'type' in child\"\n class=\"qb-subgroup\"\n >\n <ConditionConfig\n v-model:value=\"value.conditions[idx]\"\n :formData=\"formData\"\n :batch_form_key_path=\"batch_form_key_path\"\n />\n <a-button\n danger\n size=\"small\"\n style=\"margin: 4px 0\"\n @click=\"removeAt(idx)\"\n >\n 删除分组\n </a-button>\n </div>\n <!-- 规则 -->\n <div\n v-else\n class=\"qb-rule\"\n >\n <a-select\n v-model:value=\"child.source_type\"\n placeholder=\"请选择\"\n style=\"width: 150px\"\n >\n <a-select-option value=\"global\">全局字段</a-select-option>\n <a-select-option value=\"form\">表单字段</a-select-option>\n </a-select>\n <form-field-mul-type\n v-model:value=\"child.source_value\"\n :batch_form_key_path=\"batch_form_key_path\"\n :source_type=\"child.source_type\"\n :form-data=\"formData\"\n />\n <!-- 运算符 -->\n <a-select\n :value=\"child.op\"\n style=\"width: 300px\"\n :options=\"operators\"\n @update:value=\"(v:string)=> (child.op = v)\"\n />\n\n <!-- 值输入区域 -->\n <template v-if=\"child.op === 'in'\">\n <JsonTags\n v-model:value=\"child.value\"\n style=\"min-width: 220px\"\n placeholder=\"输入多个值后回车\"\n />\n </template>\n <template v-else-if=\"child.op === 'between'\">\n <a-space :size=\"4\">\n <value-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[0] : undefined\"\n placeholder=\"起始值\"\n @update:value=\"(v:any)=> updateBetween(child, 0, v)\"\n />\n <span style=\"padding: 0 4px; color: #999\">~</span>\n <value-input\n style=\"width: 120px\"\n :value=\"Array.isArray(child.value) ? child.value?.[1] : undefined\"\n placeholder=\"结束值\"\n @update:value=\"(v:any)=> updateBetween(child, 1, v)\"\n />\n </a-space>\n </template>\n <template v-else-if=\"['is_blank', 'is_not_blank'].includes(child.op)\">\n <span style=\"min-width: 220px\"></span>\n </template>\n <template v-else>\n <value-input\n style=\"min-width: 220px\"\n :value=\"child.value\"\n placeholder=\"输入值\"\n @update:value=\"(v:any)=> (child.value = v)\"\n />\n </template>\n\n <a-button\n danger\n size=\"small\"\n @click=\"removeAt(idx)\"\n >\n 删除\n </a-button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType, onMounted } from 'vue';\nimport formFieldMulType from './formFieldMulType.vue';\nimport { cloneDeep } from 'lodash';\nimport ValueInput from './ValueInput.vue';\nimport JsonTags from '../approvalPageConfig/JsonTags.vue';\nimport { ConditionsConfig } from '../../typing';\n\nexport default defineComponent({\n name: 'ConditionConfig',\n components: {\n formFieldMulType,\n ValueInput,\n JsonTags,\n },\n props: {\n value: {\n type: Object as PropType<ConditionsConfig>,\n required: true,\n },\n batch_form_key_path: {\n type: Array as PropType<string[]>,\n default: [],\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['update:value'],\n setup(props, { emit }) {\n const operators = [\n { label: '等于', value: '=' },\n { label: '不等于', value: '!=' },\n { label: '大于', value: '>' },\n { label: '大于或等于', value: '>=' },\n { label: '小于', value: '<' },\n { label: '小于或等于', value: '<=' },\n { label: '包含', value: 'in' },\n { label: '模糊匹配', value: 'like' },\n { label: '介于', value: 'between' },\n { label: '非空', value: 'is_not_blank' },\n { label: '为空', value: 'is_blank' },\n ];\n\n const addRule = () => {\n const tmp = cloneDeep(props.value);\n tmp.conditions = tmp.conditions || [];\n tmp.conditions.push({ source_type: null, source_value: null, op: '=', value: '' });\n emit('update:value', tmp);\n };\n const addGroup = () => {\n const tmp = cloneDeep(props.value);\n tmp.conditions = tmp.conditions || [];\n tmp.conditions.push({ type: 'and', conditions: [] });\n emit('update:value', tmp);\n };\n const removeAt = (idx: number) => {\n const tmp = cloneDeep(props.value);\n tmp.conditions = tmp.conditions || [];\n tmp.conditions.splice(idx, 1);\n emit('update:value', tmp);\n };\n const updateBetween = (rule: any, pos: number, v: any) => {\n const arr = Array.isArray(rule.value) ? rule.value : [undefined, undefined];\n arr[pos] = v;\n rule.value = arr;\n };\n onMounted(() => {\n if (!props.value) {\n emit('update:value', { conditions: [], type: 'and' });\n }\n });\n return {\n operators,\n addRule,\n addGroup,\n removeAt,\n updateBetween,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.qb-group {\n border-left: 2px solid #f0f0f0;\n padding-left: 8px;\n}\n.qb-group-head {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n}\n.qb-group-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.qb-rule {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n.qb-subgroup {\n padding: 6px 0 6px 8px;\n border-left: 2px dashed #f0f0f0;\n flex: 1;\n}\n.condition-item {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: 6px;\n}\n</style>\n","<template>\n <a-tag\n v-if=\"value.is_sid_column\"\n color=\"purple\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n 覆盖ID\n </a-tag>\n <a-tag\n v-if=\"value.is_method_column\"\n color=\"orange\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n 操作类型\n </a-tag>\n <a-tag\n v-if=\"value.is_modifiable\"\n color=\"blue\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n 可修改\n </a-tag>\n <template\n v-for=\"p in params\"\n :key=\"p.key\"\n >\n <a-tag\n v-if=\"value[p.key] !== '不判断'\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n {{ p.title }}:{{ value[p.key] }}\n </a-tag>\n </template>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType } from 'vue';\nexport default defineComponent({\n name: 'dataSourceDetial',\n components: {},\n props: {\n value: {\n type: Object as PropType<any>,\n default: () => [],\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const params = [\n { title: '数据类型', key: 'data_type' },\n { title: '数据长度', key: 'data_length' },\n { title: '是否可为空', key: 'column_is_null' },\n { title: '字符规则', key: 'char_column' },\n { title: '数字规则', key: 'zero_column' },\n { title: '整数与实数', key: 'number_column' },\n ];\n return { params };\n },\n});\n</script>\n<style scoped lang=\"less\">\n</style>\n","<template>\n <a-tag\n v-if=\"value.is_sid_column\"\n color=\"purple\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n 覆盖ID\n </a-tag>\n <a-tag\n v-if=\"value.is_method_column\"\n color=\"orange\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n 操作类型\n </a-tag>\n <a-tag\n v-if=\"value.is_modifiable\"\n color=\"blue\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n 可修改\n </a-tag>\n <template\n v-for=\"p in params\"\n :key=\"p.key\"\n >\n <a-tag\n v-if=\"value[p.key] !== '不判断'\"\n size=\"small\"\n style=\"font-size: 10px; display: inline-block\"\n >\n {{ p.title }}:{{ value[p.key] }}\n </a-tag>\n </template>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, PropType } from 'vue';\nexport default defineComponent({\n name: 'dataSourceDetial',\n components: {},\n props: {\n value: {\n type: Object as PropType<any>,\n default: () => [],\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const params = [\n { title: '数据类型', key: 'data_type' },\n { title: '数据长度', key: 'data_length' },\n { title: '是否可为空', key: 'column_is_null' },\n { title: '字符规则', key: 'char_column' },\n { title: '数字规则', key: 'zero_column' },\n { title: '整数与实数', key: 'number_column' },\n ];\n return { params };\n },\n});\n</script>\n<style scoped lang=\"less\">\n</style>\n","<template>\n <div class=\"rule-header\">\n <div class=\"rule-header-left\">\n <a-button\n type=\"text\"\n @click=\"toggleCollapse\"\n class=\"collapse-btn\"\n >\n <template #icon>\n <down-outlined v-if=\"collapsedState\" />\n <up-outlined v-else />\n </template>\n </a-button>\n <a-form\n layout=\"inline\"\n size=\"small\"\n >\n <a-form-item label=\"规则名称\">\n <a-input v-model:value=\"rule.name\"></a-input>\n </a-form-item>\n <a-form-item label=\"导入方式\">\n <a-select\n style=\"width: 150px\"\n v-model:value=\"rule.import_type\"\n default-value=\"pass_import\"\n >\n <a-select-option value=\"pass_import\">审批通过后导入</a-select-option>\n <a-select-option value=\"immediately_import\">提交立即导入</a-select-option>\n </a-select>\n </a-form-item>\n <a-form-item label=\"处理顺序\">\n <a-input-number v-model:value=\"rule.order\"></a-input-number>\n </a-form-item>\n </a-form>\n </div>\n <div class=\"rule-header-right\">\n <a-button\n type=\"text\"\n @click=\"handleCopyRule\"\n >\n <template #icon>\n <CopyOutlined />\n </template>\n </a-button>\n <a-button\n type=\"text\"\n danger\n @click=\"removeRule\"\n >\n <template #icon>\n <delete-outlined />\n </template>\n </a-button>\n </div>\n </div>\n <transition name=\"collapse\">\n <div\n v-if=\"collapsedState\"\n class=\"rule-collapse-content\"\n >\n <div class=\"rule-middle\">\n <a-form>\n <a-form-item label=\"数据类型\">\n <select-excel-type\n v-model:value=\"rule.excel_type\"\n @update:excel-column-list=\"handleChangeExcelColumnList\"\n />\n </a-form-item>\n <a-form-item label=\"字段路径\">\n <form-field\n v-model:value=\"rule.batch_form_key_path\"\n :options=\"batchFieldList\"\n />\n </a-form-item>\n <a-form-item label=\"条件\">\n <condition-config\n v-model:value=\"rule.conditions\"\n :formData=\"formData\"\n :batch_form_key_path=\"rule.batch_form_key_path\"\n />\n </a-form-item>\n </a-form>\n </div>\n <div class=\"rule-content\">\n <s-table\n :columns=\"columns\"\n :data-source=\"rule.fields\"\n row-key=\"column_index\"\n :pagination=\"false\"\n :range-selection=\"false\"\n size=\"small\"\n >\n <template #bodyCell=\"{ column, record, recordIndexs }\">\n <template v-if=\"column.key === 'column_index'\">\n <span>{{ record.data_column?.column_index }}</span>\n <a-tooltip\n v-if=\"getRawRecord(rule.fields, recordIndexs).config_hint\"\n placement=\"top\"\n >\n <template #title>\n <div style=\"white-space: pre-line\">\n {{ getConfigHintTitle(recordIndexs) }}\n </div>\n </template>\n <a-tag\n :color=\"getRawRecord(rule.fields, recordIndexs).config_hint_cleared\n ? 'orange'\n : undefined\"\n style=\"font-size: 10px; margin-left: 4px; cursor: help\"\n >\n {{ getRawRecord(rule.fields, recordIndexs).config_hint === 'added' ? '新增' : '变更' }}\n </a-tag>\n </a-tooltip>\n </template>\n <template v-else-if=\"column.key === 'source_type'\">\n <a-select\n v-model:value=\"getRawRecord(rule.fields, recordIndexs).source_type\"\n placeholder=\"请选择\"\n style=\"width: 100px\"\n size=\"small\"\n allowClear\n @change=\"clearConfigHint(recordIndexs)\"\n >\n <a-select-option value=\"global\">全局字段</a-select-option>\n <a-select-option value=\"form\">表单字段</a-select-option>\n <a-select-option value=\"fixed\">固定值</a-select-option>\n <a-select-option\n v-if=\"record.data_column && record.data_column.is_method_column\"\n value=\"operation\"\n >操作类型</a-select-option>\n </a-select>\n </template>\n <template v-else-if=\"column.key === 'source_value'\">\n <form-field-mul-type\n v-model:value=\"getRawRecord(rule.fields, recordIndexs).source_value\"\n :batch_form_key_path=\"rule.batch_form_key_path\"\n :source_type=\"getRawRecord(rule.fields, recordIndexs).source_type\"\n :form-data=\"formData\"\n style=\"width: 480px\"\n @update:value=\"clearConfigHint(recordIndexs)\"\n />\n </template>\n <template v-else-if=\"column.key === 'detial'\">\n <data-source-detial :value=\"record.data_column\" />\n </template>\n <span v-else>{{ record.data_column[column.key] }}</span>\n </template>\n </s-table>\n </div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport { DataStoreConfigItem } from '../../typing';\n\nimport formField from './formField.vue';\nimport selectExcelColumn from './selectExcelColumn.vue';\nimport selectExcelType from './selectExcelType.vue';\nimport formFieldMulType from './formFieldMulType.vue';\nimport ConditionConfig from './ConditionConfig.vue';\nimport dataSourceDetial from './dataSourceDetial.vue';\n\nexport default defineComponent({\n name: 'DataStoreConfig',\n components: {\n selectExcelType,\n formField,\n selectExcelColumn,\n formFieldMulType,\n ConditionConfig,\n dataSourceDetial,\n },\n props: {\n rule: {\n type: Object as PropType<DataStoreConfigItem>,\n default: () => {},\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['removeRule', 'copyRule'],\n\n setup(props, { emit }) {\n const collapsedState = ref(true);\n const columns = [\n {\n title: '#',\n key: 'column_index',\n width: 80,\n },\n {\n title: '列名',\n key: 'column_name',\n width: 140,\n },\n {\n title: '数据源类型',\n key: 'source_type',\n width: 140,\n },\n {\n title: '数据源',\n key: 'source_value',\n width: 500,\n },\n {\n title: '数据源详情',\n key: 'detial',\n width: 300,\n autoHeight: true,\n },\n ];\n\n const removeRule = () => {\n emit('removeRule');\n };\n const getRawRecord = (dataSource: any[], recordIndexs: number[]) => {\n let currentSource: any = dataSource;\n recordIndexs.forEach(index => {\n if (!Array.isArray(currentSource) && currentSource.children) {\n currentSource = currentSource.children;\n }\n currentSource = currentSource[index];\n });\n return currentSource;\n };\n\n const toggleCollapse = () => {\n collapsedState.value = !collapsedState.value;\n };\n // 用户编辑该字段的数据源配置(数据源类型或数据源值)后,清除「新增/变更」提示标记\n const clearConfigHint = (recordIndexs: number[]) => {\n const raw = getRawRecord(props.rule.fields, recordIndexs);\n if (!raw) {\n return;\n }\n if (raw.config_hint) {\n raw.config_hint = null;\n }\n if (raw.config_hint_cleared) {\n raw.config_hint_cleared = false;\n }\n if (raw.config_hint_detail) {\n raw.config_hint_detail = null;\n }\n };\n // ===== 「新增/变更」标签的悬浮提示与颜色 =====\n // 颜色:数据源配置被清空的列(新增列、列名变更列)用橘红;仅属性变更、配置保留的用默认灰\n const getConfigHintTitle = (recordIndexs: number[]) => {\n const raw = getRawRecord(props.rule.fields, recordIndexs) || {};\n const dc = raw.data_column || {};\n const index = dc.column_index ?? raw.column_index;\n const name = dc.column_name ? ` ${dc.column_name}` : '';\n const lines = [`#${index}${name}`];\n if (Array.isArray(raw.config_hint_detail) && raw.config_hint_detail.length) {\n lines.push(...raw.config_hint_detail);\n } else if (raw.config_hint !== 'added') {\n lines.push('列属性已变更');\n }\n lines.push(\n raw.config_hint_cleared\n ? '数据源配置已清空,需要重新配置'\n : '原数据源配置已保留,无需重新配置',\n );\n return lines.join('\\n');\n };\n const handleChangeExcelColumnList = (value: any) => {\n if (!value) {\n props.rule.fields = [];\n return;\n }\n const new_fields = [];\n for (const field of value) {\n new_fields.push({\n column_index: field.column_index,\n source_type: null,\n source_value: [],\n data_column: field,\n });\n }\n props.rule.fields = new_fields;\n };\n const getBatchLevel = (groups: any[]) => {\n if (!groups) {\n return [];\n }\n let groupIndex = 0;\n const res = [];\n for (const group of groups) {\n groupIndex += 1;\n let findBatchItem = false;\n const newGroup = {\n key: group.key,\n label: group.group_name || '分组' + groupIndex,\n children: [],\n };\n\n for (const field of group.children) {\n const newField: any = {\n key: field.key,\n label: field.label,\n };\n if (field.type === 'remotetablepro') {\n findBatchItem = true;\n newGroup.children.push(newField);\n const children = getBatchLevel(field.children);\n if (children.length > 0) {\n newField.children = children;\n }\n } else if (field.type === 'formtemplate') {\n findBatchItem = true;\n newGroup.children.push(newField);\n const children = getBatchLevel(field.form?.dynamicFieldList);\n if (children.length > 0) {\n newField.children = children;\n }\n }\n }\n if (findBatchItem) {\n res.push(newGroup);\n }\n }\n return res;\n };\n const batchFieldList = computed(() => {\n const dynamicFieldList = props.formData?.dynamicFieldList || [];\n return getBatchLevel(dynamicFieldList);\n });\n const handleCopyRule = () => {\n emit('copyRule', props.rule);\n };\n return {\n removeRule,\n toggleCollapse,\n collapsedState,\n columns,\n handleChangeExcelColumnList,\n getRawRecord,\n batchFieldList,\n handleCopyRule,\n clearConfigHint,\n getConfigHintTitle,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.data-store-config {\n padding: 2px; /* Keep outer padding as is unless specified */\n\n .rule-collapse-content {\n width: 100%;\n overflow: hidden;\n }\n\n // 折叠展开动画\n .collapse-enter-active,\n .collapse-leave-active {\n transition: all 0.3s ease;\n transform-origin: top;\n }\n\n .collapse-enter-from,\n .collapse-leave-to {\n opacity: 0;\n max-height: 0;\n }\n\n .collapse-enter-to,\n .collapse-leave-from {\n opacity: 1;\n max-height: 2000px;\n }\n\n .rule-block {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 8px;\n gap: 8px;\n border: 1px solid #000000;\n border-radius: 8px;\n margin-top: 8px;\n }\n\n .rule-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 0px;\n gap: 10px;\n width: 100%;\n\n border-bottom: 1px solid #f0f0f0;\n\n .rule-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .collapse-btn {\n padding: 0;\n }\n\n h3 {\n margin: 0;\n font-weight: 700;\n font-size: 14px;\n line-height: 22px;\n color: #000000;\n }\n }\n .rule-content {\n width: 100%;\n }\n .rule-middle {\n width: 100%;\n }\n}\n</style>\n","<template>\n <div class=\"rule-header\">\n <div class=\"rule-header-left\">\n <a-button\n type=\"text\"\n @click=\"toggleCollapse\"\n class=\"collapse-btn\"\n >\n <template #icon>\n <down-outlined v-if=\"collapsedState\" />\n <up-outlined v-else />\n </template>\n </a-button>\n <a-form\n layout=\"inline\"\n size=\"small\"\n >\n <a-form-item label=\"规则名称\">\n <a-input v-model:value=\"rule.name\"></a-input>\n </a-form-item>\n <a-form-item label=\"导入方式\">\n <a-select\n style=\"width: 150px\"\n v-model:value=\"rule.import_type\"\n default-value=\"pass_import\"\n >\n <a-select-option value=\"pass_import\">审批通过后导入</a-select-option>\n <a-select-option value=\"immediately_import\">提交立即导入</a-select-option>\n </a-select>\n </a-form-item>\n <a-form-item label=\"处理顺序\">\n <a-input-number v-model:value=\"rule.order\"></a-input-number>\n </a-form-item>\n </a-form>\n </div>\n <div class=\"rule-header-right\">\n <a-button\n type=\"text\"\n @click=\"handleCopyRule\"\n >\n <template #icon>\n <CopyOutlined />\n </template>\n </a-button>\n <a-button\n type=\"text\"\n danger\n @click=\"removeRule\"\n >\n <template #icon>\n <delete-outlined />\n </template>\n </a-button>\n </div>\n </div>\n <transition name=\"collapse\">\n <div\n v-if=\"collapsedState\"\n class=\"rule-collapse-content\"\n >\n <div class=\"rule-middle\">\n <a-form>\n <a-form-item label=\"数据类型\">\n <select-excel-type\n v-model:value=\"rule.excel_type\"\n @update:excel-column-list=\"handleChangeExcelColumnList\"\n />\n </a-form-item>\n <a-form-item label=\"字段路径\">\n <form-field\n v-model:value=\"rule.batch_form_key_path\"\n :options=\"batchFieldList\"\n />\n </a-form-item>\n <a-form-item label=\"条件\">\n <condition-config\n v-model:value=\"rule.conditions\"\n :formData=\"formData\"\n :batch_form_key_path=\"rule.batch_form_key_path\"\n />\n </a-form-item>\n </a-form>\n </div>\n <div class=\"rule-content\">\n <s-table\n :columns=\"columns\"\n :data-source=\"rule.fields\"\n row-key=\"column_index\"\n :pagination=\"false\"\n :range-selection=\"false\"\n size=\"small\"\n >\n <template #bodyCell=\"{ column, record, recordIndexs }\">\n <template v-if=\"column.key === 'column_index'\">\n <span>{{ record.data_column?.column_index }}</span>\n <a-tooltip\n v-if=\"getRawRecord(rule.fields, recordIndexs).config_hint\"\n placement=\"top\"\n >\n <template #title>\n <div style=\"white-space: pre-line\">\n {{ getConfigHintTitle(recordIndexs) }}\n </div>\n </template>\n <a-tag\n :color=\"getRawRecord(rule.fields, recordIndexs).config_hint_cleared\n ? 'orange'\n : undefined\"\n style=\"font-size: 10px; margin-left: 4px; cursor: help\"\n >\n {{ getRawRecord(rule.fields, recordIndexs).config_hint === 'added' ? '新增' : '变更' }}\n </a-tag>\n </a-tooltip>\n </template>\n <template v-else-if=\"column.key === 'source_type'\">\n <a-select\n v-model:value=\"getRawRecord(rule.fields, recordIndexs).source_type\"\n placeholder=\"请选择\"\n style=\"width: 100px\"\n size=\"small\"\n allowClear\n @change=\"clearConfigHint(recordIndexs)\"\n >\n <a-select-option value=\"global\">全局字段</a-select-option>\n <a-select-option value=\"form\">表单字段</a-select-option>\n <a-select-option value=\"fixed\">固定值</a-select-option>\n <a-select-option\n v-if=\"record.data_column && record.data_column.is_method_column\"\n value=\"operation\"\n >操作类型</a-select-option>\n </a-select>\n </template>\n <template v-else-if=\"column.key === 'source_value'\">\n <form-field-mul-type\n v-model:value=\"getRawRecord(rule.fields, recordIndexs).source_value\"\n :batch_form_key_path=\"rule.batch_form_key_path\"\n :source_type=\"getRawRecord(rule.fields, recordIndexs).source_type\"\n :form-data=\"formData\"\n style=\"width: 480px\"\n @update:value=\"clearConfigHint(recordIndexs)\"\n />\n </template>\n <template v-else-if=\"column.key === 'detial'\">\n <data-source-detial :value=\"record.data_column\" />\n </template>\n <span v-else>{{ record.data_column[column.key] }}</span>\n </template>\n </s-table>\n </div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType, ref } from 'vue';\nimport { DataStoreConfigItem } from '../../typing';\n\nimport formField from './formField.vue';\nimport selectExcelColumn from './selectExcelColumn.vue';\nimport selectExcelType from './selectExcelType.vue';\nimport formFieldMulType from './formFieldMulType.vue';\nimport ConditionConfig from './ConditionConfig.vue';\nimport dataSourceDetial from './dataSourceDetial.vue';\n\nexport default defineComponent({\n name: 'DataStoreConfig',\n components: {\n selectExcelType,\n formField,\n selectExcelColumn,\n formFieldMulType,\n ConditionConfig,\n dataSourceDetial,\n },\n props: {\n rule: {\n type: Object as PropType<DataStoreConfigItem>,\n default: () => {},\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['removeRule', 'copyRule'],\n\n setup(props, { emit }) {\n const collapsedState = ref(true);\n const columns = [\n {\n title: '#',\n key: 'column_index',\n width: 80,\n },\n {\n title: '列名',\n key: 'column_name',\n width: 140,\n },\n {\n title: '数据源类型',\n key: 'source_type',\n width: 140,\n },\n {\n title: '数据源',\n key: 'source_value',\n width: 500,\n },\n {\n title: '数据源详情',\n key: 'detial',\n width: 300,\n autoHeight: true,\n },\n ];\n\n const removeRule = () => {\n emit('removeRule');\n };\n const getRawRecord = (dataSource: any[], recordIndexs: number[]) => {\n let currentSource: any = dataSource;\n recordIndexs.forEach(index => {\n if (!Array.isArray(currentSource) && currentSource.children) {\n currentSource = currentSource.children;\n }\n currentSource = currentSource[index];\n });\n return currentSource;\n };\n\n const toggleCollapse = () => {\n collapsedState.value = !collapsedState.value;\n };\n // 用户编辑该字段的数据源配置(数据源类型或数据源值)后,清除「新增/变更」提示标记\n const clearConfigHint = (recordIndexs: number[]) => {\n const raw = getRawRecord(props.rule.fields, recordIndexs);\n if (!raw) {\n return;\n }\n if (raw.config_hint) {\n raw.config_hint = null;\n }\n if (raw.config_hint_cleared) {\n raw.config_hint_cleared = false;\n }\n if (raw.config_hint_detail) {\n raw.config_hint_detail = null;\n }\n };\n // ===== 「新增/变更」标签的悬浮提示与颜色 =====\n // 颜色:数据源配置被清空的列(新增列、列名变更列)用橘红;仅属性变更、配置保留的用默认灰\n const getConfigHintTitle = (recordIndexs: number[]) => {\n const raw = getRawRecord(props.rule.fields, recordIndexs) || {};\n const dc = raw.data_column || {};\n const index = dc.column_index ?? raw.column_index;\n const name = dc.column_name ? ` ${dc.column_name}` : '';\n const lines = [`#${index}${name}`];\n if (Array.isArray(raw.config_hint_detail) && raw.config_hint_detail.length) {\n lines.push(...raw.config_hint_detail);\n } else if (raw.config_hint !== 'added') {\n lines.push('列属性已变更');\n }\n lines.push(\n raw.config_hint_cleared\n ? '数据源配置已清空,需要重新配置'\n : '原数据源配置已保留,无需重新配置',\n );\n return lines.join('\\n');\n };\n const handleChangeExcelColumnList = (value: any) => {\n if (!value) {\n props.rule.fields = [];\n return;\n }\n const new_fields = [];\n for (const field of value) {\n new_fields.push({\n column_index: field.column_index,\n source_type: null,\n source_value: [],\n data_column: field,\n });\n }\n props.rule.fields = new_fields;\n };\n const getBatchLevel = (groups: any[]) => {\n if (!groups) {\n return [];\n }\n let groupIndex = 0;\n const res = [];\n for (const group of groups) {\n groupIndex += 1;\n let findBatchItem = false;\n const newGroup = {\n key: group.key,\n label: group.group_name || '分组' + groupIndex,\n children: [],\n };\n\n for (const field of group.children) {\n const newField: any = {\n key: field.key,\n label: field.label,\n };\n if (field.type === 'remotetablepro') {\n findBatchItem = true;\n newGroup.children.push(newField);\n const children = getBatchLevel(field.children);\n if (children.length > 0) {\n newField.children = children;\n }\n } else if (field.type === 'formtemplate') {\n findBatchItem = true;\n newGroup.children.push(newField);\n const children = getBatchLevel(field.form?.dynamicFieldList);\n if (children.length > 0) {\n newField.children = children;\n }\n }\n }\n if (findBatchItem) {\n res.push(newGroup);\n }\n }\n return res;\n };\n const batchFieldList = computed(() => {\n const dynamicFieldList = props.formData?.dynamicFieldList || [];\n return getBatchLevel(dynamicFieldList);\n });\n const handleCopyRule = () => {\n emit('copyRule', props.rule);\n };\n return {\n removeRule,\n toggleCollapse,\n collapsedState,\n columns,\n handleChangeExcelColumnList,\n getRawRecord,\n batchFieldList,\n handleCopyRule,\n clearConfigHint,\n getConfigHintTitle,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.data-store-config {\n padding: 2px; /* Keep outer padding as is unless specified */\n\n .rule-collapse-content {\n width: 100%;\n overflow: hidden;\n }\n\n // 折叠展开动画\n .collapse-enter-active,\n .collapse-leave-active {\n transition: all 0.3s ease;\n transform-origin: top;\n }\n\n .collapse-enter-from,\n .collapse-leave-to {\n opacity: 0;\n max-height: 0;\n }\n\n .collapse-enter-to,\n .collapse-leave-from {\n opacity: 1;\n max-height: 2000px;\n }\n\n .rule-block {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 8px;\n gap: 8px;\n border: 1px solid #000000;\n border-radius: 8px;\n margin-top: 8px;\n }\n\n .rule-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 0px;\n gap: 10px;\n width: 100%;\n\n border-bottom: 1px solid #f0f0f0;\n\n .rule-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .collapse-btn {\n padding: 0;\n }\n\n h3 {\n margin: 0;\n font-weight: 700;\n font-size: 14px;\n line-height: 22px;\n color: #000000;\n }\n }\n .rule-content {\n width: 100%;\n }\n .rule-middle {\n width: 100%;\n }\n}\n</style>\n","<template>\n <div class=\"data-store-config\">\n <a-alert\n v-if=\"unmodifiableRuleNames.length\"\n type=\"warning\"\n show-icon\n class=\"modify-warning\"\n >\n <template #message>\n 以下规则未同时配置覆盖ID列与操作类型列,此审批将不支持修改:{{ unmodifiableRuleNames.join('、') }}\n </template>\n </a-alert>\n <a-alert\n v-if=\"hasFieldChange\"\n type=\"warning\"\n show-icon\n class=\"modify-warning\"\n >\n <template #message>\n 检测到规则字段已变更,请\n <a\n class=\"update-rules-link\"\n @click=\"updateRules\"\n >执行规则更新</a>\n </template>\n </a-alert>\n <div style=\"text-align: right\">\n <a-button\n style=\"margin-right: 8px\"\n :loading=\"updating\"\n @click=\"updateRules\"\n >\n 规则更新\n </a-button>\n <a-button\n type=\"primary\"\n @click=\"addRule\"\n >\n 添加规则\n </a-button>\n </div>\n <a-empty v-if=\"!value?.length\">\n <template #description>\n <span>未配置任何规则</span>\n </template>\n <a-button\n type=\"primary\"\n @click=\"addRule\"\n >\n 点击创建\n </a-button>\n </a-empty>\n <transition-group\n name=\"rule-list\"\n tag=\"div\"\n class=\"rule-list-container\"\n >\n <div\n v-for=\"rule in value\"\n :key=\"rule.key\"\n class=\"rule-block\"\n >\n <data-store-config-item\n :rule=\"rule\"\n :form-data=\"formData\"\n @removeRule=\"removeRule(rule.key)\"\n @copy-rule=\"copyRule\"\n />\n </div>\n </transition-group>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, h, onMounted, PropType, ref, watch } from 'vue';\nimport { DataStoreConfigItem, DataStoreConfigType } from '../../typing';\nimport { message, Modal, Tooltip } from 'ant-design-vue';\nimport { getApiData } from '@/init-plugin';\n\nimport dataStoreConfigItem from './dataStoreConfigItem.vue';\nimport formField from './formField.vue';\nimport selectExcelColumn from './selectExcelColumn.vue';\nimport selectExcelType from './selectExcelType.vue';\nimport { cloneDeep } from 'lodash';\nimport { genID } from '../../utils';\n\nexport default defineComponent({\n name: 'DataStoreConfig',\n components: {\n selectExcelType,\n formField,\n selectExcelColumn,\n dataStoreConfigItem,\n },\n props: {\n value: {\n type: Array as PropType<DataStoreConfigType>,\n default: () => [],\n },\n menuFlag: {\n type: String,\n default: '',\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const showModal = ref(false);\n // 与后端 _calc_is_modifiable 对齐:每条规则的 fields 中必须同时存在\n // 覆盖ID列(is_sid_column)与操作类型列(is_method_column),否则该审批不支持修改\n const unmodifiableRuleNames = computed(() => {\n return (props.value || [])\n .filter(rule => {\n // 数据类型未选择、或列信息尚未加载完成(fields 为空)时不参与校验,\n // 避免选择数据类型后接口返回前列信息为空导致警告闪烁\n if (!rule.excel_type?.flag || !(rule.fields || []).length) {\n return false;\n }\n const fields = rule.fields || [];\n const sidOk = fields.some(f => f.data_column?.is_sid_column);\n const methodOk = fields.some(f => f.data_column?.is_method_column);\n return !(sidOk && methodOk);\n })\n .map(rule => rule.name);\n });\n const handleOk = () => {\n showModal.value = false;\n };\n\n // ===== 规则更新:重新拉取各规则数据类型的列信息,同步字段配置 =====\n // 下面落的 config_hint / config_hint_cleared / config_hint_detail 是**会话内临时标记**\n // (只用于提示「刚更新过哪些列、哪些列需要重新配置」),不参与持久化:\n // 读取侧过滤 + 保存侧剥离见 ../../utils.ts 的 stripDataStoreConfigHints(含原因说明)。\n const updating = ref(false);\n // data_column 各属性中文名(与后端 ExcelColumnConfig.verbose_name 对齐),用于变更明细 hover 提示\n const DC_FIELD_LABELS: { key: string; label: string; on?: string; off?: string }[] = [\n { key: 'column_name', label: '列名' },\n { key: 'data_type', label: '列类型' },\n { key: 'data_length', label: '数据长度' },\n { key: 'column_is_null', label: '是否可为空', on: '可为空', off: '不可为空' },\n { key: 'is_children_column', label: '是否为子表列', on: '是', off: '否' },\n { key: 'char_column', label: '字符规则' },\n { key: 'zero_column', label: '数字规则' },\n { key: 'number_column', label: '整数与实数' },\n { key: 'is_import_column', label: '是否为导入列', on: '是', off: '否' },\n { key: 'is_method_column', label: '是否为操作列', on: '是', off: '否' },\n { key: 'is_sid_column', label: '是否为覆盖ID', on: '是', off: '否' },\n { key: 'is_modifiable', label: '是否可修改', on: '可修改', off: '不可修改' },\n ];\n // 参与「变更」判定的只有上面这些「列属性」(外加列号本身),由此保证不变量:\n // 凡是判成「变更」的列,悬浮提示必定能说明变了什么。\n // 列表接口每行还会返回一些不属于列属性的 key,不能参与判定,否则会整批误报:\n // id / is_active / excel_type_id / excel_type__name / create_time / update_time\n // 改「数据类型」的名称、列被删后同名重建、重置列配置,都会让它们成批变化,\n // 曾表现为一条规则下每一列都飘「变更」而悬浮提示为空(用户误以为要重配数据源)。\n // ⚠️ 后端 approve/utils.py::check_data_store 的 check_kyes 若新增字段,需同步加进 DC_FIELD_LABELS,\n // 否则该字段变化不会提示「执行规则更新」,用户会在提交时被后端拦下。\n const DC_COMPARE_KEYS = ['column_index', ...DC_FIELD_LABELS.map(i => i.key)];\n // 布尔字段统一归一化:is_modifiable 是后加的字段,历史 data_column 快照里没有这个 key,\n // 缺失一律按 false(不可修改)处理,否则「字段新增」本身会把每条规则的每一列都判成变更\n const BOOL_DC_KEYS = ['is_modifiable'];\n const normalizeDataColumn = (dc: any) => {\n const copy: any = {};\n for (const k of DC_COMPARE_KEYS) {\n const value = dc ? dc[k] : undefined;\n copy[k] = BOOL_DC_KEYS.includes(k) ? !!value : value;\n }\n return copy;\n };\n // 按 DC_COMPARE_KEYS 的固定顺序序列化,避免两侧 key 顺序不一致造成误判\n const stableDcString = (dc: any) => {\n const normalized = normalizeDataColumn(dc);\n return JSON.stringify(DC_COMPARE_KEYS.map(k => normalized[k]));\n };\n const isDataColumnChanged = (oldDc: any, newDc: any) =>\n stableDcString(oldDc) !== stableDcString(newDc);\n const formatDcValue = (item: { on?: string; off?: string }, value: any) => {\n if (value === null || value === undefined || value === '') {\n return '空';\n }\n if (typeof value === 'boolean') {\n return value ? item.on || '是' : item.off || '否';\n }\n return String(value);\n };\n // 描述单列 data_column 的属性变更明细,如「是否可修改:不可修改 → 可修改」\n const describeColumnChange = (oldDc: any, newDc: any) => {\n const oldNorm = normalizeDataColumn(oldDc);\n const newNorm = normalizeDataColumn(newDc);\n const lines: string[] = [];\n for (const item of DC_FIELD_LABELS) {\n if (oldNorm?.[item.key] === newNorm?.[item.key]) {\n continue;\n }\n lines.push(\n `${item.label}:${formatDcValue(item, oldNorm?.[item.key])} → ${formatDcValue(\n item,\n newNorm?.[item.key],\n )}`,\n );\n }\n return lines;\n };\n // 变更明细中的列标签(index 为列号,title 为鼠标悬浮提示内容)\n const buildColItem = (k: number, dc: any, extra: string[] = []) => ({\n index: k,\n title: [`#${k}${dc?.column_name ? ` ${dc.column_name}` : ''}`, ...extra].join('\\n'),\n });\n const fetchExcelColumns = async (excelTypeId: number) => {\n const conditions = [\n {\n field_name: 'excel_type_id',\n operator: 'eq',\n value: [excelTypeId],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_import_column',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n ];\n const res = await getApiData(\n {\n is_pagination: false,\n sort_fields: ['column_index'],\n conditions: [conditions],\n },\n '/costexcel/query_excel_column_config_list',\n );\n return res.data || [];\n };\n // 按 excel_type.id 去重查询各规则的列信息\n const fetchRuleColumnMap = async (rules: DataStoreConfigItem[]) => {\n const columnMap = new Map<number, any[]>();\n for (const rule of rules) {\n const excelTypeId = rule.excel_type.id;\n if (!columnMap.has(excelTypeId)) {\n columnMap.set(excelTypeId, await fetchExcelColumns(excelTypeId));\n }\n }\n return columnMap;\n };\n // 对比单条规则与最新列信息:新增列 / 删除列 / 变更列\n const diffRuleColumns = (rule: DataStoreConfigItem, columnMap: Map<number, any[]>) => {\n const newColumns = columnMap.get(rule.excel_type.id) || [];\n const newMap = new Map(newColumns.map((c: any) => [c.column_index, c]));\n const oldMap = new Map((rule.fields || []).map((f: any) => [f.column_index, f]));\n return {\n newMap,\n oldMap,\n added: [...newMap.keys()].filter(k => !oldMap.has(k)),\n removed: [...oldMap.keys()].filter(k => !newMap.has(k)),\n changed: [...oldMap.keys()].filter(\n k => newMap.has(k) && isDataColumnChanged(oldMap.get(k)?.data_column, newMap.get(k)),\n ),\n };\n };\n // ===== 进入页面自动校验字段变更,存在变更时顶部警告提示 =====\n const hasFieldChange = ref(false);\n const autoCheckFieldsChange = async () => {\n const targetRules = (props.value || []).filter(rule => rule.excel_type?.id);\n if (!targetRules.length) {\n return;\n }\n try {\n const columnMap = await fetchRuleColumnMap(targetRules);\n hasFieldChange.value = targetRules.some(rule => {\n const { added, removed, changed } = diffRuleColumns(rule, columnMap);\n return added.length || removed.length || changed.length;\n });\n } catch (e) {\n // 自动校验失败不打断页面,用户可手动点击「规则更新」\n console.error('自动校验规则字段变更失败:', e);\n }\n };\n // 规则数据就绪后自动校验一次(props.value 可能异步加载)\n let autoChecked = false;\n const tryAutoCheck = () => {\n if (autoChecked) {\n return;\n }\n if ((props.value || []).some(rule => rule.excel_type?.id)) {\n autoChecked = true;\n autoCheckFieldsChange();\n }\n };\n onMounted(tryAutoCheck);\n watch(() => props.value, tryAutoCheck);\n const updateRules = async () => {\n const targetRules = (props.value || []).filter(rule => rule.excel_type?.id);\n if (!targetRules.length) {\n message.warning('暂无已选择数据类型的规则');\n return;\n }\n updating.value = true;\n try {\n const columnMap = await fetchRuleColumnMap(targetRules);\n // 逐规则对比:新增列 / 删除列 / 列名变更 / 其他变更\n const plans: { rule: DataStoreConfigItem; nextFields: any[] }[] = [];\n type ColChangeItem = { index: number; title: string };\n const changeItems: {\n name: string;\n added: ColChangeItem[];\n removed: ColChangeItem[];\n renamed: ColChangeItem[];\n changed: ColChangeItem[];\n }[] = [];\n // 是否存在需要重新配置的列(新增列 / 列名变更列,其数据源配置会被清空)\n let hasNeedConfigColumns = false;\n for (const rule of targetRules) {\n const { newMap, oldMap, added, removed, changed } = diffRuleColumns(rule, columnMap);\n if (!added.length && !removed.length && !changed.length) {\n continue;\n }\n // 列名(column_name)变更 → 清空配置;其余属性变更 → 仅标记,保留原配置\n const renamed = changed.filter(\n k => oldMap.get(k)?.data_column?.column_name !== newMap.get(k)?.column_name,\n );\n const attrChanged = changed.filter(k => !renamed.includes(k));\n if (added.length || renamed.length) {\n hasNeedConfigColumns = true;\n }\n changeItems.push({\n name: rule.name,\n added: added.map(k => buildColItem(k, newMap.get(k), ['新增列'])),\n removed: removed.map(k =>\n buildColItem(k, oldMap.get(k)?.data_column, ['该列已从数据类型中删除']),\n ),\n renamed: renamed.map(k =>\n buildColItem(k, undefined, [\n `列名变更:${oldMap.get(k)?.data_column?.column_name || '—'} → ${\n newMap.get(k)?.column_name || '—'\n }`,\n '数据源配置会被清空,需重新配置',\n ]),\n ),\n changed: attrChanged.map(k => {\n const lines = describeColumnChange(oldMap.get(k)?.data_column, newMap.get(k));\n return buildColItem(k, newMap.get(k), lines.length ? lines : ['列属性已变更']);\n }),\n });\n const nextFields = [\n // 未变更字段(不含 renamed / attrChanged,二者由下面两个分支处理):\n // 保留原数据源配置,但 data_column 一律刷新为最新列信息,\n // 这样「规则更新」一次点击就能把整份快照同步干净(不依赖某个 key 是否参与变更判定)\n ...(rule.fields || [])\n .filter((f: any) => newMap.has(f.column_index) && !changed.includes(f.column_index))\n .map((f: any) => ({\n ...cloneDeep(f),\n data_column: cloneDeep(newMap.get(f.column_index)),\n })),\n ...attrChanged.map(k => ({\n ...cloneDeep(oldMap.get(k)),\n data_column: cloneDeep(newMap.get(k)),\n config_hint: 'changed',\n // 仅属性变更:原数据源配置保留,未清空\n config_hint_cleared: false,\n // 悬浮提示:具体变更了哪些属性\n config_hint_detail: describeColumnChange(\n oldMap.get(k)?.data_column,\n newMap.get(k),\n ),\n })),\n // 列名变更字段:更新列信息并清空配置,标记「变更」待编辑后清除\n ...renamed.map(k => ({\n column_index: k,\n source_type: null,\n source_value: [],\n data_column: cloneDeep(newMap.get(k)),\n config_hint: 'changed',\n // 数据源配置已清空\n config_hint_cleared: true,\n config_hint_detail: [\n `列名变更:${oldMap.get(k)?.data_column?.column_name || '—'} → ${\n newMap.get(k)?.column_name || '—'\n }`,\n ],\n })),\n // 新增字段:标记「新增」待编辑后清除\n ...added.map(k => ({\n column_index: k,\n source_type: null,\n source_value: [],\n data_column: cloneDeep(newMap.get(k)),\n config_hint: 'added',\n // 新增列本就没有配置,视为已清空\n config_hint_cleared: true,\n config_hint_detail: [],\n })),\n ].sort((a, b) => a.column_index - b.column_index);\n plans.push({ rule, nextFields });\n }\n if (!plans.length) {\n message.success('所有规则字段均无变更');\n return;\n }\n Modal.confirm({\n title: '检测到规则字段变更',\n width: 560,\n content: () => {\n // 列号标签样式(新增=绿色 / 删除=红色 / 列名变更=橙色 / 其他变更=蓝色),title 为悬浮提示\n const renderColTags = (\n items: { index: number; title: string }[],\n color: string,\n bg: string,\n border: string,\n ) =>\n items.map(item =>\n h(\n Tooltip,\n {\n placement: 'top',\n title: h('div', { style: 'white-space: pre-line' }, item.title),\n },\n {\n default: () =>\n h(\n 'span',\n {\n style: `display:inline-block;margin:0 4px 2px 0;padding:0 6px;font-size:12px;line-height:20px;border-radius:4px;cursor:help;color:${color};background:${bg};border:1px solid ${border}`,\n },\n `#${item.index}`,\n ),\n },\n ),\n );\n const children: any[] = [];\n if (hasNeedConfigColumns) {\n children.push(\n h(\n 'div',\n {\n style:\n 'background:#fffbe6;border:1px solid #ffe58f;border-radius:4px;padding:6px 10px;margin-bottom:8px;color:#d48806;font-size:12px',\n },\n '注意:新增列与列名发生变更的列,其数据源配置会被清空,确定后需要重新配置;其余仅属性变更的列保留原配置。',\n ),\n );\n }\n for (const item of changeItems) {\n const lineChildren: any[] = [`${item.name}:新增列 `];\n if (item.added.length) {\n lineChildren.push(...renderColTags(item.added, '#389e0d', '#f6ffed', '#b7eb8f'));\n } else {\n lineChildren.push('无');\n }\n lineChildren.push(',删除列 ');\n if (item.removed.length) {\n lineChildren.push(...renderColTags(item.removed, '#cf1322', '#fff1f0', '#ffa39e'));\n } else {\n lineChildren.push('无');\n }\n lineChildren.push(',列名变更(需重新配置)');\n if (item.renamed.length) {\n lineChildren.push(...renderColTags(item.renamed, '#d46b08', '#fff7e6', '#ffd591'));\n } else {\n lineChildren.push('无');\n }\n lineChildren.push(',其他变更(保留配置)');\n if (item.changed.length) {\n lineChildren.push(...renderColTags(item.changed, '#0958d9', '#f0f5ff', '#adc6ff'));\n } else {\n lineChildren.push('无');\n }\n children.push(h('div', { style: 'margin-bottom: 4px' }, lineChildren));\n }\n return h(\n 'div',\n { style: 'max-height: 300px; overflow: auto;' },\n children,\n );\n },\n okText: '确定更新',\n cancelText: '取消',\n onOk: () => {\n for (const plan of plans) {\n plan.rule.fields = plan.nextFields;\n }\n // 已同步所有变更,清除进入页面时的自动校验警告\n hasFieldChange.value = false;\n message.success('规则字段已更新');\n },\n });\n } finally {\n updating.value = false;\n }\n };\n const handleCancel = () => {\n showModal.value = false;\n };\n\n const createNewRule = (): DataStoreConfigItem => {\n let maxOrder = 0;\n for (const item of props.value) {\n if (item.order > maxOrder) {\n maxOrder = item.order;\n }\n }\n return {\n excel_type: { id: 0, name: '', flag: '' },\n batch_form_key_path: [],\n fields: [],\n conditions: { type: 'and', conditions: [] },\n version: 1,\n name: `规则${props.value?.length + 1}`,\n import_type: 'pass_import',\n order: maxOrder + 1,\n key: genID(),\n };\n };\n const addRule = () => {\n const value = [...props.value];\n value.push(createNewRule());\n emit('update:value', value);\n };\n watch(\n () => props.value,\n value => {\n let index = 0;\n if (value?.length) {\n for (const item of value) {\n index++;\n if (!item.name) {\n item.name = `规则${index}`;\n }\n }\n }\n },\n {\n immediate: true,\n },\n );\n\n const removeRule = (ruleIndex: string) => {\n const value = props.value.filter(item => item.key !== ruleIndex);\n emit('update:value', value);\n };\n const copyRule = value => {\n const newValue = cloneDeep(value);\n newValue.name = `${newValue.name} - 副本`;\n props.value.push(newValue);\n };\n return {\n addRule,\n removeRule,\n showModal,\n handleOk,\n handleCancel,\n copyRule,\n unmodifiableRuleNames,\n hasFieldChange,\n updateRules,\n updating,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.data-store-config {\n padding: 2px; /* Keep outer padding as is unless specified */\n\n .modify-warning {\n margin-bottom: 8px;\n }\n\n // 「执行规则更新」可点击链接样式\n .update-rules-link {\n color: #1677ff;\n cursor: pointer;\n }\n\n .rule-list-container {\n position: relative;\n width: 100%;\n }\n\n .rule-block {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 8px;\n gap: 8px;\n border: 1px solid #000000;\n border-radius: 8px;\n margin-top: 8px;\n width: 100%;\n transition: all 0.3s ease;\n will-change: transform;\n }\n\n // 列表项移动动画\n .rule-list-move {\n transition: transform 0.3s ease;\n }\n\n // 列表项进入动画\n .rule-list-enter-active {\n transition: all 0.3s ease;\n }\n\n // 列表项离开动画\n .rule-list-leave-active {\n transition: all 0.3s ease;\n position: absolute;\n width: calc(100% - 4px);\n }\n\n // 进入的起始状态\n .rule-list-enter-from {\n opacity: 0;\n transform: translateY(-30px);\n }\n\n // 离开的结束状态\n .rule-list-leave-to {\n opacity: 0;\n transform: translateY(30px);\n }\n}\n</style>\n","<template>\n <div class=\"data-store-config\">\n <a-alert\n v-if=\"unmodifiableRuleNames.length\"\n type=\"warning\"\n show-icon\n class=\"modify-warning\"\n >\n <template #message>\n 以下规则未同时配置覆盖ID列与操作类型列,此审批将不支持修改:{{ unmodifiableRuleNames.join('、') }}\n </template>\n </a-alert>\n <a-alert\n v-if=\"hasFieldChange\"\n type=\"warning\"\n show-icon\n class=\"modify-warning\"\n >\n <template #message>\n 检测到规则字段已变更,请\n <a\n class=\"update-rules-link\"\n @click=\"updateRules\"\n >执行规则更新</a>\n </template>\n </a-alert>\n <div style=\"text-align: right\">\n <a-button\n style=\"margin-right: 8px\"\n :loading=\"updating\"\n @click=\"updateRules\"\n >\n 规则更新\n </a-button>\n <a-button\n type=\"primary\"\n @click=\"addRule\"\n >\n 添加规则\n </a-button>\n </div>\n <a-empty v-if=\"!value?.length\">\n <template #description>\n <span>未配置任何规则</span>\n </template>\n <a-button\n type=\"primary\"\n @click=\"addRule\"\n >\n 点击创建\n </a-button>\n </a-empty>\n <transition-group\n name=\"rule-list\"\n tag=\"div\"\n class=\"rule-list-container\"\n >\n <div\n v-for=\"rule in value\"\n :key=\"rule.key\"\n class=\"rule-block\"\n >\n <data-store-config-item\n :rule=\"rule\"\n :form-data=\"formData\"\n @removeRule=\"removeRule(rule.key)\"\n @copy-rule=\"copyRule\"\n />\n </div>\n </transition-group>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, h, onMounted, PropType, ref, watch } from 'vue';\nimport { DataStoreConfigItem, DataStoreConfigType } from '../../typing';\nimport { message, Modal, Tooltip } from 'ant-design-vue';\nimport { getApiData } from '@/init-plugin';\n\nimport dataStoreConfigItem from './dataStoreConfigItem.vue';\nimport formField from './formField.vue';\nimport selectExcelColumn from './selectExcelColumn.vue';\nimport selectExcelType from './selectExcelType.vue';\nimport { cloneDeep } from 'lodash';\nimport { genID } from '../../utils';\n\nexport default defineComponent({\n name: 'DataStoreConfig',\n components: {\n selectExcelType,\n formField,\n selectExcelColumn,\n dataStoreConfigItem,\n },\n props: {\n value: {\n type: Array as PropType<DataStoreConfigType>,\n default: () => [],\n },\n menuFlag: {\n type: String,\n default: '',\n },\n formData: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const showModal = ref(false);\n // 与后端 _calc_is_modifiable 对齐:每条规则的 fields 中必须同时存在\n // 覆盖ID列(is_sid_column)与操作类型列(is_method_column),否则该审批不支持修改\n const unmodifiableRuleNames = computed(() => {\n return (props.value || [])\n .filter(rule => {\n // 数据类型未选择、或列信息尚未加载完成(fields 为空)时不参与校验,\n // 避免选择数据类型后接口返回前列信息为空导致警告闪烁\n if (!rule.excel_type?.flag || !(rule.fields || []).length) {\n return false;\n }\n const fields = rule.fields || [];\n const sidOk = fields.some(f => f.data_column?.is_sid_column);\n const methodOk = fields.some(f => f.data_column?.is_method_column);\n return !(sidOk && methodOk);\n })\n .map(rule => rule.name);\n });\n const handleOk = () => {\n showModal.value = false;\n };\n\n // ===== 规则更新:重新拉取各规则数据类型的列信息,同步字段配置 =====\n // 下面落的 config_hint / config_hint_cleared / config_hint_detail 是**会话内临时标记**\n // (只用于提示「刚更新过哪些列、哪些列需要重新配置」),不参与持久化:\n // 读取侧过滤 + 保存侧剥离见 ../../utils.ts 的 stripDataStoreConfigHints(含原因说明)。\n const updating = ref(false);\n // data_column 各属性中文名(与后端 ExcelColumnConfig.verbose_name 对齐),用于变更明细 hover 提示\n const DC_FIELD_LABELS: { key: string; label: string; on?: string; off?: string }[] = [\n { key: 'column_name', label: '列名' },\n { key: 'data_type', label: '列类型' },\n { key: 'data_length', label: '数据长度' },\n { key: 'column_is_null', label: '是否可为空', on: '可为空', off: '不可为空' },\n { key: 'is_children_column', label: '是否为子表列', on: '是', off: '否' },\n { key: 'char_column', label: '字符规则' },\n { key: 'zero_column', label: '数字规则' },\n { key: 'number_column', label: '整数与实数' },\n { key: 'is_import_column', label: '是否为导入列', on: '是', off: '否' },\n { key: 'is_method_column', label: '是否为操作列', on: '是', off: '否' },\n { key: 'is_sid_column', label: '是否为覆盖ID', on: '是', off: '否' },\n { key: 'is_modifiable', label: '是否可修改', on: '可修改', off: '不可修改' },\n ];\n // 参与「变更」判定的只有上面这些「列属性」(外加列号本身),由此保证不变量:\n // 凡是判成「变更」的列,悬浮提示必定能说明变了什么。\n // 列表接口每行还会返回一些不属于列属性的 key,不能参与判定,否则会整批误报:\n // id / is_active / excel_type_id / excel_type__name / create_time / update_time\n // 改「数据类型」的名称、列被删后同名重建、重置列配置,都会让它们成批变化,\n // 曾表现为一条规则下每一列都飘「变更」而悬浮提示为空(用户误以为要重配数据源)。\n // ⚠️ 后端 approve/utils.py::check_data_store 的 check_kyes 若新增字段,需同步加进 DC_FIELD_LABELS,\n // 否则该字段变化不会提示「执行规则更新」,用户会在提交时被后端拦下。\n const DC_COMPARE_KEYS = ['column_index', ...DC_FIELD_LABELS.map(i => i.key)];\n // 布尔字段统一归一化:is_modifiable 是后加的字段,历史 data_column 快照里没有这个 key,\n // 缺失一律按 false(不可修改)处理,否则「字段新增」本身会把每条规则的每一列都判成变更\n const BOOL_DC_KEYS = ['is_modifiable'];\n const normalizeDataColumn = (dc: any) => {\n const copy: any = {};\n for (const k of DC_COMPARE_KEYS) {\n const value = dc ? dc[k] : undefined;\n copy[k] = BOOL_DC_KEYS.includes(k) ? !!value : value;\n }\n return copy;\n };\n // 按 DC_COMPARE_KEYS 的固定顺序序列化,避免两侧 key 顺序不一致造成误判\n const stableDcString = (dc: any) => {\n const normalized = normalizeDataColumn(dc);\n return JSON.stringify(DC_COMPARE_KEYS.map(k => normalized[k]));\n };\n const isDataColumnChanged = (oldDc: any, newDc: any) =>\n stableDcString(oldDc) !== stableDcString(newDc);\n const formatDcValue = (item: { on?: string; off?: string }, value: any) => {\n if (value === null || value === undefined || value === '') {\n return '空';\n }\n if (typeof value === 'boolean') {\n return value ? item.on || '是' : item.off || '否';\n }\n return String(value);\n };\n // 描述单列 data_column 的属性变更明细,如「是否可修改:不可修改 → 可修改」\n const describeColumnChange = (oldDc: any, newDc: any) => {\n const oldNorm = normalizeDataColumn(oldDc);\n const newNorm = normalizeDataColumn(newDc);\n const lines: string[] = [];\n for (const item of DC_FIELD_LABELS) {\n if (oldNorm?.[item.key] === newNorm?.[item.key]) {\n continue;\n }\n lines.push(\n `${item.label}:${formatDcValue(item, oldNorm?.[item.key])} → ${formatDcValue(\n item,\n newNorm?.[item.key],\n )}`,\n );\n }\n return lines;\n };\n // 变更明细中的列标签(index 为列号,title 为鼠标悬浮提示内容)\n const buildColItem = (k: number, dc: any, extra: string[] = []) => ({\n index: k,\n title: [`#${k}${dc?.column_name ? ` ${dc.column_name}` : ''}`, ...extra].join('\\n'),\n });\n const fetchExcelColumns = async (excelTypeId: number) => {\n const conditions = [\n {\n field_name: 'excel_type_id',\n operator: 'eq',\n value: [excelTypeId],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_active',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n {\n field_name: 'is_import_column',\n operator: 'eq',\n value: [true],\n format: 'input',\n class_name: 'str',\n },\n ];\n const res = await getApiData(\n {\n is_pagination: false,\n sort_fields: ['column_index'],\n conditions: [conditions],\n },\n '/costexcel/query_excel_column_config_list',\n );\n return res.data || [];\n };\n // 按 excel_type.id 去重查询各规则的列信息\n const fetchRuleColumnMap = async (rules: DataStoreConfigItem[]) => {\n const columnMap = new Map<number, any[]>();\n for (const rule of rules) {\n const excelTypeId = rule.excel_type.id;\n if (!columnMap.has(excelTypeId)) {\n columnMap.set(excelTypeId, await fetchExcelColumns(excelTypeId));\n }\n }\n return columnMap;\n };\n // 对比单条规则与最新列信息:新增列 / 删除列 / 变更列\n const diffRuleColumns = (rule: DataStoreConfigItem, columnMap: Map<number, any[]>) => {\n const newColumns = columnMap.get(rule.excel_type.id) || [];\n const newMap = new Map(newColumns.map((c: any) => [c.column_index, c]));\n const oldMap = new Map((rule.fields || []).map((f: any) => [f.column_index, f]));\n return {\n newMap,\n oldMap,\n added: [...newMap.keys()].filter(k => !oldMap.has(k)),\n removed: [...oldMap.keys()].filter(k => !newMap.has(k)),\n changed: [...oldMap.keys()].filter(\n k => newMap.has(k) && isDataColumnChanged(oldMap.get(k)?.data_column, newMap.get(k)),\n ),\n };\n };\n // ===== 进入页面自动校验字段变更,存在变更时顶部警告提示 =====\n const hasFieldChange = ref(false);\n const autoCheckFieldsChange = async () => {\n const targetRules = (props.value || []).filter(rule => rule.excel_type?.id);\n if (!targetRules.length) {\n return;\n }\n try {\n const columnMap = await fetchRuleColumnMap(targetRules);\n hasFieldChange.value = targetRules.some(rule => {\n const { added, removed, changed } = diffRuleColumns(rule, columnMap);\n return added.length || removed.length || changed.length;\n });\n } catch (e) {\n // 自动校验失败不打断页面,用户可手动点击「规则更新」\n console.error('自动校验规则字段变更失败:', e);\n }\n };\n // 规则数据就绪后自动校验一次(props.value 可能异步加载)\n let autoChecked = false;\n const tryAutoCheck = () => {\n if (autoChecked) {\n return;\n }\n if ((props.value || []).some(rule => rule.excel_type?.id)) {\n autoChecked = true;\n autoCheckFieldsChange();\n }\n };\n onMounted(tryAutoCheck);\n watch(() => props.value, tryAutoCheck);\n const updateRules = async () => {\n const targetRules = (props.value || []).filter(rule => rule.excel_type?.id);\n if (!targetRules.length) {\n message.warning('暂无已选择数据类型的规则');\n return;\n }\n updating.value = true;\n try {\n const columnMap = await fetchRuleColumnMap(targetRules);\n // 逐规则对比:新增列 / 删除列 / 列名变更 / 其他变更\n const plans: { rule: DataStoreConfigItem; nextFields: any[] }[] = [];\n type ColChangeItem = { index: number; title: string };\n const changeItems: {\n name: string;\n added: ColChangeItem[];\n removed: ColChangeItem[];\n renamed: ColChangeItem[];\n changed: ColChangeItem[];\n }[] = [];\n // 是否存在需要重新配置的列(新增列 / 列名变更列,其数据源配置会被清空)\n let hasNeedConfigColumns = false;\n for (const rule of targetRules) {\n const { newMap, oldMap, added, removed, changed } = diffRuleColumns(rule, columnMap);\n if (!added.length && !removed.length && !changed.length) {\n continue;\n }\n // 列名(column_name)变更 → 清空配置;其余属性变更 → 仅标记,保留原配置\n const renamed = changed.filter(\n k => oldMap.get(k)?.data_column?.column_name !== newMap.get(k)?.column_name,\n );\n const attrChanged = changed.filter(k => !renamed.includes(k));\n if (added.length || renamed.length) {\n hasNeedConfigColumns = true;\n }\n changeItems.push({\n name: rule.name,\n added: added.map(k => buildColItem(k, newMap.get(k), ['新增列'])),\n removed: removed.map(k =>\n buildColItem(k, oldMap.get(k)?.data_column, ['该列已从数据类型中删除']),\n ),\n renamed: renamed.map(k =>\n buildColItem(k, undefined, [\n `列名变更:${oldMap.get(k)?.data_column?.column_name || '—'} → ${\n newMap.get(k)?.column_name || '—'\n }`,\n '数据源配置会被清空,需重新配置',\n ]),\n ),\n changed: attrChanged.map(k => {\n const lines = describeColumnChange(oldMap.get(k)?.data_column, newMap.get(k));\n return buildColItem(k, newMap.get(k), lines.length ? lines : ['列属性已变更']);\n }),\n });\n const nextFields = [\n // 未变更字段(不含 renamed / attrChanged,二者由下面两个分支处理):\n // 保留原数据源配置,但 data_column 一律刷新为最新列信息,\n // 这样「规则更新」一次点击就能把整份快照同步干净(不依赖某个 key 是否参与变更判定)\n ...(rule.fields || [])\n .filter((f: any) => newMap.has(f.column_index) && !changed.includes(f.column_index))\n .map((f: any) => ({\n ...cloneDeep(f),\n data_column: cloneDeep(newMap.get(f.column_index)),\n })),\n ...attrChanged.map(k => ({\n ...cloneDeep(oldMap.get(k)),\n data_column: cloneDeep(newMap.get(k)),\n config_hint: 'changed',\n // 仅属性变更:原数据源配置保留,未清空\n config_hint_cleared: false,\n // 悬浮提示:具体变更了哪些属性\n config_hint_detail: describeColumnChange(\n oldMap.get(k)?.data_column,\n newMap.get(k),\n ),\n })),\n // 列名变更字段:更新列信息并清空配置,标记「变更」待编辑后清除\n ...renamed.map(k => ({\n column_index: k,\n source_type: null,\n source_value: [],\n data_column: cloneDeep(newMap.get(k)),\n config_hint: 'changed',\n // 数据源配置已清空\n config_hint_cleared: true,\n config_hint_detail: [\n `列名变更:${oldMap.get(k)?.data_column?.column_name || '—'} → ${\n newMap.get(k)?.column_name || '—'\n }`,\n ],\n })),\n // 新增字段:标记「新增」待编辑后清除\n ...added.map(k => ({\n column_index: k,\n source_type: null,\n source_value: [],\n data_column: cloneDeep(newMap.get(k)),\n config_hint: 'added',\n // 新增列本就没有配置,视为已清空\n config_hint_cleared: true,\n config_hint_detail: [],\n })),\n ].sort((a, b) => a.column_index - b.column_index);\n plans.push({ rule, nextFields });\n }\n if (!plans.length) {\n message.success('所有规则字段均无变更');\n return;\n }\n Modal.confirm({\n title: '检测到规则字段变更',\n width: 560,\n content: () => {\n // 列号标签样式(新增=绿色 / 删除=红色 / 列名变更=橙色 / 其他变更=蓝色),title 为悬浮提示\n const renderColTags = (\n items: { index: number; title: string }[],\n color: string,\n bg: string,\n border: string,\n ) =>\n items.map(item =>\n h(\n Tooltip,\n {\n placement: 'top',\n title: h('div', { style: 'white-space: pre-line' }, item.title),\n },\n {\n default: () =>\n h(\n 'span',\n {\n style: `display:inline-block;margin:0 4px 2px 0;padding:0 6px;font-size:12px;line-height:20px;border-radius:4px;cursor:help;color:${color};background:${bg};border:1px solid ${border}`,\n },\n `#${item.index}`,\n ),\n },\n ),\n );\n const children: any[] = [];\n if (hasNeedConfigColumns) {\n children.push(\n h(\n 'div',\n {\n style:\n 'background:#fffbe6;border:1px solid #ffe58f;border-radius:4px;padding:6px 10px;margin-bottom:8px;color:#d48806;font-size:12px',\n },\n '注意:新增列与列名发生变更的列,其数据源配置会被清空,确定后需要重新配置;其余仅属性变更的列保留原配置。',\n ),\n );\n }\n for (const item of changeItems) {\n const lineChildren: any[] = [`${item.name}:新增列 `];\n if (item.added.length) {\n lineChildren.push(...renderColTags(item.added, '#389e0d', '#f6ffed', '#b7eb8f'));\n } else {\n lineChildren.push('无');\n }\n lineChildren.push(',删除列 ');\n if (item.removed.length) {\n lineChildren.push(...renderColTags(item.removed, '#cf1322', '#fff1f0', '#ffa39e'));\n } else {\n lineChildren.push('无');\n }\n lineChildren.push(',列名变更(需重新配置)');\n if (item.renamed.length) {\n lineChildren.push(...renderColTags(item.renamed, '#d46b08', '#fff7e6', '#ffd591'));\n } else {\n lineChildren.push('无');\n }\n lineChildren.push(',其他变更(保留配置)');\n if (item.changed.length) {\n lineChildren.push(...renderColTags(item.changed, '#0958d9', '#f0f5ff', '#adc6ff'));\n } else {\n lineChildren.push('无');\n }\n children.push(h('div', { style: 'margin-bottom: 4px' }, lineChildren));\n }\n return h(\n 'div',\n { style: 'max-height: 300px; overflow: auto;' },\n children,\n );\n },\n okText: '确定更新',\n cancelText: '取消',\n onOk: () => {\n for (const plan of plans) {\n plan.rule.fields = plan.nextFields;\n }\n // 已同步所有变更,清除进入页面时的自动校验警告\n hasFieldChange.value = false;\n message.success('规则字段已更新');\n },\n });\n } finally {\n updating.value = false;\n }\n };\n const handleCancel = () => {\n showModal.value = false;\n };\n\n const createNewRule = (): DataStoreConfigItem => {\n let maxOrder = 0;\n for (const item of props.value) {\n if (item.order > maxOrder) {\n maxOrder = item.order;\n }\n }\n return {\n excel_type: { id: 0, name: '', flag: '' },\n batch_form_key_path: [],\n fields: [],\n conditions: { type: 'and', conditions: [] },\n version: 1,\n name: `规则${props.value?.length + 1}`,\n import_type: 'pass_import',\n order: maxOrder + 1,\n key: genID(),\n };\n };\n const addRule = () => {\n const value = [...props.value];\n value.push(createNewRule());\n emit('update:value', value);\n };\n watch(\n () => props.value,\n value => {\n let index = 0;\n if (value?.length) {\n for (const item of value) {\n index++;\n if (!item.name) {\n item.name = `规则${index}`;\n }\n }\n }\n },\n {\n immediate: true,\n },\n );\n\n const removeRule = (ruleIndex: string) => {\n const value = props.value.filter(item => item.key !== ruleIndex);\n emit('update:value', value);\n };\n const copyRule = value => {\n const newValue = cloneDeep(value);\n newValue.name = `${newValue.name} - 副本`;\n props.value.push(newValue);\n };\n return {\n addRule,\n removeRule,\n showModal,\n handleOk,\n handleCancel,\n copyRule,\n unmodifiableRuleNames,\n hasFieldChange,\n updateRules,\n updating,\n };\n },\n});\n</script>\n<style scoped lang=\"less\">\n.data-store-config {\n padding: 2px; /* Keep outer padding as is unless specified */\n\n .modify-warning {\n margin-bottom: 8px;\n }\n\n // 「执行规则更新」可点击链接样式\n .update-rules-link {\n color: #1677ff;\n cursor: pointer;\n }\n\n .rule-list-container {\n position: relative;\n width: 100%;\n }\n\n .rule-block {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 8px;\n gap: 8px;\n border: 1px solid #000000;\n border-radius: 8px;\n margin-top: 8px;\n width: 100%;\n transition: all 0.3s ease;\n will-change: transform;\n }\n\n // 列表项移动动画\n .rule-list-move {\n transition: transform 0.3s ease;\n }\n\n // 列表项进入动画\n .rule-list-enter-active {\n transition: all 0.3s ease;\n }\n\n // 列表项离开动画\n .rule-list-leave-active {\n transition: all 0.3s ease;\n position: absolute;\n width: calc(100% - 4px);\n }\n\n // 进入的起始状态\n .rule-list-enter-from {\n opacity: 0;\n transform: translateY(-30px);\n }\n\n // 离开的结束状态\n .rule-list-leave-to {\n opacity: 0;\n transform: translateY(30px);\n }\n}\n</style>\n","<template>\n <s-table\n :columns=\"columns\"\n :data-source=\"item.data_list\"\n :pagination=\"false\"\n :range-selection=\"false\"\n :scroll=\"{ x: width }\"\n row-key=\"index\"\n :header-height=\"70\"\n >\n <template #headerCell=\"{ title, column }\">\n <div class=\"header-cell\">\n <div class=\"header-info\">\n <span class=\"header-index\">{{ column.index }}</span>\n <a-tag\n v-if=\"!column.is_import_column\"\n color=\"red\"\n class=\"no-import-tag\"\n >\n 不导入\n </a-tag>\n </div>\n <div\n class=\"header-title\"\n :title=\"title\"\n >\n {{ title }}\n </div>\n </div>\n </template>\n </s-table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue';\nimport { getApiData } from '@/init-plugin';\n\nexport default defineComponent({\n name: 'dataStoreTest',\n components: {},\n props: {\n item: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const width = computed(() => {\n let w = columns.value.length * 200;\n return w < 1000 ? 1000 : w;\n });\n const columns = computed(() => {\n const res = [];\n\n for (const column of props.item.columns) {\n res.push({\n ...column,\n dataIndex: column.key,\n autoHeight: true,\n });\n }\n return res;\n });\n return {\n columns,\n width,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.header-cell {\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: space-between;\n padding: 8px 4px;\n}\n\n.header-title {\n flex: 1;\n display: flex;\n align-items: center;\n word-break: break-all;\n white-space: normal;\n line-height: 1.4;\n color: black;\n}\n\n.header-info {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n color: #999;\n margin-top: 4px;\n padding-top: 4px;\n border-bottom: 1px solid #eee;\n}\n\n.header-index {\n margin-right: 8px;\n}\n\n.no-import-tag {\n margin: 0;\n font-size: 10px;\n height: 18px;\n padding: 0 6px;\n line-height: 16px;\n}\n</style>\n","<template>\n <s-table\n :columns=\"columns\"\n :data-source=\"item.data_list\"\n :pagination=\"false\"\n :range-selection=\"false\"\n :scroll=\"{ x: width }\"\n row-key=\"index\"\n :header-height=\"70\"\n >\n <template #headerCell=\"{ title, column }\">\n <div class=\"header-cell\">\n <div class=\"header-info\">\n <span class=\"header-index\">{{ column.index }}</span>\n <a-tag\n v-if=\"!column.is_import_column\"\n color=\"red\"\n class=\"no-import-tag\"\n >\n 不导入\n </a-tag>\n </div>\n <div\n class=\"header-title\"\n :title=\"title\"\n >\n {{ title }}\n </div>\n </div>\n </template>\n </s-table>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue';\nimport { getApiData } from '@/init-plugin';\n\nexport default defineComponent({\n name: 'dataStoreTest',\n components: {},\n props: {\n item: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const width = computed(() => {\n let w = columns.value.length * 200;\n return w < 1000 ? 1000 : w;\n });\n const columns = computed(() => {\n const res = [];\n\n for (const column of props.item.columns) {\n res.push({\n ...column,\n dataIndex: column.key,\n autoHeight: true,\n });\n }\n return res;\n });\n return {\n columns,\n width,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.header-cell {\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: space-between;\n padding: 8px 4px;\n}\n\n.header-title {\n flex: 1;\n display: flex;\n align-items: center;\n word-break: break-all;\n white-space: normal;\n line-height: 1.4;\n color: black;\n}\n\n.header-info {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n color: #999;\n margin-top: 4px;\n padding-top: 4px;\n border-bottom: 1px solid #eee;\n}\n\n.header-index {\n margin-right: 8px;\n}\n\n.no-import-tag {\n margin: 0;\n font-size: 10px;\n height: 18px;\n padding: 0 6px;\n line-height: 16px;\n}\n</style>\n","<template>\n <div class=\"data-store-test\">\n <a-card class=\"test-form-card\">\n <a-form layout=\"vertical\">\n <a-row :gutter=\"16\">\n <a-col :span=\"18\">\n <a-form-item label=\"测试数据\">\n <a-select\n v-model:value=\"recordID\"\n placeholder=\"请选择测试数据\"\n show-search\n option-filter-prop=\"children\"\n >\n <a-select-option\n v-for=\"item in approveRecordList\"\n :key=\"item.id\"\n :value=\"item.id\"\n >\n <div class=\"item-wrapper\">\n <div class=\"item-number\">\n {{ item.number }}\n </div>\n <div class=\"item-context help-text\">\n {{ item.context }}\n </div>\n </div>\n </a-select-option>\n </a-select>\n </a-form-item>\n </a-col>\n <a-col :span=\"6\">\n <a-form-item label=\" \">\n <a-button\n type=\"primary\"\n @click=\"getTestData\"\n :loading=\"loading\"\n block\n :disabled=\"!recordID\"\n >\n 获取测试结果\n </a-button>\n </a-form-item>\n </a-col>\n </a-row>\n </a-form>\n </a-card>\n\n <a-spin :spinning=\"loading\">\n <div\n class=\"result-wrapper\"\n v-if=\"dataStoreResult && dataStoreResult.length > 0\"\n >\n <a-row :gutter=\"16\">\n <a-col\n :span=\"24\"\n v-for=\"(item, index) in dataStoreResult\"\n :key=\"index\"\n style=\"margin-bottom: 16px\"\n >\n <a-card\n :bordered=\"true\"\n class=\"result-card\"\n >\n <template #title>\n <span class=\"result-item-title\">{{ item.excel_type_flag }}</span>\n </template>\n <div\n v-if=\"item.errors\"\n class=\"error-text\"\n >\n <a-alert\n type=\"error\"\n banner\n >\n <template #message>\n <pre>{{ item.errors }}</pre>\n </template>\n </a-alert>\n </div>\n <div class=\"result-item-content\">\n <data-store-tests-item :item=\"item\" />\n </div>\n </a-card>\n </a-col>\n </a-row>\n </div>\n\n <a-empty\n v-else-if=\"dataStoreResult && dataStoreResult.length === 0\"\n description=\"暂无测试结果\"\n />\n </a-spin>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, ref } from 'vue';\nimport { getApiData } from '@/init-plugin';\nimport dataStoreTestsItem from './dataStoreTestsItem.vue';\n\nexport default defineComponent({\n name: 'dataStoreTest',\n components: { dataStoreTestsItem },\n props: {\n modelType: {\n type: String,\n default: null,\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const approveRecordList = ref([]);\n const recordID = ref(null);\n const dataStoreResult = ref(null);\n const loading = ref(false);\n\n const getApproveReocordList = async () => {\n const params = {\n is_my_send: true,\n current: 1,\n pageSize: 50,\n sort_fields: ['-id'],\n conditions: [\n [\n {\n class_name: 'bool',\n field_name: 'is_active',\n format: 'choices',\n operator: 'eq',\n value: [true],\n },\n {\n class_name: 'str',\n field_name: 'menu_flag',\n format: 'input',\n operator: 'eq',\n value: [props.modelType],\n },\n {\n class_name: 'str',\n field_name: 'process_status',\n format: 'input',\n operator: 'eq',\n value: ['init'],\n },\n ],\n ],\n column_fields: ['number', 'context'],\n };\n const res = await getApiData(params, '/approve/query_approve_record_list');\n approveRecordList.value = res.data;\n };\n\n const getTestData = async () => {\n if (!recordID.value) {\n // 可以添加提示信息\n return;\n }\n\n loading.value = true;\n try {\n const params = {\n approve_record_id: recordID.value,\n };\n const res = await getApiData(params, '/approve/test_approve_data_store');\n dataStoreResult.value = res;\n } finally {\n loading.value = false;\n }\n };\n\n onMounted(() => {\n getApproveReocordList();\n });\n\n return {\n approveRecordList,\n recordID,\n dataStoreResult,\n loading,\n getTestData,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.data-store-test {\n width: 100%;\n\n .test-form-card {\n margin-bottom: 16px;\n }\n\n .item-wrapper {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n }\n\n .item-number {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n }\n\n .item-context {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n }\n\n .help-text {\n color: #999;\n font-size: 12px;\n margin-top: 2px;\n }\n\n .result-wrapper {\n margin-top: 16px;\n }\n\n .result-card {\n :deep(.ant-card-head) {\n min-height: 36px;\n padding: 0 12px;\n }\n\n :deep(.ant-card-head-title) {\n padding: 8px 0;\n }\n }\n\n .result-item-title {\n font-size: 15px;\n font-weight: 600;\n }\n\n .result-item-content {\n width: 100%;\n margin-top: 12px;\n }\n\n .error-text {\n margin-bottom: 12px;\n }\n}\n</style>\n","<template>\n <div class=\"data-store-test\">\n <a-card class=\"test-form-card\">\n <a-form layout=\"vertical\">\n <a-row :gutter=\"16\">\n <a-col :span=\"18\">\n <a-form-item label=\"测试数据\">\n <a-select\n v-model:value=\"recordID\"\n placeholder=\"请选择测试数据\"\n show-search\n option-filter-prop=\"children\"\n >\n <a-select-option\n v-for=\"item in approveRecordList\"\n :key=\"item.id\"\n :value=\"item.id\"\n >\n <div class=\"item-wrapper\">\n <div class=\"item-number\">\n {{ item.number }}\n </div>\n <div class=\"item-context help-text\">\n {{ item.context }}\n </div>\n </div>\n </a-select-option>\n </a-select>\n </a-form-item>\n </a-col>\n <a-col :span=\"6\">\n <a-form-item label=\" \">\n <a-button\n type=\"primary\"\n @click=\"getTestData\"\n :loading=\"loading\"\n block\n :disabled=\"!recordID\"\n >\n 获取测试结果\n </a-button>\n </a-form-item>\n </a-col>\n </a-row>\n </a-form>\n </a-card>\n\n <a-spin :spinning=\"loading\">\n <div\n class=\"result-wrapper\"\n v-if=\"dataStoreResult && dataStoreResult.length > 0\"\n >\n <a-row :gutter=\"16\">\n <a-col\n :span=\"24\"\n v-for=\"(item, index) in dataStoreResult\"\n :key=\"index\"\n style=\"margin-bottom: 16px\"\n >\n <a-card\n :bordered=\"true\"\n class=\"result-card\"\n >\n <template #title>\n <span class=\"result-item-title\">{{ item.excel_type_flag }}</span>\n </template>\n <div\n v-if=\"item.errors\"\n class=\"error-text\"\n >\n <a-alert\n type=\"error\"\n banner\n >\n <template #message>\n <pre>{{ item.errors }}</pre>\n </template>\n </a-alert>\n </div>\n <div class=\"result-item-content\">\n <data-store-tests-item :item=\"item\" />\n </div>\n </a-card>\n </a-col>\n </a-row>\n </div>\n\n <a-empty\n v-else-if=\"dataStoreResult && dataStoreResult.length === 0\"\n description=\"暂无测试结果\"\n />\n </a-spin>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, ref } from 'vue';\nimport { getApiData } from '@/init-plugin';\nimport dataStoreTestsItem from './dataStoreTestsItem.vue';\n\nexport default defineComponent({\n name: 'dataStoreTest',\n components: { dataStoreTestsItem },\n props: {\n modelType: {\n type: String,\n default: null,\n },\n },\n emits: ['update:value'],\n\n setup(props, { emit }) {\n const approveRecordList = ref([]);\n const recordID = ref(null);\n const dataStoreResult = ref(null);\n const loading = ref(false);\n\n const getApproveReocordList = async () => {\n const params = {\n is_my_send: true,\n current: 1,\n pageSize: 50,\n sort_fields: ['-id'],\n conditions: [\n [\n {\n class_name: 'bool',\n field_name: 'is_active',\n format: 'choices',\n operator: 'eq',\n value: [true],\n },\n {\n class_name: 'str',\n field_name: 'menu_flag',\n format: 'input',\n operator: 'eq',\n value: [props.modelType],\n },\n {\n class_name: 'str',\n field_name: 'process_status',\n format: 'input',\n operator: 'eq',\n value: ['init'],\n },\n ],\n ],\n column_fields: ['number', 'context'],\n };\n const res = await getApiData(params, '/approve/query_approve_record_list');\n approveRecordList.value = res.data;\n };\n\n const getTestData = async () => {\n if (!recordID.value) {\n // 可以添加提示信息\n return;\n }\n\n loading.value = true;\n try {\n const params = {\n approve_record_id: recordID.value,\n };\n const res = await getApiData(params, '/approve/test_approve_data_store');\n dataStoreResult.value = res;\n } finally {\n loading.value = false;\n }\n };\n\n onMounted(() => {\n getApproveReocordList();\n });\n\n return {\n approveRecordList,\n recordID,\n dataStoreResult,\n loading,\n getTestData,\n };\n },\n});\n</script>\n\n<style lang=\"less\" scoped>\n.data-store-test {\n width: 100%;\n\n .test-form-card {\n margin-bottom: 16px;\n }\n\n .item-wrapper {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n }\n\n .item-number {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n }\n\n .item-context {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n }\n\n .help-text {\n color: #999;\n font-size: 12px;\n margin-top: 2px;\n }\n\n .result-wrapper {\n margin-top: 16px;\n }\n\n .result-card {\n :deep(.ant-card-head) {\n min-height: 36px;\n padding: 0 12px;\n }\n\n :deep(.ant-card-head-title) {\n padding: 8px 0;\n }\n }\n\n .result-item-title {\n font-size: 15px;\n font-weight: 600;\n }\n\n .result-item-content {\n width: 100%;\n margin-top: 12px;\n }\n\n .error-text {\n margin-bottom: 12px;\n }\n}\n</style>\n","<template>\n <a-form>\n <a-form-item label=\" 流水号前缀\">\n <a-input v-model:value=\"config.number_prefix\" />\n </a-form-item>\n <a-form-item label=\"流水号后缀\">\n <a-input v-model:value=\"config.number_suffix\" />\n </a-form-item>\n <!-- <a-form-item\n label=\"数字基础位数\"\n extra=\"不包括前缀和后缀,数字位数不足前面补0,数字超出后会自动增加位数\"\n >\n <a-input-number\n v-model:value=\"config.number_digit_place\"\n :min=\"1\"\n :max=\"20\"\n :precision=\"0\"\n style=\"width: 100%\"\n />\n </a-form-item> -->\n <a-form-item label=\"流水号示例\">\n <a-textarea\n v-model:value=\"example\"\n disabled\n auto-size\n style=\"width: 100%; font-family: monospace\"\n />\n </a-form-item>\n <a-form-item label=\"单据编号前缀\">\n <a-input v-model:value=\"config.form_code_prefix\" />\n </a-form-item>\n </a-form>\n</template>\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { ApprovalSetting } from '../../typing';\nconst config = defineModel<ApprovalSetting>('config');\nconst example = computed(() => {\n const numbers = [];\n numbers.push(1);\n numbers.push(211);\n numbers.push(7555);\n for (let i = 0; i < 3; i++) {\n numbers.push(Math.floor(Math.random() * 10 ** config.value.number_digit_place));\n }\n for (let i = 0; i < 3; i++) {\n numbers.push(Math.floor(Math.random() * 10 ** (config.value.number_digit_place + 3)));\n }\n const result = numbers.map(number => {\n return (\n config.value.number_prefix +\n String(number).padStart(config.value.number_digit_place, '0') +\n config.value.number_suffix\n );\n });\n return result.join('\\n');\n});\n</script>\n<style lang=\"less\" scoped></style>\n","<template>\n <a-form>\n <a-form-item label=\" 流水号前缀\">\n <a-input v-model:value=\"config.number_prefix\" />\n </a-form-item>\n <a-form-item label=\"流水号后缀\">\n <a-input v-model:value=\"config.number_suffix\" />\n </a-form-item>\n <!-- <a-form-item\n label=\"数字基础位数\"\n extra=\"不包括前缀和后缀,数字位数不足前面补0,数字超出后会自动增加位数\"\n >\n <a-input-number\n v-model:value=\"config.number_digit_place\"\n :min=\"1\"\n :max=\"20\"\n :precision=\"0\"\n style=\"width: 100%\"\n />\n </a-form-item> -->\n <a-form-item label=\"流水号示例\">\n <a-textarea\n v-model:value=\"example\"\n disabled\n auto-size\n style=\"width: 100%; font-family: monospace\"\n />\n </a-form-item>\n <a-form-item label=\"单据编号前缀\">\n <a-input v-model:value=\"config.form_code_prefix\" />\n </a-form-item>\n </a-form>\n</template>\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { ApprovalSetting } from '../../typing';\nconst config = defineModel<ApprovalSetting>('config');\nconst example = computed(() => {\n const numbers = [];\n numbers.push(1);\n numbers.push(211);\n numbers.push(7555);\n for (let i = 0; i < 3; i++) {\n numbers.push(Math.floor(Math.random() * 10 ** config.value.number_digit_place));\n }\n for (let i = 0; i < 3; i++) {\n numbers.push(Math.floor(Math.random() * 10 ** (config.value.number_digit_place + 3)));\n }\n const result = numbers.map(number => {\n return (\n config.value.number_prefix +\n String(number).padStart(config.value.number_digit_place, '0') +\n config.value.number_suffix\n );\n });\n return result.join('\\n');\n});\n</script>\n<style lang=\"less\" scoped></style>\n","<template>\n <div>\n <a-layout :style=\"{ height: bodyHeight + 'px' }\">\n <a-layout-sider\n class=\"approve-config-left\"\n style=\"width: 500px\"\n :width=\"220\"\n >\n <approveLeftConfig @change=\"nodeSelect\"></approveLeftConfig>\n </a-layout-sider>\n <a-layout-content class=\"setting-container\">\n <a-spin :spinning=\"loading\">\n <a-tabs\n v-if=\"dataSource\"\n v-model:activeKey=\"activeKey\"\n >\n <template #rightExtra>\n <a-form layout=\"inline\">\n <a-form-item\n label=\"开启代码调试\"\n v-if=\"is_debug_code_auth\"\n >\n <a-switch\n :checked=\"debugCodeStor.enable\"\n @change=\"debugCodeChange\"\n ></a-switch>\n </a-form-item>\n <a-button-group>\n <a-button\n type=\"default\"\n @click=\"exportConfig\"\n >\n 导出\n <ExportOutlined />\n </a-button>\n <a-button\n type=\"default\"\n @click=\"importConfig\"\n :loading=\"saving\"\n >\n 导入\n <ImportOutlined />\n </a-button>\n <a-button\n type=\"default\"\n @click=\"testDataStore\"\n :loading=\"saving\"\n >\n 数据测试\n <ExperimentOutlined />\n </a-button>\n <a-button\n type=\"primary\"\n @click=\"saveConfig\"\n :loading=\"saving\"\n >\n 保存\n <SaveOutlined />\n </a-button>\n </a-button-group>\n </a-form>\n </template>\n <a-tab-pane\n tab=\"基础配置\"\n key=\"base_config\"\n >\n <base-config\n v-if=\"activeKey === 'base_config'\"\n v-model:config=\"dataSource\"\n ></base-config>\n </a-tab-pane>\n <template\n v-for=\"column in columnTabs\"\n :key=\"column.key\"\n >\n <a-tab-pane :tab=\"column.title\">\n <component\n v-if=\"column.component\"\n :is=\"column.component\"\n :dataSource=\"getTabDataSource(column.key)\"\n :rootData=\"dataSource\"\n :formData=\"formData\"\n :tableType=\"column.sectionType\"\n @update:dataSource=\"handleUpdateDataSource(column.key, $event)\"\n :eventBus=\"eventBus\"\n ></component>\n </a-tab-pane>\n </template>\n <a-tab-pane\n tab=\"页面代码配置\"\n key=\"json_edit\"\n >\n <json-config\n v-if=\"activeKey === 'json_edit'\"\n v-model:dataSource=\"dataSource\"\n ></json-config>\n </a-tab-pane>\n <a-tab-pane\n tab=\"流程配置\"\n key=\"flow_config\"\n >\n <flow-config-view\n v-model:value=\"flowConfig\"\n :menu-flag=\"selectedNode?.state\"\n :data-source=\"dataSource\"\n ></flow-config-view>\n </a-tab-pane>\n <a-tab-pane\n tab=\"数据存储配置\"\n key=\"data_store_config\"\n >\n <data-store-config\n v-model:value=\"dataSorteConfig\"\n :menu-flag=\"selectedNode?.state\"\n :formData=\"formData\"\n ></data-store-config>\n </a-tab-pane>\n </a-tabs>\n </a-spin>\n </a-layout-content>\n </a-layout>\n </div>\n <a-modal\n v-if=\"showModal\"\n v-model:open=\"showModal\"\n title=\"数据测试\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n width=\"100%\"\n >\n <data-store-test :model-type=\"selectedNode.state\"></data-store-test>\n </a-modal>\n</template>\n\n<script lang=\"ts\" setup>\nimport { message } from 'ant-design-vue';\nimport { getApiData, useUserStore } from '@/init-plugin';\nimport { cloneDeep } from 'lodash';\nimport mitt from 'mitt';\nimport {\n ExportOutlined,\n ImportOutlined,\n ExperimentOutlined,\n SaveOutlined,\n} from '@ant-design/icons-vue';\nimport { getApprovalConfig, getDataStoreConfig, getFlowConfig } from '../../index';\nimport jsonConfig from './jsonConfig.vue';\nimport { Action, ApprovalSetting, TablesSection, DataStoreConfigType } from '../../typing';\nimport { genID, stripDataStoreConfigHints } from '../../utils';\nimport flowConfigView from '../flowConfig/flowConfig.vue';\nimport DataStoreConfig from '../dataStoreConfig/dataStoreConfig.vue';\nimport dataStoreTest from '../dataStoreConfig/dataStoreTest.vue';\nimport { SET_ENABLE, useDebugCodeStore } from '../../store/debugCode';\n\nimport baseConfig from './baseConfig.vue';\nimport { computed, defineAsyncComponent, onMounted, ref, watch } from 'vue';\nimport { getDataListConfig } from '../../configs/approval/default';\nimport approveLeftConfig from './approveLeftConfig.vue';\n\ninterface Props {\n sideTreeData: {\n expandedKeys: Array<string>;\n treeData: Array<any>;\n fieldNames: Object;\n dataSource: Array<any>;\n };\n height: number;\n}\n\nconst props = defineProps<Props>();\n\nconst loading = ref(false);\nconst eventBus = mitt();\nconst userStore = useUserStore();\nconst activeKey = ref('tables');\nconst treeDataSource = ref([]);\nconst dataSource = ref<any>(null);\nconst flowConfig = ref<any>(null);\nconst dataSorteConfig = ref<DataStoreConfigType>([]);\nconst saving = ref(false);\nconst showModal = ref(false);\nconst is_debug_code_auth = ref(false);\nconst debugCodeStor = useDebugCodeStore();\nconst selectedNode = ref<any>(null);\n\nconst bodyHeight = computed(() => {\n return props.height + 45;\n});\nconst columnTabs = [\n {\n title: '左侧栏',\n key: 'tables',\n component: defineAsyncComponent(() => {\n return import('./leftColumn.vue');\n }),\n },\n {\n title: '中间栏',\n key: 'form',\n component: defineAsyncComponent(() => {\n return import('./middleColumn.vue');\n }),\n },\n {\n title: '右侧栏',\n key: 'data_list',\n // 「配置同步」需要知道当前表格属于哪个配置块(tables / data_list)\n sectionType: 'data_list',\n component: defineAsyncComponent(() => {\n return import('./tableConfig.vue');\n }),\n },\n];\n\nconst formData = computed(() => {\n const c = getColumn('form');\n if (c) {\n return c.form;\n }\n});\n\nconst getColumn = key => {\n if (!dataSource.value?.columns) {\n return null;\n }\n return dataSource.value.columns.find(item => {\n return item.type === key;\n });\n};\nconst getTabDataSource = key => {\n const res = getColumn(key);\n if (key === 'data_list') {\n return res.table;\n } else {\n return res;\n }\n};\nconst handleUpdateDataSource = (key, data) => {\n const item = getColumn(key);\n if (item) {\n if (key === 'data_list') {\n Object.assign(item.table, { ...data, type: key });\n } else {\n Object.assign(item, { ...data, type: key });\n }\n }\n};\n\nconst processList = dataList => {\n for (const item of dataList) {\n if (item.component === '../index.vue') {\n item.disabled = false;\n } else {\n item.disabled = true;\n }\n if (item.children && item.children.length > 0) {\n processList(item.children);\n }\n }\n};\nconst initData = () => {\n const _data = cloneDeep(props.sideTreeData.treeData);\n processList(_data);\n treeDataSource.value = _data;\n initApprovalConfig();\n initFlowConfig();\n initDataStoreConfig();\n};\nconst initApprovalConfig = async () => {\n if (!selectedNode.value) {\n return;\n }\n loading.value = true;\n try {\n const { config } = await getApprovalConfig(selectedNode.value.state);\n dataSource.value = config;\n } finally {\n loading.value = false;\n }\n};\nconst initFlowConfig = async () => {\n if (!selectedNode.value) {\n return;\n }\n loading.value = true;\n\n const res = await getFlowConfig(selectedNode.value.state);\n flowConfig.value = res;\n if (!flowConfig.value.name) {\n flowConfig.value.name = selectedNode.value.name;\n }\n};\nconst initDataStoreConfig = async () => {\n if (!selectedNode.value) {\n return;\n }\n loading.value = true;\n\n const { config } = await getDataStoreConfig(selectedNode.value.state);\n dataSorteConfig.value = config;\n};\n\nconst processRemotetablepro = (\n field: any,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n if (field.children) {\n processFormGroups(field.children, allCodes, { clear_code, clear_action_code_id });\n }\n if (field.custom_btn_list) {\n processActionsList(field.custom_btn_list, allCodes, { clear_code, clear_action_code_id });\n }\n};\nconst processFormGroups = (\n dynamicFieldList: any[],\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n for (const group of dynamicFieldList) {\n processActionsList(group.custom_btn_list || [], allCodes, {\n clear_code,\n clear_action_code_id,\n });\n if (group.children) {\n for (const field of group.children) {\n if (field.type === 'remotetablepro') {\n processRemotetablepro(field, allCodes, { clear_code, clear_action_code_id });\n } else if (field.type === 'button') {\n processAction(field, allCodes, { clear_code, clear_action_code_id });\n } else if (field.type === 'formtemplate') {\n if (field.form?.dynamicFieldList) {\n processFormGroups(field.form.dynamicFieldList, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n if (field.custom_btn_list) {\n processActionsList(field.custom_btn_list, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n if (field.dynamicTitle?.enable) {\n processAction(field.dynamicTitle, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n } else if (field.type === 'dynamicvaluefield') {\n processAction(field, allCodes, { clear_code, clear_action_code_id });\n }\n }\n }\n }\n};\n\nconst processAction = (\n actionItem: any,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n if (!actionItem.action_code_id && !clear_action_code_id) {\n actionItem.action_code_id = genID();\n }\n if (actionItem.action_code_id && clear_action_code_id) {\n delete actionItem.action_code_id;\n }\n\n if ((actionItem.code || actionItem.action) && allCodes != null) {\n allCodes[actionItem.action_code_id] = {\n action: actionItem.action,\n code: actionItem.code,\n };\n }\n if (clear_code) {\n delete actionItem.action;\n delete actionItem.code;\n }\n if (actionItem.showCode?.enable) {\n if (!actionItem.showCode.action_code_id && !clear_action_code_id) {\n actionItem.showCode.action_code_id = genID();\n }\n if (actionItem.showCode.action_code_id && clear_action_code_id) {\n delete actionItem.showCode.action_code_id;\n }\n if (allCodes != null) {\n allCodes[actionItem.showCode.action_code_id] = {\n action: null,\n code: actionItem.showCode.code,\n };\n }\n\n if (clear_code) {\n delete actionItem.showCode.code;\n }\n }\n if (actionItem.disableCode?.enable) {\n if (!actionItem.disableCode.action_code_id && !clear_action_code_id) {\n actionItem.disableCode.action_code_id = genID();\n }\n if (actionItem.disableCode.action_code_id && clear_action_code_id) {\n delete actionItem.disableCode.action_code_id;\n }\n if (allCodes != null) {\n allCodes[actionItem.disableCode.action_code_id] = {\n action: null,\n code: actionItem.disableCode.code,\n };\n }\n\n if (clear_code) {\n delete actionItem.disableCode.code;\n }\n }\n};\nconst processActionsList = (\n data: Action[],\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n for (const actionItem of data) {\n processAction(actionItem, allCodes, { clear_code, clear_action_code_id });\n }\n};\nconst processTables = (\n data: TablesSection,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n //actions\n //row_actions\n if (data.tables) {\n for (const tableItem of data.tables) {\n if (tableItem.actions) {\n processActionsList(tableItem.actions, allCodes, { clear_code, clear_action_code_id });\n }\n if (tableItem.row_actions) {\n processActionsList(tableItem.row_actions, allCodes, { clear_code, clear_action_code_id });\n }\n }\n }\n};\nconst processData = (\n data: ApprovalSetting,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n if (!data) {\n return data;\n }\n if (clear_code) {\n data = cloneDeep(data);\n }\n const columns = data?.columns || [];\n\n for (const item of columns) {\n if (item.type === 'tables') {\n processTables(item, allCodes, { clear_code, clear_action_code_id });\n } else if (item.type === 'form') {\n if (item.actions) {\n processActionsList(item.actions, allCodes, { clear_code, clear_action_code_id });\n }\n if (item.form?.dynamicFieldList) {\n processFormGroups(item.form.dynamicFieldList, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n } else if (item.type === 'data_list') {\n if (item.table?.actions) {\n processActionsList(item.table.actions, allCodes, { clear_code, clear_action_code_id });\n }\n if (item.table?.row_actions) {\n processActionsList(item.table.row_actions, allCodes, { clear_code, clear_action_code_id });\n }\n }\n }\n return data;\n};\nconst saveConfig = async () => {\n try {\n saving.value = true;\n const url = '/approve/set_page_setting';\n const allCodes = {};\n processData(dataSource.value, allCodes, { clear_code: false });\n const params = {\n menu_flag: selectedNode.value.state,\n content: processData(dataSource.value, allCodes, { clear_code: true }),\n };\n await getApiData(\n { menu_flag: selectedNode.value.state, allCodes },\n '/approve/set_action_code_for_menu',\n );\n\n await getApiData(params, url);\n //保存存储配置\n dataSorteConfig.value.sort((a, b) => (a.order || 0) - (b.order || 0));\n await getApiData(\n {\n menu_flag: selectedNode.value.state,\n // 「规则更新」的临时标记(config_hint*)不落库:这里在副本上剥离,\n // 既保证存进去的是纯配置,又不影响当前页面上的标记显示(会话内仍然可见)\n content: stripDataStoreConfigHints(cloneDeep(dataSorteConfig.value)),\n },\n '/approve/set_data_store_setting',\n );\n if (flowConfig.value) {\n //保存流程\n await getApiData(\n {\n ...flowConfig.value,\n menu_flag: selectedNode.value.state,\n },\n '/approve/set_flow_setting',\n );\n }\n\n message.success('保存成功');\n } finally {\n saving.value = false;\n }\n};\nconst exportConfig = () => {\n if (!dataSource.value && !dataSorteConfig.value) {\n message.warning('没有可以导出的配置');\n return;\n }\n processData(dataSource.value, null, { clear_code: false, clear_action_code_id: true });\n const exportData = {\n dataSource: dataSource.value,\n // 同保存:导出文件里也不带「规则更新」的临时标记(副本上剥离,页面显示不受影响)\n dataSorteConfig: stripDataStoreConfigHints(cloneDeep(dataSorteConfig.value)),\n };\n const jsonString = JSON.stringify(exportData, null, 2);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const href = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = href;\n const fileName = selectedNode.value ? `${selectedNode.value.name}_config.json` : 'config.json';\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(href);\n message.success('导出成功');\n};\nconst importConfig = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'application/json';\n input.onchange = e => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) {\n return;\n }\n const reader = new FileReader();\n reader.onload = async res => {\n try {\n const content = res.target?.result as string;\n const importData = JSON.parse(content);\n if (importData.dataSource) {\n const newColumns = [];\n for (let item of importData.dataSource.columns || []) {\n // if (item.type === 'data_list') {\n // item = getDataListConfig();\n // }\n newColumns.push(item);\n }\n importData.dataSource.columns = newColumns;\n dataSource.value = importData.dataSource;\n }\n if (importData.dataSorteConfig) {\n // 导入的配置里若带着「规则更新」的临时标记,一律过滤后再进页面 / 再落库\n dataSorteConfig.value = stripDataStoreConfigHints(importData.dataSorteConfig);\n }\n await saveConfig();\n } catch (err) {\n console.error('Import failed', err);\n message.error('导入失败,请检查文件格式');\n }\n };\n reader.readAsText(file);\n };\n input.click();\n};\nconst testDataStore = async () => {\n // await saveConfig();\n showModal.value = true;\n};\nconst handleOk = () => {\n showModal.value = false;\n};\nconst handleCancel = () => {\n showModal.value = false;\n};\nconst debugCodeChange = checked => {\n debugCodeStor[SET_ENABLE](checked);\n};\nconst nodeSelect = node => {\n selectedNode.value = node;\n};\n\nonMounted(() => {\n is_debug_code_auth.value = userStore.CHECK_AUTH('approve/debug_code', '开启代码调试');\n initData();\n eventBus.on('saveConfig', saveConfig);\n});\nwatch(\n () => selectedNode.value,\n () => {\n initData();\n },\n { immediate: true },\n);\n</script>\n<style scoped lang=\"less\">\n.approve-config-left {\n background-color: white !important;\n padding: 8px;\n}\n.ant-tabs {\n display: flex;\n flex-direction: column;\n height: 100%;\n margin: 0;\n\n ::v-deep(.ant-tabs-content-holder) {\n overflow: auto;\n flex: 1;\n }\n\n ::v-deep(.ant-tabs-content-top) {\n height: 100%;\n }\n}\n\n.setting-container {\n background-color: #ffffff;\n padding: 5px;\n}\n\n.empty-content {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n direction: column;\n}\n\n.setting-content {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.setting-content-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n gap: 16px;\n\n .header-right {\n display: flex;\n gap: 8px;\n }\n}\n\n.action-button-group {\n display: flex;\n justify-content: flex-end;\n direction: row;\n gap: 0;\n}\n\n.tree-select-title-container {\n display: flex;\n align-items: flex-start;\n justify-content: flex-start;\n flex-direction: column;\n}\n\n.tree-select-title-label {\n font-size: 14px;\n}\n\n.tree-select-title-value {\n font-size: 12px;\n color: #999;\n}\n\n.drag-handle {\n cursor: move;\n padding: 8px;\n text-align: center;\n\n &:hover {\n background-color: #fafafa;\n }\n}\n\n:deep(.ant-table-tbody > tr > td) {\n padding: 8px;\n vertical-align: middle;\n}\n\n.action-more {\n width: 100%;\n text-align: center;\n cursor: pointer;\n}\n</style>\n","<template>\n <div>\n <a-layout :style=\"{ height: bodyHeight + 'px' }\">\n <a-layout-sider\n class=\"approve-config-left\"\n style=\"width: 500px\"\n :width=\"220\"\n >\n <approveLeftConfig @change=\"nodeSelect\"></approveLeftConfig>\n </a-layout-sider>\n <a-layout-content class=\"setting-container\">\n <a-spin :spinning=\"loading\">\n <a-tabs\n v-if=\"dataSource\"\n v-model:activeKey=\"activeKey\"\n >\n <template #rightExtra>\n <a-form layout=\"inline\">\n <a-form-item\n label=\"开启代码调试\"\n v-if=\"is_debug_code_auth\"\n >\n <a-switch\n :checked=\"debugCodeStor.enable\"\n @change=\"debugCodeChange\"\n ></a-switch>\n </a-form-item>\n <a-button-group>\n <a-button\n type=\"default\"\n @click=\"exportConfig\"\n >\n 导出\n <ExportOutlined />\n </a-button>\n <a-button\n type=\"default\"\n @click=\"importConfig\"\n :loading=\"saving\"\n >\n 导入\n <ImportOutlined />\n </a-button>\n <a-button\n type=\"default\"\n @click=\"testDataStore\"\n :loading=\"saving\"\n >\n 数据测试\n <ExperimentOutlined />\n </a-button>\n <a-button\n type=\"primary\"\n @click=\"saveConfig\"\n :loading=\"saving\"\n >\n 保存\n <SaveOutlined />\n </a-button>\n </a-button-group>\n </a-form>\n </template>\n <a-tab-pane\n tab=\"基础配置\"\n key=\"base_config\"\n >\n <base-config\n v-if=\"activeKey === 'base_config'\"\n v-model:config=\"dataSource\"\n ></base-config>\n </a-tab-pane>\n <template\n v-for=\"column in columnTabs\"\n :key=\"column.key\"\n >\n <a-tab-pane :tab=\"column.title\">\n <component\n v-if=\"column.component\"\n :is=\"column.component\"\n :dataSource=\"getTabDataSource(column.key)\"\n :rootData=\"dataSource\"\n :formData=\"formData\"\n :tableType=\"column.sectionType\"\n @update:dataSource=\"handleUpdateDataSource(column.key, $event)\"\n :eventBus=\"eventBus\"\n ></component>\n </a-tab-pane>\n </template>\n <a-tab-pane\n tab=\"页面代码配置\"\n key=\"json_edit\"\n >\n <json-config\n v-if=\"activeKey === 'json_edit'\"\n v-model:dataSource=\"dataSource\"\n ></json-config>\n </a-tab-pane>\n <a-tab-pane\n tab=\"流程配置\"\n key=\"flow_config\"\n >\n <flow-config-view\n v-model:value=\"flowConfig\"\n :menu-flag=\"selectedNode?.state\"\n :data-source=\"dataSource\"\n ></flow-config-view>\n </a-tab-pane>\n <a-tab-pane\n tab=\"数据存储配置\"\n key=\"data_store_config\"\n >\n <data-store-config\n v-model:value=\"dataSorteConfig\"\n :menu-flag=\"selectedNode?.state\"\n :formData=\"formData\"\n ></data-store-config>\n </a-tab-pane>\n </a-tabs>\n </a-spin>\n </a-layout-content>\n </a-layout>\n </div>\n <a-modal\n v-if=\"showModal\"\n v-model:open=\"showModal\"\n title=\"数据测试\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n width=\"100%\"\n >\n <data-store-test :model-type=\"selectedNode.state\"></data-store-test>\n </a-modal>\n</template>\n\n<script lang=\"ts\" setup>\nimport { message } from 'ant-design-vue';\nimport { getApiData, useUserStore } from '@/init-plugin';\nimport { cloneDeep } from 'lodash';\nimport mitt from 'mitt';\nimport {\n ExportOutlined,\n ImportOutlined,\n ExperimentOutlined,\n SaveOutlined,\n} from '@ant-design/icons-vue';\nimport { getApprovalConfig, getDataStoreConfig, getFlowConfig } from '../../index';\nimport jsonConfig from './jsonConfig.vue';\nimport { Action, ApprovalSetting, TablesSection, DataStoreConfigType } from '../../typing';\nimport { genID, stripDataStoreConfigHints } from '../../utils';\nimport flowConfigView from '../flowConfig/flowConfig.vue';\nimport DataStoreConfig from '../dataStoreConfig/dataStoreConfig.vue';\nimport dataStoreTest from '../dataStoreConfig/dataStoreTest.vue';\nimport { SET_ENABLE, useDebugCodeStore } from '../../store/debugCode';\n\nimport baseConfig from './baseConfig.vue';\nimport { computed, defineAsyncComponent, onMounted, ref, watch } from 'vue';\nimport { getDataListConfig } from '../../configs/approval/default';\nimport approveLeftConfig from './approveLeftConfig.vue';\n\ninterface Props {\n sideTreeData: {\n expandedKeys: Array<string>;\n treeData: Array<any>;\n fieldNames: Object;\n dataSource: Array<any>;\n };\n height: number;\n}\n\nconst props = defineProps<Props>();\n\nconst loading = ref(false);\nconst eventBus = mitt();\nconst userStore = useUserStore();\nconst activeKey = ref('tables');\nconst treeDataSource = ref([]);\nconst dataSource = ref<any>(null);\nconst flowConfig = ref<any>(null);\nconst dataSorteConfig = ref<DataStoreConfigType>([]);\nconst saving = ref(false);\nconst showModal = ref(false);\nconst is_debug_code_auth = ref(false);\nconst debugCodeStor = useDebugCodeStore();\nconst selectedNode = ref<any>(null);\n\nconst bodyHeight = computed(() => {\n return props.height + 45;\n});\nconst columnTabs = [\n {\n title: '左侧栏',\n key: 'tables',\n component: defineAsyncComponent(() => {\n return import('./leftColumn.vue');\n }),\n },\n {\n title: '中间栏',\n key: 'form',\n component: defineAsyncComponent(() => {\n return import('./middleColumn.vue');\n }),\n },\n {\n title: '右侧栏',\n key: 'data_list',\n // 「配置同步」需要知道当前表格属于哪个配置块(tables / data_list)\n sectionType: 'data_list',\n component: defineAsyncComponent(() => {\n return import('./tableConfig.vue');\n }),\n },\n];\n\nconst formData = computed(() => {\n const c = getColumn('form');\n if (c) {\n return c.form;\n }\n});\n\nconst getColumn = key => {\n if (!dataSource.value?.columns) {\n return null;\n }\n return dataSource.value.columns.find(item => {\n return item.type === key;\n });\n};\nconst getTabDataSource = key => {\n const res = getColumn(key);\n if (key === 'data_list') {\n return res.table;\n } else {\n return res;\n }\n};\nconst handleUpdateDataSource = (key, data) => {\n const item = getColumn(key);\n if (item) {\n if (key === 'data_list') {\n Object.assign(item.table, { ...data, type: key });\n } else {\n Object.assign(item, { ...data, type: key });\n }\n }\n};\n\nconst processList = dataList => {\n for (const item of dataList) {\n if (item.component === '../index.vue') {\n item.disabled = false;\n } else {\n item.disabled = true;\n }\n if (item.children && item.children.length > 0) {\n processList(item.children);\n }\n }\n};\nconst initData = () => {\n const _data = cloneDeep(props.sideTreeData.treeData);\n processList(_data);\n treeDataSource.value = _data;\n initApprovalConfig();\n initFlowConfig();\n initDataStoreConfig();\n};\nconst initApprovalConfig = async () => {\n if (!selectedNode.value) {\n return;\n }\n loading.value = true;\n try {\n const { config } = await getApprovalConfig(selectedNode.value.state);\n dataSource.value = config;\n } finally {\n loading.value = false;\n }\n};\nconst initFlowConfig = async () => {\n if (!selectedNode.value) {\n return;\n }\n loading.value = true;\n\n const res = await getFlowConfig(selectedNode.value.state);\n flowConfig.value = res;\n if (!flowConfig.value.name) {\n flowConfig.value.name = selectedNode.value.name;\n }\n};\nconst initDataStoreConfig = async () => {\n if (!selectedNode.value) {\n return;\n }\n loading.value = true;\n\n const { config } = await getDataStoreConfig(selectedNode.value.state);\n dataSorteConfig.value = config;\n};\n\nconst processRemotetablepro = (\n field: any,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n if (field.children) {\n processFormGroups(field.children, allCodes, { clear_code, clear_action_code_id });\n }\n if (field.custom_btn_list) {\n processActionsList(field.custom_btn_list, allCodes, { clear_code, clear_action_code_id });\n }\n};\nconst processFormGroups = (\n dynamicFieldList: any[],\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n for (const group of dynamicFieldList) {\n processActionsList(group.custom_btn_list || [], allCodes, {\n clear_code,\n clear_action_code_id,\n });\n if (group.children) {\n for (const field of group.children) {\n if (field.type === 'remotetablepro') {\n processRemotetablepro(field, allCodes, { clear_code, clear_action_code_id });\n } else if (field.type === 'button') {\n processAction(field, allCodes, { clear_code, clear_action_code_id });\n } else if (field.type === 'formtemplate') {\n if (field.form?.dynamicFieldList) {\n processFormGroups(field.form.dynamicFieldList, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n if (field.custom_btn_list) {\n processActionsList(field.custom_btn_list, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n if (field.dynamicTitle?.enable) {\n processAction(field.dynamicTitle, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n } else if (field.type === 'dynamicvaluefield') {\n processAction(field, allCodes, { clear_code, clear_action_code_id });\n }\n }\n }\n }\n};\n\nconst processAction = (\n actionItem: any,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n if (!actionItem.action_code_id && !clear_action_code_id) {\n actionItem.action_code_id = genID();\n }\n if (actionItem.action_code_id && clear_action_code_id) {\n delete actionItem.action_code_id;\n }\n\n if ((actionItem.code || actionItem.action) && allCodes != null) {\n allCodes[actionItem.action_code_id] = {\n action: actionItem.action,\n code: actionItem.code,\n };\n }\n if (clear_code) {\n delete actionItem.action;\n delete actionItem.code;\n }\n if (actionItem.showCode?.enable) {\n if (!actionItem.showCode.action_code_id && !clear_action_code_id) {\n actionItem.showCode.action_code_id = genID();\n }\n if (actionItem.showCode.action_code_id && clear_action_code_id) {\n delete actionItem.showCode.action_code_id;\n }\n if (allCodes != null) {\n allCodes[actionItem.showCode.action_code_id] = {\n action: null,\n code: actionItem.showCode.code,\n };\n }\n\n if (clear_code) {\n delete actionItem.showCode.code;\n }\n }\n if (actionItem.disableCode?.enable) {\n if (!actionItem.disableCode.action_code_id && !clear_action_code_id) {\n actionItem.disableCode.action_code_id = genID();\n }\n if (actionItem.disableCode.action_code_id && clear_action_code_id) {\n delete actionItem.disableCode.action_code_id;\n }\n if (allCodes != null) {\n allCodes[actionItem.disableCode.action_code_id] = {\n action: null,\n code: actionItem.disableCode.code,\n };\n }\n\n if (clear_code) {\n delete actionItem.disableCode.code;\n }\n }\n};\nconst processActionsList = (\n data: Action[],\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n for (const actionItem of data) {\n processAction(actionItem, allCodes, { clear_code, clear_action_code_id });\n }\n};\nconst processTables = (\n data: TablesSection,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n //actions\n //row_actions\n if (data.tables) {\n for (const tableItem of data.tables) {\n if (tableItem.actions) {\n processActionsList(tableItem.actions, allCodes, { clear_code, clear_action_code_id });\n }\n if (tableItem.row_actions) {\n processActionsList(tableItem.row_actions, allCodes, { clear_code, clear_action_code_id });\n }\n }\n }\n};\nconst processData = (\n data: ApprovalSetting,\n allCodes: Record<string, any>,\n { clear_code = false, clear_action_code_id = false },\n) => {\n if (!data) {\n return data;\n }\n if (clear_code) {\n data = cloneDeep(data);\n }\n const columns = data?.columns || [];\n\n for (const item of columns) {\n if (item.type === 'tables') {\n processTables(item, allCodes, { clear_code, clear_action_code_id });\n } else if (item.type === 'form') {\n if (item.actions) {\n processActionsList(item.actions, allCodes, { clear_code, clear_action_code_id });\n }\n if (item.form?.dynamicFieldList) {\n processFormGroups(item.form.dynamicFieldList, allCodes, {\n clear_code,\n clear_action_code_id,\n });\n }\n } else if (item.type === 'data_list') {\n if (item.table?.actions) {\n processActionsList(item.table.actions, allCodes, { clear_code, clear_action_code_id });\n }\n if (item.table?.row_actions) {\n processActionsList(item.table.row_actions, allCodes, { clear_code, clear_action_code_id });\n }\n }\n }\n return data;\n};\nconst saveConfig = async () => {\n try {\n saving.value = true;\n const url = '/approve/set_page_setting';\n const allCodes = {};\n processData(dataSource.value, allCodes, { clear_code: false });\n const params = {\n menu_flag: selectedNode.value.state,\n content: processData(dataSource.value, allCodes, { clear_code: true }),\n };\n await getApiData(\n { menu_flag: selectedNode.value.state, allCodes },\n '/approve/set_action_code_for_menu',\n );\n\n await getApiData(params, url);\n //保存存储配置\n dataSorteConfig.value.sort((a, b) => (a.order || 0) - (b.order || 0));\n await getApiData(\n {\n menu_flag: selectedNode.value.state,\n // 「规则更新」的临时标记(config_hint*)不落库:这里在副本上剥离,\n // 既保证存进去的是纯配置,又不影响当前页面上的标记显示(会话内仍然可见)\n content: stripDataStoreConfigHints(cloneDeep(dataSorteConfig.value)),\n },\n '/approve/set_data_store_setting',\n );\n if (flowConfig.value) {\n //保存流程\n await getApiData(\n {\n ...flowConfig.value,\n menu_flag: selectedNode.value.state,\n },\n '/approve/set_flow_setting',\n );\n }\n\n message.success('保存成功');\n } finally {\n saving.value = false;\n }\n};\nconst exportConfig = () => {\n if (!dataSource.value && !dataSorteConfig.value) {\n message.warning('没有可以导出的配置');\n return;\n }\n processData(dataSource.value, null, { clear_code: false, clear_action_code_id: true });\n const exportData = {\n dataSource: dataSource.value,\n // 同保存:导出文件里也不带「规则更新」的临时标记(副本上剥离,页面显示不受影响)\n dataSorteConfig: stripDataStoreConfigHints(cloneDeep(dataSorteConfig.value)),\n };\n const jsonString = JSON.stringify(exportData, null, 2);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const href = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = href;\n const fileName = selectedNode.value ? `${selectedNode.value.name}_config.json` : 'config.json';\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(href);\n message.success('导出成功');\n};\nconst importConfig = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'application/json';\n input.onchange = e => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) {\n return;\n }\n const reader = new FileReader();\n reader.onload = async res => {\n try {\n const content = res.target?.result as string;\n const importData = JSON.parse(content);\n if (importData.dataSource) {\n const newColumns = [];\n for (let item of importData.dataSource.columns || []) {\n // if (item.type === 'data_list') {\n // item = getDataListConfig();\n // }\n newColumns.push(item);\n }\n importData.dataSource.columns = newColumns;\n dataSource.value = importData.dataSource;\n }\n if (importData.dataSorteConfig) {\n // 导入的配置里若带着「规则更新」的临时标记,一律过滤后再进页面 / 再落库\n dataSorteConfig.value = stripDataStoreConfigHints(importData.dataSorteConfig);\n }\n await saveConfig();\n } catch (err) {\n console.error('Import failed', err);\n message.error('导入失败,请检查文件格式');\n }\n };\n reader.readAsText(file);\n };\n input.click();\n};\nconst testDataStore = async () => {\n // await saveConfig();\n showModal.value = true;\n};\nconst handleOk = () => {\n showModal.value = false;\n};\nconst handleCancel = () => {\n showModal.value = false;\n};\nconst debugCodeChange = checked => {\n debugCodeStor[SET_ENABLE](checked);\n};\nconst nodeSelect = node => {\n selectedNode.value = node;\n};\n\nonMounted(() => {\n is_debug_code_auth.value = userStore.CHECK_AUTH('approve/debug_code', '开启代码调试');\n initData();\n eventBus.on('saveConfig', saveConfig);\n});\nwatch(\n () => selectedNode.value,\n () => {\n initData();\n },\n { immediate: true },\n);\n</script>\n<style scoped lang=\"less\">\n.approve-config-left {\n background-color: white !important;\n padding: 8px;\n}\n.ant-tabs {\n display: flex;\n flex-direction: column;\n height: 100%;\n margin: 0;\n\n ::v-deep(.ant-tabs-content-holder) {\n overflow: auto;\n flex: 1;\n }\n\n ::v-deep(.ant-tabs-content-top) {\n height: 100%;\n }\n}\n\n.setting-container {\n background-color: #ffffff;\n padding: 5px;\n}\n\n.empty-content {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n direction: column;\n}\n\n.setting-content {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.setting-content-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n gap: 16px;\n\n .header-right {\n display: flex;\n gap: 8px;\n }\n}\n\n.action-button-group {\n display: flex;\n justify-content: flex-end;\n direction: row;\n gap: 0;\n}\n\n.tree-select-title-container {\n display: flex;\n align-items: flex-start;\n justify-content: flex-start;\n flex-direction: column;\n}\n\n.tree-select-title-label {\n font-size: 14px;\n}\n\n.tree-select-title-value {\n font-size: 12px;\n color: #999;\n}\n\n.drag-handle {\n cursor: move;\n padding: 8px;\n text-align: center;\n\n &:hover {\n background-color: #fafafa;\n }\n}\n\n:deep(.ant-table-tbody > tr > td) {\n padding: 8px;\n vertical-align: middle;\n}\n\n.action-more {\n width: 100%;\n text-align: center;\n cursor: pointer;\n}\n</style>\n"],"mappings":"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"}
|