FinanceController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. <?php
  2. namespace addons\LuckyGroup\backend\controllers;
  3. use addons\LuckyGroup\common\models\LuckyGroupFrozenLog;
  4. use addons\LuckyGroup\common\models\LuckyGroupLevel;
  5. use addons\LuckyGroup\common\models\LuckyGroupOrder;
  6. use addons\LuckyGroup\common\models\LuckyGroupUser;
  7. use common\enums\AddonsEnum;
  8. use common\enums\UserWalletEnum;
  9. use common\models\common\CapitalLog;
  10. use common\models\common\CommissionLog;
  11. use common\models\user\User;
  12. use common\models\common\CapitalStatistics;
  13. use common\helpers\csv\CsvExportHelper;
  14. use common\enums\DownloadEnum;
  15. class FinanceController extends BaseController
  16. {
  17. /**
  18. * 积分明细
  19. * @author hpei
  20. */
  21. public function actionScoreLog()
  22. {
  23. if (\Yii::$app->request->isAjax) {
  24. if (\Yii::$app->request->isPost) {
  25. $filename = '积分列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  26. $data = \Yii::$app->request->post();
  27. $data['table'] = 'score';
  28. $data['mall_id'] = $this->mall_id;
  29. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id, $filename, DownloadEnum::TYPE_ASSETS, CapitalLog::class, 'exportAssets', $data);
  30. if ($res === false) return $this->error('加入导出任务失败' . CsvExportHelper::getStaticError());
  31. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  32. }
  33. $get = \Yii::$app->request->get();
  34. $params['alias'] = 'b';
  35. $params['joinWith'] = ['user' => function ($query) {
  36. $query->select(['id', 'avatar_url', 'nickname', 'mobile']);
  37. }];
  38. if (isset($get['keyword']) && !empty($get['keyword'])) $params['where'] = [['or', ['like', 'nickname', $get['keyword']], ['=', 'mobile', $get['keyword']]]];
  39. if (isset($get['user_id']) && !empty($get['user_id'])) $params['where'][] = ['=', 'user_id', $get['user_id']];
  40. if (isset($get['desc']) && !empty($get['desc'])) $params['where'][] = ['like', 'b.desc', $get['desc']];
  41. if (isset($get['capital_type']) && !empty($get['capital_type'])) $params['where'][] = ['=', 'b.capital_type', $get['capital_type']];
  42. if (!empty($get['start'])) $params['where'][] = ['>=', 'b.created_at', strtotime($get['start'])];
  43. if (!empty($get['end'])) $params['where'][] = ['<=', 'b.created_at', strtotime($get['end'])];
  44. if (!empty($get['order_no'])) $params['where'][] = [ 'b.order_no'=>$get['order_no']];
  45. $params['where'][] = ['=', 'b.mall_id', $this->mall_id];
  46. $params['where'][] = ['=', 'b.from_type', AddonsEnum::ADDONS_NAME_LUCKY_GROUP];
  47. $params['where'][] = ['=', 'b.change_type', CapitalLog::CHANGE_TYPE_ADD];
  48. $params['order'] = 'b.created_at desc';
  49. $params['limit'] = 20;
  50. $params['select'] = ['b.change_num', 'b.source_table_id', 'b.change_type', 'b.current_num', 'b.desc', 'b.capital_type', 'b.created_at', 'b.user_id', 'b.from_type'];
  51. CapitalLog::$capitalType = 'score';
  52. if ($get['status'] == 0) {
  53. CapitalLog::$capitalType = 'score_frozen';
  54. $params['where'][] = ['=', 'b.status', $get['status']];
  55. }
  56. $params['page'] = empty($get['page']) ? 1 : $get['page'];
  57. $pageData = CapitalLog::listPage($params, false);
  58. if ($pageData === false) return $this->error(CapitalLog::getStaticError());
  59. $from_type_map = UserWalletEnum::getFromTypeMapByScore();
  60. $capital_type_map = [
  61. UserWalletEnum::ATTEND_REWARD => '参团奖励',
  62. UserWalletEnum::WIN_REWARD => '拼中奖励',
  63. UserWalletEnum::FIRST => '直推奖励',
  64. UserWalletEnum::SECOND => '间推奖励',
  65. ];
  66. $user_id_arr = array_column($pageData['list'], 'user_id');
  67. $source_table_id_arr = array_column($pageData['list'], 'source_table_id');
  68. $lk_order_list = LuckyGroupOrder::lists(['where' => [['id' => $source_table_id_arr]], 'index' => 'id', 'select' => 'id,order_no']);
  69. $lk_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $user_id_arr]], 'index' => 'user_id', 'select' => 'user_id,level']);
  70. $level_arr = array_column($lk_user_list, 'level');
  71. $level_arr = LuckyGroupLevel::lists(['where' => [['level' => $level_arr], ['mall_id' => $this->mall_id]], 'index' => 'level', 'select' => 'level,name']);
  72. foreach ($pageData['list'] as &$val) {
  73. $val['lucky_group_level'] = '默认等级';
  74. $val['order_no'] = '';
  75. if (isset($lk_user_list[$val['user_id']])) {
  76. $level = $lk_user_list[$val['user_id']]['level'];
  77. if (isset($level_arr[$level])) {
  78. $val['lucky_group_level'] = $level_arr[$level]['name'];
  79. }
  80. }
  81. if (isset($lk_order_list[$val['source_table_id']])) {
  82. $val['order_no'] = $lk_order_list[$val['source_table_id']]['order_no'];
  83. }
  84. $val['source_text'] = ($from_type_map[$val['from_type']] ?? '') . ($capital_type_map[$val['capital_type']] ? '-' . $capital_type_map[$val['capital_type']] : '');
  85. }
  86. $pageData['incomeCapitalTypeList'] = $capital_type_map;
  87. $where['where'] = [['=', 'mall_id', $this->mall_id], ['=', 'type', CapitalStatistics::SCORE]];
  88. $total = CapitalStatistics::statistics($where, ['sum(capital_total) capital_total', 'sum(expend_capital_total) expend_capital_total']);
  89. $score = $total[0]['capital_total'] ? round($total[0]['capital_total'], 2) : 0;//总积分
  90. $score_used = $total[0]['expend_capital_total'] ? round($total[0]['expend_capital_total'], 2) : 0;//已使用的积分
  91. $score_no_used = $score - $score_used;
  92. $pageData['total'] = ['score' => $score, 'score_used' => $score_used, 'score_no_used' => $score_no_used];
  93. $pageData['export_list'] = CapitalLog::exportFieldsList();
  94. return $this->success('操作成功', $pageData);
  95. } else {
  96. return $this->render('score-log');
  97. }
  98. }
  99. /**
  100. * 余额明细
  101. * @return mixed
  102. */
  103. public function actionBalanceLog()
  104. {
  105. CapitalLog::$capitalType = 'balance';
  106. if (\Yii::$app->request->isAjax) {
  107. if (\Yii::$app->request->isPost) {
  108. $filename = '余额列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  109. $data = \Yii::$app->request->post();
  110. $data['table'] = 'balance';
  111. $data['mall_id'] = $this->mall_id;
  112. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id, $filename, DownloadEnum::TYPE_ASSETS, CapitalLog::class, 'exportAssets', $data);
  113. if ($res === false) return $this->error('加入导出任务失败' . CsvExportHelper::getStaticError());
  114. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  115. }
  116. $page = \Yii::$app->request->get('page') ?? 1;
  117. $limit = \Yii::$app->request->get('page_size') ?? $this->pageSize;
  118. $keyword = \Yii::$app->request->get('keyword');
  119. $order_no = \Yii::$app->request->get('order_no');
  120. $user_id = \Yii::$app->request->get('user_id');
  121. $start = \Yii::$app->request->get('start');
  122. $end = \Yii::$app->request->get('end');
  123. $remark = \Yii::$app->request->get('remark');
  124. $type = \Yii::$app->request->get('balance_from_type');
  125. $flag = \Yii::$app->request->get('flag');
  126. $where[] = ['log.mall_id' => $this->mall_id];
  127. $where[] = ['log.from_type' => AddonsEnum::ADDONS_NAME_LUCKY_GROUP];
  128. $where[] = ['=', 'log.change_type', CapitalLog::CHANGE_TYPE_ADD];
  129. $where[] = ['in', 'log.status', [0,1]];
  130. if (\Yii::$app->request->get('status') == 0) {
  131. //查询冻结表,未结算数据
  132. $where[] = ['in', 'log.status', [-1, 0]];
  133. CapitalLog::$capitalType = 'balance_frozen';
  134. }
  135. if (!empty($keyword)) $where[] = ['or', ['like', 'user.nickname', $keyword], ['like', 'user.mobile', $keyword]];
  136. if (!empty($user_id)) $where[] = ['log.user_id' => $user_id];
  137. if (!empty($remark)) $where[] = ['like', 'log.desc', $remark];
  138. if (!empty($type)){
  139. $where[] = ['log.capital_type' => $type];
  140. }else{
  141. $capital_type = [
  142. UserWalletEnum::FIRST,
  143. UserWalletEnum::SECOND,
  144. UserWalletEnum::ATTEND_REWARD,
  145. UserWalletEnum::WIN_REWARD,
  146. UserWalletEnum::POOL_REWARD,
  147. UserWalletEnum::INVITE_REWARD,
  148. ];
  149. $where[] = ['log.capital_type' => $capital_type];
  150. }
  151. if (!empty($start)) $where[] = ['>=', 'log.created_at', strtotime($start)];
  152. if (!empty($end)) $where[] = ['<=', 'log.created_at', strtotime($end)];
  153. if (!empty($order_no)) $where[] = [ 'log.order_no'=>$order_no];
  154. $join = [
  155. ['LEFT JOIN', User::tableName() . 'as user', 'log.user_id = user.id and log.mall_id = user.mall_id'],
  156. ];
  157. $params = [
  158. 'alias' => 'log',
  159. 'select' => 'log.id,log.mall_id,log.user_id,log.source_table_id,log.change_type,log.from_type,log.capital_type,log.change_num,log.current_num,log.desc,log.source_table,log.created_at,user.nickname,user.avatar_url,user.mobile,user.username',
  160. 'join' => $join,
  161. 'where' => $where,
  162. 'order' => 'log.id desc,log.created_at desc,',
  163. 'page' => $page,
  164. 'limit' => $limit,
  165. ];
  166. if ($flag == "EXPORT") {
  167. } else {
  168. $list = CapitalLog::listPage($params, false, true);
  169. }
  170. $from_type_map = UserWalletEnum::getFromTypeMapByBalance();
  171. $capital_type_map = [
  172. UserWalletEnum::ATTEND_REWARD => '参团奖励',
  173. UserWalletEnum::WIN_REWARD => '拼中奖励',
  174. UserWalletEnum::FIRST => '直推奖励',
  175. UserWalletEnum::SECOND => '间推奖励',
  176. ];
  177. if (!empty($list['list'])) {
  178. $user_id_arr = array_column($list['list'], 'user_id');
  179. $source_table_id_arr = array_column($list['list'], 'source_table_id');
  180. $lk_order_list = LuckyGroupOrder::lists(['where' => [['id' => $source_table_id_arr]], 'index' => 'id', 'select' => 'id,order_no']);
  181. $lk_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $user_id_arr]], 'index' => 'user_id', 'select' => 'user_id,level']);
  182. $level_arr = array_column($lk_user_list, 'level');
  183. $level_arr = LuckyGroupLevel::lists(['where' => [['level' => $level_arr], ['mall_id' => $this->mall_id]], 'index' => 'level', 'select' => 'level,name']);
  184. foreach ($list['list'] as &$v) {
  185. $v['source_text'] = ($from_type_map[$v['from_type']] ?? '') . ($capital_type_map[$v['capital_type']] ? '-' . $capital_type_map[$v['capital_type']] : '');
  186. $v['created_at'] = date("Y-m-d H:i:s", $v["created_at"]);
  187. $v['lucky_group_level'] = '默认等级';
  188. $v['order_no'] = '';
  189. if (isset($lk_user_list[$v['user_id']])) {
  190. $level = $lk_user_list[$v['user_id']]['level'];
  191. if (isset($level_arr[$level])) {
  192. $v['lucky_group_level'] = $level_arr[$level]['name'];
  193. }
  194. }
  195. if (isset($lk_order_list[$v['source_table_id']])) {
  196. $v['order_no'] = $lk_order_list[$v['source_table_id']]['order_no'];
  197. }
  198. };
  199. }
  200. // 业务类型
  201. $list['incomeCapitalTypeList'] = $capital_type_map;
  202. // 导出字段列表
  203. $list['export_list'] = CapitalLog::exportFieldsList();
  204. $where['where'] = [['=', 'mall_id', $this->mall_id], ['=', 'type', CapitalStatistics::BALANCE]];
  205. return $this->success('操作成功', $list);
  206. }
  207. return $this->render($this->action->id);
  208. }
  209. /**
  210. * 佣金明细
  211. */
  212. public function actionCommissionLog()
  213. {
  214. CapitalLog::$capitalType = 'commission';
  215. if (\Yii::$app->request->isAjax) {
  216. if (\Yii::$app->request->isPost) {
  217. $filename = '佣金列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  218. $data = \Yii::$app->request->post();
  219. $data['table'] = 'commission';
  220. $data['mall_id'] = $this->mall_id;
  221. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id, $filename, DownloadEnum::TYPE_ASSETS, CapitalLog::class, 'exportAssets', $data);
  222. if ($res === false) return $this->error('加入导出任务失败' . CsvExportHelper::getStaticError());
  223. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  224. }
  225. $page = \Yii::$app->request->get('page') ?? 1;
  226. $limit = \Yii::$app->request->get('page_size') ?? $this->pageSize;
  227. $get = \Yii::$app->request->get();
  228. $params[] = ['log.mall_id' => $this->mall_id];
  229. $params[] = ['log.from_type' => AddonsEnum::ADDONS_NAME_LUCKY_GROUP];
  230. $params[] = ['=', 'log.change_type', CapitalLog::CHANGE_TYPE_ADD];
  231. if ($get['status'] == 0) {
  232. //查询冻结表,未结算数据
  233. $params[] = ['in', 'log.status', [-1, 0]];
  234. CapitalLog::$capitalType = 'commission_frozen';
  235. }
  236. if (!empty($get['user_id'])) $params[] = ['log.user_id' => $get['user_id']];
  237. if (!empty($get['from_type'])) $params[] = ['log.from_type' => $get['from_type']];
  238. if (!empty($get['capital_type'])) $params[] = ['log.capital_type' => $get['capital_type']];
  239. if (!empty($get['remark'])) $params[] = ['like', 'log.desc', $get['remark']];
  240. if (!empty($get['keyword'])) $params[] = ['or', ['like', 'user.nickname', $get['keyword']], ['like', 'user.mobile', $get['keyword']]];
  241. if (!empty($get['order_no'])) $params[] = [ 'log.order_no'=>$get['order_no']];
  242. if (!empty($get['date'])) {
  243. $date = date($get['date'] . '-01');
  244. } else {
  245. $date = date('Y-m-01');
  246. }
  247. $start_time = strtotime($date);
  248. $end_time = strtotime($date . '+1 month -1 day 23:59:59');
  249. $params[] = ['>=', 'log.created_at', $start_time];
  250. $params[] = ['<=', 'log.created_at', $end_time];
  251. $join = [
  252. ['LEFT JOIN', User::tableName() . ' as user', 'user.id = log.user_id and log.mall_id = user.mall_id'],
  253. ];
  254. $params = [
  255. 'alias' => 'log',
  256. 'select' => 'log.id,log.mall_id,log.user_id,log.change_type,log.source_table_id,log.change_num,log.current_num,log.desc,log.from_type,log.capital_type,log.created_at,user.nickname,user.avatar_url,user.mobile,user.username',
  257. 'join' => $join,
  258. 'where' => $params,
  259. 'order' => 'id desc',
  260. 'page' => $page,
  261. 'limit' => $limit,
  262. ];
  263. $list = CapitalLog::listPage($params, false, true);
  264. $commission_map = UserWalletEnum::getCommissionMap();
  265. $list['date'] = explode('-', $date)[0] . '-' . explode('-', $date)[1];
  266. $capital_type_map = [
  267. UserWalletEnum::POOL_REWARD => '奖金池奖励',
  268. UserWalletEnum::TEAM => '渠道奖励',
  269. UserWalletEnum::EQUAL => '平级奖励',
  270. UserWalletEnum::OVER => '越级奖励',
  271. ];
  272. if (!empty($list['list'])) {
  273. $user_id_arr = array_column($list['list'], 'user_id');
  274. $order_ids = $source_table_id_arr = [];
  275. foreach ($list['list'] as $item) {
  276. if ($item['capital_type'] == UserWalletEnum::POOL_REWARD) {
  277. $source_table_id_arr[] = $item['source_table_id'];
  278. } else {
  279. $order_ids[] = $item['source_table_id'];
  280. }
  281. }
  282. $source_table_id_arr = array_column($list['list'], 'source_table_id');
  283. $lk_frozen_list = LuckyGroupFrozenLog::lists(['where' => [['id' => $source_table_id_arr]], 'index' => 'id', 'select' => 'id,source_id']);
  284. $source_id_arr = array_column($lk_frozen_list, 'source_id');
  285. $lk_order_list = LuckyGroupOrder::lists(['where' => [['id' => $source_id_arr]], 'index' => 'id', 'select' => 'id,order_no']);
  286. $lucky_group_order_list = LuckyGroupOrder::lists(['where' => [['id' => $order_ids]], 'index' => 'id', 'select' => 'id,order_no']);
  287. $lk_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $user_id_arr]], 'index' => 'user_id', 'select' => 'user_id,level']);
  288. $level_arr = array_column($lk_user_list, 'level');
  289. $level_arr = LuckyGroupLevel::lists(['where' => [['level' => $level_arr], ['mall_id' => $this->mall_id]], 'index' => 'level', 'select' => 'level,name']);
  290. foreach ($list['list'] as &$lv) {
  291. $lv['lucky_group_level'] = '默认等级';
  292. $lv['order_no'] = '';
  293. if (isset($lk_user_list[$lv['user_id']])) {
  294. $level = $lk_user_list[$lv['user_id']]['level'];
  295. if (isset($level_arr[$level])) {
  296. $lv['lucky_group_level'] = $level_arr[$level]['name'];
  297. }
  298. }
  299. if ($lv['capital_type'] == UserWalletEnum::POOL_REWARD) {
  300. if (isset($lk_frozen_list[$lv['source_table_id']])) {
  301. $source_id = $lk_frozen_list[$lv['source_table_id']]['source_id'];
  302. if (isset($lk_order_list[$source_id])) {
  303. $lv['order_no'] = $lk_order_list[$source_id]['order_no'];
  304. }
  305. }
  306. } else {
  307. if (isset($lucky_group_order_list[$lv['source_table_id']])) {
  308. $lv['order_no'] = $lucky_group_order_list[$lv['source_table_id']]['order_no'];
  309. }
  310. }
  311. $lv['source_text'] = ($commission_map[$lv['from_type']] ?? '') . ($capital_type_map[$lv['capital_type']] ? '-' . $capital_type_map[$lv['capital_type']] : '');
  312. $lv['created_at'] = date('Y-m-d H:i:s', $lv['created_at']);
  313. }
  314. }
  315. // 业务类型
  316. $list['commissionFromTypeList'] = $commission_map;//来源类型
  317. $list['incomeCapitalTypeList'] = $capital_type_map;//佣金类型
  318. // 导出字段列表
  319. $list['export_list'] = CommissionLog::EXPORT_FIELD_LIST;
  320. $where['where'] = [['=', 'mall_id', $this->mall_id], ['=', 'type', CapitalStatistics::COMMISSIOIN]];
  321. CapitalLog::$capitalType = 'commission_frozen';
  322. $list['export_list'] = CapitalLog::exportFieldsList();
  323. return $this->success('操作成功', $list);
  324. } else {
  325. $flag = \Yii::$app->request->post('flag');
  326. if (empty($flag)) {
  327. return $this->render('commission-log');
  328. } else {
  329. // 导出数据
  330. }
  331. }
  332. }
  333. }