CsAssetsController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. namespace addons\CloudStock\api\modules\v1\controllers;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\models\CloudStockAgent;
  5. use addons\CloudStock\common\services\EqualAwardService;
  6. use common\enums\AddonsEnum;
  7. use common\enums\UserWalletEnum;
  8. use common\models\common\CapitalLog;
  9. use common\models\common\ScoreLog;
  10. use common\models\user\User;
  11. use services\common\UserWalletService;
  12. use addons\CloudStock\common\models\CloudStockFillOrder;
  13. use addons\CloudStock\common\models\CloudStockBuyingOrder;
  14. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  15. use addons\CloudStock\common\models\CloudStockDeductionDetail;
  16. use common\models\common\PaymentTradeOrder;
  17. use common\models\order\Order;
  18. use common\models\order\OrderDetail;
  19. use common\models\goods\Goods;
  20. class CsAssetsController extends BaseController
  21. {
  22. public $modelClass = '';
  23. /**
  24. * 不用进行登录验证的方法
  25. *
  26. * 例如: ['index', 'update', 'create', 'view', 'delete']
  27. * 默认全部需要验证
  28. *
  29. * @var array
  30. */
  31. protected $authOptional = [];
  32. /**
  33. * @name:
  34. * @msg: 资金明细
  35. * @param {*}
  36. * @return {*}
  37. */
  38. public function actionDetailList()
  39. {
  40. if (!\Yii::$app->request->isGet) {
  41. return $this->error('请求方式错误');
  42. }
  43. $changes_dir = \Yii::$app->request->get('changes_dir');
  44. $changes_type = \Yii::$app->request->get('changes_type');
  45. $date = \Yii::$app->request->get('date');
  46. $page = \Yii::$app->request->get('page', 1);
  47. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  48. $assets_type_map = CloudStockEnum::getAssetsTypeMap();
  49. $changes_types = array_keys($assets_type_map);
  50. $changes_types[] = 0;
  51. if (empty($changes_dir) || !in_array($changes_type, $changes_types)) return $this->error('参数错误');
  52. $wheres[] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'from_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK];
  53. if (CloudStockEnum::STOCK_CHANGE_ADD == $changes_dir) {
  54. $type = 'add';
  55. } elseif (CloudStockEnum::STOCK_CHANGE_SUB == $changes_dir) {
  56. $type = 'sub';
  57. }
  58. $wheres[] = ['change_type' => $type];
  59. if (!empty($changes_type)) {
  60. $wheres[] = ['capital_type' => $changes_type];
  61. }
  62. if (!empty($date)) {
  63. $start_time = strtotime($date . '-01 00:00:00');
  64. $end_time = strtotime($date . '-' . date('t', $start_time) . ' 23:59:59');
  65. $wheres[] = ['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]];
  66. }
  67. $params = [
  68. 'select' => 'id,mall_id,user_id,change_type,change_num,current_num,desc,from_type,capital_type,created_at,source_table,source_table_id,order_no,contributor_id',
  69. 'where' => $wheres,
  70. 'order' => 'created_at desc',
  71. 'page' => $page,
  72. 'limit' => $limit
  73. ];
  74. CapitalLog::$capitalType = 'commission';
  75. $detail_list = CapitalLog::listPage($params);
  76. // dd($detail_list);
  77. if (false === $detail_list['list']) {
  78. return $this->error('获取明细失败: ' . CapitalLog::getStaticError());
  79. }
  80. $user = User::find()
  81. ->select('id,nickname,avatar_url,mobile')
  82. ->where(['mall_id' => $this->mall_id, 'id' => $this->user_id])
  83. ->one();
  84. foreach ($detail_list['list'] as &$list) {
  85. $list['nickname'] = ($user['nickname'] ?? $user['mobile']) ?? '';
  86. $list['mobile'] = $user['mobile'] ?? '';
  87. $list['avatar_url'] = $user['avatar_url'] ?? \Yii::$app->request->hostInfo . '/resources/img/common/default-avatar.png';
  88. $list['from_user_id'] = '';
  89. $list['from_user_nickname'] = '';
  90. $list['goods_name'] = '';
  91. $list['goods_num'] = '';
  92. $order = null;
  93. $order_type = 0;
  94. $from_order = null;
  95. $user_id_arr = array_column($detail_list['list'], 'user_id');
  96. $contributor_id_arr = array_column($detail_list['list'], 'contributor_id');
  97. $user_arr = User::lists([
  98. 'where' => [
  99. ['id' => array_merge($contributor_id_arr, $user_id_arr)]
  100. ],
  101. 'index' => 'id',
  102. ]);
  103. if($list['source_table'] == Order::tableName()){
  104. $order = Order::findOne(['id'=>$list['source_table_id']]);
  105. $from_order = CloudStockBuyingOrder::findOne(['order_id'=>$list['source_table_id']]);
  106. // 因为直推和间推都是走主商城订单, 所以需要判断下
  107. $mallCapitalType = ['first_equal', 'first_over', 'second_equal', 'second_over'];
  108. if (in_array($list['capital_type'], $mallCapitalType)) {
  109. $from_order = OrderDetail::findOne(['order_id' => $list['source_table_id']]);
  110. }
  111. $order_type = CloudStockEnum::STOCK_ORDER_TYPE_USER;
  112. }elseif($list['source_table'] == OrderDetail::tableName()){
  113. $order_detail = OrderDetail::findOne(['id'=>$list['source_table_id']]);
  114. if($order_detail){
  115. $order = Order::findOne(['id'=>$order_detail['order_id']]);
  116. }
  117. $from_order = CloudStockBuyingOrder::findOne(['order_detail_id'=>$list['source_table_id']]);
  118. $order_type = CloudStockEnum::STOCK_ORDER_TYPE_USER;
  119. }elseif($list['source_table'] == CloudStockFillOrder::tableName()){
  120. $order = CloudStockFillOrder::findOne(['id'=>$list['source_table_id']]);
  121. $from_order = $order;
  122. $order_type = CloudStockEnum::STOCK_ORDER_TYPE_REPLENISH;
  123. }
  124. if (empty($list['order_no']) && !empty($order)) {
  125. $list['order_no'] = $order['order_no'];
  126. $user = User::find()->where(['id'=>$order['user_id']])->select('id,nickname')->asArray()->one();
  127. }
  128. if(in_array($list['source_table'], [Order::tableName(), OrderDetail::tableName(), CloudStockFillOrder::tableName()])) {
  129. $modelClass = [
  130. CloudStockFillOrder::tableName() => CloudStockFillOrder::class,
  131. Order::tableName() => Order::class,
  132. OrderDetail::tableName() => OrderDetail::class,
  133. ][$list['source_table']];
  134. if (!empty($modelClass) && !empty($list['source_table_id'])) {
  135. $user_id = $modelClass::find()->where(['id' => $list['source_table_id']])->select('user_id')->scalar();
  136. $userInfo = User::find()->where(['id' => $user_id])->select('id, nickname')->asArray()->one();
  137. if ($userInfo) {
  138. $list['from_user_id'] = $userInfo['id'];
  139. $list['from_user_nickname'] = $userInfo['nickname'];
  140. }
  141. }
  142. } else {
  143. if (!empty($order)) {
  144. $list['from_user'] = User::find()->where(['id' => $order['user_id']])->select('id,nickname,mobile,avatar_url')->asArray()->one();
  145. }
  146. }
  147. if(!empty($from_order)){
  148. $goods = Goods::findOne(['id'=>$from_order['goods_id']]);
  149. $list['goods_name'] = $goods['goods_name'];
  150. $list['goods_num'] = $from_order['num'];
  151. $deduction = CloudStockGoodsStockLog::find()
  152. ->alias('stock')
  153. ->leftJoin(['d' => CloudStockDeductionDetail::tableName()], ' d.stock_log_id = stock.id')
  154. ->where(['stock.order_id'=>$from_order['id'],'stock.order_type'=>$order_type,'d.user_id'=>$list['user_id'],'d.changes_type'=>CloudStockEnum::CHANGE_TYPE_DEDUTION_FILL])
  155. ->select('d.num')
  156. ->one();
  157. if($deduction){
  158. $list['goods_num'] = $deduction['num'];
  159. }
  160. }
  161. unset($list['source_table'],$list['source_table_id']);
  162. }
  163. if (!empty($assets_type_map)) {
  164. $assets_types[] = [
  165. 'name' => '全部',
  166. 'value' => '',
  167. 'type' => 1,
  168. 'is' => true,
  169. ];
  170. foreach ($assets_type_map as $key => $val) {
  171. $type = [
  172. 'name' => $val,
  173. 'value' => $key,
  174. 'type' => 1,
  175. 'is' => true,
  176. ];
  177. if (UserWalletEnum::RECHARGE_COMMISSION == $key) {
  178. $type['type'] = 2;
  179. }
  180. $assets_types[] = $type;
  181. }
  182. } else {
  183. $assets_types = [];
  184. }
  185. $detail_list['assets_type_map'] = $assets_types;
  186. return $this->success('success', $detail_list);
  187. }
  188. public function actionToBalance()
  189. {
  190. return $this->error('请求方式错误');
  191. if (!\Yii::$app->request->isPost) {
  192. return $this->error('请求方式错误');
  193. }
  194. $money = \Yii::$app->request->post('money');
  195. if (empty($money)) return $this->error('参数错误');
  196. if ($money > $this->stock_agent->price) return $this->error('收益余额不足');
  197. $wallet_datas = [
  198. // 入余额记录
  199. [
  200. 'mall_id' => $this->mall_id,
  201. 'user_id' => $this->user_id,
  202. 'is_frozen' => false,
  203. 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  204. 'money' => $money,
  205. 'desc' => '云库存收益转入余额,余额增加',
  206. 'source_table' => $this->stock_agent->tableSchema->name,
  207. 'source_table_id' => $this->stock_agent->id,
  208. 'from_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK,
  209. 'capital_type' => UserWalletEnum::RECHARGE_COMMISSION,
  210. ],
  211. // 出收益的记录
  212. [
  213. 'mall_id' => $this->mall_id,
  214. 'user_id' => $this->user_id,
  215. 'is_frozen' => false,
  216. 'wallet_type' => UserWalletService::WALLET_TYPE_COMMISSION,
  217. 'money' => -$money,
  218. 'desc' => '云库存收益转入余额,收益减少',
  219. 'source_table' => $this->stock_agent->tableSchema->name,
  220. 'source_table_id' => $this->stock_agent->id,
  221. 'from_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK,
  222. 'capital_type' => UserWalletEnum::RECHARGE_COMMISSION,
  223. ],
  224. ];
  225. $price = bcsub($this->stock_agent->price, $money, 2);
  226. $params = [
  227. 'id' => $this->stock_agent->id,
  228. 'mall_id' => $this->mall_id,
  229. 'price' => $price,
  230. 'before_level' => $this->stock_agent->before_level,
  231. 'level' => $this->stock_agent->level,
  232. ];
  233. $res_agent = CloudStockAgent::setData($params);
  234. if (false === $res_agent) return $this->error(CloudStockAgent::getStaticError());
  235. $res_queue = UserWalletService::batchHandleByQueue($wallet_datas);
  236. if ($res_queue === false) {
  237. return $this->error('云库存收益转入余额出错:' . UserWalletService::getStaticError());
  238. }
  239. return $this->success('操作成功');
  240. }
  241. /**
  242. * @name:
  243. * @msg: 积分明细
  244. * @param {*}
  245. * @return {*}
  246. */
  247. public function actionScoreList()
  248. {
  249. if (!\Yii::$app->request->isGet) {
  250. return $this->error('请求方式错误');
  251. }
  252. $date = \Yii::$app->request->get('date');
  253. $page = \Yii::$app->request->get('page', 1);
  254. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  255. $wheres[] = ['a.mall_id' => $this->mall_id, 'a.user_id' => $this->user_id];
  256. if (!empty($date)) {
  257. $start_time = strtotime($date . '-01 00:00:00');
  258. $end_time = strtotime($date . '-' . date('t', $start_time) . ' 23:59:59');
  259. $wheres[] = ['and', ['>=', 'a.created_at', $start_time], ['<=', 'a.created_at', $end_time]];
  260. }
  261. $wheres[] = ['td.pay_type' => 12,'a.is_pay'=>1];
  262. $params = [
  263. 'select' => '*',
  264. 'where' => $wheres,
  265. 'order' => 'a.created_at desc',
  266. 'page' => $page,
  267. 'limit' => $limit
  268. ];
  269. $params['alias'] = 'a';
  270. $params['with'] = ['goods'];
  271. $params['join'] = [['LEFT JOIN', PaymentTradeOrder::tableName() . ' td', "td.trade_id = a.trade_id"]];
  272. $params['joinWith'] =['score'];
  273. $detail_list=CloudStockFillOrder::listPage($params);
  274. return $this->success('success', $detail_list);
  275. }
  276. public function actionEqualAwardList()
  277. {
  278. $params = \Yii::$app->request->get();
  279. $params['mall_id'] = $this->mall_id;
  280. $params['user_id'] = $this->user_id;
  281. $list = (new EqualAwardService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]))->equalAwardList($params);
  282. return $this->success('操作成功', $list);
  283. }
  284. }