|
@@ -1,13 +1,16 @@
|
|
|
<script setup lang="ts">
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import { GlobalStore } from '@/stores/index'
|
|
|
-import { ref, reactive } from 'vue'
|
|
|
-import { getFormatDuration } from '@/utils/common'
|
|
|
+import { ref, reactive, nextTick } from 'vue'
|
|
|
import { UserFilled } from '@element-plus/icons-vue'
|
|
|
import TableBase from '@/components/TableBase/index.vue'
|
|
|
import { ColumnProps } from '@/components/TableBase/interface/index'
|
|
|
-import { User_List } from '@/api/user/index'
|
|
|
-import { Project_Finance_List } from '@/api/project/index'
|
|
|
+import { Project_Finance_List, Project_Get, Project_User_List, Project_Approval } from '@/api/project/index'
|
|
|
+import { View, CircleCheck } from '@element-plus/icons-vue'
|
|
|
+import Drawer from '@/components/Drawer/index.vue'
|
|
|
+import ProjectDetail from './ProjectDetail.vue'
|
|
|
+import type { FormInstance, FormRules } from 'element-plus'
|
|
|
+import { useTablePublic, Project_State } from '@/hooks/useTablePublic'
|
|
|
|
|
|
interface UserInfoIn {
|
|
|
T_name: string
|
|
@@ -25,36 +28,88 @@ const userInfo = ref<UserInfoIn>({
|
|
|
T_dept_name: '',
|
|
|
T_post_name: ''
|
|
|
})
|
|
|
-const TableRef = ref()
|
|
|
+
|
|
|
+const formLabelWidth = ref('120px')
|
|
|
const globalStore = GlobalStore()
|
|
|
+const ruleFormRef = ref<FormInstance>()
|
|
|
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
|
|
|
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
|
|
|
+const projectDetailRef = ref<InstanceType<typeof ProjectDetail> | null>(null)
|
|
|
+const { tableRowClassName } = useTablePublic()
|
|
|
+const tableRowClassNameHandle = (data: any): any => tableRowClassName(data.row.T_uuid, userInfo.value.T_uuid)
|
|
|
+
|
|
|
const columns: ColumnProps[] = [{ prop: 'T_name', label: '姓名' }]
|
|
|
-const columnsProject: ColumnProps[] = [{ prop: 'T_name', label: '姓名' }]
|
|
|
+const columnsProject: ColumnProps[] = [
|
|
|
+ { prop: 'Id', label: 'ID' },
|
|
|
+ { prop: 'T_name', label: '项目名称' },
|
|
|
+ { prop: 'T_user_name', label: '项目负责人' },
|
|
|
+ { prop: 'T_set_up_date', label: '立项日期' },
|
|
|
+ { prop: 'T_end_date', label: '结束时间' },
|
|
|
+ { prop: 'T_planning_cycle', label: '计划完成周期(工作日)', width: 125 },
|
|
|
+ { prop: 'T_bonus', label: '绩效总金额' },
|
|
|
+ { prop: 'T_State', label: '状态', name: 'T_State', width: 120 },
|
|
|
+ { prop: 'operation', label: '操作', width: 80, fixed: 'right' }
|
|
|
+]
|
|
|
const initParam = { User_tokey: globalStore.GET_User_tokey }
|
|
|
const initParamProject = reactive({ User_tokey: globalStore.GET_User_tokey, T_uuid: userInfo.value.T_uuid, page_z: 99 })
|
|
|
|
|
|
+const form = ref({
|
|
|
+ Id: '',
|
|
|
+ T_name: '',
|
|
|
+ T_end_date: '',
|
|
|
+ T_set_up_date: '',
|
|
|
+ T_description: '',
|
|
|
+ T_detail: '',
|
|
|
+ T_planning_cycle: '',
|
|
|
+ T_reality_cycle: '',
|
|
|
+ T_bonus: '',
|
|
|
+ T_Perf: '',
|
|
|
+ T_remark: '',
|
|
|
+ T_approver: '',
|
|
|
+ T_advance_day: '',
|
|
|
+ T_uuid: ''
|
|
|
+})
|
|
|
+const rules = reactive<FormRules>({
|
|
|
+ T_name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }]
|
|
|
+})
|
|
|
+
|
|
|
+const openProjectDrawer = (type: string, row?: any) => {
|
|
|
+ nextTick(async () => {
|
|
|
+ form.value = { ...row }
|
|
|
+ form.value.T_approver = row.T_approver_name
|
|
|
+ form.value.T_uuid = row.T_approver
|
|
|
+ const res: any = await Project_Get({ T_id: row.Id })
|
|
|
+ if (res.Code === 200) {
|
|
|
+ projectDetailRef.value?.setDetailData(res.Data.T_Detail)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ drawerRef.value?.openDrawer()
|
|
|
+}
|
|
|
+
|
|
|
const getSalaryParams = (row: any) => {
|
|
|
userInfo.value.T_uuid = ''
|
|
|
- console.log(row)
|
|
|
setTimeout(() => {
|
|
|
userInfo.value = { ...row }
|
|
|
initParamProject.T_uuid = userInfo.value.T_uuid
|
|
|
}, 100)
|
|
|
}
|
|
|
|
|
|
-const tableRowClassName = (data: any): any => {
|
|
|
- //判断是否相等,相同时改变背景颜色
|
|
|
- let user: any = undefined
|
|
|
- if (data.row.T_uuid === userInfo.value.T_uuid) {
|
|
|
- user = data.row
|
|
|
- }
|
|
|
- if (user !== undefined) {
|
|
|
- let rowBackground = {
|
|
|
- background: '#e3eefd',
|
|
|
- color: '#0d7bff'
|
|
|
- }
|
|
|
- return rowBackground
|
|
|
- } else {
|
|
|
- return ''
|
|
|
+const callbackDrawer = (done: () => void) => {
|
|
|
+ resetForm(ruleFormRef.value)
|
|
|
+ projectDetailRef.value?.clearDetail()
|
|
|
+ done()
|
|
|
+}
|
|
|
+
|
|
|
+const resetForm = (formEl: FormInstance | undefined) => {
|
|
|
+ if (!formEl) return
|
|
|
+ formEl.resetFields()
|
|
|
+}
|
|
|
+// 切换状态
|
|
|
+const changeState = async (id: number, row: any) => {
|
|
|
+ const res: any = await Project_Approval({ User_tokey: globalStore.GET_User_tokey, T_id: row.Id, T_State: id })
|
|
|
+ if (res.Code === 200) {
|
|
|
+ ElMessage.success('审核成功!')
|
|
|
+ TableRef.value?.getTableList()
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
@@ -62,13 +117,12 @@ const tableRowClassName = (data: any): any => {
|
|
|
<div class="project-finance">
|
|
|
<div style="width: 290px" class="project-table">
|
|
|
<TableBase
|
|
|
- ref="TableRef"
|
|
|
:columns="columns"
|
|
|
- :requestApi="User_List"
|
|
|
+ :requestApi="Project_User_List"
|
|
|
:initParam="initParam"
|
|
|
layout="prev, pager, next"
|
|
|
:rowClick="getSalaryParams"
|
|
|
- :tableRowClassName="tableRowClassName"
|
|
|
+ :tableRowClassName="tableRowClassNameHandle"
|
|
|
>
|
|
|
<template #table-header>
|
|
|
<h3 class="title">员工列表</h3>
|
|
@@ -92,31 +146,167 @@ const tableRowClassName = (data: any): any => {
|
|
|
</div>
|
|
|
</el-card>
|
|
|
<TableBase
|
|
|
+ ref="TableRef"
|
|
|
:columns="columnsProject"
|
|
|
:requestApi="Project_Finance_List"
|
|
|
:initParam="initParamProject"
|
|
|
:displayHeader="true"
|
|
|
:pagination="false"
|
|
|
>
|
|
|
- <template #table-header>
|
|
|
- <h3 class="title">员工列表</h3>
|
|
|
+ <template #T_State="{ row }">
|
|
|
+ <el-dropdown trigger="click" size="small">
|
|
|
+ <el-button type="primary" size="small" :disabled="row.T_State === 4">
|
|
|
+ {{ Project_State[row.T_State - 1].name }}<el-icon class="el-icon--right"><arrow-down /></el-icon>
|
|
|
+ </el-button>
|
|
|
+ <template #dropdown>
|
|
|
+ <el-dropdown-menu>
|
|
|
+ <el-dropdown-item
|
|
|
+ v-for="item in Project_State"
|
|
|
+ :key="item.id"
|
|
|
+ :icon="CircleCheck"
|
|
|
+ @click="changeState(item.id, row)"
|
|
|
+ >{{ item.name }}</el-dropdown-item
|
|
|
+ >
|
|
|
+ </el-dropdown-menu>
|
|
|
+ </template>
|
|
|
+ </el-dropdown>
|
|
|
+ </template>
|
|
|
+ <template #right="{ row }">
|
|
|
+ <el-button link type="success" size="small" :icon="View" @click="openProjectDrawer('view', row)"
|
|
|
+ >详情</el-button
|
|
|
+ >
|
|
|
</template>
|
|
|
</TableBase>
|
|
|
</div>
|
|
|
</transition>
|
|
|
+ <Drawer ref="drawerRef" :handleClose="callbackDrawer" size="50%">
|
|
|
+ <template #header="{ params }">
|
|
|
+ <h4 :id="params.titleId" :class="params.titleClass">项目 - 详情</h4>
|
|
|
+ </template>
|
|
|
+ <el-form ref="ruleFormRef" :model="form" :rules="rules">
|
|
|
+ <el-form-item label="项目名称:" :label-width="formLabelWidth" prop="T_name">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_name"
|
|
|
+ class="w-50"
|
|
|
+ :disabled="true"
|
|
|
+ type="text"
|
|
|
+ autocomplete="off"
|
|
|
+ placeholder="请输入项目名称"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目结束日期:" :label-width="formLabelWidth" prop="T_end_date">
|
|
|
+ <el-date-picker
|
|
|
+ style="flex: 0 0 50%"
|
|
|
+ class="my-date-picker"
|
|
|
+ v-model="form.T_end_date"
|
|
|
+ :disabled="true"
|
|
|
+ type="date"
|
|
|
+ placeholder="项目结束日期"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目立项日期:" :label-width="formLabelWidth" prop="T_set_up_date">
|
|
|
+ <el-date-picker
|
|
|
+ style="flex: 0 0 50%"
|
|
|
+ class="my-date-picker"
|
|
|
+ v-model="form.T_set_up_date"
|
|
|
+ :disabled="true"
|
|
|
+ type="date"
|
|
|
+ placeholder="项目立项日期"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目简介:" :label-width="formLabelWidth" prop="T_description">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_description"
|
|
|
+ :disabled="true"
|
|
|
+ :autosize="{ minRows: 6, maxRows: 8 }"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入项目简介"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目明细:" :label-width="formLabelWidth" prop="T_detail">
|
|
|
+ <ProjectDetail ref="projectDetailRef" :disabled="true" :isShow="false"></ProjectDetail>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="计划完成周期:" :label-width="formLabelWidth" prop="T_planning_cycle">
|
|
|
+ <div style="display: flex; white-space: nowrap; flex: 1">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_planning_cycle"
|
|
|
+ style="flex: 0 0 33.33%"
|
|
|
+ :disabled="true"
|
|
|
+ type="text"
|
|
|
+ autocomplete="off"
|
|
|
+ placeholder="请输入计划完成周期"
|
|
|
+ />
|
|
|
+ <span style="margin: 0 10px">工作日</span>
|
|
|
+ <span style="color: #bbb"
|
|
|
+ ><el-icon><QuestionFilled /></el-icon>备注;根据项目明细计划时间自动计算</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="实际完成周期:" :label-width="formLabelWidth" prop="T_reality_cycle">
|
|
|
+ <div style="display: flex; white-space: nowrap; flex: 1">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_reality_cycle"
|
|
|
+ class="w-50"
|
|
|
+ :disabled="true"
|
|
|
+ type="text"
|
|
|
+ autocomplete="off"
|
|
|
+ placeholder="请输入实际完成周期"
|
|
|
+ />
|
|
|
+ <span style="margin: 0 10px">工作日</span>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="提前完成天数:" :label-width="formLabelWidth" prop="T_advance_day">
|
|
|
+ <div style="display: flex; white-space: nowrap; flex: 1">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_advance_day"
|
|
|
+ class="w-50"
|
|
|
+ :disabled="true"
|
|
|
+ type="text"
|
|
|
+ autocomplete="off"
|
|
|
+ placeholder="请输入提前完成天数"
|
|
|
+ />
|
|
|
+ <span style="margin: 0 10px">工作日</span>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="奖励金额:" :label-width="formLabelWidth" prop="T_bonus">
|
|
|
+ <div style="display: flex; white-space: nowrap; flex: 1">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_bonus"
|
|
|
+ class="w-50"
|
|
|
+ :disabled="true"
|
|
|
+ type="text"
|
|
|
+ autocomplete="off"
|
|
|
+ placeholder="请输入奖励金额"
|
|
|
+ />
|
|
|
+ <span style="margin: 0 10px">元</span>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="绩效总金额:" :label-width="formLabelWidth" prop="T_Perf">
|
|
|
+ <div style="display: flex; white-space: nowrap; flex: 1">
|
|
|
+ <el-input
|
|
|
+ v-model="form.T_Perf"
|
|
|
+ class="w-50"
|
|
|
+ :disabled="true"
|
|
|
+ type="text"
|
|
|
+ autocomplete="off"
|
|
|
+ placeholder="请输入绩效总金额"
|
|
|
+ />
|
|
|
+ <span style="margin: 0 10px">元</span>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </Drawer>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@import '@/styles/var.scss';
|
|
|
-:deep(.el-table--enable-row-hover .el-table__body tr > td) {
|
|
|
- transition: all 0.5s ease-in-out;
|
|
|
-}
|
|
|
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
|
|
|
- box-shadow: 0 0 6px #dfdfdf;
|
|
|
- transform: translateX(-2px);
|
|
|
-}
|
|
|
.project-finance {
|
|
|
+ width: 100%;
|
|
|
height: 100%;
|
|
|
display: flex;
|
|
|
overflow: hidden;
|
|
@@ -126,8 +316,8 @@ const tableRowClassName = (data: any): any => {
|
|
|
}
|
|
|
.project-container {
|
|
|
@include f-direction;
|
|
|
+ width: calc(100% - 290px);
|
|
|
z-index: 0;
|
|
|
- flex: 1;
|
|
|
margin-left: 12px;
|
|
|
.box-card {
|
|
|
border-radius: 8px;
|
|
@@ -137,6 +327,9 @@ const tableRowClassName = (data: any): any => {
|
|
|
transition: all 5s ease-in-out;
|
|
|
}
|
|
|
}
|
|
|
+ :deep(.el-table .cell) {
|
|
|
+ white-space: normal !important;
|
|
|
+ }
|
|
|
.text {
|
|
|
text-align: left;
|
|
|
}
|
|
@@ -164,5 +357,8 @@ const tableRowClassName = (data: any): any => {
|
|
|
font-size: 20px;
|
|
|
color: #707b84;
|
|
|
}
|
|
|
+ .w-50 {
|
|
|
+ flex: 0 0 50%;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|