qsh 2 weeks ago
parent f93e1f7187
commit f2f14789f0
  1. 58
      src/router/modules/remaining.ts
  2. 9
      src/views/Basic/Dept/DeptForm.vue
  3. 13
      src/views/Basic/User/UserForm.vue
  4. 37
      src/views/Basic/User/index.vue
  5. 5
      src/views/OKR/Management/Components/AllTarget.vue
  6. 6
      src/views/OKR/Management/Components/DialogOkr.vue
  7. 24
      src/views/OKR/Management/Components/DialogOkrInfo.vue
  8. 4
      src/views/OKR/Management/Components/MyDuty.vue
  9. 42
      src/views/OKR/Management/Components/MySon.vue
  10. 4
      src/views/OKR/Management/Components/ObjectList.vue

@ -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>

Loading…
Cancel
Save