|
|
|
package service
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/base64"
|
|
|
|
e "errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/xuri/excelize/v2"
|
|
|
|
"gold-shop/errors"
|
|
|
|
"gold-shop/global"
|
|
|
|
"gold-shop/model"
|
|
|
|
"gold-shop/request"
|
|
|
|
"gold-shop/request/manage"
|
|
|
|
"gold-shop/utils"
|
|
|
|
"gold-shop/utils/excel"
|
|
|
|
"gold-shop/utils/result"
|
|
|
|
"gold-shop/utils/tlpay"
|
|
|
|
"gold-shop/utils/tlpay/param"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
var UserService = userService{}
|
|
|
|
|
|
|
|
type userService struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) Login(mobile string, password string) (string, error) {
|
|
|
|
user := &model.User{}
|
|
|
|
err := global.DB.Where("mobile", mobile).First(user).Error
|
|
|
|
if e.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
return "", errors.NewBusinessError("手机号或密码错误")
|
|
|
|
}
|
|
|
|
if utils.PasswordVerify(password, user.PasswordHash) {
|
|
|
|
return utils.GenerateToken(user.ID, "user")
|
|
|
|
}
|
|
|
|
return "", errors.NewBusinessError("手机号或密码错误")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) Register(mobile string, password string) error {
|
|
|
|
user := &model.User{}
|
|
|
|
err := global.DB.Where("mobile", mobile).First(user).Error
|
|
|
|
if err == nil {
|
|
|
|
return errors.NewBusinessError("手机号已注册")
|
|
|
|
}
|
|
|
|
user.Mobile = mobile
|
|
|
|
passwordHash, _ := utils.PasswordHash(password)
|
|
|
|
user.PasswordHash = passwordHash
|
|
|
|
user.Status = 1
|
|
|
|
return global.DB.Save(user).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) GetUserInfo(userId int) *model.User {
|
|
|
|
user := &model.User{}
|
|
|
|
global.DB.Where("id", userId).First(user)
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) ModifyPassword(password string, oldPassword string, user *model.User) error {
|
|
|
|
if !utils.PasswordVerify(oldPassword, user.PasswordHash) {
|
|
|
|
return errors.NewBusinessError("旧密码错误")
|
|
|
|
}
|
|
|
|
passwordHash, _ := utils.PasswordHash(password)
|
|
|
|
user.PasswordHash = passwordHash
|
|
|
|
return global.DB.Save(user).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) GetUserData(user *model.User) result.Data {
|
|
|
|
var orderCount int64
|
|
|
|
global.DB.Model(&model.Order{}).Where("user_id", user.ID).Count(&orderCount)
|
|
|
|
data := result.Data{
|
|
|
|
"orderCount": orderCount,
|
|
|
|
}
|
|
|
|
return data
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) GetUsers(req manage.UserQueryRequest) ([]model.User, int64) {
|
|
|
|
users := make([]model.User, req.PageSize)
|
|
|
|
offset := (req.Page - 1) * req.PageSize
|
|
|
|
var total int64
|
|
|
|
tx := s.buildQuery(req)
|
|
|
|
tx.Order("id desc").Offset(offset).Limit(req.PageSize).Find(&users)
|
|
|
|
tx.Model(&model.User{}).Count(&total)
|
|
|
|
return users, total
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) SaveAlipayAccount(alipayAccount string, user *model.User) error {
|
|
|
|
err := global.DB.Model(&model.User{}).Where("id", user.ID).Update("alipay_account", alipayAccount).Error
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) buildQuery(req manage.UserQueryRequest) *gorm.DB {
|
|
|
|
tx := global.DB
|
|
|
|
if req.Mobile != "" {
|
|
|
|
tx = tx.Where("mobile", req.Mobile)
|
|
|
|
}
|
|
|
|
if req.Status != "" {
|
|
|
|
tx = tx.Where("status", req.Status)
|
|
|
|
}
|
|
|
|
return tx
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) GenerateUsersExcel(req manage.UserQueryRequest) *excelize.File {
|
|
|
|
pageSize := 200
|
|
|
|
lastID := 0
|
|
|
|
tx := s.buildQuery(req)
|
|
|
|
f := excel.NewFile()
|
|
|
|
headers := []string{"用户ID", "手机号", "支付宝账号", "账户余额", "用户状态", "注册时间"}
|
|
|
|
excel.SetSimpleHeaders(headers, "Sheet1", f)
|
|
|
|
for {
|
|
|
|
users := make([]model.User, pageSize)
|
|
|
|
tx.Where("id > ?", lastID).Limit(pageSize).Find(&users)
|
|
|
|
count := len(users)
|
|
|
|
if count == 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
s.buildUserListExcel(users, "Sheet1", f)
|
|
|
|
lastIndex := count - 1
|
|
|
|
lastID = users[lastIndex].ID
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) buildUserListExcel(users []model.User, sheet string, f *excelize.File) {
|
|
|
|
row := 2
|
|
|
|
for _, user := range users {
|
|
|
|
col := 0
|
|
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), user.ID)
|
|
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), user.Mobile)
|
|
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), user.AlipayAccount)
|
|
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), user.Balance)
|
|
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), user.GetStatusText())
|
|
|
|
f.SetCellValue(sheet, excel.CellKey(row, &col), user.CreatedAt.Format(time.DateTime))
|
|
|
|
row++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) TlBindingApply(req request.TlBindingApplyRequest, user *model.User) (string, error) {
|
|
|
|
thpInfo, err := s.doTlBindingApply(req, user)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
_, err = s.createBankCard(req, user)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return thpInfo, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) doTlBindingApply(req request.TlBindingApplyRequest, user *model.User) (string, error) {
|
|
|
|
acctType := "00"
|
|
|
|
if req.AcctType != "" {
|
|
|
|
acctType = req.AcctType
|
|
|
|
}
|
|
|
|
p := param.AgreeApplyParam{}
|
|
|
|
p.Mobile = req.Mobile
|
|
|
|
p.IdNo = req.IdNo
|
|
|
|
p.Cvv2 = req.Cvv2
|
|
|
|
p.AcctNo = req.AcctNo
|
|
|
|
p.AcctName = req.AcctName
|
|
|
|
p.ValidDate = req.ValidDate
|
|
|
|
p.MerUserID = strconv.Itoa(user.ID)
|
|
|
|
p.IdType = "0"
|
|
|
|
p.AcctType = acctType
|
|
|
|
p.ReqIp = "127.0.0.1"
|
|
|
|
p.Version = "11"
|
|
|
|
|
|
|
|
r, err := tlpay.TLPay.AgreeApply(p)
|
|
|
|
fmt.Println(r)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
if r.RetCode != "SUCCESS" {
|
|
|
|
return "", errors.NewBusinessError(r.RetMsg)
|
|
|
|
}
|
|
|
|
if r.TrxStatus != "1999" {
|
|
|
|
return "", errors.NewBusinessError(r.ErrMsg)
|
|
|
|
}
|
|
|
|
return base64.StdEncoding.EncodeToString([]byte(r.ThpInfo)), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) createBankCard(req request.TlBindingApplyRequest, user *model.User) (*model.UserBankCard, error) {
|
|
|
|
c := model.UserBankCard{}
|
|
|
|
err := global.DB.Where("user_id", user.ID).Where("account_no", req.AcctNo).First(&c).Error
|
|
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if err == nil && c.Status == 1 {
|
|
|
|
return nil, errors.NewBusinessError("该卡号已绑定")
|
|
|
|
}
|
|
|
|
c.AccountName = req.AcctName
|
|
|
|
c.IdCardNo = req.IdNo
|
|
|
|
c.AccountNo = req.AcctNo
|
|
|
|
c.Mobile = req.Mobile
|
|
|
|
c.Status = 0
|
|
|
|
c.UserID = user.ID
|
|
|
|
err = global.DB.Save(&c).Error
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.NewBusinessError("保存数据失败")
|
|
|
|
}
|
|
|
|
return &c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) TlBindingConfirm(req request.TlBindingConfirmRequest, user *model.User) (result.Data, error) {
|
|
|
|
c := model.UserBankCard{}
|
|
|
|
err := global.DB.Where("user_id", user.ID).Where("account_no", req.AcctNo).First(&c).Error
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
data, err := s.doTlBindingConfirm(req, user)
|
|
|
|
if err != nil {
|
|
|
|
c.Status = 2
|
|
|
|
c.ErrorMessage = err.Error()
|
|
|
|
global.DB.Save(&c)
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
c.AgreeID = data["agreeId"].(string)
|
|
|
|
c.Status = 1
|
|
|
|
c.ErrorMessage = "成功"
|
|
|
|
c.BankName = data["bankName"].(string)
|
|
|
|
c.BankCode = data["bankCode"].(string)
|
|
|
|
global.DB.Save(&c)
|
|
|
|
return data, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (userService) doTlBindingConfirm(req request.TlBindingConfirmRequest, user *model.User) (result.Data, error) {
|
|
|
|
acctType := "00"
|
|
|
|
if req.AcctType != "" {
|
|
|
|
acctType = req.AcctType
|
|
|
|
}
|
|
|
|
thpInfo, err := base64.StdEncoding.DecodeString(req.ThpInfo)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
p := param.AgreeConfirmParam{}
|
|
|
|
p.Mobile = req.Mobile
|
|
|
|
p.IdNo = req.IdNo
|
|
|
|
p.Cvv2 = req.Cvv2
|
|
|
|
p.AcctNo = req.AcctNo
|
|
|
|
p.AcctName = req.AcctName
|
|
|
|
p.SmsCode = req.SmsCode
|
|
|
|
p.ThpInfo = string(thpInfo)
|
|
|
|
p.ValidDate = req.ValidDate
|
|
|
|
p.MerUserID = strconv.Itoa(user.ID)
|
|
|
|
p.IdType = "0"
|
|
|
|
p.AcctType = acctType
|
|
|
|
p.ReqIp = "127.0.0.1"
|
|
|
|
p.Version = "11"
|
|
|
|
|
|
|
|
r, err := tlpay.TLPay.AgreeConfirm(p)
|
|
|
|
fmt.Println(r)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if r.RetCode != "SUCCESS" {
|
|
|
|
return nil, errors.NewBusinessError(r.RetMsg)
|
|
|
|
}
|
|
|
|
if r.TrxStatus != "0000" {
|
|
|
|
return nil, errors.NewBusinessError(r.ErrMsg)
|
|
|
|
}
|
|
|
|
data := result.Data{"agreeId": r.AgreeID, "bankCode": r.BankCode, "bankName": r.BankName}
|
|
|
|
return data, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) GetBankCardByUserID(userID int) (*model.UserBankCard, error) {
|
|
|
|
c := model.UserBankCard{}
|
|
|
|
err := global.DB.Where("user_id", userID).Where("status", 1).First(&c).Error
|
|
|
|
fmt.Println(err)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *userService) BankCardUnbind(user *model.User) error {
|
|
|
|
c := model.UserBankCard{}
|
|
|
|
err := global.DB.Where("user_id", user.ID).Where("status", 1).First(&c).Error
|
|
|
|
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
return errors.NewBusinessError("银行卡不存在")
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
p := param.UnbindParam{}
|
|
|
|
p.AgreeID = c.AgreeID
|
|
|
|
p.ReqIp = "127.0.0.1"
|
|
|
|
p.Version = "11"
|
|
|
|
r, err := tlpay.TLPay.Unbind(p)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if r.RetCode != "SUCCESS" {
|
|
|
|
return errors.NewBusinessError(r.RetMsg)
|
|
|
|
}
|
|
|
|
|
|
|
|
c.Status = 3
|
|
|
|
err = global.DB.Save(&c).Error
|
|
|
|
if err != nil {
|
|
|
|
return errors.NewBusinessError("更新失败")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|