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" "github.com/samber/lo" "gorm.io/gorm" ) // 电话号码映射表:原始号码 -> 目标号码 var phoneMapping = map[string]string{ "15863272183": "15624971336", //毕德瑞 "15039229900": "18803928946", //陈春芳 "13832480736": "17746107444", //程宝江 "19290778586": "13196080727", //董跃亭 "18710227028": "13954838868", //方民 "17801586080": "15233398990", //韩玉玲 } // 使用示例:仅当号码在白名单中时才返回映射结果,否则返回原号码 func MapPhoneIfInList(phone string) string { if phoneMapping[phone] != "" { return phoneMapping[phone] } return phone } func SendQuestionnaireSurvey(req *bundle.SendQuestionnaireSurveyRequest) (resp *bundle.SendQuestionnaireSurveyResponse, err error) { resp = new(bundle.SendQuestionnaireSurveyResponse) phone := MapPhoneIfInList(req.UserTel) 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 = 0 where mau.deleted_at = 0 and mau.tel_num = ? `, phone).Scan(&userInfo).Error if err != nil { return resp, err } if userInfo.UserId == 0 { resp.Status = 1 return resp, nil } //判断是否在指定id列表中 userIds := []int{76, 77, 80, 82, 83, 98, 110, 119, 121, 137, 138, 140, 149, 152, 155, 156, 157, 163, 171, 178, 179, 183, 184, 187, 189, 195, 210, 212, 221, 223, 224, 225, 227, 229, 232, 233, 249, 279, 311, 274, 268, 314, 327, 291, 326, 320, 273, 319, 278, 264, 313, 296, 393, 395, 387, 371, 391, 366, 398, 400, 410, 411, 412, 419, 421, 430, 432, 540, 592, 630, 1015} if lo.Contains(userIds, userInfo.UserId) { resp.Status = 0 } else { resp.Status = 1 return resp, nil } questionnaireInfo := &model.QuestionnaireSurvey{} err = app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{}). Where("user_tel = ? and deleted_at is null", phone). Order("created_at desc"). First(&questionnaireInfo).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { resp.Status = 0 } else { return resp, err } } if questionnaireInfo.UserId != 0 { if questionnaireInfo.SurveyStatus == msg.QuestionnaireSent { resp.Status = 0 return resp, nil } 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 { if errors.Is(err, gorm.ErrRecordNotFound) { resp.Status = 1 return resp, 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 { if errors.Is(err, gorm.ErrRecordNotFound) { resp.Status = 1 return resp, nil } return resp, err } if bundleBalance.ID == 0 { resp.Status = 1 return resp, nil } bundleInfo := &model.BundleInfo{ BundleName: orderRecord.BundleName, StartAt: bundleBalance.StartAt, ExpiredAt: bundleBalance.ExpiredAt, BundleAccountNumber: 3, BundleVideoNumber: bundleBalance.BundleLimitVideoConsumptionNumber, IncreaseVideoNumber: bundleBalance.IncreaseVideoConsumptionNumber, 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")), SubmitTime: 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) { data = &model.QuestionnaireSurvey{} phone := MapPhoneIfInList(req.UserTel) err = app.ModuleClients.BundleDB.Model(&model.QuestionnaireSurvey{}). Where("user_tel = ? and deleted_at is null", phone). Order("created_at desc"). First(&data).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) { phone := MapPhoneIfInList(req.UserTel) 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", phone). 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 }