diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 362b88094..57ba4d27d 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -2,6 +2,7 @@ package defsch import ( "fmt" + "git.rosy.net.cn/jx-callback/business/jxstore/cms" "math" "time" @@ -17,6 +18,11 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) +const ( + JXC4B_RAND_JXGY = 1 // 京西菜市和果园品牌id + JXC4B_SHOP = 7 // 京西超市 +) + func (s *DefScheduler) loadSavedOrderByID(vendorOrderID string, vendorID int, isForceLoad bool) *WatchOrderInfo { return s.loadSavedOrderFromMap(&model.OrderStatus{ RefVendorOrderID: vendorOrderID, @@ -133,11 +139,26 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex if forceCreate { s.stopTimer(savedOrderInfo) } + + // 获取门店品牌余额 + storeAcct, err := cms.GetStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order)) // 获取门店余额 + + // 如果门店没钱,查看品牌,查询门店品牌id + storeList, err := dao.GetStoreList(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, nil, nil, nil, "") + if err != nil || len(storeList) != 1 { + return nil, fmt.Errorf("门店id:[%d],所属品牌不唯一,或其他查询错误", order.JxStoreID) + } + result, err := dao.GetBrandBalance(dao.GetDB(), storeList[0].BrandID) // 品牌余额 + if err != nil { + return nil, err + } + //门店发单开始扣钱 if order.CreateDeliveryType == model.YES { deliveryFeeMap, _ := s.QueryOrderWaybillFeeInfoEx(ctx, order.VendorOrderID, order.VendorID) // 运费相等为0或支出大于收入不做, isEqual, isZero, _ := partner.CurStoreAcctManager.CheckStoreAcctExpendExist(order.VendorOrderID) + expend, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID) // 收最贵的一个订单配送费(配送费发送变化,收取最贵的价格) if !isZero && !isEqual { var newPrice int64 @@ -156,15 +177,50 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex newPrice = maxFee } // 门店支出运费 - expend, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID) - if int(newPrice) > lastFee { - partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee + if storeList[0].BrandID != JXC4B_SHOP && storeList[0].BrandID != JXC4B_RAND_JXGY { // 非京西品牌,先扣门店在扣品牌 + if storeAcct.AccountBalance > int(newPrice) { + if int(newPrice) > lastFee { + // 门店支出费用 + partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee + } + } else if result > int(newPrice) { + // 品牌支出费用 + partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, storeList[0].BrandID, int(model.Waybill{}.DesiredFee), model.BrandBillTypeExpend, model.BrandBillFeeTypeDelivery, order.VendorOrderID) + } else { + return nil, fmt.Errorf("门店id:[%d],品牌id:[]%d,门店以及门店所属品牌余额不足,无法发单", order.JxStoreID, storeList[0].BrandID) + } + } else { // 京西品牌 + if storeAcct.AccountBalance > int(newPrice) { + if int(newPrice) > lastFee { + // 门店支出费用 + partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee + } + } else { + return nil, fmt.Errorf("门店id:[%d],品牌id:[]%d,门店以及门店所属品牌余额不足,无法发单", order.JxStoreID, storeList[0].BrandID) + } } + } else { if len(courierVendorIDs) == 1 { courierVendorID := courierVendorIDs[0] if _, ok := deliveryFeeMap[courierVendorID]; ok { - partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybillEx, order.VendorOrderID, 0) //int(deliveryFeeMap[courierVendorID].DeliveryFee + if storeList[0].BrandID != JXC4B_SHOP && storeList[0].BrandID != JXC4B_RAND_JXGY { // 非京西品牌,先扣门店在扣品牌 + if storeAcct.AccountBalance > int(model.Waybill{}.DesiredFee) { + partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee + } else if result > int(model.Waybill{}.DesiredFee) { + // 品牌支出费用 + partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, storeList[0].BrandID, int(model.Waybill{}.DesiredFee), model.BrandBillTypeExpend, model.BrandBillFeeTypeDelivery, order.VendorOrderID) + } else { + return nil, fmt.Errorf("门店id:[%d],品牌id:[]%d,门店以及门店所属品牌余额不足,无法发单", order.JxStoreID, storeList[0].BrandID) + } + } else { // 京西品牌 + if storeAcct.AccountBalance > int(model.Waybill{}.DesiredFee) { + // 门店支出费用 + partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(model.Waybill{}.DesiredFee), partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID) //int(newPrice)-lastFee + } else { + return nil, fmt.Errorf("门店id:[%d],品牌id:[]%d,门店以及门店所属品牌余额不足,无法发单", order.JxStoreID, storeList[0].BrandID) + } + } } } else if len(courierVendorIDs) == 0 { var maxFee int64 @@ -247,16 +303,18 @@ func (s *DefScheduler) CheckStoreBalance(ctx *jxcontext.Context, order *model.Go //京西后台则是点一下发3个,len courierVendorIDs 是0 //如果是小程序上点哪个扣哪个平台的钱 //如果是后台,则选最高的那个扣 - //storeAcct, err := cms.GetStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order)) // 0.0 + storeAcct, err := cms.GetStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order)) // 获取门店余额 + // 如果门店没钱,查看品牌,查询门店品牌id - storeList, err := dao.GetStoreList(dao.GetDB(), []int{order.JxStoreID}, nil, nil, nil, nil, "") + storeList, err := dao.GetStoreList(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, nil, nil, nil, "") if err != nil || len(storeList) != 1 { return "", fmt.Errorf("门店id:[%d],所属品牌不唯一,或其他查询错误", order.JxStoreID) } - result, err := dao.GetBrandBalance(dao.GetDB(), storeList[0].BrandID) + result, err := dao.GetBrandBalance(dao.GetDB(), storeList[0].BrandID) // 品牌余额 if err != nil { return "", err } + deliveryFeeMap, _ := s.QueryOrderWaybillFeeInfoEx(ctx, order.VendorOrderID, order.VendorID) if err != nil { return errCode, fmt.Errorf("获取账户余额失败!") @@ -286,23 +344,30 @@ func (s *DefScheduler) CheckStoreBalance(ctx *jxcontext.Context, order *model.Go newPrice = maxFee } _, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID) + // 如果门店属于京西菜市,京西果园则只能扣门店的金额 if int(newPrice) > lastFee { - if result < int(newPrice)-lastFee { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(newPrice-int64(lastFee))) + if storeList[0].BrandID == JXC4B_RAND_JXGY || storeList[0].BrandID == JXC4B_SHOP { // 订单所属门店属于京西菜市,果园,则不扣品牌只扣门店)(1果园,菜市,7京西超市) + if storeAcct.AccountBalance < int(newPrice)-lastFee { + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店/品牌账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(newPrice-int64(lastFee))) + } + } else { + if storeAcct.AccountBalance < int(newPrice)-lastFee && result < int(newPrice)-lastFee { + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店/品牌账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(newPrice-int64(lastFee))) + } } } } else { - //if storeAcct.AccountBalance < partner.MinCreateWaybillBalance { - if result < partner.MinCreateWaybillBalance { // 门店品牌账户余额 - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(partner.MinCreateWaybillBalance)) - } - //} if len(courierVendorIDs) == 1 { courierVendorID := courierVendorIDs[0] if _, ok := deliveryFeeMap[courierVendorID]; ok { - //if deliveryFeeMap[courierVendorID].DeliveryFee > int64(storeAcct.AccountBalance) { - if deliveryFeeMap[courierVendorID].DeliveryFee > int64(result) { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(deliveryFeeMap[courierVendorID].DeliveryFee)) + if storeList[0].BrandID == JXC4B_RAND_JXGY || storeList[0].BrandID == JXC4B_SHOP { // 订单所属门店属于京西菜市,果园,则不扣品牌只扣门店)(1果园,菜市,7京西超市) + if deliveryFeeMap[courierVendorID].DeliveryFee > int64(storeAcct.AccountBalance) { + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店/品牌账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(partner.MinCreateWaybillBalance)) + } + } else { + if deliveryFeeMap[courierVendorID].DeliveryFee > int64(result) && deliveryFeeMap[courierVendorID].DeliveryFee > int64(storeAcct.AccountBalance) { + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店/品牌 账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(deliveryFeeMap[courierVendorID].DeliveryFee)) + } } } } else if len(courierVendorIDs) == 0 { @@ -312,8 +377,14 @@ func (s *DefScheduler) CheckStoreBalance(ctx *jxcontext.Context, order *model.Go v.DeliveryFee = maxFee } } - if maxFee > int64(result) { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(maxFee)) + if storeList[0].BrandID == JXC4B_RAND_JXGY || storeList[0].BrandID == JXC4B_SHOP { // 订单所属门店属于京西菜市,果园,则不扣品牌只扣门店)(1果园,菜市,7京西超市) + if maxFee > int64(storeAcct.AccountBalance) { + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店/品牌账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(partner.MinCreateWaybillBalance)) + } + } else { + if maxFee > int64(result) && maxFee > int64(storeAcct.AccountBalance) { + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店/品牌 账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(maxFee)) + } } } } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index b2f6a8270..939e43050 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -6,7 +6,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/astaxie/beego/client/orm" "io" "math" "mime/multipart" @@ -4736,7 +4735,7 @@ func RefreshPageStore() { func QueryPageStores2(db *dao.DaoDB, pageSize, offset int, keyword, vendorStoreID, brandName string, vendorID, cityCode, districtCode int, tel string, minShopScore float32, minRecentOrderNum, minSkuCount int, lng1, lat1, lng2, lat2 float64, cat string) (pagedInfo *model.PagedInfo, err error) { - db.Db = orm.NewOrmUsingDB("c4beta") +// db.Db = orm.NewOrmUsingDB("c4beta") sqlJD := ` SELECT name, 0 vendor_id, wmpoiid vendor_store_id, orgcode org_code, 1 vendor_status, address, phone tel1, pj shop_score, month_sales_tip recent_order_num, bak_info city_name, goods_number sku_count, lat, lng, district_name, brand_name, third_category category, shipping_time @@ -4907,7 +4906,7 @@ func QueryPageSkus(ctx *jxcontext.Context, vendorID int, vendorStoreIDs []string db = dao.GetDB() results []*QueryPageSkusResult ) - db.Db = orm.NewOrmUsingDB("c4beta") + //db.Db = orm.NewOrmUsingDB("c4beta") sqlParams := []interface{}{} sqlJD := ` SELECT 0 vendor_id, b.orgcode org_code, a.wmpoiid store_id, b.name store_name, a.Base sku_id, a.name sku_name, a.month_saled month_sales, @@ -5070,7 +5069,7 @@ func GetPageBrands(ctx *jxcontext.Context) (brands []*model.PageBrand, err error var ( db = dao.GetDB() ) - db.Db = orm.NewOrmUsingDB("c4beta") + //db.Db = orm.NewOrmUsingDB("c4beta") sql := ` SELECT * FROM page_brand ` diff --git a/business/jxstore/cms/store_acct.go b/business/jxstore/cms/store_acct.go index 94787d2c7..d3724de5e 100644 --- a/business/jxstore/cms/store_acct.go +++ b/business/jxstore/cms/store_acct.go @@ -23,7 +23,7 @@ func init() { partner.InitStoreAcctManager(FixedStoreAcctManager) } -func (s *StoreAcctManager) InsertStoreAcctIncome(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) { +func InsertStoreAcctIncome(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) { var ( userID, userName string goodsVendorOrderID string @@ -59,7 +59,7 @@ func (s *StoreAcctManager) InsertStoreAcctIncome(ctx *jxcontext.Context, storeID return err } -func (s *StoreAcctManager) InsertStoreAcctExpend(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) { +func InsertStoreAcctExpend(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) { var ( userID, userName string db = dao.GetDB() @@ -136,10 +136,10 @@ func (s *StoreAcctManager) UpdateStoreAcctBalance(ctx *jxcontext.Context, storeI return err } -// 门店到账 +// 门店到账(老版本,修改门店的交易记录) func (s *StoreAcctManager) InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) { utils.CallFuncAsync(func() { - if err = s.InsertStoreAcctExpend(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil { + if err = InsertStoreAcctExpend(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil { s.UpdateStoreAcctBalance(ctx, storeID, price, false) } }) @@ -148,7 +148,7 @@ func (s *StoreAcctManager) InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *j func (s *StoreAcctManager) InsertStoreAcctIncomeAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) { utils.CallFuncAsync(func() { - if err = s.InsertStoreAcctIncome(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil { + if err = InsertStoreAcctIncome(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil { s.UpdateStoreAcctBalance(ctx, storeID, price, true) } }) diff --git a/business/partner/delivery/fn/waybill.go b/business/partner/delivery/fn/waybill.go index cbe7c95bd..560d28fb2 100644 --- a/business/partner/delivery/fn/waybill.go +++ b/business/partner/delivery/fn/waybill.go @@ -207,8 +207,8 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify) (resp *fnpsapi.CallbackRespon } order := &model.Waybill{ - VendorWaybillID: cc.PartnerOrderCode, - VendorWaybillID2: utils.Int64ToStr(cc.OrderId), + VendorWaybillID: utils.Int64ToStr(cc.OrderId), + VendorWaybillID2: cc.PartnerOrderCode, WaybillVendorID: model.VendorIDFengNiao, CourierName: cc.CarrierDriverName, CourierMobile: cc.CarrierDriverPhone, diff --git a/business/partner/partner_store_acct.go b/business/partner/partner_store_acct.go index addb90171..3e370c664 100644 --- a/business/partner/partner_store_acct.go +++ b/business/partner/partner_store_acct.go @@ -32,10 +32,10 @@ func InitStoreAcctManager(curStoreManager IStoreAcctManager) { } type IStoreAcctManager interface { - //增加一条收入流水 - InsertStoreAcctIncome(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) - //增加一条支出流水 - InsertStoreAcctExpend(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) + ////增加一条收入流水 + //InsertStoreAcctIncome(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) + ////增加一条支出流水 + //InsertStoreAcctExpend(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) //更新门店账户 UpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price int, isIncome bool) (err error) InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index c111d7f7d..21486cfa4 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -16,8 +16,9 @@ func Init() { orm.RegisterDataBase("c4beta", "mysql", "ubuntu:WebServer@1@tcp(111.231.218.230:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true") orm.RegisterDataBase("api", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/api?charset=utf8mb4&loc=Local&parseTime=true") // 本地测试服调试 - //orm.RegisterDataBase("default", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true") + // orm.RegisterDataBase("default", "mysql", web.AppConfig.DefaultString("dbConnectStr", "")) //orm.RegisterDataBase("api", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/api?charset=utf8mb4&loc=Local&parseTime=true") + //orm.RegisterDataBase("c4beta", "mysql", "ubuntu:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true") // 开启sql打印 //orm.Debug = true