Browse Source

项目优化

songxy 1 year ago
parent
commit
8fe33cb0c4

+ 1 - 1
client/src/main.ts

@@ -57,7 +57,7 @@ window.addEventListener('message', (evt) => {
     const eData = JSON.parse(evt.data)
     const payload = eData.data
     if (eData.msgreceiveevent === 'closeTabByWindow') {
-      subscribe.emit('closeCurrentView', true)
+      subscribe.emit('closeCurrentView', null)
       return;
     }
     if (payload && payload['title']) {

+ 0 - 1
client/src/utils/Subscribe.ts

@@ -33,7 +33,6 @@ export class Subscribe {
     const i: number = this.isType(type)
     if (i === -1) throw new Error(`${type}未定义`)
     const currentEvent = this.events[i]
-    console.log(payload)
     currentEvent[type] = currentEvent['handle'](payload)
   }
   remove(type: string): void {

+ 1 - 1
client/src/views/OaSystem/home/components/CardItemSeven.vue

@@ -26,7 +26,7 @@ const queryContractMessageByPage = async (): Promise<void> => {
   loading.value = true
   const urlApi = `/contract-message/page`
   const sendData = {
-    // deptId: userStore.getUser.deptId,
+    deptId: userStore.getUser.deptId,
     year: year,
     messageType: 2
     // managerId: userStore.getUser.id

+ 1 - 2
client/src/views/OaSystem/home/components/LineChart.vue

@@ -7,13 +7,12 @@ import * as echarts from 'echarts'
  * 折线图
  */
 const chartData = [
-  { value: 20, name: '人力费用' },
   { value: 18, name: '差旅费用' },
   { value: 32, name: '办公费用' },
   { value: 30, name: '其他费用' }
 ]
 
-const xAxisData = ['人力费用', '差旅费用', '办公费用', '其他费用']
+const xAxisData = ['差旅费用', '办公费用', '其他费用']
 
 const options = {
   grid: {

+ 3 - 1
client/src/views/OaSystem/home/components/PersonInfo.vue

@@ -1,9 +1,11 @@
 <script setup lang="ts">
 import request from '@/config/axios'
 import BarList from './BarList.vue'
+import { getUserInfo } from '@/utils/tool'
 /**
  * 板块领导-人员情况
  */
+const userInfo = getUserInfo()
 interface ChartValueType {
   name: string
   value: number
@@ -77,7 +79,7 @@ const staffStatistic = reactive<{
   ]
 })
 const queryStaffStatistic = async (): Promise<void> => {
-  const urlApi = `/adm/staff-records/statistic/get`
+  const urlApi = `/adm/staff-records/statistic/get?deptId=${userInfo.deptId ?? ''}`
   const result = await request.get({ url: urlApi })
   staffNum.value = result.staffNum ?? 0
   if (result.sexStatistic) {

+ 2 - 2
client/src/views/OaSystem/marketCenter/khglPage/CustomerTable.vue

@@ -142,8 +142,8 @@ const newCustomer = (isAdd: boolean, row?) => {
   const params = !isAdd
     ? `/editCustomer?id=${row.id}&edit=true`
     : row
-      ? `/newCustomer?id=${row.id}`
-      : '/newCustomer'
+    ? `/newCustomer?id=${row.id}`
+    : '/newCustomer'
   push(params)
 }
 // 查看客户详情

+ 3 - 3
client/src/views/OaSystem/mineCenter/components/rightBox.vue

@@ -137,10 +137,10 @@ onMounted(() => {
 /**获取角标数值 */
 const fetchCount = async (): Promise<void> => {
   try {
-    const moneyRes = await getTUseMoneyCount()
     const loanRes = await getLoanCount()
-    rightTabsList.value[6].count = loanRes.data
-    rightTabsList.value[7].count = moneyRes.data
+    rightTabsList.value[5].count = loanRes
+    const moneyRes = await getTUseMoneyCount()
+    rightTabsList.value[6].count = moneyRes
   } catch (error) {
     console.error('error', error)
   }

+ 1 - 2
client/src/views/OaSystem/oaLayout/tagList.vue

@@ -254,8 +254,7 @@ const addTags = () => {
   return false
 }
 //订阅流程中关闭message事件
-subscribe.on('closeCurrentView', (payload) => {
-  if (!payload) return
+subscribe.on('closeCurrentView', () => {
   const view = vueRouter.currentRoute.value as RouteLocationNormalizedLoaded
   closeSelectedTag(view)
 })

+ 23 - 15
client/src/views/OaSystem/projectCenter/projectDetail/projectDetail.vue

@@ -22,22 +22,30 @@
             @click="editorProject"
             >{{ !isEditorProject ? '编辑' : '保存' }}
           </li>
-          <template
-            v-if="
-              (projectPermis.projectPermisState.all || projectPermis.projectPermisState.xsLeader) &&
-              projectDetail?.['isSign'] === 1
-            "
-          >
-            <dialog-confirm
-              title="是否发起合同签订流程?"
-              v-if="!signContract?.exist"
-              @confirm="handleStartContractSign"
+          <template v-if="projectDetail?.['isSign'] === 1">
+            <template
+              v-if="
+                (projectPermis.projectPermisState.all ||
+                  projectPermis.projectPermisState.xsLeader) &&
+                !signContract.flowStatus
+              "
             >
-              <template #reference>
-                <li>合同签订</li>
-              </template>
-            </dialog-confirm>
-            <li @click="processLookHandle(signContract.instanceId)">合同签订</li>
+              <dialog-confirm
+                title="是否发起合同签订流程?"
+                v-if="!signContract?.exist"
+                @confirm="handleStartContractSign"
+              >
+                <template #reference>
+                  <li>合同签订</li>
+                </template>
+              </dialog-confirm>
+              <li
+                v-else-if="signContract.flowStatus === 1"
+                @click="processLookHandle(signContract.instanceId)"
+              >
+                合同签订
+              </li>
+            </template>
           </template>
           <li
             v-if="projectPermis.projectPermisState.all || projectPermis.projectPermisState.xmLeader"

+ 169 - 0
client/src/views/system/role/ProcessDataPermissionForm.vue

@@ -0,0 +1,169 @@
+<template>
+  <Dialog v-model="dialogVisible" title="菜单权限" width="800">
+    <el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
+      <el-form-item label="角色名称">
+        <el-tag>{{ formData.name }}</el-tag>
+      </el-form-item>
+      <el-form-item label="角色标识">
+        <el-tag>{{ formData.code }}</el-tag>
+      </el-form-item>
+      <el-form-item label="权限范围">
+        <el-select v-model="formData.dataScope">
+          <el-option
+            v-for="item in getIntDictOptions(DICT_TYPE.SYSTEM_DATA_SCOPE)"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <el-form-item
+      v-if="formData.dataScope === SystemDataScopeEnum.DEPT_CUSTOM"
+      label="权限范围"
+      style="display: flex"
+    >
+      <el-card class="card" shadow="never">
+        <template #header>
+          全选/全不选:
+          <el-switch
+            v-model="treeNodeAll"
+            active-text="是"
+            inactive-text="否"
+            inline-prompt
+            @change="handleCheckedTreeNodeAll()"
+          />
+          全部展开/折叠:
+          <el-switch
+            v-model="deptExpand"
+            active-text="展开"
+            inactive-text="折叠"
+            inline-prompt
+            @change="handleCheckedTreeExpand"
+          />
+          父子联动(选中父节点,自动选择子节点):
+          <el-switch v-model="checkStrictly" active-text="是" inactive-text="否" inline-prompt />
+        </template>
+        <el-tree
+          ref="treeRef"
+          :check-strictly="!checkStrictly"
+          :data="deptOptions"
+          :props="defaultProps"
+          default-expand-all
+          empty-text="加载中,请稍后"
+          node-key="id"
+          show-checkbox
+        />
+      </el-card>
+    </el-form-item>
+    <template #footer>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script lang="ts" setup>
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { defaultProps, handleTree } from '@/utils/tree'
+import { SystemDataScopeEnum } from '@/utils/constants'
+import * as RoleApi from '@/api/system/role'
+import * as DeptApi from '@/api/system/dept'
+import * as PermissionApi from '@/api/system/permission'
+
+defineOptions({ name: 'SystemRoleDataPermissionForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formData = reactive({
+  id: 0,
+  name: '',
+  code: '',
+  dataScope: undefined,
+  dataScopeDeptIds: []
+})
+const formRef = ref() // 表单 Ref
+const deptOptions = ref<any[]>([]) // 部门树形结构
+const deptExpand = ref(false) // 展开/折叠
+const treeRef = ref() // 菜单树组件 Ref
+const treeNodeAll = ref(false) // 全选/全不选
+const checkStrictly = ref(true) // 是否严格模式,即父子不关联
+
+/** 打开弹窗 */
+const open = async (row: RoleApi.RoleVO) => {
+  dialogVisible.value = true
+  resetForm()
+  // 加载 Dept 列表。注意,必须放在前面,不然下面 setChecked 没数据节点
+  deptOptions.value = handleTree(await DeptApi.getSimpleDeptList())
+  // 设置数据
+  formData.id = row.id
+  formData.name = row.name
+  formData.code = row.code
+  formData.dataScope = row.dataScope
+  setTimeout(() => {
+    row.dataScopeDeptIds?.forEach((deptId: string) => {
+      treeRef.value.setChecked(deptId, true, false)
+    })
+  }, 100)
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  formLoading.value = true
+  try {
+    const data = {
+      roleId: formData.id,
+      dataScope: formData.dataScope,
+      dataScopeDeptIds:
+        formData.dataScope !== SystemDataScopeEnum.DEPT_CUSTOM
+          ? []
+          : treeRef.value.getCheckedKeys(false)
+    }
+    await PermissionApi.assignRoleDataScope(data)
+    message.success(t('common.updateSuccess'))
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  // 重置选项
+  treeNodeAll.value = false
+  deptExpand.value = false
+  checkStrictly.value = true
+  // 重置表单
+  formData.value = {
+    id: 0,
+    name: '',
+    code: '',
+    dataScope: undefined,
+    dataScopeDeptIds: []
+  }
+  treeRef.value?.setCheckedNodes([])
+  formRef.value?.resetFields()
+}
+
+/** 全选/全不选 */
+const handleCheckedTreeNodeAll = () => {
+  treeRef.value.setCheckedNodes(treeNodeAll.value ? deptOptions.value : [])
+}
+
+/** 展开/折叠全部 */
+const handleCheckedTreeExpand = () => {
+  const nodes = treeRef.value?.store.nodesMap
+  for (let node in nodes) {
+    if (nodes[node].expanded === deptExpand.value) {
+      continue
+    }
+    nodes[node].expanded = deptExpand.value
+  }
+}
+</script>

+ 18 - 1
client/src/views/system/role/index.vue

@@ -133,6 +133,16 @@
           >
             数据权限
           </el-button>
+          <el-button
+            v-hasPermi="['system:permission:assign-role-data-scope']"
+            link
+            preIcon="ep:coin"
+            title="流程权限"
+            type="primary"
+            @click="openProcessPermissionForm(scope.row)"
+          >
+            流程权限
+          </el-button>
           <el-button
             v-hasPermi="['system:role:delete']"
             link
@@ -159,6 +169,8 @@
   <RoleAssignMenuForm ref="assignMenuFormRef" @success="getList" />
   <!-- 表单弹窗:数据权限 -->
   <RoleDataPermissionForm ref="dataPermissionFormRef" @success="getList" />
+  <!-- 表单弹窗:流程权限 -->
+  <ProcessDataPermissionForm ref="processPermissionFormRef" @success="getList" />
 </template>
 <script lang="ts" setup>
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
@@ -168,6 +180,7 @@ import * as RoleApi from '@/api/system/role'
 import RoleForm from './RoleForm.vue'
 import RoleAssignMenuForm from './RoleAssignMenuForm.vue'
 import RoleDataPermissionForm from './RoleDataPermissionForm.vue'
+import ProcessDataPermissionForm from './ProcessDataPermissionForm.vue'
 
 defineOptions({ name: 'SystemRole' })
 
@@ -223,7 +236,11 @@ const dataPermissionFormRef = ref()
 const openDataPermissionForm = async (row: RoleApi.RoleVO) => {
   dataPermissionFormRef.value.open(row)
 }
-
+/** 流程权限操作 */
+const processPermissionFormRef = ref()
+const openProcessPermissionForm = async (row: RoleApi.RoleVO) => {
+  processPermissionFormRef.value.open(row)
+}
 /** 菜单权限操作 */
 const assignMenuFormRef = ref()
 const openAssignMenuForm = async (row: RoleApi.RoleVO) => {

+ 1 - 1
client_h5/index.html

@@ -6,7 +6,7 @@
     <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1">
     <script src='https://cdn.bootcss.com/vConsole/3.3.2/vconsole.min.js'></script>
     <script type="text/javascript">
-      // window.vConsole = new window.VConsole()
+      window.vConsole = new window.VConsole()
       window.locationBaseUrl = "/html_h5"
     </script>
     <title></title>