This commit is contained in:
xiangheng
2023-12-20 00:41:36 +08:00
parent f5382fd2f7
commit bce060c758
9 changed files with 221 additions and 108 deletions

View File

@@ -20,12 +20,12 @@
<el-form-item v-if="userTask" :label="`${userTask?.label}节点审批人`" prop="templateId"> <el-form-item v-if="userTask" :label="`${userTask?.label}节点审批人`" prop="templateId">
<el-select <el-select
class="flex-1" class="flex-1"
v-if="approver.length" v-if="approverUserList.length"
v-model="formData.applyUserId" v-model="formData.applyUserId"
placeholder="请选择审批人" placeholder="请选择审批人"
> >
<el-option <el-option
v-for="(item, index) in approver" v-for="(item, index) in approverUserList"
:key="index" :key="index"
:label="item.nickname" :label="item.nickname"
:value="item.id" :value="item.id"
@@ -81,7 +81,7 @@ const next_nodes = ref([])
const userTask = computed(() => { const userTask = computed(() => {
return next_nodes.value.find((item) => item.type == 'bpmn:userTask') return next_nodes.value.find((item) => item.type == 'bpmn:userTask')
}) })
const approver = ref([]) const approverUserList = ref([])
const formRules = { const formRules = {
applyUserId: [ applyUserId: [
{ {
@@ -93,6 +93,7 @@ const formRules = {
} }
function open(row) { function open(row) {
console.log('open') console.log('open')
Object.assign(formData, new formDataState())
formData.id = row.id formData.id = row.id
dialogVisible.value = true dialogVisible.value = true
@@ -107,7 +108,7 @@ function open(row) {
if (item.type == 'bpmn:userTask') { if (item.type == 'bpmn:userTask') {
flow_history_get_approver(item).then((user) => { flow_history_get_approver(item).then((user) => {
console.log('user', user) console.log('user', user)
approver.value = user approverUserList.value = user
}) })
} }
}) })

View File

@@ -0,0 +1,165 @@
<!-- 审批 -->
<!-- 预览和编辑
-->
<!-- 审批记录备注 -->
<template>
<el-dialog
v-model="dialogVisible"
:show-close="true"
:fullscreen="false"
:close-on-click-modal="false"
:close-on-press-escape="false"
:destroy-on-close="true"
title="审批"
top="1px"
>
<v-form-render
v-if="render"
:form-json="formJson"
:form-data="formRenderData"
:option-data="optionData"
ref="vFormRef"
>
</v-form-render>
<el-divider> 审批 </el-divider>
<el-form
ref="formRef"
:model="formData"
label-position="top"
label-width="110px"
:rules="formRules"
>
<el-form-item v-if="userTask" :label="`${userTask?.label}节点审批人`" prop="templateId">
<el-select
class="flex-1"
v-if="approverUserList.length"
v-model="formData.applyUserId"
placeholder="请选择审批人"
>
<el-option
v-for="(item, index) in approverUserList"
:key="index"
:label="item.nickname"
:value="item.id"
clearable
/>
</el-select>
</el-form-item>
<el-form-item label="审批意见" prop="passRemark">
<el-input
v-model="formData.passRemark"
:rows="2"
type="textarea"
placeholder="请输入审批意见"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">关闭</el-button>
<el-button type="primary" @click="save"> 通过 </el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import 'vform3-builds/dist/designer.style.css' //引入VForm3样式
import {
flow_history_next_node,
flow_history_get_approver,
flow_history_pass
} from '@/api/flow_history'
import { flow_apply_detail } from '@/api/flow_apply'
import { defineExpose, defineProps, defineOptions, reactive, ref, computed } from 'vue'
defineOptions({
name: 'todo-approve'
})
// 表单
const formJson = ref({})
const formRenderData = ref({})
const optionData = reactive({})
const vFormRef = ref(null)
const dialogVisible = ref(false)
// 审批
class formDataState {
id = ''
passRemark = ''
applyUserId = ''
}
const formData = reactive(new formDataState())
const next_nodes = ref([])
const userTask = computed(() => {
return next_nodes.value.find((item) => item.type == 'bpmn:userTask')
})
const approverUserList = ref([])
const formRules = {
applyUserId: [
{
required: true,
message: '请选择',
trigger: ['blur']
}
]
}
const render = ref(false)
function reset() {
render.value = false
}
async function open(row) {
reset()
if (row) {
dialogVisible.value = true
const flowFormData = await flow_apply_detail({
id: row.applyId
})
formRenderData.value = JSON.parse(row.formValue)
formJson.value = JSON.parse(flowFormData.flowFormData)
render.value = true
flow_history_next_node({
applyId: row.applyId,
currentNodeId: row.nodeId
}).then((res) => {
console.log('res', res)
next_nodes.value = res
res.map((item) => {
if (item.type == 'bpmn:userTask') {
flow_history_get_approver(item).then((user) => {
console.log('user', user)
approverUserList.value = user
})
}
})
})
}
}
function save() {
vFormRef.value.getFormData().then((formData) => {
console.log('formData', formData)
flow_history_pass({
applyId: formData.id,
passRemark: formData.passRemark,
applyUserId: formData.applyUserId
}).then((res) => {
console.log('res', res)
dialogVisible.value = false
})
})
}
defineExpose({
open
})
</script>
<style lang="scss">
.el-range-editor.el-input__wrapper {
box-sizing: border-box;
}
</style>

View File

@@ -3,26 +3,26 @@
<el-card class="!border-none" shadow="never"> <el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true"> <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item label="申请id" prop="applyId"> <el-form-item label="申请id" prop="applyId">
<el-input class="w-[280px]" v-model="queryParams.applyId" /> <el-input v-model="queryParams.applyId" />
</el-form-item> </el-form-item>
<el-form-item label="申请人昵称" prop="applyUserNickname"> <el-form-item label="申请人昵称" prop="applyUserNickname">
<el-input class="w-[280px]" v-model="queryParams.applyUserNickname" /> <el-input v-model="queryParams.applyUserNickname" />
</el-form-item> </el-form-item>
<el-form-item label="审批用户昵称" prop="approverNickname"> <el-form-item label="审批用户昵称" prop="approverNickname">
<el-input class="w-[280px]" v-model="queryParams.approverNickname" /> <el-input v-model="queryParams.approverNickname" />
</el-form-item> </el-form-item>
<el-form-item label="节点" prop="nodeId"> <el-form-item label="节点" prop="nodeId">
<el-input class="w-[280px]" v-model="queryParams.nodeId" /> <el-input v-model="queryParams.nodeId" />
</el-form-item> </el-form-item>
<el-form-item label="通过状态" prop="passStatus"> <el-form-item label="通过状态" prop="passStatus">
<el-select v-model="queryParams.passStatus" class="w-[280px]" clearable> <el-select v-model="queryParams.passStatus" clearable>
<el-option label="请选择字典生成" value="" /> <el-option label="请选择字典生成" value="" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="通过备注" prop="passRemark"> <el-form-item label="通过备注" prop="passRemark">
<el-input class="w-[280px]" v-model="queryParams.passRemark" /> <el-input v-model="queryParams.passRemark" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button> <el-button type="primary" @click="resetPage">查询</el-button>

View File

@@ -3,28 +3,17 @@
<div class="index-lists"> <div class="index-lists">
<el-card class="!border-none" shadow="never"> <el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true"> <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item label="申请id" prop="applyId">
<el-input class="w-[280px]" v-model="queryParams.applyId" />
</el-form-item>
<el-form-item label="申请人昵称" prop="applyUserNickname"> <el-form-item label="申请人昵称" prop="applyUserNickname">
<el-input class="w-[280px]" v-model="queryParams.applyUserNickname" /> <el-input v-model="queryParams.applyUserNickname" />
</el-form-item> </el-form-item>
<el-form-item label="审批用户昵称" prop="approverNickname"> <el-form-item label="审批用户昵称" prop="approverNickname">
<el-input class="w-[280px]" v-model="queryParams.approverNickname" /> <el-input v-model="queryParams.approverNickname" />
</el-form-item> </el-form-item>
<el-form-item label="节点" prop="nodeId"> <el-form-item label="节点" prop="nodeId">
<el-input class="w-[280px]" v-model="queryParams.nodeId" /> <el-input v-model="queryParams.nodeId" />
</el-form-item>
<el-form-item label="通过状态" prop="passStatus">
<el-select v-model="queryParams.passStatus" class="w-[280px]" clearable>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="通过备注" prop="passRemark">
<el-input class="w-[280px]" v-model="queryParams.passRemark" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button> <el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button> <el-button @click="resetParams">重置</el-button>
@@ -42,35 +31,34 @@
</div> </div>
<el-table class="mt-4" size="large" v-loading="pager.loading" :data="pager.lists"> <el-table class="mt-4" size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="申请人昵称" prop="applyUserNickname" min-width="100" /> <el-table-column label="申请人昵称" prop="applyUserNickname" min-width="100" />
<el-table-column label="审批人id" prop="approverId" min-width="100" /> <!-- <el-table-column label="审批人id" prop="approverId" min-width="100" />
<el-table-column label="审批用户昵称" prop="approverNickname" min-width="100" /> <el-table-column label="审批用户昵称" prop="approverNickname" min-width="100" /> -->
<el-table-column label="节点" prop="nodeId" min-width="100" /> <el-table-column label="节点" prop="nodeId" min-width="100" />
<el-table-column label="表单值" prop="formValue" min-width="100" /> <el-table-column label="表单值" prop="formValue" min-width="100" />
<el-table-column <el-table-column
label="通过状态1待处理2通过3拒绝" label="通过状态1待处理2通过3拒绝"
prop="passStatus" prop="passStatus"
min-width="100" min-width="100"
/> >
<template #default="{ row }">
<dict-value
:options="dictData.flow_history_status"
:value="row.passStatus"
/>
</template>
</el-table-column>
<el-table-column label="通过备注" prop="passRemark" min-width="100" /> <el-table-column label="通过备注" prop="passRemark" min-width="100" />
<el-table-column label="更新时间" prop="updateTime" min-width="100" /> <el-table-column label="更新时间" prop="updateTime" min-width="150" />
<el-table-column label="创建时间" prop="createTime" min-width="100" /> <el-table-column label="创建时间" prop="createTime" min-width="150" />
<el-table-column label="操作" width="120" fixed="right"> <el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
v-perms="['flow_history:edit']" v-perms="['flow_history:edit']"
type="primary" type="primary"
link link
@click="handleEdit(row)" @click="handleOpen(row)"
> >
编辑 审批
</el-button>
<el-button
v-perms="['flow_history:del']"
type="danger"
link
@click="handleDelete(row.id)"
>
删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -79,23 +67,25 @@
<pagination v-model="pager" @change="getLists" /> <pagination v-model="pager" @change="getLists" />
</div> </div>
</el-card> </el-card>
<edit-popup v-if="showEdit" ref="editRef" @success="getLists" @close="showEdit = false" />
<Approve ref="ApproveRef"></Approve>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { flow_history_delete, flow_history_list } from '@/api/flow_history' import { flow_history_list } from '@/api/flow_history'
import { useDictData } from '@/hooks/useDictOptions'
import { usePaging } from '@/hooks/usePaging' import { usePaging } from '@/hooks/usePaging'
import feedback from '@/utils/feedback' import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import useUserStore from '@/stores/modules/user' import useUserStore from '@/stores/modules/user'
import Approve from './components/todo/approve.vue'
const userStore = useUserStore() const userStore = useUserStore()
defineOptions({ defineOptions({
name: 'flow_history' name: 'todo'
}) })
const editRef = shallowRef<InstanceType<typeof EditPopup>>() const ApproveRef = shallowRef<InstanceType<typeof ApproveRef>>()
const showEdit = ref(false)
const queryParams = reactive({ const queryParams = reactive({
applyId: '', applyId: '',
templateId: '', templateId: '',
@@ -113,25 +103,11 @@ const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: flow_history_list, fetchFun: flow_history_list,
params: queryParams params: queryParams
}) })
const { dictData } = useDictData<{
const handleAdd = async () => { flow_history_status: any[]
showEdit.value = true }>(['flow_history_status'])
await nextTick() const handleOpen = async (row) => {
editRef.value?.open('add') ApproveRef.value?.open(toRaw(row))
}
const handleEdit = async (data: any) => {
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.getDetail(data)
}
const handleDelete = async (id: number) => {
await feedback.confirm('确定要删除?')
await flow_history_delete({ id })
feedback.msgSuccess('删除成功')
getLists()
} }
getLists() getLists()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -105,27 +105,6 @@
/> />
</div> </div>
</el-card> </el-card>
<el-card class="!border-none mb-4" shadow="never">
<template #header>
<span>服务支持</span>
</template>
<div>
<div v-for="(item, index) in workbenchData.support" :key="index">
<div
class="flex items-center pb-10 pt-10"
:class="{
'border-b border-br': index == 0
}"
>
<img width="120" height="120" class="flex-none" :src="item.image" />
<div class="ml-2">
<div>{{ item.title }}</div>
<div class="text-tx-regular text-xs mt-4">{{ item.desc }}</div>
</div>
</div>
</div>
</div>
</el-card>
</div> </div>
</div> </div>
</template> </template>
@@ -142,8 +121,7 @@ import menu_generator from './image/menu_generator.png'
import menu_file from './image/menu_file.png' import menu_file from './image/menu_file.png'
import menu_auth from './image/menu_auth.png' import menu_auth from './image/menu_auth.png'
import menu_web from './image/menu_web.png' import menu_web from './image/menu_web.png'
import qq_group from './image/qq_group.png'
import customer_service from './image/customer_service.png'
// 表单数据 // 表单数据
const workbenchData: any = reactive({ const workbenchData: any = reactive({
version: { version: {
@@ -155,18 +133,7 @@ const workbenchData: any = reactive({
website: '' website: ''
} }
}, },
support: [
{
image: qq_group,
title: '扫码进入QQ交流群',
desc: '疑难疑点 进入QQ群'
},
{
image: customer_service,
title: '添加企业客服微信',
desc: '想了解更多请添加客服'
}
],
today: {}, // 今日数据 today: {}, // 今日数据
menu: [ menu: [
{ {

View File

@@ -221,10 +221,15 @@ func (Service flowHistoryService) Pass(nextNode NextNodeReq) (e error) {
isEnd := false isEnd := false
if err == nil { if err == nil {
for _, v := range nextNodes { for _, v := range nextNodes {
if v.Type == "bpmn:userTask" { // if v.Type == "bpmn:exclusiveGateway" {
// 这里网关不用处理,顶多加一条历史记录
// }
if v.Type == "bpmn:serviceTask" {
// 发邮件之类的,待完善
} else if v.Type == "bpmn:userTask" {
var addReq = FlowHistoryAddReq{} var addReq = FlowHistoryAddReq{}
addReq.ApplyId = nextNode.ApplyId addReq.ApplyId = applyDetail.Id
addReq.FormValue = nextNode.FormValue addReq.FormValue = applyDetail.FormValue
addReq.NodeId = v.Id addReq.NodeId = v.Id
addReq.ApproverId = nextNode.NextNodeAdminId addReq.ApproverId = nextNode.NextNodeAdminId
@@ -238,8 +243,8 @@ func (Service flowHistoryService) Pass(nextNode NextNodeReq) (e error) {
} else if v.Type == "bpmn:endEvent" { } else if v.Type == "bpmn:endEvent" {
isEnd = true isEnd = true
var addReq = FlowHistoryAddReq{} var addReq = FlowHistoryAddReq{}
addReq.ApplyId = nextNode.ApplyId addReq.ApplyId = applyDetail.Id
addReq.FormValue = nextNode.FormValue addReq.FormValue = applyDetail.FormValue
addReq.NodeId = v.Id addReq.NodeId = v.Id
addReq.ApproverId = 0 addReq.ApproverId = 0

View File

@@ -15,7 +15,6 @@
<el-form-item label="{{{ .ColumnComment }}}" prop="{{{ (toCamelCase .GoField) }}}"> <el-form-item label="{{{ .ColumnComment }}}" prop="{{{ (toCamelCase .GoField) }}}">
<el-select <el-select
v-model="queryParams.{{{ (toCamelCase .GoField) }}}" v-model="queryParams.{{{ (toCamelCase .GoField) }}}"
class="w-[280px]"
clearable clearable
> >
{{{- if eq .DictType "" }}} {{{- if eq .DictType "" }}}
@@ -33,7 +32,7 @@
</el-form-item> </el-form-item>
{{{- else if eq .HtmlType "input" }}} {{{- else if eq .HtmlType "input" }}}
<el-form-item label="{{{ .ColumnComment }}}" prop="{{{ (toCamelCase .GoField) }}}"> <el-form-item label="{{{ .ColumnComment }}}" prop="{{{ (toCamelCase .GoField) }}}">
<el-input class="w-[280px]" v-model="queryParams.{{{ (toCamelCase .GoField) }}}" /> <el-input v-model="queryParams.{{{ (toCamelCase .GoField) }}}" />
</el-form-item> </el-form-item>
{{{- end }}} {{{- end }}}
{{{- end }}} {{{- end }}}
@@ -81,7 +80,7 @@
</template> </template>
</el-table-column> </el-table-column>
{{{- else }}} {{{- else }}}
<el-table-column label="{{{ .ColumnComment }}}" prop="{{{ (toCamelCase .GoField) }}}" min-width="100" /> <el-table-column label="{{{ .ColumnComment }}}" prop="{{{ (toCamelCase .GoField) }}}" min-width="130" />
{{{- end }}} {{{- end }}}
{{{- end }}} {{{- end }}}
{{{- end }}} {{{- end }}}