EventSignUp.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\wap\model\activity;
  12. use app\wap\model\activity\EventRegistration;
  13. use app\wap\model\user\User;
  14. use app\wap\model\user\UserBill;
  15. use service\HookService;
  16. use traits\ModelTrait;
  17. use basic\ModelBasic;
  18. use think\Db;
  19. use service\SystemConfigService;
  20. use service\WechatService;
  21. use service\WechatTemplateService;
  22. use app\wap\model\user\WechatUser;
  23. use behavior\wechat\PaymentBehavior;
  24. use service\AlipayTradeWapService;
  25. use think\Url;
  26. class EventSignUp extends ModelBasic
  27. {
  28. use ModelTrait;
  29. protected $insert = ['add_time'];
  30. protected static $payType = ['weixin' => '微信支付', 'yue' => '余额支付', 'offline' => '线下支付', 'zhifubao' => '支付宝'];
  31. protected function setAddTimeAttr()
  32. {
  33. return time();
  34. }
  35. public static function getNewOrderId()
  36. {
  37. $count = (int)self::where('add_time', ['>=', strtotime(date("Y-m-d"))], ['<', strtotime(date("Y-m-d", strtotime('+1 day')))])->count();
  38. return 'su' . date('YmdHis', time()) . (10000 + $count + 1);
  39. }
  40. /**用户提交报名
  41. * @param $id
  42. * @param $userName
  43. * @param $userPhone
  44. */
  45. public static function userEventSignUp($id,$signUp,$payType,$uid){
  46. if (!array_key_exists($payType, self::$payType)) return self::setErrorInfo('选择支付方式有误!');
  47. $userInfo = User::getUserInfo($uid);
  48. if (!$userInfo) return self::setErrorInfo('用户不存在!');
  49. $activity = EventRegistration::oneActivitys($id);
  50. if (!$activity) return false;
  51. $count=self::where('paid',1)->where('activity_id',$id)->count();//活动报名总数
  52. if(bcsub($activity['number'],$count,0)<=0) return self::setErrorInfo('活动报名结束!');
  53. $userCount=self::where('paid',1)->where('uid',$uid)->where('activity_id',$id)->count();//用户该活动报名次数
  54. if($activity['restrictions'] && bcsub($activity['restrictions'],$userCount,0)<=0) return self::setErrorInfo('您的活动报名已超过限额!');
  55. $payPrice = 0;
  56. if(isset($userInfo['level']) && $userInfo['level'] > 0 && $activity['member_pay_type'] == 1 && $activity['member_price'] > 0){
  57. $payPrice = $activity['member_price'];
  58. }elseif ($userInfo['level']==0 && $activity['pay_type'] == 1 && $activity['price'] > 0){
  59. $payPrice = $activity['price'];
  60. }
  61. $data=[
  62. 'order_id'=>self::getNewOrderId(),
  63. 'uid'=>$uid,
  64. 'user_info'=>$signUp,
  65. 'activity_id'=>$id,
  66. 'pay_price'=>$payPrice,
  67. 'pay_type'=>$payType,
  68. ];
  69. $order = self::set($data);
  70. if (!$order) return self::setErrorInfo('报名订单生成失败!');
  71. return $order;
  72. }
  73. /**
  74. * 微信支付 为 0元时
  75. * @param $order_id
  76. * @param $uid
  77. * @return bool
  78. */
  79. public static function jsPayPrice($order_id, $uid)
  80. {
  81. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->where('is_del', 0)->find();
  82. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  83. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  84. $userInfo = User::getUserInfo($uid);
  85. self::beginTrans();
  86. $res1 = UserBill::expend('活动报名成功', $uid, 'now_money', 'pay_sign_up', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '微信支付' . floatval($orderInfo['pay_price']) . '元活动报名');
  87. $res2 = self::paySuccess($order_id);
  88. $res = $res1 && $res2;
  89. self::checkTrans($res);
  90. return $res;
  91. }
  92. public static function jsPay($orderId, $field = 'order_id')
  93. {
  94. if (is_string($orderId))
  95. $orderInfo = self::where($field, $orderId)->find();
  96. else
  97. $orderInfo = $orderId;
  98. if (!$orderInfo || !isset($orderInfo['paid'])) exception('支付订单不存在!');
  99. if ($orderInfo['paid']) exception('支付已支付!');
  100. if ($orderInfo['pay_price'] <= 0) exception('该支付无需支付!');
  101. $openid = WechatUser::uidToOpenid($orderInfo['uid']);
  102. return WechatService::jsPay($openid, $orderInfo['order_id'], $orderInfo['pay_price'], 'signup', SystemConfigService::get('site_name'));
  103. }
  104. public static function yuePay($order_id, $uid)
  105. {
  106. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->where('is_del', 0)->find();
  107. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  108. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  109. if ($orderInfo['pay_type'] != 'yue') return self::setErrorInfo('该订单不能使用余额支付!');
  110. $userInfo = User::getUserInfo($uid);
  111. if ($userInfo['now_money'] < $orderInfo['pay_price'])
  112. return self::setErrorInfo('余额不足' . floatval($orderInfo['pay_price']));
  113. self::beginTrans();
  114. $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_price'], 'uid');
  115. $res2 = UserBill::expend('活动报名', $uid, 'now_money', 'pay_sign_up', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元活动报名');
  116. $res3 = self::paySuccess($order_id);
  117. $res = $res1 && $res2 && $res3;
  118. self::checkTrans($res);
  119. return $res;
  120. }
  121. /**
  122. * //TODO 支付成功后
  123. * @param $orderId
  124. * @param $notify
  125. * @return bool
  126. */
  127. public static function paySuccess($orderId)
  128. {
  129. $order = self::where('order_id', $orderId)->find();
  130. $res1 = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_time' => time()]);
  131. $site_url = SystemConfigService::get('site_url');
  132. try{
  133. WechatTemplateService::sendTemplate(WechatUser::where('uid', $order['uid'])->value('openid'), WechatTemplateService::ORDER_PAY_SUCCESS, [
  134. 'first' => '亲,您的活动报名成功',
  135. 'keyword1' => $orderId,
  136. 'keyword2' => $order['pay_price'],
  137. 'remark' => '点击查看报名详情'
  138. ], $site_url . Url::build('wap/my/sign_list'));
  139. WechatTemplateService::sendAdminNoticeTemplate([
  140. 'first' => "亲,您有一个新的活动报名订单",
  141. 'keyword1' => $orderId,
  142. 'keyword2' => $order['pay_price'],
  143. 'remark' => '请及时查看'
  144. ]);
  145. }catch (\Throwable $e){}
  146. $res = $res1;
  147. return false !== $res;
  148. }
  149. public static function userSignUpActivityList($uid,$page=1,$limit=20){
  150. $list=self::alias('s')->join('EventRegistration r','r.id=s.activity_id','left')
  151. ->where('s.paid',1)->page((int)$page,(int)$limit)->order('s.add_time DESC')->select();
  152. }
  153. public static function qrcodes_url($order_id='',$size=5){
  154. vendor('phpqrcode.phpqrcode');
  155. $urls=SystemConfigService::get('site_url').'/';
  156. $url=$urls.'wap/my/sign_order/type/2/order_id/'.$order_id;
  157. $value = $url; //二维码内容
  158. $errorCorrectionLevel = 'H'; //容错级别
  159. $matrixPointSize = $size; //生成图片大小
  160. //生成二维码图片
  161. $filename = 'public/qrcode/'.'su'.rand(10000000,99999999).'.png';
  162. \QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
  163. return $urls.$filename;
  164. }
  165. public static function signUpOrder($id,$uid){
  166. $order=EventSignUp::where('activity_id',$id)->where('uid',$uid)->where('paid',1)->find();
  167. if(!$order) return false;
  168. $activity=EventRegistration::where('id',$order['activity_id'])->field('title,image,phone,province,city,district,detail,write_off_code')->find();
  169. if(!$activity) return false;
  170. $activity['order_id']=$order['order_id'];
  171. if(!$activity['write_off_code']){
  172. $write_off_code=self::qrcodes_url($order['order_id'],5);
  173. EventSignUp::where('order_id',$order['order_id'])->update(['write_off_code'=>$write_off_code]);
  174. $activity['write_off_code']=$write_off_code;
  175. }
  176. return $activity;
  177. }
  178. }