Prechádzať zdrojové kódy

fix: 🐛 修复角色管理跟薪资统计的问题

@sun-chaoqun 2 rokov pred
rodič
commit
734cdcfac3

+ 2 - 0
.env

@@ -2,4 +2,6 @@ VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
 
 VITE_BZD_ERP_APP_API = 'https://erp.baozhida.cn'
 
+VITE_BZD_ERPOSS_APP_API = 'https://erposs.baozhida.cn'
+
 VITE_DROP_CONSOLE = true    

+ 2 - 0
.env.production

@@ -2,4 +2,6 @@ VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
 
 VITE_BZD_ERP_APP_API = 'https://erp.baozhida.cn'
 
+VITE_BZD_ERPOSS_APP_API = 'https://erposs.baozhida.cn'
+
 VITE_DROP_CONSOLE = true

+ 1 - 0
components.d.ts

@@ -52,6 +52,7 @@ declare module '@vue/runtime-core' {
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
+    ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     Loading: typeof import('./src/components/Loading/index.vue')['default']
     Pagination: typeof import('./src/components/TableBase/components/Pagination.vue')['default']

+ 1 - 1
package.json

@@ -5,7 +5,7 @@
   "type": "module",
   "scripts": {
     "dev": "vite",
-    "build": "vue-tsc && vite build",
+    "build": "vue-tsc && vite build --mode production",
     "preview": "vite preview"
   },
   "dependencies": {

+ 1 - 1
src/api/index.ts

@@ -14,7 +14,7 @@ let loadingInstance: LoadingType = {}
 
 const config = {
   // 默认地址请求地址,可在 .env.*** 文件中修改
-  baseURL: import.meta.env.VITE_BZD_ERP_APP_API as string,
+  // baseURL: import.meta.env.VITE_BZD_ERP_APP_API as string,
   // 设置超时时间(10s)
   timeout: ResultEnum.TIMEOUT as number,
   // 跨域时候允许携带凭证

+ 6 - 2
src/components/TableBase/index.vue

@@ -85,21 +85,25 @@ defineExpose({
           :align="item.align ?? 'center'"
           :reserve-selection="item.type == 'selection'"
           v-if="item.type == 'selection' || item.type == 'index'"
-        >
-        </el-table-column>
+        ></el-table-column>
         <!-- expand 支持 tsx 语法 && 作用域插槽 (tsx > slot) -->
         <el-table-column v-bind="item" :align="item.align ?? 'center'" v-if="item.type === 'expand'" v-slot="scope">
           <component :is="item.render" :row="scope.row" v-if="item.render"> </component>
           <slot :name="item.type" :row="scope.row" v-else></slot>
         </el-table-column>
+        <!-- 普通渲染 -->
         <el-table-column
           v-bind="item"
           :align="item.align ?? 'center'"
           v-if="!item.type && item.prop && item.name !== item.prop"
           v-slot="scope"
         >
+          <el-tooltip v-if="item.ellipsis" effect="dark" :content="scope.row[item.prop]" placement="bottom">
+            {{ scope.row[item.prop] }}
+          </el-tooltip>
           <slot v-if="item.fixed" :name="item.fixed" :row="scope.row"></slot>
         </el-table-column>
+        <!-- 自定义slot -->
         <el-table-column
           v-bind="item"
           :align="item.align ?? 'center'"

+ 1 - 0
src/components/TableBase/interface/index.ts

@@ -43,5 +43,6 @@ export interface ColumnProps<T = any>
   headerRender?: (row: ColumnProps) => any // 自定义表头内容渲染(tsx语法)
   render?: (scope: { row: T }) => any // 自定义单元格内容渲染(tsx语法)
   name?: string
+  ellipsis?: boolean
   _children?: ColumnProps<T>[] // 多级表头
 }

+ 31 - 5
src/components/dialog/Dialog.vue

@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { ref, toRefs } from 'vue'
+import { ref } from 'vue'
 const dialogVisible = ref(false)
 interface DialogProps {
   width: string
@@ -7,9 +7,8 @@ interface DialogProps {
 withDefaults(defineProps<DialogProps>(), {
   width: '50%'
 })
-// const { dialogVisible } = toRefs(props)
 
-const emit = defineEmits<{ (e: 'on-close', value: boolean): void }>()
+defineEmits<{ (e: 'on-close', value: boolean): void }>()
 
 const DialogOpen = () => {
   dialogVisible.value = true
@@ -25,7 +24,7 @@ defineExpose({
 </script>
 
 <template>
-  <el-dialog v-model="dialogVisible" @close="DialogClose" @closed="DialogClose" :width="width">
+  <el-dialog v-model="dialogVisible" @close="DialogClose" @closed="DialogClose" :width="width" class="bottomD">
     <!-- 默认插槽 -->
     <slot></slot>
     <!-- 弹框头部 -->
@@ -39,4 +38,31 @@ defineExpose({
   </el-dialog>
 </template>
 
-<style scoped></style>
+<style scoped>
+.bottomD {
+  animation: anim-open 1s linear !important;
+}
+
+@keyframes anim-open {
+  0% {
+    transform: translate3d(100%, 0, 0);
+    opacity: 0;
+  }
+  25% {
+    transform: translate3d(60%, 0, 0);
+    opacity: 0.5;
+  }
+  50% {
+    transform: translate3d(15%, 0, 0);
+    opacity: 0.9;
+  }
+  75% {
+    transform: translate3d(5%, 0, 0);
+    opacity: 0.95;
+  }
+  100% {
+    transform: translate3d(0, 0, 0);
+    opacity: 1;
+  }
+}
+</style>

+ 25 - 0
src/router/modules/asyncRouter.ts

@@ -0,0 +1,25 @@
+// 动态路由
+import { GlobalStore } from '@/stores/index'
+import router from '@/routers/index'
+import { staticRouter } from './staticRouter'
+// 加载views下面所有的.vue文件
+const modules = import.meta.glob('@/views/**/*.vue')
+
+export const asyncRouter = () => {
+  console.log(modules)
+
+  return []
+}
+
+/**
+ * 初始化动态路由
+ */
+export const initDynamicRouter = async () => {
+  const globalStore = GlobalStore()
+  try {
+    // 1.获取菜单列表 && 用户信息
+    await globalStore.SET_UserInfo()
+    await globalStore.SET_Menu_User_List()
+    // 2.判断当前用户有没有菜单权限
+  } catch (error) {}
+}

+ 81 - 83
src/router/modules/staticRouter.ts

@@ -39,90 +39,88 @@ export const staticRouter: RouteRecordRaw[] = [
           title: '账户管理',
           icon: '\ue6a1'
         }
-      },
-      {
-        path: '/salary',
-        name: 'Salary',
-        component: () => import('@/views/salary/salary/Salary.vue'),
-        meta: {
-          title: '薪资管理',
-          icon: '\ue7cd'
-        }
-      },
-      {
-        path: '/salaryCount',
-        name: 'SalaryCount',
-        component: () => import('@/views/salary/SalaryCount.vue'),
-        meta: {
-          title: '薪资统计',
-          icon: '\ue831'
-        }
-      },
-      {
-        path: '/salaryMy',
-        name: 'SalaryMy',
-        component: () => import('@/views/salary/SalaryMy.vue'),
-        meta: {
-          title: '我的薪资',
-          icon: '\ue7d1'
-        }
-      },
-      {
-        path: '/records',
-        name: 'Records',
-        component: () => import('@/views/workAttendance/records/Records.vue'),
-        meta: {
-          title: '统筹管理',
-          icon: 'DocumentCopy'
-        }
-      },
-      {
-        path: '/recordsFinance',
-        name: 'RecordsFinance',
-        component: () => import('@/views/workAttendance/RecordsFinance.vue'),
-        meta: {
-          title: '统筹管理(财务)',
-          icon: 'Notebook'
-        }
-      },
-      {
-        path: '/overtime',
-        name: 'Overtime',
-        component: () => import('@/views/workAttendance/Overtime.vue'),
-        meta: {
-          title: '加班审批',
-          icon: '\ue690'
-        }
-      },
-      {
-        path: '/leave',
-        name: 'Leave',
-        // component: () => import('@/views/workAttendance/Leave.vue'),
-        component: () => import('../../views/workAttendance/Leave.vue'),
-        meta: {
-          title: '请假审批',
-          icon: '\ue627'
-        }
-      },
-      {
-        path: '/myOvertime',
-        name: ' MyOvertime',
-        // component: () => import('@/views/workAttendance/MyOvertime.vue'),
-        component: () => import('../../views/workAttendance/MyOvertime.vue'),
-        meta: {
-          title: '我的加班',
-          icon: '\ue64c'
-        }
-      },
-      {
-        path: '/myLeave',
-        name: 'MyLeave',
-        component: () => import('@/views/workAttendance/MyLeave.vue'),
-        meta: {
-          title: '我的请假',
-          icon: '\ue6aa'
-        }
       }
+      // {
+      //   path: '/salary',
+      //   name: 'Salary',
+      //   component: () => import('@/views/salary/salary/Salary.vue'),
+      //   meta: {
+      //     title: '薪资管理',
+      //     icon: '\ue7cd'
+      //   }
+      // },
+      // {
+      //   path: '/salaryCount',
+      //   name: 'SalaryCount',
+      //   component: () => import('@/views/salary/SalaryCount.vue'),
+      //   meta: {
+      //     title: '薪资统计',
+      //     icon: '\ue831'
+      //   }
+      // },
+      // {
+      //   path: '/salaryMy',
+      //   name: 'SalaryMy',
+      //   component: () => import('@/views/salary/SalaryMy.vue'),
+      //   meta: {
+      //     title: '我的薪资',
+      //     icon: '\ue7d1'
+      //   }
+      // },
+      // {
+      //   path: '/records',
+      //   name: 'Records',
+      //   component: () => import('@/views/workAttendance/records/Records.vue'),
+      //   meta: {
+      //     title: '统筹管理',
+      //     icon: 'DocumentCopy'
+      //   }
+      // },
+      // {
+      //   path: '/recordsFinance',
+      //   name: 'RecordsFinance',
+      //   component: () => import('@/views/workAttendance/RecordsFinance.vue'),
+      //   meta: {
+      //     title: '统筹管理(财务)',
+      //     icon: 'Notebook'
+      //   }
+      // },
+      // {
+      //   path: '/overtime',
+      //   name: 'Overtime',
+      //   component: () => import('@/views/workAttendance/Overtime.vue'),
+      //   meta: {
+      //     title: '加班审批',
+      //     icon: '\ue690'
+      //   }
+      // },
+      // {
+      //   path: '/leave',
+      //   name: 'Leave',
+      //   component: () => import('../../views/workAttendance/Leave.vue'),
+      //   meta: {
+      //     title: '请假审批',
+      //     icon: '\ue627'
+      //   }
+      // },
+      // {
+      //   path: '/myOvertime',
+      //   name: ' MyOvertime',
+      //   component: () => import('../../views/workAttendance/MyOvertime.vue'),
+      //   meta: {
+      //     title: '我的加班',
+      //     icon: '\ue64c'
+      //   }
+      // },
+      // {
+      //   path: '/myLeave',
+      //   name: 'MyLeave',
+      //   component: () => import('@/views/workAttendance/MyLeave.vue'),
+      //   meta: {
+      //     title: '我的请假',
+      //     icon: '\ue6aa'
+      //   }
+      // }
     ]
   },
   {

+ 16 - 4
src/stores/index.ts

@@ -1,8 +1,11 @@
 import { defineStore, createPinia } from 'pinia'
 import { GlobalState } from './interface/index'
-import { User_Dept_List, User_Post_List } from '@/api/user/index'
 import { Menu_User_List } from '@/api/role/index'
+import { User_Info } from '@/api/user/index'
+import { isEmptyObject } from '@/utils/common'
+import { User_Dept_List, User_Post_List } from '@/api/user/index'
 import { getAllBreadcrumbList, hanlderMenuList } from '@/utils/common'
+
 export const GlobalStore = defineStore({
   id: 'GlobalState',
   state: (): GlobalState => ({
@@ -40,9 +43,9 @@ export const GlobalStore = defineStore({
       })
       this.breadcrumb = map
     },
-    SET_User_Info(payload: any) {
-      this.userInfo = payload
-    },
+    // SET_User_Info(payload: any) {
+    //   this.userInfo = payload
+    // },
     SET_Path(payload: string) {
       this.path = payload
     },
@@ -54,6 +57,15 @@ export const GlobalStore = defineStore({
       const res = await User_Post_List()
       console.log(res)
     },
+    async SET_UserInfo() {
+      // 如果以及有用户数据,则不请求
+      if (!isEmptyObject(this.GET_User_Info)) return
+      const res: any = await User_Info({ User_tokey: this.GET_User_tokey })
+      if (res.Code === 200) {
+        this.userInfo = res.Data
+        localStorage.setItem('User_info', JSON.stringify(res.Data))
+      }
+    },
     async SET_Menu_User_List() {
       const res: any = await Menu_User_List({ User_tokey: this.GET_User_tokey })
       if (res.Code === 200) {

+ 4 - 0
src/styles/element.scss

@@ -22,3 +22,7 @@
     width: 100% !important;
   }
 }
+
+.el-table .cell {
+  white-space: nowrap !important;
+}

+ 0 - 1
src/utils/common.ts

@@ -56,7 +56,6 @@ export const hanlderMenuList = (menuList: any) => {
  * @param time
  */
 export const getFormatDuration = (time: number) => {
-  console.log(time)
   let hour = 0
   let minute = 0
   let result = ''

+ 5 - 31
src/views/Index.vue

@@ -3,25 +3,11 @@ import { ref, onMounted } from 'vue'
 import SubMenu from '@/layouts/Menu/SubMenu.vue'
 import Main from '@/layouts/Main/index.vue'
 import Header from '@/layouts/Header/index.vue'
-// import { Menu_User_List } from '@/api/role/index'
-import { User_Info } from '@/api/user/index'
 import { GlobalStore } from '@/stores/index'
 import { useRoute } from 'vue-router'
-import { isEmptyObject } from '@/utils/common'
+import { initDynamicRouter } from '@/router/modules/asyncRouter'
 
 const globalStore = GlobalStore()
-// const getMenu = async () => {
-//   const res = await Menu_User_List({ User_tokey: globalStore.GET_User_tokey })
-//   console.log(res)
-// }
-// getMenu()
-const getUserInfo = async () => {
-  const res: any = await User_Info({ User_tokey: globalStore.GET_User_tokey })
-  if (res.Code === 200) {
-    globalStore.SET_User_Info(res.Data)
-    localStorage.setItem('User_info', JSON.stringify(res.Data))
-  }
-}
 
 const routerList = [
   {
@@ -179,30 +165,19 @@ const routerList = [
 
 onMounted(() => {
   globalStore.SET_User_Dept_List()
-  globalStore.SET_Menu_User_List()
-  if (!isEmptyObject(globalStore.GET_User_Info)) {
-    getUserInfo()
-  }
+  initDynamicRouter()
+  // if (!isEmptyObject(globalStore.GET_User_Info)) {
+  //   getUserInfo()
+  // }
 })
 
 const route = useRoute()
 const defaultActive = ref<string>(route.path)
-
-// const handleOpen = (key: string, keyPath: string[]) => {
-//   // console.log(key, keyPath)
-//   // keyPath.push(defaultActive.value)
-//   globalStore.SET_Breadcrumb(keyPath)
-// }
-// const handleClose = (key: string, keyPath: string[]) => {
-//   // console.log(key, keyPath)
-// }
 </script>
 
 <template>
   <el-container class="home-container">
     <el-aside>
-      <!-- <h1 style="color: #fff; text-align: center; margin: 20px; font-size: 32px">ERP系统</h1> -->
-      <!-- text-color="#303133" -->
       <div class="menu" :style="{ width: globalStore.GET_isCollapse ? '65px' : '210px' }">
         <el-scrollbar>
           <el-menu
@@ -257,7 +232,6 @@ const defaultActive = ref<string>(route.path)
   .el-header {
     display: flex;
     align-items: center;
-    // border-bottom: solid 2px var(--el-menu-border-color);
     z-index: 10;
     box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.5);
   }

+ 55 - 63
src/views/account/roles/Roles.vue

@@ -1,7 +1,4 @@
 <script setup lang="ts">
-import { ref, reactive, nextTick } from 'vue'
-import TableBase from '@/components/TableBase/index.vue'
-import type { ColumnProps } from '@/components/TableBase/interface/index'
 import {
   User_Power_List,
   User_Sys_List,
@@ -11,22 +8,41 @@ import {
   User_Power_Edit,
   User_Power_Edit_Menu
 } from '@/api/role/index'
-import { Edit, Delete, Operation } from '@element-plus/icons-vue'
-import Dialog from '@/components/dialog/Dialog.vue'
-import Drawer from '@/components/Drawer/index.vue'
 import { GlobalStore } from '@/stores/index'
+import { ref, reactive, nextTick } from 'vue'
+import Drawer from '@/components/Drawer/index.vue'
+import Dialog from '@/components/dialog/Dialog.vue'
+import TableBase from '@/components/TableBase/index.vue'
 import type { FormInstance, FormRules } from 'element-plus'
+import type { ColumnProps } from '@/components/TableBase/interface/index'
+import { Edit, Delete, Operation } from '@element-plus/icons-vue'
 import { ElNotification, ElMessageBox, ElMessage } from 'element-plus'
 
-const globalStore = GlobalStore()
-// 权限
-const dialog = ref()
-const TableRef = ref()
+interface InSys {
+  T_sys: string
+  T_name: string
+  children: any
+  checkList: string[]
+}
+
+const isNew = ref(true)
 let currentVal: any = {}
+const SysList = ref<InSys[]>([])
+const globalStore = GlobalStore()
+const formLabelWidth = ref('80px')
+const ruleFormRef = ref<FormInstance>()
+const dialog = ref<InstanceType<typeof Dialog> | null>(null)
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const initParam = {
+  User_tokey: globalStore.GET_User_tokey,
+  T_name: ''
+}
+
 const DialogOpen = async (row: any) => {
   currentVal = row
   await getSysList()
-  dialog.value.DialogOpen()
+  dialog.value?.DialogOpen()
 }
 
 const checkList = ref<string[]>([])
@@ -37,14 +53,6 @@ const columns: ColumnProps[] = [
   { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
 ]
 
-interface InSys {
-  T_sys: string
-  T_name: string
-  children: any
-  checkList: string[]
-}
-
-let SysList = ref<InSys[]>([])
 const getSysList = async () => {
   const { Data } = await User_Sys_List({ User_tokey: globalStore.GET_User_tokey })
   SysList.value = Data as InSys[]
@@ -52,8 +60,8 @@ const getSysList = async () => {
     getMenuList(item.T_sys)
   }
 }
+
 const getMenuList = async (code: string) => {
-  // User_Power_Get
   const res: any = await User_Power_Get({ User_tokey: globalStore.GET_User_tokey, T_code: code, T_id: currentVal.T_id })
   const sys = SysList.value.find(item => item.T_sys === code) as InSys
   sys.children = res.Data.Menu[0].Children
@@ -65,18 +73,15 @@ const getMenuList = async (code: string) => {
     sys.checkList = []
   }
 }
+
 const submitUserRole = async (item: InSys) => {
   let Sys: any = SysList.value.find(sys => item.T_sys === sys.T_sys)
   let childs = Sys?.children.filter((child: InSys) => Sys.checkList.includes(child.T_name))
   let T_menu = ''
-  if (childs.length > 1) {
-    childs.forEach((f: any) => {
-      let str = 'M' + f.Id + '|'
-      T_menu += str
-    })
-  } else {
-    T_menu = 'M' + childs[0].Id
-  }
+  childs.forEach((f: any) => {
+    let str = 'M' + f.Id + '|'
+    T_menu += str
+  })
   const params = {
     User_tokey: globalStore.GET_User_tokey,
     T_id: currentVal.T_id,
@@ -86,48 +91,41 @@ const submitUserRole = async (item: InSys) => {
 
   const res = await User_Power_Edit_Menu(params)
   if (res.Code === 200) {
-    ElMessage({
-      type: 'success',
-      message: '修改成功!'
-    })
-    dialog.value.DialogClose()
+    ElMessage.success('修改成功!')
+    dialog.value?.DialogClose()
     checkList.value = []
   }
 }
 
-const initParam = {
-  User_tokey: globalStore.GET_User_tokey,
-  T_name: ''
-}
-
 // 添加角色
-const drawerRef = ref()
-const ruleFormRef = ref<FormInstance>()
-const formLabelWidth = ref('80px')
-const isNew = ref(true)
+type Fn = () => void
+const form = reactive({
+  name: '',
+  id: ''
+})
+
 const rules = reactive<FormRules>({
   name: [{ required: true, message: '请输入角色名称', trigger: 'blur' }]
 })
-type Fn = () => void
+
 const callbackDrawer = (done: Fn) => {
   resetForm(ruleFormRef.value)
   done()
 }
+
 const openDrawer = (type: string, row?: any) => {
   isNew.value = type === 'new' ? true : false
   nextTick(() => {
     !isNew.value && ((form.name = row.T_name), (form.id = row.T_id))
   })
-  drawerRef.value.openDrawer()
+  drawerRef.value?.openDrawer()
 }
-const form = reactive({
-  name: '',
-  id: ''
-})
+
 const resetForm = (formEl: FormInstance | undefined) => {
   if (!formEl) return
   formEl.resetFields()
 }
+
 const AddUserName = (formEl: FormInstance | undefined) => {
   if (!formEl) return
   formEl.validate(async valid => {
@@ -145,8 +143,8 @@ const AddUserName = (formEl: FormInstance | undefined) => {
           position: 'bottom-right'
         })
         nextTick(() => {
-          drawerRef.value.closeDrawer()
-          TableRef.value.getTableList()
+          drawerRef.value?.closeDrawer()
+          TableRef.value?.getTableList()
           resetForm(ruleFormRef.value)
           isNew.value = true
         })
@@ -167,20 +165,14 @@ const UserDelete = (row: any) => {
     .then(async () => {
       const res: any = await User_Power_Del({ User_tokey: globalStore.GET_User_tokey, T_id: row.T_id })
       if (res.Code === 200) {
-        ElMessage({
-          type: 'success',
-          message: '删除成功!'
-        })
+        ElMessage.success('删除成功!')
         nextTick(() => {
-          TableRef.value.getTableList()
+          TableRef.value?.getTableList()
         })
       }
     })
     .catch(() => {
-      ElMessage({
-        type: 'warning',
-        message: '取消成功!'
-      })
+      ElMessage.warning('取消成功!')
     })
 }
 
@@ -188,7 +180,7 @@ const UserDelete = (row: any) => {
 const search = ref('')
 const searchHandle = () => {
   initParam.T_name = search.value
-  TableRef.value.searchTable()
+  TableRef.value?.searchTable()
 }
 </script>
 
@@ -268,16 +260,16 @@ const searchHandle = () => {
 /* fade-transform */
 .fade-transform-leave-active,
 .fade-transform-enter-active {
-  transition: all 0.2s;
+  transition: all 0.5s;
 }
 .fade-transform-enter-from {
   opacity: 0;
-  transition: all 0.2s;
+  transition: all 0.5s;
   transform: translateY(-30px);
 }
 .fade-transform-leave-to {
   opacity: 0;
-  transition: all 0.2s;
+  transition: all 0.5s;
   transform: translateY(30px);
 }
 </style>

+ 35 - 39
src/views/account/users/Users.vue

@@ -1,42 +1,48 @@
 <script setup lang="ts">
-import TableBase from '@/components/TableBase/index.vue'
-import { ColumnProps } from '@/components/TableBase/interface/index'
-import { Edit, Delete } from '@element-plus/icons-vue'
 import { ref, nextTick } from 'vue'
 import { GlobalStore } from '@/stores/index'
-import { User_List, User_Del } from '@/api/user/index'
 import DrawerFrom from './components/DrawerFrom.vue'
+import TableBase from '@/components/TableBase/index.vue'
+import { Edit, Delete } from '@element-plus/icons-vue'
+import { User_List, User_Del } from '@/api/user/index'
 import { ElMessage, ElMessageBox } from 'element-plus'
-const globalStore = GlobalStore()
+import { ColumnProps } from '@/components/TableBase/interface/index'
+
 const action = ref(true)
-const drawerFromRef = ref()
-const TableRef = ref()
+const globalStore = GlobalStore()
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const drawerFromRef = ref<InstanceType<typeof DrawerFrom> | null>(null)
+const initParam = {
+  User_tokey: globalStore.GET_User_tokey,
+  T_name: ''
+}
+
 const columns: ColumnProps[] = [
-  { type: 'index', label: '#', width: 80 },
-  { prop: 'T_name', label: '姓名', search: { el: 'input' } },
-  { prop: 'T_post_name', label: '职位' },
-  { prop: 'T_dept_name', label: '部门' },
-  { prop: 'T_phone', label: '联系电话' },
+  { type: 'index', label: '#', width: 80, fixed: 'left' },
+  { prop: 'T_name', label: '姓名', width: 120, fixed: 'left', name: 'T_name' },
+  { prop: 'T_post_name', label: '职位', ellipsis: true },
+  { prop: 'T_dept_name', label: '部门', ellipsis: true },
+  { prop: 'T_phone', label: '联系电话', ellipsis: true, width: 100 },
   { prop: 'T_nation', label: '民族' },
   { prop: 'T_sex', label: '性别', name: 'T_sex' },
-  { prop: 'T_school', label: '毕业院校' },
-  { prop: 'T_major', label: '专业' },
+  { prop: 'T_school', label: '毕业院校', ellipsis: true, width: 100 },
+  { prop: 'T_major', label: '专业', ellipsis: true },
   { prop: 'T_education', label: '学历' },
-  { prop: 'T_entry_time', label: '入职时间' },
-  { prop: 'T_positive_time', label: '转正时间' },
-  { prop: 'T_entry_type', label: '入职类型', name: 'T_entry_type' },
-  { prop: 'T_contract_start_time', label: '劳动合同开始时间' },
-  { prop: 'T_contract_end_time', label: '劳动合同结束时间' },
-  { prop: 'T_expire', label: '是否到期', name: 'T_expire' },
+  { prop: 'T_entry_time', label: '入职时间', ellipsis: true, width: 100 },
+  { prop: 'T_positive_time', label: '转正时间', ellipsis: true, width: 100 },
+  { prop: 'T_entry_type', label: '入职类型', name: 'T_entry_type', width: 100 },
+  { prop: 'T_contract_start_time', label: '劳动合同开始时间', width: 160 },
+  { prop: 'T_contract_end_time', label: '劳动合同结束时间', width: 160 },
+  { prop: 'T_expire', label: '是否到期', name: 'T_expire', width: 100 },
   { prop: 'T_marry', label: '婚否', name: 'T_marry' },
   { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
 ]
 const openDrawerFrom = () => {
-  drawerFromRef.value.openDrawer()
+  drawerFromRef.value?.openDrawer()
 }
 
 const UpdateTableList = () => {
-  TableRef.value.getTableList()
+  TableRef.value?.getTableList()
 }
 
 const UpdateAction = (val: boolean) => {
@@ -45,8 +51,8 @@ const UpdateAction = (val: boolean) => {
 
 const EditUserInfo = (row: any) => {
   action.value = false
-  drawerFromRef.value.openDrawer()
-  drawerFromRef.value.DataEcho(row)
+  drawerFromRef.value?.openDrawer()
+  drawerFromRef.value?.DataEcho(row)
 }
 const DeleteUserInfo = (row: any) => {
   ElMessageBox.confirm('您确定要删除吗?', '警告', {
@@ -57,20 +63,14 @@ const DeleteUserInfo = (row: any) => {
     .then(async () => {
       const res: any = await User_Del({ User_tokey: globalStore.GET_User_tokey, T_uuid: row.T_uuid })
       if (res.Code === 200) {
-        ElMessage({
-          type: 'success',
-          message: '删除成功!'
-        })
+        ElMessage.success('删除成功!')
         nextTick(() => {
-          TableRef.value.getTableList()
+          TableRef.value?.getTableList()
         })
       }
     })
     .catch(() => {
-      ElMessage({
-        type: 'warning',
-        message: '取消成功!'
-      })
+      ElMessage.warning('取消成功!')
     })
 }
 
@@ -78,12 +78,7 @@ const DeleteUserInfo = (row: any) => {
 const search = ref<string>('')
 const SearchInfo = () => {
   initParam.T_name = search.value
-  TableRef.value.searchTable()
-}
-
-const initParam = {
-  User_tokey: globalStore.GET_User_tokey,
-  T_name: ''
+  TableRef.value?.searchTable()
 }
 </script>
 
@@ -102,6 +97,7 @@ const initParam = {
           </el-row>
         </div>
       </template>
+      <template #T_name="{ row }">{{ row.T_name }}</template>
       <template #T_sex="{ row }">
         <el-tag class="ml-2" type="success" v-if="row.T_sex === 1">男</el-tag>
         <el-tag class="ml-2" type="danger" v-else>女</el-tag>

+ 63 - 39
src/views/account/users/components/DrawerFrom.vue

@@ -1,33 +1,42 @@
 <script setup lang="ts">
-import { ref, reactive, onMounted, nextTick } from 'vue'
+import md5 from 'js-md5'
+import { ElMessage } from 'element-plus'
+import { reuls_validator } from './relus'
+import { GlobalStore } from '@/stores/index'
 import Drawer from '@/components/Drawer/index.vue'
 import { User_Power_List } from '@/api/role/index'
-import { User_Post_List, User_Add, User_Edit } from '@/api/user/index'
-import { GlobalStore } from '@/stores/index'
+import { ref, reactive, onMounted, nextTick } from 'vue'
 import type { FormInstance, FormRules } from 'element-plus'
-import { ElMessage } from 'element-plus'
-import { reuls_validator } from './relus'
-import md5 from 'js-md5'
+import { User_Post_List, User_Add, User_Edit } from '@/api/user/index'
 
-const globalStore = GlobalStore()
-const _PASS = '******'
-let userPowerList: any = []
-const getUserPowerList = async () => {
-  const res: any = await User_Power_List({ User_tokey: globalStore.GET_User_tokey, page: 1, page_z: 9999 })
-  userPowerList = res.Data.Data
-}
-let userPostList = ref<any>([])
-const changeDept = async (val: number) => {
-  const res = await User_Post_List({ T_dept: val })
-  userPostList.value = res.Data
+type Fn = () => void
+interface PropsType {
+  action: boolean
 }
-const resetForm = (formEl: FormInstance | undefined) => {
-  if (!formEl) return
-  formEl.resetFields()
+
+const validate_checkPass = (rule: any, value: any, callback: any) => {
+  if (checkPass.value === '') {
+    callback(new Error('请再输入一次密码'))
+  } else if (checkPass.value !== form.value.T_pass) {
+    callback(new Error('两次密码校验不一致'))
+  } else {
+    callback()
+  }
 }
+
+const checkPass = ref('')
 const formRef = ref()
-const drawerRef = ref()
-const formLabelWidth = ref('95px')
+const _PASS = '******'
+let userPowerList: any = []
+let userPostList = ref<any[]>([])
+const globalStore = GlobalStore()
+const formLabelWidth = ref('105px')
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+const rules = reactive<FormRules>({
+  ...reuls_validator,
+  checkPass: [{ required: true, validator: validate_checkPass, trigger: 'blur' }]
+})
+
 let form = ref({
   T_power: '',
   T_name: '',
@@ -54,8 +63,27 @@ let form = ref({
   T_expire: '',
   T_dept_leader: ''
 })
-const rules = reactive<FormRules>(reuls_validator)
-type Fn = () => void
+
+const getUserPowerList = async () => {
+  const params = {
+    User_tokey: globalStore.GET_User_tokey,
+    page: 1,
+    page_z: 9999
+  }
+  const res: any = await User_Power_List(params)
+  userPowerList = res.Data.Data
+}
+
+const changeDept = async (val: number) => {
+  const res: any = await User_Post_List({ T_dept: val })
+  userPostList.value = res.Data
+}
+
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+
 const callbackDrawer = (done: Fn) => {
   done()
   nextTick(() => {
@@ -64,7 +92,7 @@ const callbackDrawer = (done: Fn) => {
 }
 
 const openDrawer = () => {
-  drawerRef.value.openDrawer()
+  drawerRef.value?.openDrawer()
 }
 const AddUser = (formEl: FormInstance | undefined) => {
   if (!formEl) return
@@ -79,12 +107,9 @@ const AddUser = (formEl: FormInstance | undefined) => {
         res = await User_Edit(form.value)
       }
       if (res.Code === 200) {
-        ElMessage({
-          type: 'success',
-          message: `${props.action ? '添加' : '编辑'}成功!`
-        })
+        ElMessage.success(`${props.action ? '添加' : '编辑'}成功!`)
         nextTick(() => {
-          drawerRef.value.closeDrawer()
+          drawerRef.value?.closeDrawer()
           emit('onTableList')
           resetForm(formRef.value)
           emit('onaction', true)
@@ -99,7 +124,7 @@ const AddUser = (formEl: FormInstance | undefined) => {
 const DataEcho = async (row: any) => {
   row.T_entry_type = +row.T_entry_type
   row.T_pass = _PASS
-  const res = await User_Post_List({ T_dept: row.T_dept })
+  const res: any = await User_Post_List({ T_dept: row.T_dept })
   userPostList.value = res.Data
   nextTick(() => {
     form.value = { ...row }
@@ -113,10 +138,6 @@ onMounted(() => {
 })
 
 const emit = defineEmits<{ (event: 'onTableList'): void; (event: 'onaction', val: boolean): void }>()
-
-interface PropsType {
-  action: boolean
-}
 const props = defineProps<PropsType>()
 defineExpose({
   openDrawer,
@@ -150,6 +171,9 @@ defineExpose({
       <el-form-item label="密码:" :label-width="formLabelWidth" prop="T_pass">
         <el-input v-model="form.T_pass" type="password" autocomplete="off" placeholder="密码" />
       </el-form-item>
+      <el-form-item label="确认密码:" :label-width="formLabelWidth" prop="checkPass">
+        <el-input v-model="checkPass" type="password" autocomplete="off" placeholder="确认密码" />
+      </el-form-item>
       <el-form-item label="部门:" :label-width="formLabelWidth" prop="T_dept">
         <el-select v-model="form.T_dept" placeholder="请选择部门" @change="changeDept">
           <el-option v-for="item in globalStore.GET_Dept_List" :key="item.Id" :label="item.T_name" :value="item.Id" />
@@ -212,10 +236,10 @@ defineExpose({
           value-format="YYYY-MM-DD"
         />
       </el-form-item>
-      <el-form-item label="配偶姓名:" :label-width="formLabelWidth">
+      <el-form-item label="配偶姓名:" label-width="120px">
         <el-input v-model="form.T_spouse_name" autocomplete="off" placeholder="配偶姓名" />
       </el-form-item>
-      <el-form-item label="配偶联系电话:" label-width="110px">
+      <el-form-item label="配偶联系电话:" label-width="120px">
         <el-input v-model="form.T_spouse_phone" autocomplete="off" placeholder="配偶联系电话" />
       </el-form-item>
       <el-form-item label="入职类型:" :label-width="formLabelWidth" prop="T_entry_type">
@@ -225,7 +249,7 @@ defineExpose({
           <el-radio :label="3">实习生</el-radio>
         </el-radio-group>
       </el-form-item>
-      <el-form-item label="劳动合同开始时间:" label-width="150px" prop="T_contract_start_time">
+      <el-form-item label="劳动合同开始时间:" label-width="160px" prop="T_contract_start_time">
         <el-date-picker
           style="width: 100%"
           class="my-date-picker"
@@ -236,7 +260,7 @@ defineExpose({
           value-format="YYYY-MM-DD"
         />
       </el-form-item>
-      <el-form-item label="劳动合同结束时间:" label-width="150px" prop="T_contract_end_time">
+      <el-form-item label="劳动合同结束时间:" label-width="160px" prop="T_contract_end_time">
         <el-date-picker
           style="width: 100%"
           class="my-date-picker"

+ 0 - 26
src/views/salary/Descriptions-item.vue

@@ -1,26 +0,0 @@
-<template>
-  <td class="el-descriptions__cell el-descriptions__label is-bordered-label" colspan="1">
-    <div class="cell-item">
-      <i class="iconfont">{{ '\ue7d1' }}</i>
-      {{ name }}
-    </div>
-  </td>
-  <td class="el-descriptions__cell el-descriptions__content is-bordered-content" colspan="0">
-    <el-tag type="danger"
-      >{{ salary }}{{ ['T_user_name', 'T_user_post', 'T_user_dept'].includes(field) ? '' : '¥' }}</el-tag
-    >
-  </td>
-</template>
-
-<script setup lang="ts">
-import { toRefs } from 'vue'
-interface PropsType {
-  name: string
-  salary: string
-  field: string
-}
-const props = defineProps<PropsType>()
-const { name, salary, field } = toRefs(props)
-</script>
-
-<style scoped></style>

+ 72 - 69
src/views/salary/SalaryCount.vue

@@ -1,8 +1,34 @@
 <script setup lang="ts">
 import { ref, reactive } from 'vue'
+import { ElMessage } from 'element-plus'
 import type { TableColumnCtx } from 'element-plus'
 import { Salary_List, Salary_Send, Salary_Excel } from '@/api/salary/index'
-import { ElMessage } from 'element-plus'
+
+interface User {
+  Id: number
+  T_user_name: string
+  T_base: number
+  T_post: number
+  T_seniority: number
+  T_Perf: number
+  T_Perf_score: number
+  T_back_payment: number
+  T_tax: number
+  T_attendance: number
+  T_cut_payment: number
+  T_pension_insurance: number
+  T_unemployment_insurance: number
+  T_medical_insurance: number
+  T_Large_medical_insurance: number
+  T_housing_fund: number
+}
+interface SpanMethodProps {
+  row: User
+  column: TableColumnCtx<User>
+  rowIndex: number
+  columnIndex: number
+}
+
 let date = new Date()
 const year = date.getFullYear()
 const month = date.getMonth()
@@ -11,17 +37,15 @@ const salaryFromData = reactive({
   month: (month < 10 ? '0' : '') + month,
   T_uuid: ''
 })
-const salarDateYearChange = (val: string) => {
-  if (!val) return
-  initParam.T_date = `${val}-${salaryFromData.month}`
-  getSalary_List()
-}
-const salarDateMonthChange = (val: string) => {
-  if (!val) return
-  initParam.T_date = `${salaryFromData.year}-${val}`
-  getSalary_List()
-}
+const initParam = reactive({
+  T_date: `${salaryFromData.year}-${salaryFromData.month}`,
+  page: 1,
+  page_z: 999
+})
+const multipleSelection = ref<User[]>([])
+
 const tableTH = [
+  { type: 'selection', width: '60px', fixed: 'left' },
   { type: 'index', label: '序号', width: '60px', fixed: 'left' },
   { prop: 'T_user_name', label: '姓名', fixed: 'left', width: '80px' },
   { prop: 'T_user_dept', label: '部门', fixed: 'left', width: '80px' },
@@ -45,30 +69,18 @@ const tableTH = [
   { prop: 'T_laborage', label: '扣款合计', sortable: true, width: '120px' },
   { prop: 'T_total', label: '实发合计', sortable: true, width: '120px' }
 ]
-interface User {
-  Id: number
-  T_user_name: string
-  T_base: number
-  T_post: number
-  T_seniority: number
-  T_Perf: number
-  T_Perf_score: number
-  T_back_payment: number
-  T_tax: number
-  T_attendance: number
-  T_cut_payment: number
-  T_pension_insurance: number
-  T_unemployment_insurance: number
-  T_medical_insurance: number
-  T_Large_medical_insurance: number
-  T_housing_fund: number
+
+const salarDateYearChange = (val: string) => {
+  if (!val) return
+  initParam.T_date = `${val}-${salaryFromData.month}`
+  getSalary_List()
 }
-interface SpanMethodProps {
-  row: User
-  column: TableColumnCtx<User>
-  rowIndex: number
-  columnIndex: number
+const salarDateMonthChange = (val: string) => {
+  if (!val) return
+  initParam.T_date = `${salaryFromData.year}-${val}`
+  getSalary_List()
 }
+
 const arraySpanMethod = ({ rowIndex, columnIndex }: SpanMethodProps) => {
   if (rowIndex === tableData.value.length - 1) {
     if (columnIndex === 2) {
@@ -78,41 +90,36 @@ const arraySpanMethod = ({ rowIndex, columnIndex }: SpanMethodProps) => {
     }
   }
 }
-const initParam = reactive({
-  T_date: `${salaryFromData.year}-${salaryFromData.month}`,
-  page: 1,
-  page_z: 999
-})
-const getSalary_List = async () => {
-  const res: any = await Salary_List(initParam)
-  tableData.value = res.Data.Data
-}
-getSalary_List()
 
+// 导出
 const exportSalaryExcel = async () => {
   const res: any = await Salary_Excel({ T_date: `${salaryFromData.year}-${salaryFromData.month}` })
   if (res.Code === 200) {
     window.open(res.Data)
   }
 }
+// 发布
 const publishSalary = async () => {
-  // Salary_Send
-  if (multipleSelection.value.length === 0 || multipleSelection.value[0]?.Id === 0) {
-    ElMessage({
-      message: '请选择用户!!!',
-      type: 'warning'
-    })
+  if (multipleSelection.value.length === 0) {
+    ElMessage.warning('请选择用户!!!')
     return
   }
-  multipleSelection.value.pop()
+
   for await (let item of multipleSelection.value) {
     Salary_Send({ T_id: item.Id })
   }
+  ElMessage.success('发布成功!!!')
 }
-const multipleSelection = ref<User[]>([])
+
 const handleSelectionChange = (val: User[]) => {
   multipleSelection.value = val
 }
+
+const selectableDisable = (row: any) => {
+  if (row.Id === 0) return false
+  return true
+}
+
 const tableData = ref<User[]>([])
 const tableRowClassName = ({ rowIndex }: { row: User; rowIndex: number }) => {
   if (rowIndex % 2 === 0) {
@@ -121,6 +128,12 @@ const tableRowClassName = ({ rowIndex }: { row: User; rowIndex: number }) => {
     return 'success-row'
   }
 }
+
+const getSalary_List = async () => {
+  const res: any = await Salary_List(initParam)
+  tableData.value = res.Data.Data
+}
+getSalary_List()
 </script>
 
 <template>
@@ -164,16 +177,17 @@ const tableRowClassName = ({ rowIndex }: { row: User; rowIndex: number }) => {
         style="width: 100%"
         :row-class-name="tableRowClassName"
       >
-        <el-table-column type="selection" width="55" />
         <template v-for="(item, index) in tableTH" :key="index">
           <el-table-column
-            v-if="item.type === 'index' || item.fixed === 'left'"
+            v-if="item.type === 'index' || item.fixed === 'left' || item.type === 'selection'"
+            :selectable="selectableDisable"
             :type="item.type"
             align="center"
             v-bind="item"
           />
           <el-table-column
             v-else
+            :selectable="selectableDisable"
             :prop="item.prop"
             :label="item.label"
             :width="item.width"
@@ -183,9 +197,6 @@ const tableRowClassName = ({ rowIndex }: { row: User; rowIndex: number }) => {
           />
         </template>
       </el-table>
-      <!-- <div class="pagination">
-        <el-pagination background layout="total,prev, pager, next" :total="total" />
-      </div> -->
     </el-card>
   </div>
 </template>
@@ -200,24 +211,16 @@ const tableRowClassName = ({ rowIndex }: { row: User; rowIndex: number }) => {
     }
   }
 }
-:deep(.el-table .warning-row) {
-  background-color: var(--el-color-warning-light-9);
-}
-:deep(.el-table .success-row) {
-  background-color: var(--el-color-success-light-9);
-}
-.label-table {
-  white-space: nowrap;
-}
 .d-flex {
   display: flex;
   justify-content: start;
   align-items: center;
   flex-wrap: nowrap;
 }
-.pagination {
-  display: flex;
-  justify-content: end;
-  margin-top: 2rem;
+:deep(.el-table .warning-row) {
+  background-color: var(--el-color-warning-light-9);
+}
+:deep(.el-table .success-row) {
+  background-color: var(--el-color-success-light-9);
 }
 </style>

+ 7 - 5
src/views/salary/SalaryMy.vue

@@ -1,15 +1,17 @@
 <script setup lang="ts">
 import { reactive } from 'vue'
 import { Salary_User_Get } from '@/api/salary/index'
-import DescriptionsItem from './descriptions-item.vue'
+
 let date = new Date()
-const year = date.getFullYear()
 const month = date.getMonth()
+const year = date.getFullYear()
 const salaryFromData = reactive({
   year: year + '',
   month: (month < 10 ? '0' : '') + month,
   T_uuid: ''
 })
+const isSalary = ['T_user_name', 'T_user_post', 'T_user_dept', 'T_attendance', 'T_cut_payment', 'T_laballot', 'T_total']
+
 const salaryData = reactive([
   { name: '姓名', field: 'T_user_name', salary: '' },
   { name: '部门', field: 'T_user_dept', salary: '' },
@@ -33,7 +35,7 @@ const salaryData = reactive([
   { name: '应发合计', field: 'T_laballot', salary: '' },
   { name: '实发合计', field: 'T_total', salary: '' }
 ])
-const isSalary = ['T_user_name', 'T_user_post', 'T_user_dept', 'T_attendance', 'T_cut_payment', 'T_laballot', 'T_total']
+
 const getMySalary = async () => {
   let T_date = salaryFromData.year + '-' + salaryFromData.month
   const res: any = await Salary_User_Get({ T_date }).catch(error => {
@@ -54,18 +56,18 @@ const getMySalary = async () => {
 
 const salarDateYearChange = (val: string) => {
   if (!val) return
-  // initParam.T_date = `${val}-${salaryFromData.month}`
   getMySalary()
 }
+
 const salarDateMonthChange = (val: string) => {
   if (!val) return
-  // initParam.T_date = `${salaryFromData.year}-${val}`
   getMySalary()
 }
 
 const searchSalary = () => {
   getMySalary()
 }
+
 getMySalary()
 </script>
 

+ 26 - 29
src/views/salary/salary/Salary.vue

@@ -1,44 +1,47 @@
 <script setup lang="ts">
 import { ref, reactive } from 'vue'
-import TableBase from '@/components/TableBase/index.vue'
+import { ElMessage } from 'element-plus'
+import SalaryFrom from './SalaryFrom.vue'
 import { User_List } from '@/api/user/index'
+import { GlobalStore } from '@/stores/index'
 import { Salary_Get } from '@/api/salary/index'
+import TableBase from '@/components/TableBase/index.vue'
 import { ColumnProps } from '@/components/TableBase/interface/index'
-import { GlobalStore } from '@/stores/index'
-import { ElMessage } from 'element-plus'
-import SalaryFrom from './SalaryFrom.vue'
+
+let date = new Date()
+const year = date.getFullYear()
+const month = date.getMonth()
+const salaryFromData = reactive({
+  year: year + '',
+  month: (month < 10 ? '0' : '') + month,
+  T_uuid: ''
+})
 const globalStore = GlobalStore()
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const salaryFromRef = ref<InstanceType<typeof SalaryFrom> | null>(null)
 
-const TableRef = ref()
-const salaryFromRef = ref()
 // 搜索以及参数
 const columns: ColumnProps[] = [
   { prop: 'T_name', label: '姓名', name: 'T_name' },
   { prop: 'T_post_name', label: '职位' }
 ]
-const searchHandle = () => {
-  initParam.T_name = searchs.T_name
-  initParam.T_dept = searchs.T_dept
-  TableRef.value.searchTable()
-}
+
 const searchs = reactive({
   T_name: '',
   T_dept: ''
 })
-let date = new Date()
-const year = date.getFullYear()
-const month = date.getMonth()
-const salaryFromData = reactive({
-  year: year + '',
-  month: (month < 10 ? '0' : '') + month,
-  T_uuid: ''
-})
-
 const initParam = {
   User_tokey: globalStore.GET_User_tokey,
   T_name: '',
   T_dept: ''
 }
+
+const searchHandle = () => {
+  initParam.T_name = searchs.T_name
+  initParam.T_dept = searchs.T_dept
+  TableRef.value?.searchTable()
+}
+
 const getSalaryParams = (row: any) => {
   userInfo.name = row.T_name
   userInfo.T_dept = row.T_dept_name
@@ -50,25 +53,19 @@ const getSalaryParams = (row: any) => {
 const getSalary = async () => {
   let T_date = `${salaryFromData.year}-${salaryFromData.month}`
   const res = await Salary_Get({ T_uuid: salaryFromData.T_uuid, T_date })
-  salaryFromRef.value.DataEcho(res.Data)
+  salaryFromRef.value?.DataEcho(res.Data)
 }
 const salarDateMonthChange = (val: string) => {
   if (!val) return
   if (!salaryFromData.T_uuid) {
-    ElMessage({
-      message: '请选择员工!!!',
-      type: 'warning'
-    })
+    ElMessage.warning('请选择员工!!!')
   }
   getSalary()
 }
 const salarDateYearChange = (val: string) => {
   if (!val) return
   if (!salaryFromData.T_uuid) {
-    ElMessage({
-      message: '请选择员工!!!',
-      type: 'warning'
-    })
+    ElMessage.warning('请选择员工!!!')
   }
   getSalary()
 }

+ 4 - 3
src/views/salary/salary/SalaryFrom.vue

@@ -1,9 +1,10 @@
 <script setup lang="ts">
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import type { FormInstance, FormRules } from 'element-plus'
-import { ElNotification } from 'element-plus'
 import { reuls_validator } from './relus'
+import { ElNotification } from 'element-plus'
 import { Salary_Post } from '@/api/salary/index'
+import { ref, reactive, onMounted, onUnmounted } from 'vue'
+import type { FormInstance, FormRules } from 'element-plus'
+
 const formRef = ref<FormInstance>()
 const form = ref({
   T_base: '',

+ 13 - 19
src/views/workAttendance/Leave.vue

@@ -1,17 +1,17 @@
 <script setup lang="ts">
-import { ref, nextTick, onMounted, onUnmounted } from 'vue'
-import { UserFilled } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
+import { GlobalStore } from '@/stores/index'
+import { getFormatDuration } from '@/utils/common'
+import { UserFilled } from '@element-plus/icons-vue'
 import TableBase from '@/components/TableBase/index.vue'
+import { ref, nextTick, onMounted, onUnmounted } from 'vue'
 import { ColumnProps } from '@/components/TableBase/interface/index'
 import { Leave_List, Leave_Approval } from '@/api/workAttendance/index'
-import { getFormatDuration } from '@/utils/common'
 
-import { GlobalStore } from '@/stores/index'
-
-const globalStore = GlobalStore()
 const TableRef = ref()
+const globalStore = GlobalStore()
 const columns: ColumnProps[] = [{ prop: 'T_user_name', label: '姓名', name: 'T_user_name' }]
+
 interface UserInfoIn {
   T_user_name: string
   T_dept: string
@@ -34,6 +34,7 @@ const userInfo = ref<UserInfoIn>({
   Id: '',
   T_duration: 0
 })
+
 const initParam = {
   User_tokey: globalStore.GET_User_tokey
 }
@@ -51,15 +52,9 @@ const LeaveUser = async (T_State: number) => {
   const res: any = await Leave_Approval(params)
   if (res.Code === 200) {
     if (T_State) {
-      ElMessage({
-        type: 'success',
-        message: '审核通过!'
-      })
+      ElMessage.success('审核通过!')
     } else {
-      ElMessage({
-        type: 'warning',
-        message: '审核不通过!'
-      })
+      ElMessage.warning('审核不通过!')
     }
     nextTick(() => {
       TableRef.value.getTableList()
@@ -104,7 +99,7 @@ onUnmounted(() => {
     <el-row class="h-100 f-1 margin-left-3">
       <el-col :span="24" class="h-100" style="overflow: hidden">
         <el-card class="m-b-3 b-show-0">
-          <h3 class="title m-b-5">员工基本信息</h3>
+          <h3 class="title-user m-b-5">员工基本信息</h3>
           <div class="info-content">
             <el-avatar shape="square" size="large" :icon="UserFilled" />
             <div class="info-name">
@@ -157,6 +152,9 @@ onUnmounted(() => {
   }
   .title {
     width: 100%;
+    text-align: center;
+  }
+  .title-user {
     text-align: left;
   }
   .btn {
@@ -169,12 +167,8 @@ onUnmounted(() => {
     color: #303133;
     .info-name {
       display: flex;
-      // flex-direction: column;
       align-items: center;
       padding-left: 0.75rem;
-      span:first-child {
-        margin-right: 2rem;
-      }
     }
   }
 }

+ 54 - 51
src/views/workAttendance/MyLeave.vue

@@ -1,5 +1,4 @@
 <script setup lang="ts">
-import { ref, reactive, onMounted, nextTick } from 'vue'
 import {
   Leave_User_list,
   LeaveType_List,
@@ -8,32 +7,39 @@ import {
   Leave_Del,
   Leave_DaysOff
 } from '@/api/workAttendance/index'
+import { GlobalStore } from '@/stores/index'
 import { User_List } from '@/api/user/index'
-import TableBase from '@/components/TableBase/index.vue'
 import Drawer from '@/components/Drawer/index.vue'
 import Dialog from '@/components/dialog/Dialog.vue'
-import { ColumnProps } from '@/components/TableBase/interface/index'
-import { GlobalStore } from '@/stores/index'
 import { Edit, Delete } from '@element-plus/icons-vue'
-import type { FormInstance, FormRules } from 'element-plus'
 import { ElMessageBox, ElMessage } from 'element-plus'
+import TableBase from '@/components/TableBase/index.vue'
+import { getFormatDuration } from '@/utils/common'
+import type { FormInstance, FormRules } from 'element-plus'
+import { ref, reactive, onMounted, nextTick } from 'vue'
+import { ColumnProps } from '@/components/TableBase/interface/index'
+
+let uuid = ''
+let isNew = true
+const LeaveType = ref<any>([])
 const globalStore = GlobalStore()
-const TableRef = ref()
+const formLabelWidth = ref('100px')
+const ruleFormRef = ref<FormInstance>()
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const initParam = { User_tokey: globalStore.GET_User_tokey }
+
 const columns: ColumnProps[] = [
   { prop: 'T_type_name', label: '请假类型' },
-  { prop: 'T_start_time', label: '开始时间' },
-  { prop: 'T_end_time', label: '结束时间' },
+  { prop: 'T_start_time', label: '开始时间', ellipsis: true },
+  { prop: 'T_end_time', label: '结束时间', ellipsis: true },
   { prop: 'T_duration', label: '请假时长', name: 'T_duration' },
-  { prop: 'T_text', label: '理由' },
-  { prop: 'T_State', label: '审核', name: 'T_State' },
+  { prop: 'T_text', label: '理由', ellipsis: true },
+  { prop: 'T_State', label: '审核', name: 'T_State', width: 100 },
   { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
 ]
-const initParam = {
-  User_tokey: globalStore.GET_User_tokey
-}
+
 //drawer
-const drawerRef = ref()
-const ruleFormRef = ref<FormInstance>()
 type Fn = () => void
 const callbackDrawer = (done: Fn) => {
   resetForm(ruleFormRef.value)
@@ -45,7 +51,7 @@ const resetForm = (formEl: FormInstance | undefined) => {
 }
 
 const openDrawerLeave = (str: string, row: any) => {
-  drawerRef.value.openDrawer()
+  drawerRef.value && drawerRef.value.openDrawer()
   if (str === 'edit') {
     isNew = false
     nextTick(() => {
@@ -65,20 +71,14 @@ const LeaveDelete = (row: any) => {
     .then(async () => {
       const res: any = await Leave_Del({ User_tokey: globalStore.GET_User_tokey, T_id: row.Id })
       if (res.Code === 200) {
-        ElMessage({
-          type: 'success',
-          message: '删除成功!'
-        })
+        ElMessage.success('删除成功!')
         nextTick(() => {
-          TableRef.value.getTableList()
+          TableRef.value && TableRef.value.getTableList()
         })
       }
     })
     .catch(() => {
-      ElMessage({
-        type: 'warning',
-        message: '取消成功!'
-      })
+      ElMessage.warning('取消成功!')
     })
 }
 const AddLeave = (formEl: FormInstance | undefined) => {
@@ -87,19 +87,20 @@ const AddLeave = (formEl: FormInstance | undefined) => {
     if (valid) {
       let res: any = {}
       form.value.T_duration = form.value.T_duration * 60
+      if (form.value.T_duration > RemainingTime.value) {
+        ElMessage.warning('请假时长不得大于剩余时长,请重新选择时间!!')
+        return
+      }
       if (isNew) {
         res = await Leave_Add({ ...form.value, T_approver: uuid })
       } else {
         res = await Leave_Edit({ ...form.value, T_approver: uuid })
       }
       if (res.Code === 200) {
-        ElMessage({
-          type: 'success',
-          message: `${isNew ? '申请' : '修改'}成功!`
-        })
+        ElMessage.success(`${isNew ? '申请' : '修改'}成功!`)
         nextTick(() => {
-          drawerRef.value.closeDrawer()
-          TableRef.value.getTableList()
+          drawerRef.value && drawerRef.value.closeDrawer()
+          TableRef.value && TableRef.value.getTableList()
           resetForm(ruleFormRef.value)
           isNew = true
         })
@@ -109,6 +110,17 @@ const AddLeave = (formEl: FormInstance | undefined) => {
     }
   })
 }
+
+const form = ref({
+  T_id: '',
+  T_text: '',
+  T_type: '',
+  T_duration: 0,
+  T_end_time: '',
+  T_approver: '',
+  T_start_time: ''
+})
+
 const rules = reactive<FormRules>({
   T_type: [{ required: true, message: '请选择请假类型', trigger: 'blur' }],
   T_start_time: [{ required: true, message: '请选择开始时间', trigger: 'blur' }],
@@ -119,29 +131,13 @@ const rules = reactive<FormRules>({
   ],
   T_approver: [{ required: true, message: '请选择审批人', trigger: 'blur' }]
 })
-let uuid = ''
-const form = ref({
-  T_type: '',
-  T_start_time: '',
-  T_end_time: '',
-  T_duration: 0,
-  T_text: '',
-  T_approver: '',
-  T_id: ''
-})
-const LeaveType = ref<any>([])
+
 const getLeaveTypeList = async () => {
   const res: any = await LeaveType_List({ User_tokey: globalStore.GET_User_tokey, page: 1, page_z: 999 })
   if (res.Code === 200) {
     LeaveType.value = res.Data
   }
 }
-const formLabelWidth = ref('100px')
-let isNew = true
-const selectApprover = () => {
-  dialog.value.DialogOpen()
-}
-
 // dialog
 const dialog = ref()
 const search = ref('')
@@ -156,15 +152,20 @@ const searchHandle = () => {
   approverInitParam.T_name = search.value
   tableApproverRef.value.searchTable()
 }
+const selectApprover = () => {
+  dialog.value.DialogOpen()
+}
 const getApproverInfo = (row: any) => {
   uuid = row.T_uuid
   form.value.T_approver = row.T_name
   dialog.value.DialogClose()
 }
 
+// 剩余时长
+const RemainingTime = ref(0)
 const getLeaveDaysOff = async () => {
-  const res = await Leave_DaysOff({ User_tokey: globalStore.GET_User_tokey })
-  console.log(res)
+  const res: any = await Leave_DaysOff({ User_tokey: globalStore.GET_User_tokey })
+  RemainingTime.value = res.Data
 }
 
 const onResize = () => {
@@ -205,7 +206,9 @@ onMounted(() => {
         <h4 :id="params.titleId" :class="params.titleClass">{{ isNew ? '请假' : '编辑' }} - 申请</h4>
       </template>
       <el-form ref="ruleFormRef" :model="form" :rules="rules">
-        <span class="daysOff">剩余可调休时长:<el-tag type="danger" effect="dark"> 1小时19分 </el-tag></span>
+        <span class="daysOff"
+          >剩余可调休时长:<el-tag type="danger" effect="dark"> {{ getFormatDuration(RemainingTime) }} </el-tag></span
+        >
         <el-form-item label="请假类型:" :label-width="formLabelWidth" prop="T_type">
           <el-select v-model="form.T_type" placeholder="请选择类型">
             <el-option v-for="item in LeaveType" :key="item.Id" :label="item.T_name" :value="item.Id" />

+ 69 - 86
src/views/workAttendance/MyOvertime.vue

@@ -1,6 +1,4 @@
 <script setup lang="ts">
-import { reactive, ref, nextTick, computed } from 'vue'
-import { ColumnProps } from '@/components/TableBase/interface/index'
 import {
   Overtime_User_list,
   Overtime_Stat,
@@ -9,47 +7,50 @@ import {
   Overtime_Edit
 } from '@/api/workAttendance/index'
 import { User_List } from '@/api/user/index'
+import { GlobalStore } from '@/stores/index'
 import { UpFileToken } from '@/api/public/index'
-import Dialog from '@/components/dialog/Dialog.vue'
 import Drawer from '@/components/Drawer/index.vue'
+import Dialog from '@/components/dialog/Dialog.vue'
+import { floatReg } from '@/views/salary/salary/relus'
+import { reactive, ref, nextTick } from 'vue'
+import TableBase from '@/components/TableBase/index.vue'
+import { getFormatDuration } from '@/utils/common'
 import { Edit, Delete, View, Plus } from '@element-plus/icons-vue'
-import type {
-  FormInstance,
-  FormRules,
-  UploadFile,
-  UploadInstance,
-  UploadProps,
-  UploadRawFile,
-  UploadFiles
-} from 'element-plus'
 import { ElMessageBox, ElMessage, genFileId } from 'element-plus'
-import { floatReg } from '@/views/salary/salary/relus'
-import { GlobalStore } from '@/stores/index'
-import { dayJs, getFormatDuration, qiniuUpLoadFun, upLoadQiniu } from '@/utils/common'
+import { ColumnProps } from '@/components/TableBase/interface/index'
+import type { FormInstance, FormRules, UploadProps, UploadRawFile } from 'element-plus'
 
+let uuid = ''
+let isNew = true
+const search = ref('')
+const TableStatRef = ref()
+const disabled = ref(false)
+const tableApproverRef = ref()
 const globalStore = GlobalStore()
+const formLabelWidth = ref('100px')
+const ruleFormRef = ref<FormInstance>()
+const dialog = ref<InstanceType<typeof Dialog> | null>(null)
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const initParam = { User_tokey: globalStore.GET_User_tokey }
 
-const TableRef = ref()
-const TableStatRef = ref()
 const columns: ColumnProps[] = [
-  { prop: 'T_start_time', label: '开始时间' },
-  { prop: 'T_end_time', label: '结束时间' },
+  { prop: 'T_start_time', label: '开始时间', ellipsis: true },
+  { prop: 'T_end_time', label: '结束时间', ellipsis: true },
   { prop: 'T_duration', label: '时长', width: '100px', name: 'T_duration' },
-  { prop: 'T_State', label: '审核', width: '80px', name: 'T_State' },
-  { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
+  { prop: 'T_State', label: '审核', width: '100px', name: 'T_State' },
+  { prop: 'operation', label: '操作', width: 150, fixed: 'right' }
 ]
 const columns_Stat: ColumnProps[] = [
   { prop: 'T_duration', label: '时长', width: '100px', name: 'T_duration' },
   { prop: 'RemainingTime', label: '剩余时长', width: '100px', name: 'RemainingTime' },
   { prop: 'T_type_name', label: '事项' },
   { prop: 'T_approver_name', label: '处理人' },
-  { prop: 'UpdateTime', label: '时间' }
+  { prop: 'UpdateTime', label: '时间', ellipsis: true }
 ]
-const initParam = {
-  User_tokey: globalStore.GET_User_tokey
-}
+
 const openDrawerOvertime = (str: string, row: any) => {
-  drawerRef.value.openDrawer()
+  drawerRef.value && drawerRef.value.openDrawer()
   if (str === 'edit') {
     isNew = false
     nextTick(() => {
@@ -57,7 +58,7 @@ const openDrawerOvertime = (str: string, row: any) => {
       uuid = row.T_approver
       form.value.T_approver = row.T_user_name
       form.value.T_id = row.Id
-      form.value.T_prove_img = 'https://erposs.baozhida.cn' + form.value.T_prove_img
+      form.value.T_prove_img = import.meta.env.VITE_BZD_ERPOSS_APP_API + form.value.T_prove_img
       fileList.value.push({
         name: 'food.jpeg',
         url: form.value.T_prove_img
@@ -65,10 +66,10 @@ const openDrawerOvertime = (str: string, row: any) => {
     })
   }
 }
-const disabled = ref(false)
+
 const OvertimeView = (row: any) => {
   disabled.value = true
-  drawerRef.value.openDrawer()
+  drawerRef.value && drawerRef.value.openDrawer()
   nextTick(() => {
     form.value = { ...row }
     form.value.T_approver = row.T_user_name
@@ -83,12 +84,9 @@ const OvertimeDelete = (row: any) => {
     .then(async () => {
       const res: any = await Overtime_Del({ User_tokey: globalStore.GET_User_tokey, T_id: row.Id })
       if (res.Code === 200) {
-        ElMessage({
-          type: 'success',
-          message: '删除成功!'
-        })
+        ElMessage.success('删除成功!')
         nextTick(() => {
-          TableRef.value.getTableList()
+          TableRef.value?.getTableList()
         })
       }
     })
@@ -105,7 +103,7 @@ const AddOvertime = (formEl: FormInstance | undefined) => {
   formEl.validate(async valid => {
     if (valid) {
       let res: any = {}
-      form.value.T_duration = duration.value * 60
+      form.value.T_duration = form.value.T_duration * 60
       if (isNew) {
         res = await Overtime_Add({ ...form.value, T_approver: uuid })
       } else {
@@ -114,8 +112,8 @@ const AddOvertime = (formEl: FormInstance | undefined) => {
       if (res.Code === 200) {
         ElMessage.success(`${isNew ? '申请' : '修改'}成功!`)
         nextTick(() => {
-          drawerRef.value.closeDrawer()
-          TableRef.value.getTableList()
+          drawerRef.value?.closeDrawer()
+          TableRef.value?.getTableList()
           resetForm(ruleFormRef.value)
           isNew = true
         })
@@ -125,9 +123,8 @@ const AddOvertime = (formEl: FormInstance | undefined) => {
     }
   })
 }
+
 // Drawer
-const drawerRef = ref()
-const ruleFormRef = ref<FormInstance>()
 type Fn = () => void
 const callbackDrawer = (done: Fn) => {
   disabled.value = false
@@ -153,6 +150,15 @@ const validate_float = (rule: any, value: any, callback: any) => {
     }
   }
 }
+const form = ref({
+  T_id: '',
+  T_text: '',
+  T_duration: 0,
+  T_end_time: '',
+  T_approver: '',
+  T_prove_img: '',
+  T_start_time: ''
+})
 const rules = reactive<FormRules>({
   T_type: [{ required: true, message: '请选择请假类型', trigger: 'blur' }],
   T_start_time: [{ required: true, message: '请选择开始时间', trigger: 'blur' }],
@@ -160,35 +166,8 @@ const rules = reactive<FormRules>({
   T_duration: [{ required: true, validator: validate_float, trigger: 'blur' }],
   T_approver: [{ required: true, message: '请选择审批人', trigger: 'blur' }]
 })
-let uuid = ''
-const duration = computed(() => {
-  const end_time = dayJs(form.value.T_end_time)
-  if (!form.value.T_end_time) {
-    return 0
-  }
-  let count: number = end_time.diff(form.value.T_start_time, 'hour', true)
-  let num: number = Number(count.toFixed(2))
-  return Math.round(num * 10) / 10
-})
-const form = ref({
-  T_start_time: '',
-  T_end_time: '',
-  T_duration: 0,
-  T_text: '',
-  T_approver: '',
-  T_prove_img: '',
-  T_id: ''
-})
-const formLabelWidth = ref('100px')
-let isNew = true
-const selectApprover = () => {
-  dialog.value.DialogOpen()
-}
 
 // dialog
-const dialog = ref()
-const search = ref('')
-const tableApproverRef = ref()
 const Dialogcolumns: ColumnProps[] = [{ prop: 'T_name', label: '名字', name: 'T_name' }]
 const approverInitParam = {
   User_tokey: globalStore.GET_User_tokey,
@@ -199,10 +178,13 @@ const searchHandle = () => {
   approverInitParam.T_name = search.value
   tableApproverRef.value.searchTable()
 }
+const selectApprover = () => {
+  dialog.value?.DialogOpen()
+}
 const getApproverInfo = (row: any) => {
   uuid = row.T_uuid
   form.value.T_approver = row.T_name
-  dialog.value.DialogClose()
+  dialog.value?.DialogClose()
 }
 
 const onResize = () => {
@@ -211,20 +193,24 @@ const onResize = () => {
 }
 
 // upload file
+interface FileListType {
+  url: string
+  name: string
+}
+let prove_img = true
 const upload = ref()
-let uploadData = { token: '', key: '' }
+const fileList = ref<FileListType[]>([])
 const dialogImageUrl = ref('')
 const dialogVisible = ref(false)
-const fileList = ref<any>([])
-let prove_img = true
+let uploadData = { token: '', key: '' }
+
+// 图片查看 放大
 const handlePictureCardPreview = async (file: any) => {
-  console.log(file, fileList)
   dialogImageUrl.value = file.url as string
   dialogVisible.value = true
 }
+// 图片上传之前
 const beforeUpload = async (file: any) => {
-  console.log(file)
-
   let reg = /^image/g
   if (!reg.test(file.type)) {
     ElMessage.error('必须上传图片!!')
@@ -236,31 +222,26 @@ const beforeUpload = async (file: any) => {
   uploadData.token = res.Data
   uploadData.key = file.name
 }
+// 图片上传超出界限
 const handleExceed: UploadProps['onExceed'] = (files: any) => {
   upload.value.clearFiles()
   const file = files[0] as UploadRawFile
   file.uid = genFileId()
   upload.value.handleStart(file)
-  submitUpload()
-}
-
-const submitUpload = () => {
   upload.value.submit()
 }
-
-const onSuccess = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
-  console.log(response, uploadFile, uploadFiles)
+// 图片上传成功
+const onSuccess = (response: any) => {
   form.value.T_prove_img = response.key
   prove_img = true
   ElMessage.success('图片上传成功!!')
 }
-
+// 图片上传失败
 const onError = () => {
   ElMessage.error('图片上传失败!!')
 }
-
-const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
-  console.log(uploadFile, uploadFiles, fileList)
+// 图片移除
+const handleRemove: UploadProps['onRemove'] = () => {
   form.value.T_prove_img = ''
 }
 </script>
@@ -323,7 +304,9 @@ const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
         <template #table-header="{ pageable }">
           <el-button text
             ><h4>
-              <el-text class="mx-1" type="primary">剩余总时长:{{ getFormatDuration(pageable.RemainingTime) }}</el-text>
+              <el-text class="mx-1" type="primary"
+                >剩余总时长:{{ getFormatDuration(pageable.RemainingTime as number) }}</el-text
+              >
             </h4></el-button
           ></template
         >
@@ -361,7 +344,7 @@ const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
           />
         </el-form-item>
         <el-form-item label="加班时长:" :label-width="formLabelWidth" prop="T_duration">
-          <el-input v-model.number="duration" autocomplete="off" :disabled="true" placeholder="请假时长" />
+          <el-input v-model.number="form.T_duration" autocomplete="off" placeholder="请假时长" />
         </el-form-item>
         <el-form-item label="取证:" :label-width="formLabelWidth">
           <el-upload

+ 10 - 8
src/views/workAttendance/Overtime.vue

@@ -1,15 +1,15 @@
 <script setup lang="ts">
-import { ref, nextTick, onMounted, onUnmounted } from 'vue'
-import { UserFilled } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
+import { GlobalStore } from '@/stores/index'
+import { getFormatDuration } from '@/utils/common'
+import { UserFilled } from '@element-plus/icons-vue'
 import TableBase from '@/components/TableBase/index.vue'
+import { ref, nextTick, onMounted, onUnmounted } from 'vue'
 import { ColumnProps } from '@/components/TableBase/interface/index'
 import { Overtime_List, Overtime_Approval } from '@/api/workAttendance/index'
-import { getFormatDuration } from '@/utils/common'
-import { GlobalStore } from '@/stores/index'
 
-const globalStore = GlobalStore()
 const TableRef = ref()
+const globalStore = GlobalStore()
 const columns: ColumnProps[] = [{ prop: 'T_user_name', label: '姓名', name: 'T_user_name' }]
 interface UserInfoIn {
   T_user_name: string
@@ -40,8 +40,7 @@ const initParam = {
   User_tokey: globalStore.GET_User_tokey
 }
 const getSalaryParams = (row: any) => {
-  console.log(row)
-  userInfo.value = { ...row, T_prove_img: 'https://erposs.baozhida.cn' + row.T_prove_img }
+  userInfo.value = { ...row, T_prove_img: import.meta.env.VITE_BZD_ERPOSS_APP_API + row.T_prove_img }
 }
 
 const LeaveUser = async (T_State: number) => {
@@ -101,7 +100,7 @@ onUnmounted(() => {
     <el-row class="h-100 f-1 margin-left-3">
       <el-col :span="24" class="h-100" style="overflow: hidden">
         <el-card class="m-b-3 b-show-0">
-          <h3 class="title m-b-5">员工基本信息</h3>
+          <h3 class="title-user m-b-5">员工基本信息</h3>
           <div class="info-content">
             <el-avatar shape="square" size="large" :icon="UserFilled" />
             <div class="info-name">
@@ -184,6 +183,9 @@ onUnmounted(() => {
     width: 100%;
     text-align: center;
   }
+  .title-user {
+    text-align: left;
+  }
   .btn {
     margin-top: 2rem;
     display: flex;

+ 25 - 26
src/views/workAttendance/RecordsFinance.vue

@@ -1,43 +1,44 @@
 <script setup lang="ts">
-import { ref, reactive, onMounted, computed, onUnmounted } from 'vue'
-import TableBase from '@/components/TableBase/index.vue'
+import { ElMessage } from 'element-plus'
 import { User_List } from '@/api/user/index'
-import { ColumnProps } from '@/components/TableBase/interface/index'
 import { GlobalStore } from '@/stores/index'
-import { ElMessage } from 'element-plus'
-import { Leave_Finance_List } from '@/api/workAttendance/index'
 import { getFormatDuration } from '@/utils/common'
+import TableBase from '@/components/TableBase/index.vue'
+import { Leave_Finance_List } from '@/api/workAttendance/index'
+import { ref, reactive, onMounted, computed, onUnmounted } from 'vue'
+import { ColumnProps } from '@/components/TableBase/interface/index'
 import Pagination from '@/components/TableBase/components/Pagination.vue'
 
+const TableData = ref()
 const globalStore = GlobalStore()
-const LeaveTableRef = ref()
+const initParam = { User_tokey: globalStore.GET_User_tokey }
+const LeaveTableRef = ref<InstanceType<typeof TableBase> | null>(null)
+let date = new Date()
+const month = date.getMonth()
+const year = date.getFullYear()
+const salaryFromData = ref({
+  year: year + '',
+  month: (month < 10 ? '0' : '') + month,
+  T_uuid: ''
+})
+
 // 搜索以及参数
 const columns: ColumnProps[] = [
   { prop: 'T_name', label: '姓名', name: 'T_name' },
-  { prop: 'T_post_name', label: '职位' }
+  { prop: 'T_post_name', label: '职位', ellipsis: true }
 ]
 const userColums: ColumnProps[] = [
   { prop: 'T_type_name', label: '请假类型' },
-  { prop: 'T_start_time', label: '开始时间' },
-  { prop: 'T_end_time', label: '结束时间' },
+  { prop: 'T_start_time', label: '开始时间', ellipsis: true },
+  { prop: 'T_end_time', label: '结束时间', ellipsis: true },
   { prop: 'T_duration', label: '请假时长', name: 'T_duration' },
   { prop: 'T_text', label: '理由' },
   { prop: 'T_State', label: '审核', name: 'T_State' }
 ]
-let date = new Date()
-const year = date.getFullYear()
-const month = date.getMonth()
-const salaryFromData = ref({
-  year: year + '',
-  month: (month < 10 ? '0' : '') + month,
-  T_uuid: ''
-})
-
 const dateCom = computed(() => {
   return `${salaryFromData.value.year}-${salaryFromData.value.month}`
 })
 
-const initParam = { User_tokey: globalStore.GET_User_tokey }
 const LeaveinitParam = reactive({
   User_tokey: globalStore.GET_User_tokey,
   T_uuid: '',
@@ -50,7 +51,7 @@ const getSalaryParams = (row: any) => {
   userInfo.T_post = row.T_post_name
   LeaveinitParam.T_uuid = row.T_uuid
 
-  LeaveTableRef.value.searchTable()
+  LeaveTableRef.value && LeaveTableRef.value.searchTable()
 }
 
 const salarDateMonthChange = (val: string) => {
@@ -59,7 +60,7 @@ const salarDateMonthChange = (val: string) => {
     ElMessage.warning('请选择员工!!!')
   }
   LeaveinitParam.T_month = dateCom.value
-  LeaveTableRef.value.searchTable()
+  LeaveTableRef.value && LeaveTableRef?.value.searchTable()
 }
 const salarDateYearChange = (val: string) => {
   if (!val) return
@@ -67,7 +68,7 @@ const salarDateYearChange = (val: string) => {
     ElMessage.warning('请选择员工!!!')
   }
   LeaveinitParam.T_month = dateCom.value
-  LeaveTableRef.value.searchTable()
+  LeaveTableRef.value && LeaveTableRef.value.searchTable()
 }
 const userInfo = reactive({
   squareUrl: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
@@ -80,7 +81,6 @@ const onResize = () => {
   return height - 140 - 74 - 60 - 4 * 12
 }
 
-const TableData = ref()
 const getTableData = async () => {
   const res: any = await User_List({ ...initParam })
   TableData.value = res.Data.Data
@@ -93,7 +93,6 @@ onMounted(async () => {
   userInfo.name = userInfoFirst.T_name
   userInfo.T_dept = userInfoFirst.T_dept_name
   userInfo.T_post = userInfoFirst.T_post_name
-  console.log(LeaveinitParam.T_uuid)
 })
 const pageable = reactive({
   pageNum: 1,
@@ -104,12 +103,12 @@ const pageable = reactive({
 })
 const handleSizeChange = (val: number) => {
   pageable.pageSize = val
-  LeaveTableRef.value.getTableList()
+  LeaveTableRef.value?.getTableList()
 }
 
 const handleCurrentChange = (val: number) => {
   pageable.pageNum = val
-  LeaveTableRef.value.getTableList()
+  LeaveTableRef.value?.getTableList()
 }
 let clientHeight = ref(0)
 const onContentResize = () => {

+ 8 - 10
src/views/workAttendance/records/Records.vue

@@ -21,29 +21,29 @@ const drawerOvertimeRef = ref<InstanceType<typeof Drawer> | null>(null)
 
 const columns: ColumnProps[] = [{ prop: 'T_name', label: '姓名', name: 'T_name' }]
 const overtimeColums: ColumnProps[] = [
-  { prop: 'T_start_time', label: '开始时间' },
-  { prop: 'T_end_time', label: '结束时间' },
+  { prop: 'T_start_time', label: '开始时间', ellipsis: true },
+  { prop: 'T_end_time', label: '结束时间', ellipsis: true },
   { prop: 'T_duration', label: '时长', name: 'T_duration' },
   { prop: 'T_State', label: '审核', name: 'T_State' },
   { prop: 'T_approver_name', label: '处理人' },
-  { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
+  { prop: 'operation', label: '操作', width: 80, fixed: 'right' }
 ]
 const remainingTimeColums: ColumnProps[] = [
   { prop: 'T_duration', label: '时长', name: 'T_duration' },
   { prop: 'RemainingTime', label: '剩余时长', name: 'RemainingTime' },
   { prop: 'T_type_name', label: '事项' },
   { prop: 'T_approver_name', label: '处理人' },
-  { prop: 'UpdateTime', label: '时间' }
+  { prop: 'UpdateTime', label: '时间', ellipsis: true }
 ]
 const leaveColums: ColumnProps[] = [
   { prop: 'T_type_name', label: '请假类型' },
-  { prop: 'T_start_time', label: '开始时间' },
-  { prop: 'T_end_time', label: '结束时间' },
+  { prop: 'T_start_time', label: '开始时间', ellipsis: true },
+  { prop: 'T_end_time', label: '结束时间', ellipsis: true },
   { prop: 'T_duration', label: '请假时长', name: 'T_duration' },
-  { prop: 'T_text', label: '理由' },
+  { prop: 'T_text', label: '理由', ellipsis: true },
   { prop: 'T_State', label: '审核', name: 'T_State' },
   { prop: 'T_approver_name', label: '处理人' },
-  { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
+  { prop: 'operation', label: '操作', width: 80, fixed: 'right' }
 ]
 
 const initParam = {
@@ -138,7 +138,6 @@ const viewOvertime = (row: any) => {
   url = 'https://erposs.baozhida.cn' + row.T_prove_img
   srcList.push(url)
   OvertimeInfo.value = { ...row }
-  console.log(OvertimeInfo.value)
   drawerOvertimeRef.value && drawerOvertimeRef.value.openDrawer()
 }
 const closerOvertime = () => {
@@ -154,7 +153,6 @@ const closerOvertime = () => {
 // 查看请假
 const viewoLeave = (row: any) => {
   LeaveInfo.value = { ...row }
-  console.log(LeaveInfo.value)
   LeaveInfo.value.T_duration = getFormatDuration(row.T_duration)
   drawerLeaveRef.value && drawerLeaveRef.value.openDrawer()
 }

+ 9 - 0
src/vite-env.d.ts

@@ -1 +1,10 @@
 /// <reference types="vite/client" />
+interface ImportMetaEnv {
+  readonly VITE_BZD_ERP_APP_API: string
+  readonly VITE_BZD_ERPOSS_APP_API: string
+  // 更多环境变量...
+}
+
+interface ImportMeta {
+  readonly env: ImportMetaEnv
+}

+ 16 - 16
vite.config.ts

@@ -22,22 +22,22 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
     },
     server: {
       open: true,
-      host: '0.0.0.0'
-      // proxy: {
-      //   '/api': {
-      //     target: 'https://erp.baozhida.cn',
-      //     changeOrigin: true
-      //     // rewrite: path => path.replace(/^\/api/, '')
-      //   },
-      //   '/salary': {
-      //     target: 'http://erp.baozhida.cn',
-      //     changeOrigin: true
-      //   },
-      //   '/ams': {
-      //     target: 'http://erp.baozhida.cn',
-      //     changeOrigin: true
-      //   }
-      // }
+      host: '0.0.0.0',
+      proxy: {
+        '/api': {
+          target: 'https://erp.baozhida.cn',
+          changeOrigin: true
+          // rewrite: path => path.replace(/^\/api/, '')
+        },
+        '/salary': {
+          target: 'http://erp.baozhida.cn',
+          changeOrigin: true
+        },
+        '/ams': {
+          target: 'http://erp.baozhida.cn',
+          changeOrigin: true
+        }
+      }
     },
     plugins: [
       vue(),