package db import ( "context" ) type ListProjectConditionParam struct { TimeBegin string TimeEnd string IsTitle bool Title string Status int16 PageID int32 PageSize int32 } type ProjectView struct { Project // 字符串ID SID string `json:"sid"` CustomerName string `json:"customer_name"` ApplyName string `json:"apply_name"` CreatedName string `json:"created_name"` UpdatedName string `json:"updated_name"` StatusName string `json:"status_name"` ManagerName string `json:"manager_name"` MemberNames string `json:"member_names"` } func (store *SQLStore) ListProjectCondition(ctx context.Context, arg *ListProjectConditionParam) ([]*ProjectView, int64, error) { query, args, err := BuildQuery(` SELECT COUNT(1) FROM projects WHERE created_at BETWEEN @start AND @end {{if ne .status 9999}}AND status = @status{{end}} {{if .isTitle}}AND name LIKE @title{{end}}; `, map[string]any{ "start": arg.TimeBegin, "end": arg.TimeEnd, "status": arg.Status, "isTitle": arg.IsTitle, "title": arg.Title, }) if err != nil { return nil, 0, err } var total int64 if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil { return nil, 0, err } if total <= 0 { return nil, 0, nil } query, args, err = BuildQuery(` SELECT id, name, start_at, end_at, customer_id, total_money, description, apply_at, COALESCE((SELECT name FROM customers WHERE id = projects.customer_id), '') as customer_name, COALESCE((SELECT username FROM sys_user WHERE id = projects.apply_user_id), '') as apply_name, status, sort, created_at, updated_at, created_user_id, COALESCE((SELECT username FROM sys_user WHERE id = projects.created_user_id), '') as created_name, updated_user_id, COALESCE((SELECT username FROM sys_user WHERE id = projects.updated_user_id), '') as updated_name, (CASE WHEN status=-1 THEN '已删除' WHEN status=0 THEN '未开始' WHEN status=10 THEN '进行中' WHEN status=20 THEN '已结项' ELSE '未知' END) as status_name, COALESCE((SELECT username FROM sys_user WHERE id = projects.manager_id), '') as manager_name, COALESCE((SELECT string_agg(username, ',') FROM sys_user WHERE id::text = ANY (string_to_array(projects.members, ','))), '') as member_names FROM projects WHERE created_at BETWEEN @start AND @end {{if ne .status 9999}}AND status = @status{{end}} {{if .isTitle}}AND name LIKE @title{{end}} ORDER BY id DESC LIMIT @limit OFFSET @offset; `, map[string]any{ "start": arg.TimeBegin, "end": arg.TimeEnd, "status": arg.Status, "isTitle": arg.IsTitle, "title": arg.Title, "limit": arg.PageSize, "offset": (arg.PageID - 1) * arg.PageSize, }) if err != nil { return nil, 0, err } rows, err := store.db.Query(ctx, query, args...) if err != nil { return nil, 0, err } defer rows.Close() items := []*ProjectView{} for rows.Next() { var i ProjectView if err := rows.Scan( &i.SID, &i.Name, &i.StartAt, &i.EndAt, &i.CustomerID, &i.TotalMoney, &i.Description, &i.ApplyAt, &i.CustomerName, &i.ApplyName, &i.Status, &i.Sort, &i.CreatedAt, &i.UpdatedAt, &i.CreatedUserID, &i.CreatedName, &i.UpdatedUserID, &i.UpdatedName, &i.StatusName, &i.ManagerName, &i.MemberNames, ); err != nil { return nil, 0, err } items = append(items, &i) } if err := rows.Err(); err != nil { return nil, 0, err } return items, total, nil }