micro-bundle/internal/dao/questionnaire_survey.go
2026-03-11 18:42:50 +08:00

178 lines
6.0 KiB
Go

package dao
import (
"encoding/json"
"errors"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
"micro-bundle/pkg/app"
"micro-bundle/pkg/msg"
"time"
"github.com/google/uuid"
"gorm.io/gorm"
)
func SendQuestionnaireSurvey(req *bundle.SendQuestionnaireSurveyRequest) (resp *bundle.SendQuestionnaireSurveyResponse, err error) {
resp = new(bundle.SendQuestionnaireSurveyResponse)
userInfo := &model.UserInfo{}
err = app.ModuleClients.BundleDB.Raw(`
SELECT
mau.id as user_id,
mau.sub_num as user_num,
mau.tel_num as user_tel,
marn.name as user_name
from `+"`micro-account`.`user`"+` as mau
left join `+"`micro-account`.`real_name`"+` as marn on marn.id = mau.real_name_id and marn.deleted_at is null
where mau.deleted_at = 0 and mau.tel_num = ?
`, req.UserTel).Scan(&userInfo).Error
if err != nil {
return resp, err
}
if userInfo.UserId == 0 {
resp.Status = 1
return resp, nil
}
questionnaireInfo := &model.QuestionnaireSurvey{}
err = app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{}).
Where("user_tel = ? and deleted_at is null", req.UserTel).
First(&questionnaireInfo).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
resp.Status = 0
} else {
return resp, err
}
}
if questionnaireInfo.UserId != 0 {
resp.Status = 2
return resp, nil
}
orderRecord := &model.BundleOrderRecords{}
err = app.ModuleClients.BundleDB.Model(&model.BundleOrderRecords{}).
Where("customer_num = ? and deleted_at is null", userInfo.UserNum).
Order("created_at desc").
First(&orderRecord).Error
if err != nil {
return resp, err
}
bundleBalance := &model.BundleBalance{}
month := timeParse(req.EndTime + " 23:59:59").Format("2006-01")
err = app.ModuleClients.BundleDB.Model(&model.BundleBalance{}).
Where("order_uuid = ? and deleted_at is null", orderRecord.UUID).
Where("month = ?", month).
First(&bundleBalance).Error
if err != nil {
return resp, err
}
bundleInfo := &model.BundleInfo{
BundleName: orderRecord.BundleName,
StartAt: bundleBalance.StartAt,
ExpiredAt: bundleBalance.ExpiredAt,
BundleAccountNumber: 3,
BundleVideoNumber: bundleBalance.BundleLimitVideoConsumptionNumber,
IncreaseVideoNumber: bundleBalance.IncreaseLimitVideoConsumptionNumber,
BundleImageNumber: bundleBalance.BundleLimitImageConsumptionNumber,
BundleDataNumber: bundleBalance.BundleLimitDataAnalysisConsumptionNumber,
BundleCompetitiveNumber: bundleBalance.BundleLimitCompetitiveConsumptionNumber,
}
bundleInfoJSON, err := json.Marshal(bundleInfo)
if err != nil {
return resp, err
}
data := &model.QuestionnaireSurvey{
SurveyUUID: uuid.New().String(),
UserId: userInfo.UserId,
UserNum: userInfo.UserNum,
UserName: userInfo.UserName,
UserTel: userInfo.UserTel,
OrderUUID: orderRecord.UUID,
SendTime: timeParse(time.Now().Format("2006-01-02 15:04:05")),
SurveyStatus: msg.QuestionnaireSent,
BundleInfo: string(bundleInfoJSON),
SurveyTitle: req.SurveyTitle,
}
err = app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{}).Create(data).Error
if err != nil {
return resp, err
}
resp.Status = 0
return resp, nil
}
func GetQuestionnaireSurveyInfo(req *bundle.GetQuestionnaireSurveyInfoRequest) (data *model.QuestionnaireSurvey, err error) {
questionnaireInfo := &model.QuestionnaireSurvey{}
err = app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{}).
Where("user_tel = ? and deleted_at is null", req.UserTel).
Order("created_at desc").
First(&questionnaireInfo).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("问卷信息不存在")
}
return data, err
}
return data, nil
}
func CreateQuestionnaireSurveyAnswer(req *bundle.CreateQuestionnaireSurveyAnswerRequest) (err error) {
surveyAnswer := &model.SurveyAnswer{
BundleAccountScore: req.SurveyAnswer.BundleAccountScore,
BundleVideoScore: req.SurveyAnswer.BundleVideoScore,
IncreaseVideoScore: req.SurveyAnswer.IncreaseVideoScore,
BundleImageScore: req.SurveyAnswer.BundleImageScore,
BundleDataScore: req.SurveyAnswer.BundleDataScore,
BundleCompetitiveScore: req.SurveyAnswer.BundleCompetitiveScore,
ServiceResponseSpeed: req.SurveyAnswer.ServiceResponseSpeed,
ServiceStaffProfessionalism: req.SurveyAnswer.ServiceStaffProfessionalism,
}
surveyAnswerJSON, err := json.Marshal(surveyAnswer)
if err != nil {
return err
}
err = app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{}).
Where("user_tel = ? and deleted_at is null", req.UserTel).
Updates(map[string]interface{}{
"survey_answer": string(surveyAnswerJSON),
"merits_review": req.SurveyFeedback.MeritsReview,
"suggestionsor_improvements": req.SurveyFeedback.SuggestionsorImprovements,
"additional_comments": req.SurveyFeedback.AdditionalComments,
"submit_time": timeParse(time.Now().Format("2006-01-02 15:04:05")),
"survey_status": msg.QuestionnaireSubmitted,
"survey_url": req.SurveyUrl,
"submit_by": req.SubmitBy,
}).Error
if err != nil {
return err
}
return nil
}
func GetQuestionnaireSurveyList(req *bundle.GetQuestionnaireSurveyListRequest) (data []*model.QuestionnaireSurvey, total int64, err error) {
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 10
}
query := app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{})
if req.UserName != "" {
query = query.Where("user_name = ?", req.UserName)
}
if req.SurveyTitle != "" {
query = query.Where("survey_title = ?", req.SurveyTitle)
}
if req.SurveyStatus != 0 {
query = query.Where("survey_status = ?", req.SurveyStatus)
}
query = query.Order("created_at desc")
query.Count(&total)
query = query.Limit(int(req.PageSize)).Offset(int(req.Page-1) * int(req.PageSize))
err = query.Find(&data).Error
if err != nil {
return data, total, err
}
return data, total, nil
}