feat: 实现20260730优化方案全部功能
- AI文件审查:.docx上传提取文本,支持多种文档类型 - 用工办理工作流:WorkProcess页面+后端API,支持入职/续签/终止等流程 - 企业自建文本库:Templates页面Tab切换,企业模板CRUD+渲染+下载Word - 考勤发布:Attendance发布/取消发布按钮,员工端MyAttendance页面 - 工资条发布:Money发布/定时发送按钮+弹窗,portal端publishStatus过滤 - 合同到期弹窗:Dashboard合同到期预警可点击打开弹窗,支持续签/终止操作 - Prisma schema新增WorkProcess/EnterpriseTemplate/AttendancePublish模型 - 前后端编译验证全部通过
This commit is contained in:
@@ -21,6 +21,7 @@ import {
|
||||
deleteLeaveRecord,
|
||||
} from '../services/attendance.service'
|
||||
import { createEvidence } from '../services/evidence.service'
|
||||
import prisma from '../lib/prisma'
|
||||
|
||||
const router = Router()
|
||||
|
||||
@@ -238,4 +239,76 @@ router.delete('/leaves/:id', authMiddleware, async (req: AuthRequest, res: Respo
|
||||
} catch (err) { next(err) }
|
||||
})
|
||||
|
||||
// ========== 考勤发布 ==========
|
||||
|
||||
// 发布考勤表
|
||||
router.post('/publish', authMiddleware, async (req: AuthRequest, res: Response, next: NextFunction) => {
|
||||
try {
|
||||
const { month, title } = req.body
|
||||
if (!month) {
|
||||
return res.status(400).json({ success: false, error: { code: 'MISSING_MONTH', message: '请选择月份' } })
|
||||
}
|
||||
// 检查是否已发布且未取消
|
||||
const existing = await (prisma as any).attendancePublish.findFirst({
|
||||
where: { orgId: req.user!.orgId, month, status: 'PUBLISHED' },
|
||||
})
|
||||
if (existing) {
|
||||
return res.status(400).json({ success: false, error: { code: 'ALREADY_PUBLISHED', message: `${month}月考勤表已发布` } })
|
||||
}
|
||||
// 如果有已取消的记录,删除后重新创建
|
||||
const cancelled = await (prisma as any).attendancePublish.findFirst({
|
||||
where: { orgId: req.user!.orgId, month, status: 'CANCELLED' },
|
||||
})
|
||||
if (cancelled) {
|
||||
await (prisma as any).attendancePublish.delete({ where: { id: cancelled.id } })
|
||||
}
|
||||
const record = await (prisma as any).attendancePublish.create({
|
||||
data: {
|
||||
orgId: req.user!.orgId,
|
||||
month,
|
||||
title: title || `${month}月考勤表`,
|
||||
createdBy: req.user!.id,
|
||||
},
|
||||
})
|
||||
res.json({ success: true, data: record })
|
||||
} catch (err) {
|
||||
next(err)
|
||||
}
|
||||
})
|
||||
|
||||
// 发布记录列表
|
||||
router.get('/publish-records', authMiddleware, async (req: AuthRequest, res: Response, next: NextFunction) => {
|
||||
try {
|
||||
const records = await (prisma as any).attendancePublish.findMany({
|
||||
where: { orgId: req.user!.orgId },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
})
|
||||
res.json({ success: true, data: records })
|
||||
} catch (err) {
|
||||
next(err)
|
||||
}
|
||||
})
|
||||
|
||||
// 取消发布
|
||||
router.post('/publish/:id/cancel', authMiddleware, async (req: AuthRequest, res: Response, next: NextFunction) => {
|
||||
try {
|
||||
const record = await (prisma as any).attendancePublish.findFirst({
|
||||
where: { id: req.params.id, orgId: req.user!.orgId },
|
||||
})
|
||||
if (!record) {
|
||||
return res.status(404).json({ success: false, error: { code: 'NOT_FOUND', message: '发布记录不存在' } })
|
||||
}
|
||||
if (record.status !== 'PUBLISHED') {
|
||||
return res.status(400).json({ success: false, error: { code: 'NOT_PUBLISHED', message: '仅已发布状态可取消' } })
|
||||
}
|
||||
const updated = await (prisma as any).attendancePublish.update({
|
||||
where: { id: record.id },
|
||||
data: { status: 'CANCELLED' },
|
||||
})
|
||||
res.json({ success: true, data: updated })
|
||||
} catch (err) {
|
||||
next(err)
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
|
||||
Reference in New Issue
Block a user