Browse Source

update

main
wangshaoping 11 months ago
parent
commit
3ad1252861
  1. 2
      erm.frontend/package.json
  2. 2
      gradle.properties
  3. 31
      io.sc.engine.mv.frontend/package.json
  4. 31
      io.sc.engine.rule.frontend/package.json
  5. 2
      io.sc.platform.core.frontend/package.json
  6. 3
      io.sc.platform.core.frontend/src/platform/components/index.ts
  7. 193
      io.sc.platform.core.frontend/src/platform/components/workflow/BpmTask.vue
  8. 67
      io.sc.platform.core.frontend/src/platform/components/workflow/CompleteTaskDialog.vue
  9. 69
      io.sc.platform.core.frontend/src/platform/components/workflow/SelectAssigneeDialog.vue
  10. 9
      io.sc.platform.core.frontend/src/platform/components/workflow/WSelectAssigneeDialog.vue
  11. 125
      io.sc.platform.core.frontend/src/platform/components/workflow/WWorkflowAction.vue
  12. 158
      io.sc.platform.core.frontend/src/platform/components/workflow/WorkflowAction.vue
  13. 1
      io.sc.platform.core.frontend/src/platform/index.ts
  14. 4
      io.sc.platform.core.frontend/template-project/package.json
  15. 31
      io.sc.platform.developer.frontend/package.json
  16. 46
      io.sc.platform.developer.frontend/src/views/springboot/Environment.vue
  17. 10
      io.sc.platform.developer.frontend/src/views/springboot/Mapping.vue
  18. 5
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java
  19. 5
      io.sc.platform.lcdp.frontend/package.json
  20. 7
      io.sc.platform.lcdp.frontend/src/i18n/messages.json
  21. 8
      io.sc.platform.lcdp.frontend/src/i18n/messages_tw_CN.json
  22. 7
      io.sc.platform.lcdp.frontend/src/i18n/messages_zh_CN.json
  23. 10
      io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue
  24. 7
      io.sc.platform.lcdp.frontend/src/views/bpm/CompleteTaskDialog.vue
  25. 3
      io.sc.platform.lcdp.frontend/src/views/bpm/CreateProcessInstanceDialog.vue
  26. 158
      io.sc.platform.lcdp.frontend/src/views/bpm/WWorkflowAction.vue
  27. 2
      io.sc.platform.mvc.frontend/package.json
  28. 8
      io.sc.platform.security.frontend/package.json
  29. 31
      io.sc.platform.system.frontend/package.json
  30. 6
      io.sc.platform.system.frontend/src/views/corporation/Corporation.vue
  31. 2
      io.sc.platform.system.frontend/src/views/datasource/Datasource.vue
  32. 10
      io.sc.platform.system.frontend/src/views/department/Department.vue
  33. 12
      io.sc.platform.system.frontend/src/views/menu/Menu.vue
  34. 12
      io.sc.platform.system.frontend/src/views/org/Org.vue
  35. 12
      io.sc.platform.system.frontend/src/views/role/Role.vue
  36. 14
      io.sc.platform.system.frontend/src/views/user/User.vue
  37. 33
      io.sc.standard.frontend/package.json

2
erm.frontend/package.json

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc
platform_version=8.1.29
platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.155
platform_core_frontend_version=8.1.158
###########################################################
# dependencies version

31
io.sc.engine.mv.frontend/package.json

@ -68,9 +68,22 @@
"@vue/babel-plugin-jsx": "1.1.5"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.3",
"exceljs": "4.4.0",
@ -78,26 +91,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}

31
io.sc.engine.rule.frontend/package.json

@ -68,9 +68,22 @@
"@vue/babel-plugin-jsx": "1.1.5"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.3",
"exceljs": "4.4.0",
@ -78,26 +91,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}

2
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.156",
"version": "8.1.158",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",

3
io.sc.platform.core.frontend/src/platform/components/index.ts

@ -43,6 +43,7 @@ import WToolbar from './toolbar/WToolbar.vue';
import WTreeGrid from './tree/WTreeGrid.vue';
import WWorkflowAction from './workflow/WWorkflowAction.vue';
import WSelectAssigneeDialog from './workflow/WSelectAssigneeDialog.vue';
export default {
install: (app: App) => {
@ -89,6 +90,7 @@ export default {
app.component('WTreeGrid', WTreeGrid);
app.component('WWorkflowAction', WWorkflowAction);
app.component('WSelectAssigneeDialog', WSelectAssigneeDialog);
},
};
@ -124,6 +126,7 @@ export {
WToolbar,
WTreeGrid,
WWorkflowAction,
WSelectAssigneeDialog,
};
export { PlatformIconEnum } from './utils';

193
io.sc.platform.core.frontend/src/platform/components/workflow/BpmTask.vue

@ -1,193 +0,0 @@
<template>
<w-list-grid
ref="listGridRef"
:title="$t('org.wsp.framework.flowable.task.grid.title')"
:data-url="$fc.apiContextPath + '/system/process/query/task/isc'"
:form-fields="listGridFields.query"
:form-field-counter="{ xxs:1, xs:1, sm:2, md:2, lg:2, xl:2, xxl:2 }"
:table-columns="listGridFields.grid"
:detail-fields="listGridFields.detail"
:can-pageable="true"
:tool-bar-actions="listGridToolBarActions"
:table-scroll="{x:'100%',y:$fc.ui.contentHeight-$fc.ui.toolBarHeight-$fc.ui.tableHeaderHeight-$fc.ui.paginationHeight-40}"
@selected-rows-change="selectedRowsChange"
>
</w-list-grid>
<CompleteTaskDialog ref="completeTaskDialogRef" @after-completed="afterCompleted"></CompleteTaskDialog>
</template>
<script setup>
import {
computed, ref, onMounted, createVNode, toRaw
} from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import { Modal, notification } from 'ant-design-vue';
import { QuestionCircleOutlined } from '@ant-design/icons-vue';
import {
useFrameworkConfiguration, useAxios,
useEnumOptions, getOptionText, useTrueFalseOptions,
useYesNoOptions, useDataComeFromOptions, useRoleOptions,
useOrgOptions, useTableColumn
} from 'framework-core';
import CompleteTaskDialog from './CompleteTaskDialog';
/**
* 定义组件支持的自定义事件
*/
const emit = defineEmits([
'selectedRowsChange', //
]);
const { t } = useI18n();
const axios = useAxios();
const fc = useFrameworkConfiguration();
const router = useRouter();
const route = useRoute();
const listGridRef = ref(null);
const completeTaskDialogRef = ref(null);
const listGridFields = computed(() => {
return {
query: [
{ component:'input', name:'processInstanceId', label:t('org.wsp.framework.flowable.task.entity.processInstanceId') },
],
grid: [
useTableColumn({ width:150, name:'name', title:t('org.wsp.framework.flowable.task.entity.name') }),
useTableColumn({ width:80, name:'owner', title:t('org.wsp.framework.flowable.task.entity.owner') }),
useTableColumn({ width:100, name:'assignee', title:t('org.wsp.framework.flowable.task.entity.assignee') }),
useTableColumn({ width:150, name:'createTime', title:t('org.wsp.framework.flowable.task.entity.createTime') }),
useTableColumn({ width:150, name:'claimTime', title:t('org.wsp.framework.flowable.task.entity.claimTime') }),
useTableColumn({ width:150, name:'processInstanceId', title:t('org.wsp.framework.flowable.task.entity.processInstanceId') }),
]
};
});
const listGridToolBarActions = computed(() => {
return ['*query', 'reset', 'refresh', 'divider',
{
icon: 'PartitionOutlined',
title: t('org.wsp.framework.flowable.action.showWorkflowDiagram'),
enableIf: (selectedRecords) => {
const record = listGridRef?.value?.getSelectedRow();
return selectedRecords.length > 0;
},
click: () => {
console.log('1');
},
},
'divider',
{
icon: 'RightCircleOutlined',
title: t('org.wsp.framework.flowable.action.complete.task'),
enableIf: (selectedRecords) => {
const record = listGridRef?.value?.getSelectedRow();
return selectedRecords.length > 0;
},
click: () => {
const record = listGridRef?.value?.getSelectedRow();
completeTaskDialogRef?.value?.open(record.id);
},
},
{
icon: 'DownCircleOutlined',
title: t('org.wsp.framework.flowable.action.claim.task'),
enableIf: (selectedRecords) => {
const record = listGridRef?.value?.getSelectedRow();
return selectedRecords.length > 0 && !record.assignee;
},
click: () => {
const record = listGridRef?.value?.getSelectedRow();
axios.post(
fc.apiContextPath + '/system/process/operation/claim/' + record.id,
null
).then(() => {
notification.success({
message: t('operationSuccess'),
duration:2
});
listGridRef?.value.refresh();
});
},
},
{
icon: 'UpCircleOutlined',
title: t('org.wsp.framework.flowable.action.unclaim.task'),
enableIf: (selectedRecords) => {
const record = listGridRef?.value?.getSelectedRow();
return selectedRecords.length > 0 && record.assignee;
},
click: () => {
const record = listGridRef?.value?.getSelectedRow();
axios.post(
fc.apiContextPath + '/system/process/operation/unClaim/' + record.id,
null
).then(() => {
notification.success({
message: t('operationSuccess'),
duration:2
});
listGridRef?.value.refresh();
});
},
},
{
icon: 'RollbackOutlined',
title: t('org.wsp.framework.flowable.action.jump.task'),
enableIf: (selectedRecords) => {
const record = listGridRef?.value?.getSelectedRow();
return selectedRecords.length > 0;
},
click: () => {
console.log('2');
},
},
{
icon: 'CloseCircleOutlined',
title: t('org.wsp.framework.flowable.action.terminate.processInstance'),
enableIf: (selectedRecords) => {
const record = listGridRef?.value?.getSelectedRow();
return selectedRecords.length > 0;
},
click: () => {
const record = listGridRef?.value?.getSelectedRow();
axios.post(
fc.apiContextPath + '/system/process/operation/terminateProcessInstance/' + record.id,
null
).then(() => {
notification.success({
message: t('operationSuccess'),
duration:2
});
listGridRef?.value.refresh();
});
},
}
];
});
const selectedRowsChange = (selectedRecords) => {
if (selectedRecords && selectedRecords.length > 0) {
emit('selectedRowsChange', selectedRecords[0]);
} else {
emit('selectedRowsChange', null);
}
};
const refresh = () => {
listGridRef.value.refresh();
};
const afterCompleted = () => {
notification.success({
message: t('operationSuccess'),
duration:2
});
listGridRef?.value.refresh();
};
defineExpose({
refresh,
});
</script>

67
io.sc.platform.core.frontend/src/platform/components/workflow/CompleteTaskDialog.vue

@ -1,67 +0,0 @@
<template>
<a-modal
v-model:visible="visible"
:force-render="true"
:mask-closable="false"
:title="$t('org.wsp.framework.flowable.action.complete.task')"
>
<a-form
:model="formModelRef"
layout="horizontal"
:label-col="{ span: 6 }"
:wrapper-col="{ span: 18 }"
autocomplete="off"
>
<a-form-item name="variables" :label="$t('org.wsp.framework.flowable.instance.form.variables')">
<a-textarea v-model:value="formModelRef.variables" :rows="6" />
</a-form-item>
<a-form-item name="transientVariables" :label="$t('org.wsp.framework.flowable.instance.form.transientVariables')">
<a-textarea v-model:value="formModelRef.transientVariables" :rows="6" />
</a-form-item>
</a-form>
<template #footer>
<WorkflowAction
ref="workflowActionRef"
action-url="/system/process/operation/complete/"
@after-submit="afterSubmit"
>
</WorkflowAction>
</template>
</a-modal>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import WorkflowAction from './WorkflowAction';
/**
* 定义组件支持的自定义事件
*/
const emit = defineEmits([
'afterCompleted', //
]);
const { t } = useI18n();
const visible = ref(false);
const formModelRef = reactive({});
const workflowActionRef = ref([]);
const open = (taskId) => {
const transientVariables = {};
transientVariables.task_treatment = '此处填写处理意见';
formModelRef.transientVariables = JSON.stringify(transientVariables, null, 2);
workflowActionRef.value.setTaskId(taskId);
workflowActionRef.value.setDataRef(formModelRef);
visible.value = true;
};
const afterSubmit = (taskId) => {
visible.value = false;
emit('afterCompleted');
};
defineExpose({
open
});
</script>

69
io.sc.platform.core.frontend/src/platform/components/workflow/SelectAssigneeDialog.vue

@ -1,69 +0,0 @@
<template>
<a-modal
v-model:visible="visible"
:force-render="true"
:mask-closable="false"
:title="$t('org.wsp.framework.flowable.window.selectAssignee.title')"
centered
@ok="okHandle"
>
<a-space direction="vertical">
<div>{{ t('org.wsp.framework.flowable.task.tip.selectAssignee') }}</div>
<a-form
:model="formModelRef"
layout="horizontal"
:label-col="{ span: 6 }"
:wrapper-col="{ span: 18 }"
autocomplete="off"
>
<a-form-item name="assignee" :label="$t('org.wsp.framework.flowable.task.entity.assignee')">
<a-select v-model:value="formModelRef.assignee" :options="assigneeOptionsRef" />
</a-form-item>
</a-form>
</a-space>
</a-modal>
</template>
<script setup>
import {
ref, reactive, toRaw, computed, onMounted
} from 'vue';
import { useI18n } from 'vue-i18n';
import { notification } from 'ant-design-vue';
import { useFrameworkConfiguration, useAxios } from 'framework-core';
/**
* 定义组件支持的自定义事件
*/
const emit = defineEmits([
'assigneeSelected', //
]);
const fc = useFrameworkConfiguration();
const axios = useAxios();
const { t } = useI18n();
const visible = ref(false);
const formModelRef = reactive({});
const assigneeOptionsRef = ref(null);
const okHandle = () => {
emit('assigneeSelected', formModelRef.assignee);
visible.value = false;
};
const open = (assignees) => {
visible.value = true;
formModelRef.assignee = null;
const result = [];
if (assignees) {
for (let i = 0; i < assignees.length; i++) {
result.push({ value : assignees[i].loginName, label : assignees[i].loginName + '/' + assignees[i].userName, text : assignees[i].loginName + '/' + assignees[i].userName });
}
}
assigneeOptionsRef.value = result;
};
defineExpose({
open
});
</script>

9
io.sc.platform.lcdp.frontend/src/views/bpm/SelectAssigneeDialog.vue → io.sc.platform.core.frontend/src/platform/components/workflow/WSelectAssigneeDialog.vue

@ -15,10 +15,9 @@
},
]"
>
<div
v-dompurify-html="$t('lcdp.bpm.selectAssignee.entity.assignee.tip', { activeName: selectAssigneeWrapperRef.activeName })"
class="text-body2 py-2"
></div>
<div class="text-body2 py-1">{{ $t('lcdp.bpm.selectAssignee.entity.assignee.tip.1', { activeName: selectAssigneeWrapperRef.activeName }) }}</div>
<div class="text-body2 py-1">{{ $t('lcdp.bpm.selectAssignee.entity.assignee.tip.2') }}</div>
<div class="text-body2 py-1 pb-3">{{ $t('lcdp.bpm.selectAssignee.entity.assignee.tip.3') }}</div>
<w-form
ref="formRef"
:cols-num="1"
@ -28,7 +27,7 @@
</w-dialog>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { ref } from 'vue';
/**
* 定义组件支持的自定义事件

125
io.sc.platform.core.frontend/src/platform/components/workflow/WWorkflowAction.vue

@ -1,31 +1,40 @@
<template>
<div class="flex justify-end gap-4">
<q-btn v-for="action in actionsRef" :key="action.name" :label="action.title" @click="buttonClick(action)"></q-btn>
<div :class="`flex ${align === 'right' ? 'justify-end' : ''} gap-4`">
<q-btn v-for="action in actionsRef" :key="action.name" :label="action.title" color="primary" @click="buttonClick(action)"></q-btn>
</div>
<WSelectAssigneeDialog ref="selectAssigneeDialogRef" @assignee-selected="assigneeSelected"></WSelectAssigneeDialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, axios } from '@/platform';
import { Environment, DialogManager, Tools, axios } from '@/platform';
import WSelectAssigneeDialog from './WSelectAssigneeDialog.vue';
/**
* 定义组件支持的自定义属性
*/
const props = defineProps({
// ID
taskId: { type: String, default: undefined },
//
data: {
type: Object,
default: () => {
return {};
},
},
//
align: { type: String, default: 'center' },
// url
actionUrl: { type: String, default: undefined },
// 退 url,,使
gobackActionUrl: { type: String, default: '/api/flowable/process/operation/getGobacks' },
// url
actionUrl: { type: String, default: undefined },
// ID
taskId: { type: String, default: undefined },
//
transientVariables: { type: Object, default: undefined },
// 退
actionButtonWidth: { type: Number, default: 100 },
//
defaultActionButtons: { type: [Array, Object], default: undefined },
//
defaultActionButtonsAlign: { type: String, default: 'right' },
//
defaultActionButtonsPlacement: { type: String, default: 'right' },
// goback
isGobackActionDropdown: { type: Boolean, default: false },
});
/**
@ -36,29 +45,34 @@ const emit = defineEmits([
]);
const { t } = useI18n();
const taskIdRef = ref(props.taskId);
const actionsRef = ref([]);
const selectAssigneeDialogRef = ref();
const currentActionRef = ref(null);
const buildMembers = (gobacks) => {
actionsRef.value.splice(0, actionsRef.value.length);
const buildActions = (taskId: string) => {
axios.get(Environment.apiContextPath(props.gobackActionUrl + '/' + taskId)).then((data) => {
buildButtons(data.data);
});
};
const members = [];
const buildButtons = (gobacks) => {
const buttons = [];
// ()
if (props.defaultActionButtonsAlign === 'left') {
if (props.defaultActionButtonsPlacement === 'left') {
if (props.defaultActionButtons && props.defaultActionButtons && props.defaultActionButtons.length > 0) {
for (let i = 0; i < props.defaultActionButtons.length; i++) {
members.push(props.defaultActionButtons[i]);
buttons.push(props.defaultActionButtons[i]);
}
}
}
// 退
if (gobacks) {
if (gobacks && gobacks.length > 0) {
for (let i = 0; i < gobacks.length; i++) {
const goback = gobacks[i];
const transientVariables = {};
transientVariables[goback.variableName] = goback.variableValue;
members.push({
buttons.push({
title: goback.title || t('goback'),
transientVariables,
});
@ -66,31 +80,76 @@ const buildMembers = (gobacks) => {
}
//
members.push({ title: t('submit') });
buttons.push({ title: t('submit') });
// ()
if (props.defaultActionButtonsAlign === 'right') {
if (props.defaultActionButtonsPlacement === 'right') {
if (props.defaultActionButtons && props.defaultActionButtons && props.defaultActionButtons.length > 0) {
for (let i = 0; i < props.defaultActionButtons.length; i++) {
members.push(props.defaultActionButtons[i]);
buttons.push(props.defaultActionButtons[i]);
}
}
}
//
for (let i = 0; i < members.length; i++) {
actionsRef.value.push(members[i]);
actionsRef.value.splice(0, actionsRef.value.length);
for (let i = 0; i < buttons.length; i++) {
actionsRef.value.push(buttons[i]);
}
};
const setTaskId = (taskId) => {
taskIdRef.value = taskId;
axios.get(Environment.apiContextPath(props.gobackActionUrl + '/' + taskId)).then((data) => {
buildMembers(data.data);
const buttonClick = (action) => {
DialogManager.confirm(t('lcdp.bpm.completeTask.action.tip', { action: action.title }), () => {
currentActionRef.value = action;
axios.post(props.actionUrl + '/' + props.taskId, getData(action)).then((response) => {
if (response.data.code === 0) {
//
emit('afterSubmit');
} else if (response.data.code === 1) {
//
selectAssigneeDialogRef.value.open(response.data);
}
});
});
};
const assigneeSelected = (assignee) => {
axios.post(props.actionUrl + '/' + props.taskId, getData(currentActionRef.value, assignee)).then((response) => {
const rawData = response.data;
if (rawData.code === 0) {
//
emit('afterSubmit');
}
});
};
defineExpose({
setTaskId,
const getData = (action, assignee) => {
const data = {
variables: {},
transientVariables: {},
};
if (!Tools.isUndefinedOrNull(props.data)) {
if (!Tools.isEmpty(props.data.variables)) {
data.variables = JSON.parse(props.data.variables);
}
if (!Tools.isEmpty(props.data.transientVariables)) {
data.transientVariables = JSON.parse(props.data.transientVariables);
}
}
if (!Tools.isUndefinedOrNull(action)) {
if (!Tools.isUndefinedOrNull(action.transientVariables)) {
Tools.mergeObject(data.transientVariables, action.transientVariables);
}
}
if (assignee) {
data.transientVariables.assignee = assignee;
}
return data;
};
onMounted(() => {
if (props.taskId) {
buildActions(props.taskId);
}
});
</script>

158
io.sc.platform.core.frontend/src/platform/components/workflow/WorkflowAction.vue

@ -1,158 +0,0 @@
<template>
<div>
<a-button v-for="action in actionsRef" @click="buttonClick(action)">{{ action.title }}</a-button>
</div>
<SelectAssigneeDialog ref="selectAssigneeDialogRef" @assignee-selected="assigneeSelected"></SelectAssigneeDialog>
</template>
<script setup>
import {
ref, reactive, toRaw, computed, onMounted
} from 'vue';
import { useI18n } from 'vue-i18n';
import { useStore } from 'vuex';
import { notification } from 'ant-design-vue';
import { useFrameworkConfiguration, useAxios } from 'framework-core';
import SelectAssigneeDialog from './SelectAssigneeDialog';
/**
* 定义组件支持的自定义属性
*/
const props = defineProps({
// 退 url,,使
gobackActionUrl : { type: String, default: '/system/process/operation/getGobacks/' },
// url
actionUrl : { type: String, default: undefined },
// ID
taskId : { type: String, default: undefined },
//
transientVariables : { type: Object, default: undefined },
// 退
actionButtonWidth : { type: Number, default: 100 },
//
defaultActionButtons : { type: [Array, Object], default: undefined },
//
defaultActionButtonsAlign : { type: String, default: 'right' },
});
/**
* 定义组件支持的自定义事件
*/
const emit = defineEmits([
'afterSubmit', //
]);
const fc = useFrameworkConfiguration();
const store = useStore();
const axios = useAxios();
const { t } = useI18n();
const actionIdRef = ref(null);
const selectAssigneeDialogRef = ref(null);
let dataRef = null;
let currentAction = null;
const actionsRef = reactive([]);
const buildMembers = (gobacks) => {
actionsRef.splice(0, actionsRef.length);
const members = [];
// ()
if (props.defaultActionButtonsAlign === 'left') {
if (props.defaultActionButtons && props.defaultActionButtons && props.defaultActionButtons.length > 0) {
for (let i = 0; i < props.defaultActionButtons.length; i++) {
members.push(props.defaultActionButtons[i]);
}
}
}
// 退
if (gobacks) {
for (let i = 0; i < gobacks.length; i++) {
const goback = gobacks[i];
const transientVariables = {};
transientVariables[goback.variableName] = goback.variableValue;
members.push({
title : goback.title || t('goback'),
transientVariables,
});
}
}
//
members.push({ title: t('submit') });
// ()
if (props.defaultActionButtonsAlign === 'right') {
if (props.defaultActionButtons && props.defaultActionButtons && props.defaultActionButtons.length > 0) {
for (let i = 0; i < props.defaultActionButtons.length; i++) {
members.push(props.defaultActionButtons[i]);
}
}
}
//
for (let i = 0; i < members.length; i++) {
actionsRef.push(members[i]);
}
};
const setTaskId = (taskId) => {
actionIdRef.value = taskId;
axios.get(
fc.apiContextPath + props.gobackActionUrl + taskId,
).then((data) => {
buildMembers(data.data);
});
};
const buttonClick = (action) => {
currentAction = action;
//
const transientVariables = {};
// 退退
axios.post(
fc.apiContextPath + props.actionUrl + actionIdRef.value,
action
).then((data) => {
const rawData = data.data;
if (rawData.code === 0) { //
emit('afterSubmit');
} else if (rawData.code === 1) { //
selectAssigneeDialogRef.value.open(rawData.assignees);
}
});
};
const assigneeSelected = (assignee) => {
const data = currentAction;
if (dataRef.variables) {
data.variables = JSON.parse(dataRef.variables);
}
if (dataRef.transientVariables) {
data.transientVariables = JSON.parse(dataRef.transientVariables);
data.transientVariables.assignee = assignee;
}
axios.post(
fc.apiContextPath + props.actionUrl + actionIdRef.value,
data
).then((response) => {
const rawData = response.data;
if (rawData.code === 0) { //
emit('afterSubmit');
}
});
};
const setDataRef = (_dataRef) => {
if (_dataRef) {
dataRef = _dataRef;
}
};
defineExpose({
setTaskId,
setDataRef
});
</script>

1
io.sc.platform.core.frontend/src/platform/index.ts

@ -140,6 +140,7 @@ export {
WToolbar,
WTreeGrid,
WWorkflowAction,
WSelectAssigneeDialog,
} from './components';
export { PlatformIconEnum } from './components';

4
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.156",
"version": "8.1.158",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.156",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

31
io.sc.platform.developer.frontend/package.json

@ -68,9 +68,22 @@
"@vue/babel-plugin-jsx": "1.1.5"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.3",
"exceljs": "4.4.0",
@ -78,26 +91,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}

46
io.sc.platform.developer.frontend/src/views/springboot/Environment.vue

@ -1,28 +1,26 @@
<template>
<w-v-expand-div>
<w-grid
:title="$t('menu.developer.springboot.environment')"
:checkbox-selection="false"
:fetch-data-url="Environment.apiContextPath('/api/developer/springboot/environment')"
:pageable="false"
:toolbar-actions="['refresh', 'separator', 'view', 'separator', 'export']"
:columns="[
{ width: 200, name: 'propertySourceName', label: $t('category') },
{ width: 400, name: 'propertyName', label: $t('name') },
{ width: '100%', name: 'value', label: $t('value') },
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'propertySourceName', label: $t('category') },
{ name: 'propertyName', label: $t('name') },
{ name: 'value', label: $t('value') },
],
},
}"
></w-grid>
</w-v-expand-div>
<w-grid
:title="$t('menu.developer.springboot.environment')"
:checkbox-selection="false"
:fetch-data-url="Environment.apiContextPath('/api/developer/springboot/environment')"
:pageable="false"
:toolbar-actions="['refresh', 'separator', 'view', 'separator', 'export']"
:columns="[
{ width: 200, name: 'propertySourceName', label: $t('category') },
{ width: 400, name: 'propertyName', label: $t('name') },
{ width: '100%', name: 'value', label: $t('value') },
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'propertySourceName', label: $t('category') },
{ name: 'propertyName', label: $t('name') },
{ name: 'value', label: $t('value') },
],
},
}"
></w-grid>
</template>
<script setup lang="ts">
import { Environment, Formater } from 'platform-core';

10
io.sc.platform.developer.frontend/src/views/springboot/Mapping.vue

@ -1,12 +1,12 @@
<template>
<div>
<div style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="dispatcherServlets" icon="bi-people" :label="$t('Dispatcher Servlets')" />
<q-tab name="servletFilters" icon="bi-diagram-3" :label="$t('Servlet Filters')" />
<q-tab name="servlets" icon="bi-diagram-3" :label="$t('Servlets')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="dispatcherServlets" class="px-0">
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="dispatcherServlets" class="px-0 pb-0" style="height: 100%">
<w-grid
:title="$t('menu.developer.springboot.mapping')"
:checkbox-selection="false"
@ -60,7 +60,7 @@
}"
></w-grid>
</q-tab-panel>
<q-tab-panel name="servletFilters" class="px-0">
<q-tab-panel name="servletFilters" class="px-0 pb-0" style="height: 100%">
<w-grid
:title="$t('menu.developer.springboot.bean')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
@ -84,7 +84,7 @@
}"
></w-grid>
</q-tab-panel>
<q-tab-panel name="servlets" class="px-0">
<q-tab-panel name="servlets" class="px-0 pb-0" style="height: 100%">
<w-grid
:title="$t('menu.developer.springboot.bean')"
:checkbox-selection="false"

5
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java

@ -305,7 +305,10 @@ public class ProcessOperationServiceImpl implements ProcessOperationService {
List<Assignee> assignees =assigneeQueryService.query(task,newTask, newUserTaskDefinition);
if(assignees!=null && assignees.size()>0){
if(assignees.size()>1){
throw new CompleteTaskException(objectMapper.writeValueAsString(assignees));
SelectAssigneeWrapper selectAssigneeWrapper =new SelectAssigneeWrapper();
selectAssigneeWrapper.setActiveName(newUserTaskDefinition.getName());
selectAssigneeWrapper.setAssignees(assignees);
throw new CompleteTaskException(objectMapper.writeValueAsString(selectAssigneeWrapper));
}else{
taskService.setAssignee(newTask.getId(), assignees.get(0).getLoginName());
}

5
io.sc.platform.lcdp.frontend/package.json

@ -91,13 +91,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.156",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}

7
io.sc.platform.lcdp.frontend/src/i18n/messages.json

@ -156,7 +156,7 @@
"lcdp.bpm.processDefine.grid.toolbar.createProcessInstance": "Create Process Instance",
"lcdp.bpm.processDefine.grid.toolbar.queryProcessInstance": "Query Process Instance",
"lcdp.bpm.processDefine.grid.entity.deployId": "Deploy ID",
"lcdp.bpm.processDefine.grid.entity.canClaimTask": "Claim Task",
"lcdp.bpm.processDefine.grid.entity.canClaimTask": "Can Claim Task",
"lcdp.bpm.designer.dialog.title.prefix": "Process Designer",
@ -207,9 +207,12 @@
"lcdp.bpm.variables.grid.entity.text2":"Text2",
"lcdp.bpm.completeTask.dialog.title": "Complete Task",
"lcdp.bpm.completeTask.action.tip": "Are you sure to {action}?",
"lcdp.bpm.selectAssignee.dialog.title": "Select Assignee",
"lcdp.bpm.selectAssignee.entity.assignee": "Assignee",
"lcdp.bpm.selectAssignee.entity.assignee.tip": "Next Task: {activeName} <br/>There are some assignees can handler this task, but they can NOT claim this task. <br/>Please select one assignee:",
"lcdp.bpm.selectAssignee.entity.assignee.tip.1": "Next Task: {activeName}",
"lcdp.bpm.selectAssignee.entity.assignee.tip.2": "There are some assignees can handler this task, but they can NOT claim this task.",
"lcdp.bpm.selectAssignee.entity.assignee.tip.3": "Please select one assignee:",
"lcdp.bpm.jumpTask.dialog.title": "Task Jump",
"lcdp.bpm.jumpTask.form.entity.taskId": "Task ID",

8
io.sc.platform.lcdp.frontend/src/i18n/messages_tw_CN.json

@ -156,7 +156,7 @@
"lcdp.bpm.processDefine.grid.toolbar.createProcessInstance": "創建流程實例",
"lcdp.bpm.processDefine.grid.toolbar.queryProcessInstance": "查詢流程實例",
"lcdp.bpm.processDefine.grid.entity.deployId": "發佈 ID",
"lcdp.bpm.processDefine.grid.entity.canClaimTask": "領取任務",
"lcdp.bpm.processDefine.grid.entity.canClaimTask": "允許領取任務",
"lcdp.bpm.designer.dialog.title.prefix": "流程設計器",
@ -207,9 +207,13 @@
"lcdp.bpm.variables.grid.entity.text2":"文本2",
"lcdp.bpm.completeTask.dialog.title": "完成任務",
"lcdp.bpm.completeTask.action.tip": "您確定要{action}嗎?",
"lcdp.bpm.selectAssignee.dialog.title": "選擇處理人",
"lcdp.bpm.selectAssignee.entity.assignee": "處理人",
"lcdp.bpm.selectAssignee.entity.assignee.tip": "下一個處理任務: {activeName} <br/>存在多個候選人,且流程不允許自行認領任務. <br/>請選擇一個任務處理人:",
"lcdp.bpm.selectAssignee.entity.assignee.tip.1": "下一個處理任務: {activeName}",
"lcdp.bpm.selectAssignee.entity.assignee.tip.2": "存在多個候選人,且流程不允許自行認領任務。",
"lcdp.bpm.selectAssignee.entity.assignee.tip.3": "請選擇一個任務處理人:",
"lcdp.bpm.jumpTask.dialog.title": "任務跳轉",
"lcdp.bpm.jumpTask.form.entity.taskId": "任務ID",

7
io.sc.platform.lcdp.frontend/src/i18n/messages_zh_CN.json

@ -157,7 +157,7 @@
"lcdp.bpm.processDefine.grid.toolbar.createProcessInstance": "创建流程实例",
"lcdp.bpm.processDefine.grid.toolbar.queryProcessInstance": "查询流程实例",
"lcdp.bpm.processDefine.grid.entity.deployId": "发布 ID",
"lcdp.bpm.processDefine.grid.entity.canClaimTask": "领取任务",
"lcdp.bpm.processDefine.grid.entity.canClaimTask": "允许领取任务",
"lcdp.bpm.designer.dialog.title.prefix": "流程设计器",
@ -208,9 +208,12 @@
"lcdp.bpm.variables.grid.entity.text2":"文本2",
"lcdp.bpm.completeTask.dialog.title": "完成任务",
"lcdp.bpm.completeTask.action.tip": "您确定要{action}吗?",
"lcdp.bpm.selectAssignee.dialog.title": "选择处理人",
"lcdp.bpm.selectAssignee.entity.assignee": "处理人",
"lcdp.bpm.selectAssignee.entity.assignee.tip": "下一个处理任务: {activeName} <br/>存在多个候选人,且流程不允许由候选人自行认领任务. <br/>请选择一个任务处理人:",
"lcdp.bpm.selectAssignee.entity.assignee.tip.1": "下一个处理任务: {activeName}",
"lcdp.bpm.selectAssignee.entity.assignee.tip.2": "存在多个候选人,且流程不允许由候选人自行认领任务。",
"lcdp.bpm.selectAssignee.entity.assignee.tip.3": "请选择一个任务处理人:",
"lcdp.bpm.jumpTask.dialog.title": "任务跳转",
"lcdp.bpm.jumpTask.form.entity.taskId": "任务ID",

10
io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue

@ -11,7 +11,7 @@
</template>
<template #after>
<q-tab-panels v-model="selectedTabRef" animated swipeable vertical transition-prev="jump-up" transition-next="jump-up" keep-alive style="height: 100%">
<q-tab-panel name="processDefine" style="height: 100%">
<q-tab-panel name="processDefine" class="pl-2 pb-0" style="height: 100%">
<w-grid
ref="processDefineGridRef"
:title="$t('lcdp.bpm.processDefine.grid.title')"
@ -207,7 +207,7 @@
{ name: 'description', label: $t('description'), type: 'textarea', rows: 1 },
{ name: 'xml', label: $t('xml'), type: 'textarea' },
{ name: 'status', label: $t('status'), type: 'text', defaultValue: 'SKETCH', hidden: true },
{ name: 'canClaimTask', label: $t('lcdp.bpm.canClaimTask'), type: 'checkbox', defaultValue: true, rule: [] },
{ name: 'canClaimTask', label: $t('lcdp.bpm.processDefine.grid.entity.canClaimTask'), type: 'checkbox', defaultValue: true, rule: [] },
],
},
}"
@ -223,7 +223,7 @@
{ name: 'version', label: $t('version') },
{ name: 'status', label: $t('status'), format: Formater.enum(ProcessStatusEnum) },
{ name: 'deployedId', label: $t('lcdp.bpm.deployId') },
{ name: 'canClaimTask', label: $t('lcdp.bpm.canClaimTask'), format: Formater.none() },
{ name: 'canClaimTask', label: $t('lcdp.bpm.processDefine.grid.entity.canClaimTask'), format: Formater.none() },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
],
@ -231,7 +231,7 @@
}"
></w-grid>
</q-tab-panel>
<q-tab-panel name="processInstance">
<q-tab-panel name="processInstance" class="pl-2 pb-0" style="height: 100%">
<w-grid
ref="processInstanceGridRef"
:title="$t('lcdp.bpm.processInstance.grid.title')"
@ -314,7 +314,7 @@
}"
></w-grid>
</q-tab-panel>
<q-tab-panel name="task">
<q-tab-panel name="task" class="pl-2 pb-0" style="height: 100%">
<w-grid
ref="taskGridRef"
:title="$t('lcdp.bpm.task.grid.title')"

7
io.sc.platform.lcdp.frontend/src/views/bpm/CompleteTaskDialog.vue

@ -1,14 +1,14 @@
<template>
<w-dialog ref="dialogRef" :title="$t('lcdp.bpm.completeTask.dialog.title')" width="800px" :can-maximize="false">
<template #buttons>
<WWorkflowAction
<w-workflow-action
ref="workflowActionRef"
:task-id="taskIdRef"
:data="formModelValue"
:action-url="Environment.apiContextPath('/api/flowable/process/operation/complete')"
@after-submit="afterSubmit"
>
</WWorkflowAction>
</w-workflow-action>
</template>
<w-form
v-model="formModelValue"
@ -22,8 +22,7 @@
</w-dialog>
</template>
<script setup lang="ts">
import { nextTick, ref, reactive } from 'vue';
import WWorkflowAction from './WWorkflowAction.vue';
import { ref, reactive } from 'vue';
import { Environment } from 'platform-core';
/**

3
io.sc.platform.lcdp.frontend/src/views/bpm/CreateProcessInstanceDialog.vue

@ -32,14 +32,13 @@
]"
class="p-2"
></w-form>
<SelectAssigneeDialog ref="selectAssigneeDialogRef" @assignee-selected="assigneeSelected"></SelectAssigneeDialog>
<w-select-assignee-dialog ref="selectAssigneeDialogRef" @assignee-selected="assigneeSelected"></w-select-assignee-dialog>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, NotifyManager, Tools } from 'platform-core';
import SelectAssigneeDialog from './SelectAssigneeDialog.vue';
const dialogRef = ref();
const formRef = ref();

158
io.sc.platform.lcdp.frontend/src/views/bpm/WWorkflowAction.vue

@ -1,158 +0,0 @@
<template>
<div :class="`flex ${align === 'right' ? 'justify-end' : ''} gap-4`">
<q-btn v-for="action in actionsRef" :key="action.name" :label="action.title" color="primary" @click="buttonClick(action)"></q-btn>
</div>
<SelectAssigneeDialog ref="selectAssigneeDialogRef" @assignee-selected="assigneeSelected"></SelectAssigneeDialog>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, Tools, axios } from 'platform-core';
import SelectAssigneeDialog from './SelectAssigneeDialog.vue';
import { reactive } from 'vue';
/**
* 定义组件支持的自定义属性
*/
const props = defineProps({
// ID
taskId: { type: String, default: undefined },
//
data: {
type: Object,
default: () => {
return {};
},
},
//
align: { type: String, default: 'center' },
// url
actionUrl: { type: String, default: undefined },
// 退 url,,使
gobackActionUrl: { type: String, default: '/api/flowable/process/operation/getGobacks' },
//
defaultActionButtons: { type: [Array, Object], default: undefined },
//
defaultActionButtonsPlacement: { type: String, default: 'right' },
// goback
isGobackActionDropdown: { type: Boolean, default: false },
});
/**
* 定义组件支持的自定义事件
*/
const emit = defineEmits([
'afterSubmit', //
]);
const { t } = useI18n();
const actionsRef = ref([]);
const selectAssigneeDialogRef = ref();
const currentActionRef = ref(null);
const buildActions = (taskId: string) => {
axios.get(Environment.apiContextPath(props.gobackActionUrl + '/' + taskId)).then((data) => {
buildButtons(data.data);
});
};
const buildButtons = (gobacks) => {
const buttons = [];
// ()
if (props.defaultActionButtonsPlacement === 'left') {
if (props.defaultActionButtons && props.defaultActionButtons && props.defaultActionButtons.length > 0) {
for (let i = 0; i < props.defaultActionButtons.length; i++) {
buttons.push(props.defaultActionButtons[i]);
}
}
}
// 退
if (gobacks && gobacks.length > 0) {
for (let i = 0; i < gobacks.length; i++) {
const goback = gobacks[i];
const transientVariables = {};
transientVariables[goback.variableName] = goback.variableValue;
buttons.push({
title: goback.title || t('goback'),
transientVariables,
});
}
}
//
buttons.push({ title: t('submit') });
// ()
if (props.defaultActionButtonsPlacement === 'right') {
if (props.defaultActionButtons && props.defaultActionButtons && props.defaultActionButtons.length > 0) {
for (let i = 0; i < props.defaultActionButtons.length; i++) {
buttons.push(props.defaultActionButtons[i]);
}
}
}
//
actionsRef.value.splice(0, actionsRef.value.length);
for (let i = 0; i < buttons.length; i++) {
actionsRef.value.push(buttons[i]);
}
};
const buttonClick = (action) => {
currentActionRef.value = action;
const data = {
variables: {},
transientVariables: {},
};
if (!Tools.isUndefinedOrNull(props.data)) {
if (!Tools.isEmpty(props.data.variables)) {
data.variables = JSON.parse(props.data.variables);
}
if (!Tools.isEmpty(props.data.transientVariables)) {
data.transientVariables = JSON.parse(props.data.transientVariables);
}
}
if (!Tools.isUndefinedOrNull(action)) {
if (!Tools.isUndefinedOrNull(action.transientVariables)) {
Tools.mergeObject(data.transientVariables, action.transientVariables);
}
}
console.log(data);
// 退退
axios.post(props.actionUrl + '/' + props.taskId, data).then((response) => {
if (response.data.code === 0) {
//
emit('afterSubmit');
} else if (response.data.code === 1) {
//
selectAssigneeDialogRef.value.open(response.data);
}
});
};
const assigneeSelected = (assignee) => {
const data = currentActionRef.value;
if (props.data.variables) {
data.variables = JSON.parse(props.data.variables);
}
if (props.data.transientVariables) {
data.transientVariables = JSON.parse(props.data.transientVariables);
data.transientVariables.assignee = assignee;
}
axios.post(Environment.apiContextPath(props.actionUrl + props.taskId), data).then((response) => {
const rawData = response.data;
if (rawData.code === 0) {
//
emit('afterSubmit');
}
});
};
onMounted(() => {
if (props.taskId) {
buildActions(props.taskId);
}
});
</script>

2
io.sc.platform.mvc.frontend/package.json

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

8
io.sc.platform.security.frontend/package.json

@ -4,7 +4,7 @@
"description": "",
"private": false,
"keywords": [
],
"author": "",
"license": "ISC",
@ -92,13 +92,13 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.158",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-codemirror6": "1.2.0",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"platform-core": "8.1.155"
"vue-router": "4.2.5"
}
}
}

31
io.sc.platform.system.frontend/package.json

@ -68,9 +68,22 @@
"@vue/babel-plugin-jsx": "1.1.5"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.3",
"exceljs": "4.4.0",
@ -78,26 +91,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}

6
io.sc.platform.system.frontend/src/views/corporation/Corporation.vue

@ -1,7 +1,7 @@
<template>
<q-splitter :model-value="60" class="w-full h-full">
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1">
<div class="pr-1" style="height: 100%">
<w-grid
ref="corporationTreeGridRef"
:title="$t('system.corporation.grid.title')"
@ -88,7 +88,7 @@
</div>
</template>
<template #after>
<div class="pl-1">
<div class="pl-1" style="height: 100%">
<SelectUserGrid
ref="userGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryUsersByCorporation')"

2
io.sc.platform.system.frontend/src/views/datasource/Datasource.vue

@ -1,5 +1,5 @@
<template>
<div>
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('system.i18n.grid.title')"

10
io.sc.platform.system.frontend/src/views/department/Department.vue

@ -1,7 +1,7 @@
<template>
<q-splitter :model-value="60" class="w-full h-full">
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1">
<div class="pr-1" style="height: 100%">
<w-grid
ref="treeGridRef"
:title="$t('system.department.grid.title')"
@ -89,13 +89,13 @@
</div>
</template>
<template #after>
<div class="pl-1">
<div class="pl-1" style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0">
<q-tab name="user" icon="bi-diagram-3" :label="$t('user')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="user" class="px-0">
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="user" class="px-0 pb-0" style="height: 100%">
<SelectUserGrid
ref="userGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryUsersByDepartment')"

12
io.sc.platform.system.frontend/src/views/menu/Menu.vue

@ -1,7 +1,7 @@
<template>
<q-splitter :model-value="60" class="w-full h-full">
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1">
<div class="pr-1" style="height: 100%">
<w-grid
ref="menuTreeGridRef"
:title="$t('system.menu.grid.title')"
@ -186,14 +186,14 @@
</div>
</template>
<template #after>
<div class="pl-1">
<div class="pl-1" style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0">
<q-tab name="role" icon="bi-diagram-3" :label="$t('role')" />
<q-tab name="org" icon="bi-people" :label="$t('org')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="role" class="px-0">
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="role" class="px-0 pb-0" style="height: 100%">
<SelectRoleGrid
ref="roleGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/role/queryRolesByMenu')"
@ -207,7 +207,7 @@
></SelectRoleGrid>
</q-tab-panel>
<q-tab-panel name="org" class="px-0">
<q-tab-panel name="org" class="px-0 pb-0" style="height: 100%">
<SelectOrgTreeGrid
ref="orgTreeGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByMenu')"

12
io.sc.platform.system.frontend/src/views/org/Org.vue

@ -1,7 +1,7 @@
<template>
<q-splitter :model-value="60" class="w-full h-full">
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1">
<div class="pr-1" style="height: 100%">
<w-grid
ref="orgTreeGridRef"
:title="$t('system.org.grid.title')"
@ -90,14 +90,14 @@
</div>
</template>
<template #after>
<div class="pl-1">
<div class="pl-1" style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0">
<q-tab name="user" icon="bi-diagram-3" :label="$t('user')" />
<q-tab name="menu" icon="bi-people" :label="$t('menu')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="user" class="px-0">
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="user" class="px-0 pb-0" style="height: 100%">
<SelectUserGrid
ref="userGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryUsersByOrg')"
@ -111,7 +111,7 @@
>
</SelectUserGrid>
</q-tab-panel>
<q-tab-panel name="menu" class="px-0">
<q-tab-panel name="menu" class="px-0 pb-0" style="height: 100%">
<SelectMenuTreeGrid
ref="menuTreeGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/menu/listAllMenusWithSelectedStatusByOrg')"

12
io.sc.platform.system.frontend/src/views/role/Role.vue

@ -1,7 +1,7 @@
<template>
<q-splitter :model-value="60" class="w-full h-full">
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1">
<div class="pr-1" style="height: 100%">
<w-grid
ref="roleGridRef"
:title="$t('system.role.grid.title')"
@ -80,14 +80,14 @@
</div>
</template>
<template #after>
<div class="pl-1">
<div class="pl-1" style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="menu" icon="bi-menu-app" :label="$t('menu')" />
<q-tab name="user" icon="bi-person" :label="$t('user')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="menu" class="px-0">
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="menu" class="px-0 pb-0" style="height: 100%">
<SelectMenuTreeGrid
ref="menuTreeGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/menu/listAllMenusWithSelectedStatusByRole')"
@ -97,7 +97,7 @@
></SelectMenuTreeGrid>
</q-tab-panel>
<q-tab-panel name="user" class="px-0">
<q-tab-panel name="user" class="px-0 pb-0" style="height: 100%">
<SelectUserGrid
ref="userGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryUsersByRole')"

14
io.sc.platform.system.frontend/src/views/user/User.vue

@ -1,8 +1,8 @@
<template>
<div>
<q-splitter :model-value="60" class="w-full h-full">
<div style="height: 100%">
<q-splitter :model-value="60" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1">
<div class="pr-1" style="height: 100%">
<w-grid
ref="userGridRef"
:title="$t('system.user.grid.title')"
@ -181,14 +181,14 @@
</div>
</template>
<template #after>
<div class="pl-1">
<div class="pl-1" style="height: 100%">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="role" icon="bi-people" :label="$t('role')" />
<q-tab name="org" icon="bi-diagram-3" :label="$t('org')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="role" class="px-0">
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="role" class="px-0 pb-0" style="height: 100%">
<SelectRoleGrid
ref="roleGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/role/queryRolesByUser')"
@ -201,7 +201,7 @@
@select-all-out="selectAllOut"
></SelectRoleGrid>
</q-tab-panel>
<q-tab-panel name="org" class="px-0">
<q-tab-panel name="org" class="px-0 pb-0" style="height: 100%">
<SelectOrgTreeGrid
ref="orgTreeGridRef"
:fetch-data-url="Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByUser')"

33
io.sc.standard.frontend/package.json

@ -68,9 +68,22 @@
"@vue/babel-plugin-jsx": "1.1.5"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.3",
"exceljs": "4.4.0",
@ -78,26 +91,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.155",
"platform-core": "8.1.158",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}
}

Loading…
Cancel
Save