2023-09-16 02:56:39 +00:00
package models
import (
2023-11-28 09:33:38 +00:00
"encoding/json"
2023-09-16 02:56:39 +00:00
"errors"
2024-03-27 10:01:38 +00:00
"fmt"
2024-07-19 02:06:02 +00:00
"github.com/xuri/excelize/v2"
"go-admin/logger"
"go-admin/tools/config"
2024-03-27 10:01:38 +00:00
"gorm.io/gorm"
2023-09-16 02:56:39 +00:00
"log"
2024-05-23 07:30:20 +00:00
"sort"
2023-09-16 02:56:39 +00:00
"strings"
2024-05-23 07:30:20 +00:00
"time"
2023-09-16 02:56:39 +00:00
"golang.org/x/crypto/bcrypt"
orm "go-admin/common/global"
"go-admin/tools"
)
// User
type User struct {
// key
IdentityKey string
// 用户名
UserName string
FirstName string
LastName string
// 角色
Role string
}
type UserName struct {
2023-11-23 12:38:11 +00:00
Username string ` gorm:"size:64" json:"username" ` // 用户名
2023-09-16 02:56:39 +00:00
}
type PassWord struct {
2023-11-23 12:38:11 +00:00
Password string ` gorm:"size:128" json:"password" ` // 密码
2023-09-16 02:56:39 +00:00
}
type LoginM struct {
UserName
PassWord
}
type SysUserId struct {
UserId int ` gorm:"primary_key;AUTO_INCREMENT" json:"userId" ` // 编码
}
type SysUserB struct {
2023-11-28 09:33:38 +00:00
NickName string ` gorm:"size:128" json:"nickName" ` // 昵称
Phone string ` gorm:"size:11" json:"phone" ` // 手机号
RoleId int ` gorm:"" json:"roleId" ` // 角色编码
Salt string ` gorm:"size:255" json:"salt" ` // 盐
Avatar string ` gorm:"size:255" json:"avatar" ` // 头像
Sex string ` gorm:"size:255" json:"sex" ` // 性别
Email string ` gorm:"size:128" json:"email" ` // 邮箱
DeptId int ` gorm:"" json:"deptId" ` // 部门编码
PostId int ` gorm:"" json:"postId" ` // 职位编码
CreateBy string ` gorm:"size:128" json:"createBy" ` //
UpdateBy string ` gorm:"size:128" json:"updateBy" ` //
Remark string ` gorm:"size:255" json:"remark" ` // 备注
Status string ` gorm:"size:4;" json:"status" ` // 状态
StoreId uint32 ` json:"store_id" ` // 门店id
StoreName string ` json:"store_name" ` // 门店名称
CooperativeBusinessId uint32 ` json:"cooperative_business_id" gorm:"index" ` // 合作商id
CooperativeName string ` json:"cooperative_name" ` // 合作商名称
AccountType uint32 ` json:"account_type" ` // 账号类型:1-管理端
StoreData string ` gorm:"type:json" json:"store_data,omitempty" ` // 有效门店
2024-03-27 10:01:38 +00:00
StoreList [ ] StoreInfo ` json:"store_list" gorm:"-" ` // 有效门店列表
2023-11-28 09:33:38 +00:00
SalesCommRate float64 ` json:"sales_comm_rate" ` // 销售提成比例
2024-01-06 08:48:35 +00:00
Uid uint32 ` json:"uid" gorm:"column:uid;unique_index" ` // 用户uid todo 待添加
2024-07-19 02:06:02 +00:00
ShopperCode string ` json:"shopper_code" gorm:"-" ` // 店员兑换码
2023-09-16 02:56:39 +00:00
BaseModel
DataScope string ` gorm:"-" json:"dataScope" `
Params string ` gorm:"-" json:"params" `
}
2023-11-28 09:33:38 +00:00
type StoreInfo struct {
StoreID int ` json:"storeId" ` //门店id
StoreName string ` json:"storeName" ` //门店名称
ExpireTime string ` json:"expireTime" ` //有效期
}
2023-09-16 02:56:39 +00:00
type SysUser struct {
SysUserId
LoginM
SysUserB
}
2023-11-28 09:33:38 +00:00
type InsertSysUserReq struct {
SysUserId
LoginM
NickName string ` json:"nickName" ` // 昵称
Phone string ` json:"phone" ` // 手机号
RoleId int ` json:"roleId" ` // 角色编码
Salt string ` json:"salt" ` // 盐
Avatar string ` json:"avatar" ` // 头像
Sex string ` json:"sex" ` // 性别
Email string ` json:"email" ` // 邮箱
DeptId int ` json:"deptId" ` // 部门编码
PostId int ` json:"postId" ` // 职位编码
Remark string ` json:"remark" ` // 备注
Status string ` json:"status" ` // 状态
StoreId uint32 ` json:"store_id" ` // 门店id
StoreName string ` json:"store_name" ` // 门店名称
CooperativeBusinessId uint32 ` json:"cooperative_business_id" ` // 合作商id
CooperativeName string ` json:"cooperative_name" ` // 合作商名称
AccountType uint32 ` json:"account_type" ` // 账号类型:1-管理端
SalesCommRate string ` json:"sales_comm_rate" ` // 销售提成比例
StoreList [ ] StoreInfo ` json:"store_list" ` // 有效门店
2024-02-23 10:06:21 +00:00
Uid uint32 ` json:"uid" ` // 用户uid
2024-07-19 02:06:02 +00:00
ShopperCode string ` json:"shopper_code" ` // 店员兑换码
2023-11-28 09:33:38 +00:00
}
2023-09-16 02:56:39 +00:00
func ( SysUser ) TableName ( ) string {
return "sys_user"
}
type SysUserPwd struct {
OldPassword string ` json:"oldPassword" `
NewPassword string ` json:"newPassword" `
}
type SysUserPage struct {
SysUserId
SysUserB
LoginM
DeptName string ` gorm:"-" json:"deptName" `
}
type SysUserView struct {
SysUserId
SysUserB
LoginM
RoleName string ` gorm:"column:role_name" json:"role_name" `
}
// 获取用户数据
func ( e * SysUser ) Get ( ) ( SysUserView SysUserView , err error ) {
table := orm . Eloquent . Table ( e . TableName ( ) ) . Select ( [ ] string { "sys_user.*" , "sys_role.role_name" } )
table = table . Joins ( "left join sys_role on sys_user.role_id=sys_role.role_id" )
if e . UserId != 0 {
table = table . Where ( "user_id = ?" , e . UserId )
}
if e . Username != "" {
table = table . Where ( "username = ?" , e . Username )
}
if e . Password != "" {
table = table . Where ( "password = ?" , e . Password )
}
if e . RoleId != 0 {
table = table . Where ( "role_id = ?" , e . RoleId )
}
if e . DeptId != 0 {
table = table . Where ( "dept_id = ?" , e . DeptId )
}
if e . PostId != 0 {
table = table . Where ( "post_id = ?" , e . PostId )
}
if err = table . First ( & SysUserView ) . Error ; err != nil {
return
}
SysUserView . Password = ""
2024-05-27 03:08:39 +00:00
if SysUserView . RoleName == "系统管理员" {
// 查询组合所有门店数据
stores := make ( [ ] Store , 0 )
orm . Eloquent . Table ( "store" ) . Where ( "cooperative_business_id = ?" , SysUserView . CooperativeBusinessId ) . Find ( & stores )
for _ , item := range stores {
storeInfo := StoreInfo {
StoreID : int ( item . ID ) ,
StoreName : item . Name ,
ExpireTime : "2099.12.30" ,
}
SysUserView . StoreList = append ( SysUserView . StoreList , storeInfo )
}
} else { // 普通用户
if SysUserView . StoreData != "" {
SysUserView . StoreList = deserializeStoreData ( SysUserView . StoreData )
}
2023-11-28 09:33:38 +00:00
}
2024-05-27 03:08:39 +00:00
2023-09-16 02:56:39 +00:00
return
}
func ( e * SysUser ) GetUserInfo ( ) ( SysUserView SysUserView , err error ) {
table := orm . Eloquent . Table ( e . TableName ( ) ) . Select ( [ ] string { "sys_user.*" , "sys_role.role_name" } )
table = table . Joins ( "left join sys_role on sys_user.role_id=sys_role.role_id" )
if e . UserId != 0 {
table = table . Where ( "user_id = ?" , e . UserId )
}
if e . Username != "" {
table = table . Where ( "username = ?" , e . Username )
}
if e . Password != "" {
table = table . Where ( "password = ?" , e . Password )
}
if e . RoleId != 0 {
table = table . Where ( "role_id = ?" , e . RoleId )
}
if e . DeptId != 0 {
table = table . Where ( "dept_id = ?" , e . DeptId )
}
if e . PostId != 0 {
table = table . Where ( "post_id = ?" , e . PostId )
}
if err = table . First ( & SysUserView ) . Error ; err != nil {
return
}
return
}
func ( e * SysUser ) GetList ( ) ( SysUserView [ ] SysUserView , err error ) {
table := orm . Eloquent . Table ( e . TableName ( ) ) . Select ( [ ] string { "sys_user.*" , "sys_role.role_name" } )
table = table . Joins ( "left join sys_role on sys_user.role_id=sys_role.role_id" )
if e . UserId != 0 {
table = table . Where ( "user_id = ?" , e . UserId )
}
if e . Username != "" {
table = table . Where ( "username = ?" , e . Username )
}
if e . Password != "" {
table = table . Where ( "password = ?" , e . Password )
}
if e . RoleId != 0 {
table = table . Where ( "role_id = ?" , e . RoleId )
}
if e . DeptId != 0 {
table = table . Where ( "dept_id = ?" , e . DeptId )
}
if e . PostId != 0 {
table = table . Where ( "post_id = ?" , e . PostId )
}
if err = table . Find ( & SysUserView ) . Error ; err != nil {
return
}
return
}
2024-03-27 10:01:38 +00:00
type SysUserListResp struct {
2024-07-19 02:06:02 +00:00
Total int ` json:"count" ` // 总条数
PageIndex int ` json:"pageIndex" ` // 页码
PageSize int ` json:"pageSize" ` // 页面条数
ExportUrl string ` json:"export_url" ` // 导出excel路径
List [ ] SysUserPage ` json:"list" ` // 采购报表信息
2024-03-27 10:01:38 +00:00
}
2024-11-19 10:38:17 +00:00
func ( e * SysUser ) GetPage ( pageSize int , pageIndex int , exportFlag int , storeList [ ] int ) ( [ ] SysUserPage , int , string , error ) {
2024-07-19 02:06:02 +00:00
if e . ShopperCode != "" {
var shopperCode ShopperPromotionCode
err := orm . Eloquent . Table ( "shopper_promotion_code" ) . Where ( "code = ?" , e . ShopperCode ) . Find ( & shopperCode ) . Error
if err != nil {
logger . Error ( "query shopper_promotion_code err:" , logger . Field ( "err" , err ) )
return nil , 0 , "" , err
}
2024-07-30 02:29:07 +00:00
if shopperCode . ID == 0 {
return nil , 0 , "" , nil
} else {
e . Uid = shopperCode . Uid
}
2024-07-19 02:06:02 +00:00
}
2023-09-16 02:56:39 +00:00
var doc [ ] SysUserPage
table := orm . Eloquent . Select ( "sys_user.*,sys_dept.dept_name" ) . Table ( e . TableName ( ) )
2024-03-27 10:01:38 +00:00
table = table . Joins ( "left join sys_dept on sys_dept.dept_id = sys_user.dept_id" ) //es := orm.Eloquent.Select("sys_user.*,sys_dept.dept_name").Table(e.TableName()) //es = table.Joins("left join sys_dept on sys_dept.dept_id = sys_user.dept_id")
2023-09-16 02:56:39 +00:00
2024-07-19 02:06:02 +00:00
if e . Uid != 0 {
table = table . Where ( "uid = ?" , e . Uid )
}
2023-09-16 02:56:39 +00:00
if e . Username != "" {
table = table . Where ( "username = ?" , e . Username )
}
if e . Status != "" {
table = table . Where ( "sys_user.status = ?" , e . Status )
}
if e . Phone != "" {
table = table . Where ( "sys_user.phone = ?" , e . Phone )
}
2024-03-27 10:01:38 +00:00
if e . RoleId != 0 {
table = table . Where ( "sys_user.role_id = ?" , e . RoleId )
}
if e . NickName != "" {
table = table . Where ( "sys_user.nick_name = ?" , e . NickName )
}
2024-11-19 10:38:17 +00:00
//if e.StoreId != 0 {
// table = table.Where("JSON_CONTAINS(store_data, ?)", fmt.Sprintf(`{"storeId":%d}`, e.StoreId))
//}
// 假设 e.StoreId 是 []int 类型
if len ( storeList ) > 0 {
// 在 SQL 查询中使用 JSON_CONTAINS
// 如果需要匹配多个 storeId, 可以使用 OR 连接条件
var conditions [ ] string
for _ , storeId := range storeList {
condition := fmt . Sprintf ( "JSON_CONTAINS(store_data, '{\"storeId\": %d}')" , storeId )
conditions = append ( conditions , condition )
}
// 使用 OR 连接多个查询条件
// 最终的查询条件形如: JSON_CONTAINS(store_data, '{"storeId": 13}') OR JSON_CONTAINS(store_data, '{"storeId": 19}')
queryCondition := strings . Join ( conditions , " OR " )
// 将构造好的条件传递给 WHERE 子句
table = table . Where ( queryCondition )
2024-03-27 10:01:38 +00:00
}
2023-09-16 02:56:39 +00:00
if e . DeptId != 0 {
2024-03-27 10:01:38 +00:00
table = table . Where ( "sys_user.dept_id in (select dept_id from sys_dept where dept_path like ? )" , "%" + tools . IntToString ( e . DeptId ) + "%" ) //es = table.Where("sys_user.dept_id in (select dept_id from sys_dept where dept_path like ? )", "%"+tools.IntToString(e.DeptId)+"%")
2023-09-16 02:56:39 +00:00
}
// 数据权限控制(如果不需要数据权限请将此处去掉)
dataPermission := new ( DataPermission )
dataPermission . UserId , _ = tools . StringToInt ( e . DataScope )
table , err := dataPermission . GetDataScope ( e . TableName ( ) , table )
if err != nil {
2024-07-19 02:06:02 +00:00
return nil , 0 , "" , err
2023-09-16 02:56:39 +00:00
}
2024-03-27 10:01:38 +00:00
es := table
2023-09-16 02:56:39 +00:00
var count int64
2024-03-27 10:01:38 +00:00
err = es . Count ( & count ) . Error
if err != nil {
//logger.Error("count err:", err)
2024-07-19 02:06:02 +00:00
return nil , 0 , "" , err
2024-03-27 10:01:38 +00:00
}
2024-05-31 09:51:41 +00:00
//if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Order("sys_user.created_at DESC").Offset(-1).Limit(-1).Total(&count).Error; err != nil {
2024-03-27 10:01:38 +00:00
// return nil, 0, err
//}
2023-09-16 02:56:39 +00:00
2024-07-24 06:40:54 +00:00
if exportFlag == 1 { // 导出excel
if err = table . Order ( "sys_user.user_id DESC" ) . Find ( & doc ) . Error ; err != nil {
return nil , 0 , "" , err
}
} else {
if err = table . Order ( "sys_user.user_id DESC" ) . Offset ( ( pageIndex - 1 ) * pageSize ) . Limit ( pageSize ) . Find ( & doc ) . Error ; err != nil {
return nil , 0 , "" , err
}
2023-09-16 02:56:39 +00:00
}
2023-11-28 09:33:38 +00:00
2024-06-20 06:32:03 +00:00
var resp [ ] SysUserPage
2024-07-19 02:06:02 +00:00
var exportUrl string
2023-11-28 09:33:38 +00:00
// 反序列化 StoreData
for i , v := range doc {
if doc [ i ] . StoreData != "" {
doc [ i ] . StoreList = deserializeStoreData ( v . StoreData )
doc [ i ] . StoreData = ""
}
2024-06-20 06:32:03 +00:00
if e . StoreId != 0 { // 查询某个门店的销售员时,判断用户门店有效期
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs ( v . StoreData )
if len ( storeList ) > 0 {
tempList := CompareLists ( storeList , [ ] uint32 { e . StoreId } )
if len ( tempList ) == 0 { // 没有匹配的数据
continue
}
} else {
continue
}
}
2024-07-19 02:06:02 +00:00
if doc [ i ] . Uid != 0 {
// 添加店员兑换码
var shopperCode ShopperPromotionCode
err = orm . Eloquent . Table ( "shopper_promotion_code" ) . Where ( "uid = ?" , doc [ i ] . Uid ) . Find ( & shopperCode ) . Error
if err != nil {
logger . Error ( "query shopper_promotion_code err:" , logger . Field ( "err" , err ) )
}
doc [ i ] . ShopperCode = shopperCode . Code
}
2024-06-20 06:32:03 +00:00
resp = append ( resp , doc [ i ] )
2023-11-28 09:33:38 +00:00
}
2024-07-19 02:06:02 +00:00
if exportFlag == 1 { // 导出excel
exportUrl , err = sysUserExport ( resp )
if err != nil {
return nil , 0 , "" , err
}
resp = nil
}
return resp , int ( count ) , exportUrl , nil
}
func getValidStoreNames ( storeList [ ] StoreInfo ) ( string , error ) {
var validStoreNames [ ] string
currentTime := time . Now ( )
for _ , store := range storeList {
expireTime , err := time . Parse ( StoreDateTimeFormat , store . ExpireTime )
if err != nil {
return "" , fmt . Errorf ( "invalid expire time format for store ID %d: %v" , store . StoreID , err )
}
if expireTime . After ( currentTime ) {
validStoreNames = append ( validStoreNames , store . StoreName )
}
}
return strings . Join ( validStoreNames , "," ) , nil
}
// 导出系统用户列表
func sysUserExport ( req [ ] SysUserPage ) ( string , error ) {
file := excelize . NewFile ( )
fSheet := "Sheet1"
2024-09-02 09:22:55 +00:00
url := config . ExportConfig . Url
2024-07-19 02:06:02 +00:00
fileName := time . Now ( ) . Format ( TimeFormat ) + "系统用户" + ".xlsx"
fmt . Println ( "url fileName:" , url + fileName )
// 组合标题栏数据
title := [ ] interface { } { "用户名称" , "用户昵称" , "角色" , "合作商" , "门店" , "手机号" , "店员识别码" , "状态" }
for i , _ := range title {
cell , _ := excelize . CoordinatesToCellName ( 1 + i , 1 )
err := file . SetCellValue ( fSheet , cell , title [ i ] )
if err != nil {
logger . Errorf ( "file set value err:" , err )
}
}
// 查询系统角色
var doc [ ] SysRole
err := orm . Eloquent . Table ( "sys_role" ) . Find ( & doc ) . Error
if err != nil {
logger . Errorf ( "query sys_role error:" , err )
}
roleMap := make ( map [ int ] string )
for _ , item := range doc {
roleMap [ item . RoleId ] = item . RoleName
}
var row [ ] interface { }
nExcelStartRow := 0
for _ , userData := range req {
// 门店
storeName , _ := getValidStoreNames ( userData . StoreList )
var status string
if userData . Status == "0" {
status = "正常"
} else {
status = "停用"
}
row = [ ] interface { } {
userData . UserName . Username , // 用户名称
userData . NickName , // 用户昵称
roleMap [ userData . RoleId ] , // 角色
userData . CooperativeName , // 合作商
storeName , // 门店
userData . Phone , // 手机号
userData . ShopperCode , // 店员识别码
status , // 状态
}
for j , _ := range row {
cell , _ := excelize . CoordinatesToCellName ( 1 + j , nExcelStartRow + 2 )
err := file . SetCellValue ( fSheet , cell , row [ j ] )
if err != nil {
logger . Error ( "file set value err:" , logger . Field ( "err" , err ) )
}
}
nExcelStartRow ++
}
// 设置所有单元格的样式: 居中、加边框
style , _ := file . NewStyle ( ` { "alignment" : { "horizontal" : "center" , "vertical" : "center" } ,
"border" : [ { "type" : "left" , "color" : "000000" , "style" : 1 } ,
{ "type" : "top" , "color" : "000000" , "style" : 1 } ,
{ "type" : "right" , "color" : "000000" , "style" : 1 } ,
{ "type" : "bottom" , "color" : "000000" , "style" : 1 } ] } ` )
// 设置单元格的样式: 居中、加边框、自动换行
style1 , _ := file . NewStyle ( ` { "alignment" : { "horizontal" : "center" , "vertical" : "center" , "wrap_text" : true } ,
"border" : [ { "type" : "left" , "color" : "000000" , "style" : 1 } ,
{ "type" : "top" , "color" : "000000" , "style" : 1 } ,
{ "type" : "right" , "color" : "000000" , "style" : 1 } ,
{ "type" : "bottom" , "color" : "000000" , "style" : 1 } ] } ` )
//设置单元格高度
file . SetRowHeight ( "Sheet1" , 1 , 20 )
// 设置单元格大小
file . SetColWidth ( "Sheet1" , "B" , "B" , 15 )
file . SetColWidth ( "Sheet1" , "C" , "C" , 15 )
file . SetColWidth ( "Sheet1" , "D" , "D" , 15 )
file . SetColWidth ( "Sheet1" , "E" , "E" , 30 )
file . SetColWidth ( "Sheet1" , "F" , "F" , 15 )
file . SetColWidth ( "Sheet1" , "G" , "G" , 15 )
endRow := fmt . Sprintf ( "H" + "%d" , nExcelStartRow + 2 )
// 应用样式到整个表格
_ = file . SetCellStyle ( "Sheet1" , "A1" , endRow , style )
endRow1 := fmt . Sprintf ( "E%d" , nExcelStartRow + 2 )
_ = file . SetCellStyle ( "Sheet1" , "E2" , endRow1 , style1 )
fmt . Println ( "save fileName:" , config . ExportConfig . Path + fileName )
if err := file . SaveAs ( config . ExportConfig . Path + fileName ) ; err != nil {
fmt . Println ( err )
}
return url + fileName , nil
2023-09-16 02:56:39 +00:00
}
2023-11-28 09:33:38 +00:00
// 反序列化 StoreData
func deserializeStoreData ( storeData string ) [ ] StoreInfo {
var StoreData [ ] StoreInfo
if err := json . Unmarshal ( [ ] byte ( storeData ) , & StoreData ) ; err != nil {
// 可以根据实际情况处理反序列化失败的情况
log . Println ( "反序列化 StoreData 失败:" , err )
}
return StoreData
}
2024-06-14 07:15:39 +00:00
// DeserializeBankData 反序列化 BankData
func DeserializeBankData ( bankData string ) [ ] SupplierBankInfo {
var BankData [ ] SupplierBankInfo
if err := json . Unmarshal ( [ ] byte ( bankData ) , & BankData ) ; err != nil {
// 可以根据实际情况处理反序列化失败的情况
log . Println ( "反序列化 BankData 失败:" , err )
}
return BankData
}
2023-10-16 08:46:20 +00:00
// 加密
2023-09-16 02:56:39 +00:00
func ( e * SysUser ) Encrypt ( ) ( err error ) {
if e . Password == "" {
return
}
var hash [ ] byte
if hash , err = bcrypt . GenerateFromPassword ( [ ] byte ( e . Password ) , bcrypt . DefaultCost ) ; err != nil {
return
} else {
e . Password = string ( hash )
return
}
}
2023-10-16 08:46:20 +00:00
// 添加
2024-03-27 10:01:38 +00:00
func ( e SysUser ) Insert ( begin * gorm . DB ) ( id int , err error ) {
2023-09-16 02:56:39 +00:00
if err = e . Encrypt ( ) ; err != nil {
return
}
// check 用户名
var count int64
orm . Eloquent . Table ( e . TableName ( ) ) . Where ( "username = ?" , e . Username ) . Count ( & count )
if count > 0 {
err = errors . New ( "账户已存在!" )
return
}
//添加数据
2024-03-27 10:01:38 +00:00
if err = begin . Table ( e . TableName ( ) ) . Create ( & e ) . Error ; err != nil {
2023-09-16 02:56:39 +00:00
return
}
id = e . UserId
return
}
2023-10-16 08:46:20 +00:00
// 修改
2024-03-27 10:01:38 +00:00
func ( e * SysUser ) Update ( begin * gorm . DB , id int ) ( update SysUser , err error ) {
2023-09-16 02:56:39 +00:00
if e . Password != "" {
if err = e . Encrypt ( ) ; err != nil {
return
}
}
if err = orm . Eloquent . Table ( e . TableName ( ) ) . First ( & update , id ) . Error ; err != nil {
return
}
if e . RoleId == 0 {
e . RoleId = update . RoleId
}
2023-11-28 09:33:38 +00:00
if len ( e . StoreList ) != 0 {
// 将 StoreData 转换为 JSON 字符串
storeDataJSON , err := json . Marshal ( e . StoreList )
if err != nil {
return SysUser { } , err
}
e . StoreData = string ( storeDataJSON )
}
2024-03-27 10:01:38 +00:00
if begin == nil {
begin = orm . Eloquent
}
2023-09-16 02:56:39 +00:00
//参数1:是要修改的数据
//参数2:是修改的数据
2024-07-24 08:27:38 +00:00
if err = begin . Table ( e . TableName ( ) ) . Model ( & update ) . Updates ( & e ) . Error ; err != nil {
return
}
if e . Uid == 0 {
if err = begin . Table ( e . TableName ( ) ) . Model ( & update ) . UpdateColumn ( "uid" , 0 ) . Error ; err != nil {
2024-07-19 02:06:02 +00:00
return
}
2023-09-16 02:56:39 +00:00
}
2024-07-24 08:27:38 +00:00
2023-09-16 02:56:39 +00:00
return
}
2024-05-23 07:30:20 +00:00
func ( e * SysUser ) BatchDelete ( begin * gorm . DB , id [ ] int ) ( Result bool , err error ) {
if err = begin . Table ( e . TableName ( ) ) . Where ( "user_id in (?)" , id ) . Delete ( & SysUser { } ) . Error ; err != nil {
return false , err
2023-09-16 02:56:39 +00:00
}
2024-05-23 07:30:20 +00:00
return true , nil
2023-09-16 02:56:39 +00:00
}
func ( e * SysUser ) SetPwd ( pwd SysUserPwd ) ( Result bool , err error ) {
user , err := e . GetUserInfo ( )
if err != nil {
tools . HasError ( err , "获取用户数据失败(代码202)" , 500 )
}
_ , err = tools . CompareHashAndPassword ( user . Password , pwd . OldPassword )
if err != nil {
if strings . Contains ( err . Error ( ) , "hashedPassword is not the hash of the given password" ) {
tools . HasError ( err , "密码错误(代码202)" , 500 )
}
log . Print ( err )
return
}
e . Password = pwd . NewPassword
2024-03-27 10:01:38 +00:00
_ , err = e . Update ( nil , e . UserId )
2023-09-16 02:56:39 +00:00
tools . HasError ( err , "更新密码失败(代码202)" , 500 )
return
}
2024-07-24 07:04:40 +00:00
func GetUserById ( id uint32 ) * SysUserB {
var u = new ( SysUserB )
orm . Eloquent . Table ( "sys_user" ) . Where ( "user_id" , id ) . First ( u )
return u
}
func GetSysUserById ( id uint32 ) * SysUser {
2024-07-24 06:32:03 +00:00
var u = new ( SysUser )
2023-10-16 08:46:20 +00:00
orm . Eloquent . Table ( "sys_user" ) . Where ( "user_id" , id ) . First ( u )
return u
2023-09-16 02:56:39 +00:00
}
2024-03-27 10:01:38 +00:00
// UpdateUserType 更新uid的user_type为2
2024-05-23 07:30:20 +00:00
func UpdateUserType ( begin * gorm . DB , uid , nType , roleId uint32 ) error {
2024-03-27 10:01:38 +00:00
// 更新库存表
err := begin . Table ( "user" ) . Where ( "uid = ?" , uid ) .
Updates ( map [ string ] interface { } {
2024-05-23 07:30:20 +00:00
"user_type" : nType ,
"xcx_role_id" : roleId ,
2024-03-27 10:01:38 +00:00
} ) . Error
if err != nil {
2025-02-05 08:44:34 +00:00
return err
}
return nil
}
// UpdateUserTypeAndShopperName 更新uid的user_type为2 和 店员名称
func UpdateUserTypeAndShopperName ( begin * gorm . DB , uid , nType , roleId uint32 , shopperName string ) error {
// 更新库存表
err := begin . Table ( "user" ) . Where ( "uid = ?" , uid ) .
Updates ( map [ string ] interface { } {
"user_type" : nType ,
"xcx_role_id" : roleId ,
"shop_assistant_name" : shopperName ,
} ) . Error
if err != nil {
2024-03-27 10:01:38 +00:00
return err
}
return nil
}
2024-05-23 07:30:20 +00:00
// GetUserEffectiveStore 获取店员当前的有效门店(邀请客户时使用)
func GetUserEffectiveStore ( uid uint32 ) ( [ ] StoreInfo , error ) {
user := new ( SysUser )
err := orm . Eloquent . Table ( "sys_user" ) . Where ( "uid" , uid ) . Find ( & user ) . Error
if err != nil {
log . Println ( "Error:" , err , "UID:" , uid )
return nil , err
}
2024-05-31 09:51:41 +00:00
// 解析门店数据
if err := json . Unmarshal ( [ ] byte ( user . StoreData ) , & user . StoreList ) ; err != nil {
return nil , err
}
if len ( user . StoreList ) == 0 {
return nil , errors . New ( "no stores found" )
}
// 当前时间
now := time . Now ( )
// 过滤掉过期的门店
validStores := make ( [ ] StoreInfo , 0 )
for _ , store := range user . StoreList {
expireTime , err := time . Parse ( StoreDateTimeFormat , store . ExpireTime )
if err != nil {
log . Println ( "Error parsing time:" , err , "ExpireTime:" , store . ExpireTime )
continue
}
// 包含当天有效时间
expireTime = expireTime . Add ( 24 * time . Hour - time . Second )
if expireTime . After ( now ) {
validStores = append ( validStores , store )
}
}
if len ( validStores ) == 0 {
return nil , nil
}
// 按有效时间和 store_id 排序
sort . Slice ( validStores , func ( i , j int ) bool {
timeI , _ := time . Parse ( StoreDateTimeFormat , validStores [ i ] . ExpireTime )
timeJ , _ := time . Parse ( StoreDateTimeFormat , validStores [ j ] . ExpireTime )
if timeI . Equal ( timeJ ) {
return validStores [ i ] . StoreID < validStores [ j ] . StoreID
}
return timeI . Before ( timeJ )
} )
return validStores , nil
}
// GetUserEffectiveStoreById 获取店员当前的有效门店(商城发货使用)
func GetUserEffectiveStoreById ( id uint32 ) ( [ ] StoreInfo , error ) {
user := new ( SysUser )
err := orm . Eloquent . Table ( "sys_user" ) . Where ( "user_id" , id ) . Find ( & user ) . Error
if err != nil {
log . Println ( "Error:" , err , "UID:" , id )
return nil , err
}
2024-05-23 07:30:20 +00:00
// 解析门店数据
if err := json . Unmarshal ( [ ] byte ( user . StoreData ) , & user . StoreList ) ; err != nil {
return nil , err
}
if len ( user . StoreList ) == 0 {
return nil , errors . New ( "no stores found" )
}
// 当前时间
now := time . Now ( )
// 过滤掉过期的门店
validStores := make ( [ ] StoreInfo , 0 )
for _ , store := range user . StoreList {
expireTime , err := time . Parse ( StoreDateTimeFormat , store . ExpireTime )
if err != nil {
log . Println ( "Error parsing time:" , err , "ExpireTime:" , store . ExpireTime )
continue
}
// 包含当天有效时间
expireTime = expireTime . Add ( 24 * time . Hour - time . Second )
if expireTime . After ( now ) {
validStores = append ( validStores , store )
}
}
if len ( validStores ) == 0 {
return nil , nil
}
// 按有效时间和 store_id 排序
sort . Slice ( validStores , func ( i , j int ) bool {
timeI , _ := time . Parse ( StoreDateTimeFormat , validStores [ i ] . ExpireTime )
timeJ , _ := time . Parse ( StoreDateTimeFormat , validStores [ j ] . ExpireTime )
if timeI . Equal ( timeJ ) {
return validStores [ i ] . StoreID < validStores [ j ] . StoreID
}
return timeI . Before ( timeJ )
} )
return validStores , nil
}
2024-07-19 02:06:02 +00:00
// AddShopperCode 添加店员兑换码
func AddShopperCode ( req InsertSysUserReq , begin * gorm . DB ) error {
// 获取有效门店id
now := time . Now ( )
// 过滤掉过期的门店
validStores := make ( [ ] StoreInfo , 0 )
for _ , store := range req . StoreList {
expireTime , err := time . Parse ( StoreDateTimeFormat , store . ExpireTime )
if err != nil {
log . Println ( "Error parsing time:" , err , "ExpireTime:" , store . ExpireTime )
continue
}
// 包含当天有效时间
expireTime = expireTime . Add ( 24 * time . Hour - time . Second )
if expireTime . After ( now ) {
validStores = append ( validStores , store )
}
}
if len ( validStores ) == 0 {
return errors . New ( "设置兑换码失败,无有效门店" )
}
// 按有效时间和 store_id 排序
sort . Slice ( validStores , func ( i , j int ) bool {
timeI , _ := time . Parse ( StoreDateTimeFormat , validStores [ i ] . ExpireTime )
timeJ , _ := time . Parse ( StoreDateTimeFormat , validStores [ j ] . ExpireTime )
if timeI . Equal ( timeJ ) {
return validStores [ i ] . StoreID < validStores [ j ] . StoreID
}
return timeI . Before ( timeJ )
} )
var shopperCode ShopperPromotionCode
shopperCode . Code = req . ShopperCode
shopperCode . Uid = req . Uid
shopperCode . State = 2
shopperCode . StoreId = uint32 ( validStores [ 0 ] . StoreID )
if err := begin . Table ( "shopper_promotion_code" ) . Create ( & shopperCode ) . Error ; err != nil {
logger . Error ( "create shopper_promotion_code err:" , logger . Field ( "err" , err ) )
return err
}
return nil
}
// UpdateShopperCode 更新店员兑换码
2024-07-24 06:32:03 +00:00
func UpdateShopperCode ( req InsertSysUserReq , begin * gorm . DB , sysInfo * SysUser ) error {
2024-07-19 02:06:02 +00:00
if req . Uid == sysInfo . Uid && req . ShopperCode == sysInfo . ShopperCode { // 兑换码没变化
return nil
}
var oldShopperCode ShopperPromotionCode
orm . Eloquent . Debug ( ) . Model ( & ShopperPromotionCode { } ) .
Where ( "code = ? and state = ?" , req . ShopperCode , 2 ) . Find ( & oldShopperCode )
if oldShopperCode . ID != 0 && oldShopperCode . Uid != sysInfo . Uid {
2024-07-24 08:27:38 +00:00
return errors . New ( fmt . Sprintf ( "[%s]与已有店员识别码重复" , req . ShopperCode ) )
2024-07-19 02:06:02 +00:00
}
// 获取有效门店id
now := time . Now ( )
// 过滤掉过期的门店
validStores := make ( [ ] StoreInfo , 0 )
for _ , store := range req . StoreList {
expireTime , err := time . Parse ( StoreDateTimeFormat , store . ExpireTime )
if err != nil {
log . Println ( "Error parsing time:" , err , "ExpireTime:" , store . ExpireTime )
continue
}
// 包含当天有效时间
expireTime = expireTime . Add ( 24 * time . Hour - time . Second )
if expireTime . After ( now ) {
validStores = append ( validStores , store )
}
}
if len ( validStores ) == 0 {
return errors . New ( "设置兑换码失败,无有效门店" )
}
// 按有效时间和 store_id 排序
sort . Slice ( validStores , func ( i , j int ) bool {
timeI , _ := time . Parse ( StoreDateTimeFormat , validStores [ i ] . ExpireTime )
timeJ , _ := time . Parse ( StoreDateTimeFormat , validStores [ j ] . ExpireTime )
if timeI . Equal ( timeJ ) {
return validStores [ i ] . StoreID < validStores [ j ] . StoreID
}
return timeI . Before ( timeJ )
} )
// 删除原有的兑换码
if sysInfo . Uid != 0 && sysInfo . ShopperCode != "" {
err := orm . Eloquent . Table ( "shopper_promotion_code" ) . Where ( "uid = ?" , sysInfo . Uid ) . Delete ( & ShopperPromotionCode { } ) . Error
if err != nil {
logger . Error ( "delete shopper_promotion_code err:" , logger . Field ( "err" , err ) )
return err
}
}
// 删除新配置的uid的兑换码
err := orm . Eloquent . Table ( "shopper_promotion_code" ) . Where ( "uid = ?" , req . Uid ) . Delete ( & ShopperPromotionCode { } ) . Error
if err != nil {
logger . Error ( "delete shopper_promotion_code err:" , logger . Field ( "err" , err ) )
return err
}
// 添加新的兑换码
var shopperCode ShopperPromotionCode
shopperCode . Code = req . ShopperCode
shopperCode . Uid = req . Uid
shopperCode . State = 2
shopperCode . StoreId = uint32 ( validStores [ 0 ] . StoreID )
if err := begin . Table ( "shopper_promotion_code" ) . Create ( & shopperCode ) . Error ; err != nil {
logger . Error ( "create shopper_promotion_code err:" , logger . Field ( "err" , err ) )
return err
}
return nil
}
// IsShopperCodeExists 查询兑换码是否重复
func IsShopperCodeExists ( code string ) bool {
var count int64
orm . Eloquent . Debug ( ) . Model ( & ShopperPromotionCode { } ) .
Where ( "code = ? and state = ?" , code , 2 ) .
Count ( & count )
return count > 0
}