294 lines
14 KiB
Go
294 lines
14 KiB
Go
package orderman
|
||
|
||
import (
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"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"
|
||
)
|
||
|
||
const (
|
||
TotalRate = 200 // 总费率(千分之200)= 第三方平台费+京西品牌费+京西服务费,现阶段都是合计200‰
|
||
MaxFreightMoneyFromJxByShop = 7 // 商家自送实际转美团/达达后由商家承担的运费金额上限
|
||
)
|
||
|
||
// 处理正向订单结账信息
|
||
func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, operation string) (err error) {
|
||
db := dao.GetDB()
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil || err != nil {
|
||
dao.Rollback(db)
|
||
if r != nil {
|
||
panic(r)
|
||
}
|
||
}
|
||
}()
|
||
if operation == partner.UpdatedPeration {
|
||
// db := orm.NewOrm()
|
||
err = utils.CallFuncLogError(func() error {
|
||
_, err = dao.ExecuteSQL(db, "DELETE FROM order_Financial WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID)
|
||
return err
|
||
}, "SaveOrderFinancialInfo delete order_Financial, orderID:%s", order.VendorOrderID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = utils.CallFuncLogError(func() error {
|
||
_, err = dao.ExecuteSQL(db, "DELETE FROM order_sku_financial WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID)
|
||
return err
|
||
}, "SaveOrderFinancialInfo delete order_sku_financial, orderID:%s", order.VendorOrderID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = utils.CallFuncLogError(func() error {
|
||
_, err = dao.ExecuteSQL(db, "DELETE FROM order_discount_financial WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID)
|
||
return err
|
||
}, "SaveOrderFinancialInfo delete order_sku, orderID:%s", order.VendorOrderID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
for _, activity := range order.Discounts {
|
||
if err = dao.CreateEntity(db, activity); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
order.ShopMoneyByCal = order.SalePriceMoney - order.TotalDiscountMoney - order.PointsDeductionMoney + order.PmFreightDiscountMoney - order.DistanceFreightMoney - order.FreightTipsMoney - order.DonationMoney + order.SelfDeliveryDiscountMoney + order.PmSubsidyMoney + order.SkuBoxMoney + order.BoxMoney - order.PmMoney
|
||
order.JxPmMoney = (order.ShopMoney+order.PmMoney)*TotalRate/1000 - order.PmMoney // 京西平台费 = 总金额*20%-第三方平台费
|
||
if order.JxPmMoney < 0 { // 如果算出京西平台费为负数,则置0
|
||
order.JxPmMoney = 0
|
||
}
|
||
|
||
order.JxShopMoney = order.ShopMoney - order.JxPmMoney + order.JxSubsidyMoney - order.JxFreightMoneyByShop
|
||
// 订单结算金额拆分计算,拆分到单条sku
|
||
// 先获取订单主体优惠金额
|
||
platOrderGoodsDiscountMoney := order.PmSubsidyMoney - order.PmSkuSubsidyMoney + order.SelfDeliveryDiscountMoney
|
||
// 结算平台扣除项汇总---平台佣金,商家设置运费减免,远距离费,小费,公益捐款、、、、
|
||
deductionsByPm := order.FreightDiscountMoney + order.DistanceFreightMoney + order.FreightTipsMoney + order.DonationMoney + order.PmMoney
|
||
// 结算京西扣除项汇总---京西佣金,京西配送运费
|
||
deductionsByJx := order.JxPmMoney + order.JxFreightMoneyByShop
|
||
for _, sku := range order.Skus[1:] {
|
||
// 用户支付菜品金额,用户为这一条sku支付的菜品金额
|
||
sku.UserMoney = utils.Float64TwoInt64(float64(order.SalePriceMoney-order.DiscountMoney-order.PointsDeductionMoney+order.BoxMoney+order.SkuBoxMoney) * float64(sku.SalePrice*int64(sku.Count)+sku.SkuBoxMoney) / float64(order.SalePriceMoney+order.SkuBoxMoney)) // 林峰确认,比如49-2满减,算餐盒费满49元,不算餐盒费不足49元,是可以参加满减活动的,那么餐盒费也应该和商品金额一起进行折算
|
||
order.Skus[0].UserMoney += sku.UserMoney
|
||
// 计算平台订单主体补贴拆分到单条sku的金额 + sku.PmSubsidyMoneyForSku
|
||
sku.PmSubsidyMoney = sku.PmSkuSubsidyMoney + utils.Float64TwoInt64(float64(platOrderGoodsDiscountMoney*sku.SalePrice*int64(sku.Count)+sku.SkuBoxMoney)/float64(order.SalePriceMoney+order.SkuBoxMoney))
|
||
order.Skus[0].PmSubsidyMoney += sku.PmSubsidyMoney
|
||
// 计算京西满减补贴拆分到单条sku的金额 + sku.JxSubsidyMoneyForSku
|
||
sku.JxSubsidyMoney = sku.JxSkuSubsidyMoney + utils.Float64TwoInt64(float64(order.JxSubsidyMoney-order.PmSkuSubsidyMoney)*float64(sku.SalePrice*int64(sku.Count)+sku.SkuBoxMoney)/float64(order.SalePriceMoney+order.SkuBoxMoney))
|
||
order.Skus[0].JxSubsidyMoney += sku.JxSubsidyMoney
|
||
// 计算单条sku需要承担的平台扣费金额
|
||
sku.PmDeductionsMoney = utils.Float64TwoInt64(float64(deductionsByPm) * (float64(sku.UserMoney + sku.PmSubsidyMoney)) / (float64(order.SalePriceMoney + order.BoxMoney + order.SkuBoxMoney - order.DiscountMoney - order.PointsDeductionMoney + order.PmSubsidyMoney)))
|
||
order.Skus[0].PmDeductionsMoney += sku.PmDeductionsMoney
|
||
// 计算单条sku平台应该结算给京西的金额
|
||
sku.ShopMoneyByCal = sku.UserMoney + sku.PmSubsidyMoney - sku.PmDeductionsMoney
|
||
order.Skus[0].ShopMoneyByCal += sku.ShopMoneyByCal
|
||
// j计算单条sku需要承担的京西扣费金额
|
||
sku.JxDeductionsMoney = utils.Float64TwoInt64(float64(deductionsByJx*sku.ShopMoneyByCal) / float64(order.ShopMoney))
|
||
order.Skus[0].JxDeductionsMoney += sku.JxDeductionsMoney
|
||
// 计算单条sku京西应该结算给商家的金额
|
||
sku.JxShopMoney = sku.ShopMoneyByCal + sku.JxSubsidyMoney - sku.JxDeductionsMoney
|
||
order.Skus[0].JxShopMoney += sku.JxShopMoney
|
||
if err = dao.CreateEntity(db, sku); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
if len(order.Skus) > 0 {
|
||
sku := order.Skus[0]
|
||
sku.UserMoney = order.SalePriceMoney - order.DiscountMoney - sku.UserMoney
|
||
sku.PmSubsidyMoney = platOrderGoodsDiscountMoney + order.SelfDeliveryDiscountMoney - sku.PmSubsidyMoney
|
||
sku.JxSubsidyMoney = order.JxSubsidyMoney - sku.JxSubsidyMoney
|
||
sku.PmDeductionsMoney = deductionsByPm - sku.PmDeductionsMoney
|
||
sku.ShopMoneyByCal = order.ShopMoney - sku.ShopMoneyByCal
|
||
sku.JxDeductionsMoney = deductionsByJx - sku.JxDeductionsMoney
|
||
sku.JxShopMoney = order.JxShopMoney - sku.JxShopMoney
|
||
if err = dao.CreateEntity(db, sku); err != nil {
|
||
return err
|
||
}
|
||
} else {
|
||
|
||
}
|
||
// 加上京西对单条sku的补贴,再存数据库
|
||
order.JxSubsidyMoney += order.JxSkuSubsidyMoney
|
||
if err = dao.CreateEntity(db, order); err != nil {
|
||
globals.SugarLogger.Warnf("On SaveOrderFinancialInfo err: order is err")
|
||
return err
|
||
}
|
||
dao.Commit(db)
|
||
return err
|
||
}
|
||
|
||
// 处理售后订单结账信息
|
||
func (c *OrderManager) SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err error) {
|
||
db := dao.GetDB()
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil || err != nil {
|
||
dao.Rollback(db)
|
||
if r != nil {
|
||
panic(r)
|
||
}
|
||
}
|
||
}()
|
||
globals.SugarLogger.Debug(afsOrder.Skus)
|
||
// 平台结算扣除汇总--平台补贴,售后产生运费,平台收包装费,同城运费、、、
|
||
deductionsByPm := afsOrder.PmSubsidyMoney + afsOrder.AfsFreightMoney + afsOrder.BoxMoney + afsOrder.TongchengFreightMoney
|
||
afsOrder.RefundMoneyByCal = afsOrder.SkuUserMoney + afsOrder.FreightUserMoney + deductionsByPm
|
||
// order.TotalMoney += order.SkuJxMoney // 退款单京西补贴部分先不作计算
|
||
if err = dao.CreateEntity(db, afsOrder); err != nil {
|
||
globals.SugarLogger.Warnf("On SaveAfsOrderFinancialInfo err: SaveAfsOrder is err")
|
||
return err
|
||
}
|
||
|
||
// 京西结算扣除汇总,先不作计算,计算单条sku最终扣款金额(+该条sku承担的平台结算扣除金额)
|
||
for _, orderSku := range afsOrder.Skus[1:] {
|
||
orderSku.RefundMoneyByCal = orderSku.PmSkuSubsidyMoney +
|
||
utils.Float64TwoInt64(float64(afsOrder.RefundMoneyByCal-afsOrder.PmSkuSubsidyMoney)*float64(orderSku.UserMoney+orderSku.PmSubsidyMoney-orderSku.PmSkuSubsidyMoney)/float64(afsOrder.SkuUserMoney+afsOrder.PmSubsidyMoney-afsOrder.PmSkuSubsidyMoney))
|
||
afsOrder.Skus[0].RefundMoneyByCal += orderSku.RefundMoneyByCal
|
||
if err = dao.CreateEntity(db, orderSku); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
if len(afsOrder.Skus) > 0 {
|
||
orderSku := afsOrder.Skus[0]
|
||
orderSku.RefundMoneyByCal = afsOrder.RefundMoneyByCal - orderSku.RefundMoneyByCal
|
||
if err = dao.CreateEntity(db, orderSku); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
dao.Commit(db)
|
||
return err
|
||
}
|
||
|
||
// 转自送实际使用美团/达达配送,调用此方法
|
||
func (c *OrderManager) UpdataOrderFinancialInfo(orderFinancial *model.OrderFinancial, wayBill *model.Waybill) (err error) {
|
||
// 通过本地数据库去取是否转美团/达达,并计算运费,写在上级调用函数里面传递过来
|
||
// wayBill, err2 := partner.CurOrderManager.LoadWaybill(orderFinancial.VendorOrderID, orderFinancial.VendorID)
|
||
// if err = err2; err == nil {
|
||
// orderFinancial.JxFreightMoney = wayBill.DesiredFee
|
||
// }
|
||
db := dao.GetDB()
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil || err != nil {
|
||
dao.Rollback(db)
|
||
if r != nil {
|
||
panic(r)
|
||
}
|
||
}
|
||
}()
|
||
orderFinancial.JxFreightMoney = wayBill.DesiredFee
|
||
if (orderFinancial.JxFreightMoney - orderFinancial.SelfDeliveryDiscountMoney) > MaxFreightMoneyFromJxByShop {
|
||
orderFinancial.JxFreightMoneyByShop = orderFinancial.SelfDeliveryDiscountMoney + MaxFreightMoneyFromJxByShop
|
||
} else if (orderFinancial.JxFreightMoney - orderFinancial.SelfDeliveryDiscountMoney) < 0 {
|
||
orderFinancial.JxFreightMoneyByShop = orderFinancial.SelfDeliveryDiscountMoney
|
||
} else {
|
||
orderFinancial.JxFreightMoneyByShop = orderFinancial.JxFreightMoney
|
||
}
|
||
orderFinancial.JxShopMoney -= orderFinancial.JxFreightMoneyByShop
|
||
// orderFinancial.JxFreightMoneyByShop 的改变直接影响到单条sku的京西结算金额的改变
|
||
jxDecMoney := orderFinancial.JxFreightMoneyByShop
|
||
for _, sku := range orderFinancial.Skus[1:] {
|
||
// 重新计算单条sku京西应该结算的金额
|
||
skuJxDecMoney := utils.Float64TwoInt64(float64(jxDecMoney*sku.SalePrice*int64(sku.Count)+sku.SkuBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.SkuBoxMoney))
|
||
sku.JxDeductionsMoney += skuJxDecMoney
|
||
sku.JxShopMoney -= skuJxDecMoney
|
||
jxDecMoney -= skuJxDecMoney
|
||
if _, err = dao.UpdateEntity(db, sku); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
if len(orderFinancial.Skus) > 0 {
|
||
sku := orderFinancial.Skus[0]
|
||
sku.JxDeductionsMoney += jxDecMoney
|
||
sku.JxShopMoney -= jxDecMoney
|
||
if _, err = dao.UpdateEntity(db, sku); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
if err = dao.CreateEntity(db, orderFinancial); err != nil {
|
||
globals.SugarLogger.Warnf("On SaveOrderFinancialInfo err: order is err")
|
||
return err
|
||
}
|
||
dao.Commit(db)
|
||
// orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
|
||
return err
|
||
}
|
||
|
||
// 正向订单设置小费后更新信息,需要再去订单查询列表接口查询小费金额,然后传递过来,感觉这样一个个写非常麻烦(以下demo是以京东为例)
|
||
// 为什么不直接用OrderDetail2Financial再处理一遍,通过传递一个type=新建/更新,在SaveOrderFinancialInfo进行相应的数据库操作
|
||
|
||
// func UpdataOrderFinancialInfoByTips(orderFinancial *model.OrderFinancial, orderData map[string]interface{}) (err error) {
|
||
// db := dao.GetDB()
|
||
// dao.Begin(db)
|
||
// defer dao.Rollback(db)
|
||
// order1, err2 := api.JdAPI.OrderShoudSettlementService(orderFinancial.VendorOrderID) // 考虑放到上层实现然后传递过来
|
||
// orderFinancial.FreightTipsMoney = utils.MustInterface2Int64(orderData["tips"])
|
||
// pmMoney := orderFinancial.PmMoney
|
||
// JxPmMoney := orderFinancial.JxPmMoney
|
||
// orderFinancial.PmMoney = 0
|
||
// // 京东/京西平台费可能会变化
|
||
// if err = err2; err == nil {
|
||
// orderFinancial.ShopMoney = utils.Interface2Int64WithDefault(order1["settlementAmount"], 0)
|
||
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["goodsCommission"], 0)
|
||
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["freightCommission"], 0)
|
||
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["packageCommission"], 0)
|
||
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["guaranteedCommission"], 0)
|
||
// orderFinancial.JxPmMoney = (orderFinancial.ShopMoney+orderFinancial.PmMoney)*TotalRate/1000 - orderFinancial.PmMoney // 京西平台费 = 总金额*20%-第三方平台费
|
||
// if orderFinancial.JxPmMoney < 0 { // 如果算出京西平台费为负数,则置0
|
||
// orderFinancial.JxPmMoney = 0
|
||
// }
|
||
// // 计算在此次变动中,第三方平台结算费用的变化值
|
||
// decMoney := orderFinancial.FreightTipsMoney + orderFinancial.PmMoney - pmMoney
|
||
// orderFinancial.ShopMoneyByCal -= decMoney
|
||
// decMoney2 := decMoney
|
||
// // 计算在此次变动中,京西结算费用的变化值
|
||
// jxDecMoney := decMoney + orderFinancial.JxPmMoney - JxPmMoney
|
||
// orderFinancial.JxShopMoney -= jxDecMoney
|
||
// jxDecMoney2 := jxDecMoney
|
||
|
||
// for _, sku := range orderFinancial.Skus[1:] {
|
||
// // 重新计算单条sku平台应该结算的金额
|
||
// skuDecMoney := utils.Float64TwoInt64(float64(decMoney*sku.SalePrice*int64(sku.Count)+sku.MealBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.MealBoxMoney))
|
||
// sku.PmDeductionsMoney += skuDecMoney
|
||
// sku.ShopMoneyByCal -= skuDecMoney
|
||
// decMoney2 -= skuDecMoney
|
||
|
||
// // 重新计算单条sku京西应该结算的金额
|
||
// skuJxDecMoney := utils.Float64TwoInt64(float64(jxDecMoney*sku.SalePrice*int64(sku.Count)+sku.MealBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.MealBoxMoney))
|
||
// sku.JxDeductionsMoney += skuJxDecMoney
|
||
// sku.JxShopMoney -= skuJxDecMoney
|
||
// jxDecMoney2 -= skuJxDecMoney
|
||
// if err = dao.UpdateEntity(db, sku); err != nil {
|
||
// return err
|
||
// }
|
||
// }
|
||
// if len(orderFinancial.Skus) > 0 {
|
||
// sku := orderFinancial.Skus[0]
|
||
|
||
// sku.PmDeductionsMoney += decMoney2
|
||
// sku.ShopMoneyByCal -= decMoney2
|
||
|
||
// sku.JxDeductionsMoney += jxDecMoney2
|
||
// sku.JxShopMoney -= jxDecMoney2
|
||
// if err = dao.UpdateEntity(db, sku); err != nil {
|
||
// return err
|
||
// }
|
||
// }
|
||
// // orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
|
||
// // 更新
|
||
// // 更新
|
||
|
||
// } else {
|
||
// globals.SugarLogger.Warnf("jd OrderDetail2Financial, orderID:%s is not found from api.JdAPI.OrderShoudSettlementService", orderFinancial.VendorOrderID)
|
||
// }
|
||
// return err
|
||
// }
|
||
|
||
// 正向订单转自配送后更新信息
|
||
// func SaveOrderFinancialInfoBySelf(orderFinancial *model.OrderFinancial) (err error) {
|
||
// // 此时考虑之前有没有设置小费,如果设置了小费,要扣掉
|
||
// return err
|
||
// }
|