From 105da87b880b711e748cd0462f74ebb3ecfcead4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=98huanghaiixia=E2=80=99?= <980486410@.com>
Date: Thu, 27 Nov 2025 17:23:14 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E8=87=AA=E5=AE=9A=E4=B9=89?=
=?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=B5=81=E7=A8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Customer/components/bankListModal.vue | 15 +-
.../sales/Customer/components/bankModal.vue | 2 +-
.../Customer/components/certificateModal.vue | 35 +--
.../createForm.vue} | 211 ++++++++++--------
src/views/sales/Customer/index.vue | 34 ++-
src/views/secondDev/Empty.vue | 7 +
src/views/secondDev/approveFlowPage.vue | 20 +-
src/views/secondDev/createFlow.vue | 142 +++++++++++-
src/views/secondDev/customFormConfig.ts | 6 +
.../task/components/ApprovalProcess.vue | 9 +-
.../task/components/flow/FormInformation.vue | 28 ++-
.../task/components/flow/LookTask.vue | 6 +-
12 files changed, 382 insertions(+), 133 deletions(-)
rename src/views/sales/Customer/{formCreatePage.vue => components/createForm.vue} (82%)
create mode 100644 src/views/secondDev/Empty.vue
create mode 100644 src/views/secondDev/customFormConfig.ts
diff --git a/src/views/sales/Customer/components/bankListModal.vue b/src/views/sales/Customer/components/bankListModal.vue
index 7234cd4..e99db73 100644
--- a/src/views/sales/Customer/components/bankListModal.vue
+++ b/src/views/sales/Customer/components/bankListModal.vue
@@ -1,6 +1,7 @@
-
+
@@ -9,7 +10,7 @@
diff --git a/src/views/secondDev/approveFlowPage.vue b/src/views/secondDev/approveFlowPage.vue
index 91d456f..edcfe76 100644
--- a/src/views/secondDev/approveFlowPage.vue
+++ b/src/views/secondDev/approveFlowPage.vue
@@ -38,7 +38,9 @@
+
import { useRouter } from 'vue-router';
- import { onMounted, reactive, ref, unref, createVNode, provide } from 'vue';
+ import { onMounted, reactive, ref, unref, createVNode, provide,computed,defineAsyncComponent } from 'vue';
import FormInformation from '/@/views/secondDev/FormInformation.vue';
import userTaskItem from '/@/views/workflow/task/hooks/userTaskItem';
import { getApprovalProcess, postApproval, postGetNextTaskMaybeArrival, postTransfer, getDrawNode, withdraw } from '/@/api/workflow/task';
@@ -97,6 +99,7 @@
import { TaskTypeUrl } from '/@/enums/workflowEnum';
import { postSetSign, postSetSignV2 } from '/@/api/workflow/task';
import FlowRecord from '/@/views/workflow/task/components/flow/FlowRecord.vue';
+ import {customFormConfig} from './customFormConfig'
const spinning = ref(false);
const userStore = useUserStore();
@@ -174,7 +177,17 @@
nextTaskUser: {} // 格式为taskKey: 用户id(逗号分隔)
});
let approvedType = ref(ApproveType.AGREE);
-
+
+ const componentName = computed(() => {
+ if (!data.formInfos.length) {
+ return defineAsyncComponent({
+ loader: () => import('/@/views/secondDev/Empty.vue')
+ });
+ }
+ return defineAsyncComponent({
+ loader: () => import(`/@/views/${data.formInfos[0]?.functionalModule}/${data.formInfos[0]?.functionName}/components/createForm.vue`)
+ });
+ });
function showButton(btn) {
// 撤回有drawNode才显示,流程图任何情况下都显示
let show =
@@ -570,10 +583,11 @@
return data.taskApproveOpinions || [];
}
}
-
+ const curPageCode = ref()
onMounted(async () => {
try {
let res = await getApprovalProcess(unref(taskId), unref(processId));
+ curPageCode.value = res?.schemaInfo?.code
initProcessData(res);
await getBackNode();
processInfo.value = res;
diff --git a/src/views/secondDev/createFlow.vue b/src/views/secondDev/createFlow.vue
index c2b8a35..0774a9e 100644
--- a/src/views/secondDev/createFlow.vue
+++ b/src/views/secondDev/createFlow.vue
@@ -32,7 +32,8 @@
-
+
+
@@ -54,7 +55,7 @@
import { getStartProcessInfo, getReStartProcessInfo, reLaunch, postLaunch, postApproval, postGetNextTaskMaybeArrival } from '/@/api/workflow/task';
import { useMultipleTabStore } from '/@/store/modules/multipleTab';
import { CloseOutlined, SendOutlined, ClockCircleOutlined, PrinterOutlined, ApartmentOutlined } from '@ant-design/icons-vue';
- import { nextTick, onMounted, ref, toRaw, reactive } from 'vue';
+ import { nextTick, onMounted, ref, toRaw, reactive, computed, defineAsyncComponent } from 'vue';
import { deleteDraft, postDraft, putDraft } from '/@/api/workflow/process';
import { useI18n } from '/@/hooks/web/useI18n';
import { separator } from '/@bpmn/config/info';
@@ -62,12 +63,13 @@
import OpinionDialog from '/@/components/SecondDev/OpinionDialog.vue';
import { ApproveCode, ApproveType } from '/@/enums/workflowEnum';
import useEventBus from '/@/hooks/event/useEventBus';
+ import {customFormConfig} from './customFormConfig'
const { bus, CREATE_FLOW } = useEventBus();
const router = useRouter();
const tabStore = useMultipleTabStore();
-
+ const curPageCode = ref()
const { t } = useI18n();
const { data, approveUserData, initProcessData, notificationSuccess, notificationError } = userTaskItem();
const currentRoute = router.currentRoute.value;
@@ -130,6 +132,17 @@
}
});
+ const componentName = computed(() => {
+ if (!data.formInfos.length) {
+ return defineAsyncComponent({
+ loader: () => import('/@/views/secondDev/Empty.vue')
+ });
+ }
+ return defineAsyncComponent({
+ loader: () => import(`/@/views/${data.formInfos[0]?.functionalModule}/${data.formInfos[0]?.functionName}/components/createForm.vue`)
+ });
+ });
+
onMounted(async () => {
try {
// 发起流程
@@ -139,6 +152,7 @@
const tabPrefix = pageMode === 'new' ? '新建' : '草稿';
tabStore.changeTitle(fullPath, `${tabPrefix}:${title}`);
}
+ curPageCode.value = res?.schemaInfo?.code
initProcessData(res);
} catch (error) {}
randKey.value = Math.random() + '';
@@ -272,8 +286,18 @@
async function getApproveParams() {
let formModels = mainFormModels.value;
- let system = formInformation.value.getSystemType();
- let fileFolderIds = getUploadFileFolderIds(formModels);
+ let fileFolderIds = []
+ let system = {}
+ if (customFormConfig.codeList.includes(curPageCode.value)) {
+ let key = data.formInfos[0]?.formConfig?.key
+ let obj = {}
+ system[key] = false
+ fileFolderIds = []
+ } else {
+ system = formInformation.value.getSystemType();
+ fileFolderIds = getUploadFileFolderIds(formModels);
+ }
+
return {
approvedType: approvalData.approvedType,
approvedResult: approvalData.approvedResult, // approvalData.approvedType 审批结果 如果为 4 就需要传buttonCode
@@ -291,7 +315,115 @@
};
}
+ async function saveLaunchNew() {
+ if (!taskId.value && rDraftsId.value != '0') {
+ try {
+ await new Promise((resolve, reject) => {
+ Modal.confirm({
+ title: '提示',
+ content: '请确认是否提交流程,提交后流程不能删除',
+ okText: '确定',
+ cancelText: '取消',
+ onOk: () => resolve(),
+ onCancel: () => reject()
+ });
+ });
+ } catch {
+ return;
+ }
+ }
+ try {
+ // let validateForms = await formInformation.value.validateForm();
+ // let system = formInformation.value.getSystemType();
+ let key = data.formInfos[0]?.formConfig?.key
+ let system = {}
+ let obj = {}
+ system[key] = false
+
+ let value = await formInformation.value.handleSubmit(true);
+ obj[key] = value
+ mainFormModels.value = obj
+ console.log(mainFormModels.value, 6666)
+ if (!value) return
+
+ data.submitLoading = true;
+ loading.value = true;
+ // if (validateForms.length > 0) {
+ // let successValidate = validateForms.filter((ele) => {
+ // return ele.validate;
+ // });
+ // console.info('validateForms:' + JSON.stringify(validateForms));
+ // if (successValidate.length == validateForms.length) {
+ // mainFormModels.value = await formInformation.value.getFormModels(true);
+ /*for (let i in mainFormModels.value) {
+ const item = mainFormModels.value[i];
+ if (!item['_id']) {
+ throw new Error('发起失败');
+ } else {
+ delete item['_id'];
+ }
+ }*/
+ let relationTasks = [];
+ if (data.predecessorTasks && data.predecessorTasks.length > 0) {
+ relationTasks = data.predecessorTasks.map((ele) => {
+ return { taskId: ele.taskId, schemaId: ele.schemaId };
+ });
+ }
+ // let fileFolderIds = getUploadFileFolderIds(mainFormModels.value);
+ let fileFolderIds = []
+ if (taskId.value) {
+ // 如果在草稿节点取消,重新从草稿开始走
+ return createFlowSuccess(true);
+ }
+ //如果传入了processId 代表是重新发起流程
+ let res;
+ res = await postLaunch(rSchemaId, mainFormModels.value, relationTasks, fileFolderIds, system);
+ // 下一节点审批人
+ let taskList = [];
+ if (res && res.length > 0) {
+ taskId.value = res[0].taskId;
+ taskList = res
+ .filter((ele) => {
+ return ele.isMultiInstance == false && ele.isAppoint == true;
+ })
+ .map((ele) => {
+ return {
+ taskId: ele.taskId,
+ taskName: ele.taskName,
+ provisionalApprover: ele.provisionalApprover,
+ selectIds: []
+ };
+ });
+ const strictDesign = false;
+ console.log(taskList, 'taskList')
+ if (strictDesign && taskList.length > 0) {
+ notificationError('提交失败', '流程设计错误,开始后的第一个节点必须是审批人为发起人的起草节点。');
+ data.submitLoading = false;
+ loading.value = false;
+ } else {
+ createFlowSuccess(taskList);
+ }
+ } else {
+ createFlowSuccess();
+ }
+ // } else {
+ // data.submitLoading = false;
+ // notificationError(t('发起流程'), t('表单校验未通过'));
+ // loading.value = false;
+ // }
+ // }
+ } catch (error) {
+ console.log(error, 'error')
+ data.submitLoading = false;
+ loading.value = false;
+ notificationError(t('发起流程'), t('发起流程失败'));
+ }
+ }
async function saveLaunch() {
+ if (customFormConfig.codeList.includes(curPageCode.value)){
+ saveLaunchNew()
+ return
+ }
if (!taskId.value && rDraftsId.value != '0') {
try {
await new Promise((resolve, reject) => {
diff --git a/src/views/secondDev/customFormConfig.ts b/src/views/secondDev/customFormConfig.ts
new file mode 100644
index 0000000..b9c880e
--- /dev/null
+++ b/src/views/secondDev/customFormConfig.ts
@@ -0,0 +1,6 @@
+export const customFormConfig = {
+ codeList: ['addCustomer'],
+ router: [
+ {code: 'addCustomer', src: ''}
+ ]
+};
\ No newline at end of file
diff --git a/src/views/workflow/task/components/ApprovalProcess.vue b/src/views/workflow/task/components/ApprovalProcess.vue
index 9623fd4..10d9de5 100644
--- a/src/views/workflow/task/components/ApprovalProcess.vue
+++ b/src/views/workflow/task/components/ApprovalProcess.vue
@@ -10,6 +10,8 @@
(),
{
schemaId: '',
processId: '',
taskId: '',
+ id: '',
visible: false
}
);
@@ -210,7 +214,8 @@
return ele.taskId;
});
});
-
+ const curPageCode = ref()
+ const id = ref()
// 审批
async function approval() {
showLoading.value = true;
@@ -218,6 +223,8 @@
if (props.taskId) {
try {
let res = await getApprovalProcess(props.taskId, props.processId);
+ curPageCode.value = res?.schemaInfo?.code
+ id.value = res?.formInfos[0]?.formData?.id
initProcessData(res);
if (res.buttonConfigs) {
approvalData.buttonConfigs = res.buttonConfigs;
diff --git a/src/views/workflow/task/components/flow/FormInformation.vue b/src/views/workflow/task/components/flow/FormInformation.vue
index 6f33776..8974ec4 100644
--- a/src/views/workflow/task/components/flow/FormInformation.vue
+++ b/src/views/workflow/task/components/flow/FormInformation.vue
@@ -35,8 +35,13 @@
-
-
+
+
+
+
+
+
+
@@ -50,7 +55,7 @@
import { FewerLeft, FewerRight } from '/@/components/ModalPanel';
import { NodeHead } from '/@/components/ModalPanel/index';
import IconFontSymbol from '/@/components/IconFontSymbol/Index.vue';
- import { onBeforeUpdate, nextTick, onMounted, reactive, computed, ref } from 'vue';
+ import { onBeforeUpdate, nextTick, onMounted, reactive, computed, ref, defineAsyncComponent } from 'vue';
import { TaskApproveOpinion, ValidateForms } from '/@/model/workflow/bpmnConfig';
import { cloneDeep } from 'lodash-es';
import { useI18n } from '/@/hooks/web/useI18n';
@@ -62,6 +67,7 @@
import { createFormEvent, loadFormEvent, submitFormEvent } from '/@/hooks/web/useFormEvent';
import { message } from 'ant-design-vue';
import { updateWorkflow } from '/@/api/workflow/adminOperation';
+ import {customFormConfig} from '/@/views/secondDev/customFormConfig'
const { t } = useI18n();
const props = withDefaults(
defineProps<{
@@ -71,13 +77,17 @@
opinionsComponents?: Array | undefined;
formAssignmentData?: null | Recordable;
processId: string;
+ curPageCode: string;
+ id: string;
}>(),
{
disabled: false,
formInfos: () => {
return [];
},
- processId: ''
+ processId: '',
+ curPageCode: '',
+ id: ''
}
);
@@ -143,6 +153,16 @@
formEventConfigs: [],
modes: []
});
+ const componentName = computed(() => {
+ if (!props.formInfos.length) {
+ return defineAsyncComponent({
+ loader: () => import('/@/views/secondDev/Empty.vue')
+ });
+ }
+ return defineAsyncComponent({
+ loader: () => import(`/@/views/${props.formInfos[0]?.functionalModule}/${props.formInfos[0]?.functionName}/components/createForm.vue`)
+ });
+ });
onMounted(async () => {
for await (let element of props.formInfos) {
let formModels = {};
diff --git a/src/views/workflow/task/components/flow/LookTask.vue b/src/views/workflow/task/components/flow/LookTask.vue
index ce84e6f..30e10e6 100644
--- a/src/views/workflow/task/components/flow/LookTask.vue
+++ b/src/views/workflow/task/components/flow/LookTask.vue
@@ -14,7 +14,7 @@
:formDataId="data.formInfos[0].formData.id"
:formInfos="data.formInfos"
>
-
+
@@ -27,11 +27,15 @@
let props = defineProps(['position', 'processId', 'taskId', 'schemaId']);
let visible = ref(false);
const { data, initProcessData } = userTaskItem();
+ const curPageCode = ref()
+ const id = ref()
onMounted(async () => {
try {
let res = await getApprovalProcess(props.taskId, props.processId);
initProcessData(res);
visible.value = true;
+ curPageCode.value = res?.schemaInfo?.code
+ id.value = res?.formInfos[0]?.formData?.id
console.error('555555', data);
} catch (error) {}
});