diff --git a/commitlint.config.cjs b/commitlint.config.mjs similarity index 99% rename from commitlint.config.cjs rename to commitlint.config.mjs index 90041b45..d706f754 100644 --- a/commitlint.config.cjs +++ b/commitlint.config.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { // 继承的规则 extends: ["@commitlint/config-conventional"], // 自定义规则 diff --git a/package.json b/package.json index 94b2bbaf..de94c135 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue3-element-admin", "description": "Vue3 + Vite + TypeScript + Element-Plus 的后台管理模板,vue-element-admin 的 Vue3 版本", - "version": "4.11.1", + "version": "4.12.0", "private": true, "type": "module", "scripts": { diff --git a/src/api/workflow/types.ts b/src/api/workflow/types.ts index c728ff69..b982149c 100644 --- a/src/api/workflow/types.ts +++ b/src/api/workflow/types.ts @@ -287,6 +287,8 @@ export interface CompleteTaskFormData { comment?: string; /** 流程变量(驱动后续网关条件) */ variables?: Record; + /** 发起表单数据(发起人节点重新提交时填写) */ + formData?: Record; } /** diff --git a/src/views/codegen/components/BasicConfigStep.vue b/src/views/codegen/components/BasicConfigStep.vue index a5c2a7e9..3cfd101c 100644 --- a/src/views/codegen/components/BasicConfigStep.vue +++ b/src/views/codegen/components/BasicConfigStep.vue @@ -109,13 +109,13 @@ - - - 普通 - - 封装(CRUD) + 封装 CRUD(推荐) + + + + 普通(兼容) diff --git a/src/views/codegen/components/FieldConfigStep.vue b/src/views/codegen/components/FieldConfigStep.vue index 29a311c7..31c9dbc6 100644 --- a/src/views/codegen/components/FieldConfigStep.vue +++ b/src/views/codegen/components/FieldConfigStep.vue @@ -131,6 +131,7 @@ :key="key" :label="item.label" :value="item.value" + :disabled="isQueryTypeDisabled(row, key)" /> @@ -212,9 +213,20 @@ const props = defineProps<{ aiChanges?: Record; }>(); +type FieldConfig = NonNullable[number]; + const formTypeOptions: Record = FormTypeEnum; const queryTypeOptions: Record = QueryTypeEnum; +/** + * 判断查询方式是否适用于字段类型 + */ +function isQueryTypeDisabled(row: FieldConfig, key: string): boolean { + if (key === "IN") return row.fieldType === "byte[]"; + if (key === "BETWEEN") return row.fieldType === "Boolean" || row.fieldType === "byte[]"; + return false; +} + const listRef = ref(); const sortFlag = ref(null); diff --git a/src/views/codegen/components/GeneratorDrawer.vue b/src/views/codegen/components/GeneratorDrawer.vue index 00def4d8..8214ab13 100644 --- a/src/views/codegen/components/GeneratorDrawer.vue +++ b/src/views/codegen/components/GeneratorDrawer.vue @@ -387,7 +387,7 @@ async function handleAiFill() { snapshotConfig(genConfigFormData.value); const filled = await GeneratorAPI.aiFillConfig(currentTableName.value); // 接口按表结构重建配置,页面类型等非字段项可能为空,沿用当前选择再补默认 - filled.pageType = filled.pageType || genConfigFormData.value.pageType || "classic"; + filled.pageType = filled.pageType || genConfigFormData.value.pageType || "crud"; const diff = resolveDiff(filled); genConfigFormData.value = applyDefaults(filled); if (diff.changeCount === 0) { @@ -484,7 +484,7 @@ async function handleNext() { } if (currentStep.value === STEP.PREVIEW) { - const pageType = genConfigFormData.value.pageType || "classic"; + const pageType = genConfigFormData.value.pageType || "crud"; await GeneratorAPI.download(currentTableName.value, pageType as "classic" | "crud", "ts"); } } diff --git a/src/views/codegen/components/PreviewStep.vue b/src/views/codegen/components/PreviewStep.vue index b7626dfd..71da9aeb 100644 --- a/src/views/codegen/components/PreviewStep.vue +++ b/src/views/codegen/components/PreviewStep.vue @@ -228,7 +228,7 @@ const fileCount = computed(() => { * 下载生成的代码 */ function handleDownload() { - const pageType = props.genConfigFormData.pageType || "classic"; + const pageType = props.genConfigFormData.pageType || "crud"; return GeneratorAPI.download(props.tableName, pageType as "classic" | "crud", "ts"); } diff --git a/src/views/codegen/composables/useCodePreview.ts b/src/views/codegen/composables/useCodePreview.ts index 644a9278..42b43cc2 100644 --- a/src/views/codegen/composables/useCodePreview.ts +++ b/src/views/codegen/composables/useCodePreview.ts @@ -37,7 +37,7 @@ export function useCodePreview(genConfigFormData: Ref) { */ async function handlePreview(tableName: string) { treeData.value = []; - const pageType = genConfigFormData.value.pageType || "classic"; + const pageType = genConfigFormData.value.pageType || "crud"; const data = await GeneratorAPI.getPreviewData(tableName, pageType as "classic" | "crud", "ts"); const previewList = data || []; diff --git a/src/views/codegen/composables/useGenConfig.ts b/src/views/codegen/composables/useGenConfig.ts index c60e8d1d..dc7ccb7a 100644 --- a/src/views/codegen/composables/useGenConfig.ts +++ b/src/views/codegen/composables/useGenConfig.ts @@ -11,7 +11,7 @@ import type { OptionItem } from "@/api/common"; export function useGenConfig() { const genConfigFormData = ref({ fieldConfigs: [], - pageType: "classic", + pageType: "crud", }); const genConfigFormRules = { @@ -63,11 +63,11 @@ export function useGenConfig() { ); /** - * 未保存过的表页面类型为空,统一补成普通表单 + * 未保存过的表页面类型为空,统一补成 CrudPage 页面 */ function applyDefaults(config: GenConfigForm): GenConfigForm { if (!config.pageType) { - config.pageType = "classic"; + config.pageType = "crud"; } return config; } diff --git a/src/views/workflow/task/components/TodoTab.vue b/src/views/workflow/task/components/TodoTab.vue index 80cfb0af..ce202270 100644 --- a/src/views/workflow/task/components/TodoTab.vue +++ b/src/views/workflow/task/components/TodoTab.vue @@ -106,8 +106,15 @@ + (); +// 发起人节点可编辑表单:只有该节点允许修改申请内容,其余节点保持只读 +const editFormApi = ref(); +const editFormData = ref>({}); +const editRule = shallowRef([]); +const editOption = ref({ submitBtn: false, resetBtn: false }); +const isInitiatorTask = computed(() => Boolean(detail.value?.taskFormKey)); + +watch( + () => [ + detail.value?.taskFormKey, + detail.value?.formJson, + detail.value?.optionsJson, + detail.value?.dataJson, + ], + () => { + if (!isInitiatorTask.value) return; + try { + editRule.value = JSON.parse(detail.value?.formJson || "[]") as Rule[]; + editOption.value = { + ...(JSON.parse(detail.value?.optionsJson || "{}") as Options), + submitBtn: false, + resetBtn: false, + }; + editFormData.value = JSON.parse(detail.value?.dataJson || "{}") as Record; + } catch { + editRule.value = []; + editOption.value = { submitBtn: false, resetBtn: false }; + editFormData.value = {}; + } + }, + { immediate: true }, +); + // 审批意见(通过/驳回共用) const comment = ref(""); @@ -326,7 +368,17 @@ function closeRejectMode(): void { async function handleComplete(): Promise { submitting.value = true; try { - await WorkflowAPI.task.complete(detail.value!.taskId, { comment: comment.value }); + if (isInitiatorTask.value) { + const valid = await editFormApi.value + ?.validate() + .then(() => true) + .catch(() => false); + if (!valid) return; + } + await WorkflowAPI.task.complete(detail.value!.taskId, { + comment: comment.value, + formData: isInitiatorTask.value ? { ...editFormData.value } : undefined, + }); ElMessage.success("审批通过"); approveState.visible = false; fetchData();