332 lines
9.3 KiB
Go
332 lines
9.3 KiB
Go
|
package models
|
|||
|
|
|||
|
import (
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
orm "go-admin/common/global"
|
|||
|
)
|
|||
|
|
|||
|
//go:generate goqueryset -in cashier.go
|
|||
|
|
|||
|
// ErpCashier 账号表
|
|||
|
type ErpCashier struct {
|
|||
|
Model
|
|||
|
|
|||
|
Name string `json:"name" gorm:"type:varchar(512)"` // 账号名称
|
|||
|
BankName string `json:"bank_name" gorm:"type:varchar(512)"` // 银行全称
|
|||
|
BankAccount string `json:"bank_account" gorm:"type:varchar(512)"` // 银行账号
|
|||
|
State uint32 `json:"state"` // 状态:1-使用 2-未用
|
|||
|
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
|||
|
Type uint32 `json:"type"` //
|
|||
|
}
|
|||
|
|
|||
|
type ErpStoreCashier struct {
|
|||
|
Model
|
|||
|
|
|||
|
ErpCashierId uint32 `json:"erp_cashier_id" gorm:"index"` // 账号id
|
|||
|
Name string `json:"name" gorm:"type:varchar(512)"` // 账号名称
|
|||
|
BankName string `json:"bank_name" gorm:"type:varchar(512)"` // 银行全称
|
|||
|
BankAccount string `json:"bank_account" gorm:"type:varchar(512)"` // 银行账号
|
|||
|
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
|||
|
StoreName string `json:"store_name"` // 门店名称
|
|||
|
State uint32 `json:"state"` // 状态:1-使用 2-未用
|
|||
|
Remark string `json:"remark" gorm:"type:varchar(512)"` // 备注
|
|||
|
}
|
|||
|
|
|||
|
// CashierStore 账号关联的门店信息
|
|||
|
type CashierStore struct {
|
|||
|
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
|||
|
StoreName string `json:"store_name"` // 门店名称
|
|||
|
}
|
|||
|
|
|||
|
// ErpCashierList 账号信息
|
|||
|
type ErpCashierDetail struct {
|
|||
|
ErpCashier // 账号表信息
|
|||
|
StoreList []CashierStore `json:"store_list"` // 账号关联的门店信息
|
|||
|
}
|
|||
|
|
|||
|
type ErpCashierListResp struct {
|
|||
|
Total int `json:"total"`
|
|||
|
PageNum int `json:"page_num"`
|
|||
|
PageSize int `json:"page_size"`
|
|||
|
List []ErpCashier `json:"list"`
|
|||
|
}
|
|||
|
|
|||
|
// CreateAccount 创建账号
|
|||
|
func CreateAccount(req *ErpCashier, storeNums []uint32) error {
|
|||
|
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_cashier WHERE `name`='%s'", req.Name))
|
|||
|
if err != nil {
|
|||
|
return fmt.Errorf("创建失败[QueryRecordExist err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
if exist {
|
|||
|
return errors.New("创建失败,账号名称重复")
|
|||
|
}
|
|||
|
|
|||
|
// 新建账号,并绑定有效店铺
|
|||
|
cashier := &ErpCashier{
|
|||
|
Name: req.Name,
|
|||
|
BankName: req.BankName,
|
|||
|
BankAccount: req.BankAccount,
|
|||
|
State: 1,
|
|||
|
Remark: "",
|
|||
|
}
|
|||
|
begin := orm.Eloquent.Begin()
|
|||
|
if err = begin.Create(cashier).Error; err != nil {
|
|||
|
return fmt.Errorf("创建失败[create cashier err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
var stores []Store
|
|||
|
err = orm.Eloquent.Table("store").Where("id IN (?)", storeNums).Find(&stores).Error
|
|||
|
if err != nil {
|
|||
|
return fmt.Errorf("创建失败[query store err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
storeMap := make(map[uint32]string, len(stores))
|
|||
|
for i, _ := range stores {
|
|||
|
storeMap[stores[i].ID] = stores[i].Name
|
|||
|
}
|
|||
|
for i, _ := range storeNums {
|
|||
|
v, ok := storeMap[storeNums[i]]
|
|||
|
|
|||
|
storeCategory := &ErpStoreCashier{
|
|||
|
ErpCashierId: cashier.ID,
|
|||
|
Name: req.Name,
|
|||
|
BankName: req.BankName,
|
|||
|
BankAccount: req.BankAccount,
|
|||
|
StoreId: storeNums[i],
|
|||
|
State: 1,
|
|||
|
Remark: "",
|
|||
|
}
|
|||
|
if ok {
|
|||
|
storeCategory.StoreName = v
|
|||
|
}
|
|||
|
err := begin.Create(storeCategory).Error
|
|||
|
if err != nil {
|
|||
|
begin.Rollback()
|
|||
|
return fmt.Errorf("创建失败[create store err]:%v", err)
|
|||
|
}
|
|||
|
}
|
|||
|
err = begin.Commit().Error
|
|||
|
if err != nil {
|
|||
|
begin.Rollback()
|
|||
|
return fmt.Errorf("创建失败[commit err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// UpdateAccount 更新账号
|
|||
|
func UpdateAccount(req *ErpCashier, storeNums []uint32) error {
|
|||
|
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_cashier WHERE `name`='%s'", req.Name))
|
|||
|
if err != nil {
|
|||
|
return fmt.Errorf("更新失败[QueryRecordExist err]:%v", err)
|
|||
|
}
|
|||
|
if !exist {
|
|||
|
return errors.New("更新失败,账号不存在")
|
|||
|
}
|
|||
|
|
|||
|
tx := orm.Eloquent.Begin()
|
|||
|
// 更新账号信息
|
|||
|
cashier := &ErpCashier{
|
|||
|
Name: req.Name,
|
|||
|
BankName: req.BankName,
|
|||
|
BankAccount: req.BankAccount,
|
|||
|
State: 1,
|
|||
|
}
|
|||
|
if err := tx.Model(&ErpCashier{}).Where("id=?", req.ID).Updates(cashier).Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("更新失败[update cashier err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
// 更新账号关联的门店信息
|
|||
|
var stores []ErpStoreCashier
|
|||
|
if err := tx.Model(&ErpStoreCashier{}).Where("erp_cashier_id=?", req.ID).Find(&stores).Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("更新失败[query store_cashier err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
matchedStoreIDs := make(map[uint32]bool) // 用于记录storeNums中已经匹配的门店ID
|
|||
|
for i := range stores {
|
|||
|
store := &stores[i]
|
|||
|
store.Name = req.Name
|
|||
|
store.BankName = req.BankName
|
|||
|
store.BankAccount = req.BankAccount
|
|||
|
|
|||
|
if containsStore(storeNums, store.StoreId) { // 更新门店状态
|
|||
|
store.State = 1 // 使用
|
|||
|
matchedStoreIDs[store.StoreId] = true
|
|||
|
} else {
|
|||
|
store.State = 2 // 未使用
|
|||
|
}
|
|||
|
|
|||
|
if err := tx.Model(&ErpStoreCashier{}).Where("id = ?", store.ID).Updates(store).Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("更新失败[update store err]:%v", err)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 处理storeNums中存在但在数据库中不存在的门店
|
|||
|
for _, v := range storeNums {
|
|||
|
if _, exists := matchedStoreIDs[v]; !exists {
|
|||
|
storeInfo := &Store{}
|
|||
|
if err := tx.Table("store").Where("id = ?", v).First(storeInfo).Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("更新失败[query store err]:%v", err)
|
|||
|
}
|
|||
|
// 新增门店数据
|
|||
|
newStore := ErpStoreCashier{
|
|||
|
StoreName: storeInfo.Name,
|
|||
|
ErpCashierId: req.ID,
|
|||
|
StoreId: v,
|
|||
|
Name: req.Name,
|
|||
|
BankName: req.BankName,
|
|||
|
BankAccount: req.BankAccount,
|
|||
|
State: 1, // 使用
|
|||
|
}
|
|||
|
if err := tx.Create(&newStore).Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("新增失败[create store err]:%v", err)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if err := tx.Commit().Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("更新失败[commit err]:%v", err)
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// containsStore 检查门店是否在切片中
|
|||
|
func containsStore(storeNums []uint32, storeID uint32) bool {
|
|||
|
for _, v := range storeNums {
|
|||
|
if v == storeID {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
// DeleteAccount 删除账号
|
|||
|
func DeleteAccount(cashierId uint32) error {
|
|||
|
// 删除账号信息
|
|||
|
cashier := &ErpCashier{}
|
|||
|
cashier.ID = cashierId
|
|||
|
tx := orm.Eloquent.Begin()
|
|||
|
if err := orm.Eloquent.Delete(cashier).Error; err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("删除失败[create cashier err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
// 更新账号关联的门店信息
|
|||
|
var stores []ErpStoreCashier
|
|||
|
err := orm.Eloquent.Table("erp_store_cashier").Where("erp_cashier_id=?", cashierId).Find(&stores).Error
|
|||
|
if err != nil {
|
|||
|
return fmt.Errorf("删除失败[query store_cashier err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
err = orm.Eloquent.Delete(stores).Error
|
|||
|
if err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("删除失败[delete store err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
err = tx.Commit().Error
|
|||
|
if err != nil {
|
|||
|
tx.Rollback()
|
|||
|
return fmt.Errorf("删除失败[commit err]:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// GetAccountList 查询账号列表
|
|||
|
func GetAccountList(storeId, pageSize, pageNum int) (*ErpCashierListResp, error) {
|
|||
|
resp := ErpCashierListResp{
|
|||
|
PageNum: pageNum,
|
|||
|
PageSize: pageSize,
|
|||
|
}
|
|||
|
|
|||
|
page := pageNum - 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if pageSize == 0 {
|
|||
|
pageSize = 10
|
|||
|
}
|
|||
|
|
|||
|
qs := orm.Eloquent
|
|||
|
if storeId == 0 { // 只查询账号信息
|
|||
|
qs = orm.Eloquent.Table("erp_cashier")
|
|||
|
} else { // 查询账号信息及其关联的门店
|
|||
|
qs = orm.Eloquent.Table("erp_store_cashier").Where("store_id=? and state = 1", storeId)
|
|||
|
}
|
|||
|
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
return nil, fmt.Errorf("query count err:%v", err)
|
|||
|
}
|
|||
|
offset := page * pageSize
|
|||
|
limit := pageSize
|
|||
|
|
|||
|
resp.Total = int(count)/pageSize + 1
|
|||
|
var categories []ErpCashier
|
|||
|
|
|||
|
if storeId == 0 { // 只查询账号信息
|
|||
|
err = qs.Order("id DESC").Offset(offset).Limit(limit).Find(&categories).Error
|
|||
|
} else { // 查询账号信息及其关联的门店
|
|||
|
var storeCashiers []ErpStoreCashier
|
|||
|
err = qs.Order("erp_cashier_id DESC").Offset(offset).Limit(limit).Find(&storeCashiers).Error
|
|||
|
for _, v := range storeCashiers {
|
|||
|
temp := ErpCashier{
|
|||
|
Name: v.Name,
|
|||
|
BankName: v.BankName,
|
|||
|
BankAccount: v.BankAccount,
|
|||
|
State: v.State,
|
|||
|
}
|
|||
|
temp.Model.ID = v.ErpCashierId
|
|||
|
categories = append(categories, temp)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if err != nil && !errors.Is(err, RecordNotFound) {
|
|||
|
//logger.Error("erp commodity list err:", err)
|
|||
|
return nil, fmt.Errorf("query err:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
resp.List = categories
|
|||
|
return &resp, nil
|
|||
|
}
|
|||
|
|
|||
|
// GetAccountDetail 查询账号详情
|
|||
|
func GetAccountDetail(cashierId int) (*ErpCashierDetail, error) {
|
|||
|
// 查账号信息
|
|||
|
var cashier ErpCashier
|
|||
|
err := orm.Eloquent.Table("erp_cashier").Where("id=?", cashierId).First(&cashier).Error
|
|||
|
if err != nil {
|
|||
|
return nil, fmt.Errorf("erp_cashier query err:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
// 查账号关联的门店信息
|
|||
|
var storeCashiers []ErpStoreCashier
|
|||
|
err = orm.Eloquent.Table("erp_store_cashier").
|
|||
|
Where("erp_cashier_id =? and state=1", cashierId).Find(&storeCashiers).Error
|
|||
|
if err != nil {
|
|||
|
return nil, fmt.Errorf("erp_store_cashier query err:%v", err)
|
|||
|
}
|
|||
|
|
|||
|
var storeList []CashierStore
|
|||
|
for _, v := range storeCashiers {
|
|||
|
tmp := CashierStore{
|
|||
|
StoreId: v.StoreId,
|
|||
|
StoreName: v.StoreName,
|
|||
|
}
|
|||
|
storeList = append(storeList, tmp)
|
|||
|
}
|
|||
|
|
|||
|
resp := ErpCashierDetail{cashier, storeList}
|
|||
|
return &resp, nil
|
|||
|
}
|