CaiYuanYiTiHua/src/components/ProcessDesigner/package/penal/startEvent/index.vue

560 lines
16 KiB
Vue

<!-- 开始节点配置 -->
<template>
<div class="start-event">
<a-form
ref="formRef"
:model="node"
labelAlign="left"
:label-col="labelCol"
:wrapper-col="wrapperCol"
:disabled="data.componentDisabled"
>
<a-form-item label="节点标识">
<a-input v-model:value="node.id" placeholder="请输入" readonly />
</a-form-item>
<a-form-item label="下一审核人">
<a-switch v-model:checked="node.isNextAuditor" @change="updateWfData('isNextAuditor')" />
</a-form-item>
<a-form-item label="自定义标题">
<a-switch v-model:checked="node.isCustmerTitle" @change="updateWfData('isCustmerTitle')" />
</a-form-item>
<a-form-item label="通知策略" name="f_Color">
<a-checkbox-group
v-model:value="node.messageType"
name="checkboxgroup"
@change="updateWfData('messageType')"
:options="[
{ value: '1', label: '短信' },
{ value: '2', label: '邮箱' },
{ value: '3', label: '微信' },
{ value: '4', label: '站内消息' },
]"
/>
</a-form-item>
<a-divider plain="true">表单添加</a-divider>
<a-tabs
v-model:activeKey="node.formType"
type="card"
size="small"
centered="true"
@change="tabsChange"
>
<a-tab-pane key="1" tab="自定义表单">
<a-space direction="vertical" size="middle" class="site-space-compact-wrapper">
<a-space-compact block>
<a-input v-model:value="data.formName" placeholder="请选择表单" readonly />
<a-button @click="handleShow"></a-button>
</a-space-compact>
<a-space-compact block>
<a-select
v-model:value="node.formVerison"
placeholder="请选择表单版本"
@change="custmerformVerisonChange"
:options="data.formVerisons"
:fieldNames="{ value: 'id', label: 'createDate' }"
/>
</a-space-compact>
<a-space-compact block>
<a-select
v-model:value="node.formRelationId"
placeholder="请选择流程关联字段"
@change="updateWfData('formRelationId')"
:options="data.formRelations"
/>
</a-space-compact>
<a-space-compact block>
<a-input v-model:value="node.formTitle" placeholder="请输入表单标题" />
</a-space-compact>
</a-space>
</a-tab-pane>
<a-tab-pane key="2" tab="系统表单">
<a-space direction="vertical" size="middle" class="site-space-compact-wrapper">
<a-space-compact block>
<a-input
v-model:value="node.formUrl"
placeholder="请输入PC端表单地址"
@change="updateWfData('formUrl')"
/>
</a-space-compact>
<a-space-compact block>
<a-input v-model:value="node.formTitle" placeholder="请输入PC端表单标题" />
</a-space-compact>
<a-space-compact block>
<a-input
v-model:value="node.formAppUrl"
placeholder="请输入APP端表单地址"
@change="updateWfData('formAppUrl')"
/>
</a-space-compact>
</a-space>
</a-tab-pane>
</a-tabs>
<a-divider plain="true">表单字段权限</a-divider>
<a-table
:columns="data.columns"
:data-source="node.authFields"
bordered
:pagination="false"
v-if="node.formType == 1"
>
<template #bodyCell="{ column, text, record }">
<template v-if="['label', 'field'].includes(column.dataIndex)">
<div>
{{ text }}
</div>
</template>
<template v-else-if="['required', 'disabled', 'ifShow'].includes(column.dataIndex)">
<div>
<a-switch v-model:checked="record[column.dataIndex]" size="small" />
</div>
</template>
</template>
</a-table>
<a-table
:columns="data.columns"
:data-source="node.authFields"
bordered
:pagination="false"
v-else
>
<template #bodyCell="{ column, record }">
<template v-if="['label', 'fieldName'].includes(column.dataIndex)">
<div>
<a-input v-model:value="record[column.dataIndex]" placeholder="请输入" />
</div>
</template>
<template v-else-if="['required', 'disabled', 'ifShow'].includes(column.dataIndex)">
<div>
<a-switch v-model:checked="record[column.dataIndex]" size="small" />
</div>
</template>
<template v-else-if="column.dataIndex === 'operation'">
<delete-outlined
two-tone-color="#eb2f96"
@click="handleDeleteAuthField(record.field)"
/>
</template>
</template>
</a-table>
<a-divider plain="true" />
<a-space v-if="node.formType != 1">
<a-button
@click="handleAddAuthField"
width="100%"
type="dashed"
danger
:icon="h(PlusOutlined)"
>添加字段</a-button
>
</a-space>
</a-form>
<a-modal
width="60%"
wrap-class-name="full-modal"
v-model:open="data.formOpen"
title="选择表单"
@ok="formHandleOk"
:destroyOnClose="true"
>
<SelectForm ref="formRef" />
</a-modal>
</div>
</template>
<script lang="ts" setup>
import { reactive, defineProps, ref, watch, h, onMounted } from 'vue';
import { DeleteOutlined, PlusOutlined } from '@ant-design/icons-vue';
import { flowStore } from '@/store/modules/flow';
import { SelectForm } from '@/components/SelectForm/index';
import { functionGetSchemePageList, functionLoadFormPage } from '@/api/demo/formScheme';
import { cardNestStructure } from '@/views/demo/onlineform/util.ts';
const flowWfDataStore = flowStore();
const labelCol = { span: 7 };
const wrapperCol = { span: 17 };
// 表单选择声明
const props = defineProps({
disabled: {
type: Boolean,
default: false,
},
element: {
type: Object,
default: () => {
return {};
},
},
schemeCode: String,
pageType: String,
pageView: String,
});
interface dataType {
columns: any;
formRelations: any;
elementData: any;
componentDisabled: boolean;
formOpen: boolean;
formVerisons: any;
formName: string;
}
const data: dataType = reactive({
columns: [
{
title: '名称',
dataIndex: 'label',
},
{
title: '字段',
dataIndex: 'fieldName',
},
{
title: '必填',
dataIndex: 'required',
},
{
title: '编辑',
dataIndex: 'disabled',
},
{
title: '查看',
dataIndex: 'ifShow',
},
],
formRelations: [],
elementData: props.element,
componentDisabled: props.pageType == 'detail' ? true : false,
formOpen: false,
formVerisons: [],
formName: '',
});
let node: any = ref({});
watch(
() => node.value.formCode,
(newVal) => {
if (newVal) {
getFormList();
getVersions(false);
}
},
);
watch(
() => props.element,
(newVal) => {
if (newVal.type == 'bpmn:StartEvent') {
const currentNode = flowWfDataStore.getWfDataNode(newVal.id);
if (currentNode) {
node.value = currentNode;
} else {
node.value = newVal;
}
}
},
);
watch(
() => node.value.formType,
(newVal) => {
if (newVal == 1) {
data.columns = data.columns.filter((item) => item.dataIndex !== 'operation');
} else {
data.columns.push({
title: '',
dataIndex: 'operation',
});
}
},
);
onMounted(() => {
if (props.element.type == 'bpmn:StartEvent') {
const currentNode = flowWfDataStore.getWfDataNode(props.element.id);
console.log(currentNode);
if (currentNode) {
node.value = currentNode;
} else {
node.value = props.element;
}
}
});
// 编辑时获取表单名称,表单版本
async function getFormList() {
const list = await functionLoadFormPage({
page: 1,
limit: 1000,
});
list.items.forEach((element) => {
if (element.id == node.value.formCode) {
data.formName = element.name;
}
});
}
// 切换自定义表单和系统表单
function tabsChange() {
data.formName = '';
node.value.formCode = '';
node.value.formTitle = '';
node.value.formVerison = '';
node.value.formRelationId = '';
node.value.formUrl = '';
node.value.formAppUrl = '';
node.value.authFields = [];
node.value.formRelations = [];
}
// 表单选择打开
function handleShow() {
data.formOpen = true;
}
// 表单选择
const formRef = ref<any>();
async function formHandleOk() {
let obj = formRef.value.getRow();
node.value.formCode = obj[0].id;
data.formName = obj[0].name;
node.value.formVerison = '';
node.value.formRelationId = '';
node.value.formUrl = '';
node.value.formAppUrl = '';
node.value.authFields = [];
node.value.formRelations = [];
getVersions(true);
data.formOpen = false;
}
async function getVersions(isChange) {
const list = await functionGetSchemePageList({
schemeInfoId: node.value.formCode,
});
data.formVerisons = list.items;
if (node.value.formVerison) {
custmerformVerisonChange(node.value.formVerison, isChange);
}
}
// 表单版本更改
async function custmerformVerisonChange(val, isChange) {
let obj;
data.formVerisons.forEach((element) => {
if (element.id == val) {
obj = element;
}
});
loadFormScheme(obj.scheme, isChange);
}
const cardComponentChild = (data, result) => {
data.forEach((optionsElement) => {
optionsElement.children.forEach((childrenElement) => {
let obj: any = childrenElement;
obj.required = childrenElement.itemProps.required;
obj.disabled = true;
obj.ifShow = true;
obj.label = `${optionsElement.label} - ${childrenElement.label}`;
obj.fieldName = childrenElement.componentProps.fieldName;
result.push(obj);
if (childrenElement.component === 'CardGroup') {
result = cardComponentChild(childrenElement.componentProps.options, result);
}
});
});
return result;
};
function loadFormScheme(strScheme, isChange) {
const scheme = JSON.parse(strScheme);
let fields: any[] = [];
const rfields: {
label?: string;
value?: string;
}[] = [];
scheme.formInfo.tabList = cardNestStructure(scheme.formInfo.tabList);
console.log(scheme.formInfo.tabList);
scheme.formInfo.tabList.forEach((tabElement) => {
tabElement.schemas.forEach(
(element: { label?: string; field?: string; component: any; itemProps: any }) => {
if (['InputGuid'].includes(element.component)) {
rfields.push({
label: element.label,
// value:element.prop
value: element.field,
});
}
if (
![
'Divider',
'Grid',
'Card',
'CreateUser',
'CreateTime',
'ModifyUser',
'ModifyTime',
'CardGroup',
].includes(element.component) &&
!element.itemProps.hidden
) {
let obj: any = element;
obj.required = element.itemProps.required;
// obj.componentProps.disabled = false;
obj.disabled = true;
obj.ifShow = true;
obj.fieldName = element.componentProps.fieldName;
fields.push(obj);
} else if (['Grid'].includes(element.component) || element.type == 'subTable') {
console.log('gridtable');
fields.push({
field: `${element.field}_add`,
label: `${element.label || '表格'}-添加按钮`,
required: false,
disabled: true,
ifShow: false,
type: 'grid',
});
fields.push({
field: `${element.field}_remove`,
label: `${element.label || '表格'}-删除按钮`,
required: false,
disabled: true,
ifShow: false,
type: 'grid',
});
fields.push({
field: `${element.field}_required`,
label: `${element.label || '表格'}-数据`,
required: element.itemProps.required,
disabled: false,
ifShow: false,
type: 'gridrequired',
});
element.columns.forEach((child) => {
child.children.forEach((t) => {
fields.push({
gridprop: element.field,
field: t.field,
label: `${element.label || '表格'}-${t.label}`,
required: t.itemProps.required,
disabled: true,
ifShow: true,
fieldName: t.componentProps.fieldName,
...t,
});
});
});
} else if (['Card'].includes(element.component)) {
console.log(3);
element.columns.forEach((child) => {
child.children.forEach((t) => {
fields.push({
gridprop: element.field,
field: t.field,
required: t.itemProps.required,
disabled: true,
ifShow: true,
fieldName: t.componentProps.fieldName,
...t,
});
});
});
} else if (
['CreateUser', 'CreateTime', 'ModifyUser', 'ModifyTime'].includes(element.component) &&
element.display
) {
let obj: any = element;
obj.required = element.itemProps.required;
// obj.componentProps.disabled = false;
obj.disabled = true;
obj.ifShow = true;
obj.fieldName = element.componentProps.fieldName;
fields.push(obj);
} else if (['CardGroup'].includes(element.component)) {
let obj: any = element;
obj.required = element.itemProps.required;
// obj.componentProps.disabled = false;
obj.disabled = true;
obj.ifShow = true;
obj.fieldName = element.componentProps.fieldName;
obj.label = `卡片组-${element.label}`;
fields.push(obj);
fields = cardComponentChild(element.componentProps.options, fields);
}
},
);
});
data.formRelations = rfields;
if (isChange) {
node.value.authFields = fields;
}
}
function updateWfData(key) {
// flowWfDataStore.updataWfDataNode(node.value.id, key, node.value[key]);
}
function handleAddAuthField() {
node.value.authFields.push({
field: '',
label: '',
required: true,
disabled: true,
ifShow: true,
});
}
function handleDeleteAuthField(key) {
node.value.authFields = node.value.authFields.filter((item) => item.field !== key);
}
</script>
<style lang="less" scoped>
.site-space-compact-wrapper {
width: 100%;
.ant-select {
width: 100%;
}
}
::v-deep .ant-tabs {
padding: 0 !important;
}
::v-deep .ant-space {
width: 90%;
margin-left: 5%;
.ant-space-item {
width: 100%;
button {
width: 20%;
}
.ant-btn-dangerous {
width: 100%;
}
}
}
.l-rblock {
width: 100%;
height: 100%;
background: #f0f2f5;
}
.l-page-pane {
box-sizing: border-box;
position: relative;
width: 100%;
height: 100%;
max-width: 794px;
overflow: hidden auto;
background: #fff;
border-radius: 4px;
margin: auto;
padding: 24px;
}
.addDataBaseTableBox {
border: 1px dashed #f0f0f0;
text-align: center;
cursor: pointer;
margin-top: -20px;
&:hover {
border-color: #409eff;
}
}
.connectTableTitle {
padding-top: 20px;
}
.formLine {
height: 50px;
}
</style>