Browse Source

流程步进处理

lwx_v7
超级管理员 2 years ago
parent
commit
524f60c50b
  1. 6
      src/api/DesignForm/requestapi.ts
  2. 76
      src/api/DesignForm/tableButton.ts
  3. 43
      src/api/taskapi/management.ts
  4. 8
      src/assets/scss/form.css
  5. 2
      src/assets/scss/form.min.css
  6. 4
      src/assets/scss/form.scss
  7. 34
      src/components/DesignForm/public/form/form.vue
  8. 292
      src/components/DesignForm/tableListPage/formPageCont.vue
  9. 77
      src/components/DesignForm/tableListPage/index.vue
  10. 4
      src/types/components.d.ts
  11. 7
      src/views/sysworkflow/lowcodepage/appFormList.vue
  12. 470
      src/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue
  13. 16
      src/views/taskplatform/taskmanagement/flowStep.vue
  14. 4
      src/views/taskplatform/taskmanagement/runFlowStep.vue
  15. 4
      src/views/taskplatform/taskmanagement/taskcustomerformnew.vue

6
src/api/DesignForm/requestapi.ts

@ -191,7 +191,8 @@ export function gainFlowPeople(data?: string[]){
//发起工作流
export function startRunFlow(data?:any){
return request({
url: '/systemapi/task_flow/startRunFlow',
url: '/systemapi/task_management/startRunWorkFlow',
// url: '/systemapi/task_flow/startRunFlow',
method: 'post',
data: data
});
@ -207,7 +208,8 @@ export function taskFlowList(data?:taskflowquery){
//获取正在执行得任务流程
export function gainRunTaskFlow(data?:customerFormLogo){
return request({
url: '/systemapi/task_flow/gainRunTaskFlow',
// url: '/systemapi/task_flow/gainRunTaskFlow',
url: '/systemapi/task_management/gainRunTaskWorkflow',
method: 'post',
data: data
});

76
src/api/DesignForm/tableButton.ts

@ -132,3 +132,79 @@ export interface FormPageConfig{
searchFormIsShow:boolean,
openPageMode:string
}
export const submitButtonEs = {
type: "div",
control:{},
config:{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:{
label: "保存",
type: "primary",
key: "submit"
},
config:{
textAlign: "center"
}
}
]
}
export const cancelButton = {
type: "div",
control:{},
config:{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:{
label: "返回",
type: "danger",
key: "cancel"
},
config:{
textAlign: "center"
}
}
]
}
export const submitAndCancelButton = {
type: "div",
control:{},
config:{
span: 24,
textAlign: "center"
},
list: [
{
type: "button",
control:{
label: "保存",
type: "primary",
key: "submit"
},
config:{
span: 0
}
},
{
type: "button",
control:{
label: "返回",
type: "danger",
key: "cancel"
},
config:{
span: 0
}
}
]
};

43
src/api/taskapi/management.ts

@ -74,3 +74,46 @@ export function generateFlow(data: nodeFlow):any{
data: data
});
}
//获取任务表单内容
export function gainTaskFormInfo(data: customerFormLogo):AxiosPromise<customerFormVersionCont> {
return request({
url: '/systemapi/task_management/gainTaskFormInfo',
method: 'post',
data: data
});
}
//获取工作流步进节点
export function softDeletion(data: any):any{
return request({
url: '/systemapi/task_management/softDeletion',
method: 'post',
data: data
});
}
//获取修改记录
export function gainEditDataLog(data: any):any{
return request({
url: '/systemapi/task_management/gainEditDataLog',
method: 'post',
data: data
});
}
//添加任务是回显表单数据,若有流程回显流程
export function echoTableFormPage(data: any):any{
return request({
url: '/systemapi/task_management/echoTableFormPage',
method: 'post',
data: data
});
}
//根据表单数据实时更新流程
export function realTimeUpdateFlow(data: any):any{
return request({
url: '/systemapi/task_management/realTimeUpdateFlow',
method: 'post',
data: data
});
}

8
src/assets/scss/form.css

@ -572,18 +572,10 @@
width: 23%;
}
.detail-form {
min-height: calc(100vh - 170px);
}
.detail-form > div {
height: 100%;
}
.detail-form > .drag {
min-height: calc(100vh - 170px) !important;
}
.detail-form .ghost {
background: #F56C6C;
border: 2px solid #F56C6C;

2
src/assets/scss/form.min.css

File diff suppressed because one or more lines are too long

4
src/assets/scss/form.scss

@ -194,9 +194,9 @@ $mainColor: #66b1ff;
.group {width: 23%}
}
}
.detail-form {min-height: calc(100vh - 170px);
.detail-form {
> div {height: 100%}
> .drag {min-height: calc(100vh - 170px) !important;}
// > .drag {min-height: calc(100vh - 170px) !important;}
.ghost {
background: #F56C6C;
border: 2px solid #F56C6C;

34
src/components/DesignForm/public/form/form.vue

@ -412,9 +412,11 @@ provide(constFormBtnEvent, (obj: any) => {
break
case 'saveDraft': //稿
saveDraft() // 稿
// console.log("稿--------->saveDraft")
break
case "saveEditDraft": //稿
saveEditDraft()
// saveEditDraft()
console.log("保存草稿--------->saveEditDraft")
break
case 'afreshSubmit': //
afreshSubmit() //
@ -506,10 +508,12 @@ const getData = (params = {}) => {
requestUrl ="/systemapi/task_management/add_form_data"
break;
case "editFormContent":
requestUrl ="/systemapi/task_management/newcust_form_editdata"
// requestUrl ="/systemapi/task_management/newcust_form_editdata"
requestUrl ="/systemapi/task_management/add_customer_form"
break;
default:
}
loading.value = true
const newParams: any = params
// 使propsevents使使
@ -572,6 +576,8 @@ const submit = (params = {}) => {
let addUrl = props.formData.config?.addUrl || props.addUrl
let editUrl = props.formData.config?.editUrl || props.editUrl
let apiUrl = props.type === 1 ? addUrl : editUrl
console.log("新增、查看、保存数据",props.type,props.addUrl,props.editUrl)
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -592,11 +598,10 @@ const submit = (params = {}) => {
apiUrl ="/systemapi/task_management/add_customer_form"
break;
case "editFormContent":
apiUrl ="/systemapi/task_management/newcust_form_editdata"
apiUrl ="/systemapi/task_management/editCustomerTable"
break;
default:
}
validate((valid: boolean, fields: any) => {
if (valid) {
@ -623,19 +628,20 @@ const submit = (params = {}) => {
if (submitParams === false) {
return
}
console.log("beforeSubmit--->",beforeSubmit)
console.log("props.beforeSubmit--->",props.beforeSubmit)
// console.log("beforeSubmit--->",beforeSubmit)
// console.log("props.beforeSubmit--->",props.beforeSubmit)
// console.log("props.beforeSubmit--->",props.beforeSubmit)
// loading.value = true
console.log("apiUrl--->",apiUrl)
console.log("submitParams--->",submitParams)
console.log("formatParams--->",formatParams)
// console.log("apiUrl--->",apiUrl)
// console.log("submitParams--->",submitParams)
// console.log("formatParams--->",formatParams)
// debugger
//
currencyFormApiSubmit(apiUrl, submitParams ?? formatParams)
.then((res: any) => {
console.log("formatParams--111->",res)
afterSubmit('success', res)
})
.catch(res => {
@ -725,7 +731,8 @@ onUnmounted(() => {
//
const afreshSubmit = (params = {}) => {
let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl = "/systemapi/task_management/newcust_form_editdata"
let apiUrl ="/systemapi/task_management/add_customer_form"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -862,7 +869,8 @@ const saveDraftPage = (type: string, res: any) => {
}
//稿
const saveEditDraft = (params = {}) => {
let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl = "/systemapi/task_management/newcust_form_editdata"
let apiUrl ="/systemapi/task_management/add_customer_form"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -931,7 +939,8 @@ const saveEditFormInfo = (type: string, res: any) => {
* 草稿提交审批
*/
const draftSubmit = (params = {}) => {
let apiUrl = "/systemapi/task_management/newcust_form_editdata"
// let apiUrl = "/systemapi/task_management/newcust_form_editdata"
let apiUrl ="/systemapi/task_management/add_customer_form"
if (props.isSearch || !apiUrl || loading.value) {
if (!props.isSearch && !apiUrl) {
console.error(
@ -1102,6 +1111,7 @@ defineExpose({
<slot></slot>
</el-form>
</div>
</template>
<style lang='scss' scoped>

292
src/components/DesignForm/tableListPage/formPageCont.vue

@ -0,0 +1,292 @@
<!--
@ 作者: 秦东
@ 时间: 2024-04-03 13:39:16
@ 备注: 列表内容展示
-->
<script lang='ts' setup>
import { submitButton, afreshSubmitButton,editFormCont,draftSubmitButton,editLookFormCont } from "@/utils/workflow/const";
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import { gainTaskFormInfo,generateFlow,gainEditDataLog } from '@/api/taskapi/management'
import { Close } from '@element-plus/icons-vue'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import { submitButtonEs } from '@/api/DesignForm/tableButton'
import RunFlowStep from '@/views/taskplatform/taskmanagement/runFlowStep.vue'
const props = defineProps({
isShow:{
type:Boolean,
default:false,
},
drawerWith:{
type:Number,
default:0
},
tablePageClass:{
type:Number,
default:1
},
pageInfo:{
type:Object,
default(){
return {}
}
}
});
const formEl = ref<any>();
const emits = defineEmits(["update:isShow","getPageData"]);
const formLoading = ref(false);
const flowAry = ref<any[]>(); //
const currentProgress = ref<number>(1); //
//ID
const openOfClose = computed({
get() {
return props.isShow
},
set(val: boolean) {
emits('update:isShow', val)
}
});
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:09:24
@ 功能: 监听状态变化处理数据
*/
watch(()=>props.isShow,(val:bool)=>{
if(val){
formLoading.value = true;
getCustomrrFormInfo();
}
})
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:25:15
@ 功能: 关闭抽屉
*/
const closeDrawer = () => {
emits('update:isShow', false)
}
//
const formState = reactive({
formData: {
list: [],
form: {},
config: {}
},
dict: {},
formId: props.pageInfo.id,
id: 1,
loading: true
})
const pageLog = ref<any[]>([])
/**
@ 作者: 秦东
@ 时间: 2024-04-03 14:33:15
@ 功能: 获取自定义表单内容
*/
const getCustomrrFormInfo = () => {
gainTaskFormInfo({id:props.pageInfo.masters_key})
.then(({data})=>{
// console.log("",data,data.structure)
formState.formData = stringToObj(data.structure.mastesform)
// console.log("--->",formState)
formState.dict = string2json(data.structure.dict)
// formState.formData.list.push(editLookFormCont)
if(props.tablePageClass != 4){
judgeSubmitCancel({"name":data.structure.mastesformjson})
.then((data:any) =>{
if(data.code == 0){
if (data.data == 3 || data.data == 4){
formState.formData.list.push(submitButtonEs)
}
}
})
}
nextTick(()=>{
// console.log("-1111-->",data.tableData)
formEl.value.setValue(data.tableData)
})
})
.finally(()=>{
formLoading.value = false;
gainEditDataLog({id:props.pageInfo.masters_key})
.then(({data})=>{
console.log("获取修改记录-1111-->",data)
pageLog.value = data.logAry
});
})
}
/**
@ 作者: 秦东
@ 时间: 2024-04-07 10:55:34
@ 功能: 表单动作回调
*/
const afterSubmit = (type: string) => {
console.log("表单提交成功")
if (type === 'success') {
// router.go(-1)
// console.log("")
emits("getPageData");
closeDrawer();
}
}
const closeAppSubmit = () => {
closeDrawer()
}
//
const drawerBeforeClose = () => {
console.log("监听打开关闭",false)
// emits("getmytodolist")
// emits("update:isshow", false);
}
</script>
<template>
<el-drawer
v-model="openOfClose"
title="查看表单内容"
:size="drawerWith"
:with-header="false"
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
>
<div v-if="props.pageInfo.flowIsOpen==1" class="common-layout">
<el-container>
<el-main>
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="formState.formData"
:type="props.tablePageClass"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:close-app-submit="closeDrawer"
:change-key-val="changeKeyVal"
:anew-submit = "anewSubmit"
:save-edit-form-info="saveEditFormInfo"
:send-draft-submit= "sendDraftSubmit"
:after-submit="afterSubmit"
/>
<el-divider v-if="pageLog&&pageLog.length > 0" content-position="left">历史记录</el-divider>
<el-timeline style="width: 100%">
<el-timeline-item v-for="(item,index) in pageLog" :key="index" :timestamp="item.time+' 操作人:'+item.creater" placement="top">
<el-card>
<el-descriptions border>
<el-descriptions-item v-for="(mastItem,mastIndex) in item.masterdata" :key="mastIndex" :label="mastIndex">
{{mastItem}}
</el-descriptions-item>
</el-descriptions>
<el-tabs v-if="item.sunList" type="border-card" style="margin-top:20px;">
<el-tab-pane v-for="(sonItem,sonIndex) in item.sunList" :label="sonIndex" :key="sonIndex">
<el-descriptions v-for="(sonVal,sonIndex) in sonItem" :key="sonIndex" border>
<el-descriptions-item v-for="(sonCentor,sonKey) in sonVal" :key="sonKey" :label="sonKey"> {{sonCentor}}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</el-card>
</el-timeline-item>
</el-timeline>
</el-main>
<el-aside width="350px" class="flowBox">
<el-header height="30px">
<div class="workFlowHead">
<el-text>审批流程</el-text>
<el-icon @click="closeDrawer"><Close /></el-icon>
</div>
</el-header>
<el-scrollbar class="scorllbarBox">
<RunFlowStep ref="runstep" v-model:flowary="flowAry" :flow-key="props.pageInfo.masters_key" :current-progress="currentProgress" @updatelist="drawerBeforeClose" />
</el-scrollbar>
</el-aside>
</el-container>
</div>
<div v-else class="common-layout">
<el-header height="30px">
<el-icon @click="closeDrawer"><Close /></el-icon>
</el-header>
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="formState.formData"
:type="props.tablePageClass"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:close-app-submit="closeDrawer"
:change-key-val="changeKeyVal"
:anew-submit = "anewSubmit"
:after-submit="afterSubmit"
:save-edit-form-info="saveEditFormInfo"
:send-draft-submit= "sendDraftSubmit"
/>
<el-divider v-if="pageLog&&pageLog.length > 0" content-position="left">历史记录</el-divider>
<el-timeline style="width: 100%">
<el-timeline-item v-for="(item,index) in pageLog" :key="index" :timestamp="item.time+' 操作人:'+item.creater" placement="top">
<el-card>
<el-descriptions border>
<el-descriptions-item v-for="(mastItem,mastIndex) in item.masterdata" :key="mastIndex" :label="mastIndex">
{{mastItem}}
</el-descriptions-item>
</el-descriptions>
<el-tabs v-if="item.sunList" type="border-card" style="margin-top:20px;">
<el-tab-pane v-for="(sonItem,sonIndex) in item.sunList" :label="sonIndex" :key="sonIndex">
<el-descriptions v-for="(sonVal,sonIndex) in sonItem" :key="sonIndex" border>
<el-descriptions-item v-for="(sonCentor,sonKey) in sonVal" :key="sonKey" :label="sonKey"> {{sonCentor}}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.common-layout{
height: 100vh;
padding: 0 15px;
.el-main{
height: 100vh;
padding:0;
}
.flowBox{
height: 100vh;
border-left: 1px solid #ccc;
.scorllbarBox{
height: calc(100vh - 35px)
}
.workFlowHead{
display: flex;
align-items: center;
justify-content: space-between;
}
}
.el-header{
padding:0 10px;
line-height:30px;
text-align:right;
font-size:20px;
i{
cursor:pointer;
}
}
}
</style>

77
src/components/DesignForm/tableListPage/index.vue

@ -9,10 +9,16 @@ import { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'
import { useDesignFormStore } from '@/store/DesignForm/designForm'
import { attrButton,FormPageList,FormPageConfig } from '@/api/DesignForm/tableButton'
import { inputUnit,timeUnit,choiceUnit,switchUnit,orgUnit,checkboxUnit } from '@/api/DesignForm/fieldUnit'
import type { FormInstance, FormRules } from 'element-plus'
import type { FormInstance, FormRules,ElNotification } from 'element-plus'
import { gainFormPageListCont } from '@/api/DesignForm/requestapi'
import { Picture,InfoFilled,QuestionFilled } from '@element-plus/icons-vue'
import { softDeletion } from '@/api/taskapi/management'
//
import FormPageCont from '@/components/DesignForm/tableListPage/formPageCont.vue'
const props = withDefaults(
defineProps<{
data: FormPageList
@ -65,6 +71,7 @@ const emits = defineEmits<{
(e: 'btnClick', btn: any, row?: any): void //
}>()
const idList = ref<string[]>([])
const designStore = useDesignFormStore()
const route = useRoute()
const router = useRouter()
@ -275,23 +282,61 @@ const judjeSwitch = (val:any,yesVal:any) => {
/**
@ 作者: 秦东
@ 时间: 2024-04-03 13:13:56
@ 功能: 列表信息删除安妮
@ 功能: 列表信息删除信息
*/
const confirmEvent = (val:any) => {
console.log('confirm!',val)
let sendData = {
id:[val.masters_key],
isTrue:2
}
softDeletion(sendData)
.then((data)=>{
console.log('cancel!',data)
ElNotification({
title: '温馨提示!',
message: data.mag,
type: 'success',
})
getPageData()
})
}
const cancelEvent = (val:any) => {
console.log('cancel!',val)
}
const container = ref() //
const drawerWith = ref(); //
/**
@ 作者: 秦东
@ 时间: 2024-04-03 13:24:06
@ 功能: 查看详细内容
*/
const lookPageInfo = (val:any) => {}
const tablePageClass = ref(1)
const lookPageInfoIsShow = ref(false)
const pageInfoCont = ref<any>()
const lookPageInfo = (val:any) => {
tablePageClass.value = 4;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-05 11:29:50
@ 功能: 编辑表单内容
*/
const editInfo = (val:any) => {
console.log('修改数据!',val)
tablePageClass.value = 2;
pageInfoCont.value = val
drawerWith.value = container.value?.clientWidth
lookPageInfoIsShow.value = true;
}
</script>
<template>
<div ref="container" v-loading="state.loading" class="table-list-comm">
<el-row class="rowBox">
<el-col :span="24">
<el-form v-if="config.searchIsShow" ref="ruleSearchForm" class="seacherForm">
@ -421,7 +466,7 @@ const lookPageInfo = (val:any) => {}
<template #default="scope">
<el-button-group>
<el-tooltip
v-if="scope.row.flowIsOpen==1"
v-if="scope.row.flowIsOpen==1&&scope.row.taskStatus==1"
class="box-item"
effect="dark"
content="提交审批"
@ -431,7 +476,7 @@ const lookPageInfo = (val:any) => {}
</el-tooltip>
<el-tooltip
v-if="scope.row.flowIsOpen==1"
v-if="scope.row.flowIsOpen==1&&scope.row.taskStatus==2"
class="box-item"
effect="dark"
content="重新申请"
@ -448,7 +493,7 @@ const lookPageInfo = (val:any) => {}
<el-button @click="lookPageInfo(scope.row)" type="primary" size="small" class="fa fa-eye" />
</el-tooltip>
<el-tooltip
v-if="scope.row.flowIsOpen==1"
v-if="scope.row.flowIsOpen==1&&scope.row.isRetract"
class="box-item"
effect="dark"
content="撤回"
@ -456,8 +501,17 @@ const lookPageInfo = (val:any) => {}
>
<el-button size="small" class="fa fa-reply-all" />
</el-tooltip>
<el-tooltip
v-if="scope.row.flowIsOpen==2"
class="box-item"
effect="dark"
content="编辑"
placement="top-end"
>
<el-button @click="editInfo(scope.row)" type="info" size="small" class="fa fa-edit" />
</el-tooltip>
<el-popconfirm
v-if="scope.row.taskStatus==2||scope.row.taskStatus==1"
confirm-button-text="确定"
cancel-button-text="取消"
:icon="QuestionFilled"
@ -472,7 +526,7 @@ const lookPageInfo = (val:any) => {}
</el-popconfirm>
<el-tooltip
v-if="scope.row.flowIsOpen==1"
v-if="scope.row.flowIsOpen==1&&scope.row.taskStatus==4"
class="box-item"
effect="dark"
content="申请修改"
@ -543,9 +597,9 @@ const lookPageInfo = (val:any) => {}
/>
</div>
</el-col>
<el-col :span="24" style="display:none">
<el-col :span="24" style="display:black">
{{ searchData}}
{{ tableDataList}}
</el-col>
<el-col :span="24" style="display:none">
<el-button-group>
@ -609,6 +663,7 @@ const lookPageInfo = (val:any) => {}
</el-col>
</el-row>
<FormPageCont v-model:is-show="lookPageInfoIsShow" :drawer-with="drawerWith" :page-info="pageInfoCont" :table-page-class="tablePageClass" @getPageData="getPageData" />
</div>
</template>
<style lang='scss' scoped>

4
src/types/components.d.ts

@ -50,6 +50,7 @@ declare module '@vue/runtime-core' {
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
@ -70,6 +71,7 @@ declare module '@vue/runtime-core' {
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSlider: typeof import('element-plus/es')['ElSlider']
ElSpace: typeof import('element-plus/es')['ElSpace']
ElStep: typeof import('element-plus/es')['ElStep']
ElSteps: typeof import('element-plus/es')['ElSteps']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
@ -100,6 +102,7 @@ declare module '@vue/runtime-core' {
FormGroup: typeof import('./../components/DesignForm/public/form/formGroup.vue')['default']
FormGroup1: typeof import('./../components/DesignForm/public/form/formGroup1.vue')['default']
FormItem: typeof import('./../components/DesignForm/public/form/formItem.vue')['default']
FormPageCont: typeof import('./../components/DesignForm/tableListPage/formPageCont.vue')['default']
FormWord: typeof import('./../components/workflow/dialog/formWord.vue')['default']
GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
@ -116,6 +119,7 @@ declare module '@vue/runtime-core' {
IEpRefresh: typeof import('~icons/ep/refresh')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpSetting: typeof import('~icons/ep/setting')['default']
IEpUser: typeof import('~icons/ep/user')['default']
LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
LayoutPage: typeof import('./../components/DesignForm/layoutPage/index.vue')['default']
List: typeof import('./../components/DesignForm/public/form/components/list.vue')['default']

7
src/views/sysworkflow/lowcodepage/appFormList.vue

@ -8,9 +8,10 @@ import { customerFormCont } from "@/api/DesignForm/type";
import { getCustomerFormList,editProductionFormStatus } from '@/api/DesignForm/requestapi'
import {Delete,Edit,View,MoreFilled} from '@element-plus/icons-vue'
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
//
import LowCodeFormPage from "@/views/sysworkflow/lowcodepage/lowCodeFormPage.vue"
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerformnew.vue'
import TableFlow from '@/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue'
const props = defineProps({
groupId:{
@ -236,7 +237,9 @@ const state = reactive({
<div class="formGroupPage">
<el-pagination layout="prev, pager, next" v-model:current-page="pageApp" :page-size="pageAppSize" :total="pageAppTotal" />
</div>
<TaskCustomerForm v-model:isopen="openTaskDrawer" :versionid="versionId" :versiontitle="versionTitle" :drawerwith="props.drawerWith" @searchquery="getFormAppList" />
<TableFlow v-model:isopen="openTaskDrawer" :versionid="versionId" :versiontitle="versionTitle" :drawerwith="props.drawerWith" @searchquery="getFormAppList" />
<LowCodeFormPage v-if="addFormIsShow" :drawer-with="props.drawerWith" v-model:form-key="formId" @refreshPage="refreshPage" />

470
src/views/sysworkflow/lowcodepage/pageFlow/tableFlow.vue

@ -0,0 +1,470 @@
<!--
@ 作者: 秦东
@ 时间: 2024-04-08 15:21:19
@ 备注: 表单有无流程处理
-->
<script lang='ts' setup>
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow,echoTableFormPage,realTimeUpdateFlow } from '@/api/taskapi/management'
import { string2json,stringToObj } from '@/utils/DesignForm/form'
import { judgeSubmitCancel,startRunFlow } from '@/api/DesignForm/requestapi'
import { notAsA_BasisForJudgment,asAnApprovalActionControl,fixedValueControl,timeControl,timeEquation,submitButton, afreshSubmitButton } from '@/utils/workflow/const'
import FlowStep from '@/views/taskplatform/taskmanagement/flowStep.vue'
const props = defineProps({
isopen:{
type:Boolean,
default:true
},
versionid:{
type:String,
default:""
},
versiontitle:{
type:String,
default:""
},
drawerwith:{
type:Number,
default:0
}
})
const formLoading = ref(false) //loading
const flowLoading = ref(false) //loading
const flowFactor = reactive<conditionInfo[]>([]) //
const flowMap = ref<any[]>(); //
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const nodeKey = ref<string>('');
//
const gainFlowChart = reactive<nodeFlow>({
id:"0"
})
const nodelUserList = reactive<nodelPeoples[]>([])
/**
@ 作者: 秦东
@ 时间: 2024-04-08 15:35:54
@ 功能: 表单基本数据结构
*/
const state = reactive<any>({
type: 1, // 123 4 5
formData: {
list: [],
form: {},
config: {},
powerstr:{}
},
dict: {},
formId: props.versionid,
id: 0,
loading: true
})
const emits = defineEmits(["update:isopen","searchquery"]);
const drawerOpenOrClose = computed({
get: () => props.isopen,
set: (val) => {
emits("update:isopen", val);
},
});
const isFlowTable = ref(false) //
//
const getTaskFormData = () =>{
formLoading.value = true
flowLoading.value = true
echoTableFormPage({id:props.versionid.toString()})
.then(({ data }) =>{
console.log("表单数据",data)
if(data.tableFormPage.flowIsOpen == 1 && data.tableFormPage.flowkeystr != "0"){
isFlowTable.value = true;
}else{
isFlowTable.value = false;
}
gainFlowChart.id=data.tableFormPage.flowkeystr
console.log("表单数据--->1",data.flowPage.flowList)
flowMap.value = data.flowPage.flowList
state.id=props.versionid
state.formData = stringToObj(data.tableFormPage.mastesform)
state.dict = string2json(data.tableFormPage.dict)
state.formData.powerstr = string2json(data.tableFormPage.powerstr)
judgeSubmitCancel({"name":data.tableFormPage.mastesformjson})
.then((datajud:any) =>{
if(datajud.code == 0){
if (datajud.data == 3 || datajud.data == 4){
state.formData.list.push(submitButton)
}
}
})
})
.finally(()=>{
formLoading.value = false
flowLoading.value = false
})
}
//
watch(()=>props.isopen,()=>{
if(props.isopen){
getTaskFormData();
}else{
initData()
}
})
//
const initData = () => {
state.formData = {
list: [],
form: {},
config: {}
};
state.dict = {};
state.formId = 0;
state.id = 0;
state.loading = true;
let aryLen = flowFactor.length
if(aryLen > 0) flowFactor.splice(0,aryLen);
}
//
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
// console.log("--type-1-true->",notAsA_BasisForJudgment.indexOf(type))
// console.log("--flowFactor--->",flowFactor)
// if(notAsA_BasisForJudgment.indexOf(type) != -1){
// console.log("--type--true->",notAsA_BasisForJudgment.indexOf(type))
// }
let unitsVal = val
let isUpdateFlowChart = false
//
if(notAsA_BasisForJudgment.indexOf(type) === -1){
let isWrite = true
flowFactor.forEach((item:any)=>{
if(item.factorid == key){
isWrite = false
item.type=3
if(type == "checkbox"){
item.isCheckbox = true
item.answers = val.map(String)
}else{
item.isCheckbox = false
item.oneanswer = val.toString()
}
if(notAsA_BasisForJudgment.indexOf(type) === -1){
isUpdateFlowChart = true
}
}
})
if(isWrite){
if(type == "checkbox"){
flowFactor.push({
factorid:key,
type:3,
isCheckbox:true,
answers:val.map(String)
})
}else{
flowFactor.push({
factorid:key,
type:3,
isCheckbox:false,
oneanswer:val.toString()
})
}
isUpdateFlowChart = true
}
// console.log("--flowFactor--->",flowFactor)
}
// console.log("--flowFactor--1->",unitsVal,timeControl,type)
//
if(timeControl.indexOf(type) > -1 || fixedValueControl.indexOf(type) > -1 || type == "input"){
// console.log("--flowFactor--3->",unitsVal)
let addNewTime = true //
flowFactor.forEach((item:any)=>{
// console.log("--flowFactor--5->",item.type)
if(item.type == 2){
addNewTime = false
// console.log("--flowFactor--5====1->",item.type)
// console.log("--flowFactor--5====3->",item.customFields,item.customFields.length)
if(item.customFields && item.customFields.length > 0){
// console.log("--flowFactor--5====2->",item.customFields)
let sunNewAdd = true
item.customFields.forEach((sunItem:any)=>{
// console.log("--flowFactor-4->",sunItem.wordfield , key,sunItem.wordfield == key)
if(sunItem.wordfield == key){
sunNewAdd = false
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
sunItem.leftval = val.toString()
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
sunItem.leftval = val[0].toString()
sunItem.rightval = val[val.length - 1].toString()
}
}
}
}
})
if(sunNewAdd){
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){//
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
item.customFields.push(customFieldInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
item.customFields.push(customFieldInfo)
}
}
}
}
}
}
})
if(addNewTime){ //
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}
}
}
}
}
//
if(asAnApprovalActionControl.indexOf(type) > -1){
isUpdateFlowChart = true
let isWriteUs = true
nodelUserList.forEach((item:any)=>{
if(item.factorid == key){
isWriteUs = false
item.userList = val
}
})
if(isWriteUs){
nodelUserList.push({
factorid:key,
userList:val
})
}
}
// console.log("--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
flowLoading.value = true
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
gainFlowChart.oldFlow = flowMap
// console.log("--gainFlowChart--->",gainFlowChart)
realTimeUpdateFlow(gainFlowChart)
.then((data:any) =>{
// console.log("-new-->",data)
flowMap.value = data.data.flowList
nextStep.value = data.data.nextStep;
currentProgress.value = data.data.Step;
nodeKey.value = data.data.nodeKey;
// // console.log("-1-->",flowMap.value)
flowLoading.value = false
})
}
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:41:20
@ 功能: 提交成功回调
*/
const afterSubmit = (type: string,val?:any) => {
console.log("表单提交成功------------------>",type,val)
console.log("流程------------------>",flowMap)
if (type === 'success') {
if(isFlowTable.value){
if(val.code == 0){
if(val.data){
let sendInfo ={
id:val.data.uuid,
flowList:flowMap.value,
state:3
}
startRunFlow(sendInfo)
.then((data:any)=>{
console.log("流程提交成功--------1---------->",data)
})
}
}
}
}
closeAppSubmit()
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:49:09
@ 功能: 表单前置数据
*/
const beforeSubmit = (params: any) => {
params.formId = props.versionid
params.id = ""
// emits("update:isopen", false);
return params
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:50:01
@ 功能: 关闭操作
*/
const closeAppSubmit = () =>{
emits("update:isopen", false);
}
/**
@ 作者: 秦东
@ 时间: 2024-04-09 16:50:37
@ 功能: 保存草稿
*/
const saveDraftPage = (type: string,val?:any) => {
if (type === 'success') {
if(isFlowTable.value){
if(val.code == 0){
let sendInfo ={
id:val.data.uuid,
flowList:flowMap.value,
state:1
}
startRunFlow(sendInfo)
.then((data:any)=>{
// console.log("--------1---------->",data)
})
}
}
}
closeAppSubmit()
}
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<div v-if="isFlowTable" class="common-layout">
<el-container>
<el-main v-loading="formLoading" element-loading-text="Loading...">
<ak-form
ref="formEl"
:numrun="formType"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
:save-draft-page="saveDraftPage"
/>
</el-main>
<el-aside v-loading="flowLoading" element-loading-text="Loading..." width="350px" class="flowBox">
<el-text size="large">审批流程</el-text>
<FlowStep v-model:flow-map="flowMap" :next-step="nextStep" :current-progress="currentProgress" :node-key="nodeKey" />
</el-aside>
</el-container>
</div>
<!--无流程表单-->
<div v-else class="common-layout">
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="state.formData"
:type="formType"
:numrun="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:save-draft-page="saveDraftPage"
/>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.common-layout{
height: calc(100vh - 55px);
padding: 0 15px;
.el-main{
height: calc(100vh - 55px);
padding:0;
}
.flowBox{
height: calc(100vh - 55px);
border-left: 1px solid #ccc;
padding: 0 15px;
}
.el-header{
padding:0 10px;
line-height:30px;
text-align:right;
font-size:20px;
i{
cursor:pointer;
}
}
}
</style>

16
src/views/taskplatform/taskmanagement/flowStep.vue

@ -58,7 +58,7 @@ onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
// console.log("val----->",val)
console.log("val----->",val)
if(val.customNode == "beginnode"){
val.runscope = val.runscope!=0?val.runscope:1
return true
@ -81,11 +81,14 @@ const judgeAddUser = (val:any):boolean =>{
}
break;
default:
if(!val.operator){
val.runscope = val.runscope!=0?val.runscope:1
return true
}else if(val.operator.length < 1){
val.runscope = val.runscope!=0?val.runscope:1
// if(!val.operator){
// val.runscope = val.runscope!=0?val.runscope:1
// return true
// }else if(val.operator.length < 1){
// val.runscope = val.runscope!=0?val.runscope:1
// return true
// }
if(val.runscope != 0){
return true
}
return false
@ -130,6 +133,7 @@ const updateNode = (val:any) =>{
{{ item.nodeName }}
</template>
<template #description>
<table>
<tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50">

4
src/views/taskplatform/taskmanagement/runFlowStep.vue

@ -133,9 +133,9 @@ defineExpose({gainRunFlowTask})
<template>
<div class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20" style="width:100%">
<!-- <el-affix :offset="20" style="width:100%">
<el-text size="large">审批流程</el-text>
</el-affix>
</el-affix> -->
<el-steps v-loading="flowLoading" element-loading-text="Loading..." direction="vertical" :active="currentStep">
<el-step v-for="item in flowMaps" :key="item.step">

4
src/views/taskplatform/taskmanagement/taskcustomerformnew.vue

@ -450,7 +450,7 @@ const sendFlowInfo = ref<any>()
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<table border="0" v-if="isFlowForm" class="tableFlowBox">
<table border="0" v-if="isFlowTable" class="tableFlowBox">
<tr>
<td valign="top">
<div class="drawerFormBox boxLeft">
@ -472,7 +472,7 @@ const sendFlowInfo = ref<any>()
/>
</div>
</td>
<td v-if="isFlowTable" valign="top" width="350">
<td valign="top" width="350">
<div v-loading="flowLoading" element-loading-text="Loading..." class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20">

Loading…
Cancel
Save