CardMainController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?php
  2. namespace app\admin\controller\coupon;
  3. use app\controller\Curd;
  4. use app\model\Card;
  5. use app\model\CardIssue;
  6. use app\model\CardMain;
  7. use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
  8. use Illuminate\Database\Query\Builder as QueryBuilder;
  9. use support\Db;
  10. use support\exception\BusinessException;
  11. use support\Log;
  12. use support\Model;
  13. use support\Request;
  14. use support\Response;
  15. use Tinywan\Jwt\JwtToken;
  16. class CardMainController extends Curd
  17. {
  18. public function __construct()
  19. {
  20. $this->model = new CardMain();
  21. }
  22. public function select(Request $request): Response
  23. {
  24. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  25. $order = $request->get('order', 'desc');
  26. $field = $field ?? 'card_main_addtimes';
  27. if (!empty($where['card_main_name'])) {
  28. $where['card_main_name'] = ['like', $where['card_main_name']];
  29. }
  30. if (!empty($where['card_main_addtimes'])) {
  31. $where['card_main_addtimes'][0] = strtotime($where['card_main_addtimes'][0]);
  32. $where['card_main_addtimes'][1] = strtotime($where['card_main_addtimes'][1]);
  33. }
  34. $query = $this->doSelect($where, $field, $order);
  35. return $this->doFormat($query, $format, $limit);
  36. }
  37. /**
  38. * 指定查询where条件,并没有真正的查询数据库操作
  39. * @param array $where
  40. * @param string|null $field
  41. * @param string $order
  42. * @return EloquentBuilder|QueryBuilder|Model
  43. */
  44. protected function doSelect(array $where, string $field = null, string $order = 'desc')
  45. {
  46. $model = $this->model->with('category');
  47. foreach ($where as $column => $value) {
  48. if (is_array($value)) {
  49. if ($value[0] === 'like' || $value[0] === 'not like') {
  50. $model = $model->where($column, $value[0], "%$value[1]%");
  51. } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
  52. $model = $model->where($column, $value[0], $value[1]);
  53. } elseif ($value[0] == 'in' && !empty($value[1])) {
  54. $valArr = $value[1];
  55. if (is_string($value[1])) {
  56. $valArr = explode(",", trim($value[1]));
  57. }
  58. $model = $model->whereIn($column, $valArr);
  59. } elseif ($value[0] == 'not in' && !empty($value[1])) {
  60. $valArr = $value[1];
  61. if (is_string($value[1])) {
  62. $valArr = explode(",", trim($value[1]));
  63. }
  64. $model = $model->whereNotIn($column, $valArr);
  65. } elseif ($value[0] == 'null') {
  66. $model = $model->whereNull($column);
  67. } elseif ($value[0] == 'not null') {
  68. $model = $model->whereNotNull($column);
  69. } elseif ($value[0] !== '' || $value[1] !== '') {
  70. $model = $model->whereBetween($column, $value);
  71. }
  72. } else {
  73. $model = $model->where($column, $value);
  74. }
  75. }
  76. if ($field) {
  77. $model = $model->orderBy($field, $order);
  78. }
  79. return $model;
  80. }
  81. /**
  82. * @Desc 查询后处理
  83. * @Author Gorden
  84. * @Date 2024/11/15 8:35
  85. *
  86. * @param $items
  87. * @return mixed
  88. */
  89. public function afterQuery($items)
  90. {
  91. foreach ($items as &$item) {
  92. if ($item['card_main_valid_mode'] == 'DAYS') {
  93. $item['valid_term'] = $item['card_main_valid_days'] ? $item['card_main_valid_days'] . '天' : 0;
  94. } elseif ($item['card_main_valid_mode'] == 'LONG') {
  95. $item['valid_term'] = '长期有效';
  96. } elseif ($item['card_main_valid_mode'] == 'DATE') {
  97. $item['valid_term'] = date('Y/m/d H:i:s', strtotime($item['card_main_valid_begin'])) . '-' . date('Y/m/d H:i:s', strtotime($item['card_main_valid_end']));
  98. }
  99. }
  100. return $items;
  101. }
  102. /**
  103. * @Desc 卡的下拉搜索
  104. * @Author Gorden
  105. * @Date 2024/11/18 9:51
  106. *
  107. * @return Response
  108. */
  109. public function selectList()
  110. {
  111. $cardMain = CardMain::where('card_main_status', 'ACTIVED')
  112. ->orderBy('card_main_addtimes', 'DESC')
  113. ->select('card_main_id', 'card_main_name')
  114. ->get()
  115. ->toArray();
  116. return json_success('success', $cardMain);
  117. }
  118. /**
  119. * @Desc 储值卡详情
  120. * @Author Gorden
  121. * @Date 2024/11/15 11:33
  122. *
  123. * @param Request $request
  124. * @return Response
  125. */
  126. public function info(Request $request): Response
  127. {
  128. $cardMainId = $request->get('card_main_id');
  129. if (!$cardMainId) {
  130. return json_fail('参数异常');
  131. }
  132. // 发行记录
  133. $cardIssue = CardIssue::where('join_issue_card_main_id', $cardMainId)->orderBy('card_issue_addtimes', 'DESC')->get()->toArray();
  134. // 发行统计
  135. $cardTotal = Card::where('join_card_main_id', $cardMainId)->count();
  136. $cardInitTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'INIT')->count();
  137. $cardWaitingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'WAITING')->count();
  138. $cardPendingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PENDING')->count();
  139. $cardUsedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'USED')->count();
  140. $cardDoneTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'DONE')->count();
  141. $cardExpiredTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'EXPIRED')->count();
  142. $cardPausedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PAUSED')->count();
  143. $statistics = [
  144. [
  145. 'total' => $cardTotal,
  146. 'initTotal' => $cardInitTotal,
  147. 'waitingTotal' => $cardWaitingTotal,
  148. 'pendingTotal' => $cardPendingTotal,
  149. 'usedTotal' => $cardUsedTotal,
  150. 'doneTotal' => $cardDoneTotal,
  151. 'expiredTotal' => $cardExpiredTotal,
  152. 'pausedTotal' => $cardPausedTotal
  153. ]
  154. ];
  155. $data = [
  156. 'issue' => $cardIssue,
  157. 'statistics' => $statistics
  158. ];
  159. return json_success('', $data);
  160. }
  161. /**
  162. * @Desc 插入前置方法
  163. * @Author Gorden
  164. * @Date 2024/11/14 14:29
  165. *
  166. * @param Request $request
  167. * @return array
  168. * @throws BusinessException
  169. */
  170. public function insertInput(Request $request): array
  171. {
  172. $params = $request->post();
  173. $data = $this->inputFilter($request->post());
  174. if ($data['card_main_valid_mode'] == 'DATE') {
  175. $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin']));
  176. $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end']));
  177. $data['card_main_valid_days'] = 0;
  178. } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') {
  179. $data['card_main_valid_begin'] = '';
  180. $data['card_main_valid_end'] = '';
  181. }
  182. $cardMainJson = [
  183. 'desc' => $params['card_main_desc'] ?? [],
  184. 'is_recharge' => $params['is_recharge'] ?? 'N',
  185. 'issue' => $params['issue'] ?? 'BATCH',
  186. 'demand_config' => []
  187. ];
  188. if ($params['issue'] == 'DEMAND') {
  189. $cardMainJson['demand_config'] = [
  190. 'length' => $params['card_length'],
  191. 'begin' => $params['card_begin'],
  192. 'end' => $params['card_end'],
  193. 'prefix' => $params['card_prefix'],
  194. 'suffix' => $params['card_suffix'],
  195. 'rand' => $params['card_rand'],
  196. 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
  197. ];
  198. }
  199. $data['card_main_json'] = json_encode($cardMainJson);
  200. return $data;
  201. }
  202. /**
  203. * 更新前置方法
  204. * @param Request $request
  205. * @return array
  206. * @throws BusinessException
  207. */
  208. protected function updateInput(Request $request): array
  209. {
  210. $params = $request->post();
  211. $primary_key = $this->model->getKeyName();
  212. $id = $request->post($primary_key);
  213. $data = $this->inputFilter($request->post());
  214. $model = $this->model->find($id);
  215. if (!$model) {
  216. throw new BusinessException('记录不存在', 2);
  217. }
  218. if ($data['card_main_valid_mode'] == 'DATE') {
  219. $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin']));
  220. $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end']));
  221. $data['card_main_valid_days'] = 0;
  222. } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') {
  223. $data['card_main_valid_begin'] = '';
  224. $data['card_main_valid_end'] = '';
  225. }
  226. $cardMainJson = [];
  227. if (!empty($model->card_main_json)) {
  228. $cardMainJson = json_decode($model->card_main_json, true);
  229. }
  230. $cardMainJson['desc'] = $params['card_main_desc'] ?? [];
  231. if (!empty($params['is_recharge'])) {
  232. $cardMainJson['is_recharge'] = $params['is_recharge'];
  233. }
  234. if (!empty($params['issue'])) {
  235. $cardMainJson['issue'] = $params['issue'];
  236. }
  237. if ($cardMainJson['issue'] == 'BATCH') {
  238. $cardMainJson['demand_config'] = [];
  239. } elseif ($cardMainJson['issue'] == 'DEMAND') {
  240. $cardMainJson['demand_config'] = [
  241. 'length' => $params['card_length'],
  242. 'begin' => $params['card_begin'],
  243. 'end' => $params['card_end'],
  244. 'prefix' => $params['card_prefix'],
  245. 'suffix' => $params['card_suffix'],
  246. 'rand' => $params['card_rand'],
  247. 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
  248. ];
  249. }
  250. $data['card_main_json'] = json_encode($cardMainJson);
  251. // 卡状态设置为禁用,则未绑定的卡冻结,恢复未发行状态
  252. if ($data['card_main_status'] == 'DISABLED' && $model->card_main_status != 'DISABLED') {
  253. Card::where('join_card_main_id', $id)->where('join_card_member_id', '')->update(['card_status' => 'PAUSED', 'is_issue' => 'N']);
  254. // 记录日志
  255. _syslog("储值卡", "禁用");
  256. } elseif ($data['card_main_status'] == 'ACTIVED' && $model->card_main_status == 'DISABLED') {
  257. Card::where('join_card_main_id', $id)->where('join_card_member_id', '')
  258. ->where('card_status', 'PAUSED')
  259. ->update(['card_status' => 'INIT']);
  260. // 记录日志
  261. _syslog("储值卡", "重新启用");
  262. }
  263. unset($data[$primary_key]);
  264. return [$id, $data];
  265. }
  266. /**
  267. * @Desc 删除储值卡
  268. * @Author Gorden
  269. * @Date 2024/11/18 16:33
  270. *
  271. * @param Request $request
  272. * @return Response
  273. * @throws BusinessException
  274. */
  275. public function delete(Request $request): Response
  276. {
  277. $ids = $this->deleteInput($request);
  278. Db::beginTransaction();
  279. try {
  280. if (Card::whereIn('join_card_main_id', $ids)->where(function ($query) {
  281. $query->where('card_status', '<>', 'INIT')
  282. ->orWhere('join_card_dept_id', '<>', '')
  283. ->orWhere('join_card_member_id', '<>', '');
  284. })->exists()) {
  285. return json_fail("存在已发行、已分配的卡,无法删除!");
  286. }
  287. $this->doDelete($ids);
  288. // 同时删除批次记录
  289. CardIssue::whereIn('join_issue_card_main_id',$ids)->delete();
  290. // 同时删除卡记录
  291. Card::whereIn('join_card_main_id', $ids)->delete();
  292. Db::commit();
  293. _syslog("储值卡", '删除成功');
  294. return json_success('success');
  295. } catch (\Exception $e) {
  296. Db::rollBack();
  297. _syslog("储值次", '删除失败');
  298. Log::error("储值卡删除失败", ['msg' => $e->getMessage()]);
  299. return json_fail("删除失败");
  300. }
  301. }
  302. /**
  303. * @Desc 储值卡发行
  304. * @Author Gorden
  305. * @Date 2024/11/15 13:56
  306. *
  307. * @param Request $request
  308. * @return Response|void
  309. */
  310. // public function issue(Request $request)
  311. // {
  312. // $params = $request->post();
  313. //
  314. // Db::beginTransaction();
  315. // try {
  316. // $cardIds = [];
  317. // // 创建卡号
  318. // for ($i = 0; $i < intval($params['card_issue_num']); $i++) {
  319. // $prefixLength = strlen($params['card_issue_serial_prefix']);
  320. // $suffixLength = strlen($params['card_issue_serial_suffix']);
  321. // $cardIds[] = $params['card_issue_serial_prefix'] . str_pad($params['card_issue_serial_begin'] + $i, $params['card_issue_serial_length'] - $prefixLength - $suffixLength, '0', STR_PAD_LEFT) . $params['card_issue_serial_suffix'];
  322. //
  323. // }
  324. //
  325. // // 写入发行表
  326. // $issueId = CardIssue::insertGetId([
  327. // 'join_issue_card_main_id' => $params['join_issue_card_main_id'],
  328. // 'card_issue_name' => $params['card_issue_name'],
  329. // 'card_issue_num' => $params['card_issue_num'],
  330. // 'card_issue_datetime' => date('Y-m-d H:i:s'),
  331. // 'card_issue_serial_length' => $params['card_issue_serial_length'],
  332. // 'card_issue_serial_prefix' => $params['card_issue_serial_prefix'],
  333. // 'card_issue_serial_suffix' => $params['card_issue_serial_suffix'],
  334. // 'card_issue_serial_begin' => $params['card_issue_serial_begin'],
  335. // 'card_issue_serial_end' => $params['card_issue_serial_end'],
  336. // 'card_issue_serial_fill' => $params['card_issue_serial_fill'] ?? 0,
  337. // 'card_issue_begin_nbr' => $cardIds[0],
  338. // 'card_issue_end_nbr' => $cardIds[count($cardIds) - 1],
  339. // 'card_issue_creator_user_id' => JwtToken::getCurrentId(),
  340. // 'card_issue_addtimes' => time()
  341. // ]);
  342. // // 分批入库
  343. // $cardsCollect = collect($cardIds);
  344. // $chunks = $cardsCollect->chunk(200);
  345. // foreach ($chunks as $chunk) {
  346. // $insertData = [];
  347. // foreach ($chunk as $key => $item) {
  348. // $insertData[$key] = [
  349. // 'card_id' => $item,
  350. // 'join_card_main_id' => $params['join_issue_card_main_id'],
  351. // 'join_card_issue_id' => $issueId,
  352. // 'card_status' => 'INIT',
  353. // 'card_cdkey' => random_string(8, 'number'),
  354. // 'card_addtimes' => time()
  355. // ];
  356. // }
  357. //
  358. // Card::insert($insertData);
  359. // }
  360. //
  361. // Db::commit();
  362. // _syslog("储值卡", '发行成功', false, $request->all());
  363. // return json_success('success');
  364. // } catch (\Exception $e) {
  365. // Db::rollBack();
  366. // _syslog("储值卡", '发行失败', false, $request->all());
  367. // Log::error("储值卡发行失败", ['msg' => $e->getMessage()]);
  368. //
  369. // return json_fail("储值卡发行失败");
  370. // }
  371. // }
  372. }