From 1e376296b2d8abbcdd051b1e75d860353c8bb19d Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Fri, 16 Dec 2022 17:09:08 +0800
Subject: [PATCH] 添加审核工作流
---
src/views/work/process/leave/form.vue | 188 ++++----
src/lang/zh.js | 2
src/page/login/index.vue | 38
src/const/enterprise/enterprise.js | 15
src/views/application/reject.vue | 81 +++
src/router/views/index.js | 38 +
src/views/application/application.vue | 39 +
src/util/formValidator.js | 19
src/views/work/process/audit/detail.vue | 154 +++++++
src/const/application/application.js | 93 +++
src/views/enterprise/enterprise.vue | 47 ++
src/api/reject/reject.js | 50 ++
src/views/work/process/audit/form.vue | 80 +++
src/api/application/application.js | 39 +
src/views/work/process/audit/handle.vue | 331 +++++++++++++++
15 files changed, 1,072 insertions(+), 142 deletions(-)
diff --git a/src/api/application/application.js b/src/api/application/application.js
index 99fed28..5c9f160 100644
--- a/src/api/application/application.js
+++ b/src/api/application/application.js
@@ -60,3 +60,42 @@
})
}
+// =====================请假流程===========================
+/*
+ *开始流程
+ */
+export const applicationProcess = (row) => {
+ return request({
+ url: '/api/application/application/start-process',
+ method: 'post',
+ data: row
+ })
+}
+
+/**
+ * 获取申请流程详情
+ * @param businessId
+ * @returns {AxiosPromise}
+ */
+export const applicationDetail = (businessId) => {
+ return request({
+ url: '/api/application/application/process-detail',
+ method: 'get',
+ params: {
+ businessId
+ }
+ })
+}
+
+/**
+ * 完成任务
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export const completeTask = (data) => {
+ return request({
+ url: '/api/application/application/complete-task',
+ method: 'post',
+ data
+ })
+}
diff --git a/src/api/reject/reject.js b/src/api/reject/reject.js
new file mode 100644
index 0000000..95939f2
--- /dev/null
+++ b/src/api/reject/reject.js
@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+ return request({
+ url: '/api/reject/reject/list',
+ method: 'get',
+ params: {
+ ...params,
+ current,
+ size,
+ }
+ })
+}
+
+export const getDetail = (id) => {
+ return request({
+ url: '/api/reject/reject/detail',
+ method: 'get',
+ params: {
+ id
+ }
+ })
+}
+
+export const remove = (ids) => {
+ return request({
+ url: '/api/reject/reject/remove',
+ method: 'post',
+ params: {
+ ids,
+ }
+ })
+}
+
+export const add = (row) => {
+ return request({
+ url: '/api/reject/reject/save',
+ method: 'post',
+ data: row
+ })
+}
+
+export const update = (row) => {
+ return request({
+ url: '/api/reject/reject/submit',
+ method: 'post',
+ data: row
+ })
+}
+
diff --git a/src/const/application/application.js b/src/const/application/application.js
index d1bd05b..b8111b9 100644
--- a/src/const/application/application.js
+++ b/src/const/application/application.js
@@ -1,3 +1,5 @@
+import {idCardValidate, mobileValidate} from "@/util/formValidator";
+
const uploadUrl = '/api/blade-resource/oss/endpoint/put-file-attach'
const propsHttp = {
url:'link',
@@ -6,6 +8,7 @@
const labelWidth = '25%'
const urlLabelWidth='17%'
export default {
+ tabs:true,
height: 'auto',
calcHeight: 30,
tip: false,
@@ -29,13 +32,15 @@
label: "经办人姓名",
prop: "name",
type: "input",
- labelWidth:labelWidth
+ labelWidth:labelWidth,
+ rules: [{required: true, message: "请输入经办人姓名", trigger: ['blur','change']}]
},
{
label: "经办人身份证号",
prop: "idCard",
type: "input",
- labelWidth:labelWidth
+ labelWidth:labelWidth,
+ rules: [{required: true, trigger: ['blur','change'],validator:idCardValidate}]
},
{
label: "手机号",
@@ -43,7 +48,8 @@
type: "input",
span:12,
row:true,
- labelWidth:labelWidth
+ labelWidth:labelWidth,
+ rules: [{required: true, trigger: ['blur','change'],validator:mobileValidate}]
},
{
label: "通行开始时间",
@@ -140,6 +146,28 @@
prop: "goodsName",
labelWidth:labelWidth,
type: "input",
+ },
+ {
+ label: "货物分类",
+ prop: "goodsCategory",
+ labelWidth:labelWidth,
+ type: "select",
+ dicUrl: "/api/blade-system/dict-biz/dictionary?code=goods_category",
+ props:{
+ label:"dictValue",
+ value:"dictKey"
+ }
+ },
+ {
+ label: "货物类别",
+ prop: "goodsType",
+ labelWidth:labelWidth,
+ type: "select",
+ dicUrl: "/api/blade-system/dict-biz/dictionary?code=goods_type",
+ props:{
+ label:"dictValue",
+ value:"dictKey"
+ }
},
{
label: "轴荷分布",
@@ -349,15 +377,17 @@
editDisplay: false,
viewDisplay: false,
display:false,
+ hide:true,
},
- // {
- // label: "申请编号",
- // prop: "no",
- // type: "input",
- // addDisplay: false,
- // editDisplay: false,
- // viewDisplay: false,
- // },
+ {
+ label: "申请编号",
+ prop: "no",
+ type: "input",
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: false,
+ display:false,
+ },
{
label: "车牌号",
prop: "licensePlate",
@@ -408,17 +438,44 @@
viewDisplay: false,
display:false,
},
-
{
- label: "完善意见",
- prop: "suggestion",
- type: "textarea",
+ label: "货物分类",
+ prop: "goodsCategory",
+ labelWidth:labelWidth,
+ type: "select",
+ dicUrl: "/api/blade-system/dict-biz/dictionary?code=goods_category",
+ props:{
+ label:"dictValue",
+ value:"dictKey"
+ },
addDisplay: false,
editDisplay: false,
viewDisplay: false,
- hide: true,
- span:24,
- labelWidth:'10%'
+ display:false,
},
+ // {
+ // label: "完善意见",
+ // prop: "suggestion",
+ // type: "textarea",
+ // addDisplay: false,
+ // editDisplay: false,
+ // viewDisplay: false,
+ // display: true,
+ // hide: true,
+ // span:24,
+ // labelWidth:'10%'
+ // },
+ // {
+ // label: "批复意见",
+ // prop: "comment",
+ // type: "textarea",
+ // addDisplay: false,
+ // editDisplay: false,
+ // viewDisplay: false,
+ // display: true,
+ // hide: true,
+ // span:24,
+ // labelWidth:'10%'
+ // }
]
}
diff --git a/src/const/enterprise/enterprise.js b/src/const/enterprise/enterprise.js
index 4534cad..b4cc36b 100644
--- a/src/const/enterprise/enterprise.js
+++ b/src/const/enterprise/enterprise.js
@@ -31,6 +31,7 @@
labelWidth:labelWidth,
type: "input",
hide: true,
+ disabled:false
},
{
label: "联系人姓名",
@@ -221,5 +222,19 @@
hide: true,
display:false,
},
+ {
+ label: "企业名称",
+ labelWidth:labelWidth,
+ prop: "enterpriseName",
+ type: "input",
+ display: false,
+ },
+ {
+ label: "单位地址",
+ labelWidth:labelWidth,
+ prop: "address",
+ type: "input",
+ display: false,
+ },
]
}
diff --git a/src/lang/zh.js b/src/lang/zh.js
index 306ed2c..17984d3 100644
--- a/src/lang/zh.js
+++ b/src/lang/zh.js
@@ -78,7 +78,7 @@
},
login: {
title: '登录 ',
- info: 'BladeX 企业级开发平台',
+ info: '大件审批系统',
tenantId: '请输入租户ID',
username: '请输入账号',
password: '请输入密码',
diff --git a/src/page/login/index.vue b/src/page/login/index.vue
index ddb6e42..d04c978 100644
--- a/src/page/login/index.vue
+++ b/src/page/login/index.vue
@@ -10,25 +10,25 @@
</div>
<p class="title">{{ $t('login.info') }}</p>
<div style="font-size: 15px">
- <span>----------------------------------------------</span>
- <br>
- <span>管理租户编号:000000</span>
- <br>
- <span>超级管理员账号: admin / admin</span>
- <br>
- <span>人事账号: hr / hr</span>
- <br>
- <span>经理账号: manager / manager</span>
- <br>
- <span>老板账号: boss / boss</span>
- <br>
- <span>----------------------------------------------</span>
- <br>
- <span>普通租户编号:详见租户管理模块</span>
- <br>
- <span>租户管理员账号: admin / admin</span>
- <br>
- <span>----------------------------------------------</span>
+<!-- <span>----------------------------------------------</span>-->
+<!-- <br>-->
+<!-- <span>管理租户编号:000000</span>-->
+<!-- <br>-->
+<!-- <span>超级管理员账号: admin / admin</span>-->
+<!-- <br>-->
+<!-- <span>人事账号: hr / hr</span>-->
+<!-- <br>-->
+<!-- <span>经理账号: manager / manager</span>-->
+<!-- <br>-->
+<!-- <span>老板账号: boss / boss</span>-->
+<!-- <br>-->
+<!-- <span>----------------------------------------------</span>-->
+<!-- <br>-->
+<!-- <span>普通租户编号:详见租户管理模块</span>-->
+<!-- <br>-->
+<!-- <span>租户管理员账号: admin / admin</span>-->
+<!-- <br>-->
+<!-- <span>----------------------------------------------</span>-->
</div>
<!--<img class="img" src="/img/logo.png" alt="">-->
</div>
diff --git a/src/router/views/index.js b/src/router/views/index.js
index 383242e..b613b24 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -103,4 +103,40 @@
component: () =>
import( /* webpackChunkName: "views" */ '@/views/work/process/leave/detail')
}]
-}]
+},
+ {
+ path: '/work/process/audit',
+ component: Layout,
+ redirect: '/work/process/audit/form',
+ children: [
+ {
+ path: 'form/:processDefinitionId',
+ name: '审核流程',
+ meta: {
+ i18n: 'work'
+ },
+ component: () =>
+ import( /* webpackChunkName: "views" */ '@/views/work/process/audit/form')
+ },
+ {
+ path: 'handle/:taskId/:processInstanceId/:businessId',
+ name: '处理审核流程',
+ meta: {
+ i18n: 'work'
+ },
+ component: () =>
+ import( /* webpackChunkName: "views" */ '@/views/work/process/audit/handle')
+ },
+ {
+ path: 'detail/:processInstanceId/:businessId',
+ name: '审核流程详情',
+ meta: {
+ i18n: 'work'
+ },
+ component: () =>
+ import( /* webpackChunkName: "views" */ '@/views/work/process/audit/detail')
+ }]
+ }
+
+
+]
diff --git a/src/util/formValidator.js b/src/util/formValidator.js
new file mode 100644
index 0000000..b392eed
--- /dev/null
+++ b/src/util/formValidator.js
@@ -0,0 +1,19 @@
+import {cardid, isvalidatemobile} from "@/util/validate";
+
+export function mobileValidate(rule, value, callback){
+ let result = isvalidatemobile(value)
+ if (result[0]){
+ callback("请输入正确手机号")
+ }else {
+ callback()
+ }
+}
+
+export function idCardValidate(rule,value,callback){
+ let result = cardid(value)
+ if (result[0]){
+ callback("请输入正确身份证号")
+ }else {
+ callback()
+ }
+}
diff --git a/src/views/application/application.vue b/src/views/application/application.vue
index 6c36fb1..b3fb609 100644
--- a/src/views/application/application.vue
+++ b/src/views/application/application.vue
@@ -30,7 +30,9 @@
</template>
<template slot-scope="{type,size,row,index}" slot="menu">
<el-button icon="el-icon-edit" :size="size" :type="type" @click="$refs.crud.rowEdit(row,index)">编 辑</el-button>
- <el-button icon="el-icon-tickets" :size="size" :type="type" @click="polishApplication">完善信息</el-button>
+ <el-button icon="el-icon-tickets" :size="size" :type="type" @click="polishApplication(row.id)">补正</el-button>
+ <el-button v-if="permit" icon="el-icon-tickets" :size="size" :type="type">受 理</el-button>
+ <el-button v-if="permit" icon="el-icon-tickets" :size="size" :type="type" @click="rejectApplication(row)">不予受理</el-button>
<!-- <el-button icon="el-icon-delete" :size="size" :type="type">车辆变更</el-button>-->
<!-- <el-button icon="el-icon-delete" :size="size" :type="type">延 期</el-button>-->
<!-- <el-button icon="el-icon-delete" :size="size" :type="type">撤 销</el-button>-->
@@ -38,8 +40,8 @@
<!--按钮自定义-End-->
<!--cell自定义-Begin-->
- <template slot-scope="{row}" slot="id">
- <a href="#javascript" style="color: #337ab7" @click="$refs.crud.rowView(row)">{{row.id}}</a>
+ <template slot-scope="{row}" slot="no">
+ <a href="#javascript" style="color: #337ab7" @click="$refs.crud.rowView(row)">{{row.no}}</a>
</template>
<template slot-scope="{row}" slot="enterpriseName">
<a href="#javascript" style="color: #337ab7" @click="getEnterpriseDetail(row.userId)">{{row.enterpriseName}}</a>
@@ -47,7 +49,8 @@
<!--cell自定义-End-->
</avue-crud>
-
+ <!--不予受理的表单-->
+ <reject v-if="rejectVisible" ref="reject" @refreshLoad="refreshLoad"></reject>
</basic-container>
</template>
@@ -57,8 +60,10 @@
import option from "@/const/application/application";
import enterpriseOption from "@/const/enterprise/enterprise"
import {mapGetters} from "vuex";
+ import Reject from "@/views/application/reject";
export default {
+ components: {Reject},
data() {
return {
form: {},
@@ -73,6 +78,7 @@
selectionList: [],
option: option,
data: [],
+ rejectVisible:false
};
},
computed: {
@@ -91,6 +97,9 @@
ids.push(ele.id);
});
return ids.join(",");
+ },
+ permit(){
+ return this.userInfo.role_name == 'admin' || this.userInfo.role_name == 'administrator' ? true:false
}
},
methods: {
@@ -198,6 +207,9 @@
},
onLoad(page, params = {}) {
this.loading = true;
+ if (this.userInfo.role_name != 'admin' && this.userInfo.role_name !="administrator"){
+ params.userId = this.userInfo.user_id
+ }
getPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
const data = res.data.data;
this.page.total = data.total;
@@ -242,9 +254,9 @@
this.form.goodsEntity.id = goodsId
},
//完善信息
- polishApplication(){
+ polishApplication(id){
let that = this
- getDetail(this.form.id).then(res => {
+ getDetail(id).then(res => {
let data = res.data.data
this.form = data
this.init()
@@ -278,6 +290,13 @@
})
});
},
+ //不予受理
+ rejectApplication(row){
+ this.rejectVisible = true
+ this.$nextTick(()=>{
+ this.$refs.reject.init(row)
+ })
+ },
//获取企业信息
getEnterpriseDetail(userId){
getDetailByUserId(userId).then(res=>{
@@ -290,13 +309,19 @@
width: '70%',
data:enterpriseDetail,
option: enterpriseOption,
- callback:(res)=>{
+ callback:()=>{
enterpriseOption.detail = false
}
})
}
})
+ },
+
+ //刷新页面
+ refreshLoad(){
+ this.onLoad(this.page, this.query);
}
+
}
};
</script>
diff --git a/src/views/application/reject.vue b/src/views/application/reject.vue
new file mode 100644
index 0000000..a5c93c4
--- /dev/null
+++ b/src/views/application/reject.vue
@@ -0,0 +1,81 @@
+<template>
+ <el-dialog
+ :title="title"
+ :modal-append-to-body="false"
+ :append-to-body="true"
+ :close-on-click-modal="false"
+ width="60%"
+ :visible.sync="visible"
+ >
+ <avue-form ref="form" v-model="form" :option="option" @submit="submit">
+ </avue-form>
+ </el-dialog>
+</template>
+
+<script>
+import {add} from '@/api/reject/reject'
+export default {
+ name: "reject",
+ data() {
+ return {
+ title:"不予受理",
+ form: {},
+ visible: false,
+ option: {
+ emptyBtn: false,
+ submitText: "保存",
+ gutter: 30,
+ column: [
+ {
+ label: "理由",
+ prop: "rejectReason",
+ type: "select",
+ dicUrl: "/api/blade-system/dict-biz/dictionary?code=reject_reason",
+ props:{
+ label:"dictValue",
+ value:"dictKey"
+ },
+ hide: true,
+ rules: [{
+ required: true,
+ message: "请选择理由",
+ trigger: "blur"
+ }]
+ },
+ {
+ label: "备注",
+ prop: "remark",
+ type: "textarea",
+ span: 24
+ }
+ ]
+ }
+ }
+ },
+ methods: {
+ init(data) {
+ this.form.no = data.no
+ this.visible = true
+ },
+ // 表单提交
+ submit(row,done) {
+ add(row).then(res=>{
+ if (res.data.code ==200){
+ this.$refs.form.resetFields()
+ this.$emit("refreshLoad")
+ this.visible = false
+ this.$message.success("处理成功")
+ done();
+ }else {
+ this.$message.error("处理失败")
+ done();
+ }
+ })
+ }
+ }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/enterprise/enterprise.vue b/src/views/enterprise/enterprise.vue
index 5e55161..1ae37fe 100644
--- a/src/views/enterprise/enterprise.vue
+++ b/src/views/enterprise/enterprise.vue
@@ -1,6 +1,6 @@
<template>
<basic-container>
- <avue-crud :option="option"
+ <avue-crud v-if="permit" :option="option"
:table-loading="loading"
:data="data"
:page.sync="page"
@@ -28,11 +28,17 @@
</el-button>
</template>
</avue-crud>
+
+ <avue-form v-else
+ v-model="form"
+ :option="option"
+ @submit="handleSubmit"
+ ></avue-form>
</basic-container>
</template>
<script>
- import {getList, getDetail, add, update, remove} from "@/api/enterprise/enterprise";
+ import {getList, getDetail,getDetailByUserId, add, update, remove} from "@/api/enterprise/enterprise";
import option from "@/const/enterprise/enterprise";
import {mapGetters} from "vuex";
@@ -68,9 +74,36 @@
ids.push(ele.id);
});
return ids.join(",");
+ },
+ permit(){
+ return this.userInfo.role_name == 'admin' || this.userInfo.role_name == 'administrator' ? true:false
+ }
+ },
+ created() {
+ if (this.permit){
+ this.getEnterpriseDetailByUserId()
}
},
methods: {
+ handleSubmit(){
+ if (this.form.id){
+ update(this.form).then(res=>{
+ if (res.data.code == 200){
+ this.$message.success(res.data.msg)
+ }else {
+ this.$message.error(res.data.msg)
+ }
+ })
+ }else {
+ add(this.form).then(res=>{
+ if (res.data.code == 200){
+ this.$message.success(res.data.msg)
+ }else {
+ this.$message.error(res.data.msg)
+ }
+ })
+ }
+ },
rowSave(row, done, loading) {
row.userId = this.userInfo.user_id
add(row).then(() => {
@@ -180,6 +213,16 @@
this.loading = false;
this.selectionClear();
});
+ },
+ getEnterpriseDetailByUserId(){
+ getDetailByUserId(this.userInfo.user_id).then(res=>{
+ if (res.data.code == 200){
+ this.form = res.data.data
+ this.form.account = this.userInfo.account
+ const group = this.findObject(this.option.group,"account");
+ group.disabled = true
+ }
+ })
}
}
};
diff --git a/src/views/work/process/audit/detail.vue b/src/views/work/process/audit/detail.vue
new file mode 100644
index 0000000..e86b8fc
--- /dev/null
+++ b/src/views/work/process/audit/detail.vue
@@ -0,0 +1,154 @@
+<template>
+ <basic-container>
+ <el-form ref="form" :model="form" label-width="80px">
+ <el-row type="flex" class="row-bg" justify="end">
+ <el-form-item>
+ <el-button @click="handleCancel">关闭</el-button>
+ </el-form-item>
+ </el-row>
+ <!--审批信息-->
+ <el-card shadow="hover">
+ <div slot="header">
+ <span>审批信息</span>
+ </div>
+ <avue-form :option="option" v-model="form"/>
+ </el-card>
+ <!--流程信息-->
+ <el-card shadow="hover">
+ <div slot="header">
+ <span>流程信息</span>
+ </div>
+ <el-row type="flex" class="row-bg">
+ <el-timeline>
+ <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
+ <el-card shadow="hover">
+ <p>{{flow.assigneeName}} 在 [{{flow.createTime}}] 开始处理 [{{flow.historyActivityName}}] 环节</p>
+ <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{flow.historyActivityDurationTime}}]</p>
+ <p v-if="flow.comment!==''">批复意见: [{{flow.comment}}]</p>
+ <p v-if="flow.endTime!==''">结束时间: [{{flow.endTime}}]</p>
+ </el-card>
+ </el-timeline-item>
+ </el-timeline>
+ </el-row>
+ </el-card>
+ <!--流程跟踪-->
+ <el-card shadow="hover">
+ <div slot="header">
+ <span>流程跟踪</span>
+ </div>
+ <el-row class="row-bg">
+ <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
+ </el-row>
+ </el-card>
+ </el-form>
+ </basic-container>
+</template>
+
+<script>
+import {historyFlowList} from "@/api/work/process";
+import {applicationDetail} from "@/api/application/application";
+import option from "@/const/application/application";
+
+export default {
+ name: "detail",
+ data() {
+ return {
+ businessId: '',
+ processInstanceId: '',
+ src: '',
+ flowList: [],
+ form: {
+ flow:{
+ assigneeName:'',
+ },
+ },
+ option:option
+ }
+ },
+ created() {
+ this.init();
+ },
+ beforeDestroy() {
+ this.controlOption('close')
+ },
+ methods: {
+ init() {
+ this.processInstanceId = this.$route.params.processInstanceId;
+ this.businessId = this.$route.params.businessId;
+
+ //控制option
+ this.controlOption('open')
+
+ historyFlowList(this.processInstanceId).then(res => {
+ const data = res.data;
+ if (data.success) {
+ this.flowList = data.data;
+ }
+ })
+ applicationDetail(this.businessId).then(res => {
+ const data = res.data;
+ if (data.success) {
+ this.form = data.data;
+ this.initForm()
+ }
+ })
+ },
+ handleCancel() {
+ this.$router.$avueRouter.closeTag();
+ this.$router.push({path: `/work/start`});
+ },
+ //给form表单中的字段赋值
+ initForm(){
+ let basic = this.form.basicInfoEntity
+ let basicId = basic.id
+ let plan = this.form.planEntity
+ let planId = plan.id
+ let scheme = this.form.schemeEntity
+ let schemeId = scheme.id
+ let car= this.form.carEntity
+ let catId = car.id
+ let goods = this.form.goodsEntity
+ let goodsId = goods.id
+ let form = this.form
+ //保留原form中的字段
+ let common = Object.assign({},form)
+
+ form = Object.assign(form,basic)
+ form = Object.assign(form,plan)
+ form = Object.assign(form,scheme)
+ form = Object.assign(form,car)
+ form = Object.assign(form,goods)
+
+ //覆盖回原form
+ form = Object.assign(form,common)
+
+ this.form.basicInfoEntity.id = basicId
+ this.form.planEntity.id = planId
+ this.form.schemeEntity.id = schemeId
+ this.form.carEntity.id =catId
+ this.form.goodsEntity.id = goodsId
+ },
+ controlOption(arg){
+ const suggestion = this.findObject(this.option.column,"suggestion")
+ const comment = this.findObject(this.option.column,"comment")
+ if (arg == 'open'){
+ this.option.detail = true
+ if (!this.form.suggestion){
+ // suggestion.display = false
+ }
+ // comment.display = false
+
+ }else if (arg == 'close'){
+ this.option.detail = false
+ // suggestion.display = true
+ // comment.display = true
+ }
+
+ }
+ }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/work/process/audit/form.vue b/src/views/work/process/audit/form.vue
new file mode 100644
index 0000000..726eb72
--- /dev/null
+++ b/src/views/work/process/audit/form.vue
@@ -0,0 +1,80 @@
+<template>
+ <div>
+ <basic-container>
+ <avue-form :option="option" v-model="form" @submit="handleSubmit"/>
+ </basic-container>
+ <basic-container>
+ <flow-design :is-display="true" :process-definition-id="processDefinitionId"></flow-design>
+ </basic-container>
+ </div>
+</template>
+
+<script>
+import {applicationProcess} from "@/api/application/application"
+import option from "@/const/application/application"
+import {mapGetters} from "vuex";
+export default {
+ name: "form",
+ data() {
+ return {
+ processDefinitionId: '',
+ form: {},
+ option:option
+ }
+ },
+ computed: {
+ ...mapGetters(["permission", 'userInfo']),
+ },
+ created() {
+ this.controlOption('open')
+ this.processDefinitionId = this.$route.params.processDefinitionId;
+ },
+ beforeDestroy() {
+ this.controlOption('close')
+ },
+ methods: {
+ handleSubmit() {
+ const params = {
+ processDefinitionId: this.$route.params.processDefinitionId,
+ userId: this.userInfo.user_id,
+ ...this.form,
+ };
+ applicationProcess(params).then(resp => {
+ const data = resp.data;
+ if (data.success) {
+ this.$message.success(data.msg);
+ this.$router.$avueRouter.closeTag();
+ this.$router.push({path: `/work/start`});
+ } else {
+ this.$message.error(data.msg || '提交失败');
+ }
+ });
+ },
+ controlOption(arg) {
+ const suggestion = this.findObject(this.option.column,"suggestion")
+ const comment = this.findObject(this.option.column,"comment")
+ if (arg == 'open'){
+ //解除禁用状态
+ this.option.group.forEach(group=>{
+ group.column.forEach(item=>{
+ item.disabled = false
+ })
+ })
+ //
+ // //隐藏完善意见
+ // suggestion.display = false
+ // //隐藏批复意见
+ // comment.display = false
+
+ }else if (arg == 'close'){
+ // suggestion.display = true
+ // comment.display = true
+ }
+ }
+ }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/work/process/audit/handle.vue b/src/views/work/process/audit/handle.vue
new file mode 100644
index 0000000..5175af7
--- /dev/null
+++ b/src/views/work/process/audit/handle.vue
@@ -0,0 +1,331 @@
+<template>
+ <basic-container>
+ <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+ <el-row type="flex" class="row-bg" justify="end">
+ <el-form-item>
+ <!-- <el-button type="primary" @click="handleAgree">同意</el-button>-->
+<!-- <el-button type="success" @click="handlePolish">完善</el-button>-->
+<!-- <el-button type="danger" @click="handleDisagree">驳回</el-button>-->
+ <el-button @click="handleCancel">关闭</el-button>
+ </el-form-item>
+ </el-row>
+ <el-card shadow="hover">
+ <div slot="header">
+ <span>审批信息</span>
+ </div>
+ <avue-form :option="option" v-model="form"/>
+
+ <el-tabs type="border-card">
+ <el-tab-pane label="同意">
+ <avue-form ref="form" v-model="agreeModel" :option="agreeOption" @submit="handleAgree"/>
+ </el-tab-pane>
+
+ <el-tab-pane label="完善">
+ <avue-form ref="form" v-model="polishModel" :option="polishOption" @submit="handlePolish"/>
+ </el-tab-pane>
+
+ <el-tab-pane label="驳回">
+ <avue-form ref="form" v-model="rejectModel" :option="rejectOption" @submit="handleDisagree"/>
+ </el-tab-pane>
+ </el-tabs>
+
+
+ </el-card>
+
+ <el-card shadow="hover">
+ <div slot="header">
+ <span>流程信息</span>
+ </div>
+ <el-row type="flex" class="row-bg">
+ <el-timeline>
+ <el-timeline-item :key="flow.id" :timestamp="flow.createTime" v-for="flow in flowList" placement="top">
+ <el-card shadow="hover">
+ <p>{{ flow.assigneeName }} 在 [{{ flow.createTime }}] 开始处理 [{{ flow.historyActivityName }}] 环节</p>
+ <p v-if="flow.historyActivityDurationTime!==''">任务历时 [{{ flow.historyActivityDurationTime }}]</p>
+ <p v-if="flow.comment!==''">批复意见: [{{ flow.comment }}]</p>
+ <p v-if="flow.endTime!==''">结束时间: [{{ flow.endTime }}]</p>
+ </el-card>
+ </el-timeline-item>
+ </el-timeline>
+ </el-row>
+ </el-card>
+
+ <el-card shadow="hover">
+ <div slot="header">
+ <span>流程跟踪</span>
+ </div>
+ <el-row class="row-bg">
+ <flow-design :is-display="true" :process-instance-id="processInstanceId"></flow-design>
+ </el-row>
+ </el-card>
+ </el-form>
+ </basic-container>
+</template>
+
+<script>
+import {historyFlowList, leaveDetail} from "@/api/work/process";
+import option from "@/const/application/application";
+import {applicationDetail,completeTask} from "@/api/application/application";
+
+export default {
+ name: "handle",
+ data() {
+ return {
+ taskId: '',
+ businessId: '',
+ processInstanceId: '',
+ src: '',
+ flowList: [],
+ form: {
+ flow: {
+ assigneeName: '',
+ },
+ startTime: '',
+ endTime: '',
+ reason: '',
+ comment: '',
+ },
+ option: option,
+ //批复相关数据
+ agreeModel: {},
+ agreeOption: {
+ emptyBtn: false,
+ submitText: "提交",
+ gutter: 30,
+ column: [
+ {
+ label: "批复意见",
+ prop: "comment",
+ span:24,
+ type:'textarea',
+ hide: true,
+ rules: [{
+ required: true,
+ message: "请输入批复意见",
+ trigger: "blur"
+ }]
+ },
+ ]
+ },
+ polishModel: {},
+ polishOption: {
+ emptyBtn: false,
+ submitText: "提交",
+ gutter: 30,
+ column: [
+ {
+ label: "完善意见",
+ prop: "suggestion",
+ type:'textarea',
+ span:24,
+ hide: true,
+ rules: [{
+ required: true,
+ message: "请输入完善意见",
+ trigger: "blur"
+ }]
+ },
+ {
+ label: "批复意见",
+ prop: "comment",
+ type:'textarea',
+ span:24,
+ hide: true,
+ rules: [{
+ required: true,
+ message: "请输入批复意见",
+ trigger: "blur"
+ }]
+ },
+ ]
+ },
+ rejectModel: {},
+ rejectOption: {
+ emptyBtn: false,
+ submitText: "提交",
+ gutter: 30,
+ column: [
+ {
+ label: "理由",
+ prop: "rejectReason",
+ type: "select",
+ dicUrl: "/api/blade-system/dict-biz/dictionary?code=reject_reason",
+ props: {
+ label: "dictValue",
+ value: "dictKey"
+ },
+ hide: true,
+ rules: [{
+ required: true,
+ message: "请选择理由",
+ trigger: "blur"
+ }]
+ },
+ {
+ label: "备注",
+ prop: "remark",
+ type: "textarea",
+ span: 24
+ }
+ ]
+ }
+ }
+ },
+ created() {
+ this.init();
+ },
+ beforeDestroy() {
+ this.controlOption("close")
+ },
+ beforeRouteUpdate(to, from, next) {
+ // 在当前路由改变,但是该组件被复用时调用
+ // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
+ // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用
+ // 可以访问组件实例 `this`
+ if (to.fullPath !== from.fullPath) {
+ next();
+ this.init();
+ }
+ },
+ methods: {
+ init() {
+ this.taskId = this.$route.params.taskId;
+ this.processInstanceId = this.$route.params.processInstanceId;
+ this.businessId = this.$route.params.businessId;
+
+ this.controlOption('open')
+
+ historyFlowList(this.processInstanceId).then(res => {
+ const data = res.data;
+ if (data.success) {
+ this.flowList = data.data;
+ }
+ })
+ applicationDetail(this.businessId).then(res => {
+ const data = res.data;
+ if (data.success) {
+ this.form = data.data;
+ this.initForm()
+ }
+ })
+ },
+ //同意
+ handleAgree() {
+ if (!this.agreeModel.comment) {
+ this.$message.warning('请先填写批复意见');
+ return;
+ }
+ const params = {
+ taskId: this.taskId,
+ processInstanceId: this.processInstanceId,
+ flag: 'ok',
+ comment: this.agreeModel.comment,
+ };
+ completeTask(params).then(res => {
+ const data = res.data;
+ if (data.success) {
+ this.$message.success(data.msg);
+ this.$router.$avueRouter.closeTag();
+ this.$router.push({path: `/work/start`});
+ } else {
+ this.$message.error(data.msg || '提交失败');
+ }
+ })
+ },
+ //驳回
+ handleDisagree() {
+ if (!this.form.comment) {
+ this.$message.warning('请先填写批复意见');
+ return;
+ }
+ const params = {
+ taskId: this.taskId,
+ processInstanceId: this.processInstanceId,
+ comment: this.form.comment,
+ };
+ completeTask(params).then(res => {
+ const data = res.data;
+ if (data.success) {
+ this.$message.success(data.msg);
+ this.$router.$avueRouter.closeTag();
+ this.$router.push({path: `/work/start`});
+ } else {
+ this.$message.error(data.msg || '提交失败');
+ }
+ })
+ },
+ //完善
+ handlePolish() {
+ },
+ handleCancel() {
+ this.$router.$avueRouter.closeTag();
+ this.$router.push({path: `/work/start`});
+ },
+ //给form表单中的字段赋值
+ initForm() {
+ let basic = this.form.basicInfoEntity
+ let basicId = basic.id
+ let plan = this.form.planEntity
+ let planId = plan.id
+ let scheme = this.form.schemeEntity
+ let schemeId = scheme.id
+ let car = this.form.carEntity
+ let catId = car.id
+ let goods = this.form.goodsEntity
+ let goodsId = goods.id
+ let form = this.form
+ //保留原form中的字段
+ let common = Object.assign({}, form)
+
+ form = Object.assign(form, basic)
+ form = Object.assign(form, plan)
+ form = Object.assign(form, scheme)
+ form = Object.assign(form, car)
+ form = Object.assign(form, goods)
+
+ //覆盖回原form
+ form = Object.assign(form, common)
+
+ this.form.basicInfoEntity.id = basicId
+ this.form.planEntity.id = planId
+ this.form.schemeEntity.id = schemeId
+ this.form.carEntity.id = catId
+ this.form.goodsEntity.id = goodsId
+ },
+
+ //对option进行操作
+ controlOption(arg) {
+ if (arg == 'open') {
+ //设置group内全为禁用状态
+ this.option.group.forEach(group => {
+ group.column.forEach(item => {
+ item.disabled = true
+ })
+ })
+
+ //隐藏提交 清空按钮
+ this.option.submitBtn = false
+ this.option.emptyBtn = false
+
+ } else if (arg == 'close') {
+ //解除禁用状态
+ this.option.group.forEach(group => {
+ group.column.forEach(item => {
+ item.disabled = false
+ })
+ })
+
+ //显示提交 清空按钮
+ this.option.submitBtn = true
+ this.option.emptyBtn = true
+
+ }
+
+ }
+ }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/work/process/leave/form.vue b/src/views/work/process/leave/form.vue
index 6f20bb3..11144d7 100644
--- a/src/views/work/process/leave/form.vue
+++ b/src/views/work/process/leave/form.vue
@@ -10,103 +10,103 @@
</template>
<script>
- import {leaveProcess} from "@/api/work/process";
+import {leaveProcess} from "@/api/work/process";
- export default {
- data() {
- return {
- processDefinitionId: '',
- form: {},
- option: {
- group: [
- {
- icon: 'el-icon-info',
- label: '请假基础信息',
- prop: 'group1',
- column: [
- {
- label: '审批人员',
- prop: 'taskUser',
- type: 'select',
- dicUrl: `/api/blade-user/user-list`,
- props: {
- label: "account",
- value: "id"
- },
- span: 24,
- rules: [
- {
- required: true,
- message: '请选择审批人员',
- trigger: 'blur'
- }
- ]
+export default {
+ data() {
+ return {
+ processDefinitionId: '',
+ form: {},
+ option: {
+ group: [
+ {
+ icon: 'el-icon-info',
+ label: '请假基础信息',
+ prop: 'group1',
+ column: [
+ {
+ label: '审批人员',
+ prop: 'taskUser',
+ type: 'select',
+ dicUrl: `/api/blade-user/user-list`,
+ props: {
+ label: "account",
+ value: "id"
},
- {
- label: '开始时间',
- prop: 'startTime',
- type: 'datetime',
- valueFormat: 'yyyy-MM-dd HH:mm:ss',
- rules: [
- {
- required: true,
- message: '请选择开始时间',
- trigger: 'blur'
- }
- ]
- },
- {
- label: '结束时间',
- prop: 'endTime',
- type: 'datetime',
- valueFormat: 'yyyy-MM-dd HH:mm:ss',
- rules: [
- {
- required: true,
- message: '请选择结束时间',
- trigger: 'blur'
- }
- ]
- },
- {
- label: '请假理由',
- prop: 'reason',
- type: 'textarea',
- span: 24,
- rules: [
- {
- required: true,
- message: '请输入请假理由',
- trigger: 'blur'
- }
- ]
- },
- ]
- },
- ],
- }
- }
- },
- created() {
- this.processDefinitionId = this.$route.params.processDefinitionId;
- },
- methods: {
- handleSubmit() {
- const params = {
- processDefinitionId: this.$route.params.processDefinitionId,
- ...this.form,
- };
- leaveProcess(params).then(resp => {
- const data = resp.data;
- if (data.success) {
- this.$message.success(data.msg);
- this.$router.$avueRouter.closeTag();
- this.$router.push({path: `/work/start`});
- } else {
- this.$message.error(data.msg || '提交失败');
- }
- });
+ span: 24,
+ rules: [
+ {
+ required: true,
+ message: '请选择审批人员',
+ trigger: 'blur'
+ }
+ ]
+ },
+ {
+ label: '开始时间',
+ prop: 'startTime',
+ type: 'datetime',
+ valueFormat: 'yyyy-MM-dd HH:mm:ss',
+ rules: [
+ {
+ required: true,
+ message: '请选择开始时间',
+ trigger: 'blur'
+ }
+ ]
+ },
+ {
+ label: '结束时间',
+ prop: 'endTime',
+ type: 'datetime',
+ valueFormat: 'yyyy-MM-dd HH:mm:ss',
+ rules: [
+ {
+ required: true,
+ message: '请选择结束时间',
+ trigger: 'blur'
+ }
+ ]
+ },
+ {
+ label: '请假理由',
+ prop: 'reason',
+ type: 'textarea',
+ span: 24,
+ rules: [
+ {
+ required: true,
+ message: '请输入请假理由',
+ trigger: 'blur'
+ }
+ ]
+ },
+ ]
+ },
+ ],
}
}
+ },
+ created() {
+ this.processDefinitionId = this.$route.params.processDefinitionId;
+ },
+ methods: {
+ handleSubmit() {
+ const params = {
+ processDefinitionId: this.$route.params.processDefinitionId,
+ ...this.form,
+ };
+ leaveProcess(params).then(resp => {
+ const data = resp.data;
+ if (data.success) {
+ this.$message.success(data.msg);
+ this.$router.$avueRouter.closeTag();
+ this.$router.push({path: `/work/start`});
+ } else {
+ this.$message.error(data.msg || '提交失败');
+ }
+ });
+ }
}
+}
</script>
--
Gitblit v1.9.3