common.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package product
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/database/gdb"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/util/gconv"
  8. "github.com/pkg/errors"
  9. "jyOrderManager/internal/jyutil"
  10. "jyOrderManager/internal/model"
  11. "math"
  12. "time"
  13. )
  14. // GetLinkVipCycleFilter 获取关联订单
  15. func GetLinkVipCycleFilter(ctx context.Context, linkOrderDetailId int64) (filter *model.VipCycleFilter, st, et time.Time, err error) {
  16. var (
  17. re gdb.Record
  18. )
  19. re, err = g.DB().GetOne(ctx, "SELECT filter,service_starttime,service_endtime FROM jy_order_detail WHERE id =? and status =1", linkOrderDetailId)
  20. if err != nil {
  21. return
  22. }
  23. var (
  24. dMap = re.Map()
  25. )
  26. if len(dMap) == 0 {
  27. err = fmt.Errorf("获取关联订单异常")
  28. return
  29. }
  30. var ttt model.VipCycleFilter
  31. if err = gconv.Struct(dMap["filter"], &ttt); err != nil {
  32. return
  33. }
  34. filter = &ttt
  35. st, err = time.Parse("2006-01-02 15:04:05", gconv.String(dMap["service_starttime"]))
  36. if err != nil {
  37. return
  38. }
  39. et, err = time.Parse("2006-01-02 15:04:05", gconv.String(dMap["service_endtime"]))
  40. if err != nil {
  41. return
  42. }
  43. return
  44. }
  45. // GetLinkBigCycleFilter 获取关联订单
  46. func GetLinkBigCycleFilter(ctx context.Context, linkOrderDetailId string) (filter *model.JyBigProductFilter, st, et time.Time, err error) {
  47. var (
  48. re gdb.Record
  49. )
  50. re, err = g.DB().GetOne(ctx, fmt.Sprintf(`SELECT filter,service_starttime,service_endtime FROM jy_order_detail WHERE id =%s and status =1`, linkOrderDetailId))
  51. if err != nil {
  52. return
  53. }
  54. var (
  55. dMap = re.Map()
  56. )
  57. if len(dMap) == 0 {
  58. err = fmt.Errorf("获取关联订单异常")
  59. return
  60. }
  61. var ttt model.JyBigProductFilter
  62. err = gconv.Struct(dMap["filter"], &ttt)
  63. if err != nil {
  64. return
  65. }
  66. filter = &ttt
  67. st, err = time.Parse("2006-01-02 15:04:05", gconv.String(dMap["service_starttime"]))
  68. if err != nil {
  69. return
  70. }
  71. et, err = time.Parse("2006-01-02 15:04:05", gconv.String(dMap["service_endtime"]))
  72. if err != nil {
  73. return
  74. }
  75. return
  76. }
  77. // GetLinkBigUserNumber 通过关联订单获取升级前的子账号数量
  78. func GetLinkBigUserNumber(ctx context.Context, linkOrderDetailId, reqSubject int64, Phone string) (count int, err error) {
  79. var (
  80. re gdb.Record
  81. )
  82. switch reqSubject {
  83. case 2:
  84. re, err = g.DB().GetOne(ctx, fmt.Sprintf(`SELECT a.empower_count FROM entniche_wait_empower a
  85. INNER JOIN entniche_order b on a.id = b.wait_empower_id
  86. WHERE b.order_detail_id = %d`, linkOrderDetailId))
  87. if err != nil {
  88. return 0, err
  89. }
  90. count = gconv.Int(re.Map()["empower_count"])
  91. default:
  92. user, _, _, err := jyutil.GetCreateUserData(Phone, "", false)
  93. if err == nil && user != nil && len(user) > 0 {
  94. count = gconv.Int((user)["i_pay_sub_num"]) + 1
  95. } else {
  96. return 0, errors.New("用户信息获取错误")
  97. }
  98. }
  99. return
  100. }
  101. type NewPriceSetting struct {
  102. PrPi []ProductPricing `json:"prPi"`
  103. }
  104. type ProductPricing struct {
  105. Max int `json:"max"`
  106. Min int `json:"min"`
  107. TimeType int `json:"timeType"` // 类型 1天 2月 3年 4季度
  108. Unit int `json:"unit"` //折合单价数
  109. Price int64 `json:"price"` //单价费用
  110. Account int64 `json:"account"` //个人子账号费用
  111. EntAccount int64 `json:"entAccount"` //企业账号费用
  112. }
  113. // UnityPrice 计费
  114. func (ps NewPriceSetting) UnityPrice(num, cycleType, subAccount, price int, isEnt bool, sType ...string) int64 {
  115. switch cycleType { // 类型 1天 2月 3年 4季度
  116. case 1:
  117. //查找在哪个分类中
  118. for _, pricing := range ps.PrPi {
  119. var subPrice float64
  120. if isEnt {
  121. subPrice = gconv.Float64(pricing.EntAccount)
  122. } else {
  123. subPrice = gconv.Float64(pricing.Account)
  124. }
  125. var newPrice float64
  126. if price != 0 {
  127. newPrice = gconv.Float64(price)
  128. } else {
  129. newPrice = gconv.Float64(pricing.Price)
  130. }
  131. switch pricing.TimeType { // 类型 1月 2年 3季度
  132. case 1: //
  133. if float64(num)/30 >= gconv.Float64(pricing.Min) && float64(num)/30 < float64(pricing.Max) {
  134. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / (float64(num) / 30))))
  135. }
  136. case 2:
  137. if float64(num)/360 >= gconv.Float64(pricing.Min) && float64(num)/360 < float64(pricing.Max) {
  138. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / (float64(num) / 30))))
  139. }
  140. case 3:
  141. if float64(num)/90 >= gconv.Float64(pricing.Min) && float64(num)/90 < float64(pricing.Max) {
  142. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / (float64(num) / 30))))
  143. }
  144. }
  145. }
  146. case 2:
  147. //查找在哪个分类中
  148. for _, pricing := range ps.PrPi {
  149. var subPrice float64
  150. if isEnt {
  151. subPrice = gconv.Float64(pricing.EntAccount)
  152. } else {
  153. subPrice = gconv.Float64(pricing.Account)
  154. }
  155. var newPrice float64
  156. if len(sType) == 0 { //升级服务 只升级账号费用
  157. if price != 0 {
  158. newPrice = gconv.Float64(price)
  159. } else {
  160. newPrice = gconv.Float64(pricing.Price)
  161. }
  162. }
  163. switch pricing.TimeType { // 类型 1月 2年
  164. case 1: //
  165. if num >= pricing.Min && num < pricing.Max {
  166. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num))))
  167. }
  168. case 2:
  169. if float64(num/12) >= gconv.Float64(pricing.Min) && float64(num/12) < float64(pricing.Max) {
  170. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num))))
  171. }
  172. case 3:
  173. if float64(num)/3 >= gconv.Float64(pricing.Min) && float64(num)/3 < float64(pricing.Max) {
  174. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num))))
  175. }
  176. }
  177. }
  178. case 3:
  179. //查找在哪个分类中
  180. for _, pricing := range ps.PrPi {
  181. var subPrice float64
  182. if isEnt {
  183. subPrice = gconv.Float64(pricing.EntAccount)
  184. } else {
  185. subPrice = gconv.Float64(pricing.Account)
  186. }
  187. var newPrice float64
  188. if price != 0 {
  189. newPrice = gconv.Float64(price)
  190. } else {
  191. newPrice = gconv.Float64(pricing.Price)
  192. }
  193. switch pricing.TimeType { // 类型 1月 2年
  194. case 1: //
  195. if num*12 >= pricing.Min && num*12 < pricing.Max {
  196. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num*12))))
  197. }
  198. case 2:
  199. if float64(num) >= gconv.Float64(pricing.Min) && float64(num) < float64(pricing.Max) {
  200. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num*12))))
  201. }
  202. }
  203. }
  204. case 4:
  205. //查找在哪个分类中
  206. for _, pricing := range ps.PrPi {
  207. var subPrice float64
  208. if isEnt {
  209. subPrice = gconv.Float64(pricing.EntAccount)
  210. } else {
  211. subPrice = gconv.Float64(pricing.Account)
  212. }
  213. var newPrice float64
  214. if price != 0 {
  215. newPrice = gconv.Float64(price)
  216. } else {
  217. newPrice = gconv.Float64(pricing.Price)
  218. }
  219. switch pricing.TimeType { // 类型 1月 2年
  220. case 1:
  221. if num*3 >= pricing.Min && num*3 < pricing.Max {
  222. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num*3))))
  223. }
  224. case 2: //
  225. if gconv.Float64(num) >= gconv.Float64(pricing.Min) && gconv.Float64(num) < gconv.Float64(pricing.Max) {
  226. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num*3))))
  227. }
  228. case 3:
  229. if float64(num) >= gconv.Float64(pricing.Min) && float64(num) < float64(pricing.Max) {
  230. return gconv.Int64(math.Floor((newPrice + subPrice*gconv.Float64(subAccount)) / (float64(pricing.Unit) / float64(num*3))))
  231. }
  232. }
  233. }
  234. }
  235. return 0
  236. }