POST/api/projects/:projectId/appeals:projectId 是要申诉的项目的唯一标识符。{
"appealType": "dateRange", // 或 "longTerm"
"startDate": "2025-03-01", // 申诉开始日期 (YYYY-MM-DD)
"endDate": "2025-03-05", // 申诉结束日期 (YYYY-MM-DD)
"reason": "由于当地村民阻工,导致项目无法正常施工,具体地点:XX村,阻工方:村民代表李四,阻工原因:土地纠纷。",
"adminApproverId": "admin123", // 管理员用户ID
"leaderApproverId": "leader456", // 领导用户ID
"attachments": [ // 可选:申诉相关的附件,如照片、证明文件等
{
"fileName": "阻工照片1.jpg",
"fileUrl": "https://your-oss-bucket.com/uploads/abc.jpg"
},
{
"fileName": "情况说明.pdf",
"fileUrl": "https://your-oss-bucket.com/uploads/def.pdf"
}
]
}appealType (String, 必填): 申诉类型。"dateRange": 日期范围申诉。"longTerm": 长期申诉。startDate (String, 必填): 申诉的开始日期,格式为 YYYY-MM-DD。endDate (String, 必填): 申诉的结束日期,格式为 YYYY-MM-DD。reason (String, 必填): 详细的申诉理由。adminApproverId (String, 必填): 选定的管理员审批人的用户ID。leaderApproverId (String, 必填): 选定的领导审批人的用户ID。attachments (Array of Objects, 可选): 附件列表。每个附件包含 fileName 和 fileUrl。fileUrl 应是文件上传服务(如腾讯云COS)返回的URL。{
"code": 0,
"message": "申诉提交成功",
"data": {
"appealId": "appeal789", // 新创建的申诉记录ID
"projectId": "proj001",
"appealType": "dateRange",
"startDate": "2025-03-01",
"endDate": "2025-03-05",
"reason": "由于当地村民阻工...",
"adminApproverId": "admin123",
"leaderApproverId": "leader456",
"status": "pending", // 初始状态为“待审批”
"createdAt": "2025-03-01T10:00:00Z"
// ... 其他申诉详情
}
}{
"code": 1001, // 错误码,具体定义
"message": "请求参数无效:开始日期不能早于项目订单导入时间。",
"details": {
"field": "startDate",
"value": "2025-01-01"
}
}projectId 是否存在。appealType 是否为 dateRange 或 longTerm。startDate 和 endDate 是否为有效的日期格式。reason 是否为空。adminApproverId 和 leaderApproverId 是否存在于用户数据库中,并且具有相应的角色。startDate 不能早于项目的 importDate。endDate 必须晚于 startDate。appealType 是 longTerm,则 startDate 必须等于项目的 importDate。Appeal 文档。Appeal 文档应包含以下字段:_id (ObjectId): 申诉ID。projectId (ObjectId): 关联的项目ID。projectName (String): 项目名称 (冗余存储,方便查询)。submitterId (ObjectId): 提交申诉的用户ID。submitterName (String): 提交人姓名。appealType (String): 申诉类型 (dateRange / longTerm)。startDate (Date): 申诉开始日期。endDate (Date): 申诉结束日期。reason (String): 申诉理由。adminApproverId (ObjectId): 管理员审批人ID。adminApproverName (String): 管理员审批人姓名。leaderApproverId (ObjectId): 领导审批人ID。leaderApproverName (String): 领导审批人姓名。status (String): 申诉状态 (pending, approved, rejected, cancelled)。初始为 pending。adminApprovalStatus (String): 管理员审批状态 (pending, approved, rejected)。leaderApprovalStatus (String): 领导审批状态 (pending, approved, rejected)。adminApprovalDate (Date, Optional): 管理员审批时间。leaderApprovalDate (Date, Optional): 领导审批时间。adminApprovalComment (String, Optional): 管理员审批意见。leaderApprovalComment (String, Optional): 领导审批意见。attachments (Array of Objects, Optional): 附件列表。createdAt (Date): 申诉创建时间。updatedAt (Date): 申诉最后更新时间。appealStatus 字段为 1 (申诉中) 和 appealProgress 字段为 33 (申诉提交)。adminApproverId 和 leaderApproverId 发送通知(例如,站内信、邮件、钉钉消息),告知有新的申诉待审批。src 目录):src/models/appeal.js: 定义 MongoDB 的 Appeal Schema 和 Model。src/controller/appeal/api.js: 处理申诉相关的业务逻辑。src/routes/appeals.js: 定义路由。src/routes.js: 在主路由文件中引入并使用 appeals 路由。PUT /api/appeals/:appealId/approve 或 PUT /api/appeals/:appealId/reject)。pending -> adminApproved -> leaderApproved -> approved 或 rejected。GET /api/appeals:获取所有申诉列表(可能需要分页、过滤、排序)。GET /api/appeals/:appealId:获取单个申诉的详细信息。POST /api/upload),将文 件存储到腾讯云COS等对象存储服务,然后将返回的URL和文件名包含在申诉请求体中。你的 src/utils/txCOS.js 看起来就是用于此目的。User 模型包含 name 字段和可能的 dingtalkId 字段,以便于审批人选择和通知。