浏览代码

按钮权限添加

songxy 1 年之前
父节点
当前提交
1afbad7fcf

+ 13 - 0
client/src/service/project.ts

@@ -29,6 +29,19 @@ export const getProjectWithChildrenById = async (projectId: ProjectId): Promise<
   )
 }
 
+/**
+ * 获取项目详情权限
+ * @param projectId
+ */
+export const getProjectInfoButton = async (projectId: ProjectId): Promise<ProjectRecord> => {
+  return await request.get(
+    {
+      url: '/project/info-button',
+      params: { projectId }
+    },
+    '/business'
+  )
+}
 /**
  * 发起项目验收、结项
  * @param projectId

+ 32 - 0
client/src/store/modules/projectPermis.ts

@@ -0,0 +1,32 @@
+import { defineStore } from 'pinia'
+import { getProjectInfoButton } from '@/service/project'
+import { ProjectId } from '@/interface/project'
+
+export interface ProjectPermiss {
+  isPermiss: boolean
+  all: boolean
+  xmLeader: boolean
+  xsLeader: boolean
+  childButton: { [key: string]: boolean }
+}
+export const useProjectPermis = defineStore('project', () => {
+  const projectPermisState = ref<ProjectPermiss>({
+    isPermiss: false,
+    all: false,
+    xmLeader: false,
+    xsLeader: false,
+    childButton: {}
+  })
+  const initProjectPermis = (projectId: ProjectId) => {
+    getProjectInfoButton(projectId).then((result) => {
+      projectPermisState.value = {
+        isPermiss: true,
+        ...result
+      } as any
+    })
+  }
+  return {
+    projectPermisState,
+    initProjectPermis
+  }
+})

+ 8 - 1
client/src/views/OaSystem/projectCenter/projectDetail/components/xmht/index.vue

@@ -60,6 +60,7 @@
             <li v-if="editor === false" @click="handleEditor">编辑合同</li>
             <li v-else @click="saveContractHandle">保存合同</li>
             <li
+              v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xsLeader"
               @click="
                 startUseMoneyMuate({
                   projectId: mContractDetail?.projectId,
@@ -68,7 +69,11 @@
               "
               >用款申请</li
             >
-            <li @click="() => startContractInvoiceMuate(mContractDetail?.id)">开票申请</li>
+            <li
+              v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xsLeader"
+              @click="() => startContractInvoiceMuate(mContractDetail?.id)"
+              >开票申请</li
+            >
           </ul>
           <table>
             <tr>
@@ -537,6 +542,7 @@
 </template>
 <script setup lang="ts">
 import { useRoute } from 'vue-router'
+import { useProjectPermis } from '@/store/modules/projectPermis'
 import { DICT_TYPE, getDictOptions } from '@/utils/dict'
 import { openFlow } from '@/utils/flow'
 import { filterNodeMethod } from '@/utils/tree'
@@ -565,6 +571,7 @@ const signWayList = getDictOptions(DICT_TYPE.CONTRACT_SIGN_WAY)
 const secondTypeList = getDictOptions(DICT_TYPE.CONTRACT_SECOND_TYPE)
 const contractSignList = getDictOptions(DICT_TYPE.CONTRACT_SIGN_STATUS)
 
+const { projectPermis.projectPermisState } = useProjectPermis()
 const { query } = useRoute()
 const { id: _currentProjectId = '', contractId = '' } = query as {
   id: string

+ 20 - 2
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/ProjectMember.vue

@@ -1,5 +1,6 @@
 <script setup lang="ts">
 import { useMutation, useQuery } from '@tanstack/vue-query'
+import { useProjectPermis } from '@/store/modules/projectPermis'
 import { addMember, editorMember, deleteMember, getProjectMember } from '@/service/project'
 import { ProjectMember } from '@/interface/project'
 import { ElMessage } from 'element-plus'
@@ -10,6 +11,7 @@ const defaultMemberData: ProjectMember = {
   responsibility: '',
   isManager: 0
 }
+const projectPermis = useProjectPermis()
 /**
  * 项目成员
  */
@@ -139,7 +141,16 @@ const getAssetURL = (img: string) => {
       <div class="total"
         >当前项目参与人员:<b>{{ projectWorkerRelationList?.length ?? 0 }}人</b></div
       >
-      <div class="handle-add-btn" @click="handleAddClick">+ 新增人员</div>
+      <div
+        v-if="
+          projectPermis.projectPermisState.all ||
+          projectPermis.projectPermisState.xmLeader ||
+          projectPermis.projectPermisState['childButton'][projectId]
+        "
+        class="handle-add-btn"
+        @click="handleAddClick"
+        >+ 新增人员</div
+      >
     </div>
     <ul>
       <li v-for="(item, index) in projectWorkerRelationList" :key="index">
@@ -156,7 +167,14 @@ const getAssetURL = (img: string) => {
           <p class="txt">电话:{{ item['mobile'] }}</p>
         </div>
 
-        <div class="icon_group">
+        <div
+          class="icon_group"
+          v-if="
+            projectPermis.projectPermisState.all ||
+            projectPermis.projectPermisState.xmLeader ||
+            projectPermis.projectPermisState['childButton'][projectId]
+          "
+        >
           <i class="edit_icon" @click="handleEditorClick(item)">
             <Icon icon="ep:edit" />
           </i>

+ 11 - 2
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/ProjectMileStone.vue

@@ -1,9 +1,11 @@
 <script setup lang="ts">
 import { useMutation, useQuery } from '@tanstack/vue-query'
+import { useProjectPermis } from '@/store/modules/projectPermis'
 import { copyObject } from '@/utils'
 import request from '@/config/axios'
 import { finishProjectMileStone, getProjectMileStone } from '@/service/project'
 
+const projectPermis = useProjectPermis()
 const message = useMessage() // 消息弹窗
 /**
  * 项目里程碑
@@ -106,7 +108,10 @@ const confirmHandle = (id: string, index: number) => {
 
 <template>
   <div class="xmjdBox">
-    <div class="btnGroup">
+    <div
+      class="btnGroup"
+      v-if="projectPermis.projectPermisState.xmLeader || projectPermis.projectPermisState.all"
+    >
       <el-button type="primary" @click="pMileStoneAddHandle"> 新增 </el-button>
     </div>
     <div class="tableBox">
@@ -147,7 +152,11 @@ const confirmHandle = (id: string, index: number) => {
           </template>
         </el-table-column>
         >
-        <el-table-column label="操作" width="200">
+        <el-table-column
+          label="操作"
+          width="200"
+          v-if="projectPermis.projectPermisState.xmLeader || projectPermis.projectPermisState.all"
+        >
           <template #default="scope">
             <el-button @click="handleFinish(scope.row)" type="text"
               >{{ !scope.row.is_edit ? '编辑' : '保存' }}

+ 10 - 2
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/index.scss

@@ -9,8 +9,16 @@
     &:first-child {
       display: flex;
       justify-content: space-between;
-
-      > ul {
+      .right_box {
+        display: flex;
+        align-items: center;
+      }
+      .edit_btn {
+        margin-right: 10px;
+        color: #2E77E6;
+        cursor: pointer;
+      }
+      ul {
         display: flex;
         align-items: center;
 

+ 36 - 13
client/src/views/OaSystem/projectCenter/projectDetail/components/xmxx/index.vue

@@ -13,13 +13,26 @@
           </li>
         </template>
       </ul>
-      <ul>
-        <li :class="{ active: currentIndex === 0 }" @click="switchHandle(0)">项目信息</li>
-        <li :class="{ active: currentIndex === 1 }" @click="switchHandle(1)">项目成员</li>
-        <li v-show="isMaster" :class="{ active: currentIndex === 2 }" @click="switchHandle(2)"
-          >项目阶段</li
+      <div class="right_box">
+        <span
+          v-if="
+            !isMaster &&
+            (projectPermis.projectPermisState.all ||
+              projectPermis.projectPermisState.xmLeader ||
+              projectPermis.projectPermisState['childButton'][currentProjectId])
+          "
+          class="edit_btn"
+          @click="saveChildProject"
+          >{{ cEditor ? '保存项目' : '编辑项目' }}</span
         >
-      </ul>
+        <ul>
+          <li :class="{ active: currentIndex === 0 }" @click="switchHandle(0)">项目信息</li>
+          <li :class="{ active: currentIndex === 1 }" @click="switchHandle(1)">项目成员</li>
+          <li v-show="isMaster" :class="{ active: currentIndex === 2 }" @click="switchHandle(2)"
+            >项目阶段</li
+          >
+        </ul>
+      </div>
     </div>
     <div class="content" v-if="projectDetail != null">
       <template v-if="currentIndex === 0">
@@ -35,7 +48,7 @@
                   <el-input
                     class="form-item-disable-style"
                     v-model="projectDetail['xmmc']"
-                    :disabled="!editor"
+                    :disabled="!cEditor"
                   />
                 </td>
                 <td class="th">项目编号:</td>
@@ -54,7 +67,7 @@
                     class="form-item-disable-style"
                     v-model="projectDetail['xmjlId']"
                     @node-click="xmjlNodeClickHandler"
-                    :disabled="!editor"
+                    :disabled="isMaster ? !editor : !cEditor"
                   />
                 </td>
                 <td class="th">责任部门:</td>
@@ -63,7 +76,7 @@
                     class="form-item-disable-style"
                     v-model="projectDetail['zrbmId']"
                     @node-click="nodeClickHandler"
-                    :disabled="!editor"
+                    :disabled="isMaster ? !editor : !cEditor"
                   />
                 </td>
               </tr>
@@ -140,7 +153,7 @@
                   <el-input
                     class="form-item-disable-style"
                     v-model="projectDetail['yggq']"
-                    :disabled="!editor"
+                    :disabled="isMaster ? !editor : !cEditor"
                   />
                 </td>
                 <template v-if="isMaster && projectDetail['isSign'] === 1 && isEstimateAmount">
@@ -149,7 +162,7 @@
                     <el-input
                       class="form-item-disable-style"
                       v-model="projectDetail['estimateAmount']"
-                      :disabled="!editor"
+                      :disabled="isMaster ? !editor : !cEditor"
                     />
                   </td>
                 </template>
@@ -186,7 +199,7 @@
                   <el-input
                     class="form-item-disable-style"
                     v-model="projectDetail['outputValue']"
-                    :disabled="!editor"
+                    :disabled="isMaster ? !editor : !cEditor"
                 /></td>
                 <td class="th">利益分成(公司/部门):</td>
                 <td>
@@ -218,6 +231,7 @@
 <script setup lang="ts">
 import { ElMessage } from 'element-plus'
 import { DICT_TYPE, getDictOptions } from '@/utils/dict'
+import { useProjectPermis } from '@/store/modules/projectPermis'
 import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
 import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
 import DistrictTree from '@/views/OaSystem/components/DistrictTree/index.vue'
@@ -230,9 +244,11 @@ import ProjectMember from '@/views/OaSystem/projectCenter/projectDetail/componen
 import ProjectMileStone from '@/views/OaSystem/projectCenter/projectDetail/components/xmxx/ProjectMileStone.vue'
 
 defineOptions({ name: 'XmxxComp' })
+const projectPermis = useProjectPermis()
 const industryList = getDictOptions(DICT_TYPE.PROJECT_HY)
 const props = defineProps<{ editor: boolean; isEstimateAmount: boolean }>()
 const { editor, isEstimateAmount } = toRefs(props)
+const cEditor = ref<boolean>(false)
 const { query } = useRoute()
 const { id = '', flowStatus = '' } = query as {
   id: string
@@ -317,10 +333,17 @@ const onHandleSuccess = () => {
   subProjectShow.value = false
 }
 
+const saveChildProject = () => {
+  cEditor.value = !cEditor.value
+  if (cEditor.value) return
+  saveProjectHandle(1)
+}
 /**
  * 项目编辑保存成操作
+ * @param type 0表示主项目 1表示子项目
  * **/
-const saveProjectHandle = (): void => {
+const saveProjectHandle = (type: number): void => {
+  if (type === 0 && !isMaster) return
   const obj = {
     xzqdm: parentProjectDetail.xzqdm,
     projectTypeId: parentProjectDetail.projectTypeId,

+ 48 - 12
client/src/views/OaSystem/projectCenter/projectDetail/projectDetail.vue

@@ -16,10 +16,18 @@
           </h2>
         </div>
         <ul>
-          <li v-show="currentIndex === 0" @click="editorProject"
+          <li
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"
+            v-show="currentIndex === 0"
+            @click="editorProject"
             >{{ !isEditorProject ? '编辑' : '保存' }}
           </li>
-          <template v-if="projectDetail?.['isSign'] === 1">
+          <template
+            v-if="
+              (projectPermis.projectPermisState.all || projectPermis.projectPermisState.xsLeader) &&
+              projectDetail?.['isSign'] === 1
+            "
+          >
             <li
               v-if="contractDatas?.length === 0 || contractFlowStatuMap[0]"
               @click="handleStartContractSign"
@@ -36,16 +44,37 @@
               </template>
             </el-popconfirm>
           </template>
-          <li v-show="currentIndex === 0 && projectDetail?.['xmzt'] !== 3" @click="addSubProject">
+          <li
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"
+            v-show="currentIndex === 0 && projectDetail?.['xmzt'] !== 3"
+            @click="addSubProject"
+          >
             添加子项目
           </li>
-          <li v-show="projectDetail?.['xmzt'] !== 3" @click="handleStartSubcontract">分包申请</li>
-          <li v-show="projectDetail?.['xmzt'] !== 3" @click="handleStartOutsourcing">外包申请</li>
-          <li v-if="projectDetail?.['xmzt'] === 1" @click="projectStatusAndProcessHandler('ys')"
-            >验收</li
+          <li
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xsLeader"
+            v-show="projectDetail?.['xmzt'] !== 3"
+            @click="handleStartSubcontract"
           >
+            分包申请
+          </li>
+          <li
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xsLeader"
+            v-show="projectDetail?.['xmzt'] !== 3"
+            @click="handleStartOutsourcing"
+          >
+            外包申请
+          </li>
+          <li
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"
+            v-show="projectDetail?.['xmzt'] === 1"
+            @click="projectStatusAndProcessHandler('ys')"
+          >
+            验收
+          </li>
           <el-popconfirm
-            v-if="projectDetail?.['xmzt'] === 1"
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"
+            v-show="projectDetail?.['xmzt'] === 1"
             :title="`是否中止项目【${projectDetail['xmbh']}】?`"
             width="280px"
             @confirm="projectTerminateHandler"
@@ -55,7 +84,8 @@
             </template>
           </el-popconfirm>
           <el-popconfirm
-            v-if="projectDetail?.['xmzt'] === 3"
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"
+            v-show="projectDetail?.['xmzt'] === 3"
             :title="`是否恢复项目【${projectDetail['xmbh']}】?`"
             width="280px"
             @confirm="projectRecoverHandler"
@@ -64,7 +94,11 @@
               <li>恢复中止</li>
             </template>
           </el-popconfirm>
-          <li v-if="projectDetail?.['xmzt'] === 4" @click="projectStatusAndProcessHandler('jx')">
+          <li
+            v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"
+            v-show="projectDetail?.['xmzt'] === 4"
+            @click="projectStatusAndProcessHandler('jx')"
+          >
             结项
           </li>
           <li @click="processLookHandle">查看流程</li>
@@ -130,7 +164,7 @@
 <script setup lang="ts">
 import { type Component } from 'vue'
 import { useRoute } from 'vue-router'
-
+import { useProjectPermis } from '@/store/modules/projectPermis'
 import {
   getContractsByProject,
   startContractSign,
@@ -165,6 +199,8 @@ const switchComponent: (c: Component, i: number) => void = (c: Component, i: num
   currentComponent.value = c
   currentIndex.value = i
 }
+const projectPermis = useProjectPermis()
+projectPermis.initProjectPermis(projectId as string)
 /***
  * 查询项目详情
  * **/
@@ -292,7 +328,7 @@ const editorProject: () => void = (): void => {
   isEditorProject.value = !isEditorProject.value
   if (isEditorProject.value) return
   //@ts-ignore
-  dynamicRef.value.saveProjectHandle()
+  dynamicRef.value.saveProjectHandle(0)
 }
 
 /**

+ 1 - 1
client_h5/src/pages/leave/index.vue

@@ -122,7 +122,7 @@ const formData = ref({
   deptName: undefined,
   createTime: undefined,
   leaveNo: undefined,
-  leaveType: undefined,
+  leaveType: '11',
   leaveTypeText: undefined,
   leaveDays: undefined,
   leaveReason: undefined,