PaySuccess.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\api\service\order;
  13. use app\api\model\card\UserRiceCard as UserRiceCardModel;
  14. use app\api\model\card\UserRiceCardConsume as UserRiceCardConsumeModel;
  15. use app\api\model\member\GoldRice as GoldRiceModel;
  16. use app\common\enum\user\AccumulatePointsScene;
  17. use app\common\service\BaseService;
  18. use app\api\model\User as UserModel;
  19. use app\api\model\Order as OrderModel;
  20. use app\api\model\user\BalanceLog as BalanceLogModel;
  21. use app\common\service\commission\RecordWaitCommission;
  22. use app\common\service\goods\source\Factory as StockFactory;
  23. use app\common\enum\OrderType as OrderTypeEnum;
  24. use app\common\enum\order\PayType as OrderPayTypeEnum;
  25. use app\common\enum\user\balanceLog\Scene as SceneEnum;
  26. use app\common\enum\order\OrderSource as OrderSourceEnum;
  27. use app\common\model\store\Setting as SettingModel;
  28. use think\facade\Event;
  29. /**
  30. * 订单支付成功服务类
  31. * Class PaySuccess
  32. * @package app\api\service\order
  33. */
  34. class PaySuccess extends BaseService
  35. {
  36. // 订单模型
  37. public $model;
  38. // 当前用户信息
  39. private $user;
  40. /**
  41. * 构造函数
  42. * PaySuccess constructor.
  43. * @param $orderNo
  44. */
  45. public function __construct($orderNo)
  46. {
  47. parent::__construct();
  48. // 实例化订单模型
  49. $this->model = OrderModel::getPayDetail($orderNo);
  50. // 获取用户信息
  51. $this->user = UserModel::detail($this->model['user_id']);
  52. }
  53. /**
  54. * 获取订单详情
  55. * @return OrderModel|null
  56. */
  57. public function getOrderInfo()
  58. {
  59. return $this->model;
  60. }
  61. /**
  62. * 订单支付成功业务处理
  63. * @param $payType
  64. * @param array $payData
  65. * @return bool
  66. */
  67. public function onPaySuccess($payType, $payData = [])
  68. {
  69. if (empty($this->model)) {
  70. $this->error = '未找到该订单信息';
  71. return false;
  72. }
  73. // 更新付款状态
  74. $status = $this->updatePayStatus($payType, $payData);
  75. // 订单支付成功事件
  76. if ($status == true) {
  77. Event::trigger('OrderPaySuccess', ['order' => $this->model, 'orderType' => OrderTypeEnum::ORDER]);
  78. }
  79. return $status;
  80. }
  81. /**
  82. * 更新付款状态
  83. * @param $payType
  84. * @param array $payData
  85. * @return bool
  86. */
  87. private function updatePayStatus($payType, $payData = [])
  88. {
  89. // 验证余额支付时用户余额是否满足
  90. if ($payType == OrderPayTypeEnum::BALANCE) {
  91. if ($this->user['balance'] < $this->model['pay_price']) {
  92. $this->error = '用户余额不足,无法使用余额支付';
  93. return false;
  94. }
  95. }
  96. //积分不足
  97. if ($payType == OrderPayTypeEnum::EXCHANGE) {
  98. if ($this->user['accumulate_points'] < $this->model['total_price']) {
  99. $this->error = '用户积分不足,无法兑换成功';
  100. return false;
  101. }
  102. $this->model->transaction(function () use ($payType, $payData) {
  103. // 更新订单状态
  104. $this->updateOrderInfo($payType, $payData);
  105. //扣除用户积分
  106. $rate = SettingModel::getItem('points_rate')['points_2_money'];
  107. $points = bcmul($this->model['total_price'],$rate,0);
  108. UserModel::setDecAccumulatePoints($this->user['user_id'], $points,AccumulatePointsScene::CONSUME,'兑换商品');
  109. // 记录订单支付信息
  110. $this->updatePayInfo($payType);
  111. });
  112. return true;
  113. }
  114. // 事务处理
  115. $this->model->transaction(function () use ($payType, $payData) {
  116. // 更新订单状态
  117. $this->updateOrderInfo($payType, $payData);
  118. // 累积用户总消费金额
  119. UserModel::setIncPayMoney($this->user['user_id'], (float)$this->model['pay_price']);
  120. //累积VIP用户积分
  121. UserModel::setIncGrowthValue($this->user,$this->model['rice_card_money']+$this->model['pay_price']);
  122. //累计用户积分
  123. UserModel::setIncAccumulatePoints($this->user['user_id'], $this->model['pay_price']);
  124. // 记录订单支付信息
  125. $this->updatePayInfo($payType);
  126. // 如果是普通订单,写入分销记录(积分兑换商品订单无分佣)
  127. if($this->model['order_source']!=OrderSourceEnum::BARGAIN || $this->model['or'] != OrderSourceEnum::EXCHANGE){
  128. $this->writeCommission($payType);
  129. }
  130. //写入金米粒记录
  131. $this->writeUserGoldRice();
  132. //写入米卡记录
  133. $this->writeUserRiceCard($payType, $payData);
  134. });
  135. return true;
  136. }
  137. /**
  138. * 更新订单记录
  139. * @param int $payType
  140. * @param array $payData
  141. * @return false|int
  142. * @throws \Exception
  143. */
  144. private function updateOrderInfo(int $payType, array $payData)
  145. {
  146. log_record($this->model['order_id']);
  147. log_record($payData);
  148. log_record($payType);
  149. // 更新商品库存、销量
  150. StockFactory::getFactory($this->model['order_source'])->updateStockSales($this->model);
  151. //秒杀订单还要处理正常订单的销量
  152. if($this->model['order_source']==OrderSourceEnum::MIAOSHA){
  153. StockFactory::getFactory(OrderSourceEnum::MASTER)->updateStockSales($this->model);
  154. }
  155. // 整理订单信息
  156. $order = [
  157. 'pay_type' => $payType,
  158. 'pay_status' => 20,
  159. 'pay_time' => time(),
  160. 'invoice_deadline' => time() + OrderModel::getInvoiceDeadline() * 60 // 申请开票截止时间:订单付款后的40天内可以申请开票
  161. ];
  162. if ($payType == OrderPayTypeEnum::WECHAT) {
  163. $order['transaction_id'] = $payData['transaction_id'];
  164. }
  165. // 更新订单状态
  166. return $this->model->save($order);
  167. }
  168. /**
  169. * 记录订单支付信息
  170. * @param int $payType
  171. */
  172. private function updatePayInfo(int $payType)
  173. {
  174. // 余额支付
  175. if ($payType == OrderPayTypeEnum::BALANCE) {
  176. // 更新用户余额
  177. UserModel::setDecBalance((int)$this->user['user_id'], (float)$this->model['pay_price']);
  178. // 新增余额变动记录
  179. BalanceLogModel::add(SceneEnum::CONSUME, [
  180. 'user_id' => (int)$this->user['user_id'],
  181. 'money' => -$this->model['pay_price'],
  182. ], ['order_no' => $this->model['order_no']]);
  183. }
  184. // 微信支付
  185. if ($payType == OrderPayTypeEnum::WECHAT) {
  186. }
  187. }
  188. /**
  189. * 写入分销记录
  190. * @param int $payType
  191. * @return false|int
  192. * @throws \Exception
  193. */
  194. private function writeCommission(int $payType)
  195. {
  196. // 余额支付 或 微信支付
  197. if ($payType == OrderPayTypeEnum::BALANCE || $payType == OrderPayTypeEnum::WECHAT) {
  198. //待结算佣金计算
  199. $RecordWaitCommission = new RecordWaitCommission;
  200. //分销记录放入队列
  201. $RecordWaitCommission->recordWaitCommission($this->model['order_id']);
  202. }
  203. // 米卡兑换
  204. if ($payType == OrderPayTypeEnum::MICAH_EXCHANGE) {
  205. }
  206. }
  207. /**
  208. * 写入金米粒记录
  209. * @param int $payType
  210. * @return false|int
  211. * @throws \Exception
  212. */
  213. private function writeUserGoldRice()
  214. {
  215. if($this->model['gold_rice_amount']>0){
  216. //写金米粒出账记录
  217. GoldRiceModel::add($this->model['user_id'],$this->model['order_no'],'下单抵扣',$this->model['gold_rice_amount'],0);
  218. //扣除冻结中的金米粒
  219. UserModel::setDecByField($this->user['user_id'],'gold_rice_frozen',(float)$this->model['gold_rice_amount']);
  220. }
  221. if($this->model['gold_rice_amount_input']>0){
  222. //写金米粒入账记录
  223. GoldRiceModel::add($this->model['user_id'],$this->model['order_no'],'会员购物返金米粒',$this->model['gold_rice_amount_input'],1);
  224. //用户直接添加在途金米粒
  225. UserModel::setIncByField($this->user['user_id'],'gold_rice_road',(float)$this->model['gold_rice_amount_input']);
  226. }
  227. }
  228. /**
  229. * 写入米卡记录
  230. * @param int $payType
  231. * @return false|int
  232. * @throws \Exception
  233. */
  234. private function writeUserRiceCard(int $payType,array $payData)
  235. {
  236. // 余额支付 或 微信支付
  237. // if ($payType == OrderPayTypeEnum::BALANCE || $payType == OrderPayTypeEnum::WECHAT) {
  238. //现金卡的操作
  239. if($this->model['rice_card_id']>0){
  240. //写现金卡出账记录
  241. $userRiceCard = UserRiceCardModel::find($this->model['rice_card_id']);
  242. UserRiceCardConsumeModel::add($userRiceCard,$this->model['order_no'],$this->model['pay_price'],$this->model['rice_card_money']);
  243. //如果可用余额为0并且冻结余额等于要抵扣的金额
  244. if($this->model['userRiceCard']['balance']==0 && $this->model['rice_card_money']==$this->model['userRiceCard']['frozen_amount']){
  245. //现金卡直接减冻结余额,并且状态改为已失效
  246. UserRiceCardModel::setIncDecByField($this->model['rice_card_id'],[],['frozen_amount'=>(float)$this->model['rice_card_money']],['effect_state'=>2]);
  247. }else{
  248. //现金卡直接减冻结余额
  249. UserRiceCardModel::setDecByField($this->model['rice_card_id'],'frozen_amount',(float)$this->model['rice_card_money']);
  250. }
  251. }
  252. // }
  253. // // 米卡兑换
  254. // if ($payType == OrderPayTypeEnum::MICAH_EXCHANGE) {
  255. //
  256. // }
  257. }
  258. }