PaymentLogService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <?php
  2. namespace addons\CloudStock\common\services;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\models\CloudStockAgent;
  5. use addons\CloudStock\common\models\CloudStockPaymentLog;
  6. use common\components\export\CsvTool;
  7. use common\enums\DownloadEnum;
  8. use common\enums\StatusEnum;
  9. use common\models\common\Download;
  10. use common\models\user\User;
  11. class PaymentLogService extends BaseService
  12. {
  13. public function index($params)
  14. {
  15. $mall_id = $this->mall_id;
  16. $where[] = ['mall_id' => $mall_id];
  17. $where[] = ['user_id' => $this->user_id];
  18. if (isset($params['status'])) {
  19. $where[] = ['status' => $params['status']];
  20. } else {
  21. $where[] = ['status' => StatusEnum::ENABLED];
  22. }
  23. $params['page'] = empty($params['page']) ? 1 : $params['page'];
  24. $params['limit'] = empty($params['limit']) ? 5 : $params['limit'];
  25. $params['where'] = $where;
  26. $params['order'] = 'id desc';
  27. $params['with'] = ['buyUser'];
  28. $params['select'] = 'id,buy_user_id,order_no,created_at,num,money,goods_name,type';
  29. $page_data = CloudStockPaymentLog::listPage($params, false);
  30. if (!empty($page_data['list'])) {
  31. foreach ($page_data['list'] as &$item) {
  32. $item['avatar_url'] = $item['buyUser']['avatar_url'] ?? '';
  33. $item['buy_user_nickname'] = $item['buyUser']['nickname'] ?? '';
  34. $item['type'] = CloudStockEnum::getPaymentLogTypeMap($item['type']) ?? '';
  35. unset($item['buyUser']);
  36. }
  37. }
  38. return $page_data;
  39. }
  40. public function exportFieldsList()
  41. {
  42. return [
  43. 'user_id' => '会员ID',
  44. 'nickname' => '用户昵称',
  45. 'mobile' => '用户手机',
  46. 'source_text' => '货款类型',
  47. 'money' => '金额',
  48. 'status' => '状态',
  49. 'desc' => '说明',
  50. 'order_no' => '订单号',
  51. 'buy_user_id' => '来源会员ID',
  52. 'buy_nickname' => '来源用户昵称',
  53. 'created_at' => '创建时间',
  54. ];
  55. }
  56. protected function getWhere($params)
  57. {
  58. $where = [['mall_id' => $this->mall_id]];
  59. if (!empty($params['order_no'])) {
  60. $where[] = ['like', 'order_no', trim($params['order_no'])];
  61. }
  62. if (!empty($params['keyword'])) {
  63. $user_list = User::lists([
  64. 'where' => [
  65. ['or',
  66. ['like', 'nickname', $params['keyword']],
  67. ['like', 'mobile', $params['keyword']]
  68. ]
  69. ],
  70. 'select' => 'id',
  71. ]);
  72. $user_ids = array_column($user_list, 'id');
  73. $where[] = ['user_id' => $user_ids];
  74. }
  75. if (!empty($params['user_id'])) {
  76. $where[] = ['user_id' => $params['user_id']];
  77. }
  78. if (isset($params['status']) && $params['status'] != 'all') {
  79. $where[] = ['status' => $params['status']];
  80. }
  81. if (!empty($params['date'])) {
  82. $start = strtotime(date($params['date'] . '-01'));
  83. $end = strtotime(date($params['date'] . '-t'));
  84. $where[] = ['>=', 'created_at', $start];
  85. $where[] = ['<=', 'created_at', $end];
  86. }
  87. if (isset($params['contributor']) && is_numeric($params['contributor'])) {
  88. $userIdsByMobile = User::find()
  89. ->where(['mall_id' => $this->mall_id])
  90. ->andWhere(['like', 'mobile', $params['contributor']])
  91. ->andWhere(['!=', 'status', StatusEnum::DELETE])
  92. ->column();
  93. $userIdsByMobile[] = $params['contributor'];
  94. $where[] = ['buy_user_id' => $userIdsByMobile];
  95. }
  96. return $where;
  97. }
  98. public function paymentLog($params)
  99. {
  100. $params['where'] = $this->getWhere($params);
  101. $params['order'] = 'id desc';
  102. $list = CloudStockPaymentLog::listPage($params, false, true);
  103. if (!empty($list['list'])) {
  104. $user_id_arr = array_column($list['list'], 'user_id');
  105. $buy_user_id_arr = array_column($list['list'], 'buy_user_id');
  106. $user_arr = User::lists([
  107. 'where' => [
  108. ['id' => array_merge($user_id_arr, $buy_user_id_arr)]
  109. ],
  110. 'index' => 'id',
  111. ]);
  112. foreach ($list['list'] as &$lv) {
  113. if ($lv['type'] == 'fill') {
  114. $desc = $source_text = '补货货款';
  115. } else {
  116. $source_text = '会员买货货款';
  117. $desc = '线下订单出货';
  118. }
  119. $lv['source_text'] = $source_text;
  120. $lv['desc'] = $desc;
  121. $lv['created_at'] = date('Y-m-d H:i:s', $lv['created_at']);
  122. $lv['nickname'] = '';
  123. $lv['avatar_url'] = '';
  124. $lv['mobile'] = '';
  125. $lv['username'] = '';
  126. if (isset($user_arr[$lv['user_id']])) {
  127. $lv['nickname'] = $user_arr[$lv['user_id']]['nickname'];
  128. $lv['avatar_url'] = $user_arr[$lv['user_id']]['avatar_url'];
  129. $lv['mobile'] = $user_arr[$lv['user_id']]['mobile'];
  130. $lv['username'] = $user_arr[$lv['user_id']]['username'];
  131. }
  132. $lv['from_user'] = [];
  133. if (isset($user_arr[$lv['buy_user_id']])) {
  134. $lv['from_user']['nickname'] = $user_arr[$lv['buy_user_id']]['nickname'];
  135. $lv['from_user']['avatar_url'] = $user_arr[$lv['buy_user_id']]['avatar_url'];
  136. $lv['from_user']['id'] = $user_arr[$lv['buy_user_id']]['id'];
  137. }
  138. }
  139. }
  140. // 业务类型
  141. $cloud_warehouse = CloudStockAgent::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->sum('cloud_warehouse_price+cloud_warehouse_frozen_price');
  142. $cloud_warehouse_withdraw_price = CloudStockAgent::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->sum('cloud_warehouse_withdraw_price');
  143. $list['statistics_data'] = ['cloud_warehouse' => $cloud_warehouse, 'cloud_warehouse_withdraw_price' => $cloud_warehouse_withdraw_price];
  144. $list['export_list'] = $this->exportFieldsList();
  145. $list['export_url'] = 'cloud-stock/default/payment-log';
  146. return $list;
  147. }
  148. public function add($params)
  149. {
  150. $res = CloudStockPaymentLog::add($params);
  151. if (empty($res)) {
  152. throw new \Exception(CloudStockPaymentLog::$static_error);
  153. }
  154. if (empty($params['status'])) {
  155. $params['is_frozen'] = true;
  156. } else {
  157. $params['is_frozen'] = false;
  158. }
  159. WithdrawService::handle($params);
  160. return $res;
  161. }
  162. public function export($data)
  163. {
  164. ini_set('memory_limit', '512M');
  165. $download_id = $data['download_id'] ?? 0;
  166. $download = Download::findOne(['id' => $download_id]);
  167. if ($download) {
  168. try {
  169. $params = json_decode($download->params, true);
  170. $filename = $download->name;
  171. $type = $download->type;
  172. $params['where'] = $this->getWhere($params);
  173. $params['order'] = 'id desc';
  174. $list = CloudStockPaymentLog::lists($params);
  175. $fields = $params['fields'];
  176. $fields_arr = $this->exportFieldsList();
  177. $have_select_field_arr = [];
  178. foreach ($fields as $value) {
  179. $have_select_field_arr[] = $fields_arr[$value];
  180. }
  181. $csv = new CsvTool();
  182. $csv->filename = $filename;
  183. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  184. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  185. $csv->header = $have_select_field_arr;
  186. $user_id_arr = array_column($list, 'user_id');
  187. $buy_user_id_arr = array_column($list, 'buy_user_id');
  188. $user_arr = User::lists([
  189. 'where' => [
  190. ['id' => array_merge($user_id_arr, $buy_user_id_arr)]
  191. ],
  192. 'index' => 'id',
  193. ]);
  194. $csv->data = array_map(function ($item) use ($fields, $user_arr) {
  195. $row = [];
  196. foreach ($fields as $field) {
  197. switch (true) {
  198. case $field == 'created_at':
  199. $row[] = !empty($item[$field]) ? date('Y-m-d H:i:s', $item[$field]) : '';
  200. break;
  201. case $field == 'mobile':
  202. $row[] = $user_arr[$item['user_id']]['mobile'] ?? '';
  203. break;
  204. case $field == 'source_text':
  205. $row[] = $item['type'] == 'fill' ? '补货货款' : '会员买货货款';
  206. break;
  207. case $field == 'status':
  208. $row[] = $item['status'] == 0 ? '未结算' : '已结算';
  209. break;
  210. case $field == 'desc':
  211. $row[] = $item['type'] == 'fill' ? '补货货款' : '线下订单出货';
  212. break;
  213. case $field == 'nickname':
  214. $row[] = $user_arr[$item['user_id']]['nickname'] ?? '';
  215. break;
  216. case $field == 'buy_nickname':
  217. $row[] = $user_arr[$item['buy_user_id']]['nickname'] ?? '';
  218. break;
  219. default:
  220. $row[] = !empty($item[$field]) ? $item[$field] : '';
  221. }
  222. }
  223. return $row;
  224. }, $list);
  225. $csv->export();
  226. $csv->updateDown($download, $params['mall_id']);
  227. return true;
  228. } catch (\Exception $e) {
  229. $download->status = 3;
  230. $res = $download->save();
  231. return $e->getMessage();
  232. }
  233. }
  234. }
  235. }