完善文案的状态流转

This commit is contained in:
sjk
2025-12-20 01:05:46 +08:00
parent 6802624e59
commit 15b579d64a
13 changed files with 547 additions and 181 deletions

View File

@@ -12,6 +12,8 @@ import (
"io"
"log"
"net/http"
"gorm.io/gorm"
)
type AuthService struct{}
@@ -141,33 +143,95 @@ func (s *AuthService) WechatLogin(code string, phone string, phoneCode string) (
}
}
// 2. 根据OpenID查找或创建员工
// 2. 根据手机号查找用户(手机号必填)
if phone == "" {
return "", nil, errors.New("请提供手机号")
}
var employee models.User
// 优先通过OpenID查找注意使用IS NOT NULL过滤空值
result := database.DB.Where("wechat_openid = ? AND wechat_openid IS NOT NULL", wxResp.OpenID).First(&employee)
// 通过手机号查找员工
result := database.DB.Where("phone = ? AND status = ?", phone, "active").First(&employee)
if result.Error != nil {
// OpenID不存在需要绑定OpenID
if phone == "" {
return "", nil, errors.New("首次登录请提供手机号")
// 手机号不存在,不允许登录
return "", nil, errors.New("手机号不存在,请联系管理员添加")
}
// 3. 检查微信绑定信息
// 如果该用户已绑定微信信息,必须与当前登录的微信信息一致(单设备登录)
if employee.WechatOpenID != nil && *employee.WechatOpenID != "" {
// 已绑定微信,检查是否一致
if *employee.WechatOpenID != wxResp.OpenID {
return "", nil, errors.New("该账号已在其他设备登录,请使用原设备登录或联系管理员")
}
// 通过手机号查找员工
result = database.DB.Where("phone = ? AND status = ?", phone, "active").First(&employee)
if result.Error != nil {
return "", nil, errors.New("员工不存在,请联系管理员添加")
// 如果有UnionID也需要检查一致性
if employee.WechatUnionID != nil && *employee.WechatUnionID != "" && wxResp.UnionID != "" {
if *employee.WechatUnionID != wxResp.UnionID {
return "", nil, errors.New("微信账号信息不匹配,请使用原设备登录")
}
}
// 绑定OpenID和UnionID使用指针
log.Printf("[微信登录] 用户 %s (ID:%d) 微信验证通过", employee.Phone, employee.ID)
} else {
// 微信信息为空,说明是新用户首次登录,保存微信信息
log.Printf("[微信登录] 新用户首次登录,绑定微信信息: OpenID=%s, UnionID=%s", wxResp.OpenID, wxResp.UnionID)
employee.WechatOpenID = &wxResp.OpenID
if wxResp.UnionID != "" {
employee.WechatUnionID = &wxResp.UnionID
}
database.DB.Save(&employee)
// 使用事务保存微信绑定信息并创建作者记录
err := database.DB.Transaction(func(tx *gorm.DB) error {
// 1. 保存微信绑定信息
if err := tx.Save(&employee).Error; err != nil {
return fmt.Errorf("保存微信绑定信息失败: %v", err)
}
// 2. 检查是否已存在作者记录通过手机号和企业ID
var existingAuthor models.Author
result := tx.Where("phone = ? AND enterprise_id = ?", employee.Phone, employee.EnterpriseID).First(&existingAuthor)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
// 作者记录不存在,创建新记录
author := models.Author{
EnterpriseID: employee.EnterpriseID,
CreatedUserID: employee.ID,
Phone: employee.Phone,
AuthorName: employee.RealName,
Department: employee.Department,
Status: "active",
Channel: 3, // 3=weixin (微信小程序)
}
// 如果真实姓名为空,使用用户名
if author.AuthorName == "" {
author.AuthorName = employee.Username
}
if err := tx.Create(&author).Error; err != nil {
return fmt.Errorf("创建作者记录失败: %v", err)
}
log.Printf("[微信登录] 创建作者记录成功: ID=%d, Name=%s", author.ID, author.AuthorName)
} else if result.Error != nil {
// 其他数据库错误
return fmt.Errorf("检查作者记录失败: %v", result.Error)
} else {
log.Printf("[微信登录] 作者记录已存在: ID=%d", existingAuthor.ID)
}
return nil
})
if err != nil {
return "", nil, err
}
log.Printf("[微信登录] 用户 %s (ID:%d) 微信绑定成功", employee.Phone, employee.ID)
}
// 3. 生成JWT token
// 4. 生成JWT token
token, err := utils.GenerateToken(employee.ID)
if err != nil {
return "", nil, fmt.Errorf("生成token失败: %v", err)