GoodsService.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  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\Request;
  12. use support\Response;
  13. class GoodsService
  14. {
  15. public static function select($page, $pageSize, $keywords, $classify = "GOODS")
  16. {
  17. $rows = Goods::with([
  18. 'category' => function ($query) {
  19. $query->select('category_id', 'category_name');
  20. },
  21. 'running' => function ($query) {
  22. $query->select('join_running_goods_id', 'goods_running_storage');
  23. }
  24. ])->select('goods_id', 'join_goods_category_id', 'join_goods_device_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_cover', 'goods_sort', 'goods_addtimes')
  25. ->where('goods_classify', $classify)
  26. ->when($keywords != '', function ($query) use ($keywords) {
  27. $query->where('goods_name', 'like', '%' . $keywords . '%')
  28. ->orWhere('goods_title', 'like', '%', $keywords, '%');
  29. })
  30. ->orderBy('goods_sort', 'DESC')
  31. ->forPage($page, $pageSize)
  32. ->get()
  33. ->toArray();
  34. $total = Goods::when($keywords != '', function ($query) use ($keywords) {
  35. $query->where('goods_name', 'like', '%' . $keywords . '%')
  36. ->orWhere('goods_title', 'like', '%', $keywords, '%');
  37. })->where('goods_classify', $classify)->count();
  38. foreach ($rows as &$row) {
  39. $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
  40. }
  41. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  42. }
  43. /**
  44. * @Desc 商品详情
  45. * @Author Gorden
  46. * @Date 2024/3/28 10:25
  47. *
  48. * @param $goodsId
  49. * @return Response
  50. */
  51. public static function info($goodsId)
  52. {
  53. try {
  54. // 商品主表
  55. $main = Goods::where('goods_id', $goodsId)->first()->toArray();
  56. // 详情表
  57. $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first()->toArray();
  58. // 标签表
  59. $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first()->toArray();
  60. // Running表
  61. $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first()->toArray();
  62. // 合并数据
  63. $data = array_merge($main, $detail, $label, $running);
  64. $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : '';
  65. $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
  66. $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
  67. $slider = '';
  68. foreach ($data['goods_detail_slider_json'] as $item) {
  69. $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
  70. }
  71. $data['goods_detail_slider_json'] = rtrim($slider, ',');
  72. $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
  73. return json_success('', $data);
  74. } catch (\Exception $e) {
  75. return json_fail("查询错误~");
  76. }
  77. }
  78. /**
  79. * @Desc 添加商品
  80. * @Author Gorden
  81. * @Date 2024/3/11 10:20
  82. *
  83. * @param $params
  84. * @return Response
  85. */
  86. public static function insert($params): Response
  87. {
  88. Db::beginTransaction();
  89. try {
  90. $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(8);
  91. // 主表
  92. self::mainInsert($params);
  93. // 商品详情表
  94. self::detailInsert($params);
  95. // 商品标签表
  96. self::labelInsert($params);
  97. // 产品运行控制信息表
  98. self::goodsRunningInsert($params);
  99. Db::commit();
  100. } catch (\PDOException $e) {
  101. Db::rollBack();
  102. dump($e->getMessage());
  103. return json_fail('数据写入失败~');
  104. } catch (BusinessException $e) {
  105. Db::rollBack();
  106. return json_fail($e->getMessage());
  107. } catch (\Exception $e) {
  108. Db::rollBack();
  109. dump($e->getTrace());
  110. return json_fail('数据写入失败~');
  111. }
  112. return json_success('success');
  113. }
  114. public static function update($params)
  115. {
  116. Db::beginTransaction();
  117. try {
  118. // 主表
  119. self::mainUpdate($params);
  120. // 商品详情表
  121. self::detailUpdate($params);
  122. // 商品标签表
  123. self::labelUpdate($params);
  124. // 产品运行控制信息表
  125. self::goodsRunningUpdate($params);
  126. Db::commit();
  127. } catch (BusinessException $e) {
  128. Db::rollBack();
  129. return json_fail($e->getMessage());
  130. } catch (\Exception $e) {
  131. Db::rollBack();
  132. return json_fail('数据更新失败~');
  133. }
  134. return json_success('success');
  135. }
  136. /**
  137. * @Desc 删除商品
  138. * @Author Gorden
  139. * @Date 2024/3/28 13:20
  140. *
  141. * @param $ids
  142. * @return Response
  143. */
  144. public static function delete($ids)
  145. {
  146. if (!$ids) {
  147. return json_fail("数据错误~");
  148. }
  149. if (!is_array($ids)) {
  150. $ids = [$ids];
  151. }
  152. Db::beginTransaction();
  153. try {
  154. Goods::whereIn('goods_id', $ids)->delete();
  155. GoodsDetail::whereIn('join_detail_goods_id', $ids)->delete();
  156. GoodsLabel::whereIn('join_label_goods_id', $ids)->delete();
  157. GoodsRunning::whereIn('join_running_goods_id', $ids)->delete();
  158. Db::commit();
  159. return json_success("商品删除成功");
  160. } catch (\Exception $e) {
  161. Db::rollBack();
  162. return json_fail("商品删除失败~");
  163. }
  164. }
  165. /**
  166. * @Desc 商品主表
  167. * @Author Gorden
  168. * @Date 2024/3/11 11:20
  169. *
  170. * @param $params
  171. * @return mixed|string
  172. * @throws BusinessException
  173. */
  174. public static function mainInsert($params)
  175. {
  176. if (!empty($params['goods_cover'])) {
  177. $params['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_cover']);
  178. }
  179. try {
  180. $model = new Goods();
  181. $model->goods_id = $params['goods_id'];
  182. $model->join_goods_category_id = $params['join_goods_category_id'] ?? '';
  183. $model->goods_classify = $params['goods_classify'] ?? '';
  184. $model->goods_status = $params['goods_status'] ?? '';
  185. $model->goods_category = $params['goods_category'] ?? '';
  186. $model->goods_prefix = $params['goods_prefix'] ?? '';
  187. $model->goods_name = $params['goods_name'];
  188. $model->goods_market_price = $params['goods_market_price'] ?? '';
  189. $model->goods_sales_price = $params['goods_sales_price'] ?? '';
  190. $model->goods_sku_json = !empty($params['goods_sku_json']) ? $params['goods_sku_json'] : '{}';
  191. $model->goods_attribute_json = !empty($params['goods_attribute_json']) ? $params['goods_attribute_json'] : '{}';
  192. $model->goods_service_json = !empty($params['goods_service_json']) ? $params['goods_service_json'] : '{}';
  193. $model->goods_title = $params['goods_title'] ?? '';
  194. $model->goods_cover = $params['goods_cover'] ?? '';
  195. $model->goods_on_addtimes = $params['goods_on_addtimes'] ? strtotime($params['goods_on_addtimes']) : null;
  196. $model->goods_sort = $params['goods_sort'];
  197. $model->goods_groupby = $params['goods_groupby'] ?? '';
  198. $model->goods_remark = $params['goods_remark'] ?? '';
  199. $model->goods_extend_json = $params['goods_extend_json'] ?? '{}';
  200. $model->goods_addtimes = time();
  201. if ($model->save()) {
  202. return $model->goods_id;
  203. }
  204. // 异常
  205. throw new BusinessException("数据写入失败~");
  206. } catch (\Exception $e) {
  207. dump($e->getMessage());
  208. throw new BusinessException("数据写入失败~");
  209. }
  210. }
  211. /**
  212. * @Desc 详情表
  213. * @Author Gorden
  214. * @Date 2024/3/11 11:19
  215. *
  216. * @param $params
  217. * @return void
  218. * @throws BusinessException
  219. */
  220. public static function detailInsert($params)
  221. {
  222. if (!empty($params['goods_detail_slider_json'])) {
  223. $params['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_detail_slider_json']);
  224. $params['goods_detail_slider_json'] = json_encode(explode(',', $params['goods_detail_slider_json']));
  225. }
  226. try {
  227. $model = new GoodsDetail();
  228. $model->join_detail_goods_id = $params['goods_id'];
  229. $model->goods_detail_code_json = $params['goods_detail_code_json'] ?? '{}';
  230. $model->goods_detail_slider_json = $params['goods_detail_slider_json'] ?? '{}';
  231. $model->goods_detail_specs_json = $params['goods_detail_specs_json'] ?? '{}';
  232. $model->goods_detail_content = $params['goods_detail_content'] ?? '';
  233. if (!$model->save()) {
  234. // 异常
  235. throw new BusinessException("数据写入失败~");
  236. }
  237. } catch (\Exception $e) {
  238. dump($e->getMessage());
  239. throw new BusinessException("数据写入失败~");
  240. }
  241. }
  242. /**
  243. * @Desc 标签表
  244. * @Author Gorden
  245. * @Date 2024/3/11 11:32
  246. *
  247. * @param $params
  248. * @return void
  249. * @throws BusinessException
  250. */
  251. public static function labelInsert($params)
  252. {
  253. $model = new GoodsLabel();
  254. $model->join_label_goods_id = $params['goods_id'];
  255. $model->goods_label = $params['goods_label'] ? implode(',', $params['goods_label']) : '';
  256. $model->goods_label_extend_json = !empty($params['goods_label_extend_json']) ? $params['goods_label_extend_json'] : '{}';
  257. if (!$model->save()) {
  258. // 异常
  259. throw new BusinessException('数据写入失败~');
  260. }
  261. }
  262. /**
  263. * @Desc 产品运行控制信息表
  264. * @Author Gorden
  265. * @Date 2024/3/11 11:38
  266. *
  267. * @param $params
  268. * @return void
  269. * @throws BusinessException
  270. */
  271. public static function goodsRunningInsert($params)
  272. {
  273. try {
  274. $model = new GoodsRunning();
  275. $model->join_running_goods_id = $params['goods_id'];
  276. $model->goods_running_storage = $params['goods_running_storage'] ?? '';
  277. $model->goods_running_sale = $params['goods_running_sale'] ?? '';
  278. $model->goods_running_off_type = $params['goods_running_off_type'] ?? '';
  279. $model->goods_running_off_json = $params['goods_running_off_json'] ?? '{}';
  280. if (!$model->save()) {
  281. throw new BusinessException('数据写入失败');
  282. }
  283. } catch (\Exception $e) {
  284. dump($e->getMessage());
  285. throw new BusinessException('数据写入失败');
  286. }
  287. }
  288. /**
  289. * @Desc SKU
  290. * @Author Gorden
  291. * @Date 2024/3/11 12:01
  292. *
  293. * @param $params
  294. * @return void
  295. * @throws BusinessException
  296. */
  297. public static function skuInsert($params)
  298. {
  299. $model = new GoodsSku();
  300. $model->join_sku_goods_id = $params['goods_id'];
  301. $model->goods_sku_status = $params['goods_sku_status'];
  302. $model->goods_sku_specs_json = $params['goods_sku_specs_json'];
  303. $model->goods_sku_title = $params['goods_sku_title'];
  304. $model->goods_sku_images_json = $params['goods_sku_images_json'];
  305. $model->goods_sku_content = $params['goods_sku_content'];
  306. $model->goods_sku_market_price = $params['goods_sku_market_price'];
  307. $model->goods_sku_sales_price = $params['goods_sku_sales_price'];
  308. $model->goods_sku_storage_json = $params['goods_sku_storage_json'];
  309. $model->goods_sku_service_json = $params['goods_sku_service_json'];
  310. $model->goods_sku_extend_json = $params['goods_sku_extend_json'];
  311. if (!$model->save()) {
  312. throw new BusinessException('数据写入失败~');
  313. }
  314. }
  315. /**
  316. * @Desc
  317. * @Author Gorden
  318. * @Date 2024/3/12 8:44
  319. *
  320. * @param $params
  321. * @return void
  322. * @throws BusinessException
  323. */
  324. public static function mainUpdate($params)
  325. {
  326. try {
  327. $data = self::inputFilter($params, new Goods());
  328. if (!empty($data['goods_cover'])) {
  329. $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']);
  330. }
  331. $data['goods_on_addtimes'] = strtotime($data['goods_on_addtimes']);
  332. self::doUpdate($data['goods_id'], $data, new Goods());
  333. } catch (BusinessException $e) {
  334. throw new BusinessException($e->getMessage());
  335. } catch (\Exception $e) {
  336. throw new BusinessException('数据更新异常~1');
  337. }
  338. }
  339. /**
  340. * @Desc
  341. * @Author Gorden
  342. * @Date 2024/3/12 9:57
  343. *
  344. * @param $params
  345. * @return void
  346. * @throws BusinessException
  347. */
  348. public static function detailUpdate($params)
  349. {
  350. try {
  351. $data = self::inputFilter($params, new GoodsDetail());
  352. if (!empty($data['goods_detail_slider_json'])) {
  353. $data['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_detail_slider_json']);
  354. $data['goods_detail_slider_json'] = json_encode(explode(',', $data['goods_detail_slider_json']));
  355. }
  356. // 根据goods_id 查详情ID
  357. $detail = GoodsDetail::where('join_detail_goods_id', $params['goods_id'])->first();
  358. self::doUpdate($detail->goods_detail_id, $data, new GoodsDetail());
  359. } catch (BusinessException $e) {
  360. throw new BusinessException($e->getMessage());
  361. } catch (\Exception $e) {
  362. dump($e->getMessage());
  363. throw new BusinessException('数据更新异常~2');
  364. }
  365. }
  366. /**
  367. * @Desc
  368. * @Author Gorden
  369. * @Date 2024/3/12 9:58
  370. *
  371. * @param $params
  372. * @return void
  373. * @throws BusinessException
  374. */
  375. public static function labelUpdate($params)
  376. {
  377. try {
  378. $data = self::inputFilter($params, new GoodsLabel());
  379. // 根据goods_id 查详情ID
  380. $detail = GoodsLabel::where('join_label_goods_id', $params['goods_id'])->first();
  381. self::doUpdate($detail->goods_label_id, $data, new GoodsLabel());
  382. } catch (BusinessException $e) {
  383. throw new BusinessException($e->getMessage());
  384. } catch (\Exception $e) {
  385. throw new BusinessException('数据更新异常~3');
  386. }
  387. }
  388. /**
  389. * @Desc
  390. * @Author Gorden
  391. * @Date 2024/3/12 9:59
  392. *
  393. * @param $params
  394. * @return void
  395. * @throws BusinessException
  396. */
  397. public static function goodsRunningUpdate($params)
  398. {
  399. try {
  400. $data = self::inputFilter($params, new GoodsRunning());
  401. // 根据goods_id 查详情ID
  402. $detail = GoodsRunning::where('join_running_goods_id', $params['goods_id'])->first();
  403. self::doUpdate($detail->goods_running_id, $data, new GoodsRunning());
  404. } catch (BusinessException $e) {
  405. throw new BusinessException($e->getMessage());
  406. } catch (\Exception $e) {
  407. throw new BusinessException('数据更新异常~4');
  408. }
  409. }
  410. /**
  411. * @Desc
  412. * @Author Gorden
  413. * @Date 2024/3/12 8:45
  414. *
  415. * @param array $data
  416. * @param $model
  417. * @return array
  418. * @throws BusinessException
  419. */
  420. private static function inputFilter(array $data, $model): array
  421. {
  422. $table = config('database.connections.mysql.prefix') . $model->getTable();
  423. $allow_column = $model->getConnection()->select("desc `$table`");
  424. if (!$allow_column) {
  425. throw new BusinessException('表不存在', 2);
  426. }
  427. $columns = array_column($allow_column, 'Type', 'Field');
  428. foreach ($data as $col => $item) {
  429. if (!isset($columns[$col])) {
  430. unset($data[$col]);
  431. continue;
  432. }
  433. // 非字符串类型传空则为null
  434. if ($item === '' && strpos(strtolower($columns[$col]), 'varchar') === false && strpos(strtolower($columns[$col]), 'text') === false) {
  435. $data[$col] = null;
  436. }
  437. if (is_array($item)) {
  438. $data[$col] = implode(',', $item);
  439. }
  440. if ($item != '' && (strpos(strtolower($columns[$col]), 'varchar') || strpos(strtolower($columns[$col]), 'text'))) {
  441. $data[$col] = htmlspecialchars($item);
  442. }
  443. }
  444. if (empty($data['created_at'])) {
  445. unset($data['created_at']);
  446. }
  447. if (empty($data['updated_at'])) {
  448. unset($data['updated_at']);
  449. }
  450. return $data;
  451. }
  452. /**
  453. * @Desc 执行更新
  454. * @Author Gorden
  455. * @Date 2024/3/12 8:43
  456. *
  457. * @param $id
  458. * @param $data
  459. * @param $model
  460. * @return void
  461. */
  462. private static function doUpdate($id, $data, $model)
  463. {
  464. $row = $model->find($id);
  465. foreach ($data as $key => $val) {
  466. $row->{$key} = $val;
  467. }
  468. $row->save();
  469. }
  470. }