Compare commits

...

2 Commits

19 changed files with 735 additions and 600 deletions

View File

@ -2,7 +2,8 @@
import { defHttp } from '@/utils/http/axios';
import {SchemeListParams,GetSchemeModel,AddParams,
DeleteParams,UpdateParams,StateParams,HistoryParams,GetHistoryModel,SchemeParams,DetailParams} from './model/wfSchemeInfoModel'
enum Api {
enum Api {
// 流程模板基本信息
LoadPage = '/api/WFSchemeInfo/LoadPage',
Add = '/api/WFSchemeInfo/Add',

21
src/api/sys/flowPenal.ts Normal file
View File

@ -0,0 +1,21 @@
import { defHttp } from '@/utils/http/axios';
import {TableListParams,TableListModel,TableFormsParams,TableFormsModel} from './model/flowPenal'
enum Api {
GetTableList = '/api/FormModule/GetTableList',
GetTableForms = '/api/CodeTable/GetForms',
Update = '/api/SysDataItemDetail/Update',
Delete = '/api/SysDataItemDetail/Delete',
}
/**
* @description: getTableList
*/
export function getTableList(params: TableListParams) {
return defHttp.get<TableListModel>({ url: Api.GetTableList, params });
}
/**
* @description: getTableForms
*/
export function getTableForms(params: TableFormsParams) {
return defHttp.get<TableFormsModel>({ url: Api.GetTableForms, params });
}

View File

@ -0,0 +1,29 @@
/**
* @description:
*/
export interface TableListModel {
name: string;
description: number;
dbObjectType: number;
}
/**
* @description:
*/
export interface TableListParams {
code: string;
}
/**
* @description:
*/
export interface TableFormsParams {
dbCode: string;
tableNames: string;
}
/**
* @description:
*/
export interface TableFormsModel {
db_codetable: object;
db_codecolumnsList:object
}

View File

@ -9,7 +9,7 @@ export interface SchemeListParams {
ids?: string;
}
/**
* @description:
* @description: \
*/
export interface DetailParams {
code: string;

View File

@ -63,19 +63,21 @@
validateFlow
})
function connectionAdded(node) {
console.log(node)
data.element = node;
console.log('connectionAdded')
}
function connectionRemoved(node) {
console.log(node)
console.log('connectionRemoved')
}
function connectionChanged(node) {
console.log(node)
data.element = node;
console.log('connectionChanged')
}
function elementClick(element) {
console.log(element)
console.log('elementClick')
data.element = element;
}
function initModeler(modeler) {

View File

@ -50,6 +50,7 @@ export default {
"Timer start event": "定时开始事件",
"Conditional start event": "条件开始事件",
"Signal start event": "信号开始事件",
"Exclusive gateway":"排他网关",
"Parallel gateway":"并行网关",
"Inclusive gateway":"包容网关",
"Complex gateway":"复杂网关",

View File

@ -5,16 +5,26 @@
<start-event-option ref="startRef" :element="data.currentWfNode" :schemeCode="props.schemeCode"
:pageView="props.pageView" :pageType="props.pageType"
:class="data.currentWfNode.type=='bpmn:StartEvent' ? '' : 'hidden'"></start-event-option>
<user-task-option ref="taskRef" :element="data.currentWfNode" :schemeCode="props.schemeCode" :pageView="props.pageView" :pageType="props.pageType"
<user-task-option ref="taskRef" :element="data.currentWfNode" :schemeCode="props.schemeCode"
:pageView="props.pageView" :pageType="props.pageType"
:class="data.currentWfNode.type=='bpmn:Task' ? '' : 'hidden'">
</user-task-option>
<end-event-option ref="endRef" :element="data.currentWfNode" :schemeCode="props.schemeCode"
:class="data.currentWfNode.type=='bpmn:EndEvent' ? '' : 'hidden'"></end-event-option>
<subprocess-option ref="subprocessRef" :element="data.currentWfNode" :schemeCode="props.schemeCode" :pageView="props.pageView" :pageType="props.pageType"
<subprocess-option ref="subprocessRef" :element="data.currentWfNode" :schemeCode="props.schemeCode"
:pageView="props.pageView" :pageType="props.pageType"
:class="data.currentWfNode.type=='bpmn:SubProcess' ? '' : 'hidden'"></subprocess-option>
<exclusive-gateway-option ref="exclusiveGatewayRef" :element="data.currentWfNode" :schemeCode="props.schemeCode"
:pageView="props.pageView" :pageType="props.pageType"
:class="data.currentWfNode.type=='bpmn:ExclusiveGateway' ? '' : 'hidden'">
</exclusive-gateway-option>
<myline-option ref="mylineRef" :element="data.currentWfNode" :schemeCode="props.schemeCode"
:pageView="props.pageView" :pageType="props.pageType" :wfData="data.wfData" :flowRef="data.flowRef"
:class="data.currentWfNode.type=='bpmn:SequenceFlow' ? '' : 'hidden'">
</myline-option>
</a-tab-pane>
<a-tab-pane tab="流程属性" key="2">
<shcemeinfo-config ref="shcemeinfoRef" :disabled="true" :pageType="props.pageType"></shcemeinfo-config>
<shcemeinfo-config ref="shcemeinfoRef" :disabled="true" :pageType="props.pageType"></shcemeinfo-config>
</a-tab-pane>
<a-tab-pane key="3" tab="发起权限" force-render v-if="props.pageType!='detail'">
<auth-config ref="authRef"></auth-config>
@ -47,8 +57,8 @@
import endEventOption from './endEvent/index.vue'
//
import gatewayAndOption from './config/gatewayAnd.vue'
//
import gatewayInclusiveOption from './config/gatewayInclusive.vue'
//
import exclusiveGatewayOption from './exclusiveGateway/index.vue'
// Xor
import gatewayXorOption from './config/gatewayXor.vue'
//
@ -56,7 +66,7 @@
//
import subprocessOption from './subprocess/index.vue'
// 线
import mylineOption from './config/myline.vue'
import mylineOption from './myline/index.vue'
/**
* 侧边栏
* @Author MiyueFE
@ -86,14 +96,18 @@
const taskRef = ref < any > ()
const endRef = ref < any > ()
const subprocessRef = ref < any > ()
const exclusiveGatewayRef = ref < any > ()
const configActiveName = ref('2')
const data = reactive({
currentWfNode: undefined,
wfNodeName: "",
wfData:[],
flowRef:{}
})
watch(
() => props.element,
(newVal, oldVal) => {
console.log(newVal)
var typeName = newVal.type.replace('bpmn:', '')
if (newVal.type == "bpmn:Process") {
data.currentWfNode = {
@ -132,6 +146,27 @@
type: newVal.type
}
break;
case 'ExclusiveGateway':
data.wfNodeName = "排他网关"
data.currentWfNode = {
id: newVal.id,
type: newVal.type
}
break;
case 'SequenceFlow':
data.wfNodeName = "线条"
data.currentWfNode = {
id: newVal.id,
type: newVal.type
}
// 线id
data.flowRef={
from:newVal.businessObject.sourceRef.id,
to:newVal.businessObject.targetRef.id,
}
// 使
getWfData()
break;
default:
break;
@ -219,7 +254,34 @@
}
}
}
async function getWfData() {
let wfData = []
// exclusiveGatewayRef
// taskRef
let taskFrom = await !(taskRef.value) ? {} : taskRef.value.getForm();
let gatewayInclusiveFrom = await !(exclusiveGatewayRef.value) ? {} : exclusiveGatewayRef.value.getForm();
if (gatewayInclusiveFrom != undefined) {
wfData.push(gatewayInclusiveFrom)
}
if (taskFrom != undefined) {
wfData.push(taskFrom)
}
// 3.
wfData.forEach(node => {
if (node.type == 'myline' && !node.isInit) {
node.isInit = true
node.lineConditions = ''
const fromNode = this.wfData.find(t => t.id == node.from)
if (fromNode.type == 'userTask') {
if (fromNode.btnlist.findIndex(t => t.code == 'agree' && !t.hidden) != -1) {
node.lineConditions = 'agree' //
}
}
}
});
data.wfData = wfData
}
async function validatePanel() {
let res = await shcemeinfoRef.value.validateForm();
return res
@ -243,13 +305,20 @@
let wfData = []
wfData.push(startFrom)
wfData.push(endFrom)
//
let taskFrom = await !(taskRef.value) ? {} : taskRef.value.getForm();
if (taskFrom != undefined) {
wfData.push(taskFrom)
}
//
let subprocessFrom = await !(subprocessRef.value) ? {} : subprocessRef.value.getForm();
if (subprocessFrom != undefined) {
wfData.push(subprocessFrom)
}
if (taskFrom != undefined) {
wfData.push(taskFrom)
//
let gatewayInclusiveFrom = await !(exclusiveGatewayRef.value) ? {} : exclusiveGatewayRef.value.getForm();
if (gatewayInclusiveFrom != undefined) {
wfData.push(gatewayInclusiveFrom)
}
// 3.
wfData.forEach(node => {
@ -324,8 +393,8 @@
onMounted(() => {
if (props.schemeCode) {
getDetailInfo()
}
if(props.pageType == 'detail') {
}
if (props.pageType == 'detail') {
var content = JSON.parse(props.pageView)
shcemeinfoRef.value.setForm(content)
}

View File

@ -1,145 +0,0 @@
<template>
<div class="l-from-body" >
<el-form :model="formData" :rules="rules" size="mini" ref="form" label-width="120px" >
<el-col :span="24">
<el-form-item label="条件名称" prop="name">
<el-input v-model="formData.name" >
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="数据库" prop="dbCode">
<el-select v-model="formData.dbCode" placeholder="请选择">
<el-option-group
v-for="group in lr_dblinkTree"
:key="group.id"
:label="group.label">
<el-option
v-for="item in group.children"
:key="item.id"
:label="item.label"
:value="item.id">
</el-option>
</el-option-group>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="数据表" prop="table">
<l-codetable-select
@change="handleTableChange"
:dbCode="formData.dbCode"
v-model="formData.table"></l-codetable-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="关联流程字段" prop="rfield">
<l-select :options="formData.columns" valueKey="name" labelKey="coment" v-model="formData.rfield" >
</l-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="比较字段" prop="cfield">
<l-select :options="formData.columns" valueKey="name" labelKey="coment" v-model="formData.cfield" >
</l-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="比较类型" prop="compareType">
<l-select :options="options" v-model="formData.compareType" >
</l-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="数据值" prop="value">
<el-input v-model="formData.value" >
</el-input>
</el-form-item>
</el-col>
</el-form>
</div>
</template>
<script>
export default {
name:'condition-formula',
props:{
},
data(){
return {
formData:{
dbCode:'',
table:'',
columns:[],
rfield:'',
cfield:'',
compareType:'',
value:'',
name:''
},
rules: {
dbCode: [
{ required: true, message: '请选择数据库' }
],
table: [
{ required: true, message: '请选择数据表' }
],
rfield: [
{ required: true, message: '请选择关联字段' }
],
cfield: [
{ required: true, message: '请选择比较字段' }
],
compareType: [
{ required: true, message: '请选择比较类型' }
],
value: [
{ required: true, message: '请填写值' }
],
name: [
{ required: true, message: '请填写条件名称' }
]
},
options:[
{ value: '1', label: '等于' },
{ value: '2', label: '不等于' },
{ value: '3', label: '大于' },
{ value: '4', label: '大于等于' },
{ value: '5', label: '小于' },
{ value: '6', label: '小于等于' },
{ value: '7', label: '包含' },
{ value: '8', label: '不包含' },
{ value: '9', label: '包含于' },
{ value: '10', label: '不包含于' }]
};
},
computed:{
},
created () {
},
methods:{
handleTableChange(table){
this.formData.columns = table.columns;
console.log(table);
},
resetForm(){
this.formData.columns = [];
this.$refs.form && this.$refs.form.resetFields();
},
//
validateForm(callback){
this.$refs.form.validate((valid) => {
if(valid){
callback();
}
});
},
setForm(data){
this.formData = this.$deepClone(data);
},
getForm(){
let formData = this.$deepClone(this.formData);
return formData;
}
}
}
</script>

View File

@ -1,98 +0,0 @@
<template>
<div class="l-from-body" >
<el-form :model="formData" :rules="rules" size="mini" ref="form" label-width="120px" >
<el-col :span="24">
<el-form-item label="条件名称" prop="name">
<el-input v-model="formData.name" >
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="数据库" prop="dbCode">
<el-select v-model="formData.dbCode" placeholder="请选择">
<el-option-group
v-for="group in lr_dblinkTree"
:key="group.id"
:label="group.label">
<el-option
v-for="item in group.children"
:key="item.id"
:label="item.label"
:value="item.id">
</el-option>
</el-option-group>
</el-select>
</el-form-item>
</el-col>
<div style="padding:0 0 16px 120px;">
<el-alert
title="sql语句说明"
type="warning"
description="请在开发人员指导下进行配置SQL语句{processId}流程发起实例主键{userId}流程发起用户Id{userAccount}流程发起用户账号{companyId}流程发起用户公司{departmentId}流程发起用户部门)!"
show-icon
:closable="false"
>
</el-alert>
</div>
<el-col :span="24">
<el-form-item label="SQL语句" prop="sql">
<el-input v-model="formData.sql" type="textarea"
:autosize="{ minRows: 8}" >
</el-input>
</el-form-item>
</el-col>
</el-form>
</div>
</template>
<script>
export default {
name:'condition-sql',
props:{
},
data(){
return {
formData:{
dbCode:'',
sql:'',
name:''
},
rules: {
dbCode: [
{ required: true, message: '请选择数据库' }
],
sql: [
{ required: true, message: '请填写sql语句' }
],
name: [
{ required: true, message: '请填写条件名称' }
]
},
};
},
computed:{
},
created () {
},
methods:{
resetForm(){
this.$refs.form && this.$refs.form.resetFields();
},
//
validateForm(callback){
this.$refs.form.validate((valid) => {
if(valid){
callback();
}
});
},
setForm(data){
this.formData = this.$deepClone(data);
},
getForm(){
let formData = this.$deepClone(this.formData);
return formData;
}
}
}
</script>

View File

@ -1,211 +0,0 @@
<template>
<l-layout :top="180" >
<template #top>
<el-form
class="l-form-config"
label-width="88px"
label-position="left"
size="mini"
>
<el-form-item label="节点标识">
<el-input v-model="node.id" readonly ></el-input>
</el-form-item>
<div style="padding:0 16px;">
<el-alert
title="包容网关说明"
type="info"
description="包容网关会等待所有分支汇入才往下执行出口分支能执行多条条件为true"
show-icon
:closable="false"
>
</el-alert>
</div>
</el-form>
</template>
<l-layout :top="40">
<template #top v-if="!disabled">
<div style="padding-left:8px;float:left;" >
<el-button-group>
<el-button size="mini" icon="el-icon-plus" @click="handleFormulaClick">{{$t('')}}</el-button>
<el-button size="mini" icon="el-icon-plus" @click="handleSQlClick">{{$t('sql')}}</el-button>
</el-button-group>
</div>
<div style="padding-right:8px;float:right;">
<el-button size="mini" type="danger" icon="el-icon-delete" @click="handleClearClick">{{$t('')}}</el-button>
</div>
</template>
<l-table :columns="columns" :dataSource="node.conditions" >
<template v-slot:type="scope" >
{{typeFormat(scope.row.type)}}
</template>
<l-table-btns v-if="!disabled" :btns="tableBtns" @click="handleTableBtnClick" ></l-table-btns>
</l-table>
</l-layout>
<l-dialog
:title="$t('添加公式条件')"
:visible.sync="formulaVisible"
:height="480"
@ok="handleFormulaOk"
@closed="handleFormulaClosed"
@opened="handleFormulaOpened"
>
<condition-formula ref="conditionFormula" ></condition-formula>
</l-dialog>
<l-dialog
:title="$t('添加sql条件')"
:visible.sync="sqlVisible"
:height="480"
@ok="handleSqlOk"
@closed="handleSqlClosed"
@opened="handleSqlOpened"
>
<condition-sql ref="conditionSql" ></condition-sql>
</l-dialog>
</l-layout>
</template>
<script>
import conditionFormula from './conditionFormula.vue'
import conditionSql from './conditionSql.vue'
export default {
name:'gateway-inclusive-option',
props:{
disabled:{
type:Boolean,
default:false
}
},
components: {
conditionFormula,
conditionSql
},
data () {
return {
tableBtns:[
{prop:'Edit',label:'编辑'},
{prop:'Delete',label:'删除'}
],
columns:[
{label:'类型',prop:'type',width:'80', align: 'center'},
{label:'名称',prop:'name',minWidth:'100'},
],
tableData:[],
formulaVisible:false,
sqlVisible:false,
editRow:null,
isEdit:false,
rowIndex:0,
}
},
computed: {
node(){
return this.wfdesign.currentWfNode;
}
},
inject: ["wfdesign"],
methods:{
typeFormat(type){
switch(type){
case '1':
return '表达式'
case '2':
return 'sql语句'
}
},
handleTableBtnClick(btn){
switch(btn.type){
case 'Edit':
this.isEdit = true;
this.editRow = btn.row;
this.rowIndex = btn.rowIndex;
if(this.editRow.type == '1'){
this.formulaVisible = true;
}
else{
this.sqlVisible = true;
}
break;
case 'Delete':
this.node.conditions.splice(btn.rowIndex,1);
break;
}
console.log(btn);
//this.tableData.splice(btn.rowIndex,1);
},
handleFormulaClick(){
this.isEdit = false;
this.formulaVisible = true;
},
handleSQlClick(){
this.isEdit = false;
this.sqlVisible = true;
},
handleClearClick(){
this.node.conditions = [];
},
handleFormulaOk(){
this.$refs.conditionFormula.validateForm(()=>{
let formData = this.$refs.conditionFormula.getForm();
formData.type = '1';
if(this.isEdit){
this.node.conditions[this.rowIndex] = formData;
}
else{
formData.code = this.$uuid();
this.node.conditions.push(formData);
}
this.formulaVisible = false;
})
},
handleFormulaOpened(){
if(this.isEdit){
this.$refs.conditionFormula.setForm(this.editRow);
}
},
handleFormulaClosed(){
this.$refs.conditionFormula.resetForm();
},
handleSqlOk(){
this.$refs.conditionSql.validateForm(()=>{
let formData = this.$refs.conditionSql.getForm();
formData.type = '2';
if(this.isEdit){
this.node.conditions[this.rowIndex] = formData;
}
else{
formData.code = this.$uuid();
this.node.conditions.push(formData);
}
this.sqlVisible = false;
})
},
handleSqlOpened(){
if(this.isEdit){
this.$refs.conditionSql.setForm(this.editRow);
}
},
handleSqlClosed(){
this.$refs.conditionSql.resetForm();
},
}
}
</script>
<style>
</style>

View File

@ -1,120 +0,0 @@
<!-- 开始节点配置 -->
<template>
<el-form
class="l-form-config"
label-width="88px"
label-position="left"
size="mini">
<el-form-item label="节点标识">
<el-input v-model="node.id" readonly ></el-input>
</el-form-item>
<el-form-item v-if="conditionsOptions && conditionsOptions.length >0" label="流转条件">
<l-select
:disabled="disabled"
v-model="value"
:options="conditionsOptions"
labelKey="name"
valueKey="code"
:multiple="true"
placeholder="不选择,默认流转条件为true"
></l-select>
</el-form-item>
</el-form>
</template>
<script>
export default {
name:'line-option',
props:{
disabled:{
type:Boolean,
default:false
}
},
data () {
return {
conditionsOptions:[],
value2:''
}
},
computed: {
node(){
return this.wfdesign.currentWfNode;
},
value:{
get(){
return this.value2;
},
set(val){
this.value2 = val;
this.node.lineConditions = val;
}
}
},
inject: ["wfdesign"],
created(){
this.getConditions()
},
methods:{
getConditions(){
let wfdata = this.wfdesign.handleGetWFData();
let fromNode = wfdata.find(t=>t.id == this.node.from);
/**
* startEvent:'开始节点',
endEvent:'结束节点',
gatewayAnd:'并行网关',
gatewayInclusive:'包含网关',
gatewayXor:'排他网关',
scriptTask:'脚本节点',
userTask:'审核节点',
subprocess:'子流程',
*/
switch(fromNode.type){
case 'startEvent':
case 'endEvent':
case 'gatewayAnd':
case 'scriptTask':
case 'subprocess':
this.node.lineConditions = ''
this.conditionsOptions = []
break
case 'gatewayInclusive':
case 'gatewayXor':
this.conditionsOptions = fromNode.conditions
//
this.filterValue()
break
case 'userTask':
this.conditionsOptions = fromNode.btnlist.filter(t=>!t.hidden)
//
this.filterValue()
break
}
this.value2 = this.node.lineConditions
},
filterValue(){
const vlist = this.node.lineConditions.split(',')
const res = []
vlist.forEach(item => {
if(this.conditionsOptions.findIndex(t=>t.code == item) != -1){
res.push(item)
}
})
this.node.lineConditions = String(res)
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,168 @@
<template>
<div class="user-task">
<a-form ref="formRef" :rules="rules" :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-alert message="排他网关说明"
description="排他网关不会等待所有分支汇入才往下执行只要有分支汇入就会往下执行出口分支只会执行一条条件为true如果多条出口分支条件为true也执行一条" type="info"
show-icon />
<a-space>
<a-radio-group>
<a-radio-button value="1" @click="handleFormulaClick"></a-radio-button>
<a-radio-button value="2" @click="handleSQlClick">sql</a-radio-button>
</a-radio-group>
<a-button danger :size="size" @click="handleClearClick"></a-button>
</a-space>
<a-table :columns="data.columns" :data-source="node.conditions" bordered :pagination="false">
<template #bodyCell="{ column, text, record }">
<template v-if="['name', 'type'].includes(column.dataIndex)">
<div>
{{ text }}
</div>
</template>
<template v-else-if="column.dataIndex === 'operation'">
<a-button>编辑</a-button>
<a-button danger @click='onDelete(record.name,false)'>删除</a-button>
</template>
</template>
</a-table>
</a-form>
<a-modal width="40%" v-model:open="data.formulaVisible" title="添加公式条件" @ok="handleFormulaOk">
<conditionFormula ref="conditionFormulaRef"></conditionFormula>
</a-modal>
<a-modal width="40%" v-model:open="data.sqlVisible" title="添加sql条件" @ok="handleSqlOk">
<conditionSql ref="conditionSqlRef"></conditionSql>
</a-modal>
</div>
</template>
<script lang="ts" setup>
import conditionFormula from './src/conditionFormula.vue'
import conditionSql from './src/conditionSql.vue'
import { reactive, ref, onMounted, nextTick, unref, h, watch, defineProps } from 'vue';
const labelCol = { span: 7 };
const wrapperCol = { span: 17 };
const conditionFormulaRef = ref < any > ()
const conditionSqlRef = ref < any > ()
const props = defineProps({
element: Object,
schemeCode: String,
pageType: String,
pageView: String,
})
const node = ref({
conditions: [],
id: ''
})
watch(
() => props.element,
(newVal, oldVal) => {
console.log(newVal)
if (newVal.type == "bpmn:ExclusiveGateway") {
node.value.id = newVal.id
node.value.type = newVal.type
if (props.pageType == 'detail') {
getNode()
}
if (props.schemeCode) {
getDetailInfo()
}
}
}
)
const data = reactive({
tableBtns: [
{ prop: 'Edit', label: '编辑' },
{ prop: 'Delete', label: '删除' }
],
columns: [
{ title: '类型', dataIndex: 'type' },
{ title: '名称', dataIndex: 'name' },
],
tableData: [],
formulaVisible: false,
sqlVisible: false,
editRow: null,
rowIndex: 0,
})
function getNode() {
var content = JSON.parse(props.pageView)
content.wfData.forEach(element => {
if (element.id == node.value.id) {
node.value = element
}
});
}
async function getDetailInfo() {
let data = await getDetail({ code: props.schemeCode })
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData
wfData.forEach(element => {
if (element.id == node.value.id) {
console.log(node)
node.value = element
}
});
}
onMounted(() => {
if (props.schemeCode) {
getDetailInfo()
}
if (props.pageType == 'detail') {
getNode()
}
})
function typeFormat(type) {
switch (type) {
case '1':
return '表达式'
case '2':
return 'sql语句'
}
}
function handleFormulaClick() {
data.formulaVisible = true;
}
function handleSQlClick() {
data.sqlVisible = true;
}
function handleClearClick() {
node.conditions = [];
}
async function handleFormulaOk() {
conditionFormulaRef.value.validateForm()
let obj = conditionFormulaRef.value.getForm()
console.log(obj.name)
if (obj.name != '') {
data.formulaVisible = false;
}
}
function handleSqlOk() {
console.log(conditionSqlRef.value.getForm())
// this.sqlVisible = false;
}
function getForm() {
return node.value
}
defineExpose({
getForm
})
</script>
<style scoped>
::v-deep .ant-alert-info {
margin-bottom: 20px;
}
::v-deep .ant-table-wrapper {
margin-top: 20px;
}
</style>

View File

@ -0,0 +1,151 @@
<template>
<div class="l-from-body">
<a-form ref="formRef" :rules="data.rules" :model="formData" labelAlign="left" :label-col="labelCol"
:wrapper-col="wrapperCol">
<a-form-item label="条件名称" name="name">
<a-input v-model:value="formData.name" placeholder="请输入" />
</a-form-item>
<!-- <a-form-item label="数据库" name="dbCode">
<a-select v-model:value="formData.dbCode" placeholder="请选择" :options="data.options">
<el-option-group v-for="group in lr_dblinkTree" :key="group.id" :label="group.label">
<el-option v-for="item in group.children" :key="item.id" :label="item.label" :value="item.id">
</el-option>
</el-option-group>
</a-select>
</a-form-item> -->
<a-form-item label="数据表" name="table">
<!-- <a-select v-model:value="formData.table" placeholder="请选择" :options="formData.columns">
</a-select> -->
<a-space>
<a-input v-model:value="formData.table" placeholder="请输入" readonly />
<a-button @click="handleTableClick"></a-button>
</a-space>
</a-form-item>
<a-form-item label="关联流程字段" name="rfield">
<a-select v-model:value="formData.rfield" placeholder="请选择" :options="formData.columns">
</a-select>
</a-form-item>
<a-form-item label="比较字段" name="cfield">
<a-select v-model:value="formData.cfield" placeholder="请选择" :options="formData.columns">
</a-select>
</a-form-item>
<a-form-item label="比较类型" name="compareType">
<a-select v-model:value="formData.compareType" placeholder="请选择" :options="data.options">
</a-select>
</a-form-item>
<a-form-item label="数据值" name="value">
<a-input v-model:value="formData.value" placeholder="请输入" />
</a-form-item>
</a-form>
<a-modal width="60%" height="80%" v-model:open="data.tableOpen" title="选择数据表" @ok="tableHandleOk">
<SelectTable ref="tableRef"></SelectTable>
</a-modal>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted } from 'vue'
import SelectTable from '@/components/SelectTable/index.vue'
import { getTableForms } from '@/api/sys/flowPenal'
const labelCol = { span: 5 };
const wrapperCol = { span: 17 };
const formRef = ref < any > ()
const tableRef = ref < any > ()
const data = reactive({
rules: {
dbCode: [
{ required: true, message: '请选择数据库' }
],
table: [
{ required: true, message: '请选择数据表' }
],
rfield: [
{ required: true, message: '请选择关联字段' }
],
cfield: [
{ required: true, message: '请选择比较字段' }
],
compareType: [
{ required: true, message: '请选择比较类型' }
],
value: [
{ required: true, message: '请填写值' }
],
name: [
{ required: true, message: '请填写条件名称' }
]
},
options: [
{ value: '1', label: '等于' },
{ value: '2', label: '不等于' },
{ value: '3', label: '大于' },
{ value: '4', label: '大于等于' },
{ value: '5', label: '小于' },
{ value: '6', label: '小于等于' },
{ value: '7', label: '包含' },
{ value: '8', label: '不包含' },
{ value: '9', label: '包含于' },
{ value: '10', label: '不包含于' }
],
tableOpen: false
})
let formData = ref({
dbCode: '',
table: '',
columns: [],
rfield: '',
cfield: '',
compareType: '',
value: '',
name: ''
})
function handleTableClick() {
data.tableOpen = true
}
function tableHandleOk() {
console.log(tableRef.value.getRow())
const obj = tableRef.value.getRow()
formData.value.table = obj[0].name
handleTableChange(obj[0].name)
data.tableOpen=false
}
//
async function handleTableChange(table) {
var querys = {
dbCode: 'lrsystemdb',
tableNames: table
}
console.log(querys)
const data = await getTableForms(querys)
console.log(data);
}
//
function validateForm() {
formRef.value
.validate()
.then((values) => {
return formData.value
})
.catch((error) => {
console.log(error)
return {}
});
}
function setForm(data) {
this.formData = this.$deepClone(data);
}
function getForm() {
return formData.value;
}
defineExpose({
validateForm,
getForm
})
</script>
<style scoped>
.l-from-body {
padding: 10px 30px;
}
</style>

View File

@ -0,0 +1,65 @@
<template>
<div class="l-from-body">
<a-form ref="formRef" :rules="data.rules" :model="formData" labelAlign="left" :label-col="labelCol"
:wrapper-col="wrapperCol">
<a-form-item label="条件名称" name="name">
<a-input v-model:value="formData.name" placeholder="请输入" />
</a-form-item>
<a-form-item label="数据库" name="dbCode">
<a-select v-model:value="formData.dbCode" placeholder="请选择" :options="data.options">
<el-option-group v-for="group in lr_dblinkTree" :key="group.id" :label="group.label">
<el-option v-for="item in group.children" :key="item.id" :label="item.label" :value="item.id">
</el-option>
</el-option-group>
</a-select>
</a-form-item>
<a-form-item label="SQL语句" name="sql">
<a-textarea v-model:value="formData.sql" placeholder="请输入" :rows="4"></a-textarea>
</a-form-item>
</a-form>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
const labelCol = { span: 5 };
const wrapperCol = { span: 17 };
const formRef = ref < any > ()
const formData = reactive({
name: '',
dbCode: '',
sql: '',
})
const data = reactive({
rules: {
dbCode: [
{ required: true, message: '请选择数据库' }
],
sql: [
{ required: true, message: '请填写sql语句' }
],
name: [
{ required: true, message: '请填写条件名称' }
]
},
})
async function getForm() {
let res = await formRef.value
.validate()
.then((values) => {
return formData.value
})
.catch((error: ValidateErrorEntity<FormState>) => {
return {}
});
return res;
}
defineExpose({
getForm
})
</script>
<style scoped>
.l-from-body{
padding: 10px 30px;
}
</style>

View File

@ -0,0 +1,132 @@
<!-- 开始节点配置 -->
<template>
<div class="start-event">
<a-form ref="formRef" :rules="rules" :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 v-if="data.conditionsOptions && data.conditionsOptions.length >0" label="流转条件">
<a-select v-model:value="node.lineConditions" placeholder="请选择" :options="data.conditionsOptions"
:field-names="{ label: 'name', value: 'code' }">
</a-select>
</a-form-item>
</a-form>
</div>
</template>
<script lang="ts" setup>
import { getDetail } from '@/api/sys/WFSchemeInfo'
import { ref, reactive, defineProps, onMounted, watch } from 'vue'
const props = defineProps({
disabled: {
type: Boolean,
default: false
},
element: Object,
schemeCode: String,
pageType: String,
pageView: String,
wfData: {
type: Array,
default: () => []
},
flowRef: {
type: Object,
default: () => ({
from: '',
to: ''
})
}
})
console.log(props)
let node = ref({
id: "",
lineConditions: ''
})
const data = reactive({
conditionsOptions: [],
})
watch(
() => props.element,
(newVal, oldVal) => {
if (newVal.type == "bpmn:SequenceFlow") {
node.value.id = newVal.id
node.value.type = newVal.type
getConditions()
if (props.pageType == 'detail') {
getNode()
}
if (props.schemeCode) {
getDetailInfo()
}
}
}
)
onMounted(() => {
if (props.schemeCode) {
getDetailInfo()
}
if (props.pageType == 'detail') {
getNode()
}
})
function getNode() {
var content = JSON.parse(props.pageView)
content.wfData.forEach(element => {
if (element.id == node.value.id) {
node.value = element
}
});
}
async function getDetailInfo() {
let data = await getDetail({ code: props.schemeCode })
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData
wfData.forEach(element => {
if (element.id == node.value.id) {
node.value = element
}
});
}
function getConditions() {
/**
ExclusiveGateway:'排他网关',
Task:'审核节点',
*/
if (props.wfData.length == 0) {
return
}
let wfdata = JSON.parse(JSON.stringify(props.wfData))
wfdata.forEach(element => {
if (element.id == props.flowRef.from) {
if (element.type == 'bpmn:ExclusiveGateway') {
data.conditionsOptions = element.conditions
} else if (element.type == 'bpmn:Task') {
data.conditionsOptions = element.btnlist.filter(t => !t.hidden)
} else {
data.conditionsOptions = []
}
}
});
console.log(data.conditionsOptions)
}
function filterValue() {
const vlist = this.node.lineConditions.split(',')
const res = []
vlist.forEach(item => {
if (this.conditionsOptions.findIndex(t => t.code == item) != -1) {
res.push(item)
}
})
this.node.lineConditions = String(res)
}
</script>
<style>
</style>

View File

@ -2,7 +2,7 @@
<template>
<div class="start-event">
<a-form ref="formRef" :rules="rules" :model="node" labelAlign="left" :label-col="labelCol"
:wrapper-col="wrapperCol">
:wrapper-col="wrapperCol" :disabled="data.componentDisabled">
<a-form-item label="节点标识">
<a-input v-model:value="node.id" placeholder="请输入" readonly />
</a-form-item>
@ -131,7 +131,8 @@
],
formRelations: [],
elementData: props.element
elementData: props.element,
componentDisabled: props.pageType == 'detail' ? true : false
})
let node = ref({
id: data.elementData.id,
@ -165,7 +166,8 @@
node.value.type = newVal.type
if(props.pageType == 'detail'){
getNode()
}else{
}
if(props.schemeCode) {
getDetailInfo()
}
}

View File

@ -1,7 +1,7 @@
<!-- 开始节点配置 -->
<template>
<div class="subprocess">
<a-form ref="formRef" :model="node" labelAlign="left" :label-col="labelCol" :wrapper-col="wrapperCol">
<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>
@ -45,7 +45,8 @@
node.value.type = newVal.type
if(props.pageType == 'detail'){
getNode()
}else{
}
if(props.schemeCode) {
getDetailInfo()
}
}
@ -72,7 +73,9 @@
}
const data = reactive({
list: [],
verisons: []
verisons: [],
componentDisabled: props.pageType == 'detail' ? true : false
})
onMounted(() => {
if (props.schemeCode) {

View File

@ -2,7 +2,7 @@
<template>
<div class="user-task">
<a-form ref="formRef" :rules="rules" :model="node" labelAlign="left" :label-col="labelCol"
:wrapper-col="wrapperCol">
:wrapper-col="wrapperCol" :disabled="data.componentDisabled">
<a-collapse v-model:activeKey="activeKey" accordion ghost>
<a-collapse-panel key="1" header="基础配置">
<a-form-item label="节点标识">
@ -243,6 +243,8 @@
],
isLooker: false,
conditionOptions: [{ value: '1', label: '同一个部门' }, { value: '2', label: '同一个公司' }, { value: '3', label: '发起人上级' }, { value: '4', label: '发起人下级' }],
componentDisabled: props.pageType == 'detail' ? true : false
})
let node = ref({
id: "",
@ -311,7 +313,8 @@
node.value.type = newVal.type
if (props.pageType == 'detail') {
getNode()
} else {
}
if (props.schemeCode) {
getDetailInfo()
}
}
@ -416,7 +419,6 @@
node.value.btnlist = node.value.btnlist.filter(item => item.code !== key);
}
function getForm() {
console.log(node.value)
if (node.value.id != '') {
return node.value
}

View File

@ -0,0 +1,63 @@
<template>
<div>
<BasicTable @register="registerTable" :searchInfo="searchInfo"> </BasicTable>
</div>
</template>
<script lang="ts" setup>
import { reactive, } from 'vue';
import { getTableList } from '@/api/sys/flowPenal'
import { BasicTable, useTable, TableAction } from '@/components/Table';
defineOptions({ name: 'RoleManagement' });
const searchInfo = reactive < Recordable > ({});
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
//
title: '数据表列表',
//
api: getTableList,
// BasicColumn[]
columns: [
{
title: '表名',
dataIndex: 'name',
width: 200,
},
{
title: '备注',
dataIndex: 'description',
width: 180,
},
],
rowKey: 'name',
// 使
useSearchForm: false,
//
showTableSetting: false,
//
bordered: true,
//
showIndexColumn: false,
//
rowSelection: {//
type: 'radio',
},
tableSetting: { fullScreen: true },
isCanResizeParent: true,
//
handleSearchInfoFn(info) {
return info;
},
});
function getRow() {
let rows = getSelectRows();
return rows
}
defineExpose({
getRow
})
</script>