FundService.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. namespace addons\QiDingDong\common\service;
  3. use addons\QiDingDong\common\enums\QiDingDongEnums;
  4. use addons\QiDingDong\common\models\QiDingDongBalance;
  5. use addons\QiDingDong\common\models\QiDingDongBalanceLog;
  6. use addons\QiDingDong\common\models\QiDingDongGoods;
  7. use common\enums\AddonsEnum;
  8. use common\enums\RabbitMqEnum;
  9. use common\enums\StatusEnum;
  10. use common\helpers\FormatHelper;
  11. use common\models\mall\Mall;
  12. use common\models\order\Order;
  13. class FundService
  14. {
  15. public function page(int $mall_id, array $params)
  16. {
  17. $where = [
  18. ['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]
  19. ];
  20. if (SettingService::isMasterMall($mall_id)) {
  21. if (!empty($params['keyword'])) {
  22. $ids = Mall::find()->where(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  23. ->andWhere(['or', ['like', 'id', $params['keyword']], ['like', 'id', $params['keyword']]])->select('id')->column();
  24. if (empty($ids)) return [];
  25. $where[] = ['mall_id' => $ids];
  26. }
  27. } else {
  28. $where[] = ['mall_id' => $mall_id];
  29. }
  30. if (!empty($params['date_start'])) $where[] = ['>=', 'created_at', strtotime($params['date_start'])];
  31. if (!empty($params['date_end'])) $where[] = ['<=', 'created_at', strtotime($params['date_end'])];
  32. $ret = QiDingDongBalanceLog::listPage([
  33. 'where' => $where,
  34. 'order' => 'id desc',
  35. 'limit' => $params['limit'] ?? 10,
  36. 'with' => ['mall']
  37. ]);
  38. if (!empty(QiDingDongBalanceLog::getStaticError())) return QiDingDongBalanceLog::getStaticError();
  39. if (!empty($ret['list'])) {
  40. foreach ($ret['list'] as &$item) {
  41. $item['type_txt'] = QiDingDongEnums::BALANCE_LOG_TYPE_MAP[$item['type']] ?? '未知类型';
  42. $item['mall']['logo'] = MallService::getLogo($item['mall_id']);
  43. }
  44. }
  45. return $ret;
  46. }
  47. /**
  48. * 异动
  49. * @param array $params mall_id, amount, remark, type, direction, order_no, addons
  50. * @return string|QiDingDongBalanceLog
  51. */
  52. public function create(array $params)
  53. {
  54. $t = \Yii::$app->db->beginTransaction();
  55. try {
  56. $params['status'] = SettingService::isMasterMall($params['mall_id']) ? StatusEnum::DELETE : StatusEnum::ENABLED;
  57. $params['amount'] = intval(bcmul($params['amount'], 100));
  58. if ($params['status'] == StatusEnum::ENABLED) { // 非主商城的则需要判断有没有钱
  59. $account = QiDingDongBalance::findOne(['mall_id' => $params['mall_id']]);
  60. if (empty($account)) {
  61. $account = new QiDingDongBalance();
  62. $account->mall_id = $params['mall_id'];
  63. }
  64. $balance = $account->balance;
  65. if ($params['direction'] == StatusEnum::ENABLED) { // +
  66. $account->balance = bcadd($account->balance, $params['amount']);
  67. } else { // -
  68. $account->balance = bcsub($account->balance, $params['amount']);
  69. }
  70. if ($account->balance < 0) throw new \Exception("余额不足,账户金额为: " .
  71. bcmul(empty($balance) ? 0 : $balance, 0.01, 2));
  72. if (!$account->save()) throw new \Exception($account->getErrorMessage());
  73. $params['before_amount'] = $balance;
  74. $params['after_amount'] = $account->balance;
  75. }
  76. $model = new QiDingDongBalanceLog();
  77. $model->loadDefaultValues();
  78. if (!$model->load($params, '') || !$model->save()) throw new \Exception($model->getErrorMessage());
  79. $t->commit();
  80. } catch (\Exception $exception) {
  81. $t->rollBack();
  82. return $exception->getMessage();
  83. }
  84. return $model;
  85. }
  86. /**
  87. * 充值
  88. * @param array $params
  89. * @param $admin
  90. * @return string|QiDingDongBalanceLog
  91. */
  92. public function recharge(array $params, $admin)
  93. {
  94. $data = [
  95. 'mall_id' => $params['mall_id'],
  96. 'amount' => abs($params['amount']),
  97. 'remark' => "ID为[{$admin['id']}]的雇员,为商城[{$params['mall_id']}]操作金额为[{$params['amount']}],其备注信息为[{$params['remark']}]",
  98. 'type' => $params['amount'] > 0 ? QiDingDongEnums::BALANCE_LOG_TYPE_RECHARGE : QiDingDongEnums::BALANCE_LOG_TYPE_DEDUCT,
  99. 'direction' => $params['amount'] > 0 ? 1 : 2,
  100. 'order_no' => Order::generateOrderNo('RC'),
  101. 'addons' => AddonsEnum::ADDONS_NAME_QI_DING_DONG
  102. ];
  103. return $this->create($data);
  104. }
  105. /**
  106. * @param array $params
  107. * @return mixed|string|true|null
  108. */
  109. public function setRate(array $params)
  110. {
  111. $account = QiDingDongBalance::findOne(['mall_id' => $params['mall_id']]);
  112. if (empty($account)) {
  113. $account = new QiDingDongBalance();
  114. $account->mall_id = $params['mall_id'];
  115. }
  116. $account->{$params['field']} = bcmul($params['val'], 100);
  117. if (!$account->save()) return $account->getErrorMessage();
  118. // 更新商品价格 1 * 1.2 * 1.5
  119. try {
  120. (new GoodsService())->changePrice($params['mall_id']);
  121. } catch (\Exception $e) {
  122. return $e->getMessage();
  123. }
  124. return true;
  125. }
  126. public function statistics(array $params)
  127. {
  128. $rQuery = QiDingDongBalanceLog::find()->where(['direction' => 1]);
  129. $dQuery = QiDingDongBalanceLog::find()->where(['direction' => 2]);
  130. if (!empty($params['mall_id'])) {
  131. $rQuery->andWhere(['mall_id' => $params['mall_id']]);
  132. $dQuery->andWhere(['mall_id' => $params['mall_id']]);
  133. }
  134. $r = $rQuery->sum('amount');
  135. $d = $dQuery->sum('amount');
  136. return [
  137. 'recharge' => !empty($r) ? $r : 0,
  138. 'deduct' => !empty($d) ? $d : 0,
  139. ];
  140. }
  141. public static function asyncRefund(int $id)
  142. {
  143. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, ['id' => $id],
  144. self::class, 'refund');
  145. }
  146. public function refund($params)
  147. {
  148. if (empty($params) || empty($params['id'])) return true;
  149. $id = $params['id'];
  150. $t = \Yii::$app->db->beginTransaction();
  151. try {
  152. $fund = QiDingDongBalanceLog::findOne($id);
  153. if (empty($fund)) return true;
  154. $fund->status = StatusEnum::DELETE;
  155. if (!$fund->save()) throw new \Exception($fund->getErrorMessage());
  156. $mall = QiDingDongBalance::findOne(['mall_id' => $fund->mall_id]);
  157. $mall->balance += $fund->amount;
  158. if (!$mall->save()) throw new \Exception($mall->getErrorMessage());
  159. $t->commit();
  160. } catch (\Exception $e) {
  161. $t->rollBack();
  162. \Yii::error(FormatHelper::exception($e, __METHOD__));
  163. return false;
  164. }
  165. return true;
  166. }
  167. }