VoteOrder.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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 = self::valid()
  54. ->where('vjid', $id)->count();
  55. return compact('count', 'data');
  56. }
  57. public static function createOrder($uid, $id, $num, $payType)
  58. {
  59. self::beginTrans();
  60. try {
  61. if (!array_key_exists($payType, self::$payType)) return self::setErrorInfo('选择支付方式有误!', true);
  62. $userInfo = User::getUserInfo($uid);
  63. if (!$userInfo) return self::setErrorInfo('用户不存在!', true);
  64. $voteJoinInfo = VoteJoin::valid()->find($id);
  65. if (!$voteJoinInfo) return self::setErrorInfo('找不到投票对象', true);
  66. $voteInfo = Vote::valid()->find($voteJoinInfo['vid']);
  67. if (!$voteInfo) return self::setErrorInfo('找不到投票活动信息', true);
  68. if ($voteInfo['start_time'] > time()) {
  69. return self::setErrorInfo('投票未开始,开始时间:' . date('Y-m-d H:i:s', $voteInfo['start_time']), true);
  70. //return app('json')->fail('活动未开始');
  71. }
  72. if ($voteInfo['end_time'] < time()) {
  73. return self::setErrorInfo('活动已结束', true);
  74. //return app('json')->fail('活动已结束');
  75. }
  76. $payPrice = bcmul($num, $voteInfo['price'], 2);
  77. $orderInfo = [
  78. 'uid' => $uid,
  79. 'vid' => $voteJoinInfo['vid'],
  80. 'vjid' => $id,
  81. 'vote_num' => $num,
  82. 'pay_price' => $payPrice,
  83. 'order_id' => self::getOrderId(),
  84. 'pay_type' => $payType,
  85. 'add_time' => time(),
  86. ];
  87. $order = self::create($orderInfo);
  88. if (!$order) return self::setErrorInfo('订单生成失败!', true);
  89. self::commitTrans();
  90. return $order;
  91. } catch (\PDOException $e) {
  92. self::rollbackTrans();
  93. return self::setErrorInfo('生成订单时SQL执行错误错误原因:' . $e->getMessage());
  94. } catch (\Exception $e) {
  95. self::rollbackTrans();
  96. return self::setErrorInfo('生成订单时系统错误错误原因:' . $e->getMessage());
  97. }
  98. }
  99. public static function jsPayPrice($order_id, $uid)
  100. {
  101. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  102. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  103. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  104. $userInfo = \app\models\user\User::getUserInfo($uid);
  105. self::beginTrans();
  106. $res1 = UserBill::expend('参与投票', $uid, 'now_money', 'pay_vote', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '微信支付' . floatval($orderInfo['pay_price']) . '元参与投票');
  107. $res2 = self::paySuccess($order_id, 'weixin');//微信支付为0时
  108. $res = $res1 && $res2;
  109. self::checkTrans($res);
  110. return $res;
  111. }
  112. public static function yuePay($order_id, $uid)
  113. {
  114. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  115. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  116. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  117. $userInfo = \app\models\user\User::getUserInfo($uid);
  118. if ($userInfo['now_money'] < $orderInfo['pay_price'])
  119. return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '余额不足' . floatval($orderInfo['pay_price'])]);
  120. self::beginTrans();
  121. $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_price'], 'uid');
  122. $res2 = UserBill::expend('参与投票', $uid, 'now_money', 'pay_vote', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元参与投票');
  123. $res3 = self::paySuccess($order_id, 'yue');//余额支付成功
  124. $res = $res1 && $res2 && $res3;
  125. self::checkTrans($res);
  126. return $res;
  127. }
  128. public static function freePay($order_id, $uid)
  129. {
  130. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  131. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  132. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  133. //$userInfo = \app\models\user\User::getUserInfo($uid);
  134. 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')->where('pay_type', 'free')->sum('vote_num')) {
  135. return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '免费票不足' . floatval($orderInfo['pay_price'])]);
  136. }
  137. self::beginTrans();
  138. //$res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_price'], 'uid');
  139. //$res2 = UserBill::expend('参与投票', $uid, 'now_money', 'pay_vote', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元参与投票');
  140. $res = self::paySuccess($order_id, 'free');//余额支付成功
  141. //$res = $res1 && $res2 && $res3;
  142. self::checkTrans($res);
  143. return $res;
  144. }
  145. /**
  146. * //TODO 支付成功后
  147. * @param $orderId
  148. * @param string $paytype
  149. * @param string $formId
  150. * @return bool
  151. * @throws DataNotFoundException
  152. * @throws DbException
  153. * @throws ModelNotFoundException
  154. */
  155. public static function paySuccess($orderId, $paytype = 'weixin')
  156. {
  157. $order = self::where('order_id', $orderId)->find();
  158. $res1 = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_type' => $paytype, 'pay_time' => time()]);//订单改为支付
  159. $res2 = VoteJoin::where('id', $order['vjid'])->inc('vote', $order['vote_num'])->update();
  160. $now_money = \app\models\user\User::where('uid', $order['uid'])->value('now_money');
  161. UserBill::expend('参与投票', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元参与投票');
  162. $res = $res1 && $res2;
  163. return false !== $res;
  164. }
  165. public static function getOrderId()
  166. {
  167. do {
  168. $str = 'vote' . time() . rand(1000, 9999);
  169. } while (self::be(['order_id' => $str]));
  170. return $str;
  171. }
  172. }