优化仪表盘等
This commit is contained in:
@@ -304,3 +304,47 @@ func (c *TaskController) DeleteTask() {
|
||||
}
|
||||
c.ServeJSON()
|
||||
}
|
||||
|
||||
// 仪表盘获取待办任务
|
||||
// GetTodoTasks 获取待办任务列表
|
||||
// @router /api/oa/tasks/todo [get]
|
||||
func (c *TaskController) GetTodoTasks() {
|
||||
// 优先取查询参数,其次取中间件写入的上下文
|
||||
tenantId, _ := c.GetInt("tenantId", 0)
|
||||
if tenantId == 0 {
|
||||
if v := c.Ctx.Input.GetData("tenantId"); v != nil {
|
||||
if tid, ok := v.(int); ok {
|
||||
tenantId = tid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
id, _ := c.GetInt("id", 0)
|
||||
if id == 0 {
|
||||
if v := c.Ctx.Input.GetData("id"); v != nil {
|
||||
if uid, ok := v.(int); ok {
|
||||
id = uid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
limit, _ := c.GetInt("limit", 10)
|
||||
|
||||
tasks, err := services.GetTodoTasks(tenantId, id, limit)
|
||||
if err != nil {
|
||||
c.Data["json"] = map[string]interface{}{
|
||||
"code": 1,
|
||||
"message": "获取待办任务失败: " + err.Error(),
|
||||
"data": nil,
|
||||
}
|
||||
c.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
c.Data["json"] = map[string]interface{}{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": tasks,
|
||||
}
|
||||
c.ServeJSON()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
-- 反馈表:sys_feedback(修复TEXT字段默认值错误)
|
||||
CREATE TABLE `sys_feedback` (
|
||||
`id` varchar(36) NOT NULL COMMENT 'ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`feedback_name` varchar(50) DEFAULT '' COMMENT '反馈人姓名',
|
||||
`module` varchar(30) NOT NULL COMMENT '反馈对应模块',
|
||||
`feedback_type` varchar(20) NOT NULL COMMENT '反馈类型',
|
||||
`content` text NOT NULL COMMENT '反馈详细内容',
|
||||
`attachment_url` varchar(255) DEFAULT '' COMMENT '附件URL',
|
||||
`handle_status` varchar(20) NOT NULL DEFAULT '0' COMMENT '处理状态(0-待处理/1-处理中/2-已解决/3-已驳回/4-无需处理)',
|
||||
`handle_remark` text COMMENT '处理备注(移除默认值,TEXT类型不支持)',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`) COMMENT '租户ID索引,优化租户级查询',
|
||||
KEY `idx_module` (`module`) COMMENT '模块索引,优化模块级反馈统计',
|
||||
KEY `idx_handle_status` (`handle_status`) COMMENT '处理状态索引,优化待处理反馈查询',
|
||||
KEY `idx_create_time` (`create_time`) COMMENT '创建时间索引,优化时间范围查询'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通用反馈表(支持租户隔离、软删除)';
|
||||
@@ -22,5 +22,8 @@ func main() {
|
||||
}
|
||||
})
|
||||
|
||||
// 静态资源:映射 /uploads 到本地 uploads 目录,供前端访问上传文件
|
||||
beego.SetStaticPath("/uploads", "uploads")
|
||||
|
||||
beego.Run()
|
||||
}
|
||||
|
||||
@@ -48,6 +48,10 @@ func (f *FileInfo) TableName() string {
|
||||
return "yz_files"
|
||||
}
|
||||
|
||||
func init() {
|
||||
// Removed duplicate ORM registration
|
||||
}
|
||||
|
||||
// CanPreview 判断文件是否可以在线预览
|
||||
func (f *FileInfo) CanPreview() bool {
|
||||
previewableExts := map[string]bool{
|
||||
|
||||
@@ -121,3 +121,18 @@ func UpdateTask(t *Task, cols ...string) error {
|
||||
_, err := o.Update(t, cols...)
|
||||
return err
|
||||
}
|
||||
|
||||
// GetTodoTasks 获取待办任务列表
|
||||
func GetTodoTasks(tenantId int, id int, limit int) (tasks []*Task, err error) {
|
||||
o := orm.NewOrm()
|
||||
qs := o.QueryTable(new(Task)).Filter("tenant_id", tenantId).Filter("deleted_time__isnull", true)
|
||||
// 如果传了用户,则筛选负责人为该用户的任务
|
||||
if id > 0 {
|
||||
qs = qs.Filter("principal_id", id)
|
||||
}
|
||||
if limit <= 0 {
|
||||
limit = 10
|
||||
}
|
||||
_, err = qs.OrderBy("-id").Limit(limit).All(&tasks)
|
||||
return
|
||||
}
|
||||
|
||||
+20
-19
@@ -8,25 +8,26 @@ import (
|
||||
)
|
||||
|
||||
type Tenant struct {
|
||||
Id int `orm:"pk;auto" json:"id"`
|
||||
Name string `orm:"size(100)" json:"name"`
|
||||
Code string `orm:"size(50);unique" json:"code"`
|
||||
Owner string `orm:"size(50)" json:"owner"`
|
||||
Phone string `orm:"size(20);null" json:"phone"`
|
||||
Email string `orm:"size(100);null" json:"email"`
|
||||
Status int `orm:"default(1)" json:"status"`
|
||||
AuditStatus string `orm:"size(20);default(pending)" json:"audit_status"`
|
||||
AuditComment string `orm:"type(text);null" json:"audit_comment"`
|
||||
AuditBy string `orm:"size(50);null" json:"audit_by"`
|
||||
AuditTime *time.Time `orm:"null;type(datetime)" json:"audit_time"`
|
||||
Capacity int `orm:"default(0)" json:"capacity"`
|
||||
CapacityUsed int `orm:"default(0)" json:"capacity_used"`
|
||||
Remark string `orm:"type(text);null" json:"remark"`
|
||||
CreateTime time.Time `orm:"auto_now_add;type(datetime)" json:"create_time"`
|
||||
UpdateTime time.Time `orm:"auto_now;type(datetime)" json:"update_time"`
|
||||
DeleteTime *time.Time `orm:"null;type(datetime)" json:"delete_time"`
|
||||
CreateBy string `orm:"size(50);null" json:"create_by"`
|
||||
UpdateBy string `orm:"size(50);null" json:"update_by"`
|
||||
Id int `orm:"pk;auto" json:"id"`
|
||||
Name string `orm:"size(100)" json:"name"`
|
||||
Code string `orm:"size(50);unique" json:"code"`
|
||||
Owner string `orm:"size(50)" json:"owner"`
|
||||
Phone string `orm:"size(20);null" json:"phone"`
|
||||
Email string `orm:"size(100);null" json:"email"`
|
||||
Status int `orm:"default(1)" json:"status"`
|
||||
AuditStatus string `orm:"size(20);default(pending)" json:"audit_status"`
|
||||
AuditComment string `orm:"type(text);null" json:"audit_comment"`
|
||||
AuditBy string `orm:"size(50);null" json:"audit_by"`
|
||||
AuditTime *time.Time `orm:"null;type(datetime)" json:"audit_time"`
|
||||
Capacity int `orm:"default(0)" json:"capacity"`
|
||||
CapacityUsed int `orm:"default(0)" json:"capacity_used"`
|
||||
AttachmentUrl string `orm:"size(255);null" json:"attachment_url"`
|
||||
Remark string `orm:"type(text);null" json:"remark"`
|
||||
CreateTime time.Time `orm:"auto_now_add;type(datetime)" json:"create_time"`
|
||||
UpdateTime time.Time `orm:"auto_now;type(datetime)" json:"update_time"`
|
||||
DeleteTime *time.Time `orm:"null;type(datetime)" json:"delete_time"`
|
||||
CreateBy string `orm:"size(50);null" json:"create_by"`
|
||||
UpdateBy string `orm:"size(50);null" json:"update_by"`
|
||||
}
|
||||
|
||||
// TableName 设置表名
|
||||
|
||||
@@ -270,6 +270,8 @@ func init() {
|
||||
// 文件管理路由 - 手动配置以匹配前端的 /api/files 路径
|
||||
beego.Router("/api/files", &controllers.FileController{}, "get:GetAllFiles")
|
||||
beego.Router("/api/files", &controllers.FileController{}, "post:Post")
|
||||
// 兼容前端上传地址 /api/files/upload -> 复用 Post 处理上传
|
||||
beego.Router("/api/files/upload", &controllers.FileController{}, "post:Post")
|
||||
beego.Router("/api/files/my", &controllers.FileController{}, "get:GetMyFiles")
|
||||
beego.Router("/api/files/download/:id", &controllers.FileController{}, "get:DownloadFile")
|
||||
beego.Router("/api/files/preview/:id", &controllers.FileController{}, "get:PreviewFile")
|
||||
@@ -315,6 +317,7 @@ func init() {
|
||||
// OA任务管理路由
|
||||
beego.Router("/api/oa/tasks", &controllers.TaskController{}, "get:GetTasks;post:CreateTask")
|
||||
beego.Router("/api/oa/tasks/:id", &controllers.TaskController{}, "get:GetTaskById;put:UpdateTask;delete:DeleteTask")
|
||||
beego.Router("/api/oa/tasks/todo", &controllers.TaskController{}, "get:GetTodoTasks")
|
||||
|
||||
// 权限管理路由
|
||||
beego.Router("/api/permissions/menus", &controllers.PermissionController{}, "get:GetAllMenuPermissions")
|
||||
|
||||
@@ -69,3 +69,8 @@ func DeleteOATask(id int, operatorName string, operatorId int) error {
|
||||
func genTaskNo(tenantId int) string {
|
||||
return fmt.Sprintf("TASK%d%s", tenantId, time.Now().Format("20060102150405"))
|
||||
}
|
||||
|
||||
// 仪表盘获取待办任务
|
||||
func GetTodoTasks(tenantId int, id int, limit int) (tasks []*models.Task, err error) {
|
||||
return models.GetTodoTasks(tenantId, id, limit)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user