123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- package subvip
- import (
- "app.yhyue.com/moapp/jybase/common"
- "context"
- "fmt"
- "github.com/gogf/gf/v2/errors/gcode"
- "github.com/gogf/gf/v2/errors/gerror"
- "github.com/gogf/gf/v2/util/gconv"
- common2 "jyOrderManager/internal/logic/product"
- "jyOrderManager/internal/service"
- "jyOrderManager/utility"
- //"jyOrderManager/utility"
- "time"
- )
- type priceSetting struct {
- Moth int64 `json:"moth"`
- //Season int64 `json:"season"`
- Year int64 `json:"year"`
- }
- func (p jySubVipProduct) GetPrice() (price int64, err error) {
- switch p.OrderDetail.ServiceType {
- case 1, 4: //购买、试用
- if p.OrderDetail.Filter.GiftCycle == 0 && p.OrderDetail.Filter.BuyType == 0 {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "付费周期与赠送周期异常")
- }
- cycleType := common.If(p.OrderDetail.Filter.BuyType != 0, p.OrderDetail.Filter.BuyType, p.OrderDetail.Filter.GiftType).(int)
- product, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
- if err != nil {
- return 0, err
- }
- productClass, err := service.Product().GetProductClass(product.ProductClassId)
- if err != nil {
- return 0, err
- }
- sVal, err := service.Product().GetPriceConfig(p.OrderDetail.ProductCode)
- if err != nil {
- return 0, err
- }
- var thisPriceSetting common2.NewPriceSetting
- if err := gconv.Struct(sVal.Rule, &thisPriceSetting); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- var (
- totalNum = 1
- )
- if p.OrderDetail.Filter.GiftAccountCount+p.OrderDetail.Filter.BuyAccountCount > productClass.CutAccount {
- totalNum += p.OrderDetail.Filter.GiftAccountCount + p.OrderDetail.Filter.BuyAccountCount - productClass.CutAccount
- }
- //p, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, cycleType)
- price = thisPriceSetting.UnityPrice(gconv.Float64(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle), cycleType, totalNum-1, 0, false)
- //if err != nil {
- // return 0, err
- //}
- //price = ps * gconv.Int64(totalNum)
- /*if p.OrderDetail.Filter.BuyType == p.OrderDetail.Filter.GiftType { //购买周期和送的周期一样
- p, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.BuyType)
- if err != nil {
- return 0, err
- }
- price = p * gconv.Int64(totalNum)
- } else {
- var (
- p1, p2 int64
- err error
- )
- p1, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle, p.OrderDetail.Filter.BuyType)
- if err != nil {
- return p1, err
- }
- p2, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.GiftType)
- if err != nil {
- return p2, err
- }
- price = (p1 + p2) * gconv.Int64(totalNum)
- }*/
- case 2: //续费
- if p.OrderDetail.Filter.GiftCycle == 0 && p.OrderDetail.Filter.BuyType == 0 {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "付费周期与赠送周期异常")
- }
- cycleType := common.If(p.OrderDetail.Filter.BuyType != 0, p.OrderDetail.Filter.BuyType, p.OrderDetail.Filter.GiftType).(int)
- sVal, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
- if err != nil {
- return 0, err
- }
- //var thisPriceSetting priceSetting
- var thisPriceSetting common2.NewPriceSetting
- if err := gconv.Struct(sVal.Price["rule"], &thisPriceSetting); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- filter, _, _, err := common2.GetLinkVipCycleFilter(context.Background(), p.OrderDetail.LinkedOrderId)
- if err != nil {
- return 0, gerror.Wrap(err, "查询关联订单异常")
- }
- if filter.FinalAreaCount != sVal.UnitNum {
- return 0, fmt.Errorf("续费产品code异常")
- }
- //pr, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, cycleType)
- //if err != nil {
- // return 0, err
- //}
- price = thisPriceSetting.UnityPrice(gconv.Float64(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle), cycleType, gconv.Int(filter.FinalAccountCount-1), 0, false)
- //price = pr * gconv.Int64(filter.FinalAccountCount)
- /*if p.OrderDetail.Filter.BuyType == p.OrderDetail.Filter.GiftType { //购买周期和送的周期一样
- pr, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.BuyType)
- if err != nil {
- return 0, err
- }
- price = pr * gconv.Int64(calNum)
- } else {
- var (
- p1, p2 int64
- err error
- )
- p1, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle, p.OrderDetail.Filter.BuyType)
- if err != nil {
- return p1, err
- }
- p2, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.GiftType)
- if err != nil {
- return p2, err
- }
- price = (p1 + p2) * gconv.Int64(calNum)
- }*/
- case 3: //升级
- oldFilter, _, entTime, err := common2.GetLinkVipCycleFilter(context.Background(), p.OrderDetail.LinkedOrderId)
- if err != nil {
- return 0, fmt.Errorf("查询关联订单异常")
- }
- var (
- areaTotalNum = oldFilter.FinalAreaCount //购买省份数量
- now = time.Now()
- //p1 int64 //现套餐价格
- //p2 int64 //原套餐价格
- )
- sVal1, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
- if err != nil {
- return 0, err
- }
- if sVal1.UnitNum != -1 && sVal1.UnitNum < areaTotalNum {
- return 0, fmt.Errorf("套餐升级信息异常")
- }
- if entTime.Before(now) {
- return 0, fmt.Errorf("会员状态即将到期")
- }
- //mNum, day := utility.GetMonthDayNum(time.Now(), entTime)
- /*
- sVal2, err := service.Product().GetPriceConfig(fmt.Sprintf("cjdy%03d", gconv.Int(common.If(areaTotalNum > 15 || areaTotalNum == -1, 16, areaTotalNum))))
- if err != nil {
- return 0, err
- }
- var thisPriceSetting1, thisPriceSetting2 priceSetting
- if err := gconv.Struct(sVal1.Price["rule"], &thisPriceSetting1); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- if err := gconv.Struct(sVal2.Rule, &thisPriceSetting2); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- p1, err = thisPriceSetting1.GetPrice(mNum, 2)
- if err != nil {
- return 0, err
- }
- p3, err3 := thisPriceSetting1.GetPrice(day, 1)
- if err3 != nil {
- return 0, err
- }
- p1 += p3 //天数费用
- p2, err = thisPriceSetting2.GetPrice(mNum, 2)
- if err != nil {
- return 0, err
- }
- p4, err4 := thisPriceSetting2.GetPrice(day, 1)
- if err4 != nil {
- return 0, err
- }*/
- var (
- month, mPrice float64
- )
- if sVal1.UnitNum > areaTotalNum { //升级服务
- month, mPrice, _, err = common2.OrderUnitPrice(p.OrderDetail.LinkedOrderId)
- if err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "关联订单计费失败")
- }
- } else { //仅购买子账号
- month = utility.GetMonthDayNum(time.Now(), entTime)
- }
- var thisPriceSetting11 common2.NewPriceSetting
- if err := gconv.Struct(sVal1.Price["rule"], &thisPriceSetting11); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- price = thisPriceSetting11.UnityPrice(month, 2, p.OrderDetail.Filter.BuyAccountCount+p.OrderDetail.Filter.GiftAccountCount, mPrice, false, "1")
- /*var thisPriceSetting11, thisPriceSetting22 common2.NewPriceSetting
- if err := gconv.Struct(sVal1.Price["rule"], &thisPriceSetting11); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- if err := gconv.Struct(sVal2.Rule, &thisPriceSetting22); err != nil {
- return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
- }
- p1 = thisPriceSetting11.UnityPrice(mNum, 2, 0, false)
- p3 := thisPriceSetting11.UnityPrice(day, 1, 0, false)
- p1 += p3 //天数费用
- p2 = thisPriceSetting22.UnityPrice(mNum, 2, 0, false)
- p4 := thisPriceSetting22.UnityPrice(day, 1, 0, false)
- p2 += p4 //天数费用
- var price1, price2 int64 //price1旧套餐升级 price2新增人数
- price1 = (p1 - p2) * gconv.Int64(oldFilter.FinalAccountCount)
- if p.OrderDetail.Filter.BuyAccountCount+p.OrderDetail.Filter.GiftAccountCount > 0 {
- price2 = p1 * gconv.Int64(p.OrderDetail.Filter.BuyAccountCount+p.OrderDetail.Filter.GiftAccountCount)
- }
- price = price1 + price2*/
- default:
- err = fmt.Errorf("超级订阅未知订单类型")
- }
- return
- }
- func (ps priceSetting) GetPrice(num, cycleType int) (int64, error) {
- switch cycleType { // 类型 1天 2月 3年 4季度
- case 1:
- return ps.Moth * gconv.Int64(num) / 30, nil
- case 2:
- if num >= 12 && ps.Year > 0 {
- return ps.Year * gconv.Int64(num) / 12, nil
- }
- return ps.Moth * gconv.Int64(num), nil
- case 3:
- if ps.Year > 0 {
- return ps.Year * gconv.Int64(num), nil
- } else {
- return ps.Moth * gconv.Int64(num) * 12, nil
- }
- case 4:
- return ps.Moth * gconv.Int64(num) * 3, nil
- }
- return -1, gerror.NewCode(gcode.CodeInvalidParameter, "未知时间参数")
- }
|