Compare commits

...

4 Commits

Author SHA1 Message Date
qsh
aa84bb69f3 sc 2024-11-20 15:16:06 +08:00
qsh
15b589ab03 sc 2024-11-15 09:17:33 +08:00
qsh
0b26cf8b28 sc 2024-11-12 11:12:21 +08:00
qsh
a8e41fe889 sc 2024-11-11 16:32:21 +08:00
9 changed files with 375 additions and 24 deletions

View File

@@ -1,5 +1,4 @@
import request from '@/config/axios' import request from '@/config/axios'
import qs from 'qs'
export interface NotifyMessageVO { export interface NotifyMessageVO {
id: number id: number
@@ -16,35 +15,39 @@ export interface NotifyMessageVO {
} }
// 查询站内信消息列表 // 查询站内信消息列表
export const getNotifyMessagePage = async (params: PageParam) => { export const getNotifyMessagePage = async (params: any) => {
return await request.get({ url: '/admin-api/system/notify-message/page', params }) return await request.get({ url: '/admin-api/system/notify-message/page', params })
} }
// 获得我的站内信分页 // 获得我的站内信分页
export const getMyNotifyMessagePage = async (params: PageParam) => { export const getMyNotifyMessagePage = async (params: any) => {
return await request.get({ url: '/admin-api/system/notify-message/my-page', params }) return await request.get({ url: '/admin-api/system/notify-message/my-page', params })
} }
// 批量标记已读 // 批量标记已读
export const updateNotifyMessageRead = async (ids) => { export const updateNotifyMessageRead = async (data: any) => {
return await request.put({ return await request.put({
url: url: '/admin-api/system/notify-message/update-read?',
'/admin-api/system/notify-message/update-read?' + data
qs.stringify({ ids: ids }, { indices: false })
}) })
} }
// 标记所有站内信为已读 // 标记所有站内信为已读
export const updateAllNotifyMessageRead = async () => { export const updateAllNotifyMessageRead = async (data: any) => {
return await request.put({ url: '/admin-api/system/notify-message/update-all-read' }) return await request.put({ url: '/admin-api/system/notify-message/update-all-read', data })
} }
// 获取当前用户的最新站内信列表 // 获取当前用户的最新站内信列表
export const getUnreadNotifyMessageList = async () => { export const getUnreadNotifyMessageList = async (params: any) => {
return await request.get({ url: '/admin-api/system/notify-message/get-unread-list' }) return await request.get({ url: '/admin-api/system/notify-message/get-unread-list', params })
} }
// 获得当前用户的未读站内信数量 // 获得当前用户的未读站内信数量
export const getUnreadNotifyMessageCount = async () => { export const getUnreadNotifyMessageCount = async (params: any) => {
return await request.get({ url: '/admin-api/system/notify-message/get-unread-count' }) return await request.get({ url: '/admin-api/system/notify-message/get-unread-count', params })
}
// 获取详情
export const getNotifyMessageDetail = async (id: number) => {
return await request.get({ url: '/admin-api/system/notify-message/get', params: { id } })
} }

View File

@@ -1,7 +1,9 @@
<script lang="ts" name="Message" setup> <script lang="ts" name="Message" setup>
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import * as NotifyMessageApi from '@/api/system/notify/message' // import * as NotifyMessageApi from '@/api/system/notify/message'
// import { useUserStore } from '@/store/modules/user'
// const userStore = useUserStore()
const { push } = useRouter() const { push } = useRouter()
const activeName = ref('notice') const activeName = ref('notice')
const unreadCount = ref(0) // 未读消息数量 const unreadCount = ref(0) // 未读消息数量
@@ -9,17 +11,21 @@ const list = ref<any[]>([]) // 消息列表
// 获得消息列表 // 获得消息列表
const getList = async () => { const getList = async () => {
list.value = await NotifyMessageApi.getUnreadNotifyMessageList() // list.value = await NotifyMessageApi.getUnreadNotifyMessageList({
// roleId: userStore.getUser?.currentRole
// })
// 强制设置 unreadCount 为 0避免小红点因为轮询太慢不消除 // 强制设置 unreadCount 为 0避免小红点因为轮询太慢不消除
unreadCount.value = 0 unreadCount.value = 0
} }
// 获得未读消息数 // 获得未读消息数
const getUnreadCount = async () => { // const getUnreadCount = async () => {
NotifyMessageApi.getUnreadNotifyMessageCount().then((data) => { // NotifyMessageApi.getUnreadNotifyMessageCount({ roleId: userStore.getUser?.currentRole }).then(
unreadCount.value = data // (data) => {
}) // unreadCount.value = data
} // }
// )
// }
// 跳转我的站内信 // 跳转我的站内信
const goMyList = () => { const goMyList = () => {
@@ -32,7 +38,7 @@ const goMyList = () => {
const msgInterval = ref<any>(null) const msgInterval = ref<any>(null)
onMounted(() => { onMounted(() => {
// 首次加载小红点 // 首次加载小红点
getUnreadCount() // getUnreadCount()
// 轮询刷新小红点 // 轮询刷新小红点
// msgInterval.value = setInterval(() => { // msgInterval.value = setInterval(() => {
// getUnreadCount() // getUnreadCount()

View File

@@ -56,7 +56,7 @@ export const useAppStore = defineStore('app', {
screenfull: true, // 全屏图标 screenfull: true, // 全屏图标
size: false, // 尺寸图标 size: false, // 尺寸图标
locale: false, // 多语言图标 locale: false, // 多语言图标
message: true, // 消息图标 message: false, // 消息图标
tagsView: true, // 标签页 tagsView: true, // 标签页
tagsViewIcon: false, // 是否显示标签图标 tagsViewIcon: false, // 是否显示标签图标
logo: true, // logo logo: true, // logo

View File

@@ -50,7 +50,7 @@ export const useUserStore = defineStore('admin-user', {
return null return null
} }
let userInfo = cache.local.get(CACHE_KEY.USER) let userInfo = cache.local.get(CACHE_KEY.USER)
if (!userInfo) { if (!userInfo || !userInfo?.menus || userInfo.menus.length == 0) {
userInfo = await getInfo({}) userInfo = await getInfo({})
} }
this.permissions = userInfo.permissions this.permissions = userInfo.permissions

View File

@@ -9,6 +9,18 @@
:label="col.label" :label="col.label"
:width="col.width" :width="col.width"
/> />
<el-table-column label="状态" key="status">
<template #default="scope">
<el-switch
v-model="scope.row.status"
:active-value="0"
active-text="在职"
inactive-text="离职"
:inactive-value="1"
disabled
/>
</template>
</el-table-column>
</el-table> </el-table>
<Pagination <Pagination
v-model:limit="pageSize" v-model:limit="pageSize"

View File

@@ -50,6 +50,8 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="0" :active-value="0"
:inactive-value="1" :inactive-value="1"
active-text="在职"
inactive-text="离职"
v-hasPermi="['basic:employee:update']" v-hasPermi="['basic:employee:update']"
@change="handleStatusChange(scope.row)" @change="handleStatusChange(scope.row)"
/> />

View File

@@ -0,0 +1,319 @@
<template>
<div>
<el-form :model="searchForm" ref="searchFormRef" inline @submit.prevent>
<el-form-item>
<el-date-picker
v-model="searchForm.period"
type="month"
format="YYYY-MM"
value-format="YYYY-MM"
placeholder="年月"
style="width: 100%"
@change="handleSearch"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="searchForm.orgName"
placeholder="组织名称"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="searchForm.name"
placeholder="员工姓名"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleSearch" v-hasPermi="['home:false-dilegence:search']">
查询
</el-button>
<el-button @click="handleSync" v-hasPermi="['home:false-dilegence:sync']">
同步钉钉假勤
</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="tableList"
border
stripe
:default-expand-all="false"
row-key="id"
:tree-props="{ children: 'userSalaryGrantRespVOList', hasChildren: 'hasChildren' }"
:span-method="spanMethod"
>
<el-table-column label="姓名" min-width="90px">
<template #default="{ row }">
<span v-if="row.userSalaryGrantRespVOList && row.userSalaryGrantRespVOList.length">
<span>{{ row.period }}</span>
<span class="ml-20px">考勤人数{{ row.grantNum }}</span>
<span class="ml-20px">不考勤人数{{ row.allGrantSalaryTotal }}</span>
</span>
<span v-else>
{{ row.name }}
</span>
</template>
</el-table-column>
<el-table-column prop="period" label="年月" min-width="90px" />
<el-table-column prop="dept" label="组织" min-width="90px" />
<el-table-column prop="post" label="计薪天数" min-width="90px" />
<el-table-column label="出勤天数" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="缺勤天数" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="事假时长" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="婚假天数" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="产假天数" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="丧假天数" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="旷工天数" align="center">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.baseSalary"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.baseSalary }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template #default="{ row }">
<el-button
type="primary"
style="padding: 0"
v-if="row.edit === '0'"
text
v-hasPermi="['home:false-dilegence:update']"
@click="handleEdit(row)"
>
修改
</el-button>
<el-button
type="primary"
v-else-if="row.edit === '1'"
text
style="padding: 0"
v-hasPermi="['home:false-dilegence:update']"
@click="handleSave(row)"
>
保存
</el-button>
<el-button
type="danger"
v-if="row.id"
:disabled="row.status == 1"
style="padding: 0"
text
v-hasPermi="['home:false-dilegence:sealup']"
@click="handleSealup(row)"
>
<span v-if="row.status == 0">封存</span>
<span v-else-if="row.status == 1">已封存</span>
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="searchForm.pageNo"
v-model:limit="searchForm.pageSize"
@pagination="getList"
/>
</div>
</template>
<script setup name="FalseDilegenceReport">
import { removeNullField } from '@/utils'
import { formatDate } from '@/utils/formatTime'
import * as SalaryApi from '@/api/home/salary.js'
const message = useMessage() // 消息弹窗
const searchForm = ref({
name: undefined,
period: undefined,
pageNo: 1,
pageSize: 20
})
onMounted(() => {
handleSearch()
})
function handleSearch() {
searchForm.value.pageNo = 1
getList()
}
const loading = ref(false)
const tableList = ref([])
const total = ref(0)
async function getList() {
loading.value = true
try {
let params = {
...searchForm.value
}
if (params.period) {
params = {
...params,
year: new Date(params.period).getFullYear(),
month: new Date(params.period).getMonth() + 1
}
}
const data = await SalaryApi.getSalaryPage(removeNullField(params))
if (searchForm.value.name) {
tableList.value = data.list.reduce((pre, cur) => {
return pre.concat(cur.userSalaryGrantRespVOList)
}, [])
} else {
tableList.value = data.list.map((it, index) => ({
...it,
id: index + 1,
edit: it.status == 1 ? '2' : '0'
}))
}
total.value = data.total
} catch (err) {
console.log(err)
} finally {
loading.value = false
}
}
function spanMethod({ row, columnIndex }) {
if (row.userSalaryGrantRespVOList && row.userSalaryGrantRespVOList.length > 0) {
if (columnIndex === 0) {
return [1, 11]
} else if (columnIndex == 11 && row.id) {
return [1, 1]
} else {
return [0, 0]
}
}
}
async function handleSync() {
const result = await message.prompt('请输入年月如2024-01')
message.success(`正在同步${formatDate(new Date(result.value), 'YYYY-MM')}假勤数据,请稍后...`)
}
function handleEdit(row) {
row.edit = '1'
row.userSalaryGrantRespVOList.forEach((it) => (it.edit = true))
}
async function handleSave(row) {
row.edit = '0'
row.userSalaryGrantRespVOList.forEach((it) => (it.edit = false))
loading.value = true
await SalaryApi.updateSalarySlip(row.userSalaryGrantRespVOList)
message.success('保存成功!')
getList()
}
async function handleSealup(row) {
try {
// 二次确认
await message.confirm('确认要封存"' + row.period + '"假勤吗?')
// 发起修改状态
await SalaryApi.sealupSalarySlip({
grantIdList: row.userSalaryGrantRespVOList.map((it) => it.grantId),
period: row.period
})
// 刷新列表
await getList()
} catch (err) {
console.log(err)
}
}
</script>
<style lang="scss" scoped>
:deep(.el-table__indent) {
display: none;
}
:deep(.el-table__placeholder) {
display: none;
}
</style>

View File

@@ -127,6 +127,11 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="微信号" prop="wxAlias">
<el-input v-model="formData.wxAlias" placeholder="请输入微信号" />
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注"> <el-form-item label="备注">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" /> <el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
@@ -243,7 +248,8 @@ const resetForm = () => {
hireDate: formatDate(new Date(), 'YYYY-MM-DD'), hireDate: formatDate(new Date(), 'YYYY-MM-DD'),
retireDate: undefined, retireDate: undefined,
attendanceSettingId: undefined, attendanceSettingId: undefined,
instanceIds: [] instanceIds: [],
wxAlias: ''
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

View File

@@ -33,6 +33,7 @@
<el-table-column label="姓名" prop="name" /> <el-table-column label="姓名" prop="name" />
<el-table-column label="职位" prop="post" /> <el-table-column label="职位" prop="post" />
<el-table-column label="手机号码" prop="mobile" width="120" /> <el-table-column label="手机号码" prop="mobile" width="120" />
<el-table-column label="微信号" prop="wxAlias" width="120" />
<el-table-column label="考勤方案" prop="attendanceSettingName" /> <el-table-column label="考勤方案" prop="attendanceSettingName" />
<el-table-column label="已开通系统" prop="instanceName" /> <el-table-column label="已开通系统" prop="instanceName" />
<el-table-column label="在职状态" key="status" width="150"> <el-table-column label="在职状态" key="status" width="150">
@@ -41,6 +42,8 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="0" :active-value="0"
:inactive-value="1" :inactive-value="1"
active-text="在职"
inactive-text="离职"
v-hasPermi="['pers:employee:update']" v-hasPermi="['pers:employee:update']"
@change="handleStatusChange(scope.row)" @change="handleStatusChange(scope.row)"
/> />