Files
web_hghl_server/web/service/srv_questionnaire/questionnaire.go
T
2026-10-26 16:28:14 +08:00

98 lines
2.7 KiB
Go

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
}