price.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package subvip
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. "context"
  5. "fmt"
  6. "github.com/gogf/gf/v2/errors/gcode"
  7. "github.com/gogf/gf/v2/errors/gerror"
  8. "github.com/gogf/gf/v2/util/gconv"
  9. common2 "jyOrderManager/internal/logic/product"
  10. "jyOrderManager/internal/service"
  11. "jyOrderManager/utility"
  12. //"jyOrderManager/utility"
  13. "time"
  14. )
  15. type priceSetting struct {
  16. Moth int64 `json:"moth"`
  17. //Season int64 `json:"season"`
  18. Year int64 `json:"year"`
  19. }
  20. func (p jySubVipProduct) GetPrice() (price int64, err error) {
  21. switch p.OrderDetail.ServiceType {
  22. case 1, 4: //购买、试用
  23. if p.OrderDetail.Filter.GiftCycle == 0 && p.OrderDetail.Filter.BuyType == 0 {
  24. return 0, gerror.NewCode(gcode.CodeValidationFailed, "付费周期与赠送周期异常")
  25. }
  26. cycleType := common.If(p.OrderDetail.Filter.BuyType != 0, p.OrderDetail.Filter.BuyType, p.OrderDetail.Filter.GiftType).(int)
  27. product, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
  28. if err != nil {
  29. return 0, err
  30. }
  31. productClass, err := service.Product().GetProductClass(product.ProductClassId)
  32. if err != nil {
  33. return 0, err
  34. }
  35. sVal, err := service.Product().GetPriceConfig(p.OrderDetail.ProductCode)
  36. if err != nil {
  37. return 0, err
  38. }
  39. var thisPriceSetting common2.NewPriceSetting
  40. if err := gconv.Struct(sVal.Rule, &thisPriceSetting); err != nil {
  41. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  42. }
  43. var (
  44. totalNum = 1
  45. )
  46. if p.OrderDetail.Filter.GiftAccountCount+p.OrderDetail.Filter.BuyAccountCount > productClass.CutAccount {
  47. totalNum += p.OrderDetail.Filter.GiftAccountCount + p.OrderDetail.Filter.BuyAccountCount - productClass.CutAccount
  48. }
  49. //p, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, cycleType)
  50. price = thisPriceSetting.UnityPrice(gconv.Float64(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle), cycleType, totalNum-1, 0, false)
  51. //if err != nil {
  52. // return 0, err
  53. //}
  54. //price = ps * gconv.Int64(totalNum)
  55. /*if p.OrderDetail.Filter.BuyType == p.OrderDetail.Filter.GiftType { //购买周期和送的周期一样
  56. p, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.BuyType)
  57. if err != nil {
  58. return 0, err
  59. }
  60. price = p * gconv.Int64(totalNum)
  61. } else {
  62. var (
  63. p1, p2 int64
  64. err error
  65. )
  66. p1, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle, p.OrderDetail.Filter.BuyType)
  67. if err != nil {
  68. return p1, err
  69. }
  70. p2, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.GiftType)
  71. if err != nil {
  72. return p2, err
  73. }
  74. price = (p1 + p2) * gconv.Int64(totalNum)
  75. }*/
  76. case 2: //续费
  77. if p.OrderDetail.Filter.GiftCycle == 0 && p.OrderDetail.Filter.BuyType == 0 {
  78. return 0, gerror.NewCode(gcode.CodeValidationFailed, "付费周期与赠送周期异常")
  79. }
  80. cycleType := common.If(p.OrderDetail.Filter.BuyType != 0, p.OrderDetail.Filter.BuyType, p.OrderDetail.Filter.GiftType).(int)
  81. sVal, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
  82. if err != nil {
  83. return 0, err
  84. }
  85. //var thisPriceSetting priceSetting
  86. var thisPriceSetting common2.NewPriceSetting
  87. if err := gconv.Struct(sVal.Price["rule"], &thisPriceSetting); err != nil {
  88. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  89. }
  90. filter, _, _, err := common2.GetLinkVipCycleFilter(context.Background(), p.OrderDetail.LinkedOrderId)
  91. if err != nil {
  92. return 0, gerror.Wrap(err, "查询关联订单异常")
  93. }
  94. if filter.FinalAreaCount != sVal.UnitNum {
  95. return 0, fmt.Errorf("续费产品code异常")
  96. }
  97. //pr, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, cycleType)
  98. //if err != nil {
  99. // return 0, err
  100. //}
  101. price = thisPriceSetting.UnityPrice(gconv.Float64(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle), cycleType, gconv.Int(filter.FinalAccountCount-1), 0, false)
  102. //price = pr * gconv.Int64(filter.FinalAccountCount)
  103. /*if p.OrderDetail.Filter.BuyType == p.OrderDetail.Filter.GiftType { //购买周期和送的周期一样
  104. pr, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.BuyType)
  105. if err != nil {
  106. return 0, err
  107. }
  108. price = pr * gconv.Int64(calNum)
  109. } else {
  110. var (
  111. p1, p2 int64
  112. err error
  113. )
  114. p1, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle, p.OrderDetail.Filter.BuyType)
  115. if err != nil {
  116. return p1, err
  117. }
  118. p2, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.GiftType)
  119. if err != nil {
  120. return p2, err
  121. }
  122. price = (p1 + p2) * gconv.Int64(calNum)
  123. }*/
  124. case 3: //升级
  125. oldFilter, _, entTime, err := common2.GetLinkVipCycleFilter(context.Background(), p.OrderDetail.LinkedOrderId)
  126. if err != nil {
  127. return 0, fmt.Errorf("查询关联订单异常")
  128. }
  129. var (
  130. areaTotalNum = oldFilter.FinalAreaCount //购买省份数量
  131. now = time.Now()
  132. //p1 int64 //现套餐价格
  133. //p2 int64 //原套餐价格
  134. )
  135. sVal1, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
  136. if err != nil {
  137. return 0, err
  138. }
  139. if sVal1.UnitNum != -1 && sVal1.UnitNum < areaTotalNum {
  140. return 0, fmt.Errorf("套餐升级信息异常")
  141. }
  142. if entTime.Before(now) {
  143. return 0, fmt.Errorf("会员状态即将到期")
  144. }
  145. //mNum, day := utility.GetMonthDayNum(time.Now(), entTime)
  146. /*
  147. sVal2, err := service.Product().GetPriceConfig(fmt.Sprintf("cjdy%03d", gconv.Int(common.If(areaTotalNum > 15 || areaTotalNum == -1, 16, areaTotalNum))))
  148. if err != nil {
  149. return 0, err
  150. }
  151. var thisPriceSetting1, thisPriceSetting2 priceSetting
  152. if err := gconv.Struct(sVal1.Price["rule"], &thisPriceSetting1); err != nil {
  153. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  154. }
  155. if err := gconv.Struct(sVal2.Rule, &thisPriceSetting2); err != nil {
  156. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  157. }
  158. p1, err = thisPriceSetting1.GetPrice(mNum, 2)
  159. if err != nil {
  160. return 0, err
  161. }
  162. p3, err3 := thisPriceSetting1.GetPrice(day, 1)
  163. if err3 != nil {
  164. return 0, err
  165. }
  166. p1 += p3 //天数费用
  167. p2, err = thisPriceSetting2.GetPrice(mNum, 2)
  168. if err != nil {
  169. return 0, err
  170. }
  171. p4, err4 := thisPriceSetting2.GetPrice(day, 1)
  172. if err4 != nil {
  173. return 0, err
  174. }*/
  175. var (
  176. month, mPrice float64
  177. )
  178. if sVal1.UnitNum > areaTotalNum { //升级服务
  179. month, mPrice, _, err = common2.OrderUnitPrice(p.OrderDetail.LinkedOrderId)
  180. if err != nil {
  181. return 0, gerror.NewCode(gcode.CodeValidationFailed, "关联订单计费失败")
  182. }
  183. } else { //仅购买子账号
  184. month = utility.GetMonthDayNum(time.Now(), entTime)
  185. }
  186. var thisPriceSetting11 common2.NewPriceSetting
  187. if err := gconv.Struct(sVal1.Price["rule"], &thisPriceSetting11); err != nil {
  188. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  189. }
  190. price = thisPriceSetting11.UnityPrice(month, 2, p.OrderDetail.Filter.BuyAccountCount+p.OrderDetail.Filter.GiftAccountCount, mPrice, false, "1")
  191. /*var thisPriceSetting11, thisPriceSetting22 common2.NewPriceSetting
  192. if err := gconv.Struct(sVal1.Price["rule"], &thisPriceSetting11); err != nil {
  193. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  194. }
  195. if err := gconv.Struct(sVal2.Rule, &thisPriceSetting22); err != nil {
  196. return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
  197. }
  198. p1 = thisPriceSetting11.UnityPrice(mNum, 2, 0, false)
  199. p3 := thisPriceSetting11.UnityPrice(day, 1, 0, false)
  200. p1 += p3 //天数费用
  201. p2 = thisPriceSetting22.UnityPrice(mNum, 2, 0, false)
  202. p4 := thisPriceSetting22.UnityPrice(day, 1, 0, false)
  203. p2 += p4 //天数费用
  204. var price1, price2 int64 //price1旧套餐升级 price2新增人数
  205. price1 = (p1 - p2) * gconv.Int64(oldFilter.FinalAccountCount)
  206. if p.OrderDetail.Filter.BuyAccountCount+p.OrderDetail.Filter.GiftAccountCount > 0 {
  207. price2 = p1 * gconv.Int64(p.OrderDetail.Filter.BuyAccountCount+p.OrderDetail.Filter.GiftAccountCount)
  208. }
  209. price = price1 + price2*/
  210. default:
  211. err = fmt.Errorf("超级订阅未知订单类型")
  212. }
  213. return
  214. }
  215. func (ps priceSetting) GetPrice(num, cycleType int) (int64, error) {
  216. switch cycleType { // 类型 1天 2月 3年 4季度
  217. case 1:
  218. return ps.Moth * gconv.Int64(num) / 30, nil
  219. case 2:
  220. if num >= 12 && ps.Year > 0 {
  221. return ps.Year * gconv.Int64(num) / 12, nil
  222. }
  223. return ps.Moth * gconv.Int64(num), nil
  224. case 3:
  225. if ps.Year > 0 {
  226. return ps.Year * gconv.Int64(num), nil
  227. } else {
  228. return ps.Moth * gconv.Int64(num) * 12, nil
  229. }
  230. case 4:
  231. return ps.Moth * gconv.Int64(num) * 3, nil
  232. }
  233. return -1, gerror.NewCode(gcode.CodeInvalidParameter, "未知时间参数")
  234. }