diff --git a/package.json b/package.json index 98cbf78e..e2fe75f9 100644 --- a/package.json +++ b/package.json @@ -144,6 +144,7 @@ "url": "https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues" }, "homepage": "https://gitee.com/yudaocode/yudao-ui-admin-vue3", + "web-types": "./web-types.json", "engines": { "node": ">= 16.0.0", "pnpm": ">=8.6.0" diff --git a/src/api/login/oauth2/index.ts b/src/api/login/oauth2/index.ts index aef1820d..f4a67fbe 100644 --- a/src/api/login/oauth2/index.ts +++ b/src/api/login/oauth2/index.ts @@ -27,7 +27,7 @@ export const authorize = ( return request.post({ url: '/system/oauth2/authorize', headers: { - 'Content-type': 'application/x-www-form-urlencoded' + 'Content-Type': 'application/x-www-form-urlencoded' }, params: { response_type: responseType, diff --git a/src/components/FormCreate/src/components/useApiSelect.tsx b/src/components/FormCreate/src/components/useApiSelect.tsx index 29cd3027..8ff95fb0 100644 --- a/src/components/FormCreate/src/components/useApiSelect.tsx +++ b/src/components/FormCreate/src/components/useApiSelect.tsx @@ -185,7 +185,6 @@ export const useApiSelect = (option: ApiSelectProps) => { ) } - debugger return ( > + fieldsPermission?: Array> // 审批任务超时处理 timeoutHandler?: TimeoutHandler // 审批任务拒绝处理 @@ -97,7 +97,7 @@ export interface SimpleFlowNode { // 是否默认的条件 defaultFlow?: boolean // 活动的状态,用于前端节点状态展示 - activityStatus? : TaskStatusEnum + activityStatus?: TaskStatusEnum } // 候选人策略枚举 ( 用于审批节点。抄送节点 ) export enum CandidateStrategy { @@ -145,6 +145,14 @@ export enum CandidateStrategy { * 指定用户组 */ USER_GROUP = 40, + /** + * 表单内用户字段 + */ + FORM_USER = 50, + /** + * 表单内部门负责人 + */ + FORM_DEPT_LEADER = 51, /** * 流程表达式 */ @@ -424,6 +432,8 @@ export const CANDIDATE_STRATEGY: DictDataVO[] = [ { label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER }, { label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER }, { label: '用户组', value: CandidateStrategy.USER_GROUP }, + { label: '表单内用户字段', value: CandidateStrategy.FORM_USER }, + { label: '表单内部门负责人', value: CandidateStrategy.FORM_DEPT_LEADER }, { label: '流程表达式', value: CandidateStrategy.EXPRESSION } ] // 审批节点 的审批类型 @@ -548,3 +558,13 @@ export const MULTI_LEVEL_DEPT: DictDataVO = [ { label: '第 14 级部门', value: 14 }, { label: '第 15 级部门', value: 15 } ] + +/** + * 流程实例的变量枚举 + */ +export enum ProcessVariableEnum { + /** + * 发起用户 ID + */ + START_USER_ID = 'PROCESS_START_USER_ID' +} diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts index d10173bb..06612d44 100644 --- a/src/components/SimpleProcessDesignerV2/src/node.ts +++ b/src/components/SimpleProcessDesignerV2/src/node.ts @@ -14,7 +14,8 @@ import { NODE_DEFAULT_NAME, AssignStartUserHandlerType, AssignEmptyHandlerType, - FieldPermissionType + FieldPermissionType, + ProcessVariableEnum } from './consts' export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref { const node = ref(props.flowNode) @@ -27,12 +28,68 @@ export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref { + const result: Array> = [] + if (formFields) { + formFields.forEach((fieldStr: string) => { + parseFields(JSON.parse(fieldStr), result) + }) + } + // 固定添加发起人 ID 字段 + result.unshift({ + field: ProcessVariableEnum.START_USER_ID, + title: '发起人', + type: 'UserSelect', + required: true + }) + return result +} + +// TODO @jason:parse 方法,是不是搞到 formCreate.ts。统一维护管理 +const parseFields = ( + rule: Record, + fields: Array>, + parentTitle: string = '' +) => { + const { type, field, $required, title: tempTitle, children } = rule + if (field && tempTitle) { + let title = tempTitle + if (parentTitle) { + title = `${parentTitle}.${tempTitle}` + } + // TODO @jason:按照微信讨论的,非 $required 显示,但是 disable 不可选择 + let required = false + if ($required) { + required = true + } + fields.push({ + field, + title, + type, + required + }) + // TODO 子表单 需要处理子表单字段 + // if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) { + // // 解析子表单的字段 + // rule.props.rule.forEach((item) => { + // parseFields(item, fieldsPermission, title) + // }) + // } + } + if (children && Array.isArray(children)) { + children.forEach((rule) => { + parseFields(rule, fields) + }) + } +} + /** * @description 表单数据权限配置,用于发起人节点 、审批节点、抄送节点 */ export function useFormFieldsPermission(defaultPermission: FieldPermissionType) { // 字段权限配置. 需要有 field, title, permissioin 属性 - const fieldsPermissionConfig = ref>>([]) + const fieldsPermissionConfig = ref>>([]) const formType = inject>('formType') // 表单类型 @@ -45,49 +102,26 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType) } // 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读 const getDefaultFieldsPermission = (formFields?: string[]) => { - const defaultFieldsPermission: Array> = [] + let defaultFieldsPermission: Array> = [] if (formFields) { - formFields.forEach((fieldStr: string) => { - parseFieldsSetDefaultPermission(JSON.parse(fieldStr), defaultFieldsPermission) + defaultFieldsPermission = parseFormCreateFields(formFields).map((item) => { + return { + field: item.field, + title: item.title, + permission: defaultPermission + } }) } return defaultFieldsPermission } - // 解析字段。赋给默认权限 - const parseFieldsSetDefaultPermission = ( - rule: Record, - fieldsPermission: Array>, - parentTitle: string = '' - ) => { - const { /**type,*/ field, title: tempTitle, children } = rule - if (field && tempTitle) { - let title = tempTitle - if (parentTitle) { - title = `${parentTitle}.${tempTitle}` - } - fieldsPermission.push({ - field, - title, - permission: defaultPermission - }) - // TODO 子表单 需要处理子表单字段 - // if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) { - // // 解析子表单的字段 - // rule.props.rule.forEach((item) => { - // parseFieldsSetDefaultPermission(item, fieldsPermission, title) - // }) - // } - } - if (children && Array.isArray(children)) { - children.forEach((rule) => { - parseFieldsSetDefaultPermission(rule, fieldsPermission) - }) - } - } + + // 获取表单的所有字段,作为下拉框选项 + const formFieldOptions = parseFormCreateFields(unref(formFields)) return { formType, fieldsPermissionConfig, + formFieldOptions, getNodeConfigFormFields } } @@ -95,50 +129,8 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType) * @description 获取表单的字段 */ export function useFormFields() { - // 解析后的表单字段 const formFields = inject>('formFields') // 流程表单字段 - const parseFormFields = () => { - const parsedFormFields: Array> = [] - if (formFields) { - formFields.value.forEach((fieldStr: string) => { - parseField(JSON.parse(fieldStr), parsedFormFields) - }) - } - return parsedFormFields - } - // 解析字段。 - const parseField = ( - rule: Record, - parsedFormFields: Array>, - parentTitle: string = '' - ) => { - const { field, title: tempTitle, children, type } = rule - if (field && tempTitle) { - let title = tempTitle - if (parentTitle) { - title = `${parentTitle}.${tempTitle}` - } - parsedFormFields.push({ - field, - title, - type - }) - // TODO 子表单 需要处理子表单字段 - // if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) { - // // 解析子表单的字段 - // rule.props.rule.forEach((item) => { - // parseFieldsSetDefaultPermission(item, fieldsPermission, title) - // }) - // } - } - if (children && Array.isArray(children)) { - children.forEach((rule) => { - parseField(rule, parsedFormFields) - }) - } - } - - return parseFormFields() + return parseFormCreateFields(unref(formFields)) } export type UserTaskFormType = { @@ -152,6 +144,8 @@ export type UserTaskFormType = { userGroups?: number[] // 用户组 postIds?: number[] // 岗位 expression?: string // 流程表达式 + userFieldOnForm?: string // 表单内用户字段 + deptFieldOnForm?: string // 表单内部门字段 approveRatio?: number rejectHandlerType?: RejectHandlerType returnNodeId?: string @@ -174,6 +168,8 @@ export type CopyTaskFormType = { userIds?: number[] // 用户 userGroups?: number[] // 用户组 postIds?: number[] // 岗位 + userFieldOnForm?: string // 表单内用户字段 + deptFieldOnForm?: string // 表单内部门字段 expression?: string // 流程表达式 } @@ -187,6 +183,7 @@ export function useNodeForm(nodeType: NodeType) { const deptOptions = inject>('deptList') // 部门列表 const userGroupOptions = inject>('userGroupList') // 用户组列表 const deptTreeOptions = inject('deptTree') // 部门树 + const formFields = inject>('formFields') // 流程表单字段 const configForm = ref() if (nodeType === NodeType.USER_TASK_NODE) { configForm.value = { @@ -282,6 +279,18 @@ export function useNodeForm(nodeType: NodeType) { } } + // 表单内用户字段 + if (configForm.value?.candidateStrategy === CandidateStrategy.FORM_USER) { + const formFieldOptions = parseFormCreateFields(unref(formFields)) + const item = formFieldOptions.find((item) => item.field === configForm.value?.userFieldOnForm) + showText = `表单用户:${item?.title}` + } + + // 表单内部门负责人 + if (configForm.value?.candidateStrategy === CandidateStrategy.FORM_DEPT_LEADER) { + showText = `表单内部门负责人` + } + // 发起人自选 if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER_SELECT) { showText = `发起人自选` @@ -328,6 +337,9 @@ export function useNodeForm(nodeType: NodeType) { case CandidateStrategy.USER_GROUP: candidateParam = configForm.value.userGroups!.join(',') break + case CandidateStrategy.FORM_USER: + candidateParam = configForm.value.userFieldOnForm! + break case CandidateStrategy.EXPRESSION: candidateParam = configForm.value.expression! break @@ -347,6 +359,13 @@ export function useNodeForm(nodeType: NodeType) { candidateParam = deptIds.concat('|' + configForm.value.deptLevel + '') break } + // 表单内部门的负责人 + case CandidateStrategy.FORM_DEPT_LEADER: { + // 候选人参数格式: | 分隔 。左边为表单内部门字段。 右边为部门层级 + const deptFieldOnForm = configForm.value.deptFieldOnForm! + candidateParam = deptFieldOnForm.concat('|' + configForm.value.deptLevel + '') + break + } default: break } @@ -376,6 +395,9 @@ export function useNodeForm(nodeType: NodeType) { case CandidateStrategy.USER_GROUP: configForm.value.userGroups = candidateParam.split(',').map((item) => +item) break + case CandidateStrategy.FORM_USER: + configForm.value.userFieldOnForm = candidateParam + break case CandidateStrategy.EXPRESSION: configForm.value.expression = candidateParam break @@ -396,6 +418,14 @@ export function useNodeForm(nodeType: NodeType) { configForm.value.deptLevel = +paramArray[1] break } + // 表单内的部门负责人 + case CandidateStrategy.FORM_DEPT_LEADER: { + // 候选人参数格式: | 分隔 。左边为表单内的部门字段。 右边为部门层级 + const paramArray = candidateParam.split('|') + configForm.value.deptFieldOnForm = paramArray[0] + configForm.value.deptLevel = +paramArray[1] + break + } default: break } @@ -481,22 +511,22 @@ export function useNodeName2(node: Ref, nodeType: NodeType) { /** * @description 根据节点任务状态,获取节点任务状态样式 */ -export function useTaskStatusClass(taskStatus: TaskStatusEnum | undefined) : string { +export function useTaskStatusClass(taskStatus: TaskStatusEnum | undefined): string { if (!taskStatus) { return '' } - if (taskStatus === TaskStatusEnum.APPROVE ) { + if (taskStatus === TaskStatusEnum.APPROVE) { return 'status-pass' } - if (taskStatus === TaskStatusEnum.RUNNING ) { + if (taskStatus === TaskStatusEnum.RUNNING) { return 'status-running' } - if (taskStatus === TaskStatusEnum.REJECT ) { + if (taskStatus === TaskStatusEnum.REJECT) { return 'status-reject' } - if (taskStatus === TaskStatusEnum.CANCEL ) { + if (taskStatus === TaskStatusEnum.CANCEL) { return 'status-cancel' } - - return ''; + + return '' } diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue index c3006afc..eeb51bd4 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue @@ -60,7 +60,8 @@ - + + + + + + + + + + + + + + + { + let label = '部门负责人来源' + if (configForm.value.candidateStrategy == CandidateStrategy.MULTI_LEVEL_DEPT_LEADER) { + label = label + '(指定部门向上)' + } else { + label = label + '(发起人部门向上)' + } + return label +}) // 抽屉配置 const { settingVisible, closeDrawer, openDrawer } = useDrawer() // 当前节点 @@ -230,9 +289,16 @@ const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.COPY_ // 激活的 Tab 标签页 const activeTabName = ref('user') // 表单字段权限配置 -const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission( - FieldPermissionType.READ -) +const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } = + useFormFieldsPermission(FieldPermissionType.READ) +// 表单内用户字段选项, 必须是必填和用户选择器 +const userFieldOnFormOptions = computed(() => { + return formFieldOptions.filter((item) => item.required && item.type === 'UserSelect') +}) +// 表单内部门字段选项, 必须是必填和部门选择器 +const deptFieldOnFormOptions = computed(() => { + return formFieldOptions.filter((item) => item.required && item.type === 'DeptSelect') +}) // 抄送人表单配置 const formRef = ref() // 表单 Ref // 表单校验规则 @@ -243,6 +309,8 @@ const formRules = reactive({ deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }], userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }], postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }], + userFieldOnForm: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }], + deptFieldOnForm: [{ required: true, message: '表单内部门字段不能为空', trigger: 'change' }], expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }] }) @@ -260,9 +328,7 @@ const { const configForm = tempConfigForm as Ref // 抄送人策略, 去掉发起人自选 和 发起人自己 const copyUserStrategies = computed(() => { - return CANDIDATE_STRATEGY.filter( - (item) => item.value !== CandidateStrategy.START_USER - ) + return CANDIDATE_STRATEGY.filter((item) => item.value !== CandidateStrategy.START_USER) }) // 改变抄送人设置策略 const changeCandidateStrategy = () => { @@ -272,6 +338,7 @@ const changeCandidateStrategy = () => { configForm.value.postIds = [] configForm.value.userGroups = [] configForm.value.deptLevel = 1 + configForm.value.userFieldOnForm = '' } // 保存配置 const saveConfig = async () => { diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue index 899d7045..ebb41278 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue @@ -56,7 +56,6 @@ - - - - - - + + + + + + + + + + + + + + + { let label = '部门负责人来源' if (configForm.value.candidateStrategy == CandidateStrategy.MULTI_LEVEL_DEPT_LEADER) { label = label + '(指定部门向上)' + } else if (configForm.value.candidateStrategy == CandidateStrategy.FORM_DEPT_LEADER) { + label = label + '(表单内部门向上)' } else { label = label + '(发起人部门向上)' } @@ -482,9 +513,16 @@ const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.USER_ // 激活的 Tab 标签页 const activeTabName = ref('user') // 表单字段权限设置 -const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission( - FieldPermissionType.READ -) +const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } = + useFormFieldsPermission(FieldPermissionType.READ) +// 表单内用户字段选项, 必须是必填和用户选择器 +const userFieldOnFormOptions = computed(() => { + return formFieldOptions.filter((item) => item.required && item.type === 'UserSelect') +}) +// 表单内部门字段选项, 必须是必填和部门选择器 +const deptFieldOnFormOptions = computed(() => { + return formFieldOptions.filter((item) => item.required && item.type === 'DeptSelect') +}) // 操作按钮设置 const { buttonsSetting, btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } = useButtonsSetting() @@ -498,6 +536,8 @@ const formRules = reactive({ roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }], deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }], userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }], + userFieldOnForm: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }], + deptFieldOnForm: [{ required: true, message: '表单内部门字段不能为空', trigger: 'change' }], postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }], expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }], approveMethod: [{ required: true, message: '多人审批方式不能为空', trigger: 'change' }], @@ -533,6 +573,9 @@ const changeCandidateStrategy = () => { configForm.value.postIds = [] configForm.value.userGroups = [] configForm.value.deptLevel = 1 + // TODO @jason:是不是 userFieldOnForm => formUser;deptFieldOnForm => formDeptLeader;原因是:想通前缀,好管理点 + configForm.value.userFieldOnForm = '' + configForm.value.deptFieldOnForm = '' configForm.value.approveMethod = ApproveMethodType.SEQUENTIAL_APPROVE } diff --git a/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json b/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json index 4ea632a0..ee8e0d22 100644 --- a/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json +++ b/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json @@ -1211,6 +1211,20 @@ "isAttr": true } ] + }, + { + "name": "AssignStartUserHandlerType", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"] + }, + "properties": [ + { + "name": "value", + "type": "Integer", + "isBody": true + } + ] } ], "emumerations": [] diff --git a/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue b/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue index 86a1cf74..5cd76383 100644 --- a/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue +++ b/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue @@ -54,6 +54,10 @@ + + + + diff --git a/src/components/bpmnProcessDesigner/package/penal/custom-config/ElementCustomConfig.vue b/src/components/bpmnProcessDesigner/package/penal/custom-config/ElementCustomConfig.vue new file mode 100644 index 00000000..d27b2997 --- /dev/null +++ b/src/components/bpmnProcessDesigner/package/penal/custom-config/ElementCustomConfig.vue @@ -0,0 +1,84 @@ + + + + diff --git a/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue b/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue index 33f0bc09..3bb7d660 100644 --- a/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue +++ b/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue @@ -268,9 +268,9 @@ const bpmnInstances = () => (window as any)?.bpmnInstances const resetFormList = () => { bpmnELement.value = bpmnInstances().bpmnElement formKey.value = bpmnELement.value.businessObject.formKey - if (formKey.value?.length > 0) { - formKey.value = parseInt(formKey.value) - } + // if (formKey.value?.length > 0) { + // formKey.value = parseInt(formKey.value) + // } // 获取元素扩展属性 或者 创建扩展属性 elExtensionElements.value = bpmnELement.value.businessObject.get('extensionElements') || diff --git a/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue b/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue index 494b3d97..016cdf6c 100644 --- a/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue +++ b/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue @@ -80,7 +80,7 @@ const resetAttributesList = () => { otherExtensionList.value = [] // 其他扩展配置 bpmnElementProperties.value = // bpmnElement.value.businessObject?.extensionElements?.filter((ex) => { - bpmnElement.value.businessObject?.extensionElements?.values.filter((ex) => { + bpmnElement.value.businessObject?.extensionElements?.values?.filter((ex) => { if (ex.$type !== `${prefix}:Properties`) { otherExtensionList.value.push(ex) } diff --git a/src/config/axios/index.ts b/src/config/axios/index.ts index 79e558da..07719a20 100644 --- a/src/config/axios/index.ts +++ b/src/config/axios/index.ts @@ -5,16 +5,12 @@ import { config } from './config' const { default_headers } = config const request = (option: any) => { - const { url, method, params, data, headersType, responseType, ...config } = option + const { headersType, headers, ...otherOption } = option return service({ - url: url, - method, - params, - data, - ...config, - responseType: responseType, + ...otherOption, headers: { - 'Content-Type': headersType || default_headers + 'Content-Type': headersType || default_headers, + ...headers } }) } diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index 3df813f2..ae3845c0 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -1,10 +1,4 @@ -import axios, { - AxiosError, - AxiosInstance, - AxiosRequestHeaders, - AxiosResponse, - InternalAxiosRequestConfig -} from 'axios' +import axios, { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios' import { ElMessage, ElMessageBox, ElNotification } from 'element-plus' import qs from 'qs' @@ -37,7 +31,11 @@ const whiteList: string[] = ['/login', '/refresh-token'] const service: AxiosInstance = axios.create({ baseURL: base_url, // api 的 base_url timeout: request_timeout, // 请求超时时间 - withCredentials: false // 禁用 Cookie 等信息 + withCredentials: false, // 禁用 Cookie 等信息 + // 自定义参数序列化函数 + paramsSerializer: (params) => { + return qs.stringify(params, { allowDots: true }) + } }) // request拦截器 @@ -52,28 +50,26 @@ service.interceptors.request.use( } }) if (getAccessToken() && !isToken) { - ;(config as Recordable).headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token + config.headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token } // 设置租户 if (tenantEnable && tenantEnable === 'true') { const tenantId = getTenantId() - if (tenantId) (config as Recordable).headers['tenant-id'] = tenantId + if (tenantId) config.headers['tenant-id'] = tenantId } - const params = config.params || {} - const data = config.data || false - if ( - config.method?.toUpperCase() === 'POST' && - (config.headers as AxiosRequestHeaders)['Content-Type'] === - 'application/x-www-form-urlencoded' - ) { - config.data = qs.stringify(data) + const method = config.method?.toUpperCase() + // 防止 GET 请求缓存 + if (method === 'GET') { + config.headers['Cache-Control'] = 'no-cache' + config.headers['Pragma'] = 'no-cache' } - // get参数编码 - if (config.method?.toUpperCase() === 'GET' && params) { - config.params = {} - const paramsStr = qs.stringify(params, { allowDots: true }) - if (paramsStr) { - config.url = config.url + '?' + paramsStr + // 自定义参数序列化函数 + else if (method === 'POST') { + const contentType = config.headers['Content-Type'] || config.headers['content-type'] + if (contentType === 'application/x-www-form-urlencoded') { + if (config.data && typeof config.data !== 'string') { + config.data = qs.stringify(config.data) + } } } return config diff --git a/src/layout/components/Setting/src/Setting.vue b/src/layout/components/Setting/src/Setting.vue index 306cb238..2973674b 100644 --- a/src/layout/components/Setting/src/Setting.vue +++ b/src/layout/components/Setting/src/Setting.vue @@ -297,5 +297,6 @@ $prefix-cls: #{$namespace}-setting; .#{$prefix-cls} { border-radius: 6px 0 0 6px; + z-index: 1200;/*修正没有z-index会被表格层覆盖,值不要超过4000*/ } diff --git a/src/views/bpm/form/index.vue b/src/views/bpm/form/index.vue index 3d542c80..46edd8f9 100644 --- a/src/views/bpm/form/index.vue +++ b/src/views/bpm/form/index.vue @@ -143,8 +143,9 @@ const openForm = (id?: number) => { const toRouter: { name: string; query?: { id: number } } = { name: 'BpmFormEditor' } + console.log(typeof id) // 表单新建的时候id传的是event需要排除 - if (typeof id === 'number') { + if (typeof id === 'number' || typeof id === 'string') { toRouter.query = { id } diff --git a/src/views/bpm/processInstance/create/index.vue b/src/views/bpm/processInstance/create/index.vue index a3bf143b..284cbdb7 100644 --- a/src/views/bpm/processInstance/create/index.vue +++ b/src/views/bpm/processInstance/create/index.vue @@ -85,7 +85,7 @@