GoodsService.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?php
  2. namespace app\admin\service\goods;
  3. use app\model\Goods;
  4. use app\model\GoodsDetail;
  5. use app\model\GoodsLabel;
  6. use app\model\GoodsRunning;
  7. use app\model\GoodsSku;
  8. use app\model\SysSerial;
  9. use support\Db;
  10. use support\exception\BusinessException;
  11. use support\Redis;
  12. use support\Request;
  13. use support\Response;
  14. class GoodsService
  15. {
  16. public static function select(Request $request, $classify = "GOODS")
  17. {
  18. $page = $request->get('page');
  19. $pageSize = $request->get('pageSize');
  20. $goodsName = $request->get('goods_name', '');
  21. $categoryId = $request->get('join_goods_category_id', null);
  22. $rows = Goods::with([
  23. 'category' => function ($query) {
  24. $query->select('category_id', 'category_name');
  25. },
  26. 'running' => function ($query) {
  27. $query->select('join_running_goods_id', 'goods_running_storage');
  28. },
  29. 'supplier' => function ($query) {
  30. $query->select('supplier_id','supplier_name');
  31. }
  32. ])->select('goods_id', 'join_goods_category_id','join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
  33. ->when($goodsName != '', function ($query) use ($goodsName) {
  34. $query->where(function ($q) use ($goodsName) {
  35. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  36. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  37. });
  38. })->when($categoryId != null, function ($query) use ($categoryId) {
  39. $query->where('join_goods_category_id', $categoryId);
  40. })
  41. ->where('goods_classify', $classify)
  42. ->orderBy('goods_addtimes', 'DESC')
  43. ->forPage($page, $pageSize)
  44. ->get()
  45. ->toArray();
  46. $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
  47. $query->where(function ($q) use ($goodsName) {
  48. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  49. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  50. });
  51. })->when($categoryId != null, function ($query) use ($categoryId) {
  52. $query->where('join_goods_category_id', $categoryId);
  53. })->where('goods_classify', $classify)->count();
  54. foreach ($rows as &$row) {
  55. $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
  56. }
  57. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  58. }
  59. /**
  60. * @Desc 商品详情
  61. * @Author Gorden
  62. * @Date 2024/3/28 10:25
  63. *
  64. * @param $goodsId
  65. * @return Response
  66. */
  67. public static function info($goodsId)
  68. {
  69. try {
  70. // 商品主表
  71. $main = Goods::where('goods_id', $goodsId)->first();
  72. if (!empty($main)) {
  73. $main = $main->toArray();
  74. $main['goods_sku_json'] = json_decode($main['goods_sku_json'], true);
  75. $main['specList'] = [];
  76. foreach ($main['goods_sku_json'] as $key => $sku) {
  77. $main['specList'][] = [
  78. 'label' => $key,
  79. 'tags' => $sku
  80. ];
  81. }
  82. } else {
  83. $main = [];
  84. }
  85. // 详情表
  86. $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first();
  87. if (!empty($detail)) {
  88. $detail = $detail->toArray();
  89. } else {
  90. $detail = [];
  91. }
  92. // 标签表
  93. $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first();
  94. if (!empty($label)) {
  95. $label = $label->toArray();
  96. } else {
  97. $label = [];
  98. }
  99. // Running表
  100. $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first();
  101. if (!empty($running)) {
  102. $running = $running->toArray();
  103. } else {
  104. $running = [];
  105. }
  106. // Sku表
  107. $skus = GoodsSku::where('join_sku_goods_id', $goodsId)->get();
  108. if (!empty($running)) {
  109. $skus = $skus->toArray();
  110. $submitList = [];
  111. foreach ($skus as $key => $sku) {
  112. $skuSpecsJson = json_decode($sku['goods_sku_specs_json'], true);
  113. $skuSpecs = '';
  114. $skuNameValue = [];
  115. $i = 1;
  116. foreach ($skuSpecsJson as $k => $item) {
  117. $skuSpecs = $skuSpecs . $item . ',';
  118. $skuNameKey = 'skuName' . $i;
  119. $skuValueKey = 'skuValue' . $i;
  120. $skuNameValue[$skuNameKey] = $k;
  121. $skuNameValue[$skuValueKey] = $item;
  122. $skuNameValue[$k] = $item;
  123. $i++;
  124. }
  125. $storage = json_decode($sku['goods_sku_storage_json'], true);
  126. $priceStorage = [
  127. 'sku' => rtrim($skuSpecs, ',') ?? '',
  128. 'stock' => $storage['storage'] ?? '',
  129. 'price' => $sku['goods_sku_sales_price'] ?? '',
  130. ];
  131. $submitList[] = array_merge($skuNameValue, $priceStorage);
  132. }
  133. $skus['submitList'] = $submitList;
  134. } else {
  135. $skus = [];
  136. }
  137. // 合并数据
  138. $data = array_merge($main, $detail, $label, $running, ['sku' => $skus]);
  139. $data['goods_sku_json_label'] = [];
  140. $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
  141. $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
  142. if (!empty($data['goods_detail_slider_json'])) {
  143. $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
  144. $slider = '';
  145. foreach ($data['goods_detail_slider_json'] as $item) {
  146. $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
  147. }
  148. $data['goods_detail_slider_json'] = rtrim($slider, ',');
  149. }
  150. $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
  151. return json_success('', $data);
  152. } catch (\Exception $e) {
  153. dump($e->getTrace());
  154. return json_fail("查询错误~");
  155. }
  156. }
  157. /**
  158. * @Desc 添加商品
  159. * @Author Gorden
  160. * @Date 2024/3/11 10:20
  161. *
  162. * @param $params
  163. * @return Response
  164. */
  165. public static function insert($params): Response
  166. {
  167. Db::beginTransaction();
  168. try {
  169. $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
  170. // 主表
  171. self::mainInsert($params);
  172. // 商品详情表
  173. self::detailInsert($params);
  174. // 商品标签表
  175. self::labelInsert($params);
  176. // 产品运行控制信息表
  177. self::goodsRunningInsert($params);
  178. // sku表
  179. self::goodsSkuSet($params, 'insert');
  180. // 待上架状态,上架时间大于当前时间
  181. if ($params['goods_status'] == 'PENDING' && strtotime($params['goods_on_addtimes']) > time()) {
  182. $redis = Redis::connection();
  183. $key = date('YmdHi', strtotime($params['goods_on_addtimes']));
  184. $redis->sAdd(Goods::LISTING_KEY_PREFIX . $key, $params['goods_id']);
  185. }
  186. Db::commit();
  187. } catch (\PDOException $e) {
  188. Db::rollBack();
  189. dump($e->getMessage());
  190. return json_fail('数据写入失败~');
  191. } catch (BusinessException $e) {
  192. Db::rollBack();
  193. dump($e->getMessage());
  194. return json_fail($e->getMessage());
  195. } catch (\Exception $e) {
  196. Db::rollBack();
  197. dump($e->getTrace());
  198. return json_fail('数据写入失败~');
  199. }
  200. return json_success('success');
  201. }
  202. public static function update($params)
  203. {
  204. Db::beginTransaction();
  205. try {
  206. // 主表
  207. self::mainUpdate($params);
  208. // 商品详情表
  209. self::detailUpdate($params);
  210. // 商品标签表
  211. self::labelUpdate($params);
  212. // 产品运行控制信息表
  213. self::goodsRunningUpdate($params);
  214. // sku表
  215. self::goodsSkuSet($params, 'update');
  216. Db::commit();
  217. } catch (BusinessException $e) {
  218. Db::rollBack();
  219. return json_fail($e->getMessage());
  220. } catch (\Exception $e) {
  221. Db::rollBack();
  222. return json_fail('数据更新失败~');
  223. }
  224. return json_success('success');
  225. }
  226. /**
  227. * @Desc 删除商品
  228. * @Author Gorden
  229. * @Date 2024/3/28 13:20
  230. *
  231. * @param $ids
  232. * @return Response
  233. */
  234. public static function delete($ids)
  235. {
  236. if (!$ids) {
  237. return json_fail("数据错误~");
  238. }
  239. if (!is_array($ids)) {
  240. $ids = [$ids];
  241. }
  242. Db::beginTransaction();
  243. try {
  244. Goods::whereIn('goods_id', $ids)->delete();
  245. GoodsDetail::whereIn('join_detail_goods_id', $ids)->delete();
  246. GoodsLabel::whereIn('join_label_goods_id', $ids)->delete();
  247. GoodsRunning::whereIn('join_running_goods_id', $ids)->delete();
  248. GoodsSku::whereIn('join_sku_goods_id', $ids)->delete();
  249. Db::commit();
  250. return json_success("商品删除成功");
  251. } catch (\Exception $e) {
  252. Db::rollBack();
  253. return json_fail("商品删除失败~");
  254. }
  255. }
  256. /**
  257. * @Desc 商品主表
  258. * @Author Gorden
  259. * @Date 2024/3/11 11:20
  260. *
  261. * @param $params
  262. * @return mixed|string
  263. * @throws BusinessException
  264. */
  265. public static function mainInsert($params)
  266. {
  267. if (!empty($params['goods_cover'])) {
  268. $params['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_cover']);
  269. }
  270. // 如果产品是待处理状态
  271. if ($params['goods_status'] == 'PENDING') {
  272. if (strtotime($params['goods_on_addtimes']) <= time()) {
  273. $params['goods_status'] = 'ON';
  274. }
  275. }
  276. try {
  277. $model = new Goods();
  278. $model->goods_id = $params['goods_id'];
  279. $model->join_goods_category_id = $params['join_goods_category_id'] ?? 0;
  280. $model->goods_classify = $params['goods_classify'] ?? '';
  281. $model->goods_status = $params['goods_status'] ?? '';
  282. $model->goods_category = $params['goods_category'] ?? '';
  283. $model->goods_prefix = $params['goods_prefix'] ?? '';
  284. $model->goods_name = $params['goods_name'];
  285. $model->goods_market_price = $params['goods_market_price'] ?? '';
  286. $model->goods_sales_price = $params['goods_sales_price'] ?? '';
  287. $model->goods_sku_json = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
  288. $model->goods_attribute_json = !empty($params['goods_attribute_json']) ? $params['goods_attribute_json'] : '{}';
  289. // $model->goods_service_json = !empty($params['goods_service_json']) ? $params['goods_service_json'] : '{}';
  290. $model->goods_title = $params['goods_title'] ?? '';
  291. $model->goods_cover = $params['goods_cover'] ?? '';
  292. $model->goods_on_addtimes = $params['goods_on_addtimes'] ? strtotime($params['goods_on_addtimes']) : null;
  293. $model->goods_sort = $params['goods_sort'] ?? null;
  294. $model->goods_groupby = $params['goods_groupby'] ?? '';
  295. $model->goods_remark = $params['goods_remark'] ?? '';
  296. $model->goods_extend_json = $params['goods_extend_json'] ?? '{}';
  297. $model->goods_addtimes = time();
  298. if ($model->save()) {
  299. return $model->goods_id;
  300. }
  301. // 异常
  302. throw new BusinessException("数据写入失败~");
  303. } catch (\Exception $e) {
  304. dump($e->getMessage());
  305. throw new BusinessException("数据写入失败~");
  306. }
  307. }
  308. /**
  309. * @Desc 详情表
  310. * @Author Gorden
  311. * @Date 2024/3/11 11:19
  312. *
  313. * @param $params
  314. * @return void
  315. * @throws BusinessException
  316. */
  317. public static function detailInsert($params)
  318. {
  319. if (!empty($params['goods_detail_slider_json'])) {
  320. $params['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_detail_slider_json']);
  321. $params['goods_detail_slider_json'] = json_encode(explode(',', $params['goods_detail_slider_json']));
  322. }
  323. try {
  324. $model = new GoodsDetail();
  325. $model->join_detail_goods_id = $params['goods_id'];
  326. $model->goods_detail_code_json = $params['goods_detail_code_json'] ?? '{}';
  327. $model->goods_detail_slider_json = $params['goods_detail_slider_json'] ?? '{}';
  328. $model->goods_detail_specs_json = $params['goods_detail_specs_json'] ?? '{}';
  329. $model->goods_detail_content = $params['goods_detail_content'] ?? '';
  330. if (!$model->save()) {
  331. // 异常
  332. throw new BusinessException("数据写入失败~");
  333. }
  334. } catch (\Exception $e) {
  335. dump($e->getMessage());
  336. throw new BusinessException("数据写入失败~");
  337. }
  338. }
  339. /**
  340. * @Desc 标签表
  341. * @Author Gorden
  342. * @Date 2024/3/11 11:32
  343. *
  344. * @param $params
  345. * @return void
  346. * @throws BusinessException
  347. */
  348. public static function labelInsert($params)
  349. {
  350. $model = new GoodsLabel();
  351. $model->join_label_goods_id = $params['goods_id'];
  352. $model->goods_label = $params['goods_label'] ? implode(',', $params['goods_label']) : '';
  353. $model->goods_label_extend_json = !empty($params['goods_label_extend_json']) ? $params['goods_label_extend_json'] : '{}';
  354. if (!$model->save()) {
  355. // 异常
  356. throw new BusinessException('数据写入失败~');
  357. }
  358. }
  359. /**
  360. * @Desc 产品运行控制信息表
  361. * @Author Gorden
  362. * @Date 2024/3/11 11:38
  363. *
  364. * @param $params
  365. * @return void
  366. * @throws BusinessException
  367. */
  368. public static function goodsRunningInsert($params)
  369. {
  370. try {
  371. $model = new GoodsRunning();
  372. $model->join_running_goods_id = $params['goods_id'];
  373. $model->goods_running_storage = $params['goods_running_storage'] ?? '';
  374. $model->goods_running_sale = $params['goods_running_sale'] ?? '';
  375. $model->goods_running_off_type = $params['goods_running_off_type'] ?? '';
  376. $model->goods_running_off_json = $params['goods_running_off_json'] ?? '{}';
  377. if (!$model->save()) {
  378. throw new BusinessException('数据写入失败');
  379. }
  380. } catch (\Exception $e) {
  381. dump($e->getMessage());
  382. throw new BusinessException('数据写入失败');
  383. }
  384. }
  385. /**
  386. * @Desc SKU
  387. * @Author Gorden
  388. * @Date 2024/3/11 12:01
  389. *
  390. * @param $params
  391. * @return void
  392. * @throws BusinessException
  393. */
  394. public static function skuInsert($params)
  395. {
  396. $model = new GoodsSku();
  397. $model->join_sku_goods_id = $params['goods_id'];
  398. $model->goods_sku_status = $params['goods_sku_status'];
  399. $model->goods_sku_specs_json = $params['goods_sku_specs_json'];
  400. $model->goods_sku_title = $params['goods_sku_title'];
  401. $model->goods_sku_images_json = $params['goods_sku_images_json'];
  402. $model->goods_sku_content = $params['goods_sku_content'];
  403. $model->goods_sku_market_price = $params['goods_sku_market_price'];
  404. $model->goods_sku_sales_price = $params['goods_sku_sales_price'];
  405. $model->goods_sku_storage_json = $params['goods_sku_storage_json'];
  406. $model->goods_sku_service_json = $params['goods_sku_service_json'];
  407. $model->goods_sku_extend_json = $params['goods_sku_extend_json'];
  408. if (!$model->save()) {
  409. throw new BusinessException('数据写入失败~');
  410. }
  411. }
  412. /**
  413. * @Desc
  414. * @Author Gorden
  415. * @Date 2024/3/12 8:44
  416. *
  417. * @param $params
  418. * @return void
  419. * @throws BusinessException
  420. */
  421. public static function mainUpdate($params)
  422. {
  423. try {
  424. $data = self::inputFilter($params, new Goods());
  425. if (!empty($data['goods_cover'])) {
  426. $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']);
  427. }
  428. $data['goods_on_addtimes'] = strtotime($data['goods_on_addtimes']);
  429. $data['goods_sku_json'] = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
  430. $row = Goods::find($data['goods_id']);
  431. // 上架时间有变动
  432. if ($data['goods_status'] == 'PENDING' && $row->goods_on_addtimes != $data['goods_on_addtimes']) {
  433. $redis = Redis::connection();
  434. // 删掉原来的
  435. $oldKey = Goods::LISTING_KEY_PREFIX . date('YmdHi', $row->goods_on_addtimes);
  436. $redis->srem($oldKey, $data['goods_id']);
  437. // 加入新的
  438. $newKey = Goods::LISTING_KEY_PREFIX . date('YmdHi', $data['goods_on_addtimes']);
  439. $redis->sadd($newKey, $data['goods_id']);
  440. }
  441. foreach ($data as $key => $val) {
  442. $row->{$key} = $val;
  443. }
  444. $row->save();
  445. } catch (BusinessException $e) {
  446. throw new BusinessException($e->getMessage());
  447. } catch (\Exception $e) {
  448. dump($e->getTrace());
  449. throw new BusinessException('数据更新异常~1');
  450. }
  451. }
  452. /**
  453. * @Desc
  454. * @Author Gorden
  455. * @Date 2024/3/12 9:57
  456. *
  457. * @param $params
  458. * @return void
  459. * @throws BusinessException
  460. */
  461. public static function detailUpdate($params)
  462. {
  463. try {
  464. $data = self::inputFilter($params, new GoodsDetail());
  465. if (!empty($data['goods_detail_slider_json'])) {
  466. $data['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_detail_slider_json']);
  467. $data['goods_detail_slider_json'] = json_encode(explode(',', $data['goods_detail_slider_json']));
  468. }
  469. // 根据goods_id 查详情ID
  470. $detail = GoodsDetail::where('join_detail_goods_id', $params['goods_id'])->first();
  471. if ($detail) {
  472. self::doUpdate($detail->join_detail_goods_id, $data, new GoodsDetail());
  473. }
  474. } catch (BusinessException $e) {
  475. throw new BusinessException($e->getMessage());
  476. } catch (\Exception $e) {
  477. dump($e->getMessage());
  478. throw new BusinessException('数据更新异常~2');
  479. }
  480. }
  481. /**
  482. * @Desc
  483. * @Author Gorden
  484. * @Date 2024/3/12 9:58
  485. *
  486. * @param $params
  487. * @return void
  488. * @throws BusinessException
  489. */
  490. public static function labelUpdate($params)
  491. {
  492. try {
  493. $data = self::inputFilter($params, new GoodsLabel());
  494. // 根据goods_id 查详情ID
  495. $detail = GoodsLabel::where('join_label_goods_id', $params['goods_id'])->first();
  496. if ($detail) {
  497. self::doUpdate($detail->goods_label_id, $data, new GoodsLabel());
  498. }
  499. } catch (BusinessException $e) {
  500. throw new BusinessException($e->getMessage());
  501. } catch (\Exception $e) {
  502. throw new BusinessException('数据更新异常~3');
  503. }
  504. }
  505. /**
  506. * @Desc
  507. * @Author Gorden
  508. * @Date 2024/3/12 9:59
  509. *
  510. * @param $params
  511. * @return void
  512. * @throws BusinessException
  513. */
  514. public static function goodsRunningUpdate($params)
  515. {
  516. try {
  517. $data = self::inputFilter($params, new GoodsRunning());
  518. // 根据goods_id 查详情ID
  519. $detail = GoodsRunning::where('join_running_goods_id', $params['goods_id'])->first();
  520. if ($detail) {
  521. self::doUpdate($detail->join_running_goods_id, $data, new GoodsRunning());
  522. }
  523. } catch (BusinessException $e) {
  524. throw new BusinessException($e->getMessage());
  525. } catch (\Exception $e) {
  526. dump($e->getMessage());
  527. throw new BusinessException('数据更新异常~4');
  528. }
  529. }
  530. /**
  531. * @Desc sku 设置
  532. * @Author Gorden
  533. * @Date 2024/4/10 10:43
  534. *
  535. * @param $params
  536. * @return void
  537. * @throws BusinessException
  538. */
  539. public static function goodsSkuSet($params, $operation = 'insert')
  540. {
  541. try {
  542. Db::beginTransaction();
  543. if ($operation == 'update') {
  544. // 删掉原有的
  545. GoodsSku::where('join_sku_goods_id', $params['goods_id'])->delete();
  546. }
  547. // 入新的
  548. if (!empty($params['goods_sku_json_value'])) {
  549. foreach ($params['goods_sku_json_value'] as $item) {
  550. $skus = explode(',', $item['sku']);
  551. $skuArr = [];
  552. for ($i = 1; $i <= count($skus); $i++) {
  553. $skuName = "skuName" . $i;
  554. $key = $item[$skuName];
  555. $skuArr[$key] = $skus[$i - 1];
  556. }
  557. $model = new GoodsSku();
  558. $model->join_sku_goods_id = $params['goods_id'];
  559. $model->goods_sku_status = $params['goods_status'];
  560. $model->goods_sku_specs_json = json_encode($skuArr);
  561. $model->goods_sku_title = str_replace('-', ',', $item['sku']) . $params['goods_name'];
  562. $model->goods_sku_market_price = $params['goods_market_price'];
  563. $model->goods_sku_sales_price = $item['price'];
  564. $model->goods_sku_storage_json = json_encode(['storage' => $item['stock']]);
  565. $model->save();
  566. }
  567. }
  568. Db::commit();
  569. } catch (\Exception $e) {
  570. Db::rollBack();
  571. throw new BusinessException('数据更新异常~5');
  572. }
  573. }
  574. /**
  575. * @Desc
  576. * @Author Gorden
  577. * @Date 2024/3/12 8:45
  578. *
  579. * @param array $data
  580. * @param $model
  581. * @return array
  582. * @throws BusinessException
  583. */
  584. private static function inputFilter(array $data, $model): array
  585. {
  586. $table = config('database.connections.mysql.prefix') . $model->getTable();
  587. $allow_column = $model->getConnection()->select("desc `$table`");
  588. if (!$allow_column) {
  589. throw new BusinessException('表不存在', 2);
  590. }
  591. $columns = array_column($allow_column, 'Type', 'Field');
  592. foreach ($data as $col => $item) {
  593. if (!isset($columns[$col])) {
  594. unset($data[$col]);
  595. continue;
  596. }
  597. // 非字符串类型传空则为null
  598. if ($item === '' && strpos(strtolower($columns[$col]), 'varchar') === false && strpos(strtolower($columns[$col]), 'text') === false) {
  599. $data[$col] = null;
  600. }
  601. if (is_array($item)) {
  602. $data[$col] = implode(',', $item);
  603. }
  604. if ($item != '' && (strpos(strtolower($columns[$col]), 'varchar') || strpos(strtolower($columns[$col]), 'text'))) {
  605. $data[$col] = htmlspecialchars($item);
  606. }
  607. }
  608. if (empty($data['created_at'])) {
  609. unset($data['created_at']);
  610. }
  611. if (empty($data['updated_at'])) {
  612. unset($data['updated_at']);
  613. }
  614. return $data;
  615. }
  616. /**
  617. * @Desc 执行更新
  618. * @Author Gorden
  619. * @Date 2024/3/12 8:43
  620. *
  621. * @param $id
  622. * @param $data
  623. * @param $model
  624. * @return void
  625. */
  626. private static function doUpdate($id, $data, $model)
  627. {
  628. $row = $model->find($id);
  629. foreach ($data as $key => $val) {
  630. $row->{$key} = $val;
  631. }
  632. $row->save();
  633. }
  634. /**
  635. * @Desc 上架定时
  636. * @Author Gorden
  637. * @Date 2024/4/11 15:13
  638. *
  639. * @return void
  640. */
  641. public static function checkListing()
  642. {
  643. $key = Goods::LISTING_KEY_PREFIX . date('YmdHi');
  644. $redis = Redis::connection();
  645. if ($redis->exists($key)) {
  646. $goodsIds = $redis->sMembers($key);
  647. if (Goods::whereIn('goods_id', $goodsIds)->update(['goods_status' => 'ON'])) {
  648. $redis->del($key);
  649. }
  650. }
  651. }
  652. }