VoteOrder.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. /**
  3. *
  4. * @author: wuhaotian<442384644@qq.com>
  5. * @day: 2019/12/07
  6. */
  7. namespace app\admin\model\vote;
  8. use app\admin\model\user\User;
  9. use app\models\store\StoreOrderStatus;
  10. use app\models\store\StorePink;
  11. use app\models\user\UserBill;
  12. use app\models\user\UserSpread;
  13. use crmeb\basic\BaseModel;
  14. use crmeb\repositories\PaymentRepositories;
  15. use crmeb\traits\ModelTrait;
  16. use think\db\exception\DataNotFoundException;
  17. use think\db\exception\DbException;
  18. use think\db\exception\ModelNotFoundException;
  19. use think\db\Where;
  20. /**
  21. * Class UserGroup
  22. * @package app\admin\model\user
  23. */
  24. class VoteOrder extends BaseModel
  25. {
  26. /**
  27. * 数据表主键
  28. * @var string
  29. */
  30. protected $pk = 'id';
  31. /**
  32. * 模型名称
  33. * @var string
  34. */
  35. protected $name = 'vote_order';
  36. protected static $payType = ['weixin' => '微信支付', 'yue' => '余额支付', 'free' => '免费投票'];
  37. use ModelTrait;
  38. public static function valid()
  39. {
  40. return self::where('paid', 1);
  41. }
  42. public static function getValidList($id, $where)
  43. {
  44. $data = self::valid()
  45. ->where('vjid', $id)
  46. ->page((int)$where['page'], (int)$where['limit'])
  47. ->order('add_time', 'desc')->select()->each(function ($item) {
  48. $user = \app\admin\model\user\User::get($item['uid']);
  49. $item['user_name'] = $user['nickname'];
  50. $item['_add_time'] = date('Y-m-d H:i:s', $item['add_time']);
  51. $item['_pay_time'] = date('Y-m-d H:i:s', $item['pay_time']);
  52. });
  53. $count = $data->count();
  54. return compact('count', 'data');
  55. }
  56. public static function createOrder($uid, $id, $num, $payType)
  57. {
  58. self::beginTrans();
  59. try {
  60. if (!array_key_exists($payType, self::$payType)) return self::setErrorInfo('选择支付方式有误!', true);
  61. $userInfo = User::getUserInfo($uid);
  62. if (!$userInfo) return self::setErrorInfo('用户不存在!', true);
  63. $voteJoinInfo = VoteJoin::valid()->find($id);
  64. if (!$voteJoinInfo) return self::setErrorInfo('找不到投票对象', true);
  65. $voteInfo = Vote::valid()->find($voteJoinInfo['vid']);
  66. if (!$voteInfo) return self::setErrorInfo('找不到投票活动信息', true);
  67. if ($voteInfo['start_time'] > time()) {
  68. return app('json')->fail('活动未开始');
  69. }
  70. if ($voteInfo['end_time'] < time()) {
  71. return app('json')->fail('活动已结束');
  72. }
  73. $payPrice = bcmul($num, $voteInfo['price'], 2);
  74. $orderInfo = [
  75. 'uid' => $uid,
  76. 'vid' => $voteJoinInfo['vid'],
  77. 'vjid' => $id,
  78. 'vote_num' => $num,
  79. 'pay_price' => $payPrice,
  80. 'order_id' => self::getOrderId(),
  81. 'pay_type' => $payType,
  82. 'add_time' => time(),
  83. ];
  84. $order = self::create($orderInfo);
  85. if (!$order) return self::setErrorInfo('订单生成失败!', true);
  86. self::commitTrans();
  87. return $order;
  88. } catch (\PDOException $e) {
  89. self::rollbackTrans();
  90. return self::setErrorInfo('生成订单时SQL执行错误错误原因:' . $e->getMessage());
  91. } catch (\Exception $e) {
  92. self::rollbackTrans();
  93. return self::setErrorInfo('生成订单时系统错误错误原因:' . $e->getMessage());
  94. }
  95. }
  96. public static function jsPayPrice($order_id, $uid)
  97. {
  98. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  99. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  100. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  101. $userInfo = \app\models\user\User::getUserInfo($uid);
  102. self::beginTrans();
  103. $res1 = UserBill::expend('参与投票', $uid, 'now_money', 'pay_vote', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '微信支付' . floatval($orderInfo['pay_price']) . '元参与投票');
  104. $res2 = self::paySuccess($order_id, 'weixin');//微信支付为0时
  105. $res = $res1 && $res2;
  106. self::checkTrans($res);
  107. return $res;
  108. }
  109. public static function yuePay($order_id, $uid)
  110. {
  111. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  112. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  113. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  114. $userInfo = \app\models\user\User::getUserInfo($uid);
  115. if ($userInfo['now_money'] < $orderInfo['pay_price'])
  116. return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '余额不足' . floatval($orderInfo['pay_price'])]);
  117. self::beginTrans();
  118. $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_price'], 'uid');
  119. $res2 = UserBill::expend('参与投票', $uid, 'now_money', 'pay_vote', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元参与投票');
  120. $res3 = self::paySuccess($order_id, 'yue');//余额支付成功
  121. $res = $res1 && $res2 && $res3;
  122. self::checkTrans($res);
  123. return $res;
  124. }
  125. public static function freePay($order_id, $uid)
  126. {
  127. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  128. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  129. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  130. $userInfo = \app\models\user\User::getUserInfo($uid);
  131. if (Vote::where('id', $orderInfo['vid'])->value('day_free') < $orderInfo['vote_num'] + self::valid()->where('uid', $orderInfo['uid'])->where('vid', $orderInfo['vid'])->whereTime('pay_time', 'today')->sum('vote_num')) {
  132. return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '免费票不足' . floatval($orderInfo['pay_price'])]);
  133. }
  134. self::beginTrans();
  135. //$res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_price'], 'uid');
  136. //$res2 = UserBill::expend('参与投票', $uid, 'now_money', 'pay_vote', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元参与投票');
  137. $res = self::paySuccess($order_id, 'free');//余额支付成功
  138. //$res = $res1 && $res2 && $res3;
  139. self::checkTrans($res);
  140. return $res;
  141. }
  142. /**
  143. * //TODO 支付成功后
  144. * @param $orderId
  145. * @param string $paytype
  146. * @param string $formId
  147. * @return bool
  148. * @throws DataNotFoundException
  149. * @throws DbException
  150. * @throws ModelNotFoundException
  151. */
  152. public static function paySuccess($orderId, $paytype = 'weixin')
  153. {
  154. $order = self::where('order_id', $orderId)->find();
  155. $res1 = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_type' => $paytype, 'pay_time' => time()]);//订单改为支付
  156. $res2 = VoteJoin::where('id', $order['vjid'])->inc('vote', $order['vote_num'])->update();
  157. $now_money = \app\models\user\User::where('uid', $order['uid'])->value('now_money');
  158. UserBill::expend('参与投票', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元参与投票');
  159. $res = $res1 && $res2;
  160. return false !== $res;
  161. }
  162. public static function getOrderId()
  163. {
  164. do {
  165. $str = 'vote' . time() . rand(1000, 9999);
  166. } while (self::be(['order_id' => $str]));
  167. return $str;
  168. }
  169. }