98 lines
2.7 KiB
Go
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
|
|
}
|