sc
This commit is contained in:
@@ -106,41 +106,29 @@ const remainingRouter: AppRouteRecordRaw[] = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
path: '/Basic',
|
// path: '/Basic',
|
||||||
component: Layout,
|
// component: Layout,
|
||||||
name: 'Basic',
|
// name: 'Basic',
|
||||||
meta: {
|
// meta: {
|
||||||
title: '菜单管理'
|
// title: '菜单管理'
|
||||||
},
|
// },
|
||||||
redirect: '/Basic/menu',
|
// redirect: '/Basic/menu',
|
||||||
children: [
|
// children: [
|
||||||
{
|
// {
|
||||||
path: 'menu',
|
// path: 'menu',
|
||||||
component: () => import('@/views/Basic/Menu/index.vue'),
|
// component: () => import('@/views/Basic/Menu/index.vue'),
|
||||||
name: 'Menu',
|
// name: 'Menu',
|
||||||
meta: {
|
// meta: {
|
||||||
canTo: true,
|
// canTo: true,
|
||||||
// hidden: true,
|
// // hidden: true,
|
||||||
noTagsView: false,
|
// noTagsView: false,
|
||||||
icon: 'ep:user',
|
// icon: 'ep:user',
|
||||||
title: '菜单管理'
|
// title: '菜单管理'
|
||||||
}
|
// }
|
||||||
},
|
// }
|
||||||
{
|
// ]
|
||||||
path: 'okr',
|
// },
|
||||||
component: () => import('@/views/OKR/Management/index.vue'),
|
|
||||||
name: 'OkrManagement',
|
|
||||||
meta: {
|
|
||||||
canTo: true,
|
|
||||||
// hidden: true,
|
|
||||||
noTagsView: false,
|
|
||||||
icon: 'ep:user',
|
|
||||||
title: 'Okr管理'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: '/login',
|
path: '/login',
|
||||||
component: () => import('@/views/Login/Login.vue'),
|
component: () => import('@/views/Login/Login.vue'),
|
||||||
|
|||||||
@@ -30,7 +30,12 @@
|
|||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="12" :offset="0">
|
<el-col :span="12" :offset="0">
|
||||||
<el-form-item label="负责人" prop="leaderUserId">
|
<el-form-item label="负责人" prop="leaderUserId">
|
||||||
<el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
|
<el-select
|
||||||
|
v-model="formData.leaderUserId"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="请输入负责人"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in employeeOptions"
|
v-for="item in employeeOptions"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
@@ -192,7 +197,7 @@ const resetForm = () => {
|
|||||||
/** 获得部门树 */
|
/** 获得部门树 */
|
||||||
const getTree = async () => {
|
const getTree = async () => {
|
||||||
deptTree.value = []
|
deptTree.value = []
|
||||||
const data = await DeptApi.getSimpleDeptList()
|
const data = await DeptApi.getSimpleDeptList({ allFlag: false })
|
||||||
let dept: Tree = { id: 0, name: '顶级部门', children: [] }
|
let dept: Tree = { id: 0, name: '顶级部门', children: [] }
|
||||||
dept.children = handleTree(data)
|
dept.children = handleTree(data)
|
||||||
deptTree.value.push(dept)
|
deptTree.value.push(dept)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<el-input v-model="formData.nickname" placeholder="请输入用户姓名" />
|
<el-input v-model="formData.nickname" placeholder="请输入用户姓名" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<!-- <el-col :span="12">
|
||||||
<el-form-item label="用户性别">
|
<el-form-item label="用户性别">
|
||||||
<el-radio-group v-model="formData.sex">
|
<el-radio-group v-model="formData.sex">
|
||||||
<el-radio :value="1"> 男 </el-radio>
|
<el-radio :value="1"> 男 </el-radio>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
placeholder="请选择归属部门"
|
placeholder="请选择归属部门"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col> -->
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="角色" prop="role">
|
<el-form-item label="角色" prop="role">
|
||||||
<el-select
|
<el-select
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="20">
|
<!-- <el-row :gutter="20">
|
||||||
<el-col :span="12" :offset="0">
|
<el-col :span="12" :offset="0">
|
||||||
<el-form-item label="入职日期" prop="hireDate">
|
<el-form-item label="入职日期" prop="hireDate">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row> -->
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="备注">
|
<el-form-item label="备注">
|
||||||
@@ -113,7 +113,8 @@
|
|||||||
</template>
|
</template>
|
||||||
<script lang="ts" name="SystemUserForm" setup>
|
<script lang="ts" name="SystemUserForm" setup>
|
||||||
import { CommonStatusEnum } from '@/utils/constants'
|
import { CommonStatusEnum } from '@/utils/constants'
|
||||||
import { defaultProps, handleTree } from '@/utils/tree'
|
// import { defaultProps, handleTree } from '@/utils/tree'
|
||||||
|
import { handleTree } from '@/utils/tree'
|
||||||
import { formatDate } from '@/utils/formatTime'
|
import { formatDate } from '@/utils/formatTime'
|
||||||
|
|
||||||
import * as RoleApi from '@/api/system/role'
|
import * as RoleApi from '@/api/system/role'
|
||||||
@@ -174,7 +175,7 @@ const open = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 加载部门树
|
// 加载部门树
|
||||||
deptList.value = handleTree(await DeptApi.getSimpleDeptList({ allFlag: true }))
|
deptList.value = handleTree(await DeptApi.getSimpleDeptList({ allFlag: false }))
|
||||||
// 加载岗位列表
|
// 加载岗位列表
|
||||||
roleOptions.value = await RoleApi.getSimpleRoleList()
|
roleOptions.value = await RoleApi.getSimpleRoleList()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-row :gutter="20">
|
<!-- <el-row :gutter="20"> -->
|
||||||
<!-- 左侧部门树 -->
|
<!-- 左侧部门树 -->
|
||||||
<el-col :span="4" :xs="24">
|
<!-- <el-col :span="4" :xs="24">
|
||||||
<DeptTree @node-click="handleDeptNodeClick" />
|
<DeptTree @node-click="handleDeptNodeClick" />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="20" :xs="24">
|
<el-col :span="20" :xs="24"> -->
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<el-form :model="queryParams" ref="queryFormRef" inline label-width="68px">
|
<el-form :model="queryParams" ref="queryFormRef" inline label-width="0">
|
||||||
<el-form-item label="姓名" prop="nickname">
|
<el-form-item prop="nickname">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.nickname"
|
v-model="queryParams.nickname"
|
||||||
placeholder="请输入姓名"
|
placeholder="请输入姓名"
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="手机号码" prop="mobile">
|
<el-form-item prop="mobile">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.mobile"
|
v-model="queryParams.mobile"
|
||||||
placeholder="请输入手机号码"
|
placeholder="请输入手机号码"
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<el-table-column label="用户编号" key="id" prop="id" />
|
<el-table-column label="用户编号" key="id" prop="id" />
|
||||||
<el-table-column label="登录账号" prop="username" />
|
<el-table-column label="登录账号" prop="username" />
|
||||||
<el-table-column label="用户姓名" prop="nickname" />
|
<el-table-column label="用户姓名" prop="nickname" />
|
||||||
<el-table-column label="部门" key="deptName" prop="deptName" />
|
<!-- <el-table-column label="部门" key="deptName" prop="deptName" /> -->
|
||||||
<el-table-column label="手机号码" prop="mobile" width="120" />
|
<el-table-column label="手机号码" prop="mobile" width="120" />
|
||||||
<el-table-column label="状态" key="status">
|
<el-table-column label="状态" key="status">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -57,12 +57,7 @@
|
|||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column label="创建时间" prop="createTime" width="180" :formatter="dateFormatter" />
|
||||||
label="创建时间"
|
|
||||||
prop="createTime"
|
|
||||||
width="180"
|
|
||||||
:formatter="dateFormatter"
|
|
||||||
/>
|
|
||||||
<el-table-column label="操作" width="260">
|
<el-table-column label="操作" width="260">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
@@ -98,8 +93,8 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</el-col>
|
<!-- </el-col> -->
|
||||||
</el-row>
|
<!-- </el-row> -->
|
||||||
|
|
||||||
<!-- 添加或修改用户对话框 -->
|
<!-- 添加或修改用户对话框 -->
|
||||||
<UserForm ref="formRef" @success="getList" />
|
<UserForm ref="formRef" @success="getList" />
|
||||||
@@ -109,7 +104,7 @@ import { CommonStatusEnum } from '@/utils/constants'
|
|||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import * as UserApi from '@/api/system/user'
|
import * as UserApi from '@/api/system/user'
|
||||||
import UserForm from './UserForm.vue'
|
import UserForm from './UserForm.vue'
|
||||||
import DeptTree from './DeptTree.vue'
|
// import DeptTree from './DeptTree.vue'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
@@ -150,11 +145,11 @@ const resetQuery = () => {
|
|||||||
handleQuery()
|
handleQuery()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 处理部门被点击 */
|
// /** 处理部门被点击 */
|
||||||
const handleDeptNodeClick = async (row) => {
|
// const handleDeptNodeClick = async (row) => {
|
||||||
queryParams.deptId = row.id
|
// queryParams.deptId = row.id
|
||||||
await getList()
|
// await getList()
|
||||||
}
|
// }
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const formRef = ref()
|
const formRef = ref()
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ function nodeChange(nodeId) {
|
|||||||
const currentNode = findNode(peroidList.value, (node) => {
|
const currentNode = findNode(peroidList.value, (node) => {
|
||||||
return node.nodeId == nodeId
|
return node.nodeId == nodeId
|
||||||
})
|
})
|
||||||
|
searchForm.value.creatorId = currentNode.creatorId
|
||||||
if (!currentNode.children || currentNode.children.length == 0) {
|
if (!currentNode.children || currentNode.children.length == 0) {
|
||||||
isCurrentLeafNode.value = true
|
isCurrentLeafNode.value = true
|
||||||
} else {
|
} else {
|
||||||
@@ -108,9 +109,9 @@ function handleAddNode() {
|
|||||||
dialogOkrInfo.value.open('create', null)
|
dialogOkrInfo.value.open('create', null)
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleEditOkr() {
|
function handleEditOkr(nodeId = undefined) {
|
||||||
dialogOkr.value.close()
|
dialogOkr.value.close()
|
||||||
dialogOkrInfo.value.open('update', searchForm.value.nodeId, 2)
|
dialogOkrInfo.value.open('update', nodeId || searchForm.value.nodeId, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleUpdateProcess() {
|
function handleUpdateProcess() {
|
||||||
|
|||||||
@@ -38,7 +38,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<el-button v-if="nodeInfo.creatorId == currentUserId" link @click="emit('edit')">
|
<el-button
|
||||||
|
v-if="nodeInfo.creatorId == currentUserId"
|
||||||
|
link
|
||||||
|
@click="emit('edit', nodeInfo.nodeId)"
|
||||||
|
>
|
||||||
<el-tooltip content="编辑" placement="top" effect="dark">
|
<el-tooltip content="编辑" placement="top" effect="dark">
|
||||||
<Icon icon="ep:edit" :size="16" />
|
<Icon icon="ep:edit" :size="16" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ function removeKR(oIdx, krIdx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addChildNode() {
|
function addChildNode() {
|
||||||
childNodeList.value.push({})
|
childNodeList.value.push({ dataScope: 1 })
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeChildNode(idx) {
|
function removeChildNode(idx) {
|
||||||
@@ -512,9 +512,31 @@ async function handleSave() {
|
|||||||
if (!formRef.value) return
|
if (!formRef.value) return
|
||||||
const valid = await formRef.value.validate()
|
const valid = await formRef.value.validate()
|
||||||
if (!valid) return
|
if (!valid) return
|
||||||
|
|
||||||
|
if (form.value.executor.length > 1) {
|
||||||
|
message
|
||||||
|
.confirm('是否按照当前节点所选的多个执行人自动新增对应的员工节点?', {
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
confirmButtonText: '确定'
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
saveOkrData(true)
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
saveOkrData(false)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
saveOkrData(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveOkrData(isAutoAddChild = false) {
|
||||||
// 提交请求
|
// 提交请求
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
|
form.value.isAutoAddChild = isAutoAddChild
|
||||||
form.value.objectives = objectList.value
|
form.value.objectives = objectList.value
|
||||||
form.value.children = childNodeList.value
|
form.value.children = childNodeList.value
|
||||||
if (formType.value === 'create') {
|
if (formType.value === 'create') {
|
||||||
|
|||||||
@@ -77,9 +77,9 @@ const dialogOkrInfo = ref(null)
|
|||||||
// dialogOkrInfo.value.open('create', null)
|
// dialogOkrInfo.value.open('create', null)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
function handleEditOkr() {
|
function handleEditOkr(nodeId = undefined) {
|
||||||
dialogOkr.value.close()
|
dialogOkr.value.close()
|
||||||
dialogOkrInfo.value.open('update', 1, 1)
|
dialogOkrInfo.value.open('update', nodeId || searchForm.value.nodeId, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleUpdateProcess() {
|
function handleUpdateProcess() {
|
||||||
|
|||||||
@@ -9,23 +9,33 @@
|
|||||||
:render-after-expand="false"
|
:render-after-expand="false"
|
||||||
:default-expand-all="false"
|
:default-expand-all="false"
|
||||||
style="width: 400px"
|
style="width: 400px"
|
||||||
@change="getOkrList"
|
@change="nodeChange"
|
||||||
/>
|
/>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-button type="info" @click="handleShowOkr(searchForm.nodeId)"> 节点详情 </el-button>
|
<el-button type="info" @click="handleShowOkr(searchForm.nodeId)"> 节点详情 </el-button>
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
v-if="currentUserId == searchForm.creatorId"
|
||||||
|
@click="handleEditOkr(searchForm.nodeId)"
|
||||||
|
>
|
||||||
|
修改当前节点
|
||||||
|
</el-button>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<OkrTable ref="okrTableRef" canEdit />
|
<OkrTable ref="okrTableRef" canEdit />
|
||||||
<DialogOkr ref="dialogOkr" @edit="handleEditOkr" />
|
<DialogOkr ref="dialogOkr" @edit="handleEditOkr" />
|
||||||
|
<DialogOkrInfo ref="dialogOkrInfo" @success="handleSearchPeroid" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="MyDuty">
|
<script setup name="MySon">
|
||||||
import OkrTable from './OkrTable.vue'
|
import OkrTable from './OkrTable.vue'
|
||||||
import DialogOkr from './DialogOkr.vue'
|
import DialogOkr from './DialogOkr.vue'
|
||||||
import { listToTree } from '@/utils/tree'
|
import DialogOkrInfo from './DialogOkrInfo.vue'
|
||||||
|
import { listToTree, findNode } from '@/utils/tree'
|
||||||
|
import { useUserStore } from '@/store/modules/user'
|
||||||
|
|
||||||
import { getMySonNodeTree, getMySonOkrPage } from '@/api/okr/okr'
|
import { getMySonNodeTree, getMySonOkrPage } from '@/api/okr/okr'
|
||||||
|
|
||||||
@@ -42,6 +52,9 @@ const defaultProps = {
|
|||||||
children: 'children'
|
children: 'children'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
const currentUserId = userStore.getUser.id
|
||||||
|
|
||||||
const okrTableRef = ref(null)
|
const okrTableRef = ref(null)
|
||||||
const searchForm = ref({
|
const searchForm = ref({
|
||||||
nodeId: undefined
|
nodeId: undefined
|
||||||
@@ -58,8 +71,7 @@ function handleSearchPeroid() {
|
|||||||
pid: 'parentId',
|
pid: 'parentId',
|
||||||
children: 'children'
|
children: 'children'
|
||||||
})
|
})
|
||||||
searchForm.value.nodeId = resp.nodeId
|
nodeChange(resp.nodeId)
|
||||||
getOkrList()
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,21 +80,35 @@ function getOkrList() {
|
|||||||
...searchForm.value,
|
...searchForm.value,
|
||||||
userId: props.userId
|
userId: props.userId
|
||||||
}).then((resp) => {
|
}).then((resp) => {
|
||||||
const list = resp
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
okrTableRef.value.prepareData(list)
|
okrTableRef.value.prepareData(resp)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function nodeChange(nodeId) {
|
||||||
|
searchForm.value.nodeId = nodeId
|
||||||
|
getOkrList()
|
||||||
|
const currentNode = findNode(peroidList.value, (node) => {
|
||||||
|
return node.nodeId == nodeId
|
||||||
|
})
|
||||||
|
searchForm.value.creatorId = currentNode.creatorId
|
||||||
|
}
|
||||||
|
|
||||||
const dialogOkr = ref(null)
|
const dialogOkr = ref(null)
|
||||||
function handleShowOkr(id) {
|
function handleShowOkr(id) {
|
||||||
dialogOkr.value.open({
|
dialogOkr.value.open({
|
||||||
nodeId: id,
|
nodeId: id,
|
||||||
canEdit: true,
|
canEdit: true,
|
||||||
queryType: 1
|
queryType: 2
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dialogOkrInfo = ref(null)
|
||||||
|
function handleEditOkr(nodeId = undefined) {
|
||||||
|
dialogOkr.value.close()
|
||||||
|
dialogOkrInfo.value.open('update', nodeId || searchForm.value.nodeId, 2)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -189,9 +189,9 @@ function handleAddNode() {
|
|||||||
dialogOkrInfo.value.open('create', null)
|
dialogOkrInfo.value.open('create', null)
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleEditOkr() {
|
function handleEditOkr(nodeId = undefined) {
|
||||||
dialogOkr.value.close()
|
dialogOkr.value.close()
|
||||||
dialogOkrInfo.value.open('update', 1)
|
dialogOkrInfo.value.open('update', nodeId || searchForm.value.nodeId, 2)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user