mirror of
https://gitee.com/log4j/pig-ui.git
synced 2024-12-23 13:43:51 +08:00
feat: 前端对接工作流模块
This commit is contained in:
parent
975adaf104
commit
c011886140
46
src/api/oa/leave-bill.ts
Normal file
46
src/api/oa/leave-bill.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import request from '/@/utils/request';
|
||||||
|
|
||||||
|
export function fetchList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/leave-bill/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addObj(obj) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/leave-bill',
|
||||||
|
method: 'post',
|
||||||
|
data: obj
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getObj(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/leave-bill/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function submit(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/leave-bill/submit/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function delObj(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/leave-bill/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function putObj(obj) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/leave-bill/',
|
||||||
|
method: 'put',
|
||||||
|
data: obj
|
||||||
|
})
|
||||||
|
}
|
46
src/api/oa/model.ts
Normal file
46
src/api/oa/model.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import request from '/@/utils/request';
|
||||||
|
|
||||||
|
export function fetchList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/model',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function delObj(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/model/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deploy(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/model/deploy/' + id,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addObj(obj) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/model/insert',
|
||||||
|
method: 'post',
|
||||||
|
data: obj
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getObj(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/log/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function putObj(obj) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/log/',
|
||||||
|
method: 'put',
|
||||||
|
data: obj
|
||||||
|
})
|
||||||
|
}
|
23
src/api/oa/process.ts
Normal file
23
src/api/oa/process.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import request from '/@/utils/request';
|
||||||
|
|
||||||
|
export function fetchList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/process',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function delObj(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/process/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function status(id, type) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/process/status/' + id + '/' + type,
|
||||||
|
method: 'put'
|
||||||
|
})
|
||||||
|
}
|
31
src/api/oa/task.ts
Normal file
31
src/api/oa/task.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import request from '/@/utils/request';
|
||||||
|
|
||||||
|
export function fetchList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/task/todo',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchDetail(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/task/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchComment(id) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/task/comment/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doTask(obj) {
|
||||||
|
return request({
|
||||||
|
url: '/admin/task',
|
||||||
|
method: 'post',
|
||||||
|
data: obj
|
||||||
|
})
|
||||||
|
}
|
@ -13,6 +13,7 @@ export default {
|
|||||||
resetBtn: 'reset',
|
resetBtn: 'reset',
|
||||||
action:'action',
|
action:'action',
|
||||||
optSuccessText: 'operation success',
|
optSuccessText: 'operation success',
|
||||||
|
optConfirmText: 'Confirm this operation ',
|
||||||
editSuccessText: 'edit success',
|
editSuccessText: 'edit success',
|
||||||
addSuccessText: 'add success',
|
addSuccessText: 'add success',
|
||||||
delSuccessText: 'delete success',
|
delSuccessText: 'delete success',
|
||||||
|
@ -16,6 +16,7 @@ export default {
|
|||||||
addSuccessText: '添加成功',
|
addSuccessText: '添加成功',
|
||||||
delSuccessText: '删除成功',
|
delSuccessText: '删除成功',
|
||||||
delConfirmText: '此操作将永久删除',
|
delConfirmText: '此操作将永久删除',
|
||||||
|
optConfirmText: '是否确认本操作',
|
||||||
confirmButtonText: '确认',
|
confirmButtonText: '确认',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
download: '下载'
|
download: '下载'
|
||||||
|
@ -37,7 +37,9 @@ export const Local = {
|
|||||||
export const Session = {
|
export const Session = {
|
||||||
// 设置临时缓存
|
// 设置临时缓存
|
||||||
set(key: string, val: any) {
|
set(key: string, val: any) {
|
||||||
if (key === 'token' || key === 'refresh_token') return Cookies.set(key, val);
|
if (key === 'token' || key === 'refresh_token') {
|
||||||
|
Cookies.set(key, val)
|
||||||
|
}
|
||||||
window.sessionStorage.setItem(key, JSON.stringify(val));
|
window.sessionStorage.setItem(key, JSON.stringify(val));
|
||||||
},
|
},
|
||||||
// 获取临时缓存
|
// 获取临时缓存
|
||||||
|
144
src/views/oa/leave_bill/form.vue
Normal file
144
src/views/oa/leave_bill/form.vue
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog :title="form.leaveId ? $t('common.editBtn') : $t('common.addBtn')" v-model="visible"
|
||||||
|
:close-on-click-modal="false" draggable>
|
||||||
|
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||||
|
<el-row :gutter="24">
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.username')" prop="username">
|
||||||
|
<el-input v-model="form.username" :placeholder="t('leave.inputUsernameTip')" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.days')" prop="days">
|
||||||
|
<el-input-number :min="1" :max="1000" v-model="form.days"
|
||||||
|
:placeholder="t('leave.inputDaysTip')"></el-input-number>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.leaveTime')" prop="leaveTime">
|
||||||
|
<el-date-picker type="datetime" :placeholder="t('leave.inputLeaveTimeTip')" v-model="form.leaveTime"
|
||||||
|
:value-format="dateTimeStr"></el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.content')" prop="content">
|
||||||
|
<editor v-model:get-html="form.content" :placeholder="t('leave.inputContentTip')" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
|
||||||
|
<el-button type="primary" @click="onSubmit">{{ $t('common.confirmButtonText') }}</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="OaLeaveBillDialog">
|
||||||
|
import { useMessage } from "/@/hooks/message";
|
||||||
|
import { getObj, addObj, putObj } from '../../../api/oa/leave-bill'
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
import { useUserInfo } from "/@/stores/userInfo";
|
||||||
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
// 定义变量内容
|
||||||
|
const dataFormRef = ref();
|
||||||
|
const visible = ref(false)
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
// 提交表单数据
|
||||||
|
const form = reactive({
|
||||||
|
leaveId: '',
|
||||||
|
username: '',
|
||||||
|
days: 0,
|
||||||
|
content: '',
|
||||||
|
leaveTime: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
// 定义校验规则
|
||||||
|
const dataRules = ref({
|
||||||
|
username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
|
||||||
|
days: [{ required: true, message: '请假天数不能为空', trigger: 'blur' }],
|
||||||
|
content: [{ required: true, message: '备注不能为空', trigger: 'blur' }],
|
||||||
|
leaveTime: [{ required: true, message: '时间不能为空', trigger: 'blur' }],
|
||||||
|
})
|
||||||
|
|
||||||
|
// 打开弹窗
|
||||||
|
const openDialog = (id: string) => {
|
||||||
|
visible.value = true
|
||||||
|
form.leaveId = ''
|
||||||
|
|
||||||
|
// 重置表单数据
|
||||||
|
if (dataFormRef.value) {
|
||||||
|
dataFormRef.value.resetFields()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取oaLeaveBill信息
|
||||||
|
if (id) {
|
||||||
|
form.leaveId = id
|
||||||
|
getoaLeaveBillData(id)
|
||||||
|
} else {
|
||||||
|
form.username = useUserInfo().userInfos.user.username
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 提交
|
||||||
|
const onSubmit = () => {
|
||||||
|
dataFormRef.value.validate((valid: boolean) => {
|
||||||
|
if (!valid) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// 更新
|
||||||
|
if (form.leaveId) {
|
||||||
|
loading.value = true
|
||||||
|
putObj(form).then(() => {
|
||||||
|
useMessage().success(t('common.editSuccessText'))
|
||||||
|
visible.value = false // 关闭弹窗
|
||||||
|
emit('refresh')
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
}).finally(() => {
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
loading.value = true
|
||||||
|
addObj(form).then(() => {
|
||||||
|
useMessage().success(t('common.addSuccessText'))
|
||||||
|
visible.value = false // 关闭弹窗
|
||||||
|
emit('refresh')
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
}).finally(() => {
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化表单数据
|
||||||
|
const getoaLeaveBillData = (id: string) => {
|
||||||
|
// 获取数据
|
||||||
|
loading.value = true
|
||||||
|
getObj(id).then((res: any) => {
|
||||||
|
Object.assign(form, res.data)
|
||||||
|
}).finally(() => {
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
// 暴露变量
|
||||||
|
defineExpose({
|
||||||
|
openDialog
|
||||||
|
});
|
||||||
|
</script>
|
26
src/views/oa/leave_bill/i18n/en.ts
Normal file
26
src/views/oa/leave_bill/i18n/en.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
export default {
|
||||||
|
leave: {
|
||||||
|
index: 'index',
|
||||||
|
importoaLeaveBillTip: 'import OaLeaveBill',
|
||||||
|
leaveId: 'leaveId',
|
||||||
|
username: 'username',
|
||||||
|
days: 'days',
|
||||||
|
content: 'content',
|
||||||
|
state: 'state',
|
||||||
|
leaveTime: 'leaveTime',
|
||||||
|
createTime: 'createTime',
|
||||||
|
updateTime: 'updateTime',
|
||||||
|
delFlag: 'delFlag',
|
||||||
|
tenantId: 'tenantId',
|
||||||
|
inputLeaveIdTip: 'input leaveId',
|
||||||
|
inputUsernameTip: 'input username',
|
||||||
|
inputDaysTip: 'input days',
|
||||||
|
inputContentTip: 'input content',
|
||||||
|
inputStateTip: 'input state',
|
||||||
|
inputLeaveTimeTip: 'input leaveTime',
|
||||||
|
inputCreateTimeTip: 'input createTime',
|
||||||
|
inputUpdateTimeTip: 'input updateTime',
|
||||||
|
inputDelFlagTip: 'input delFlag',
|
||||||
|
inputTenantIdTip: 'input tenantId',
|
||||||
|
}
|
||||||
|
}
|
26
src/views/oa/leave_bill/i18n/zh-cn.ts
Normal file
26
src/views/oa/leave_bill/i18n/zh-cn.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
export default {
|
||||||
|
leave: {
|
||||||
|
index: '序号',
|
||||||
|
importoaLeaveBillTip: '导入请假表',
|
||||||
|
leaveId: '主键',
|
||||||
|
username: '用户名',
|
||||||
|
days: '请假天数',
|
||||||
|
content: '备注',
|
||||||
|
state: '状态',
|
||||||
|
leaveTime: '请假时间',
|
||||||
|
createTime: '创建时间',
|
||||||
|
updateTime: '更新时间',
|
||||||
|
delFlag: '删除标识',
|
||||||
|
tenantId: '所属租户',
|
||||||
|
inputLeaveIdTip: '请输入主键',
|
||||||
|
inputUsernameTip: '请输入用户名',
|
||||||
|
inputDaysTip: '请输入请假天数',
|
||||||
|
inputContentTip: '请输入备注',
|
||||||
|
inputStateTip: '请输入状态',
|
||||||
|
inputLeaveTimeTip: '请输入请假时间',
|
||||||
|
inputCreateTimeTip: '请输入创建时间',
|
||||||
|
inputUpdateTimeTip: '请输入更新时间',
|
||||||
|
inputDelFlagTip: '请输入删除标识',
|
||||||
|
inputTenantIdTip: '请输入所属租户',
|
||||||
|
}
|
||||||
|
}
|
154
src/views/oa/leave_bill/index.vue
Normal file
154
src/views/oa/leave_bill/index.vue
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-padding">
|
||||||
|
<el-card class="layout-padding-auto">
|
||||||
|
<el-row v-show="showSearch" class="mb8">
|
||||||
|
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
|
||||||
|
<el-form-item :label="$t('leave.username')" prop="username">
|
||||||
|
<el-input :placeholder="t('leave.inputUsernameTip')" v-model="state.queryForm.username"
|
||||||
|
style="max-width: 180px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="t('leave.state')" prop="state" class="ml2">
|
||||||
|
<el-select v-model="state.queryForm.state" :placeholder="t('leave.inputStateTip')">
|
||||||
|
<el-option :label="item.label" :value="item.value" v-for="(item, index) in leave_status"
|
||||||
|
:key="index"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item class="ml2">
|
||||||
|
<el-button formDialogRef icon="search" type="primary" @click="getDataList">
|
||||||
|
{{ $t('common.queryBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button icon="Refresh" formDialogRef @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<div class="mb8" style="width: 100%">
|
||||||
|
<el-button formDialogRef icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()">
|
||||||
|
{{ $t('common.addBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button formDialogRef icon="Download" type="primary" class="ml10" @click="exportExcel">
|
||||||
|
{{ $t('common.exportBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button formDialogRef :disabled="multiple" icon="Delete" type="primary" class="ml10"
|
||||||
|
@click="handleDelete(selectObjs)">
|
||||||
|
{{ $t('common.delBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<right-toolbar v-model:showSearch="showSearch" class="ml10" style="float: right;margin-right: 20px"
|
||||||
|
@queryTable="getDataList"></right-toolbar>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
|
||||||
|
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
|
||||||
|
<el-table-column type="selection" width="60" align="center" />
|
||||||
|
<el-table-column type="index" :label="t('leave.index')" width="80" />
|
||||||
|
<el-table-column prop="leaveId" :label="t('leave.leaveId')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="username" :label="t('leave.username')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="days" :label="t('leave.days')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="state" :label="t('leave.state')" show-overflow-tooltip>
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :options="leave_status" :value="scope.row.state"></dict-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="leaveTime" :label="t('leave.leaveTime')" show-overflow-tooltip />
|
||||||
|
<el-table-column :label="$t('common.action')" width="150">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button text type="primary" @click="handleSubmit(scope.row)" v-if="scope.row.state === '0'">提交</el-button>
|
||||||
|
<el-button text type="primary" @click="formDialogRef.openDialog(scope.row.leaveId)">{{ $t('common.editBtn')
|
||||||
|
}}</el-button>
|
||||||
|
<el-button text type="primary" @click="handleDelete([scope.row.leaveId])">{{
|
||||||
|
$t('common.delBtn')
|
||||||
|
}}</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 编辑、新增 -->
|
||||||
|
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="systemOaLeaveBill">
|
||||||
|
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||||
|
import { fetchList, delObj, submit } from "/@/api/oa/leave-bill";
|
||||||
|
import { useMessage, useMessageBox } from "/@/hooks/message";
|
||||||
|
import { useDict } from '/@/hooks/dict';
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
|
// 引入组件
|
||||||
|
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
|
||||||
|
const { t } = useI18n()
|
||||||
|
// 定义查询字典
|
||||||
|
|
||||||
|
const { leave_status } = useDict('leave_status')
|
||||||
|
// 定义变量内容
|
||||||
|
const formDialogRef = ref()
|
||||||
|
// 搜索变量
|
||||||
|
const queryRef = ref()
|
||||||
|
const showSearch = ref(true)
|
||||||
|
// 多选变量
|
||||||
|
const selectObjs = ref([]) as any
|
||||||
|
const multiple = ref(true)
|
||||||
|
|
||||||
|
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||||
|
queryForm: {},
|
||||||
|
pageList: fetchList
|
||||||
|
})
|
||||||
|
|
||||||
|
// table hook
|
||||||
|
const {
|
||||||
|
getDataList,
|
||||||
|
currentChangeHandle,
|
||||||
|
sizeChangeHandle,
|
||||||
|
sortChangeHandle,
|
||||||
|
downBlobFile
|
||||||
|
} = useTable(state)
|
||||||
|
|
||||||
|
// 清空搜索条件
|
||||||
|
const resetQuery = () => {
|
||||||
|
// 清空搜索条件
|
||||||
|
queryRef.value.resetFields()
|
||||||
|
// 清空多选
|
||||||
|
selectObjs.value = []
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出excel
|
||||||
|
const exportExcel = () => {
|
||||||
|
downBlobFile('/admin/leave/export', state.queryForm, 'leave.xlsx')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 多选事件
|
||||||
|
const handleSelectionChange = (objs: any) => {
|
||||||
|
objs.forEach((val: any) => {
|
||||||
|
selectObjs.value.push(val.leaveId)
|
||||||
|
});
|
||||||
|
multiple.value = !objs.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除操作
|
||||||
|
const handleDelete = (ids: string[]) => {
|
||||||
|
useMessageBox().confirm(t('common.delConfirmText'))
|
||||||
|
.then(() => {
|
||||||
|
delObj(ids).then(() => {
|
||||||
|
getDataList(false);
|
||||||
|
useMessage().success(t('common.delSuccessText'));
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSubmit = (row) => {
|
||||||
|
useMessageBox().confirm(t('common.optConfirmText'))
|
||||||
|
.then(() => {
|
||||||
|
submit(row.leaveId).then(() => {
|
||||||
|
getDataList(false);
|
||||||
|
useMessage().success(t('common.optSuccessText'));
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
37
src/views/oa/model/detail.vue
Normal file
37
src/views/oa/model/detail.vue
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-padding">
|
||||||
|
<el-scrollbar class="main">
|
||||||
|
<iframe :src="src" class="iframe" />
|
||||||
|
</el-scrollbar>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="modelView" setup>
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const src = ref('')
|
||||||
|
|
||||||
|
watch([route], () => {
|
||||||
|
init()
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
init()
|
||||||
|
})
|
||||||
|
|
||||||
|
const init = () => {
|
||||||
|
src.value = "/admin/modeler.html?modelId=" + route.query.id
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
.iframe {
|
||||||
|
width: 100%;
|
||||||
|
height: 80vh;
|
||||||
|
border: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
</style>
|
105
src/views/oa/model/form.vue
Normal file
105
src/views/oa/model/form.vue
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog :title="form.id ? $t('common.editBtn') : $t('common.addBtn')" v-model="visible" :close-on-click-modal="false"
|
||||||
|
draggable>
|
||||||
|
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px">
|
||||||
|
<el-row :gutter="35">
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="$t('model.name')" prop="name">
|
||||||
|
<el-input v-model="form.name" :placeholder="$t('model.inputNameTip')" clearable></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="$t('model.key')" prop="key">
|
||||||
|
<el-input v-model="form.key" :placeholder="$t('model.inputKeyTip')" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="$t('model.category')" prop="category">
|
||||||
|
<el-input v-model="form.category" :placeholder="$t('model.inputCategoryTip')" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
|
||||||
|
<el-button type="primary" @click="onSubmit">{{ $t('common.confirmButtonText') }}</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="systemRoleDialog">
|
||||||
|
import { useMessage } from "/@/hooks/message"
|
||||||
|
import { addObj } from "/@/api/oa/model";
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
|
||||||
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
// 定义变量内容
|
||||||
|
const dataFormRef = ref();
|
||||||
|
const visible = ref(false)
|
||||||
|
|
||||||
|
// 提交表单数据
|
||||||
|
const form = reactive({
|
||||||
|
id: '',
|
||||||
|
key: '',
|
||||||
|
name: '',
|
||||||
|
category: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
// 定义校验规则
|
||||||
|
const dataRules = ref(
|
||||||
|
{
|
||||||
|
key: [
|
||||||
|
{ required: true, message: '模型表示不能为空', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
name: [
|
||||||
|
{ required: true, message: '模型名称不能为空', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
category: [
|
||||||
|
{ required: true, message: '模型分类不能为空', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// 打开弹窗
|
||||||
|
const openDialog = (id: string) => {
|
||||||
|
visible.value = true
|
||||||
|
form.id = ''
|
||||||
|
|
||||||
|
// 重置表单数据
|
||||||
|
if (dataFormRef.value) {
|
||||||
|
dataFormRef.value.resetFields()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
form.id = id
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 提交
|
||||||
|
const onSubmit = () => {
|
||||||
|
dataFormRef.value.validate((valid: boolean) => {
|
||||||
|
if (!valid) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
addObj(form).then(() => {
|
||||||
|
useMessage().success(t('common.addSuccessText'))
|
||||||
|
visible.value = false // 关闭弹窗
|
||||||
|
emit('refresh')
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 暴露变量
|
||||||
|
defineExpose({
|
||||||
|
openDialog,
|
||||||
|
});
|
||||||
|
</script>
|
16
src/views/oa/model/i18n/en.ts
Normal file
16
src/views/oa/model/i18n/en.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
export default {
|
||||||
|
model: {
|
||||||
|
index: 'index',
|
||||||
|
id: 'id',
|
||||||
|
name: 'name',
|
||||||
|
key: 'key',
|
||||||
|
category: 'category',
|
||||||
|
version: 'version',
|
||||||
|
createTime: 'createTime',
|
||||||
|
lastUpdateTime: 'lastUpdateTime',
|
||||||
|
inputNameTip: 'input model name',
|
||||||
|
inputModelTip: 'input model name',
|
||||||
|
inputCategoryTip: 'input category tip',
|
||||||
|
inputKeyTip: 'input key',
|
||||||
|
}
|
||||||
|
}
|
16
src/views/oa/model/i18n/zh-cn.ts
Normal file
16
src/views/oa/model/i18n/zh-cn.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
export default {
|
||||||
|
model: {
|
||||||
|
index: '序号',
|
||||||
|
id: '模型ID',
|
||||||
|
name: '模型名称',
|
||||||
|
key: '模型标识',
|
||||||
|
category: '模型分类',
|
||||||
|
version: '版本',
|
||||||
|
createTime: '创建时间',
|
||||||
|
lastUpdateTime: '更新时间',
|
||||||
|
inputNameTip: '请输入模型名称',
|
||||||
|
inputModelTip: '请输入模型名称',
|
||||||
|
inputCategoryTip: '请输入模型分类',
|
||||||
|
inputKeyTip: '请输入模型标识',
|
||||||
|
}
|
||||||
|
}
|
142
src/views/oa/model/index.vue
Normal file
142
src/views/oa/model/index.vue
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-padding">
|
||||||
|
<el-card class="layout-padding-auto" shadow="hover">
|
||||||
|
<el-row class="mb8" shadow="hover" v-show="showSearch">
|
||||||
|
<el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
|
||||||
|
<el-form-item :label="$t('model.category')" prop="category">
|
||||||
|
<el-input :placeholder="$t('model.inputCategoryTip')" style="max-width: 180px"
|
||||||
|
v-model="state.queryForm.category" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item class="ml2">
|
||||||
|
<el-button @click="getDataList" icon="search" type="primary">
|
||||||
|
{{ $t('common.queryBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="resetQuery" icon="Refresh">{{ $t('common.resetBtn') }}</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<div class="mb8" style="width: 100%">
|
||||||
|
<el-button @click="formDialogRef.openDialog()" class="ml10" icon="folder-add" type="primary"
|
||||||
|
v-auth="'app_approle_add'">
|
||||||
|
{{ $t('common.addBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button :disabled="multiple" @click="handleDelete(selectObjs)" class="ml10" icon="Delete"
|
||||||
|
type="primary" v-auth="'app_approle_del'">
|
||||||
|
{{ $t('common.delBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<right-toolbar @queryTable="getDataList" class="ml10" style="float: right;margin-right: 20px"
|
||||||
|
v-model:showSearch="showSearch"></right-toolbar>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
<el-table :data="state.dataList" @selection-change="handleSelectionChange" style="width: 100%"
|
||||||
|
v-loading="state.loading">
|
||||||
|
<el-table-column align="center" type="selection" width="50" />
|
||||||
|
<el-table-column :label="$t('model.index')" type="index" width="80" />
|
||||||
|
<el-table-column :label="$t('model.name')" prop="name" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('model.key')" prop="key" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('model.category')" prop="category" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('model.version')" prop="version" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('model.createTime')" prop="createTime" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('model.lastUpdateTime')" prop="lastUpdateTime"
|
||||||
|
show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('common.action')" width="200">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button @click="handleView(scope.row.id)" text type="primary" v-auth="'app_approle_edit'">模型图
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleDeploy(scope.row.id)" text type="primary" v-auth="'app_approle_edit'">部署
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleDelete([scope.row.roleId])" text type="primary"
|
||||||
|
v-auth="'app_approle_del'">{{
|
||||||
|
$t('common.delBtn')
|
||||||
|
}}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<form-dialog @refresh="getDataList()" ref="formDialogRef" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="model" setup>
|
||||||
|
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||||
|
import { delObj, deploy, fetchList } from "/@/api/oa/model";
|
||||||
|
import { useMessage, useMessageBox } from "/@/hooks/message";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
|
// 引入组件
|
||||||
|
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
|
||||||
|
const { t } = useI18n()
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
|
||||||
|
// 定义变量内容
|
||||||
|
const formDialogRef = ref()
|
||||||
|
const queryRef = ref()
|
||||||
|
const showSearch = ref(true)
|
||||||
|
// 多选rows
|
||||||
|
const selectObjs = ref([]) as any
|
||||||
|
|
||||||
|
// 是否可以多选
|
||||||
|
const multiple = ref(true)
|
||||||
|
|
||||||
|
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||||
|
queryForm: {
|
||||||
|
category: ''
|
||||||
|
},
|
||||||
|
pageList: fetchList // H
|
||||||
|
});
|
||||||
|
|
||||||
|
// table hook
|
||||||
|
const {
|
||||||
|
getDataList,
|
||||||
|
currentChangeHandle,
|
||||||
|
sizeChangeHandle,
|
||||||
|
} = useTable(state)
|
||||||
|
|
||||||
|
// 清空搜索条件
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryRef.value.resetFields()
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 多选事件
|
||||||
|
const handleSelectionChange = (objs: any) => {
|
||||||
|
selectObjs.value = []
|
||||||
|
objs.forEach((val: any) => {
|
||||||
|
selectObjs.value.push(val.roleId)
|
||||||
|
});
|
||||||
|
multiple.value = !objs.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除操作
|
||||||
|
const handleDelete = (ids: string[]) => {
|
||||||
|
useMessageBox().confirm(t('common.delConfirmText'))
|
||||||
|
.then(() => {
|
||||||
|
delObj(ids).then(() => {
|
||||||
|
getDataList();
|
||||||
|
useMessage().success(t('common.delSuccessText'));
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDeploy = (id: string) => {
|
||||||
|
deploy(id).then(() => {
|
||||||
|
useMessage().success(t('common.optSuccessText'));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const handleView = (id: string) => {
|
||||||
|
router.push({
|
||||||
|
path: "/oa/model/detail",
|
||||||
|
query: { id: id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
17
src/views/oa/process/i18n/en.ts
Normal file
17
src/views/oa/process/i18n/en.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
export default {
|
||||||
|
process: {
|
||||||
|
index: 'index',
|
||||||
|
id: 'id',
|
||||||
|
name: 'name',
|
||||||
|
key: 'key',
|
||||||
|
category: 'category',
|
||||||
|
version: 'version',
|
||||||
|
status: 'status',
|
||||||
|
createTime: 'createTime',
|
||||||
|
lastUpdateTime: 'lastUpdateTime',
|
||||||
|
inputNameTip: 'input model name',
|
||||||
|
inputModelTip: 'input model name',
|
||||||
|
inputCategoryTip: 'input category tip',
|
||||||
|
inputKeyTip: 'input key',
|
||||||
|
}
|
||||||
|
}
|
16
src/views/oa/process/i18n/zh-cn.ts
Normal file
16
src/views/oa/process/i18n/zh-cn.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
export default {
|
||||||
|
process: {
|
||||||
|
index: '序号',
|
||||||
|
processonDefinitionId: '模型ID',
|
||||||
|
name: '模型名称',
|
||||||
|
key: '模型标识',
|
||||||
|
category: '模型分类',
|
||||||
|
revision: '版本',
|
||||||
|
status: '状态',
|
||||||
|
deploymentTime: '部署时间',
|
||||||
|
inputNameTip: '请输入模型名称',
|
||||||
|
inputModelTip: '请输入模型名称',
|
||||||
|
inputCategoryTip: '请输入模型分类',
|
||||||
|
inputKeyTip: '请输入模型标识',
|
||||||
|
}
|
||||||
|
}
|
157
src/views/oa/process/index.vue
Normal file
157
src/views/oa/process/index.vue
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-padding">
|
||||||
|
<el-card class="layout-padding-auto" shadow="hover">
|
||||||
|
<el-row class="mb8" shadow="hover" v-show="showSearch">
|
||||||
|
<el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
|
||||||
|
<el-form-item :label="$t('process.category')" prop="category">
|
||||||
|
<el-input :placeholder="$t('process.inputCategoryTip')" style="max-width: 180px"
|
||||||
|
v-model="state.queryForm.category" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item class="ml2">
|
||||||
|
<el-button @click="getDataList" icon="search" type="primary">
|
||||||
|
{{ $t('common.queryBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="resetQuery" icon="Refresh">{{ $t('common.resetBtn') }}</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<div class="mb8" style="width: 100%">
|
||||||
|
<el-button :disabled="multiple" @click="handleDelete(selectObjs)" class="ml10" icon="Delete"
|
||||||
|
type="primary" v-auth="'app_approle_del'">
|
||||||
|
{{ $t('common.delBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<right-toolbar @queryTable="getDataList" class="ml10" style="float: right;margin-right: 20px"
|
||||||
|
v-model:showSearch="showSearch"></right-toolbar>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
<el-table :data="state.dataList" @selection-change="handleSelectionChange" style="width: 100%"
|
||||||
|
v-loading="state.loading">
|
||||||
|
<el-table-column align="center" type="selection" width="50" />
|
||||||
|
<el-table-column :label="$t('process.index')" type="index" width="80" />
|
||||||
|
<el-table-column :label="$t('process.processonDefinitionId')" prop="processonDefinitionId"
|
||||||
|
show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('process.name')" prop="name" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('process.key')" prop="key" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('process.category')" prop="category" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('process.revision')" prop="revision" show-overflow-tooltip></el-table-column>
|
||||||
|
<el-table-column :label="$t('process.status')" prop="suspend" show-overflow-tooltip>
|
||||||
|
<template #default="scope">
|
||||||
|
<span v-if="scope.row.suspend"><el-tag type="danger">挂起</el-tag></span>
|
||||||
|
<span v-else><el-tag>有效</el-tag></span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="$t('process.deploymentTime')" prop="deploymentTime" show-overflow-tooltip>
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ parseTime(scope.row.deploymentTime) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="$t('common.action')" width="200">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button @click="handleView(scope.row)" text type="primary">流程图
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleStatus(scope.row, 'suspend')" text type="primary"
|
||||||
|
v-if="!scope.row.suspend">失效
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleStatus(scope.row, 'active')" text type="primary"
|
||||||
|
v-if="scope.row.suspend">激活
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleDelete([scope.row.roleId])" text type="primary">{{
|
||||||
|
$t('common.delBtn')
|
||||||
|
}}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<el-dialog v-model="showPicDialog" title="流程图">
|
||||||
|
<img :src="actPicUrl" style="width: 100%;">
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="model" setup>
|
||||||
|
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||||
|
import { delObj, fetchList, status } from "/@/api/oa/process";
|
||||||
|
import { useMessage, useMessageBox } from "/@/hooks/message";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
import { parseTime } from "/@/utils/formatTime";
|
||||||
|
|
||||||
|
// 引入组件
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
// 定义变量内容
|
||||||
|
const showPicDialog = ref(false)
|
||||||
|
const queryRef = ref()
|
||||||
|
const showSearch = ref(true)
|
||||||
|
// 多选rows
|
||||||
|
const selectObjs = ref([]) as any
|
||||||
|
// 是否可以多选
|
||||||
|
const multiple = ref(true)
|
||||||
|
// 流程图URL
|
||||||
|
const actPicUrl = ref('')
|
||||||
|
|
||||||
|
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||||
|
queryForm: {
|
||||||
|
category: ''
|
||||||
|
},
|
||||||
|
pageList: fetchList // H
|
||||||
|
});
|
||||||
|
|
||||||
|
// table hook
|
||||||
|
const {
|
||||||
|
getDataList,
|
||||||
|
currentChangeHandle,
|
||||||
|
sizeChangeHandle,
|
||||||
|
} = useTable(state)
|
||||||
|
|
||||||
|
// 清空搜索条件
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryRef.value.resetFields()
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 多选事件
|
||||||
|
const handleSelectionChange = (objs: any) => {
|
||||||
|
selectObjs.value = []
|
||||||
|
objs.forEach((val: any) => {
|
||||||
|
selectObjs.value.push(val.roleId)
|
||||||
|
});
|
||||||
|
multiple.value = !objs.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除操作
|
||||||
|
const handleDelete = (ids: string[]) => {
|
||||||
|
useMessageBox().confirm(t('common.delConfirmText'))
|
||||||
|
.then(() => {
|
||||||
|
delObj(ids).then(() => {
|
||||||
|
getDataList();
|
||||||
|
useMessage().success(t('common.delSuccessText'));
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
//查看流程图
|
||||||
|
const handleView = (row: any) => {
|
||||||
|
actPicUrl.value = `/admin/process/resource/${row.deploymentId}/${row.processonDefinitionId}/image`
|
||||||
|
showPicDialog.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 失效
|
||||||
|
const handleStatus = (row, type) => {
|
||||||
|
useMessageBox().confirm('是否将此流程设置为 ' + type)
|
||||||
|
.then(() => {
|
||||||
|
status(row.processonDefinitionId, type).then(() => {
|
||||||
|
getDataList();
|
||||||
|
useMessage().success(t('common.optSuccessText'));
|
||||||
|
}).catch((err: any) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
74
src/views/oa/task/comment.vue
Normal file
74
src/views/oa/task/comment.vue
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-padding">
|
||||||
|
<el-dialog title="批注列表" v-model="visible" :close-on-click-modal="false" draggable>
|
||||||
|
<el-card class="layout-padding-auto">
|
||||||
|
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
|
||||||
|
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
|
||||||
|
<el-table-column type="selection" width="60" align="center" />
|
||||||
|
<el-table-column type="index" :label="t('comment.index')" width="80" />
|
||||||
|
<el-table-column prop="userId" :label="t('comment.userId')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="fullMessage" :label="t('comment.fullMessage')" show-overflow-tooltip>
|
||||||
|
<template #default="scope">
|
||||||
|
<span v-html="scope.row.fullMessage"></span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="time" :label="t('comment.time')" show-overflow-tooltip />
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="systemTask">
|
||||||
|
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||||
|
import { fetchComment } from "/@/api/oa/task";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
|
// 引入组件
|
||||||
|
const { t } = useI18n()
|
||||||
|
// 搜索变量
|
||||||
|
const visible = ref(false)
|
||||||
|
const taskId = ref('')
|
||||||
|
// 多选变量
|
||||||
|
const selectObjs = ref([]) as any
|
||||||
|
const multiple = ref(true)
|
||||||
|
|
||||||
|
// 定义查询方法
|
||||||
|
const pageList = () => {
|
||||||
|
return fetchComment(taskId.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||||
|
isPage: false,
|
||||||
|
queryForm: {},
|
||||||
|
pageList: pageList
|
||||||
|
})
|
||||||
|
|
||||||
|
// table hook
|
||||||
|
const {
|
||||||
|
getDataList,
|
||||||
|
currentChangeHandle,
|
||||||
|
sizeChangeHandle,
|
||||||
|
sortChangeHandle,
|
||||||
|
} = useTable(state)
|
||||||
|
|
||||||
|
// 多选事件
|
||||||
|
const handleSelectionChange = (objs: any) => {
|
||||||
|
objs.forEach((val: any) => {
|
||||||
|
selectObjs.value.push(val.leaveId)
|
||||||
|
});
|
||||||
|
multiple.value = !objs.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打开弹窗
|
||||||
|
const openDialog = (id: string) => {
|
||||||
|
visible.value = true
|
||||||
|
taskId.value = id
|
||||||
|
getDataList()
|
||||||
|
};
|
||||||
|
|
||||||
|
// 暴露变量
|
||||||
|
defineExpose({
|
||||||
|
openDialog
|
||||||
|
});
|
||||||
|
</script>
|
136
src/views/oa/task/form.vue
Normal file
136
src/views/oa/task/form.vue
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog :title="form.taskId ? $t('common.editBtn') : $t('common.addBtn')" v-model="visible"
|
||||||
|
:close-on-click-modal="false" draggable>
|
||||||
|
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||||
|
<el-row :gutter="24">
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.username')" prop="username">
|
||||||
|
<el-input v-model="form.username" :placeholder="t('leave.inputUsernameTip')" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.days')" prop="days">
|
||||||
|
<el-input-number :min="1" :max="1000" v-model="form.days" :placeholder="t('leave.inputDaysTip')"
|
||||||
|
disabled></el-input-number>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item :label="t('leave.leaveTime')" prop="leaveTime">
|
||||||
|
<el-date-picker type="datetime" :placeholder="t('leave.inputLeaveTimeTip')" v-model="form.leaveTime"
|
||||||
|
:value-format="dateTimeStr" disabled></el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="t('task.content')" prop="content">
|
||||||
|
<div v-html="form.content"></div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
<el-col :span="24" class="mb20">
|
||||||
|
<el-form-item :label="t('task.comment')" prop="comment">
|
||||||
|
<editor v-model:get-html="form.comment" :placeholder="t('task.inputCommentTip')" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button type="primary" v-for="flag in form.flagList" :key="flag"
|
||||||
|
@click="handleTask(flag)">{{ flag }}
|
||||||
|
</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="OaLeaveBillDialog">
|
||||||
|
import { useMessage } from "/@/hooks/message";
|
||||||
|
import { doTask, fetchDetail } from '/@/api/oa/task'
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
import { useUserInfo } from "/@/stores/userInfo";
|
||||||
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
// 定义变量内容
|
||||||
|
const dataFormRef = ref();
|
||||||
|
const visible = ref(false)
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
// 提交表单数据
|
||||||
|
const form = reactive({
|
||||||
|
taskId: '',
|
||||||
|
taskName: '',
|
||||||
|
username: '',
|
||||||
|
comment: '',
|
||||||
|
days: 0,
|
||||||
|
content: '',
|
||||||
|
createTime: '',
|
||||||
|
time: '',
|
||||||
|
flagList: [],
|
||||||
|
taskFlag: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
// 定义校验规则
|
||||||
|
const dataRules = ref({
|
||||||
|
comment: [{ required: true, message: '批注不能为空', trigger: 'blur' }]
|
||||||
|
})
|
||||||
|
|
||||||
|
// 打开弹窗
|
||||||
|
const openDialog = (id: string) => {
|
||||||
|
visible.value = true
|
||||||
|
form.taskId = ''
|
||||||
|
|
||||||
|
// 重置表单数据
|
||||||
|
if (dataFormRef.value) {
|
||||||
|
dataFormRef.value.resetFields()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取oaLeaveBill信息
|
||||||
|
if (id) {
|
||||||
|
form.taskId = id
|
||||||
|
getTaskById(id)
|
||||||
|
} else {
|
||||||
|
form.username = useUserInfo().userInfos.user.username
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 提交
|
||||||
|
const handleTask = (result) => {
|
||||||
|
dataFormRef.value.validate((valid: boolean) => {
|
||||||
|
if (!valid) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
loading.value = true
|
||||||
|
form.taskFlag = result
|
||||||
|
doTask(form).then(() => {
|
||||||
|
useMessage().success(t('common.optSuccessText'))
|
||||||
|
visible.value = false
|
||||||
|
emit('refresh')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化表单数据
|
||||||
|
const getTaskById = (id: string) => {
|
||||||
|
// 获取数据
|
||||||
|
loading.value = true
|
||||||
|
fetchDetail(id).then((res: any) => {
|
||||||
|
Object.assign(form, res.data)
|
||||||
|
form.comment = res.data.comment ? res.data.comment : ''
|
||||||
|
}).catch((err) => {
|
||||||
|
useMessage().error('操作失败')
|
||||||
|
}).finally(() => {
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
// 暴露变量
|
||||||
|
defineExpose({
|
||||||
|
openDialog
|
||||||
|
});
|
||||||
|
</script>
|
18
src/views/oa/task/i18n/en.ts
Normal file
18
src/views/oa/task/i18n/en.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
export default {
|
||||||
|
task: {
|
||||||
|
index: 'index',
|
||||||
|
taskId: 'taskId',
|
||||||
|
taskName: 'taskName',
|
||||||
|
time: 'time',
|
||||||
|
comment: 'comment',
|
||||||
|
content: 'content',
|
||||||
|
inputTaskNameTip: 'input Task Name',
|
||||||
|
inputCommentTip: 'input comment'
|
||||||
|
},
|
||||||
|
comment: {
|
||||||
|
index: 'index',
|
||||||
|
userId: 'userId',
|
||||||
|
fullMessage: 'fullMessage',
|
||||||
|
time: 'time'
|
||||||
|
}
|
||||||
|
}
|
18
src/views/oa/task/i18n/zh-cn.ts
Normal file
18
src/views/oa/task/i18n/zh-cn.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
export default {
|
||||||
|
task: {
|
||||||
|
index: '序号',
|
||||||
|
taskId: 'ID',
|
||||||
|
taskName: '任务名称',
|
||||||
|
time: '提交时间',
|
||||||
|
comment: '批注',
|
||||||
|
content: '事由',
|
||||||
|
inputTaskNameTip: '请输入任务名称',
|
||||||
|
inputCommentTip: '请输入批注名称'
|
||||||
|
},
|
||||||
|
comment: {
|
||||||
|
index: '序号',
|
||||||
|
userId: '用户',
|
||||||
|
fullMessage: '批注',
|
||||||
|
time: '时间'
|
||||||
|
}
|
||||||
|
}
|
131
src/views/oa/task/index.vue
Normal file
131
src/views/oa/task/index.vue
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
<template>
|
||||||
|
<div class="layout-padding">
|
||||||
|
<el-card class="layout-padding-auto">
|
||||||
|
<el-row v-show="showSearch" class="mb8">
|
||||||
|
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
|
||||||
|
<el-form-item :label="$t('task.taskName')" prop="taskName">
|
||||||
|
<el-input :placeholder="t('task.inputTaskNameTip')" v-model="state.queryForm.taskName"
|
||||||
|
style="max-width: 180px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item class="ml2">
|
||||||
|
<el-button formDialogRef icon="search" type="primary" @click="getDataList">
|
||||||
|
{{ $t('common.queryBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button icon="Refresh" formDialogRef @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<div class="mb8" style="width: 100%">
|
||||||
|
<el-button formDialogRef icon="Download" type="primary" class="ml10" @click="exportExcel">
|
||||||
|
{{ $t('common.exportBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button formDialogRef :disabled="multiple" icon="Delete" type="primary" class="ml10"
|
||||||
|
@click="handleDelete(selectObjs)">
|
||||||
|
{{ $t('common.delBtn') }}
|
||||||
|
</el-button>
|
||||||
|
<right-toolbar v-model:showSearch="showSearch" class="ml10" style="float: right;margin-right: 20px"
|
||||||
|
@queryTable="getDataList"></right-toolbar>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
|
||||||
|
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
|
||||||
|
<el-table-column type="selection" width="60" align="center" />
|
||||||
|
<el-table-column type="index" :label="t('task.index')" width="80" />
|
||||||
|
<el-table-column prop="taskId" :label="t('task.taskId')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="taskName" :label="t('task.taskName')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="time" :label="t('task.time')" show-overflow-tooltip />
|
||||||
|
<el-table-column :label="$t('common.action')" width="200">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button text type="primary" @click="handleView(scope.row)">流程图
|
||||||
|
</el-button>
|
||||||
|
<el-button text type="primary" @click="formDialogRef.openDialog(scope.row.taskId)">审批
|
||||||
|
</el-button>
|
||||||
|
<el-button text type="primary" @click="commentDialogRef.openDialog(scope.row.taskId)">批注
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 编辑、新增 -->
|
||||||
|
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||||
|
<comment-dialog ref="commentDialogRef" @refresh="getDataList(false)" />
|
||||||
|
|
||||||
|
<el-dialog v-model="showPicDialog" title="流程图">
|
||||||
|
<img :src="actPicUrl" style="width: 100%;">
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="systemTask">
|
||||||
|
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||||
|
import { fetchList } from "/@/api/oa/task";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
|
// 引入组件
|
||||||
|
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
|
||||||
|
const CommentDialog = defineAsyncComponent(() => import('./comment.vue'));
|
||||||
|
const { t } = useI18n()
|
||||||
|
// 定义查询字典
|
||||||
|
const formDialogRef = ref()
|
||||||
|
const commentDialogRef = ref()
|
||||||
|
// 搜索变量
|
||||||
|
const queryRef = ref()
|
||||||
|
const showSearch = ref(true)
|
||||||
|
// 多选变量
|
||||||
|
const selectObjs = ref([]) as any
|
||||||
|
const multiple = ref(true)
|
||||||
|
// 流程图URL
|
||||||
|
const actPicUrl = ref('')
|
||||||
|
// 定义变量内容
|
||||||
|
const showPicDialog = ref(false)
|
||||||
|
|
||||||
|
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||||
|
queryForm: {},
|
||||||
|
pageList: fetchList
|
||||||
|
})
|
||||||
|
|
||||||
|
// table hook
|
||||||
|
const {
|
||||||
|
getDataList,
|
||||||
|
currentChangeHandle,
|
||||||
|
sizeChangeHandle,
|
||||||
|
sortChangeHandle,
|
||||||
|
downBlobFile
|
||||||
|
} = useTable(state)
|
||||||
|
|
||||||
|
// 清空搜索条件
|
||||||
|
const resetQuery = () => {
|
||||||
|
// 清空搜索条件
|
||||||
|
queryRef.value.resetFields()
|
||||||
|
// 清空多选
|
||||||
|
selectObjs.value = []
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出excel
|
||||||
|
const exportExcel = () => {
|
||||||
|
downBlobFile('/admin/task/export', state.queryForm, 'task.xlsx')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 多选事件
|
||||||
|
const handleSelectionChange = (objs: any) => {
|
||||||
|
objs.forEach((val: any) => {
|
||||||
|
selectObjs.value.push(val.leaveId)
|
||||||
|
});
|
||||||
|
multiple.value = !objs.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除操作
|
||||||
|
const handleDelete = (ids: string[]) => {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//查看流程图
|
||||||
|
const handleView = (row: any) => {
|
||||||
|
actPicUrl.value = `/admin/task/view/${row.taskId}`
|
||||||
|
showPicDialog.value = true
|
||||||
|
}
|
||||||
|
</script>
|
@ -186,8 +186,6 @@ const passwordRuleForm = reactive({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 头像上传成功
|
// 头像上传成功
|
||||||
const handleAvatarSuccess = (url: any) => {
|
const handleAvatarSuccess = (url: any) => {
|
||||||
formData.avatar = url;
|
formData.avatar = url;
|
||||||
|
Loading…
Reference in New Issue
Block a user