SecondaryCardUseLogService.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <?php
  2. namespace addons\SecondaryCard\common\service;
  3. use addons\SecondaryCard\common\models\SecondaryCard;
  4. use addons\SecondaryCard\common\models\SecondaryCardUseLog;
  5. use addons\Store\common\models\Store;
  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. use common\models\mall\MallAddons;
  12. use common\traits\ErrorTrait;
  13. class SecondaryCardUseLogService
  14. {
  15. use ErrorTrait;
  16. public static function getSecondaryCardUseLog($mall_id, $reservation_service_order_ids)
  17. {
  18. $params['where'][] = ['mall_id' => $mall_id];
  19. $params['where'][] = ['reservation_service_order_id' => $reservation_service_order_ids];
  20. $params['where'][] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  21. $params['index'] = 'reservation_service_order_id';
  22. $list = SecondaryCardUseLog::lists($params, false);
  23. return $list;
  24. }
  25. /**
  26. * 使用记录
  27. * @Author:hua
  28. * @Date:2024-03-09 15:02
  29. * @Copyright:copyright(c)2024 广东七件事集团
  30. * @param $params
  31. * @return array|false|mixed|void
  32. */
  33. public static function getPageListByH5($params)
  34. {
  35. $where = [
  36. ['mall_id' => $params['mall_id']],
  37. ['user_id' => $params['user_id']],
  38. ['status' => StatusEnum::ENABLED],
  39. ];
  40. if (!empty($params['secondary_card_id'])) {
  41. $where[] = ['secondary_card_id' => $params['secondary_card_id']];
  42. }
  43. if (!empty($params['order_no'])) {
  44. $where[] = ['order_no' => $params['order_no']];
  45. }
  46. $params['where'] = $where;
  47. $params['order'] = 'id desc';
  48. $params['select'] = 'id,clerk_nums,created_at,secondary_card_id,clerk_user_id,store_id,type';
  49. $params['with'] = [
  50. 'secondaryCard' => function ($query) {
  51. $query->select('id,name');
  52. },
  53. 'clerkUser' => function ($query) {
  54. $query->select('id,nickname');
  55. }];
  56. $pageData = SecondaryCardUseLog::listPage($params, false);
  57. if (!empty($pageData['list'])) {
  58. $secondary_card_ids = array_column($pageData['list'], 'secondary_card_id');
  59. $secondary_card_list = SecondaryCard::lists(['where' => [['id' => $secondary_card_ids]], 'select' => 'id,reservation_model', 'index' => 'id']);
  60. $o2o_store_ids = [];
  61. foreach ($pageData['list'] as $val) {
  62. if (isset($secondary_card_list[$val['secondary_card_id']]) && $secondary_card_list[$val['secondary_card_id']]['reservation_model'] == 1) {
  63. switch ($val['type']) {
  64. case 1:
  65. $o2o_store_ids[] = $val['store_id'];
  66. break;
  67. }
  68. }
  69. }
  70. if (!empty($o2o_store_ids)) {
  71. $store_list = Store::lists(['where' => [['id' => $o2o_store_ids]], 'select' => 'id,store_name,address', 'index' => 'id']);
  72. }
  73. foreach ($pageData['list'] as &$item) {
  74. if (isset($secondary_card_list[$item['secondary_card_id']]) && $secondary_card_list[$item['secondary_card_id']]['reservation_model'] == 1) {
  75. switch ($item['type']) {
  76. case 1:
  77. if (isset($store_list) && isset($store_list[$item['store_id']])) {
  78. $address = $store_list[$item['store_id']]['address'];
  79. $item['clerkUser']['nickname'] = $store_list[$item['store_id']]['store_name'] . " ({$address})";
  80. }
  81. break;
  82. }
  83. }
  84. unset($item['clerk_user_id']);
  85. unset($item['secondary_card_id']);
  86. }
  87. }
  88. return $pageData;
  89. }
  90. public static function getList($params)
  91. {
  92. if (!MallAddons::isInstall($params['mall_id'], 'Store')) {
  93. throw new \Exception('请安装门店插件');
  94. }
  95. $params['where'][] = ['mall_id' => $params['mall_id']];
  96. $params['where'][] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  97. if (!empty($params['order_no'])) {
  98. $params['where'][] = ['like','order_no', trim($params['order_no'])];
  99. }
  100. if (!empty($params['store_id'])) {
  101. $params['where'][] = ['store_id' => $params['store_id']];
  102. }
  103. if (!empty($params['store_name'])) {
  104. $store_list = Store::lists(['where'=>[
  105. ['like','store_name',trim($params['store_name'])],
  106. ['mall_id'=>$params['mall_id']]
  107. ]]);
  108. $store_ids = array_column($store_list,'id');
  109. $params['where'][] = ['store_id' => $store_ids];
  110. }
  111. if (!empty($params['nickname'])) {
  112. $user_list = User::lists(['where'=>[
  113. ['like','nickname',trim($params['nickname'])],
  114. ['mall_id'=>$params['mall_id']]
  115. ]]);
  116. $user_ids = array_column($user_list,'id');
  117. $params['where'][] = ['user_id' => $user_ids];
  118. }
  119. if (!empty($params['clerk_nickname'])) {
  120. $user_list = User::lists(['where'=>[
  121. ['like','nickname',trim($params['clerk_nickname'])],
  122. ['mall_id'=>$params['mall_id']]
  123. ]]);
  124. $user_ids = array_column($user_list,'id');
  125. $params['where'][] = ['clerk_user_id' => $user_ids];
  126. }
  127. if (!empty($params['date_time'][0])) {
  128. $params['where'][] = ['>=', 'created_at', strtotime($params['date_time'][0])];
  129. }
  130. if (!empty($params['date_time'][1])) {
  131. $params['where'][] = ['<=', 'created_at', strtotime($params['date_time'][1])];
  132. }
  133. $params['order'] = 'id DESC';
  134. if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
  135. $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
  136. $params['order'] = $params['sort_column'] . ' ' . $sort_order;
  137. }
  138. $params['with'] = ['secondaryCard', 'clerkUser', 'user'];
  139. $pageData = SecondaryCardUseLog::listPage($params, false);
  140. if (!empty($pageData['list'])) {
  141. $o2o_store_ids = [];
  142. $o2o_store_list = [];
  143. $ids = [];
  144. foreach ($pageData['list'] as $item) {
  145. $ids[] = $item['id'];
  146. switch ($item['type']) {
  147. case 1:
  148. $o2o_store_ids[] = $item['store_id'];
  149. break;
  150. }
  151. }
  152. if (!empty($o2o_store_ids)) {
  153. $o2o_store_list = SecondaryCardService::getO2OStoreList($o2o_store_ids);
  154. }
  155. foreach ($pageData['list'] as &$item) {
  156. $item['secondary_card_name'] = $item['secondaryCard']['name'];
  157. $item['nickname'] = $item['user']['nickname'];
  158. $item['avatar_url'] = $item['user']['avatar_url'] ?? '';
  159. $item['mobile'] = $item['user']['mobile'] ?? '';
  160. $item['clerk_nickname'] = $item['clerkUser']['nickname'];
  161. $item['store_name'] = '';
  162. switch ($item['type']) {
  163. case 1:
  164. $item['store_name'] = $o2o_store_list[$item['store_id']]['store_name'] ?? '';
  165. break;
  166. }
  167. }
  168. }
  169. $pageData['export_list'] = SecondaryCardUseLog::getExportFields();
  170. return $pageData;
  171. }
  172. public static function exportHandle($data)
  173. {
  174. $download_id = $data['download_id'] ?? 0;
  175. $download = Download::findOne(['id' => $download_id]);
  176. if ($download) {
  177. try {
  178. $params = json_decode($download->params, true);
  179. $filename = $download->name;
  180. $type = $download->type;
  181. $fields = $params['fields'];
  182. $fields_arr = SecondaryCardUseLog::getExportFields();
  183. $have_select_field_arr = [];
  184. foreach ($fields as $value) {
  185. $have_select_field_arr[] = $fields_arr[$value];
  186. }
  187. $csv = new CsvTool();
  188. $csv->filename = $filename;
  189. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  190. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  191. $csv->header = $have_select_field_arr;
  192. $params['order'] = 'id DESC';
  193. if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
  194. $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
  195. $params['order'] = $params['sort_column'] . ' ' . $sort_order;
  196. }
  197. $model = SecondaryCardUseLog::find();
  198. $model->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]);
  199. if (!empty($params['order_no'])) {
  200. $model->andWhere(['like','order_no' , trim($params['order_no'])]);
  201. }
  202. if (!empty($params['store_name'])) {
  203. $store_list = Store::lists(['where'=>[
  204. ['like','store_name',trim($params['store_name'])],
  205. ['mall_id'=>$params['mall_id']]
  206. ]]);
  207. $store_ids = array_column($store_list,'id');
  208. $model->andWhere(['store_id' => $store_ids]);
  209. }
  210. if (!empty($params['nickname'])) {
  211. $user_list = User::lists(['where'=>[
  212. ['like','nickname',trim($params['nickname'])],
  213. ['mall_id'=>$params['mall_id']]
  214. ]]);
  215. $user_ids = array_column($user_list,'id');
  216. $model->andWhere(['user_id' => $user_ids]);
  217. }
  218. if (!empty($params['clerk_nickname'])) {
  219. $user_list = User::lists(['where'=>[
  220. ['like','nickname',trim($params['clerk_nickname'])],
  221. ['mall_id'=>$params['mall_id']]
  222. ]]);
  223. $user_ids = array_column($user_list,'id');
  224. $model->andWhere(['clerk_user_id' =>$user_ids]);
  225. }
  226. $model->with(['secondaryCard', 'clerkUser', 'user']);
  227. $model->orderBy('id DESC');
  228. if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
  229. $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
  230. $model->orderBy($params['sort_column'] . ' ' . $sort_order);
  231. }
  232. foreach ($model->batch() as $list) {
  233. $o2o_store_ids = [];
  234. $o2o_store_list = [];
  235. foreach ($list as $item) {
  236. switch ($item['type']) {
  237. case 1:
  238. $o2o_store_ids[] = $item['store_id'];
  239. break;
  240. }
  241. }
  242. if (!empty($o2o_store_ids) && MallAddons::isInstall($params['mall_id'], 'Store')) {
  243. $o2o_store_list = SecondaryCardService::getO2OStoreList($o2o_store_ids);
  244. }
  245. $csv->data = array_map(function ($code_item) use ($fields, $o2o_store_list) {
  246. $row = [];
  247. //遍历所选字段
  248. foreach ($fields as $field) {
  249. if (in_array($field, ['open_time', 'created_at'])) {
  250. $row[] = !empty($code_item[$field]) ? date('Y-m-d H:i:s', $code_item[$field]) : '';
  251. } elseif (in_array($field, ['secondary_card_name'])) {
  252. $row[] = $code_item['secondaryCard']['name'];
  253. } elseif (in_array($field, ['nickname'])) {
  254. $row[] = $code_item['user']['nickname'];
  255. } elseif (in_array($field, ['clerk_nickname'])) {
  256. $row[] = $code_item['user']['nickname'];
  257. } elseif (in_array($field, ['store_name'])) {
  258. $source_str = '';
  259. switch ($code_item['type']) {
  260. case 1:
  261. $source_str = $o2o_store_list[$code_item['store_id']]['store_name'] ?? '';
  262. break;
  263. }
  264. $row[] = $source_str;
  265. } else {
  266. $row[] = !empty($code_item[$field]) ? $code_item[$field] : '';
  267. }
  268. }
  269. return $row;
  270. }, $list);
  271. $csv->export();
  272. }
  273. $csv->updateDown($download, $params['mall_id']);
  274. return true;
  275. } catch (\Exception $e) {
  276. $download->status = 3;
  277. $res = $download->save();
  278. self::setStaticError($e->getMessage());
  279. return false;
  280. }
  281. }
  282. }
  283. public static function exportHandleSync($data)
  284. {
  285. try {
  286. $params = $data;
  287. $fields = $params['fields'];
  288. $fields_arr = SecondaryCardUseLog::getExportFields();
  289. $post_fields_arr = explode(',', $fields);
  290. $have_select_field_arr = [];
  291. foreach ($post_fields_arr as $value) {
  292. $have_select_field_arr[] = $fields_arr[$value];
  293. }
  294. $csv = new CsvTool();
  295. $csv->export_mode = $data['export_mode'];
  296. $csv->filename = $data['filename'];
  297. $csv->export_mode = $data['export_mode'];
  298. $csv->header = $have_select_field_arr;
  299. $params['order'] = 'id DESC';
  300. if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
  301. $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
  302. $params['order'] = $params['sort_column'] . ' ' . $sort_order;
  303. }
  304. $model = SecondaryCardUseLog::find();
  305. $model->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]);
  306. if (!empty($params['order_no'])) {
  307. $model->andWhere(['order_no' => trim($params['order_no'])]);
  308. }
  309. if (!empty($params['store_name'])) {
  310. $store = Store::findOne(['store_name' => trim($params['store_name'])]);
  311. $model->andWhere(['store_id' => $store['id'] ?? 0]);
  312. }
  313. if (!empty($params['nickname'])) {
  314. $user = User::findOne(['nickname' => trim($params['nickname'])]);
  315. $model->andWhere(['user_id' => $user['id'] ?? 0]);
  316. }
  317. if (!empty($params['clerk_nickname'])) {
  318. $user = User::findOne(['nickname' => trim($params['clerk_nickname'])]);
  319. $model->andWhere(['clerk_user_id' => $user['id'] ?? 0]);
  320. }
  321. $model->with(['secondaryCard', 'clerkUser', 'user']);
  322. $model->orderBy('id DESC');
  323. if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
  324. $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
  325. $model->orderBy($params['sort_column'] . ' ' . $sort_order);
  326. }
  327. $list = $model->all();
  328. $o2o_store_ids = [];
  329. $o2o_store_list = [];
  330. foreach ($list as $item) {
  331. switch ($item['type']) {
  332. case 1:
  333. $o2o_store_ids[] = $item['store_id'];
  334. break;
  335. }
  336. }
  337. if (!empty($o2o_store_ids) && MallAddons::isInstall($params['mall_id'], 'Store')) {
  338. $o2o_store_list = SecondaryCardService::getO2OStoreList($o2o_store_ids);
  339. }
  340. foreach ($list as $code_item) {
  341. $row = [];
  342. //遍历所选字段
  343. foreach ($post_fields_arr as $field) {
  344. if (in_array($field, ['open_time', 'created_at'])) {
  345. $row[] = !empty($code_item[$field]) ? date('Y-m-d H:i:s', $code_item[$field]) : '';
  346. } elseif (in_array($field, ['secondary_card_name'])) {
  347. $row[] = $code_item['secondaryCard']['name'];
  348. } elseif (in_array($field, ['nickname'])) {
  349. $row[] = $code_item['user']['nickname'];
  350. } elseif (in_array($field, ['clerk_nickname'])) {
  351. $row[] = $code_item['user']['nickname'];
  352. } elseif (in_array($field, ['store_name'])) {
  353. $source_str = '';
  354. switch ($code_item['type']) {
  355. case 1:
  356. $source_str = $o2o_store_list[$code_item['store_id']]['store_name'] ?? '';
  357. break;
  358. }
  359. $row[] = $source_str;
  360. } else {
  361. $row[] = !empty($code_item[$field]) ? $code_item[$field] : '';
  362. }
  363. }
  364. $data[]=$row;
  365. }
  366. $csv->data = $data;
  367. $csv->export();
  368. return true;
  369. } catch (\Exception $e) {
  370. self::setStaticError($e->getMessage());
  371. return false;
  372. }
  373. }
  374. }