UserFreezeCommission.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. namespace common\models\user;
  3. use common\enums\StatusEnum;
  4. use common\enums\UserWalletEnum;
  5. use common\models\common\CapitalLog;
  6. use services\common\UserWalletService;
  7. use Yii;
  8. /**
  9. * This is the model class for table "{{%user_freeze_commission}}".
  10. *
  11. * @property int $id ID
  12. * @property int $mall_id 商城ID
  13. * @property int $user_id 用户ID
  14. * @property float $freeze_scale 冻结比例
  15. * @property float $freeze_cap 冻结上限
  16. * @property float $freeze_amount 冻结佣金
  17. * @property int $status 状态[-1删除; 0禁用; 1正常]
  18. * @property int $created_at 创建时间
  19. * @property int $updated_at 更新时间
  20. */
  21. class UserFreezeCommission extends \common\models\base\BaseActiveRecord
  22. {
  23. /**
  24. * {@inheritdoc}
  25. */
  26. public static function tableName()
  27. {
  28. return '{{%user_freeze_commission}}';
  29. }
  30. /**
  31. * {@inheritdoc}
  32. */
  33. public function rules()
  34. {
  35. return [
  36. [['mall_id', 'user_id', 'status', 'created_at', 'updated_at'], 'integer'],
  37. [['freeze_scale', 'freeze_cap', 'freeze_amount'], 'number'],
  38. ];
  39. }
  40. /**
  41. * {@inheritdoc}
  42. */
  43. public function attributeLabels()
  44. {
  45. return [
  46. 'id' => 'ID',
  47. 'mall_id' => '商城ID',
  48. 'user_id' => '用户ID',
  49. 'freeze_scale' => '冻结比例',
  50. 'freeze_cap' => '冻结上限',
  51. 'freeze_amount' => '冻结佣金',
  52. 'status' => '状态[-1删除; 0禁用; 1正常]',
  53. 'created_at' => '创建时间',
  54. 'updated_at' => '更新时间',
  55. ];
  56. }
  57. /**
  58. * @Description: 存储数据
  59. * @Author: zsan
  60. * @DateTime 2024-03-08 18:55:26
  61. * @param array $data
  62. * @return self|bool
  63. */
  64. public static function setData(array $data)
  65. {
  66. try {
  67. $model = self::findOne(['user_id' => $data['user_id'], 'mall_id' => $data['mall_id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  68. if (empty($model)) {
  69. $model = new self();
  70. $model->loadDefaultValues();
  71. }
  72. if (!$model->load($data, '') || !$model->save()) {
  73. throw new \Exception($model->getErrorMessage());
  74. }
  75. return $model;
  76. } catch (\Exception $e) {
  77. self::setStaticError($e->getMessage());
  78. return false;
  79. }
  80. }
  81. public static function getSwitchStatus($mall_id)
  82. {
  83. return (int)Yii::$app->services->setting->mall->get($mall_id, 'user.is_freeze_commission');
  84. }
  85. /**
  86. * @Description: 记录新增的冻结佣金
  87. * @Author: zsan
  88. * @DateTime 2024-03-09 11:49:26
  89. * @param integer $user_id
  90. * @param array $data
  91. * @return boolean
  92. */
  93. public static function setLogData($user_id, $data)
  94. {
  95. try {
  96. $freeze_setting = self::findOne(['user_id' => $user_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  97. if (empty($freeze_setting) || empty($freeze_setting['freeze_scale'])) return true;
  98. $switch_status = self::getSwitchStatus($freeze_setting->mall_id);
  99. if (empty($switch_status)) return true;
  100. $logs = [];
  101. $wallet_type = UserWalletService::WALLET_TYPE_COMMISSION;
  102. $user_wallet = null;
  103. $isset_over = false;
  104. $over_amount = 0;
  105. $freeze_scale = $freeze_setting->freeze_scale;
  106. // echo __METHOD__.' data:'.json_encode($data);
  107. foreach ($data as $value) {
  108. if ($value['wallet_type'] != $wallet_type || $value['is_frozen'] == true) continue;
  109. $value['change_type'] = $value['money'] > 0 ? CapitalLog::CHANGE_TYPE_ADD : CapitalLog::CHANGE_TYPE_SUB;
  110. $amount = abs($value['money']);
  111. $freeze_amount = bcmul($value['money'], bcdiv($freeze_setting['freeze_scale'], 100, 6), 2);
  112. if ($value['change_type'] == CapitalLog::CHANGE_TYPE_ADD) {
  113. //提现驳回,不冻结
  114. if($value['capital_type'] == UserWalletEnum::WITHDRAWAL_REFUND) continue;
  115. $arrive_freeze_amount = $amount - $freeze_amount;
  116. $tmp_freeze_amount = $freeze_setting->freeze_amount + $freeze_amount;
  117. $extra_desc = "";
  118. if ($freeze_setting->freeze_cap > 0 && $tmp_freeze_amount > $freeze_setting->freeze_cap) {
  119. $over_freeze_amount = $tmp_freeze_amount - $freeze_setting->freeze_cap;
  120. $freeze_amount -= $over_freeze_amount;
  121. $arrive_freeze_amount += $over_freeze_amount;
  122. $extra_desc = "; 达到冻结上限: {$freeze_setting->freeze_cap}";
  123. }
  124. $desc = "应到账可提现金额: {$amount}, 实际到账可提现金额: {$arrive_freeze_amount}, 增加冻结可提现金额: {$freeze_amount} {$extra_desc}";
  125. } else if ($value['change_type'] == CapitalLog::CHANGE_TYPE_SUB) {
  126. if(!in_array($value['capital_type'], [UserWalletEnum::RECHARGE_PLATFORM, UserWalletEnum::BACKEND_DEDUCT])) continue;
  127. empty($user_wallet) && $user_wallet = UserWallet::findOne(['user_id' => $user_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  128. if ($freeze_setting->freeze_amount > ($user_wallet[$wallet_type] ?? 0)) {
  129. if (empty($isset_over)) {
  130. $isset_over = true;
  131. $over_amount = bcsub($freeze_setting->freeze_amount, $user_wallet[$wallet_type], 2);
  132. }
  133. if ($over_amount <= 0) continue;
  134. $freeze_amount = $amount;
  135. if ($over_amount >= $freeze_amount) {
  136. $over_amount -= $freeze_amount;
  137. } else {
  138. $freeze_amount = $over_amount;
  139. $over_amount = 0;
  140. }
  141. $desc = "后台操作人员执行扣除, 扣除冻结可提现金额: {$freeze_amount}, 冻结比例: 100%";
  142. $freeze_scale = 100;
  143. }
  144. }
  145. $logs[] = [
  146. 'mall_id' => $value['mall_id'],
  147. 'user_id' => $value['user_id'],
  148. 'change_type' => $value['change_type'],
  149. 'freeze_scale' => $freeze_scale,
  150. 'amount' => $amount,
  151. 'freeze_amount' => $freeze_amount,
  152. 'desc' => $desc ?? '',
  153. 'status' => StatusEnum::ENABLED,
  154. 'created_at' => time(),
  155. 'updated_at' => time(),
  156. ];
  157. if ($value['change_type'] == CapitalLog::CHANGE_TYPE_SUB) {
  158. $freeze_setting->freeze_amount -= $freeze_amount;
  159. } else if ($value['change_type'] == CapitalLog::CHANGE_TYPE_ADD) {
  160. $freeze_setting->freeze_amount += $freeze_amount;
  161. }
  162. }
  163. if (empty($logs)) return true;
  164. // echo __METHOD__.' logs:'.json_encode($logs);
  165. if (!$freeze_setting->save()) throw new \Exception($freeze_setting->getErrorMessage());
  166. \Yii::$app->db->createCommand()->batchInsert(UserFreezeCommissionLog::tableName(), array_keys($logs[0]), $logs)->execute();
  167. return true;
  168. } catch (\Exception $e) {
  169. self::setStaticError($e->getMessage());
  170. return false;
  171. }
  172. }
  173. /**
  174. * @Description: 清理单个用户或者整个商城用户的冻结佣金
  175. * @Author: zsan
  176. * @DateTime 2024-03-09 11:47:55
  177. * @param integer $mall_id
  178. * @param integer $user_id
  179. * @return boolean
  180. */
  181. public static function clearUserData($mall_id, $user_id = 0)
  182. {
  183. try {
  184. $users_freeze = [];
  185. if (!empty($user_id)) {
  186. $freeze_setting = self::findOne(['user_id' => $user_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  187. !empty($freeze_setting) && $users_freeze[] = $freeze_setting;
  188. } else {
  189. $users_freeze = self::findAll(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  190. }
  191. if (empty($users_freeze)) return true;
  192. $admin = Yii::$app->getUser()->identity;
  193. $logs = [];
  194. /** @var self $user_freeze */
  195. foreach ($users_freeze as $user_freeze) {
  196. if ($user_freeze->freeze_amount <= 0) continue;
  197. $amount = $user_freeze->freeze_amount;
  198. $desc = "后台操作人员:{$admin->username},清空冻结佣金:{$amount}";
  199. $logs[] = [
  200. 'mall_id' => $user_freeze->mall_id,
  201. 'user_id' => $user_freeze->user_id,
  202. 'amount' => $amount,
  203. 'freeze_amount' => $amount,
  204. 'freeze_scale' => $user_freeze->freeze_scale,
  205. 'change_type' => CapitalLog::CHANGE_TYPE_SUB,
  206. 'status' => StatusEnum::ENABLED,
  207. 'desc' => $desc,
  208. 'created_at' => time(),
  209. 'updated_at' => time(),
  210. ];
  211. $user_freeze->freeze_amount = 0;
  212. }
  213. if (empty($logs)) return true;
  214. $trans = \Yii::$app->db->beginTransaction();
  215. try {
  216. /** @var self $user_freeze */
  217. foreach ($users_freeze as $user_freeze) {
  218. if (!$user_freeze->save()) throw new \Exception($user_freeze->getErrorMessage());
  219. }
  220. \Yii::$app->db->createCommand()->batchInsert(UserFreezeCommissionLog::tableName(), array_keys($logs[0]), $logs)->execute();
  221. $trans->commit();
  222. } catch (\Exception $ex) {
  223. $trans->rollback();
  224. throw $ex;
  225. }
  226. return true;
  227. } catch (\Exception $e) {
  228. self::setStaticError($e->getMessage());
  229. return false;
  230. }
  231. }
  232. public static function handlePromotionCenter($mall_id, $user_id)
  233. {
  234. $is_freeze_commission = self::getSwitchStatus($mall_id);
  235. $freeze_amount = (float)self::find()->where(['and', ['user_id' => $user_id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]])
  236. ->select('freeze_amount')
  237. ->asArray()
  238. ->scalar();
  239. return compact('is_freeze_commission', 'freeze_amount');
  240. }
  241. }