215 lines
6.5 KiB
Go
215 lines
6.5 KiB
Go
package cms
|
||
|
||
import (
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/smsmsg"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"git.rosy.net.cn/jx-callback/business/partner"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"git.rosy.net.cn/jx-callback/globals/api"
|
||
)
|
||
|
||
type StoreAcctManager struct {
|
||
}
|
||
|
||
var (
|
||
FixedStoreAcctManager *StoreAcctManager
|
||
)
|
||
|
||
func init() {
|
||
FixedStoreAcctManager = &StoreAcctManager{}
|
||
partner.InitStoreAcctManager(FixedStoreAcctManager)
|
||
}
|
||
|
||
func InsertStoreAcctIncome(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
|
||
var (
|
||
userID, userName string
|
||
goodsVendorOrderID string
|
||
db = dao.GetDB()
|
||
)
|
||
if ctx != nil {
|
||
userID = ctx.GetUserID()
|
||
userName = ctx.GetUserName()
|
||
goodsVendorOrderID = vendorOrderID
|
||
} else {
|
||
storeOrder := &model.StoreAcctOrder{
|
||
VendorOrderID: vendorOrderID,
|
||
}
|
||
if err = dao.GetEntity(db, storeOrder, "VendorOrderID"); err == nil && storeOrder.ID != 0 {
|
||
userID = storeOrder.UserID
|
||
userName = storeOrder.LastOperator
|
||
goodsVendorOrderID = storeOrder.GoodsVendorOrderID
|
||
}
|
||
}
|
||
storeAcctIncome := &model.StoreAcctIncome{
|
||
StoreID: storeID,
|
||
IncomePrice: price,
|
||
Type: acctType,
|
||
UserID: userID,
|
||
VendorOrderID: goodsVendorOrderID,
|
||
}
|
||
dao.WrapAddIDCULEntity(storeAcctIncome, userName)
|
||
if expendID != 0 {
|
||
storeAcctIncome.ExpID = expendID
|
||
}
|
||
err = dao.CreateEntity(db, storeAcctIncome)
|
||
return err
|
||
}
|
||
|
||
func InsertStoreAcctExpend(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
|
||
var (
|
||
userID, userName string
|
||
db = dao.GetDB()
|
||
)
|
||
if ctx != nil {
|
||
userID = ctx.GetUserID()
|
||
userName = ctx.GetUserName()
|
||
} else {
|
||
storeOrder := &model.StoreAcctOrder{
|
||
VendorOrderID: vendorOrderID,
|
||
}
|
||
if err = dao.GetEntity(db, storeOrder, "VendorOrderID"); err == nil && storeOrder.ID != 0 {
|
||
userID = storeOrder.UserID
|
||
userName = storeOrder.LastOperator
|
||
}
|
||
}
|
||
storeAcctExpend := &model.StoreAcctExpend{
|
||
StoreID: storeID,
|
||
ExpendPrice: price,
|
||
Type: acctType,
|
||
UserID: userID,
|
||
VendorOrderID: vendorOrderID,
|
||
}
|
||
dao.WrapAddIDCULEntity(storeAcctExpend, userName)
|
||
if expendID != 0 {
|
||
storeAcctExpend.ExpID = expendID
|
||
}
|
||
err = dao.CreateEntity(db, storeAcctExpend)
|
||
return err
|
||
}
|
||
|
||
func (s *StoreAcctManager) UpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price int, isIncome bool) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
if ctx == nil {
|
||
ctx = jxcontext.AdminCtx
|
||
}
|
||
storeAcct := &model.StoreAcct{
|
||
StoreID: storeID,
|
||
}
|
||
txDB, _ := dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil || err != nil {
|
||
dao.Rollback(db, txDB)
|
||
if r != nil {
|
||
panic(r)
|
||
}
|
||
}
|
||
}()
|
||
if err = dao.GetEntity(db, storeAcct, "StoreID"); err != nil && dao.IsNoRowsError(err) {
|
||
//新增门店账单
|
||
dao.WrapAddIDCULEntity(storeAcct, ctx.GetUserName())
|
||
if err = dao.CreateEntityTx(txDB, storeAcct); err != nil {
|
||
dao.Rollback(db, txDB)
|
||
return err
|
||
}
|
||
} else {
|
||
if isIncome {
|
||
storeAcct.AccountBalance += price
|
||
} else {
|
||
storeAcct.AccountBalance -= price
|
||
}
|
||
if _, err = dao.UpdateEntityTx(txDB, storeAcct, "AccountBalance"); err != nil {
|
||
dao.Rollback(db, txDB)
|
||
return err
|
||
}
|
||
}
|
||
dao.Commit(db, txDB)
|
||
return err
|
||
}
|
||
|
||
// 门店到账(老版本,修改门店的交易记录)
|
||
func (s *StoreAcctManager) InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
|
||
utils.CallFuncAsync(func() {
|
||
if err = InsertStoreAcctExpend(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil {
|
||
s.UpdateStoreAcctBalance(ctx, storeID, price, false)
|
||
}
|
||
})
|
||
return err
|
||
}
|
||
|
||
func (s *StoreAcctManager) InsertStoreAcctIncomeAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
|
||
utils.CallFuncAsync(func() {
|
||
if err = InsertStoreAcctIncome(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil {
|
||
s.UpdateStoreAcctBalance(ctx, storeID, price, true)
|
||
}
|
||
})
|
||
return err
|
||
}
|
||
|
||
// 检查当前订单的状态以及支出收入比
|
||
func (s *StoreAcctManager) CheckStoreAcctExpendExist(vendorOrderID string) (isEqual, isZero bool, err error) {
|
||
var (
|
||
expends, incomes int
|
||
db = dao.GetDB()
|
||
)
|
||
// 发单扣除的临时运费
|
||
expends, err = dao.GetStoreAcctExpendTotal(db, 0, []int{partner.StoreAcctTypeExpendCreateWaybillEx, partner.StoreAcctTypeRealFeeExpend}, vendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||
// 真实运费 < 临时运费, 临时运费-真实运费的值
|
||
incomes, err = dao.GetStoreAcctIncomeTotal(db, 0, []int{partner.StoreAcctTypeRealFeeIncome, partner.StoreAcctTypeIncomeCancelTemp, partner.StoreAcctTypeIncomeCancelReal}, vendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||
if expends != incomes {
|
||
if expends > incomes {
|
||
return false, false, err
|
||
} else {
|
||
globals.SugarLogger.Debugf("CheckStoreAcctExpendExist 收入大于支出! orderID:[%v]", vendorOrderID)
|
||
}
|
||
} else {
|
||
if expends == 0 && incomes == 0 {
|
||
return true, true, err
|
||
} else {
|
||
return true, false, err
|
||
}
|
||
}
|
||
return false, false, err
|
||
}
|
||
|
||
func (s *StoreAcctManager) GetStoreAcctExpendLastCreateWayBillFee(vendorOrderID string) (expend *dao.GetStoreAcctExpendLastCreateWayBillFeeResult, lastFee int, err error) {
|
||
return dao.GetStoreAcctExpendLastCreateWayBillFee(dao.GetDB(), vendorOrderID)
|
||
}
|
||
|
||
func (s *StoreAcctManager) GetBrandBalance(brandID int) (balance int, err error) {
|
||
return dao.GetBrandBalance(dao.GetDB(), brandID)
|
||
}
|
||
|
||
func (s *StoreAcctManager) InsertBrandBill(ctx *jxcontext.Context, brandID, price, billType, feeType int, vendorOrderID string, wayVendorOrderId string) (err error) {
|
||
utils.CallFuncAsync(func() {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
if price == 0 {
|
||
return
|
||
}
|
||
brandBill := &model.BrandBill{
|
||
BrandID: brandID,
|
||
Price: price,
|
||
BillType: billType,
|
||
FeeType: feeType,
|
||
VendorOrderID: vendorOrderID,
|
||
OrderID: wayVendorOrderId,
|
||
}
|
||
dao.WrapAddIDCULEntity(brandBill, ctx.GetUserName())
|
||
//扣除后,如果余额小于10元要发消息通知 ,每天通知一次
|
||
if err = dao.CreateEntity(db, brandBill); err == nil {
|
||
if mark := api.Cacher.Get("brandID" + utils.Int2Str(brandID)); mark == nil {
|
||
if balance, _ := s.GetBrandBalance(brandID); balance < model.BrandBalanceLimit {
|
||
smsmsg.NotifyBrandBalance(brandID)
|
||
}
|
||
}
|
||
}
|
||
})
|
||
return err
|
||
}
|