Merge branch 'main' of http://114.215.207.150:3000/qiushanhe/ss-oa-manage-web into dev-cl
# Conflicts: # .env.base
This commit is contained in:
@@ -4,10 +4,11 @@ VITE_NODE_ENV=development
|
|||||||
VITE_DEV=true
|
VITE_DEV=true
|
||||||
|
|
||||||
# 请求路径
|
# 请求路径
|
||||||
#VITE_BASE_URL='http://118.31.23.45:48080'
|
|
||||||
# VITE_BASE_URL='http://114.55.169.15:48080'
|
|
||||||
VITE_BASE_URL='http://localhost:48080'
|
VITE_BASE_URL='http://localhost:48080'
|
||||||
|
|
||||||
|
# VITE_BASE_URL='http://47.98.161.246:48080'
|
||||||
|
# VITE_BASE_URL='http://114.55.169.15:48080'
|
||||||
|
#VITE_BASE_URL='http://114.215.207.150:48080'
|
||||||
|
|
||||||
# 上传路径
|
# 上传路径
|
||||||
VITE_UPLOAD_URL='http://47.98.161.246:48080/admin-api/system/file/upload'
|
VITE_UPLOAD_URL='http://47.98.161.246:48080/admin-api/system/file/upload'
|
||||||
|
|||||||
@@ -54,3 +54,8 @@ export const getLinkHistorySalary = async () => {
|
|||||||
export const getCommissionDetail = async (params) => {
|
export const getCommissionDetail = async (params) => {
|
||||||
return await request.get({ url: '/admin-api/oa/user-salary-grant/detail', params })
|
return await request.get({ url: '/admin-api/oa/user-salary-grant/detail', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 发送工资条通知
|
||||||
|
export const sendSalaryNotice = (data) => {
|
||||||
|
return request.post({ url: '/admin-api/oa/user-salary-grant/pushUserSalaryGrantDetail', data })
|
||||||
|
}
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ const resetForm = () => {
|
|||||||
/** 获得部门树 */
|
/** 获得部门树 */
|
||||||
const getTree = async () => {
|
const getTree = async () => {
|
||||||
deptTree.value = []
|
deptTree.value = []
|
||||||
const data = await DeptApi.getSimpleDeptList({ allFlag: false })
|
const data = await DeptApi.getSimpleDeptList({ allFlag: true })
|
||||||
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)
|
||||||
|
|||||||
@@ -308,9 +308,24 @@
|
|||||||
<span v-if="row.status == 0">封存</span>
|
<span v-if="row.status == 0">封存</span>
|
||||||
<span v-else-if="row.status == 1">已封存</span>
|
<span v-else-if="row.status == 1">已封存</span>
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" v-if="row.grantId" text @click="handleDetail(row)">
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
v-if="row.grantId"
|
||||||
|
style="padding: 0"
|
||||||
|
text
|
||||||
|
@click="handleDetail(row)"
|
||||||
|
>
|
||||||
提成明细
|
提成明细
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
v-hasPermi="['home:salary:send']"
|
||||||
|
style="padding: 0"
|
||||||
|
@click="handelSendNotic(row)"
|
||||||
|
>
|
||||||
|
发送工资条
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -468,6 +483,20 @@ async function handleDetail(row) {
|
|||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handelSendNotic(row) {
|
||||||
|
const name = row.grantId ? row.name : row.period
|
||||||
|
const params = row.grantId ? { grantId: row.grantId } : { period: row.period }
|
||||||
|
message.confirm('确认要发送"' + name + '"工资条吗?').then(async () => {
|
||||||
|
try {
|
||||||
|
await SalaryApi.sendSalaryNotice(params)
|
||||||
|
message.success('发送成功!')
|
||||||
|
} catch (error) {
|
||||||
|
message.error(error)
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="flex flex-col w-full h-full p-4 bg-white rounded-lg shadow-md overflow-hidden">
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-tree-select
|
<el-tree-select
|
||||||
@@ -31,7 +31,6 @@
|
|||||||
>
|
>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<OkrTable ref="okrTableRef" :canEdit="isCurrentLeafNode" />
|
<OkrTable ref="okrTableRef" :canEdit="isCurrentLeafNode" />
|
||||||
<DialogOkr ref="dialogOkr" @edit="handleEditOkr" />
|
<DialogOkr ref="dialogOkr" @edit="handleEditOkr" />
|
||||||
<DialogOkrInfo ref="dialogOkrInfo" @success="handleSearchPeroid" />
|
<DialogOkrInfo ref="dialogOkrInfo" @success="handleSearchPeroid" />
|
||||||
@@ -86,6 +85,7 @@ function handleSearchPeroid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function nodeChange(nodeId) {
|
function nodeChange(nodeId) {
|
||||||
|
if (nodeId) {
|
||||||
searchForm.value.nodeId = nodeId
|
searchForm.value.nodeId = nodeId
|
||||||
getOkrList()
|
getOkrList()
|
||||||
const currentNode = findNode(peroidList.value, (node) => {
|
const currentNode = findNode(peroidList.value, (node) => {
|
||||||
@@ -97,6 +97,7 @@ function nodeChange(nodeId) {
|
|||||||
} else {
|
} else {
|
||||||
isCurrentLeafNode.value = false
|
isCurrentLeafNode.value = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getOkrList() {
|
function getOkrList() {
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="dialog-okr-side pl-10px">
|
<div class="dialog-okr-side pl-10px">
|
||||||
<el-tabs v-model="sideIndex" style="flex: 1; height: 100%">
|
<el-tabs v-model="sideIndex" style="flex: 1; height: 100%">
|
||||||
<el-tab-pane label="子节点" name="subNode">
|
<el-tab-pane label="子节点" name="subNode" key=" ">
|
||||||
<div class="overflow-y-auto" style="height: calc(100% - 50px)">
|
<div class="overflow-y-auto" style="height: calc(100% - 50px)">
|
||||||
<div
|
<div
|
||||||
v-for="item in childNodeList"
|
v-for="item in childNodeList"
|
||||||
@@ -143,11 +143,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="评论" name="conclusion">
|
<el-tab-pane label="评论" name="conclusion" key="conclusion">
|
||||||
<div class="relative overflow-y-auto" style="height: calc(100% - 50px)">
|
<div class="relative overflow-y-auto" style="height: calc(100% - 50px)">
|
||||||
|
<div v-if="addNewComment">
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<el-select
|
<el-select
|
||||||
v-if="addNewComment"
|
|
||||||
v-model="form.commentType"
|
v-model="form.commentType"
|
||||||
filterable
|
filterable
|
||||||
size="small"
|
size="small"
|
||||||
@@ -162,15 +162,12 @@
|
|||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
|
|
||||||
<div v-if="addNewComment">
|
<div>
|
||||||
<el-button size="small" @click="addNewComment = false"> 取消 </el-button>
|
<el-button size="small" @click="addNewComment = false"> 取消 </el-button>
|
||||||
<el-button type="primary" size="small" @click="handleSaveComment">
|
<el-button type="primary" size="small" @click="handleSaveComment">
|
||||||
发布
|
发布
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-button v-else type="primary" size="small" @click="handleInsertComment">
|
|
||||||
新增评论
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-10px" v-if="addNewComment">
|
<div class="mt-10px" v-if="addNewComment">
|
||||||
<Editor
|
<Editor
|
||||||
@@ -179,6 +176,10 @@
|
|||||||
:toolbarConfig="toolbarConfig"
|
:toolbarConfig="toolbarConfig"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-button v-else type="primary" size="small" @click="handleInsertComment">
|
||||||
|
新增评论
|
||||||
|
</el-button>
|
||||||
<div
|
<div
|
||||||
v-for="(it, index) in commentList"
|
v-for="(it, index) in commentList"
|
||||||
:key="it.commentId"
|
:key="it.commentId"
|
||||||
@@ -296,7 +297,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="进度历史" name="history">
|
<el-tab-pane label="进度历史" name="history" key="history">
|
||||||
<div class="overflow-y-auto pl-15px" style="height: calc(100% - 50px)">
|
<div class="overflow-y-auto pl-15px" style="height: calc(100% - 50px)">
|
||||||
<el-timeline class="ml-10px">
|
<el-timeline class="ml-10px">
|
||||||
<el-timeline-item
|
<el-timeline-item
|
||||||
@@ -649,8 +650,9 @@ function handleSendCommnet(idx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.content-wrap {
|
.content-wrap {
|
||||||
overflow-y: auto;
|
display: flex;
|
||||||
max-height: calc(100% - 70px);
|
flex-direction: column;
|
||||||
|
height: calc(100% - 15px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.dialog-okr-side {
|
.dialog-okr-side {
|
||||||
|
|||||||
@@ -120,10 +120,20 @@
|
|||||||
class="flex items-center w-full"
|
class="flex items-center w-full"
|
||||||
v-for="(item, i) in objectList"
|
v-for="(item, i) in objectList"
|
||||||
:key="item.objectiveId"
|
:key="item.objectiveId"
|
||||||
|
style="padding-bottom: 5px"
|
||||||
>
|
>
|
||||||
<div class="flex-1 w-100px">
|
<div class="flex-1 w-100px">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<el-tag type="success" class="mr-10px">O{{ i + 1 }}</el-tag>
|
<el-tooltip content="点击可折叠/展开目标" placement="top" effect="dark">
|
||||||
|
<el-tag
|
||||||
|
type="success"
|
||||||
|
class="mr-10px"
|
||||||
|
@click="item.hideChild = !item.hideChild"
|
||||||
|
>
|
||||||
|
O{{ i + 1 }}
|
||||||
|
</el-tag>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
<el-input
|
<el-input
|
||||||
v-model="item.objectiveName"
|
v-model="item.objectiveName"
|
||||||
placeholder="目标名称"
|
placeholder="目标名称"
|
||||||
@@ -135,6 +145,7 @@
|
|||||||
placeholder="选择执行人,可多选"
|
placeholder="选择执行人,可多选"
|
||||||
multiple
|
multiple
|
||||||
clearable
|
clearable
|
||||||
|
collapse-tags
|
||||||
filterable
|
filterable
|
||||||
style="width: 240px; margin-left: 10px"
|
style="width: 240px; margin-left: 10px"
|
||||||
>
|
>
|
||||||
@@ -161,7 +172,7 @@
|
|||||||
<el-button type="danger" text @click="removeObj(i)">删除目标</el-button>
|
<el-button type="danger" text @click="removeObj(i)">删除目标</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="background: #f0f3fa; padding-bottom: 15px">
|
<div v-if="!item.hideChild" style="background: #f0f3fa; padding-bottom: 10px">
|
||||||
<div
|
<div
|
||||||
class="ml-50px"
|
class="ml-50px"
|
||||||
v-for="(kr, index) in item.keyResults"
|
v-for="(kr, index) in item.keyResults"
|
||||||
@@ -192,7 +203,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mt-5px flex items-center">
|
<div class="mt-5px flex items-center">
|
||||||
<el-tree-select
|
<el-tree-select
|
||||||
v-model="kr.sourceId"
|
v-model="kr.source"
|
||||||
:data="sourceOptions"
|
:data="sourceOptions"
|
||||||
:props="defaultProps"
|
:props="defaultProps"
|
||||||
check-strictly
|
check-strictly
|
||||||
@@ -202,10 +213,10 @@
|
|||||||
node-key="sourceId"
|
node-key="sourceId"
|
||||||
placeholder="请选择渠道"
|
placeholder="请选择渠道"
|
||||||
/>
|
/>
|
||||||
<el-radio-group v-model="kr.resultType" class="ml-10px">
|
<!-- <el-radio-group v-model="kr.resultType" class="ml-10px">
|
||||||
<el-radio-button :value="1">目标值</el-radio-button>
|
<el-radio-button :value="1">目标值</el-radio-button>
|
||||||
<el-radio-button :value="2">是/否</el-radio-button>
|
<el-radio-button :value="2">是/否</el-radio-button>
|
||||||
</el-radio-group>
|
</el-radio-group> -->
|
||||||
|
|
||||||
<el-input
|
<el-input
|
||||||
v-if="kr.resultType == 1"
|
v-if="kr.resultType == 1"
|
||||||
@@ -521,6 +532,7 @@ async function handleSave() {
|
|||||||
const valid = await formRef.value.validate()
|
const valid = await formRef.value.validate()
|
||||||
if (!valid) return
|
if (!valid) return
|
||||||
|
|
||||||
|
form.value.executor = form.value.executor || []
|
||||||
if (form.value.executor.length > 1) {
|
if (form.value.executor.length > 1) {
|
||||||
message
|
message
|
||||||
.confirm('是否按照当前节点所选的多个执行人自动新增对应的员工节点?', {
|
.confirm('是否按照当前节点所选的多个执行人自动新增对应的员工节点?', {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="h-full flex flex-col">
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-tree-select
|
<el-tree-select
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="h-full flex flex-col">
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-tree-select
|
<el-tree-select
|
||||||
|
|||||||
@@ -30,9 +30,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<vue3-tree-org
|
<vue3-tree-org
|
||||||
|
ref="treeOrgRef"
|
||||||
:data="dataList"
|
:data="dataList"
|
||||||
center
|
center
|
||||||
collapsable
|
collapsable
|
||||||
|
:default-expand-keys="lastExpendKeys"
|
||||||
:props="treeProps"
|
:props="treeProps"
|
||||||
@on-node-click="handleClickNode"
|
@on-node-click="handleClickNode"
|
||||||
>
|
>
|
||||||
@@ -74,7 +76,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</vue3-tree-org>
|
</vue3-tree-org>
|
||||||
<DialogOkr ref="dialogOkr" @edit="handleEditOkr" />
|
<DialogOkr ref="dialogOkr" @edit="handleEditOkr" />
|
||||||
<DialogOkrInfo ref="dialogOkrInfo" @close="openOkr" />
|
<DialogOkrInfo ref="dialogOkrInfo" @close="openOkr" @success="resetTreeData" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -89,6 +91,7 @@ import { listToTree } from '@/utils/tree'
|
|||||||
|
|
||||||
const dataList = ref({})
|
const dataList = ref({})
|
||||||
const helpDataList = ref([])
|
const helpDataList = ref([])
|
||||||
|
const lastExpendKeys = ref([])
|
||||||
const treeProps = {
|
const treeProps = {
|
||||||
children: 'children',
|
children: 'children',
|
||||||
label: 'nodeName',
|
label: 'nodeName',
|
||||||
@@ -106,6 +109,7 @@ const peroidList = ref([])
|
|||||||
handleSearchPeroid()
|
handleSearchPeroid()
|
||||||
|
|
||||||
function handleSearchPeroid() {
|
function handleSearchPeroid() {
|
||||||
|
lastExpendKeys.value = []
|
||||||
getOkrRelationTree().then((resp) => {
|
getOkrRelationTree().then((resp) => {
|
||||||
peroidList.value = resp
|
peroidList.value = resp
|
||||||
if (resp && resp.length && !searchForm.value.nodeId) {
|
if (resp && resp.length && !searchForm.value.nodeId) {
|
||||||
@@ -116,6 +120,43 @@ function handleSearchPeroid() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const treeOrgRef = ref(null)
|
||||||
|
function resetTreeData() {
|
||||||
|
if (treeOrgRef.value) {
|
||||||
|
lastExpendKeys.value = treeOrgRef.value.getExpandKeys()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重新获取tree数据
|
||||||
|
getOkrRelationTree().then((resp) => {
|
||||||
|
peroidList.value = resp
|
||||||
|
if (resp && resp.length) {
|
||||||
|
if (!searchForm.value.nodeId) {
|
||||||
|
searchForm.value.nodeId = resp[0].nodeId
|
||||||
|
searchForm.value.nodeName = resp[0].nodeName
|
||||||
|
}
|
||||||
|
getOkrRelationTreeChildren({
|
||||||
|
nodeId: searchForm.value.nodeId
|
||||||
|
}).then((resp) => {
|
||||||
|
const tree = listToTree(resp, {
|
||||||
|
id: 'nodeId',
|
||||||
|
pid: 'parentId',
|
||||||
|
children: 'children'
|
||||||
|
})
|
||||||
|
// // 设置展开的keys
|
||||||
|
// if (treeOrgRef.value) {
|
||||||
|
// treeOrgRef.value.setExpandKeys(lastExpendKeys.value)
|
||||||
|
// }
|
||||||
|
helpDataList.value = resp
|
||||||
|
if (tree && tree.length) {
|
||||||
|
dataList.value = tree[0]
|
||||||
|
} else {
|
||||||
|
dataList.value = {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function getOkrList() {
|
function getOkrList() {
|
||||||
getOkrRelationTreeChildren({
|
getOkrRelationTreeChildren({
|
||||||
nodeId: searchForm.value.nodeId
|
nodeId: searchForm.value.nodeId
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="flex-1 h-200px overflow-hidden">
|
||||||
<el-table
|
<el-table
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
:data="okrList"
|
:data="okrList"
|
||||||
default-expand-all
|
default-expand-all
|
||||||
row-key="id"
|
row-key="id"
|
||||||
size="large"
|
size="large"
|
||||||
|
height="100%"
|
||||||
@row-click="handleRowClick"
|
@row-click="handleRowClick"
|
||||||
@expand-change="handleExpand"
|
@expand-change="handleExpand"
|
||||||
>
|
>
|
||||||
@@ -19,11 +20,18 @@
|
|||||||
height: getHeight(row, $index)
|
height: getHeight(row, $index)
|
||||||
}"
|
}"
|
||||||
></span>
|
></span>
|
||||||
<span v-if="row.type == '目标'">【目标】{{ row.name }}</span>
|
<span v-if="row.type == '目标'">
|
||||||
|
<el-tag type="success" size="small">目标</el-tag>
|
||||||
|
{{ row.name }}
|
||||||
|
</span>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span class="line2"></span>
|
<span class="line2"></span>
|
||||||
<span>
|
<span>
|
||||||
【关键成果】{{ row.channelName }} {{ row.name }}
|
<el-tag type="primary" size="small">关键成果</el-tag>
|
||||||
|
<span class="font-bold text-black" v-if="row.sourceName">
|
||||||
|
【{{ row.sourceName }}】
|
||||||
|
</span>
|
||||||
|
<span>{{ row.name }}</span>
|
||||||
<span v-if="row.resultType == 1">达 {{ row.targetValue }}</span>
|
<span v-if="row.resultType == 1">达 {{ row.targetValue }}</span>
|
||||||
</span>
|
</span>
|
||||||
<div class="flex items-center mt-10px ml-50px">
|
<div class="flex items-center mt-10px ml-50px">
|
||||||
@@ -94,13 +102,14 @@ function prepareData(list) {
|
|||||||
nodeId: child.nodeId,
|
nodeId: child.nodeId,
|
||||||
isSys: child.isSys,
|
isSys: child.isSys,
|
||||||
processId: child.id,
|
processId: child.id,
|
||||||
name: child.keyResultName,
|
name: child.keyResultShowName,
|
||||||
progress: child.progress,
|
progress: child.progress,
|
||||||
executorName: child.executorName,
|
executorName: child.executorName,
|
||||||
type: '关键成果',
|
type: '关键成果',
|
||||||
resultType: child.resultType,
|
resultType: child.resultType,
|
||||||
targetValue: child.targetValue,
|
targetValue: child.targetValue,
|
||||||
currentValue: Number(child.currentValue)
|
currentValue: Number(child.currentValue),
|
||||||
|
sourceName: child.sourceName
|
||||||
}
|
}
|
||||||
helpList.value.push(kr)
|
helpList.value.push(kr)
|
||||||
return kr
|
return kr
|
||||||
|
|||||||
Reference in New Issue
Block a user