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 }