StoreOrderCredit.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. namespace addons\Store\common\models;
  3. use common\enums\StatusEnum;
  4. use common\enums\UserWalletEnum;
  5. use common\helpers\StringHelper;
  6. use common\models\base\BaseActiveRecord;
  7. use common\models\order\Order;
  8. use common\models\order\OrderRefund;
  9. use services\common\UserWalletService;
  10. use Yii;
  11. /**
  12. * This is the model class for table "qimall_addons_store_order_credit".
  13. *
  14. * @property int $id
  15. * @property int $mall_id
  16. * @property int $store_id 门店id
  17. * @property int $user_id 会员id
  18. * @property string $order_id 门店订单id
  19. * @property int $is_repayment 是否还款:0:否;1:是
  20. * @property int $type 类型[1:门店商品订单;2:收银台订单]
  21. * @property float $down_payments 首付金额
  22. * @property float $credit_money 赊账金额
  23. * @property int $status 状态[0禁用 1启用 -1删除]
  24. * @property int $created_at 创建时间
  25. * @property int $updated_at 修改时间
  26. * @property string $order_no 还款生成的支付订单编号
  27. * @property string $extra 额外信息
  28. */
  29. class StoreOrderCredit extends BaseActiveRecord
  30. {
  31. /**
  32. * {@inheritdoc}
  33. */
  34. public static function tableName()
  35. {
  36. return '{{%addons_store_order_credit}}';
  37. }
  38. /**
  39. * {@inheritdoc}
  40. */
  41. public function rules()
  42. {
  43. return [
  44. [['mall_id', 'store_id', 'user_id', 'is_repayment', 'status', 'created_at', 'updated_at', 'order_id', 'type'], 'integer'],
  45. [['down_payments', 'credit_money'], 'number'],
  46. [['order_no'], 'string'],
  47. [['extra'], 'string'],
  48. ];
  49. }
  50. /**
  51. * {@inheritdoc}
  52. */
  53. public function attributeLabels()
  54. {
  55. return [
  56. 'id' => 'ID',
  57. 'mall_id' => 'Mall ID',
  58. 'store_id' => 'Store ID',
  59. 'user_id' => 'User ID',
  60. 'order_id' => 'Order ID',
  61. 'type' => 'Type',
  62. 'is_repayment' => 'Is Repayment',
  63. 'down_payments' => 'Down Payments',
  64. 'credit_money' => 'Credit Money',
  65. 'status' => 'Status',
  66. 'created_at' => 'Created At',
  67. 'updated_at' => 'Updated At',
  68. ];
  69. }
  70. public static function setData($params)
  71. {
  72. try {
  73. $model = new self();
  74. $model->loadDefaultValues();
  75. if (!$model->load($params, '') || !$model->save()) throw new \PHPUnit\Util\Exception($model->getErrorMessage());
  76. return $model;
  77. } catch (\Exception $e) {
  78. self::$static_error = $e->getMessage();
  79. return false;
  80. }
  81. }
  82. /**
  83. * @desc:
  84. * @Author: hua
  85. * @Date: 2022/7/28
  86. * @Time: 18:49
  87. * @Copyright: copyright (c) 2021 广东七件事集团
  88. * @param $order_id
  89. * @param string $type 1:门店商品订单;2:收银台订单
  90. * @return bool
  91. * @throws \Exception
  92. */
  93. public static function repayment($order_id, $type = '1')
  94. {
  95. $order_credit_model = self::findOne(['order_id' => $order_id, 'type' => $type]);
  96. if(empty($order_credit_model)) return true;
  97. if (!empty($order_credit_model['is_repayment'])) throw new \Exception('该订单已还款');
  98. $credit_money = $order_credit_model['credit_money'];//还款金额
  99. $insert_wallet [] = [
  100. 'mall_id' => $order_credit_model['mall_id'],
  101. 'user_id' => $order_credit_model['user_id'],
  102. 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  103. 'money' => -$credit_money,
  104. 'desc' => '赊账订单还款',
  105. 'source_table' => self::tableName(),
  106. 'source_table_id' => $order_id,
  107. 'from_type' => UserWalletEnum::FROM_STORE,
  108. 'capital_type' => UserWalletEnum::REPAYMENT,
  109. ];
  110. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  111. if ($res == false) throw new \Exception(UserWalletService::getStaticError());
  112. $order_credit_model->is_repayment = 1;
  113. $res = $order_credit_model->save();
  114. if ($res == false) throw new \Exception('还款失败');
  115. return true;
  116. }
  117. public static function repaymentByPay($order_id, $type = '1')
  118. {
  119. try {
  120. $order_credit_model = self::findOne(['order_id' => $order_id, 'type' => $type]);
  121. $order_no = StringHelper::generateOrderNo('re');
  122. $order_credit_model->order_no = $order_no;
  123. $order_credit_model->save();
  124. $store_order = StoreOrder::findOne(['id'=>$order_id]);
  125. $main_order = Order::findOne(['order_no'=>$store_order['order_no']]);
  126. $refund_list = OrderRefund::lists([
  127. 'where'=>[
  128. ['order_id'=>$main_order['id']],
  129. ['type'=>[1,2]],
  130. ['refund_status'=>1]
  131. ],
  132. ]);
  133. $goods_ids = [];
  134. $order_detail_ids = [];
  135. if(!empty($refund_list)){
  136. foreach ($refund_list as $item){
  137. $order_detail_ids[]=$item['order_detail_id'];
  138. }
  139. if(!empty($order_detail_ids)){
  140. $store_order_detail_list = StoreOrderDetail::lists([
  141. 'where'=>[
  142. ['main_order_detail_id'=>$order_detail_ids],
  143. ],
  144. ]);
  145. $goods_ids = array_column($store_order_detail_list,'goods_id');
  146. }
  147. }
  148. $extra = json_decode($order_credit_model['extra'],true);
  149. $no_credit_money = 0;
  150. if(!empty($extra)){
  151. foreach ($extra as $goods_id=>$val){
  152. if(in_array($goods_id,$goods_ids)){
  153. $no_credit_money += $val['credit_money'];
  154. }
  155. }
  156. }
  157. $order_trade_info[] = [
  158. 'order_no' => $order_no,
  159. 'amount' => bcsub($order_credit_model['credit_money'],$no_credit_money,2),
  160. 'title' => '还款',
  161. 'notify_class' => 'addons\Store\common\logic\notify\CreditNotify',
  162. 'order_type' => 'credit_order',
  163. ];
  164. $res = \Yii::$app->services->pay->createTrade($order_credit_model['mall_id'], $order_credit_model['user_id'], $order_trade_info);
  165. if ($res == false) throw new \Exception('生成支付流水失败');
  166. $res['order_ids'] = '';
  167. $arr['transaction'] = $res;
  168. $arr['pay_success_page'] = Yii::$app->services->setting->mall->get($order_credit_model['mall_id'], 'order.pay_after_link'); // 支付成功后跳转的地址
  169. $payment_expire_time = Yii::$app->services->setting->mall->get($order_credit_model['mall_id'], 'order.payment_expire_time');
  170. $arr['surplus_second'] = 30 * 60; //剩余秒数
  171. if ($payment_expire_time) {
  172. $arr['surplus_second'] = intval($payment_expire_time) * 60; //剩余秒数
  173. }
  174. return $arr;
  175. } catch (\Exception $e) {
  176. self::$static_error = $e->getMessage();
  177. return false;
  178. }
  179. }
  180. }