CardMainController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  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/15 11:33
  106. *
  107. * @param Request $request
  108. * @return Response
  109. */
  110. public function info(Request $request): Response
  111. {
  112. $cardMainId = $request->get('card_main_id');
  113. if (!$cardMainId) {
  114. return json_fail('参数异常');
  115. }
  116. // 发行记录
  117. $cardIssue = CardIssue::where('join_issue_card_main_id', $cardMainId)->orderBy('card_issue_addtimes', 'DESC')->get()->toArray();
  118. // 发行统计
  119. $cardTotal = Card::where('join_card_main_id', $cardMainId)->count();
  120. $cardInitTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'INIT')->count();
  121. $cardWaitingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'WAITING')->count();
  122. $cardPendingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PENDING')->count();
  123. $cardUsedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'USED')->count();
  124. $cardDoneTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'DONE')->count();
  125. $cardExpiredTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'EXPIRED')->count();
  126. $cardPausedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PAUSED')->count();
  127. $statistics = [
  128. [
  129. 'total' => $cardTotal,
  130. 'initTotal' => $cardInitTotal,
  131. 'waitingTotal' => $cardWaitingTotal,
  132. 'pendingTotal' => $cardPendingTotal,
  133. 'usedTotal' => $cardUsedTotal,
  134. 'doneTotal' => $cardDoneTotal,
  135. 'expiredTotal' => $cardExpiredTotal,
  136. 'pausedTotal' => $cardPausedTotal
  137. ]
  138. ];
  139. $data = [
  140. 'issue' => $cardIssue,
  141. 'statistics' => $statistics
  142. ];
  143. return json_success('', $data);
  144. }
  145. /**
  146. * @Desc 插入前置方法
  147. * @Author Gorden
  148. * @Date 2024/11/14 14:29
  149. *
  150. * @param Request $request
  151. * @return array
  152. * @throws BusinessException
  153. */
  154. public function insertInput(Request $request): array
  155. {
  156. $params = $request->post();
  157. $data = $this->inputFilter($request->post());
  158. if ($data['card_main_valid_mode'] == 'DATE') {
  159. $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin']));
  160. $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end']));
  161. $data['card_main_valid_days'] = 0;
  162. } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') {
  163. $data['card_main_valid_begin'] = '';
  164. $data['card_main_valid_end'] = '';
  165. }
  166. $cardMainJson = [
  167. 'desc' => $params['card_main_desc'] ?? [],
  168. 'is_recharge' => $params['is_recharge'] ?? 'N',
  169. 'issue' => $params['issue'] ?? 'BATCH',
  170. 'demand_config' => []
  171. ];
  172. if ($params['issue'] == 'DEMAND') {
  173. $cardMainJson['demand_config'] = [
  174. 'length' => $params['card_length'],
  175. 'begin' => $params['card_begin'],
  176. 'end' => $params['card_end'],
  177. 'prefix' => $params['card_prefix'],
  178. 'suffix' => $params['card_suffix'],
  179. 'rand' => $params['card_rand'],
  180. 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
  181. ];
  182. }
  183. $data['card_main_json'] = json_encode($cardMainJson);
  184. return $data;
  185. }
  186. /**
  187. * 更新前置方法
  188. * @param Request $request
  189. * @return array
  190. * @throws BusinessException
  191. */
  192. protected function updateInput(Request $request): array
  193. {
  194. $params = $request->post();
  195. $primary_key = $this->model->getKeyName();
  196. $id = $request->post($primary_key);
  197. $data = $this->inputFilter($request->post());
  198. $model = $this->model->find($id);
  199. if (!$model) {
  200. throw new BusinessException('记录不存在', 2);
  201. }
  202. if ($data['card_main_valid_mode'] == 'DATE') {
  203. $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin']));
  204. $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end']));
  205. $data['card_main_valid_days'] = 0;
  206. } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') {
  207. $data['card_main_valid_begin'] = '';
  208. $data['card_main_valid_end'] = '';
  209. }
  210. $cardMainJson = [];
  211. if (!empty($model->card_main_json)) {
  212. $cardMainJson = json_decode($model->card_main_json, true);
  213. }
  214. $cardMainJson['desc'] = $params['card_main_desc'] ?? [];
  215. if (!empty($params['is_recharge'])) {
  216. $cardMainJson['is_recharge'] = $params['is_recharge'];
  217. }
  218. if (!empty($params['issue'])) {
  219. $cardMainJson['issue'] = $params['issue'];
  220. }
  221. if ($cardMainJson['issue'] == 'BATCH') {
  222. $cardMainJson['demand_config'] = [];
  223. } elseif ($cardMainJson['issue'] == 'DEMAND') {
  224. $cardMainJson['demand_config'] = [
  225. 'length' => $params['card_length'],
  226. 'begin' => $params['card_begin'],
  227. 'end' => $params['card_end'],
  228. 'prefix' => $params['card_prefix'],
  229. 'suffix' => $params['card_suffix'],
  230. 'rand' => $params['card_rand'],
  231. 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING',
  232. ];
  233. }
  234. $data['card_main_json'] = json_encode($cardMainJson);
  235. unset($data[$primary_key]);
  236. return [$id, $data];
  237. }
  238. /**
  239. * @Desc 储值卡发行
  240. * @Author Gorden
  241. * @Date 2024/11/15 13:56
  242. *
  243. * @param Request $request
  244. * @return Response|void
  245. */
  246. public function issue(Request $request)
  247. {
  248. $params = $request->post();
  249. Db::beginTransaction();
  250. try {
  251. $cardIds = [];
  252. // 创建卡号
  253. for ($i = 0; $i < intval($params['card_issue_num']); $i++) {
  254. $prefixLength = strlen($params['card_issue_serial_prefix']);
  255. $suffixLength = strlen($params['card_issue_serial_suffix']);
  256. $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'];
  257. }
  258. // 写入发行表
  259. $issueId = CardIssue::insertGetId([
  260. 'join_issue_card_main_id' => $params['join_issue_card_main_id'],
  261. 'card_issue_name' => $params['card_issue_name'],
  262. 'card_issue_num' => $params['card_issue_num'],
  263. 'card_issue_datetime' => date('Y-m-d H:i:s'),
  264. 'card_issue_serial_length' => $params['card_issue_serial_length'],
  265. 'card_issue_serial_prefix' => $params['card_issue_serial_prefix'],
  266. 'card_issue_serial_suffix' => $params['card_issue_serial_suffix'],
  267. 'card_issue_serial_begin' => $params['card_issue_serial_begin'],
  268. 'card_issue_serial_end' => $params['card_issue_serial_end'],
  269. 'card_issue_serial_fill' => $params['card_issue_serial_fill'] ?? 0,
  270. 'card_issue_begin_nbr' => $cardIds[0],
  271. 'card_issue_end_nbr' => $cardIds[count($cardIds) - 1],
  272. 'card_issue_creator_user_id' => JwtToken::getCurrentId(),
  273. 'card_issue_addtimes' => time()
  274. ]);
  275. // 分批入库
  276. $cardsCollect = collect($cardIds);
  277. $chunks = $cardsCollect->chunk(200);
  278. foreach ($chunks as $chunk) {
  279. $insertData = [];
  280. foreach ($chunk as $key => $item) {
  281. $insertData[$key] = [
  282. 'card_id' => $item,
  283. 'join_card_main_id' => $params['join_issue_card_main_id'],
  284. 'join_card_issue_id' => $issueId,
  285. 'card_status' => 'INIT',
  286. 'card_cdkey' => random_string(8, 'number'),
  287. 'card_addtimes' => time()
  288. ];
  289. }
  290. Card::insert($insertData);
  291. }
  292. Db::commit();
  293. _syslog("储值卡", '发行成功', false, $request->all());
  294. return json_success('success');
  295. } catch (\Exception $e) {
  296. Db::rollBack();
  297. _syslog("储值卡", '发行失败', false, $request->all());
  298. Log::error("储值卡发行失败", ['msg' => $e->getMessage()]);
  299. return json_fail("储值卡发行失败");
  300. }
  301. }
  302. }