diff --git a/src/components/Form/src/components/Upload.vue b/src/components/Form/src/components/Upload.vue
index 9bb933d..a225bd6 100644
--- a/src/components/Form/src/components/Upload.vue
+++ b/src/components/Form/src/components/Upload.vue
@@ -69,9 +69,9 @@
点击上传
-
+
@@ -213,10 +213,11 @@
x.status = 'done'; //没有则不会展示下载按钮
x.url = x.fileUrl;
x.thumbUrl = x.thUrl;
+ x.fileSize = x.fileSize
});
emit('update:value', folderId.value);
- emit('change');
+ emit('change', fileList.value);
loading.value = false;
} catch (error) {
console.error(error);
@@ -379,6 +380,12 @@
downloadByUrl({ url: res.url, fileName: res.name || 'files.zip' });
}
}
+ function getValue () {
+ return fileList.value
+ }
+ defineExpose({
+ getValue
+ });
diff --git a/src/views/secondDev/approveFlowPage.vue b/src/views/secondDev/approveFlowPage.vue
index 91d456f..0d5bc0d 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 =
@@ -380,12 +393,16 @@
async function onApproveClick(isAutoAgreeBreak = false) {
try {
openSpinning();
- if (!isAutoAgreeBreak) {
- await submit();
- }
- if (!validateSuccess.value) {
- closeSpinning();
- return;
+ if (!customFormConfig.codeList.includes(curPageCode.value)) {
+ if (!isAutoAgreeBreak) {
+ await submit();
+ }
+ if (!validateSuccess.value) {
+ closeSpinning();
+ return;
+ }
+ } else {
+ validateSuccess.value = true
}
const params = await getApproveParams();
const nextNodes = await postGetNextTaskMaybeArrival(params);
@@ -570,10 +587,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;
@@ -667,9 +685,20 @@
async function getApproveParams() {
try {
+ let formModels = {}
+ let system = {}
+ let fileFolderIds = []
+ if (!customFormConfig.codeList.includes(curPageCode.value)) {
let formModels = await formInformation.value.getFormModels();
let system = formInformation.value.getSystemType();
let fileFolderIds = getUploadFileFolderIds(formModels);
+ } else {
+ let value = await formInformation.value.getFormValue();
+ let key = data.formInfos[0]?.formConfig?.key
+ formModels[key] = value
+ system[key] = false
+ fileFolderIds = []
+ }
return {
approvedType: approvalData.approvedType,
approvedResult: approvalData.approvedResult, // approvalData.approvedType 审批结果 如果为 4 就需要传buttonCode
@@ -694,13 +723,16 @@
try {
if (validateSuccess.value || values === 'reject' || values === 'finish' || values === 'disagree') {
let params = await getApproveParams();
+ openSpinning()
let response = await postApproval(params);
+ closeSpinning()
// 判断返回值是否带有isAutoAgree 来判断中间是否有自动审批的业务,如有再执行判断待审人员是否包含自己,不包含就直接flowSuccess
if (checkIsAutoAgree(response)) return;
flowSuccess();
data.submitLoading = false;
}
} catch (error) {
+ closeSpinning()
flowFail();
throw new Error(error);
}
diff --git a/src/views/secondDev/createFlow.vue b/src/views/secondDev/createFlow.vue
index c2b8a35..5aedb74 100644
--- a/src/views/secondDev/createFlow.vue
+++ b/src/views/secondDev/createFlow.vue
@@ -16,7 +16,10 @@
提交
-
+
+ 保存
+
+
@@ -29,10 +32,19 @@
流程图
+
-
+
+
@@ -53,8 +65,8 @@
import ProcessInformation from '/@/views/workflow/task/components/flow/ProcessInformation.vue';
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 { CloseOutlined, SendOutlined, ClockCircleOutlined, PrinterOutlined, ApartmentOutlined, SaveOutlined, DownloadOutlined, UploadOutlined } from '@ant-design/icons-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 +74,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 +143,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 +163,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 +297,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
@@ -290,8 +325,118 @@
draftId: rDraftsId.value
};
}
+ async function onSave() {
+ let value = await formInformation.value.handleSubmit(true);
+ }
+ 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();
+ 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..c3ffe97 100644
--- a/src/views/workflow/task/components/ApprovalProcess.vue
+++ b/src/views/workflow/task/components/ApprovalProcess.vue
@@ -10,6 +10,8 @@
import('./flow/ApproveUser.vue'));
const AddOrSubtract = defineAsyncComponent(() => import('./flow/AddOrSubtract.vue'));
@@ -143,12 +146,14 @@
schemaId: string;
processId: string;
taskId: string;
+ id: string;
visible?: boolean;
}>(),
{
schemaId: '',
processId: '',
taskId: '',
+ id: '',
visible: false
}
);
@@ -210,7 +215,8 @@
return ele.taskId;
});
});
-
+ const curPageCode = ref()
+ const id = ref()
// 审批
async function approval() {
showLoading.value = true;
@@ -218,9 +224,11 @@
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;
+ approvalData.buttonConfigs = res.buttonConfigs || [];
}
if (res.relationTasks) {
data.predecessorTasks = res.relationTasks;
@@ -290,12 +298,27 @@
return fileFolderIds;
}
const onFinish = async (values: any) => {
- await submit();
+ if (!customFormConfig.codeList.includes(curPageCode.value)) {
+ await submit();
+ } else {
+ validateSuccess.value = true
+ }
try {
if (validateSuccess.value) {
- let formModels = await formInformation.value.getFormModels();
- let system = formInformation.value.getSystemType();
- let fileFolderIds: Array = getUploadFileFolderIds(formModels);
+ let formModels = {}
+ let system = {}
+ let fileFolderIds = []
+ if (!customFormConfig.codeList.includes(curPageCode.value)) {
+ let formModels = await formInformation.value.getFormModels();
+ let system = formInformation.value.getSystemType();
+ let fileFolderIds: Array = getUploadFileFolderIds(formModels);
+ } else {
+ let value = await formInformation.value.getCustomFormValue()
+ let key = data.formInfos[0]?.formConfig?.key
+ formModels[key] = value
+ system[key] = false
+ fileFolderIds = []
+ }
let params: PostApprovalData = {
approvedType: approvalData.approvedType,
approvedResult: approvalData.approvedResult, // approvalData.approvedType 审批结果 如果为 4 就需要传buttonCode
@@ -363,6 +386,8 @@
data.submitLoading = false;
notificationError(t('审批流程'), t('表单校验未通过'));
}
+ } else {
+ data.submitLoading = false;
}
} catch (error) {
data.submitLoading = false;
diff --git a/src/views/workflow/task/components/flow/FormInformation.vue b/src/views/workflow/task/components/flow/FormInformation.vue
index 6f33776..946eee6 100644
--- a/src/views/workflow/task/components/flow/FormInformation.vue
+++ b/src/views/workflow/task/components/flow/FormInformation.vue
@@ -26,17 +26,22 @@
@@ -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,8 @@
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 customerFormRef = ref(null)
const { t } = useI18n();
const props = withDefaults(
defineProps<{
@@ -71,13 +78,17 @@
opinionsComponents?: Array | undefined;
formAssignmentData?: null | Recordable;
processId: string;
+ curPageCode: string;
+ id: string;
}>(),
{
disabled: false,
formInfos: () => {
return [];
},
- processId: ''
+ processId: '',
+ curPageCode: '',
+ id: ''
}
);
@@ -143,6 +154,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 = {};
@@ -389,7 +410,21 @@
itemRefs.value[activeIndex.value].setDisabledForm(false);
forms.modes[activeIndex.value] = 'edit';
}
-
+ const getCustomFormValue = async () => {
+ await nextTick()
+ if (!customerFormRef.value) {
+ message.error('表单组件正在加载,请稍后')
+ return
+ }
+ let value = {}
+ if (Array.isArray(customerFormRef.value)) {
+ value = customerFormRef.value[0].getFormValue()
+ } else {
+ value = customerFormRef.value.getFormValue()
+ }
+ return value
+
+ }
defineExpose({
validateForm,
getFormModels,
@@ -400,7 +435,8 @@
handleEdit,
handleSave,
handleCancel,
- handleDelete
+ handleDelete,
+ getCustomFormValue
});
@@ -514,7 +550,7 @@
}
.top-toolbar {
- min-height: 44px;
+ // min-height: 44px;
margin-bottom: 12px;
border-bottom: 1px solid #eee;
}
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) {}
});