Initial commit: web_hghl_server

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 16:28:14 +08:00
co-authored by Claude Opus 4.7
commit 65fca60622
653 changed files with 135901 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
package srv_questionnaire
import (
"videoweb/pub/models/questionnairemod"
"videoweb/pub/pubdef"
)
// ListReq 查询问卷列表请求
type ListReq struct {
pubdef.Page
QuestionType *string `json:"questionType"` // 模糊匹配:问题类型(选填)
Status *string `json:"status"` // 精确匹配:处理状态(选填)
StartTime *int64 `json:"startTime"` // 创建时间范围-开始,Unix 时间戳(秒,选填)
EndTime *int64 `json:"endTime"` // 创建时间范围-结束,Unix 时间戳(秒,选填)
}
// ListResp 查询问卷列表响应
type ListResp struct {
Total int64 `json:"total"` // 满足条件的总条数
List []*questionnairemod.QuestionnaireModel `json:"list"` // 当前页数据
}
// HandleReq 处理问卷请求
type HandleReq struct {
Id string `json:"id" binding:"required"` // 问卷ID(ObjectID 字符串)
Status string `json:"status" binding:"required"` // 目标状态:processed 已处理 / reject 拒绝
Remark string `json:"remark"` // 备注(选填)
}
@@ -0,0 +1,97 @@
package srv_questionnaire
import (
"context"
"time"
"videoweb/pub/common/srvdef"
"videoweb/pub/models/questionnairemod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
// List 查询问卷列表(分页 + 条件筛选)
func List(ctx context.Context, req *ListReq) (*ListResp, *srvdef.SrvErr) {
if req.PageNum < 1 {
req.PageNum = 1
}
if req.PageSize < 1 {
req.PageSize = 20
}
filter := bson.M{}
if req.QuestionType != nil && *req.QuestionType != "" {
filter[questionnairemod.FN.Questionnaire.QuestionType] = bson.M{
"$regex": *req.QuestionType,
}
}
if req.Status != nil && *req.Status != "" {
filter[questionnairemod.FN.Questionnaire.Status] = *req.Status
}
if req.StartTime != nil || req.EndTime != nil {
timeRange := bson.M{}
if req.StartTime != nil {
timeRange["$gte"] = time.Unix(*req.StartTime, 0)
}
if req.EndTime != nil {
timeRange["$lte"] = time.Unix(*req.EndTime, 0)
}
filter[questionnairemod.FN.Questionnaire.CreatedAt] = timeRange
}
total, serr := questionnairemod.Count(ctx, filter)
if serr != nil {
return nil, serr
}
if total == 0 {
return &ListResp{Total: 0, List: make([]*questionnairemod.QuestionnaireModel, 0)}, nil
}
opt := options.Find().
SetSort(bson.D{{Key: questionnairemod.FN.Questionnaire.CreatedAt, Value: -1}}).
SetSkip((req.PageNum - 1) * req.PageSize).
SetLimit(req.PageSize)
list, serr := questionnairemod.FindMany(ctx, filter, opt)
if serr != nil {
return nil, serr
}
return &ListResp{Total: total, List: list}, nil
}
// Handle 处理问卷(仅允许"待处理"状态的问卷被更新)
func Handle(ctx context.Context, req *HandleReq) *srvdef.SrvErr {
objId, err := primitive.ObjectIDFromHex(req.Id)
if err != nil {
return srvdef.New(srvdef.ErrParamError, "问卷ID格式错误", "")
}
filter := bson.M{
questionnairemod.FN.Questionnaire.Id: objId,
questionnairemod.FN.Questionnaire.Status: questionnairemod.StatusPending,
}
update := bson.M{
"$set": bson.M{
questionnairemod.FN.Questionnaire.Status: req.Status,
questionnairemod.FN.Questionnaire.Remark: req.Remark,
questionnairemod.FN.Questionnaire.UpdatedAt: time.Now(),
},
}
matched, serr := questionnairemod.UpdateOne(ctx, filter, update)
if serr != nil {
return serr
}
if matched == 0 {
// 区分"不存在"与"状态不是待处理"
_, serr2 := questionnairemod.FindOne(ctx, bson.M{questionnairemod.FN.Questionnaire.Id: objId})
if serr2 != nil {
return srvdef.New(srvdef.ErrNoData, "问卷不存在", "")
}
return srvdef.New(srvdef.Err, "该问卷已处理,不可重复操作", "该问卷已处理,不可重复操作")
}
return nil
}