bobo_coin.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package talent_service
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/net/ghttp"
  5. "github.com/gogf/gf/os/gtime"
  6. "youngmini_server/app/dao"
  7. "youngmini_server/app/model"
  8. "youngmini_server/app/model/talent_model"
  9. "youngmini_server/app/utils"
  10. )
  11. // GetBoBoCoinList 获取卜卜币收入支出记录列表
  12. func GetBoBoCoinList(r *ghttp.Request) *TalentHttpResult {
  13. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  14. if err != nil {
  15. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  16. }
  17. //res, err := g.DB().Model(dao.BobocoinIncomeRecord.Table, "coin").Where("coin.talent_id", tid).OrderDesc("complete_date").
  18. // LeftJoin(dao.OrderInfo.Table, "order", "order.order_id=coin.order_id").
  19. // LeftJoin(dao.TaskBaseInfo.Table, "task", "task.task_id=order.task_id").
  20. // Fields("task.task_name", "coin.*").All()
  21. //var res []*talent_model.BoBoCoinIncomeInfo
  22. //err = g.DB().Model(dao.BobocoinIncomeRecord.Table).WithAll().Where("talent_id", tid).Scan(&res)
  23. //if err != nil {
  24. // return &TalentHttpResult{Code: -2, Msg: "query income info failed"}
  25. //}
  26. //
  27. //res1, err := g.DB().Model(dao.BobocoinWithdrawalRecord.Table).Where("talent_id = ?", tid).OrderDesc("complete_date").All()
  28. //if err != nil {
  29. // return &TalentHttpResult{Code: -3, Msg: "query draw info failed"}
  30. //}
  31. //
  32. //if res == nil {
  33. // res = make([]*talent_model.BoBoCoinIncomeInfo, 0)
  34. //}
  35. //
  36. //if res1 == nil {
  37. // res1 = make([]gdb.Record, 0)
  38. //}
  39. //
  40. //allInfo := talent_model.BoBoCoinDetailAccount{IncomeList: res, DrawMoneyList: res1}
  41. //
  42. //return &TalentHttpResult{Code: 0, Msg: "success", Data: allInfo}
  43. // 计算待结算卜卜币
  44. var waitSettleValue, settleUpValue int64
  45. var talentAllOrder []*model.OrderInfo
  46. err = g.DB().Model(dao.OrderInfo.Table).Scan(&talentAllOrder, dao.OrderInfo.Columns.TalentId, tid)
  47. if err != nil {
  48. return &TalentHttpResult{Code: -2, Msg: "query talent order info failed"}
  49. }
  50. for _, v := range talentAllOrder {
  51. if v.CompleteStatus < int(utils.OrderCompleteTypeNormal) {
  52. if v.OrderStatus > 1 {
  53. // 执行中的订单,稿费计入待结算
  54. waitSettleValue += v.SettleAmount
  55. }
  56. }
  57. if v.CompleteStatus == int(utils.OrderCompleteTypeNormal) {
  58. // 执行完成订单,稿费计入已结算
  59. settleUpValue += v.SettleAmount
  60. }
  61. }
  62. // 查询总收入
  63. var incomeRes []*model.BobocoinIncomeRecord
  64. err = g.DB().Model(dao.BobocoinIncomeRecord.Table).Scan(&incomeRes, dao.BobocoinIncomeRecord.Columns.TalentId, tid)
  65. if err != nil {
  66. return &TalentHttpResult{Code: -3, Msg: "query income info failed"}
  67. }
  68. incomeRecMap := make(map[uint64]*model.BobocoinIncomeRecord)
  69. var incomeValue int64
  70. // 校验总收入和上面统计的已结算是否相等
  71. for _, v := range incomeRes {
  72. incomeValue += v.BobocoinValue
  73. incomeRecMap[uint64(v.OrderId)] = v
  74. }
  75. if incomeValue != settleUpValue {
  76. return &TalentHttpResult{Code: -4, Msg: "income value not equ settle up value"}
  77. }
  78. // 查询扣款记录
  79. var deductRes []*model.BobocoinDeductRecord
  80. err = g.DB().Model(dao.BobocoinDeductRecord.Table).Scan(&deductRes, dao.BobocoinDeductRecord.Columns.TalentId, tid)
  81. if err != nil {
  82. return &TalentHttpResult{Code: -5, Msg: "query income info failed"}
  83. }
  84. // 查询提现记录
  85. var withdrawRes []*model.BobocoinWithdrawalRecord
  86. err = g.DB().Model(dao.BobocoinWithdrawalRecord.Table).Scan(&withdrawRes, dao.BobocoinWithdrawalRecord.Columns.TalentId, tid)
  87. if err != nil {
  88. return &TalentHttpResult{Code: -6, Msg: "query income info failed"}
  89. }
  90. // 计算已提现和待打款
  91. var waitPay, hasPaied int64
  92. for _, v := range withdrawRes {
  93. if v.PayState == 2 {
  94. hasPaied += v.DrawAmount
  95. } else {
  96. waitPay += v.DrawAmount
  97. }
  98. }
  99. allInfo := talent_model.BoBoCoinDetailAccount{
  100. WaitSettle: waitSettleValue,
  101. SettleUp: settleUpValue,
  102. CanWithdraw: settleUpValue - hasPaied - waitPay, // 可提现金额为: 已结算金额 - 已打款金额 - 待打款金额
  103. HasWithDraw: hasPaied,
  104. WaitPay: waitPay,
  105. IncomeList: incomeRes,
  106. DrawMoneyList: withdrawRes,
  107. DeductList: deductRes,
  108. }
  109. return &TalentHttpResult{Code: 0, Msg: "success", Data: allInfo}
  110. }
  111. // GetBoBoCoinOrderSettleInfo 获取订单结算卜卜币的信息
  112. func GetBoBoCoinOrderSettleInfo(r *ghttp.Request) *TalentHttpResult {
  113. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  114. if err != nil {
  115. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  116. }
  117. // 获取结束状态小于3(1进行中 2已结算)的订单
  118. var orderSettleInfo []*talent_model.BoBoCoinOrderInfo
  119. err = g.DB().Model(dao.OrderInfo.Table).Scan(&orderSettleInfo, "talent_id = ? and complete_status < 3 and order_status > 1", tid)
  120. if err != nil {
  121. return &TalentHttpResult{Code: -2, Msg: "query order info failed"}
  122. }
  123. orderListMap := make(map[uint64]*talent_model.BoBoCoinOrderInfo)
  124. // 分别存储已结算和未结算订单
  125. allOrderList := talent_model.BoBoCoinOrderSettleStateResult{}
  126. for _, v := range orderSettleInfo {
  127. if v.CompleteStatus == 1 {
  128. allOrderList.UnsettledOrders = append(allOrderList.UnsettledOrders, v)
  129. }
  130. if v.CompleteStatus == 2 {
  131. allOrderList.SettleUpOrders = append(allOrderList.SettleUpOrders, v)
  132. orderListMap[v.OrderId] = v
  133. }
  134. }
  135. return &TalentHttpResult{Code: 0, Msg: "success", Data: allOrderList}
  136. }
  137. // GetBoBoCoinWithdrawalInfo 获取已有提现信息,目前只是支付宝账号
  138. func GetBoBoCoinWithdrawalInfo(r *ghttp.Request) *TalentHttpResult {
  139. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  140. if err != nil {
  141. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  142. }
  143. rec, err := g.DB().Model(dao.TalentInfo.Table).Fields(dao.TalentInfo.Columns.AliName, dao.TalentInfo.Columns.AliAccount).One("id", tid)
  144. if err != nil {
  145. return &TalentHttpResult{Code: -2, Msg: "query info failed"}
  146. }
  147. boboCoin, err := g.DB().Model(dao.BobocoinIncomeRecord.Table).Where("talent_id", tid).Sum(dao.BobocoinIncomeRecord.Columns.BobocoinValue)
  148. if err != nil {
  149. boboCoin = 0
  150. }
  151. drawMoney, err := g.DB().Model(dao.BobocoinWithdrawalRecord.Table).
  152. Where("talent_id = ? and (pay_state = 1 or pay_state = 2)", tid).
  153. Sum(dao.BobocoinWithdrawalRecord.Columns.DrawAmount)
  154. if err != nil {
  155. drawMoney = 0
  156. }
  157. data := talent_model.BoBoCoinWithdrawInfo{
  158. BoBoCoinValue: int64(boboCoin - drawMoney),
  159. AliName: rec["ali_name"].String(),
  160. AliAccount: rec["ali_account"].String(),
  161. }
  162. return &TalentHttpResult{Code: 0, Msg: "success", Data: data}
  163. }
  164. // BindWithdrawalAccount 绑定提现账户信息
  165. func BindWithdrawalAccount(r *ghttp.Request) *TalentHttpResult {
  166. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  167. if err != nil {
  168. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  169. }
  170. var info *talent_model.BoBoCoinAliAccountInfo
  171. err = r.ParseForm(&info)
  172. if err != nil {
  173. return &TalentHttpResult{Code: -2, Msg: err.Error()}
  174. }
  175. _, err = g.DB().Model(dao.TalentInfo.Table).Update(info, "id", tid)
  176. if err != nil {
  177. panic(err.Error())
  178. }
  179. return &TalentHttpResult{Code: 0, Msg: "success"}
  180. }
  181. // BoBoCoinWithdrawalReq 卜卜币提现申请
  182. func BoBoCoinWithdrawalReq(r *ghttp.Request) *TalentHttpResult {
  183. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  184. if err != nil {
  185. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  186. }
  187. // 查看提现账户信息是否完善
  188. accountRec, err := g.DB().Model(dao.TalentInfo.Table).
  189. Fields(dao.TalentInfo.Columns.AliName, dao.TalentInfo.Columns.AliAccount).
  190. One("id", tid)
  191. if err != nil || accountRec[dao.TalentInfo.Columns.AliName] == nil || accountRec[dao.TalentInfo.Columns.AliAccount] == nil {
  192. return &TalentHttpResult{Code: -2, Msg: "please complete withdrawal account info"}
  193. }
  194. var info *talent_model.BoBoCoinWithdrawalReq
  195. err = r.ParseForm(&info)
  196. if err != nil {
  197. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  198. }
  199. // 获取可提现金额
  200. inSum, err := g.DB().Model(dao.BobocoinIncomeRecord.Table).Where("talent_id", tid).Sum(dao.BobocoinIncomeRecord.Columns.BobocoinValue)
  201. if err != nil {
  202. return &TalentHttpResult{Code: -4, Msg: "query database failed"}
  203. }
  204. outSum, err := g.DB().Model(dao.BobocoinWithdrawalRecord.Table).
  205. Where("talent_id = ? and (pay_state = 1 or pay_state = 2)", tid).
  206. Sum(dao.BobocoinWithdrawalRecord.Columns.DrawAmount)
  207. if err != nil {
  208. return &TalentHttpResult{Code: -5, Msg: "query database failed"}
  209. }
  210. // 可提现金额小于申请提现金额,失败,返回
  211. withdrawAble := int64(inSum - outSum)
  212. if withdrawAble < info.WithdrawalAmount {
  213. return &TalentHttpResult{Code: -6, Msg: "bobocoin not enough"}
  214. }
  215. // 将请求写入数据库
  216. _, err = g.DB().Model(dao.BobocoinWithdrawalRecord.Table).Insert(model.BobocoinWithdrawalRecord{
  217. TalentId: tid,
  218. DrawAmount: info.WithdrawalAmount,
  219. PayAccount: accountRec[dao.TalentInfo.Columns.AliAccount].String(),
  220. AccountName: accountRec[dao.TalentInfo.Columns.AliName].String(),
  221. PayPlatform: 1,
  222. PayState: 1,
  223. SubmitDate: gtime.Now(),
  224. })
  225. if err != nil {
  226. return &TalentHttpResult{Code: -7, Msg: "write to database failed"}
  227. }
  228. return &TalentHttpResult{Code: 0, Msg: "success"}
  229. }