commit:修复工作流bug,修复builder报错

This commit is contained in:
Jerry
2024-07-24 17:43:48 +08:00
parent 51ff5033e1
commit bb01172492
77 changed files with 391 additions and 455 deletions

View File

@@ -391,17 +391,10 @@ const onAggregationTableIdChange = () => {
currentColumn.value.objectFieldType = undefined;
}
if (aggregationRelation.value) {
if (
Array.isArray(aggregationRelation.value.columnList) &&
aggregationRelation.value.columnList.length > 0
) {
aggregationColumnList.value = aggregationRelation.value.columnList;
} else {
loadOnlineTableColumnList(aggregationRelation.value.tableId).catch(e => {
console.warn(e);
});
}
if (aggregationRelation.value && currentColumn.value) {
loadOnlineTableColumnList(currentColumn.value.aggregationTableId).catch(e => {
console.warn(e);
});
}
};
const onAggregationColumnIdChange = () => {

View File

@@ -220,7 +220,6 @@ const getValidColumnList = computed(() => {
data.value.widgetType,
formType.value,
);
console.log(disabled, warningMsg, item);
// 查询页面仅能选择支持过滤的字段
if (
!disabled &&

View File

@@ -1189,11 +1189,8 @@ defineExpose({
.design-box {
display: flex;
justify-content: center;
// background: white;
width: 100%;
height: calc(100% - 48px);
// border: 1px solid #E8E8E8;
// padding: 25px;
}
}
.attribute-panel {

View File

@@ -377,7 +377,7 @@
header-cell-class-name="table-header-gray"
height="300px"
>
<vxe-column title="选择" header-align="center" align="center" width="50px">
<vxe-column title="选择" header-align="center" align="center" width="60px">
<template v-slot="scope">
<el-radio :value="scope.row.dictCode"> </el-radio>
</template>

View File

@@ -90,7 +90,6 @@ const layoutStore = useLayoutStore();
const props = defineProps<{
deptId?: string;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}>();

View File

@@ -54,7 +54,6 @@ const props = defineProps<{
columnName?: string;
showOrder?: number;
icon?: string;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<T>;
}>();

View File

@@ -211,7 +211,6 @@ const props = defineProps<{
parentId?: string;
menuList: MenuItem[];
rowData?: MenuItem;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}>();

View File

@@ -75,7 +75,6 @@ const layoutStore = useLayoutStore();
const props = defineProps<{
postId?: string;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}>();

View File

@@ -86,7 +86,6 @@ const layoutStore = useLayoutStore();
const props = defineProps<{
rowData?: Role;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}>();

View File

@@ -145,7 +145,6 @@ const layoutStore = useLayoutStore();
const props = defineProps<{
rowData?: User;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}>();

View File

@@ -131,7 +131,6 @@ const layoutStore = useLayoutStore();
const props = defineProps<{
dataPermId: string | number;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
}>();
const formItemSize = computed(() => {
return layoutStore.defaultFormItemSize;

View File

@@ -114,7 +114,6 @@ const layoutStore = useLayoutStore();
interface IProps extends ThirdProps {
deptId: string;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}

View File

@@ -255,10 +255,10 @@ import { ANY_OBJECT } from '@/types/generic';
import FormEditGlobalDict from '@/pages/upms/formEditGlobalDict/index.vue';
import FormEditDictData from '@/pages/upms/formEditDictData/index.vue';
import { treeDataTranslate } from '@/common/utils';
import { useLayoutStore } from '@/store';
import { useDialog } from '@/components/Dialog/useDialog';
const Dialog = useDialog();
import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();
const mainContextHeight = inject('mainContextHeight', 200);
const { checkPermCodeExist } = usePermissions();

View File

@@ -84,7 +84,7 @@
:size="layoutStore.defaultFormItemSize"
:tree-config="{ rowField: 'menuId', parentField: 'parentId' }"
@refresh="initFormData"
class="border-bottom-0"
class="border-bottom-0 page-table"
>
<template v-slot:operator>
<el-button
@@ -173,7 +173,6 @@ import { MenuItem } from '@/types/upms/menu';
import { SystemMenuController } from '@/api/system';
import { useLayoutStore } from '@/store';
import { useMenuTools } from './hooks';
const { checkPermCodeExist } = usePermissions();
const activeFragment = ref('fragmentSysColumn');
const currentColumnId: Ref<string | undefined> = ref();

View File

@@ -133,11 +133,19 @@ const formData = reactive({
onMounted(() => {
const log = { ...props.rowData };
if (props.rowData.requestArguments) {
log.requestArguments = JSON.parse(props.rowData.requestArguments.toString()) || {};
try {
log.requestArguments = JSON.parse(props.rowData.requestArguments.toString()) || {};
} catch (e) {
log.requestArguments = props.rowData.requestArguments;
}
}
log.requestArguments = log.requestArguments || {};
if (props.rowData.responseResult) {
log.responseResult = JSON.parse(props.rowData.responseResult.toString()) || {};
try {
log.responseResult = JSON.parse(props.rowData.responseResult.toString()) || {};
} catch (e) {
log.responseResult = props.rowData.responseResult;
}
}
log.responseResult = log.responseResult || {};
formData.formViewSysOperationLog = log;

View File

@@ -128,7 +128,6 @@ const layoutStore = useLayoutStore();
const props = defineProps<{
roleId: string | number;
defaultFormItemSize: Ref<'' | 'default' | 'small' | 'large'>;
}>();
const formItemSize = computed(() => {

View File

@@ -173,7 +173,7 @@ const layoutStore = useLayoutStore();
const Dialog = useDialog();
const mainContextHeight = inject('mainContextHeight', 200);
const form = ref();
const deptIdPath = ref([]);
const deptIdPath = ref<Array<string | number>>([]);
const deptOptions = { value: 'id', label: 'name', checkStrictly: true };

View File

@@ -125,7 +125,9 @@ import { Dialog } from '@/components/Dialog';
import { SysFlowCopyForType } from '@/common/staticDict/flow';
import { useThirdParty } from '@/components/thirdParty/hooks';
import { ThirdProps } from '@/components/thirdParty/types';
import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();
interface IProps extends ThirdProps {
deptList: ANY_OBJECT[];
postList: ANY_OBJECT[];
@@ -136,8 +138,6 @@ interface IProps extends ThirdProps {
}
const props = defineProps<IProps>();
const { thirdParams, onCloseThirdDialog } = useThirdParty(props);
import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();
const deptId = ref<string>();
const selectDeptList = ref<ANY_OBJECT[]>([]);
const formData = ref<ANY_OBJECT>({

View File

@@ -400,7 +400,6 @@ onUnmounted(() => {
}
.copy-select :deep(.el-tag) {
//margin-right: 10px;
margin-right: 8px;
}

View File

@@ -196,7 +196,7 @@ const props = withDefaults(
// 当前任务节点名称
taskName?: string;
// 当前任务节点操作列表
operationList?: Array<ANY_OBJECT>;
operationList?: Array<ANY_OBJECT> | string;
}>(),
{
isDraft: false,
@@ -219,8 +219,11 @@ const copyItemList = ref<ANY_OBJECT[]>([]);
const assigneeList = ref<ANY_OBJECT[]>([]);
const flowOperationList = computed<ANY_OBJECT[]>(() => {
if (Array.isArray(props.operationList)) {
return props.operationList.map(item => {
const operationList = Array.isArray(props.operationList)
? props.operationList
: JSON.parse(props.operationList || '[]');
if (Array.isArray(operationList)) {
return operationList.map(item => {
if (item.type === SysFlowTaskOperationType.MULTI_SIGN && item.multiSignAssignee != null) {
let multiSignAssignee = {
...item.multiSignAssignee,
@@ -443,7 +446,6 @@ onMounted(() => {
<style lang="scss">
@import url('../package/theme/index.scss');
// 边框被 token-simulation 样式覆盖了
.djs-palette {
background: var(--palette-background-color);
border: solid 1px var(--palette-border-color) !important;
@@ -546,7 +548,6 @@ onMounted(() => {
}
}
//侧边栏配置
.djs-palette.open {
.djs-palette-entries {
div[class^='bpmn-icon-']:before,
@@ -598,9 +599,7 @@ pre {
font-family: Consolas, Monaco, monospace;
}
// 流程图
.djs-container {
//
.djs-visual {
rect,
polygon,
@@ -617,17 +616,13 @@ pre {
stroke: #333333 !important;
}
}
// 线
.djs-visual path {
stroke: #333333 !important;
}
// 实心箭头
[id^='sequenceflow-end-white-black'] path {
fill: #333333 !important;
stroke: #333333 !important;
}
// 空心箭头
[id^='conditional-flow-marker-white-black'] path {
stroke: #333333 !important;
}

View File

@@ -85,7 +85,6 @@ defineExpose({
<style lang="scss">
@import url('../package/theme/index.scss');
// 边框被 token-simulation 样式覆盖了
.djs-palette {
background: var(--palette-background-color);
border: solid 1px var(--palette-border-color) !important;
@@ -187,8 +186,6 @@ defineExpose({
}
}
}
//侧边栏配置
.djs-palette.open {
.djs-palette-entries {
div[class^='bpmn-icon-']:before,
@@ -239,10 +236,7 @@ pre {
.hljs * {
font-family: Consolas, Monaco, monospace;
}
// 流程图
.djs-container {
// 框
.djs-visual {
rect,
polygon,
@@ -259,17 +253,13 @@ pre {
stroke: #333333 !important;
}
}
// 线
.djs-visual path {
stroke: #333333 !important;
}
// 实心箭头
[id^='sequenceflow-end-white-black'] path {
fill: #333333 !important;
stroke: #333333 !important;
}
// 空心箭头
[id^='conditional-flow-marker-white-black'] path {
stroke: #333333 !important;
}

View File

@@ -442,7 +442,6 @@ $current-color: #409eff;
.process-viewer .djs-palette {
display: none;
}
// 边框被 token-simulation 样式覆盖了
.djs-palette {
background: var(--palette-background-color);
border: solid 1px var(--palette-border-color) !important;
@@ -544,8 +543,6 @@ $current-color: #409eff;
}
}
}
//侧边栏配置
.djs-palette.open {
.djs-palette-entries {
div[class^='bpmn-icon-']:before,
@@ -596,10 +593,7 @@ pre {
.hljs * {
font-family: Consolas, Monaco, monospace;
}
// 流程图
.djs-container {
// 框
.djs-visual {
rect,
polygon,
@@ -616,17 +610,13 @@ pre {
stroke: #333333 !important;
}
}
// 线
.djs-visual path {
stroke: #333333 !important;
}
// 实心箭头
[id^='sequenceflow-end-white-black'] path {
fill: #333333 !important;
stroke: #333333 !important;
}
// 空心箭头
[id^='conditional-flow-marker-white-black'] path {
stroke: #333333 !important;
}

View File

@@ -266,7 +266,6 @@ watch(
<style lang="scss">
@import url('../../package/theme/index.scss');
// 边框被 token-simulation 样式覆盖了
.djs-palette {
background: var(--palette-background-color);
border: solid 1px var(--palette-border-color) !important;
@@ -368,8 +367,6 @@ watch(
}
}
}
//侧边栏配置
.djs-palette.open {
.djs-palette-entries {
div[class^='bpmn-icon-']:before,
@@ -420,10 +417,7 @@ pre {
.hljs * {
font-family: Consolas, Monaco, monospace;
}
// 流程图
.djs-container {
// 框
.djs-visual {
rect,
polygon,
@@ -440,17 +434,13 @@ pre {
stroke: #333333 !important;
}
}
// 线
.djs-visual path {
stroke: #333333 !important;
}
// 实心箭头
[id^='sequenceflow-end-white-black'] path {
fill: #333333 !important;
stroke: #333333 !important;
}
// 空心箭头
[id^='conditional-flow-marker-white-black'] path {
stroke: #333333 !important;
}

View File

@@ -125,12 +125,14 @@ import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();
interface IProps extends ThirdProps {
flowEntry?: ANY_OBJECT | undefined;
flowEntry: ANY_OBJECT;
// 当使用Dialog.show弹出组件时须定义该prop属性以便对dialog进行回调
dialog?: DialogProp<ANY_OBJECT>;
}
const props = withDefaults(defineProps<IProps>(), {
flowEntry: undefined,
flowEntry: () => {
return {};
},
});
const { thirdParams } = useThirdParty(props);
const formItemSize = computed(() => {

View File

@@ -8,8 +8,8 @@
:taskId="dialogParams.taskId"
:taskName="dialogParams.taskName"
:operationList="dialogParams.operationList"
:isRuntime="dialogParams.isRuntime"
:isDraft="dialogParams.isDraft"
:isRuntime="isRuntime"
:isDraft="isDraft"
@close="handlerClose"
@start="handlerStart"
@submit="handlerOperation"
@@ -22,20 +22,24 @@
style="width: 100%"
:style="{ height: mainContextHeight - 188 + 'px' }"
:formId="dialogParams.formId"
:readOnly="isReadOnly"
:readOnly="readOnly"
:flowInfo="getFlowInfo"
/>
<!-- 路由页面 -->
<router-view
ref="routerFlowForm"
style="width: 100%"
:isRuntimeTask="dialogParams.isRuntime"
:isDraft="dialogParams.isDraft"
:readOnly="dialogParams.readOnly"
:processInstanceId="dialogParams.processInstanceId"
:taskId="dialogParams.taskId"
:taskVariableList="dialogParams.variableList"
/>
<router-view v-slot:="{ Component, route }">
<component
:is="Component"
ref="routerFlowForm"
:key="route.path"
style="width: 100%"
:isRuntimeTask="isRuntime"
:isDraft="isDraft"
:readOnly="readOnly"
:processInstanceId="dialogParams.processInstanceId"
:taskId="dialogParams.taskId"
:taskVariableList="variableList"
/>
</router-view>
</HandlerFlowTask>
</template>
@@ -73,11 +77,28 @@ const { handlerFlowTaskRef, preHandlerOperation, submitConsign, handlerClose, di
const isOnlineForm = computed(() => {
return !!dialogParams.value.formId;
});
const isReadOnly = computed(() => {
return typeof dialogParams.value.readOnly === 'string'
? dialogParams.value.readOnly === 'true'
: dialogParams.value.readOnly;
const isDraft = computed(() => {
return typeof dialogParams.isDraft === 'string'
? dialogParams.isDraft === 'true'
: dialogParams.isDraft;
});
const isPreview = computed(() => {
return typeof dialogParams.isPreview === 'string'
? dialogParams.isPreview === 'true'
: dialogParams.isPreview;
});
const isRuntime = computed(() => {
return typeof dialogParams.isRuntime === 'string'
? dialogParams.isRuntime === 'true'
: dialogParams.isRuntime;
});
const readOnly = computed(() => {
return typeof dialogParams.readOnly === 'string'
? dialogParams.readOnly === 'true'
: dialogParams.readOnly;
});
const getFlowInfo = computed(() => {
return {
processInstanceId: dialogParams.value.processInstanceId,
@@ -85,10 +106,15 @@ const getFlowInfo = computed(() => {
processDefinitionKey: dialogParams.value.processDefinitionKey,
processInstanceInitiator: dialogParams.value.processInstanceInitiator,
messageId: dialogParams.value.messageId,
isRuntime: dialogParams.value.isRuntime,
isDraft: dialogParams.value.isDraft,
isRuntime: isRuntime.value,
isDraft: isDraft.value,
};
});
const variableList = computed(() => {
let temp = dialogParams.value.variableList;
const variableList = Array.isArray(temp) ? temp : JSON.parse(temp || '[]');
return variableList;
});
const messageStore = useMessage();
@@ -107,20 +133,21 @@ const getRouterCompomentFunction = (functionName: string) => {
*/
const getMasterData = (
operationType: string,
assignee: string | undefined,
assignee: string | Array<string> | undefined,
): Promise<ANY_OBJECT> => {
return new Promise((resolve, reject) => {
// TODO workflowFormRef.value.getFormData无须判断
if (isOnlineForm.value && workflowFormRef.value.getFormData) {
workflowFormRef.value
.getFormData(false, dialogParams.value.variableList)
.getFormData(false, variableList)
.then((formData: ANY_OBJECT | null) => {
console.log('handleerFlowTask.getMasterData 表单数据', formData);
if (formData == null) {
reject();
return;
}
const assigneeArr = assignee && assignee !== '' ? assignee.split(',') : undefined;
const assigneeArr =
assignee && assignee !== '' ? (assignee as string).split(',') : undefined;
if (operationType === SysFlowTaskOperationType.MULTI_SIGN) {
// 会签操作设置多实例处理人集合
if (formData.taskVariableData == null) formData.taskVariableData = {};
@@ -140,7 +167,7 @@ const getMasterData = (
} else {
// 获得静态表单页面的getMasterData函数
let funGetMasterData = getRouterCompomentFunction('getMasterData');
return funGetMasterData ? funGetMasterData(dialogParams.value.variableList) : reject();
return funGetMasterData ? funGetMasterData(variableList) : reject();
}
});
};
@@ -271,10 +298,10 @@ const preHandlerOperationThen = (
const handlerOperation = (
operation: ANY_OBJECT,
copyItemList: ANY_OBJECT[],
xml: string | undefined,
xml?: string | undefined,
) => {
if (isOnlineForm.value) {
preHandlerOperation(operation, isStart.value || dialogParams.value.isDraft, xml, copyItemList)
preHandlerOperation(operation, isStart.value || isDraft.value, xml, copyItemList)
.then(res => {
preHandlerOperationThen(operation, copyItemList, res);
})
@@ -302,7 +329,7 @@ const handlerOperation = (
const handlerStart = (
operation: ANY_OBJECT,
copyItemList: ANY_OBJECT[],
xml: string | undefined,
xml?: string | undefined,
) => {
// 启动并保存草稿后再次提交
if (draftProcessInstanceId.value != null && draftTaskId.value != null) {
@@ -345,7 +372,7 @@ const handlerStart = (
},
{
// 判断是否是从流程设计里启动
processDefinitionKey: dialogParams.value.isPreview
processDefinitionKey: isPreview.value
? undefined
: dialogParams.value.processDefinitionKey,
},
@@ -441,8 +468,8 @@ const initFormData = () => {
taskId: dialogParams.value.taskId,
};
// 判断是展示历史流程的数据还是待办流程的数据
let httpCall = null;
if (dialogParams.value.isDraft) {
let httpCall: ANY_OBJECT | null = null;
if (isDraft.value) {
// 草稿数据
httpCall = FlowOperationController.viewOnlineDraftData({
processDefinitionKey: dialogParams.value.processDefinitionKey,
@@ -455,7 +482,7 @@ const initFormData = () => {
});
} else {
httpCall =
dialogParams.value.taskId != null && dialogParams.value.isRuntime
dialogParams.value.taskId != null && isRuntime.value
? FlowOperationController.viewUserTask(params)
: FlowOperationController.viewHistoricProcessInstance(params);
}
@@ -465,7 +492,7 @@ const initFormData = () => {
// 一对多数据
oneToManyRelationData.value = (res.data || {}).oneToMany;
// 草稿一对多数据,添加唯一主键
if (dialogParams.value.isDraft || dialogParams.value.isDraft === 'true') {
if (isDraft.value) {
if (oneToManyRelationData.value != null) {
let tempTime = new Date().getTime();
Object.keys(oneToManyRelationData.value).forEach(key => {

View File

@@ -146,6 +146,7 @@ import FormVariable from './form-variable/index.vue';
import CopyForSelect from './copy-for/index.vue';
import UserTaskListeners from './listeners/UserTaskListeners.vue';
import AutoAgree from './autoAgree/index.vue';
import RightAddBtn from '@/components/Btns/RightAddBtn.vue';
const props = withDefaults(
defineProps<{

View File

@@ -260,9 +260,13 @@ const onEditOperation = (operation: ANY_OBJECT) => {
height: '450px',
pathName: '/thirdParty/thirdEditOperation',
},
).then(res => {
updateEditOperation(res);
});
)
.then(res => {
updateEditOperation(res);
})
.catch(e => {
console.warn(e);
});
};
const updateEditOperation = (res: ANY_OBJECT) => {
//console.log('>>> updateEditOperation', res);

View File

@@ -50,7 +50,7 @@
>
<el-option label="不更新" :value="undefined" />
<el-option
v-for="item in dialogParams.validStatusList"
v-for="item in dialogParams.validStatusList.value"
:key="item.id"
:label="item.name"
:value="item.id"
@@ -173,7 +173,9 @@ import { Dialog } from '@/components/Dialog';
import { DialogProp } from '@/components/Dialog/types';
import { useThirdParty } from '@/components/thirdParty/hooks';
import { ThirdProps } from '@/components/thirdParty/types';
import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();
interface IProps extends ThirdProps {
rowData?: ANY_OBJECT;
validStatusList?: Ref<ANY_OBJECT[]>;
@@ -185,9 +187,6 @@ const props = withDefaults(defineProps<IProps>(), {
});
const { thirdParams, onCloseThirdDialog } = useThirdParty(props);
import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();
const form = ref();
const formData = ref<ANY_OBJECT>({
id: undefined,

View File

@@ -81,7 +81,7 @@
<script setup lang="ts">
import { ElMessage } from 'element-plus';
import { VxeTable, VxeColumn } from 'vxe-table';
import RightAddBtn from '@/components/Btns/RightAddBtn.vue';
import { useLayoutStore } from '@/store';
const layoutStore = useLayoutStore();

View File

@@ -1,6 +1,4 @@
/* 改变主题色变量
// $--color-primary: #1890ff;
// $--color-danger: #ff4d4f;
*/
/* 改变 icon 字体路径变量,必需 */

View File

@@ -1,4 +1,3 @@
// 边框被 token-simulation 样式覆盖了
.djs-palette {
background: var(--palette-background-color);
border: solid 1px var(--palette-border-color) !important;
@@ -101,8 +100,6 @@
}
}
//侧边栏配置
.djs-palette.open .djs-palette-entries div[class^='bpmn-icon-']:before,
.djs-palette.open .djs-palette-entries div[class*='bpmn-icon-']:before {
line-height: unset;
@@ -187,8 +184,6 @@ pre {
font-family: Consolas, Monaco, monospace;
}
// 流程图
rect {
stroke: #c1c2c4 !important;
stroke-width: 1px !important;
@@ -218,7 +213,6 @@ rect {
}
.djs-container {
// 框
.djs-visual {
rect,
polygon,
@@ -235,17 +229,13 @@ rect {
stroke: #333333 !important;
}
}
// 线
.djs-visual path {
stroke: #333333 !important;
}
// 实心箭头
[id^='sequenceflow-end-white-black'] path {
fill: #333333 !important;
stroke: #333333 !important;
}
// 空心箭头
[id^='conditional-flow-marker-white-black'] path {
stroke: #333333 !important;
}