diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4e71344 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "i18n-ally.localesPaths": [ + "src/locales" + ] +} \ No newline at end of file diff --git a/src/api/okr/okr.js b/src/api/okr/okr.js index 0289278..09edcd4 100644 --- a/src/api/okr/okr.js +++ b/src/api/okr/okr.js @@ -20,10 +20,10 @@ export const updateOkrNode = (data) => { } // 查询详情 -export const getOkrNodeDetail = (nodeId) => { +export const getOkrNodeDetail = (params) => { return request.get({ url: '/admin-api/okr/node/get', - params: { nodeId } + params // headers: { 'instance-id': 1016 } }) } @@ -108,3 +108,38 @@ export const getOkrRelationTreeChildren = (params) => { // headers: { 'instance-id': 1016 } }) } + +// 获取我的组员 +export const getMyMemberList = (params) => { + return request.get({ + url: '/admin-api/okr/node/my-members', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取我的组员节点树 +export const getMySonNodeTree = (params) => { + return request.get({ + url: '/admin-api/okr/node/member/node/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取我的组员OKR列表 +export const getMySonOkrPage = (params) => { + return request.get({ + url: '/admin-api/okr/node/member/objective/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取渠道 +export const getChannelOptions = () => { + return request.get({ + url: '/admin-api/okr/node/source' + // headers: { 'instance-id': 1016 } + }) +} diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts index 070d46b..0c342fe 100644 --- a/src/api/system/dept/index.ts +++ b/src/api/system/dept/index.ts @@ -13,8 +13,8 @@ export interface DeptVO { } // 查询部门(精简)列表 -export const getSimpleDeptList = async (): Promise => { - return await request.get({ url: '/admin-api/system/dept/list-all-simple' }) +export const getSimpleDeptList = async (params: any): Promise => { + return await request.get({ url: '/admin-api/system/dept/list-all-simple', params }) } // 查询部门列表 diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 0b546ef..b563980 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -106,41 +106,29 @@ const remainingRouter: AppRouteRecordRaw[] = [ } ] }, - { - path: '/Basic', - component: Layout, - name: 'Basic', - meta: { - title: '菜单管理' - }, - redirect: '/Basic/menu', - children: [ - { - path: 'menu', - component: () => import('@/views/Basic/Menu/index.vue'), - name: 'Menu', - meta: { - canTo: true, - // hidden: true, - noTagsView: false, - icon: 'ep:user', - 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: '/Basic', + // component: Layout, + // name: 'Basic', + // meta: { + // title: '菜单管理' + // }, + // redirect: '/Basic/menu', + // children: [ + // { + // path: 'menu', + // component: () => import('@/views/Basic/Menu/index.vue'), + // name: 'Menu', + // meta: { + // canTo: true, + // // hidden: true, + // noTagsView: false, + // icon: 'ep:user', + // title: '菜单管理' + // } + // } + // ] + // }, { path: '/login', component: () => import('@/views/Login/Login.vue'), diff --git a/src/views/Basic/Dept/DeptForm.vue b/src/views/Basic/Dept/DeptForm.vue index 4ad68e1..d135ccf 100644 --- a/src/views/Basic/Dept/DeptForm.vue +++ b/src/views/Basic/Dept/DeptForm.vue @@ -30,7 +30,12 @@ - + + + + + + + + @@ -76,6 +99,7 @@ import { defaultProps, handleTree } from '@/utils/tree' import * as DeptApi from '@/api/system/dept' import { getEmployeeSimpleList } from '@/api/pers/employee' import { CommonStatusEnum } from '@/utils/constants' +import { getSimpleAppList } from '@/api/system/app' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 @@ -84,15 +108,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示 const dialogTitle = ref('') // 弹窗的标题 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formType = ref('') // 表单的类型:create - 新增;update - 修改 -const formData = ref({ - id: undefined, - parentId: undefined, - name: undefined, - sort: 1, - leaderUserId: undefined, - status: CommonStatusEnum.ENABLE, - remark: undefined -}) +const formData = ref({}) const formRules = reactive({ parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }], name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }], @@ -106,6 +122,7 @@ const formRules = reactive({ const formRef = ref() // 表单 Ref const deptTree = ref() // 树形结构 const employeeOptions = ref([]) // 用户列表 +const instanceIdOptions = ref([]) // 实例ids /** 打开弹窗 */ const open = async (type: string, id?: number) => { @@ -118,6 +135,7 @@ const open = async (type: string, id?: number) => { formLoading.value = true try { formData.value = await DeptApi.getDept(id) + formData.value.remark = formData.value.remark || '' } finally { formLoading.value = false } @@ -126,6 +144,10 @@ const open = async (type: string, id?: number) => { getEmployeeSimpleList().then((data) => { employeeOptions.value = data }) + //实例 + getSimpleAppList().then((data) => { + instanceIdOptions.value = data + }) // 获得部门树 await getTree() } @@ -166,7 +188,8 @@ const resetForm = () => { sort: 1, leaderUserId: undefined, status: CommonStatusEnum.ENABLE, - remark: undefined + remark: undefined, + instanceId: undefined } formRef.value?.resetFields() } @@ -174,7 +197,7 @@ const resetForm = () => { /** 获得部门树 */ const getTree = async () => { deptTree.value = [] - const data = await DeptApi.getSimpleDeptList() + const data = await DeptApi.getSimpleDeptList({ allFlag: false }) let dept: Tree = { id: 0, name: '顶级部门', children: [] } dept.children = handleTree(data) deptTree.value.push(dept) diff --git a/src/views/Basic/Dept/index.vue b/src/views/Basic/Dept/index.vue index dbcae05..aa43a28 100644 --- a/src/views/Basic/Dept/index.vue +++ b/src/views/Basic/Dept/index.vue @@ -22,7 +22,7 @@ - + diff --git a/src/views/OKR/Management/Components/DialogOkr.vue b/src/views/OKR/Management/Components/DialogOkr.vue index 599d323..59d92ae 100644 --- a/src/views/OKR/Management/Components/DialogOkr.vue +++ b/src/views/OKR/Management/Components/DialogOkr.vue @@ -18,11 +18,31 @@ ork落地
【节点】 - {{ nodeInfo.allNodeName }} + + + {{ item.nodeName }} + + -> +
- + @@ -319,9 +339,19 @@ import { useUserStore } from '@/store/modules/user' const message = useMessage() const userStore = useUserStore() const currentUserId = userStore.getUser.id -const emit = defineEmits(['edit']) +const emit = defineEmits(['edit', 'close']) const show = ref(false) + +watch( + () => show.value, + (newValue, oldValue) => { + if (oldValue && !newValue) { + emit('close', nodeInfo.value) + } + } +) + const canEdit = ref(false) const toolbarConfig = { @@ -351,9 +381,11 @@ const nodeInfo = ref({}) const nodeRecords = ref([]) const commentTypeOptions = ref([]) +const queryType = ref(1) function open(curNode) { canEdit.value = curNode.canEdit nodeInfo.value.nodeId = curNode.nodeId + queryType.value = curNode.queryType // 获取数据详情 searchInfo(curNode) show.value = true @@ -363,13 +395,12 @@ const employeeOptions = ref([]) function searchInfo(curNode) { try { - getOkrNodeDetail(curNode.nodeId).then((resp) => { + getOkrNodeDetail({ nodeId: curNode.nodeId, queryType: queryType.value }).then((resp) => { nodeInfo.value = { ...resp, executor: resp.executor || [] } - canEdit.value = - canEdit.value && currentUserId == nodeInfo.value.executor.includes(currentUserId) + canEdit.value = canEdit.value && nodeInfo.value.executor.includes(currentUserId + '') if (resp.objectives) { okrList.value = resp.objectives.map((item) => ({ ...item, @@ -414,7 +445,7 @@ function handleMention(item) { function handleSaveProcess() { okrTableRef.value.updateProcess(nodeInfo.value.nodeId).then(() => { message.success('更新成功') - searchInfo() + searchInfo({ nodeId: nodeInfo.value.nodeId }) }) } diff --git a/src/views/OKR/Management/Components/DialogOkrInfo.vue b/src/views/OKR/Management/Components/DialogOkrInfo.vue index 1e791e5..22cc15d 100644 --- a/src/views/OKR/Management/Components/DialogOkrInfo.vue +++ b/src/views/OKR/Management/Components/DialogOkrInfo.vue @@ -332,7 +332,8 @@ import { createOkrNode, updateOkrNode, getAllOkrPage, - getDefaultOkrOptions + getDefaultOkrOptions, + getChannelOptions } from '@/api/okr/okr' import { listToTree } from '@/utils/tree' import { getEmployeeSimpleList } from '@/api/pers/employee' @@ -378,7 +379,7 @@ const defaultProps = { } const sourceOptions = ref([]) const objectList = ref([]) -function open(type, val) { +function open(type, val, queryType) { show.value = true title.value = type == 'update' ? '修改Okr' : '新增Okr' formType.value = type @@ -396,10 +397,20 @@ function open(type, val) { getDefaultOkrOptions().then((resp) => { krOptions.value = resp }) + getChannelOptions().then((resp) => { + sourceOptions.value = listToTree(resp, { + id: 'sourceId', + pid: 'parentId', + children: 'children' + }) + }) if (val) { formLoading.value = true try { - getOkrNodeDetail(val).then((resp) => { + getOkrNodeDetail({ + nodeId: val, + queryType + }).then((resp) => { form.value = resp if (resp.objectives) { objectList.value = resp.objectives.map((item) => ({ @@ -468,7 +479,7 @@ function removeKR(oIdx, krIdx) { } function addChildNode() { - childNodeList.value.push({}) + childNodeList.value.push({ dataScope: 1 }) } function removeChildNode(idx) { @@ -509,9 +520,31 @@ async function handleSave() { if (!formRef.value) return const valid = await formRef.value.validate() 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 try { + form.value.isAutoAddChild = isAutoAddChild form.value.objectives = objectList.value form.value.children = childNodeList.value if (formType.value === 'create') { diff --git a/src/views/OKR/Management/Components/MyDuty.vue b/src/views/OKR/Management/Components/MyDuty.vue index afa1215..a202e96 100644 --- a/src/views/OKR/Management/Components/MyDuty.vue +++ b/src/views/OKR/Management/Components/MyDuty.vue @@ -77,9 +77,9 @@ const dialogOkrInfo = ref(null) // dialogOkrInfo.value.open('create', null) // } -function handleEditOkr() { +function handleEditOkr(nodeId = undefined) { dialogOkr.value.close() - dialogOkrInfo.value.open('update', 1) + dialogOkrInfo.value.open('update', nodeId || searchForm.value.nodeId, 1) } function handleUpdateProcess() { @@ -93,7 +93,8 @@ const dialogOkr = ref(null) function handleShowOkr(id) { dialogOkr.value.open({ nodeId: id, - canEdit: true + canEdit: true, + queryType: 1 }) } diff --git a/src/views/OKR/Management/Components/MySon.vue b/src/views/OKR/Management/Components/MySon.vue new file mode 100644 index 0000000..88934b5 --- /dev/null +++ b/src/views/OKR/Management/Components/MySon.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/views/OKR/Management/Components/ObjectList.vue b/src/views/OKR/Management/Components/ObjectList.vue index 04991b0..61e1c9a 100644 --- a/src/views/OKR/Management/Components/ObjectList.vue +++ b/src/views/OKR/Management/Components/ObjectList.vue @@ -178,6 +178,7 @@ function openOkr() { clickNode.value && dialogOkr.value.open({ nodeId: clickNode.value.nodeId, + queryType: 2, canEdit: !clickNode.value.children || clickNode.value.children.length == 0 }) } @@ -188,9 +189,9 @@ function handleAddNode() { dialogOkrInfo.value.open('create', null) } -function handleEditOkr() { +function handleEditOkr(nodeId = undefined) { dialogOkr.value.close() - dialogOkrInfo.value.open('update', 1) + dialogOkrInfo.value.open('update', nodeId || searchForm.value.nodeId, 2) } diff --git a/src/views/OKR/Management/Components/WaitTarget.vue b/src/views/OKR/Management/Components/WaitTarget.vue index 1d0c5e0..f012c1d 100644 --- a/src/views/OKR/Management/Components/WaitTarget.vue +++ b/src/views/OKR/Management/Components/WaitTarget.vue @@ -275,10 +275,8 @@ function handleDelete(row) { } function handleNotice(row) { - console.log(row) - message.confirm('即将发送微信通知提醒执行人,是否继续?').then(() => { - urgeWait({ workId: row.workId }).then(() => { + urgeWait(row.workId).then(() => { message.success('发送成功') }) }) diff --git a/src/views/OKR/Management/index.vue b/src/views/OKR/Management/index.vue index 39c9b08..95c367b 100644 --- a/src/views/OKR/Management/index.vue +++ b/src/views/OKR/Management/index.vue @@ -20,7 +20,7 @@ - + - 张三 - 李四 - 王二 + + +
@@ -41,11 +46,21 @@