GoodsService.php 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665
  1. <?php
  2. namespace app\admin\service\goods;
  3. use app\model\Goods;
  4. use app\model\GoodsComponent;
  5. use app\model\GoodsDetail;
  6. use app\model\GoodsLabel;
  7. use app\model\GoodsRunning;
  8. use app\model\GoodsSku;
  9. use app\model\SysCategory;
  10. use app\model\SysSerial;
  11. use support\Db;
  12. use support\exception\BusinessException;
  13. use support\Redis;
  14. use support\Request;
  15. use support\Response;
  16. class GoodsService
  17. {
  18. public static function selectAll($goodsIds)
  19. {
  20. $goods = Goods::where('goods_status', 'ON')
  21. ->when($goodsIds != '', function ($query) use ($goodsIds) {
  22. $query->whereIn('goods_id', $goodsIds);
  23. })
  24. ->select('goods_id', 'goods_name')
  25. ->get();
  26. return json_success('', $goods);
  27. }
  28. public static function selectAllByCategoryForRuleAddComponent($category = "GOODS")
  29. {
  30. $categoryIds = [];
  31. if ($category == 'GOODS') {
  32. $categoryIds = [6, 7, 8, 10, 11, 12];
  33. } elseif ($category == 'SERVICE') {
  34. $categorySuperIds = [31, 43, 65, 30, 66, 72];
  35. $categorys = SysCategory::whereIn('category_id', $categorySuperIds)->get()->toArray();
  36. foreach ($categorys as $item) {
  37. if (empty($item['category_super_path'])) {
  38. $item['category_super_path'] = '#' . $item['category_id'] . '#';
  39. } else {
  40. $item['category_super_path'] = $item['category_super_path'] . '#' . $item['category_id'] . '#';
  41. }
  42. $categoryIds = SysCategory::where('category_super_path', 'like', '%' . $item['category_super_path'])->pluck('category_id');
  43. $categoryIds = $categoryIds ? $categoryIds->toArray() : [];
  44. $categorySuperIds = array_merge($categorySuperIds, $categoryIds);
  45. }
  46. $categoryIds = array_unique($categorySuperIds);
  47. }
  48. $goods = Goods::with('sku')
  49. // ->where('goods_classify', $category)
  50. ->when(!empty($categoryIds), function ($query) use ($categoryIds) {
  51. $query->whereIn('join_goods_category_id', $categoryIds);
  52. })->select('goods_id', 'goods_name', 'join_goods_category_id')
  53. ->get()
  54. ->toArray();
  55. foreach ($goods as &$good) {
  56. if (!empty($good['sku'])) {
  57. foreach ($good['sku'] as $key => $sku) {
  58. if (!empty($sku['goods_sku_specs_json'])) {
  59. $specsJson = json_decode($sku['goods_sku_specs_json'], true);
  60. $skuTitle = '';
  61. foreach ($specsJson as $item) {
  62. if (is_array($item)) {
  63. $item = implode(',', $item);
  64. }
  65. $skuTitle .= $item . '-';
  66. }
  67. $good['sku'][$key]['goods_sku_id'] = strval($good['sku'][$key]['goods_sku_id']);
  68. $good['sku'][$key]['goods_sku_title'] = rtrim($skuTitle, '-');
  69. }
  70. unset($good['sku'][$key]['goods_sku_specs_json'], $good['sku'][$key]['join_sku_goods_id']);
  71. }
  72. } else {
  73. $good['sku'] = [];
  74. }
  75. }
  76. return json_success('', $goods);
  77. }
  78. public static function select(Request $request, $classify = "GOODS")
  79. {
  80. $page = $request->get('page');
  81. $pageSize = $request->get('pageSize');
  82. $goodsName = $request->get('goods_name', '');
  83. $categoryId = $request->get('join_goods_category_id', null);
  84. $goodsCategory = $request->get('goods_category', null);
  85. if ($categoryId != null) {
  86. $categoryPath = SysCategory::where('category_id', $categoryId)->value('category_super_path');
  87. $categoryPath .= '#' . $categoryId . '#';
  88. $categoryIds = SysCategory::where('category_super_path', 'like', $categoryPath . '%')->pluck('category_id')->toArray();
  89. if (!empty($categoryIds)) {
  90. $categoryId = $categoryIds;
  91. } else {
  92. $categoryId = [$categoryId];
  93. }
  94. }
  95. $rows = Goods::with([
  96. 'category' => function ($query) {
  97. $query->select('category_id', 'category_name');
  98. },
  99. 'running' => function ($query) {
  100. $query->select('join_running_goods_id', 'goods_running_storage');
  101. },
  102. 'supplier' => function ($query) {
  103. $query->select('supplier_id', 'supplier_name');
  104. }
  105. ])->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')
  106. ->when($goodsName != '', function ($query) use ($goodsName) {
  107. $query->where(function ($q) use ($goodsName) {
  108. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  109. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  110. });
  111. })->when($categoryId != null, function ($query) use ($categoryId) {
  112. $query->whereIn('join_goods_category_id', $categoryId);
  113. })->when($goodsCategory != null, function ($query) use ($goodsCategory) {
  114. $query->where('goods_category', $goodsCategory);
  115. })
  116. ->when($classify != '', function ($query) use ($classify) {
  117. if ($classify == 'GOODS') {
  118. $query->whereIn('join_goods_category_id', ['6', '7', '8', '10', '11', '12']);
  119. } else {
  120. $query->where('goods_classify', $classify);
  121. }
  122. })
  123. ->orderBy('goods_addtimes', 'DESC')
  124. ->forPage($page, $pageSize)
  125. ->get()
  126. ->toArray();
  127. $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
  128. $query->where(function ($q) use ($goodsName) {
  129. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  130. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  131. });
  132. })->when($categoryId != null, function ($query) use ($categoryId) {
  133. $query->whereIn('join_goods_category_id', $categoryId);
  134. })->when($goodsCategory != null, function ($query) use ($goodsCategory) {
  135. $query->where('goods_category', $goodsCategory);
  136. })->when($classify != '', function ($query) use ($classify) {
  137. if ($classify == 'GOODS') {
  138. $query->whereIn('join_goods_category_id', ['6', '7', '8', '9', '10', '11', '12', '30']);
  139. } else {
  140. $query->where('goods_classify', $classify);
  141. }
  142. })
  143. ->count();
  144. foreach ($rows as &$row) {
  145. $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
  146. if (isset($row['running'])) {
  147. $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']);
  148. }
  149. }
  150. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  151. }
  152. public static function selectSpecial(Request $request)
  153. {
  154. $page = $request->get('page');
  155. $pageSize = $request->get('pageSize');
  156. $goodsName = $request->get('goods_name', '');
  157. $categoryId = $request->get('join_goods_category_id', null);
  158. if ($categoryId == null) {
  159. $categoryId = [65, 43];
  160. } elseif (is_string($categoryId)) {
  161. $categoryId = [$categoryId];
  162. }
  163. $rows = Goods::with([
  164. 'category' => function ($query) {
  165. $query->select('category_id', 'category_name');
  166. },
  167. 'running' => function ($query) {
  168. $query->select('join_running_goods_id', 'goods_running_storage');
  169. },
  170. 'supplier' => function ($query) {
  171. $query->select('supplier_id', 'supplier_name');
  172. }
  173. ])->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')
  174. ->when($goodsName != '', function ($query) use ($goodsName) {
  175. $query->where(function ($q) use ($goodsName) {
  176. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  177. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  178. });
  179. })->whereIn('join_goods_category_id', $categoryId)
  180. ->orderBy('goods_addtimes', 'DESC')
  181. ->forPage($page, $pageSize)
  182. ->get()
  183. ->toArray();
  184. $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
  185. $query->where(function ($q) use ($goodsName) {
  186. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  187. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  188. });
  189. })->whereIn('join_goods_category_id', $categoryId)->count();
  190. foreach ($rows as &$row) {
  191. $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
  192. if (isset($row['running'])) {
  193. $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']);
  194. }
  195. }
  196. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  197. }
  198. public static function selectPicking(Request $request)
  199. {
  200. $page = $request->get('page');
  201. $pageSize = $request->get('pageSize');
  202. $goodsName = $request->get('goods_name', '');
  203. $categorySuperId = $request->get('category_super_id', '');
  204. $categoryIds = $request->get('join_goods_category_id', []);
  205. if (!empty($categorySuperId) && is_array($categoryIds)) {
  206. $category = SysCategory::where('category_id', $categorySuperId)->first();
  207. if (empty($category->category_super_path)) {
  208. $category->category_super_path = '#' . $categorySuperId . '#';
  209. } else {
  210. $category->category_super_path = $category->category_super_path . '#' . $categorySuperId . '#';
  211. }
  212. $categoryIds = SysCategory::where('category_super_path', 'like', '%' . $category->category_super_path)->pluck('category_id');
  213. $categoryIds = $categoryIds ? $categoryIds->toArray() : [];
  214. $categoryIds = array_merge($categoryIds,[$categorySuperId]);
  215. } elseif (!is_array($categoryIds)) {
  216. $categoryIds = [$categoryIds];
  217. }
  218. $rows = Goods::with([
  219. 'category' => function ($query) {
  220. $query->select('category_id', 'category_name');
  221. },
  222. 'running' => function ($query) {
  223. $query->select('join_running_goods_id', 'goods_running_storage');
  224. },
  225. 'supplier' => function ($query) {
  226. $query->select('supplier_id', 'supplier_name');
  227. }
  228. ])->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')
  229. ->when($goodsName != '', function ($query) use ($goodsName) {
  230. $query->where(function ($q) use ($goodsName) {
  231. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  232. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  233. });
  234. })->whereIn('join_goods_category_id', $categoryIds)
  235. ->orderBy('goods_addtimes', 'DESC')
  236. ->forPage($page, $pageSize)
  237. ->get()
  238. ->toArray();
  239. $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
  240. $query->where(function ($q) use ($goodsName) {
  241. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  242. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  243. });
  244. })->whereIn('join_goods_category_id', $categoryIds)
  245. ->count();
  246. foreach ($rows as &$row) {
  247. $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
  248. if (isset($row['running'])) {
  249. $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']);
  250. }
  251. }
  252. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  253. }
  254. public static function selectPackage(Request $request)
  255. {
  256. $page = $request->get('page');
  257. $pageSize = $request->get('pageSize');
  258. $goodsName = $request->get('goods_name', '');
  259. $categoryId = $request->get('join_goods_category_id', null);
  260. $rows = Goods::with([
  261. 'category' => function ($query) {
  262. $query->select('category_id', 'category_name');
  263. },
  264. 'running' => function ($query) {
  265. $query->select('join_running_goods_id', 'goods_running_storage');
  266. },
  267. 'supplier' => function ($query) {
  268. $query->select('supplier_id', 'supplier_name');
  269. },
  270. ])->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')
  271. ->when($goodsName != '', function ($query) use ($goodsName) {
  272. $query->where(function ($q) use ($goodsName) {
  273. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  274. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  275. });
  276. })->when($categoryId != null, function ($query) use ($categoryId) {
  277. $query->where('join_goods_category_id', $categoryId);
  278. })
  279. ->where('goods_classify', 'PACKAGE')
  280. ->orderBy('goods_addtimes', 'DESC')
  281. ->forPage($page, $pageSize)
  282. ->get()
  283. ->toArray();
  284. $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
  285. $query->where(function ($q) use ($goodsName) {
  286. $q->where('goods_name', 'like', '%' . $goodsName . '%')
  287. ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
  288. });
  289. })->when($categoryId != null, function ($query) use ($categoryId) {
  290. $query->where('join_goods_category_id', $categoryId);
  291. })->where('goods_classify', 'PACKAGE')->count();
  292. foreach ($rows as &$row) {
  293. $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
  294. if (isset($row['running'])) {
  295. $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']);
  296. }
  297. // if (!empty($row['component'])) {
  298. // $ids = [];
  299. // $contentList = [];
  300. // foreach ($row['component'] as $component) {
  301. // $ids[] = $component['join_component_goods_id'];
  302. // $configJson = json_decode($component['goods_component_config_json'], true);
  303. // $contentList[] = [
  304. // 'goods_name' => $configJson['goods_name'] ?? '',
  305. // 'goods_sales_price' => $component['goods_component_price'],
  306. // 'nbr' => $configJson['nbr'] ?? 0
  307. // ];
  308. // }
  309. //
  310. // $row['join_component_goods_id'] = $ids;
  311. // $row['goodsContentList'] = $contentList;
  312. // }
  313. }
  314. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  315. }
  316. /**
  317. * @Desc 下拉选择服务商品
  318. * @Author Gorden
  319. * @Date 2024/4/24 13:32
  320. *
  321. * @param Request $request
  322. * @return Response
  323. */
  324. public static function selectList(Request $request, $goodsClassify = "SERVICE")
  325. {
  326. $keywords = $request->get('keywords', '');
  327. // if (!$keywords){
  328. // return json_success('暂无数据');
  329. // }
  330. // $categoryIds = SysCategory::whereIn('category_super_id', [5, 31, 32, 42, 66, 70, 72])->pluck('category_id');
  331. $goods = Goods::with('sku')
  332. // ->whereIn('join_goods_category_id', $categoryIds)
  333. ->when($keywords != '', function ($query) use ($keywords) {
  334. $query->where('goods_name', 'like', "%" . $keywords . "%");
  335. })
  336. ->select('goods_id', 'goods_name', 'goods_sales_price', 'join_goods_category_id')
  337. ->get()
  338. ->toArray();
  339. foreach ($goods as &$good) {
  340. if (!empty($good['sku'])) {
  341. foreach ($good['sku'] as $key => $sku) {
  342. if (!empty($sku['goods_sku_specs_json'])) {
  343. $good['sku'][$key]['goods_sku_specs_json'] = json_decode($sku['goods_sku_specs_json']);
  344. $skuName = '';
  345. foreach ($good['sku'][$key]['goods_sku_specs_json'] as $specsKey => $skuSpecs) {
  346. if (is_array($skuSpecs)) {
  347. $skuName = $skuName . ' ' . $specsKey . ' ' . implode(' ', $skuSpecs);
  348. } else {
  349. $skuName = $skuName . ' ' . $specsKey . ' ' . $skuSpecs;
  350. }
  351. }
  352. $good['sku'][$key]['sku_name'] = $skuName;
  353. }
  354. }
  355. } else {
  356. $good['sku'] = [];
  357. }
  358. }
  359. return json_success('', $goods);
  360. }
  361. /**
  362. * @Desc 商品详情
  363. * @Author Gorden
  364. * @Date 2024/3/28 10:25
  365. *
  366. * @param $goodsId
  367. * @return Response
  368. */
  369. public static function info($goodsId)
  370. {
  371. try {
  372. // 商品主表
  373. $main = Goods::where('goods_id', $goodsId)->first();
  374. if (!empty($main)) {
  375. $main = $main->toArray();
  376. $main['goods_sku_json'] = json_decode($main['goods_sku_json'], true);
  377. $main['specList'] = [];
  378. foreach ($main['goods_sku_json'] as $key => $sku) {
  379. $main['specList'][] = [
  380. 'label' => $key,
  381. 'tags' => $sku
  382. ];
  383. }
  384. } else {
  385. $main = [];
  386. }
  387. // 详情表
  388. $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first();
  389. if (!empty($detail)) {
  390. $detail = $detail->toArray();
  391. } else {
  392. $detail = [];
  393. }
  394. // 标签表
  395. $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first();
  396. if (!empty($label)) {
  397. $label = $label->toArray();
  398. } else {
  399. $label = [];
  400. }
  401. // Running表
  402. $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first();
  403. if (!empty($running)) {
  404. $running = $running->toArray();
  405. if (!empty($running['goods_running_off_json']) && is_json($running['goods_running_off_json'])) {
  406. $goodsRunningOffJson = json_decode($running['goods_running_off_json'], true);
  407. $running['goods_off_addtimes'] = isset($goodsRunningOffJson['time']) ? date("Y-m-d H:i", $goodsRunningOffJson['time']) : '';
  408. }
  409. } else {
  410. $running = [];
  411. }
  412. // Sku表
  413. $skus = GoodsSku::where('join_sku_goods_id', $goodsId)->get();
  414. if (!empty($skus)) {
  415. $skus = $skus->toArray();
  416. $submitList = [];
  417. foreach ($skus as $key => $sku) {
  418. $skuSpecsJson = json_decode($sku['goods_sku_specs_json'], true);
  419. $skuSpecs = '';
  420. $skuNameValue = [];
  421. $i = 1;
  422. foreach ($skuSpecsJson as $k => $item) {
  423. if (is_array($item)) {
  424. $item = implode(',', $item);
  425. }
  426. $skuSpecs = $skuSpecs . $item . ',';
  427. $skuNameKey = 'skuName' . $i;
  428. $skuValueKey = 'skuValue' . $i;
  429. $skuNameValue[$skuNameKey] = $k;
  430. $skuNameValue[$skuValueKey] = $item;
  431. $skuNameValue[$k] = $item;
  432. $i++;
  433. }
  434. $storage = json_decode($sku['goods_sku_storage_json'], true);
  435. $priceStorage = [
  436. 'sku_id' => $sku['goods_sku_id'],
  437. 'sku' => rtrim($skuSpecs, ',') ?? '',
  438. 'stock' => $storage['storage'] ?? '',
  439. 'price' => $sku['goods_sku_sales_price'] ?? '',
  440. ];
  441. $submitList[] = array_merge($skuNameValue, $priceStorage);
  442. }
  443. $skus['submitList'] = $submitList;
  444. } else {
  445. $skus = [];
  446. }
  447. // 合并数据
  448. $data = array_merge($main, $detail, $label, $running, ['sku' => $skus]);
  449. $data['goods_sku_json_label'] = [];
  450. $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
  451. $data['goods_json'] = $data['goods_json'] ? json_decode($data['goods_json'], true) : [];
  452. $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
  453. if (!empty($data['goods_detail_slider_json'])) {
  454. $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
  455. // ……
  456. if (isset($data['goods_detail_slider_json']['slider'])) {
  457. $data['goods_detail_slider_json'] = explode(',', $data['goods_detail_slider_json']['slider']);
  458. }
  459. $slider = '';
  460. foreach ($data['goods_detail_slider_json'] as $item) {
  461. $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
  462. }
  463. $data['goods_detail_slider_json'] = rtrim($slider, ',');
  464. }
  465. $extendJson = [];
  466. if (!empty($data['goods_attribute_json'])) {
  467. $extendJson = json_decode($data['goods_attribute_json'], true);
  468. $data['goods_attribute_json'] = $extendJson;
  469. }
  470. $data['appointment_times'] = [];
  471. if ($data['is_support_appointment'] == 'Y' && isset($extendJson['dates'])) {
  472. $data['dates'] = $extendJson['dates'] ?? [];
  473. if (isset($extendJson['times'])) {
  474. $times = [];
  475. foreach ($extendJson['times'] as $time) {
  476. if (!empty($time['duration'])) {
  477. $startEndTime = explode('-', $time['duration']);
  478. $times[] = [
  479. 'person' => $time['person'],
  480. 'appointmentTimeStart' => $startEndTime[0],
  481. 'appointmentTimeEnd' => $startEndTime[1],
  482. ];
  483. }
  484. }
  485. $data['appointment_times'] = $times;
  486. }
  487. if (isset($extendJson['address'])) {
  488. $data['address'] = $extendJson['address'];
  489. }
  490. if (isset($extendJson['position'])) {
  491. $data['position'] = $extendJson['position'];
  492. }
  493. if (isset($extendJson['label'])) {
  494. $data['appointment_label'] = $extendJson['label'];
  495. }
  496. }
  497. if (!empty($data['goods_json']) && $data['join_goods_category_id'] == 65) {
  498. foreach ($data['goods_json'] as $key => $datum) {
  499. $data['goods_json'][$key]['color'] = rgbToHex($datum['color']);
  500. }
  501. } elseif (!empty($data['goods_json']) && $data['join_goods_category_id'] == 43) {
  502. $goodsJsonNew = [];
  503. foreach ($data['goods_json'] as $key1 => $item1) {
  504. $itemsNew = [];
  505. if (isset($item1['items'])) {
  506. foreach ($item1['items'] as $key2 => $item2) {
  507. $itemsNew[] = [
  508. 'key' => $key2,
  509. 'params' => $item2
  510. ];
  511. }
  512. }
  513. $goodsJsonNew[] = [
  514. 'title' => $key1,
  515. 'service' => $item1['service'] ?? '',
  516. 'items' => $itemsNew
  517. ];
  518. }
  519. $data['goods_json'] = $goodsJsonNew;
  520. }
  521. $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
  522. return json_success('', $data);
  523. } catch (\Exception $e) {
  524. dump($e->getMessage());
  525. return json_fail("查询错误~");
  526. }
  527. }
  528. public static function infoPackage($goodsId)
  529. {
  530. try {
  531. // 商品主表
  532. $main = Goods::where('goods_id', $goodsId)->first();
  533. if (!empty($main)) {
  534. $main = $main->toArray();
  535. $main['goods_sku_json'] = json_decode($main['goods_sku_json'], true);
  536. $main['specList'] = [];
  537. foreach ($main['goods_sku_json'] as $key => $sku) {
  538. $main['specList'][] = [
  539. 'label' => $key,
  540. 'tags' => $sku
  541. ];
  542. }
  543. } else {
  544. $main = [];
  545. }
  546. // 详情表
  547. $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first();
  548. if (!empty($detail)) {
  549. $detail = $detail->toArray();
  550. } else {
  551. $detail = [];
  552. }
  553. // 标签表
  554. $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first();
  555. if (!empty($label)) {
  556. $label = $label->toArray();
  557. } else {
  558. $label = [];
  559. }
  560. // Running表
  561. $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first();
  562. if (!empty($running)) {
  563. $running = $running->toArray();
  564. if (!empty($running['goods_running_off_json']) && is_json($running['goods_running_off_json'])) {
  565. $goodsRunningOffJson = json_decode($running['goods_running_off_json'], true);
  566. $running['goods_off_addtimes'] = isset($goodsRunningOffJson['time']) ? date("Y-m-d H:i", $goodsRunningOffJson['time']) : '';
  567. }
  568. } else {
  569. $running = [];
  570. }
  571. // 组件表
  572. $component = GoodsComponent::where('join_component_master_goods_id', $goodsId)->get()->toArray();
  573. $componentArr['join_component_goods_id'] = [];
  574. $componentArr['goodsContentList'] = [];
  575. if ($component) {
  576. $ids = [];
  577. $contentList = [];
  578. foreach ($component as $item) {
  579. if (empty($item['join_component_goods_id'])) {
  580. continue;
  581. }
  582. $skus = GoodsSku::where('join_sku_goods_id', $item['join_component_goods_id'])
  583. ->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price')
  584. ->get()
  585. ->toArray();
  586. foreach ($skus as $key => $sku2) {
  587. if (!empty($sku2['goods_sku_specs_json'])) {
  588. $skus[$key]['goods_sku_specs_json'] = json_decode($sku2['goods_sku_specs_json'], true);
  589. $skuName = '';
  590. foreach ($skus[$key]['goods_sku_specs_json'] as $specsKey => $skuSpecs) {
  591. if (is_array($skuSpecs)) {
  592. $skuName = $skuName . ' ' . $specsKey . ' ' . implode(' ', $skuSpecs);
  593. } else {
  594. $skuName = $skuName . ' ' . $specsKey . ' ' . $skuSpecs;
  595. }
  596. }
  597. $skus[$key]['sku_name'] = $skuName;
  598. }
  599. }
  600. $ids[] = $item['join_component_goods_id'];
  601. $configJson = json_decode($item['goods_component_json'], true);
  602. $contentList[] = [
  603. 'goods_id' => $item['join_component_goods_id'],
  604. 'goods_name' => $configJson['goods_name'] ?? '',
  605. 'goods_sales_price' => $item['goods_component_price'],
  606. 'nbr' => $configJson['nbr'] ?? 0,
  607. 'sku_id' => $configJson['sku_id'] ?? '',
  608. 'skus' => $skus
  609. ];
  610. }
  611. $componentArr['join_component_goods_id'] = $ids;
  612. $componentArr['goodsContentList'] = $contentList;
  613. }
  614. // 合并数据
  615. $data = array_merge($main, $detail, $label, $running, $componentArr);
  616. $data['goods_sku_json_label'] = [];
  617. $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
  618. $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
  619. if (!empty($data['goods_detail_slider_json'])) {
  620. $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
  621. $slider = '';
  622. foreach ($data['goods_detail_slider_json'] as $item) {
  623. $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
  624. }
  625. $data['goods_detail_slider_json'] = rtrim($slider, ',');
  626. }
  627. $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
  628. return json_success('', $data);
  629. } catch (\Exception $e) {
  630. dump($e->getTrace());
  631. return json_fail("查询错误~");
  632. }
  633. }
  634. /**
  635. * @Desc 添加商品
  636. * @Author Gorden
  637. * @Date 2024/3/11 10:20
  638. *
  639. * @param $params
  640. * @return Response
  641. */
  642. public static function insert($params): Response
  643. {
  644. Db::beginTransaction();
  645. try {
  646. $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
  647. // 主表
  648. self::mainInsert($params);
  649. // 商品详情表
  650. self::detailInsert($params);
  651. // 商品标签表
  652. self::labelInsert($params);
  653. // 产品运行控制信息表
  654. self::goodsRunningInsert($params);
  655. // sku表
  656. self::goodsSkuSet($params, 'insert');
  657. // 待上架状态,上架时间大于当前时间
  658. if ($params['goods_status'] == 'PENDING' && strtotime($params['goods_on_addtimes']) > time()) {
  659. $redis = Redis::connection();
  660. $key = date('YmdHi', strtotime($params['goods_on_addtimes']));
  661. $redis->sAdd(Goods::LISTING_KEY_PREFIX . $key, $params['goods_id']);
  662. }
  663. // 自动下架
  664. if (!empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T' && !empty($params['goods_off_addtimes'])) {
  665. $redis = Redis::connection();
  666. $key = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', strtotime($params['goods_off_addtimes']));
  667. $redis->sAdd($key, $params['goods_id']);
  668. }
  669. Db::commit();
  670. } catch (\PDOException $e) {
  671. Db::rollBack();
  672. dump($e->getMessage());
  673. return json_fail('数据写入失败~');
  674. } catch (BusinessException $e) {
  675. Db::rollBack();
  676. dump($e->getMessage());
  677. return json_fail($e->getMessage());
  678. } catch (\Exception $e) {
  679. Db::rollBack();
  680. dump($e->getTrace());
  681. return json_fail('数据写入失败~');
  682. }
  683. _syslog("添加商品", "商品名【" . $params['goods_name'] . "】");
  684. return json_success('success');
  685. }
  686. public static function insertPackage($params): Response
  687. {
  688. Db::beginTransaction();
  689. try {
  690. $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
  691. // 主表
  692. self::mainInsert($params);
  693. // 商品详情表
  694. self::detailInsert($params);
  695. // 套包组件表
  696. self::componentUpdate($params, 'insert');
  697. // 商品标签表
  698. self::labelInsert($params);
  699. // 产品运行控制信息表
  700. self::goodsRunningInsert($params);
  701. // sku表
  702. self::goodsSkuSet($params, 'insert');
  703. // 待上架状态,上架时间大于当前时间
  704. if ($params['goods_status'] == 'PENDING' && strtotime($params['goods_on_addtimes']) > time()) {
  705. $redis = Redis::connection();
  706. $key = date('YmdHi', strtotime($params['goods_on_addtimes']));
  707. $redis->sAdd(Goods::LISTING_KEY_PREFIX . $key, $params['goods_id']);
  708. }
  709. Db::commit();
  710. } catch (\PDOException $e) {
  711. Db::rollBack();
  712. dump($e->getMessage());
  713. return json_fail('数据写入失败~');
  714. } catch (BusinessException $e) {
  715. Db::rollBack();
  716. dump($e->getMessage());
  717. return json_fail($e->getMessage());
  718. } catch (\Exception $e) {
  719. Db::rollBack();
  720. dump($e->getTrace());
  721. return json_fail('数据写入失败~');
  722. }
  723. _syslog("添加套餐", "商品名【" . $params['goods_name'] . "】");
  724. return json_success('success');
  725. }
  726. public static function update($params)
  727. {
  728. Db::beginTransaction();
  729. try {
  730. // 主表
  731. self::mainUpdate($params);
  732. // 商品详情表
  733. self::detailUpdate($params);
  734. // 商品标签表
  735. self::labelUpdate($params);
  736. // 产品运行控制信息表
  737. self::goodsRunningUpdate($params);
  738. // sku表
  739. self::goodsSkuSet($params, 'update');
  740. Db::commit();
  741. } catch (BusinessException $e) {
  742. Db::rollBack();
  743. return json_fail($e->getMessage());
  744. } catch (\Exception $e) {
  745. Db::rollBack();
  746. return json_fail('数据更新失败~');
  747. }
  748. _syslog("编辑商品", "商品名【" . $params['goods_name'] . "】" ?? "商品ID:【" . $params['goods_id'] . "】");
  749. return json_success('success');
  750. }
  751. public static function changeStatus($params)
  752. {
  753. try {
  754. Goods::where('goods_id', $params['goods_id'])->update(['goods_status' => $params['goods_status']]);
  755. return json_success('修改成功');
  756. } catch (\Exception $e) {
  757. return json_fail('修改状态失败');
  758. }
  759. }
  760. public static function updatePackage($params)
  761. {
  762. Db::beginTransaction();
  763. try {
  764. // 主表
  765. self::mainUpdate($params);
  766. // 商品详情表
  767. self::detailUpdate($params);
  768. // 套包组件表
  769. self::componentUpdate($params, 'update');
  770. // 商品标签表
  771. self::labelUpdate($params);
  772. // 产品运行控制信息表
  773. self::goodsRunningUpdate($params);
  774. Db::commit();
  775. } catch (BusinessException $e) {
  776. Db::rollBack();
  777. return json_fail($e->getMessage());
  778. } catch (\Exception $e) {
  779. Db::rollBack();
  780. dump($e->getTrace());
  781. return json_fail('数据更新失败~');
  782. }
  783. _syslog("编辑套餐", "商品名【" . $params['goods_name'] . "】" ?? "商品ID:【" . $params['goods_id'] . "】");
  784. return json_success('success');
  785. }
  786. /**
  787. * @Desc 删除商品
  788. * @Author Gorden
  789. * @Date 2024/3/28 13:20
  790. *
  791. * @param $ids
  792. * @return Response
  793. */
  794. public static function delete($ids)
  795. {
  796. if (!$ids) {
  797. return json_fail("数据错误~");
  798. }
  799. if (!is_array($ids)) {
  800. $ids = [$ids];
  801. }
  802. $goods = Goods::whereIn('goods_id', $ids)->get()->toArray();
  803. if (!$goods) {
  804. return json_fail("数据错误~");
  805. }
  806. Db::beginTransaction();
  807. try {
  808. Goods::whereIn('goods_id', $ids)->delete();
  809. GoodsDetail::whereIn('join_detail_goods_id', $ids)->delete();
  810. GoodsLabel::whereIn('join_label_goods_id', $ids)->delete();
  811. GoodsRunning::whereIn('join_running_goods_id', $ids)->delete();
  812. GoodsSku::whereIn('join_sku_goods_id', $ids)->delete();
  813. Db::commit();
  814. _syslog("删除商品 / 套餐", "ID:【" . implode(',', $ids) . "】", $goods);
  815. return json_success("商品删除成功");
  816. } catch (\Exception $e) {
  817. Db::rollBack();
  818. return json_fail("商品删除失败~");
  819. }
  820. }
  821. /**
  822. * @Desc 商品主表
  823. * @Author Gorden
  824. * @Date 2024/3/11 11:20
  825. *
  826. * @param $params
  827. * @return mixed|string
  828. * @throws BusinessException
  829. */
  830. public static function mainInsert($params)
  831. {
  832. if (!empty($params['goods_cover'])) {
  833. $params['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_cover']);
  834. }
  835. // 如果产品是待处理状态
  836. if ($params['goods_status'] == 'PENDING') {
  837. if (strtotime($params['goods_on_addtimes']) <= time()) {
  838. $params['goods_status'] = 'ON';
  839. }
  840. }
  841. $category = SysCategory::where('category_id', $params['join_goods_category_id'])->first();
  842. if (!$category) {
  843. throw new BusinessException("产品分类不存在~");
  844. }
  845. if (empty($params['goods_category'])) {
  846. $params['goods_category'] = $category->category_classify;
  847. }
  848. try {
  849. $model = new Goods();
  850. $model->goods_id = $params['goods_id'];
  851. $model->join_goods_category_id = $params['join_goods_category_id'] ?? 0;
  852. $model->join_goods_supplier_id = $params['join_goods_supplier_id'] ?? 0;
  853. $model->goods_classify = $params['goods_classify'] ?? '';
  854. $model->goods_status = $params['goods_status'] ?? '';
  855. $model->goods_category = $params['goods_category'] ?? '';
  856. $model->goods_prefix = $params['goods_prefix'] ?? ($category->category_name ? '【' . $category->category_name . '】' : '');
  857. $model->goods_name = $params['goods_name'];
  858. $model->goods_market_price = $params['goods_market_price'] ?? 0;
  859. $model->goods_sales_price = $params['goods_sales_price'] ?? 0;
  860. $model->goods_sku_json = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
  861. $model->goods_attribute_json = !empty($params['goods_attribute_json']) ? $params['goods_attribute_json'] : '{}';
  862. // $model->goods_service_json = !empty($params['goods_service_json']) ? $params['goods_service_json'] : '{}';
  863. $model->goods_title = $params['goods_title'] ?? '';
  864. $model->goods_cover = $params['goods_cover'] ?? '';
  865. $model->goods_on_addtimes = isset($params['goods_on_addtimes']) ? strtotime($params['goods_on_addtimes']) : null;
  866. $model->goods_sort = $params['goods_sort'] ?? null;
  867. $model->goods_groupby = $params['goods_groupby'] ?? '';
  868. $model->goods_remark = $params['goods_remark'] ?? '';
  869. $model->goods_extend_json = $params['goods_extend_json'] ?? '{}';
  870. $model->is_support_appointment = $params['is_support_appointment'] ?? 'N';
  871. $model->goods_addtimes = time();
  872. if (!empty($params['is_support_appointment']) && $params['is_support_appointment'] == 'Y' && !empty($params['appointment_times'])) {
  873. $times = [];
  874. $attributeJsonTimeArr = [];
  875. $personTotal = 0;
  876. foreach ($params['appointment_times'] as $time) {
  877. $attributeJsonTimeArr[] = strtotime(date('Y-m-d ') . $time['appointmentTimeStart']);
  878. $attributeJsonTimeArr[] = strtotime(date('Y-m-d ') . $time['appointmentTimeEnd']);
  879. $personTotal += $time['person'];
  880. $times[$time['appointmentTimeStart']] = [
  881. 'person' => $time['person'],
  882. 'duration' => $time['appointmentTimeStart'] . '-' . $time['appointmentTimeEnd']
  883. ];
  884. }
  885. $attributeJsonTime = date('H:i', min($attributeJsonTimeArr)) . '至' . date('H:i', max($attributeJsonTimeArr));
  886. $newDates = [];
  887. foreach ($params['dates'] as $date) {
  888. $key = self::$week[$date];
  889. $newDates[$key] = $date;
  890. }
  891. ksort($newDates);
  892. $currentDate = current($newDates);
  893. $lastDate = end($newDates);
  894. $attributeJsonDate = '';
  895. if (self::$week[$lastDate] - self::$week[$currentDate] + 1 > count($newDates)) {
  896. $attributeJsonDate = implode(',', $newDates);
  897. } else if (self::$week[$lastDate] - self::$week[$currentDate] + 1 == count($newDates)) {
  898. $attributeJsonDate = $currentDate . '至' . $lastDate;
  899. }
  900. $attributeJson = [
  901. 'icon' => '',
  902. 'date' => $attributeJsonDate,
  903. 'time' => $attributeJsonTime,
  904. 'dates' => $newDates ? array_values($newDates) : [],
  905. 'times' => $times,
  906. 'person' => $personTotal
  907. ];
  908. if (!empty($params['appointment_label'])) {
  909. $attributeJson['label'] = $params['appointment_label'];
  910. }
  911. if (!empty($params['address'])) {
  912. $attributeJson['address'] = $params['address'];
  913. $attributeJson['position'] = $params['position'];
  914. }
  915. $model->goods_attribute_json = json_encode($attributeJson, JSON_UNESCAPED_UNICODE);
  916. // $times = [];
  917. // foreach ($params['appointment_times'] as $time) {
  918. // $times[$time['appointmentTimeStart']] = [
  919. // 'person' => $time['person'],
  920. // 'duration' => $time['appointmentTimeStart'] . '-' . $time['appointmentTimeEnd']
  921. // ];
  922. // }
  923. // $model->goods_attribute_json = json_encode([
  924. // 'icon' => '',
  925. // 'dates' => $params['dates'] ?? [],
  926. // 'times' => $times
  927. // ]);
  928. }
  929. if (!empty($params['goods_json']) && $params['join_goods_category_id'] == 65) {
  930. $goodsJson = json_decode($params['goods_json'], true);
  931. foreach ($goodsJson as $key => $item) {
  932. $goodsJson[$key]['color'] = hexToRgb($item['color']);
  933. }
  934. $model->goods_json = json_encode($goodsJson);
  935. } elseif (!empty($params['goods_json']) && $params['join_goods_category_id'] == 43) {
  936. $goodsJson = json_decode($params['goods_json'], true);
  937. $newGoodsJson = [];
  938. foreach ($goodsJson as $item1) {
  939. if (empty($item1['title'])) {
  940. continue;
  941. }
  942. $newItem1 = [];
  943. foreach ($item1['items'] as $item2) {
  944. $newParams = [];
  945. foreach ($item2['params'] as $param) {
  946. if (!empty($param[0]) || !empty($param[1])) {
  947. $newParams[] = $param;
  948. }
  949. }
  950. $newItem1['items'][$item2['key']] = $newParams;
  951. }
  952. $newItem1['service'] = $item1['service'] ?? '';
  953. $newGoodsJson[$item1['title']] = $newItem1;
  954. }
  955. $model->goods_json = json_encode($newGoodsJson);
  956. } else {
  957. $model->goods_json = '[]';
  958. }
  959. if ($model->save()) {
  960. return $model->goods_id;
  961. }
  962. // 异常
  963. throw new BusinessException("数据写入失败~");
  964. } catch (\Exception $e) {
  965. dump($e->getMessage());
  966. throw new BusinessException("数据写入失败~");
  967. }
  968. }
  969. /**
  970. * @Desc 详情表
  971. * @Author Gorden
  972. * @Date 2024/3/11 11:19
  973. *
  974. * @param $params
  975. * @return void
  976. * @throws BusinessException
  977. */
  978. public static function detailInsert($params)
  979. {
  980. if (!empty($params['goods_detail_slider_json'])) {
  981. $params['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_detail_slider_json']);
  982. $params['goods_detail_slider_json'] = json_encode(['slider' => $params['goods_detail_slider_json']]);
  983. }
  984. try {
  985. $model = new GoodsDetail();
  986. $model->join_detail_goods_id = $params['goods_id'];
  987. $model->goods_detail_code_json = $params['goods_detail_code_json'] ?? '{}';
  988. $model->goods_detail_slider_json = $params['goods_detail_slider_json'] ?? '{}';
  989. $model->goods_detail_specs_json = $params['goods_detail_specs_json'] ?? '{}';
  990. $model->goods_detail_content = $params['goods_detail_content'] ?? '';
  991. if (!$model->save()) {
  992. // 异常
  993. throw new BusinessException("数据写入失败~");
  994. }
  995. } catch (\Exception $e) {
  996. dump($e->getMessage());
  997. throw new BusinessException("数据写入失败~");
  998. }
  999. }
  1000. public static function componentUpdate($params, $type = 'insert')
  1001. {
  1002. Db::beginTransaction();
  1003. try {
  1004. // 有先删除
  1005. if ($type == 'update') {
  1006. GoodsComponent::where('join_component_master_goods_id', $params['goods_id'])->delete();
  1007. } else {
  1008. Goods::where('goods_id', $params['goods_id'])->update(['goods_sku_json' => '{"规格": ["标准"]}']);
  1009. $skuData = [
  1010. 'join_sku_goods_id' => $params['goods_id'],
  1011. 'goods_sku_status' => 'ON',
  1012. 'goods_sku_specs_json' => '{"规格": "标准"}',
  1013. 'goods_sku_title' => "标准" . $params['goods_name'],
  1014. 'goods_sku_market_price' => $params['goods_market_price'] ?? 0,
  1015. 'goods_sku_sales_price' => $params['goods_sales_price'] ?? 0,
  1016. ];
  1017. GoodsSku::insert($skuData);
  1018. }
  1019. $data = [];
  1020. foreach ($params['goods_content_list'] as $item) {
  1021. $goods = Goods::where('goods_id', $params['goods_id'])->first();
  1022. if (!$goods) {
  1023. continue;
  1024. }
  1025. $data[] = [
  1026. 'join_component_master_goods_id' => $params['goods_id'],
  1027. 'join_component_goods_id' => $item['goods_id'] ?? '',
  1028. 'goods_component_price' => $item['goods_sales_price'] ?? '',
  1029. 'goods_component_cover' => $goods->goods_cover,
  1030. 'goods_component_json' => json_encode(['goods_name' => $item['goods_name'], 'nbr' => $item['nbr'], 'sku_id' => $item['sku_id'] ?? '']),
  1031. 'goods_component_addtimes' => time()
  1032. ];
  1033. }
  1034. if ($data) {
  1035. GoodsComponent::insert($data);
  1036. }
  1037. Db::commit();
  1038. } catch (\Exception $e) {
  1039. Db::rollBack();
  1040. dump($e->getMessage());
  1041. throw new BusinessException("数据写入失败~");
  1042. }
  1043. }
  1044. /**
  1045. * @Desc 标签表
  1046. * @Author Gorden
  1047. * @Date 2024/3/11 11:32
  1048. *
  1049. * @param $params
  1050. * @return void
  1051. * @throws BusinessException
  1052. */
  1053. public static function labelInsert($params)
  1054. {
  1055. $model = new GoodsLabel();
  1056. $model->join_label_goods_id = $params['goods_id'];
  1057. $model->goods_label = $params['goods_label'] ? implode(',', $params['goods_label']) : '';
  1058. $model->goods_label_extend_json = !empty($params['goods_label_extend_json']) ? $params['goods_label_extend_json'] : '{}';
  1059. if (!$model->save()) {
  1060. // 异常
  1061. throw new BusinessException('数据写入失败~');
  1062. }
  1063. }
  1064. /**
  1065. * @Desc 产品运行控制信息表
  1066. * @Author Gorden
  1067. * @Date 2024/3/11 11:38
  1068. *
  1069. * @param $params
  1070. * @return void
  1071. * @throws BusinessException
  1072. */
  1073. public static function goodsRunningInsert($params)
  1074. {
  1075. try {
  1076. $model = new GoodsRunning();
  1077. $model->join_running_goods_id = $params['goods_id'];
  1078. $model->goods_running_storage = $params['goods_running_storage'] ?? 0;
  1079. $model->goods_running_sale = $params['goods_running_sale'] ?? 0;
  1080. $model->goods_running_off_type = !empty($params['goods_running_off_type']) ? $params['goods_running_off_type'] : '';
  1081. $model->goods_running_off_json = !empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T' && !empty($params['goods_off_addtimes']) ? json_encode(['time' => strtotime($params['goods_off_addtimes'])]) : '[]';
  1082. if (!$model->save()) {
  1083. throw new BusinessException('数据写入失败');
  1084. }
  1085. } catch (\Exception $e) {
  1086. dump($e->getMessage());
  1087. throw new BusinessException('数据写入失败');
  1088. }
  1089. }
  1090. /**
  1091. * @Desc SKU
  1092. * @Author Gorden
  1093. * @Date 2024/3/11 12:01
  1094. *
  1095. * @param $params
  1096. * @return void
  1097. * @throws BusinessException
  1098. */
  1099. public static function skuInsert($params)
  1100. {
  1101. $model = new GoodsSku();
  1102. $model->join_sku_goods_id = $params['goods_id'];
  1103. $model->goods_sku_status = $params['goods_sku_status'];
  1104. $model->goods_sku_specs_json = $params['goods_sku_specs_json'];
  1105. $model->goods_sku_title = $params['goods_sku_title'];
  1106. $model->goods_sku_images_json = $params['goods_sku_images_json'];
  1107. $model->goods_sku_content = $params['goods_sku_content'];
  1108. $model->goods_sku_market_price = $params['goods_sku_market_price'];
  1109. $model->goods_sku_sales_price = $params['goods_sku_sales_price'];
  1110. $model->goods_sku_storage_json = $params['goods_sku_storage_json'];
  1111. $model->goods_sku_service_json = $params['goods_sku_service_json'];
  1112. $model->goods_sku_extend_json = $params['goods_sku_extend_json'];
  1113. if (!$model->save()) {
  1114. throw new BusinessException('数据写入失败~');
  1115. }
  1116. }
  1117. /**
  1118. * @Desc
  1119. * @Author Gorden
  1120. * @Date 2024/3/12 8:44
  1121. *
  1122. * @param $params
  1123. * @return void
  1124. * @throws BusinessException
  1125. */
  1126. public static function mainUpdate($params)
  1127. {
  1128. try {
  1129. $data = self::inputFilter($params, new Goods());
  1130. if (!empty($data['goods_cover'])) {
  1131. $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']);
  1132. }
  1133. $data['goods_on_addtimes'] = isset($data['goods_on_addtimes']) ? strtotime($data['goods_on_addtimes']) : 0;
  1134. $data['goods_sku_json'] = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => []]);
  1135. $row = Goods::find($data['goods_id']);
  1136. if ($row->join_goods_category_id != $data['join_goods_category_id']) {
  1137. $category = SysCategory::where('category_id', $params['join_goods_category_id'])->first();
  1138. if (!$category) {
  1139. throw new BusinessException("产品分类不存在~");
  1140. }
  1141. $data['goods_category'] = $category->category_classify ?? '';
  1142. $data['goods_prefix'] = $data['goods_prefix'] ?? ($category->category_name ? '【' . $category->category_name . '】' : '');
  1143. }
  1144. // 上架时间有变动
  1145. if ($data['goods_status'] == 'PENDING' && $row->goods_on_addtimes != $data['goods_on_addtimes']) {
  1146. $redis = Redis::connection();
  1147. // 删掉原来的
  1148. $oldKey = Goods::LISTING_KEY_PREFIX . date('YmdHi', $row->goods_on_addtimes);
  1149. $redis->srem($oldKey, $data['goods_id']);
  1150. // 加入新的
  1151. $newKey = Goods::LISTING_KEY_PREFIX . date('YmdHi', $data['goods_on_addtimes']);
  1152. $redis->sadd($newKey, $data['goods_id']);
  1153. }
  1154. if (!empty($params['is_support_appointment']) && $params['is_support_appointment'] == 'Y' && !empty($params['appointment_times'])) {
  1155. $times = [];
  1156. $attributeJsonTimeArr = [];
  1157. $personTotal = 0;
  1158. foreach ($params['appointment_times'] as $time) {
  1159. $attributeJsonTimeArr[] = strtotime(date('Y-m-d ') . $time['appointmentTimeStart']);
  1160. $attributeJsonTimeArr[] = strtotime(date('Y-m-d ') . $time['appointmentTimeEnd']);
  1161. $personTotal += $time['person'];
  1162. $times[$time['appointmentTimeStart']] = [
  1163. 'person' => $time['person'],
  1164. 'duration' => $time['appointmentTimeStart'] . '-' . $time['appointmentTimeEnd']
  1165. ];
  1166. }
  1167. $attributeJsonTime = date('H:i', min($attributeJsonTimeArr)) . '至' . date('H:i', max($attributeJsonTimeArr));
  1168. $newDates = [];
  1169. foreach ($params['dates'] as $date) {
  1170. $key = self::$week[$date];
  1171. $newDates[$key] = $date;
  1172. }
  1173. ksort($newDates);
  1174. $currentDate = current($newDates);
  1175. $lastDate = end($newDates);
  1176. $attributeJsonDate = '';
  1177. if (self::$week[$lastDate] - self::$week[$currentDate] + 1 > count($newDates)) {
  1178. $attributeJsonDate = implode(',', $newDates);
  1179. } else if (self::$week[$lastDate] - self::$week[$currentDate] + 1 == count($newDates)) {
  1180. $attributeJsonDate = $currentDate . '至' . $lastDate;
  1181. }
  1182. $attributeJson = [
  1183. 'icon' => '',
  1184. 'date' => $attributeJsonDate,
  1185. 'time' => $attributeJsonTime,
  1186. 'dates' => $newDates ? array_values($newDates) : [],
  1187. 'times' => $times,
  1188. 'person' => $personTotal
  1189. ];
  1190. if (!empty($params['appointment_label'])) {
  1191. $attributeJson['label'] = $params['appointment_label'];
  1192. }
  1193. if (!empty($params['address'])) {
  1194. $attributeJson['address'] = $params['address'];
  1195. $attributeJson['position'] = $params['position'];
  1196. }
  1197. $data['goods_attribute_json'] = json_encode($attributeJson, JSON_UNESCAPED_UNICODE);
  1198. }
  1199. if (!empty($data['goods_json']) && $data['join_goods_category_id'] == 65) {
  1200. $goodsJson = json_decode($data['goods_json'], true);
  1201. foreach ($goodsJson as $key => $item) {
  1202. $goodsJson[$key]['color'] = hexToRgb($item['color']);
  1203. }
  1204. $data['goods_json'] = json_encode($goodsJson);
  1205. } elseif (!empty($data['goods_json']) && $data['join_goods_category_id'] == 43) {
  1206. $goodsJson = json_decode($data['goods_json'], true);
  1207. $newGoodsJson = [];
  1208. foreach ($goodsJson as $item1) {
  1209. if (empty($item1['title'])) {
  1210. continue;
  1211. }
  1212. $newItem1 = [];
  1213. foreach ($item1['items'] as $item2) {
  1214. $newParams = [];
  1215. foreach ($item2['params'] as $param) {
  1216. if (!empty($param[0]) || !empty($param[1])) {
  1217. $newParams[] = $param;
  1218. }
  1219. }
  1220. $newItem1['items'][$item2['key']] = $newParams;
  1221. }
  1222. $newItem1['service'] = $item1['service'];
  1223. $newGoodsJson[$item1['title']] = $newItem1;
  1224. }
  1225. $data['goods_json'] = json_encode($newGoodsJson);
  1226. } else {
  1227. $data['goods_json'] = '[]';
  1228. }
  1229. foreach ($data as $key => $val) {
  1230. $row->{$key} = $val;
  1231. }
  1232. $row->save();
  1233. } catch (BusinessException $e) {
  1234. throw new BusinessException($e->getMessage());
  1235. } catch (\Exception $e) {
  1236. dump($e->getTrace());
  1237. throw new BusinessException('数据更新异常~1');
  1238. }
  1239. }
  1240. /**
  1241. * @Desc
  1242. * @Author Gorden
  1243. * @Date 2024/3/12 9:57
  1244. *
  1245. * @param $params
  1246. * @return void
  1247. * @throws BusinessException
  1248. */
  1249. public static function detailUpdate($params)
  1250. {
  1251. try {
  1252. $data = self::inputFilter($params, new GoodsDetail());
  1253. if (!empty($data['goods_detail_slider_json'])) {
  1254. $data['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_detail_slider_json']);
  1255. $data['goods_detail_slider_json'] = json_encode(['slider' => $data['goods_detail_slider_json']]);
  1256. }
  1257. // 根据goods_id 查详情ID
  1258. $detail = GoodsDetail::where('join_detail_goods_id', $params['goods_id'])->first();
  1259. if ($detail) {
  1260. self::doUpdate($detail->join_detail_goods_id, $data, new GoodsDetail());
  1261. } else {
  1262. $data['join_detail_goods_id'] = $params['goods_id'];
  1263. GoodsDetail::insert($data);
  1264. }
  1265. } catch (BusinessException $e) {
  1266. throw new BusinessException($e->getMessage());
  1267. } catch (\Exception $e) {
  1268. dump($e->getMessage());
  1269. throw new BusinessException('数据更新异常~2');
  1270. }
  1271. }
  1272. /**
  1273. * @Desc
  1274. * @Author Gorden
  1275. * @Date 2024/3/12 9:58
  1276. *
  1277. * @param $params
  1278. * @return void
  1279. * @throws BusinessException
  1280. */
  1281. public static function labelUpdate($params)
  1282. {
  1283. try {
  1284. $data = self::inputFilter($params, new GoodsLabel());
  1285. // 根据goods_id 查详情ID
  1286. $detail = GoodsLabel::where('join_label_goods_id', $params['goods_id'])->first();
  1287. if ($detail) {
  1288. self::doUpdate($detail->goods_label_id, $data, new GoodsLabel());
  1289. } else {
  1290. $data['join_label_goods_id'] = $params['goods_id'];
  1291. GoodsLabel::insert($data);
  1292. }
  1293. } catch (BusinessException $e) {
  1294. throw new BusinessException($e->getMessage());
  1295. } catch (\Exception $e) {
  1296. dump($e->getMessage());
  1297. throw new BusinessException('数据更新异常~3');
  1298. }
  1299. }
  1300. /**
  1301. * @Desc
  1302. * @Author Gorden
  1303. * @Date 2024/3/12 9:59
  1304. *
  1305. * @param $params
  1306. * @return void
  1307. * @throws BusinessException
  1308. */
  1309. public static function goodsRunningUpdate($params)
  1310. {
  1311. try {
  1312. $data = self::inputFilter($params, new GoodsRunning());
  1313. // 根据goods_id 查详情ID
  1314. $detail = GoodsRunning::where('join_running_goods_id', $params['goods_id'])->first();
  1315. if (!empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T') {
  1316. $redis = Redis::connection();
  1317. if (!empty($detail->goods_running_off_json)) {
  1318. $goodsRunningOffJson = json_decode($detail->goods_running_off_json, true);
  1319. if (isset($goodsRunningOffJson['time'])) {
  1320. $oldKey = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', $goodsRunningOffJson['time']);
  1321. $goodsRunningOffJson['time'] = strtotime($params['goods_off_addtimes']);
  1322. $data['goods_running_off_json'] = json_encode($goodsRunningOffJson);
  1323. // 有老的下架时间,删除老的
  1324. $redis->srem($oldKey, $params['goods_id']);
  1325. } else {
  1326. $goodsRunningOffJson['time'] = strtotime($params['goods_off_addtimes']);
  1327. $data['goods_running_off_json'] = json_encode($goodsRunningOffJson);
  1328. }
  1329. } else {
  1330. $data['goods_running_off_json'] = json_encode(['time' => strtotime($params['goods_off_addtimes'])]);
  1331. }
  1332. // 加入自动下架
  1333. $newKey = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', strtotime($params['goods_off_addtimes']));
  1334. $redis->sAdd($newKey, $params['goods_id']);
  1335. } else if (!empty($params['goods_running_off_type']) && !empty($detail->goods_running_off_type) && $params['goods_running_off_type'] == 'H' && $detail->goods_running_off_type == 'T') {
  1336. $goodsRunningOffJson = json_decode($detail->goods_running_off_json, true);
  1337. if (isset($goodsRunningOffJson['time'])) {
  1338. $oldKey = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', $goodsRunningOffJson['time']);
  1339. $redis = Redis::connection();
  1340. $redis->srem($oldKey, $params['goods_id']);
  1341. }
  1342. }
  1343. if ($detail) {
  1344. self::doUpdate($detail->join_running_goods_id, $data, new GoodsRunning());
  1345. } else {
  1346. // 兼容老数据……
  1347. $data['join_running_goods_id'] = $params['goods_id'];
  1348. GoodsRunning::insert($data);
  1349. }
  1350. } catch (BusinessException $e) {
  1351. throw new BusinessException($e->getMessage());
  1352. } catch (\Exception $e) {
  1353. dump($e->getMessage());
  1354. throw new BusinessException('数据更新异常~4');
  1355. }
  1356. }
  1357. /**
  1358. * @Desc sku 设置
  1359. * @Author Gorden
  1360. * @Date 2024/4/10 10:43
  1361. *
  1362. * @param $params
  1363. * @return void
  1364. * @throws BusinessException
  1365. */
  1366. public static function goodsSkuSet($params, $operation = 'insert')
  1367. {
  1368. try {
  1369. Db::beginTransaction();
  1370. $skusOldIds = [];
  1371. if ($operation == 'update') {
  1372. // 查出所有的
  1373. $skusOldIds = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->pluck('goods_sku_id', 'goods_sku_id');
  1374. // 删掉原有的
  1375. // GoodsSku::where('join_sku_goods_id', $params['goods_id'])->delete();
  1376. }
  1377. if (empty($skusOldIds) && empty($params['goods_sku_json_value'])) {
  1378. $skuData = [
  1379. 'join_sku_goods_id' => $params['goods_id'],
  1380. 'goods_sku_status' => 'ON',
  1381. 'goods_sku_specs_json' => '{"规格": "标准"}',
  1382. 'goods_sku_title' => "标准" . $params['goods_name'],
  1383. 'goods_sku_market_price' => $params['goods_market_price'] ?? 0,
  1384. 'goods_sku_sales_price' => $params['goods_sales_price'] ?? 0,
  1385. ];
  1386. GoodsSku::insert($skuData);
  1387. }
  1388. // 入新的
  1389. if (!empty($params['goods_sku_json_value'])) {
  1390. foreach ($params['goods_sku_json_value'] as $item) {
  1391. $skus = explode(',', $item['sku']);
  1392. $skuArr = [];
  1393. for ($i = 1; $i <= count($skus); $i++) {
  1394. $skuName = "skuName" . $i;
  1395. $key = $item[$skuName];
  1396. $skuArr[$key] = $skus[$i - 1];
  1397. }
  1398. $specsJson = json_encode($skuArr);
  1399. $skuTitle = str_replace('-', ',', $item['sku']) . $params['goods_name'];
  1400. if ($operation == 'update' && !empty($item['sku_id'])) {
  1401. $model = GoodsSku::where('goods_sku_id', $item['sku_id'])->first();
  1402. if (!$model) {
  1403. $model = new GoodsSku();
  1404. } else {
  1405. unset($skusOldIds[$model->goods_sku_id]);
  1406. }
  1407. } else {
  1408. $model = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->where('goods_sku_title', $skuTitle)->first();
  1409. if (!$model) {
  1410. $model = new GoodsSku();
  1411. } else {
  1412. unset($skusOldIds[$model->goods_sku_id]);
  1413. }
  1414. }
  1415. $model->join_sku_goods_id = $params['goods_id'];
  1416. $model->goods_sku_status = $params['goods_status'];
  1417. $model->goods_sku_specs_json = $specsJson;
  1418. $model->goods_sku_title = $skuTitle;
  1419. $model->goods_sku_market_price = $params['goods_market_price'] ?? 0;
  1420. $model->goods_sku_sales_price = $item['price'];
  1421. $model->goods_sku_storage_json = json_encode(['storage' => $item['stock']]);
  1422. $model->save();
  1423. }
  1424. }
  1425. if ($operation == 'update' && !empty($skusOldIds)) {
  1426. GoodsSku::whereIn('goods_sku_id', $skusOldIds)->delete();
  1427. }
  1428. Db::commit();
  1429. } catch (\Exception $e) {
  1430. dump($e->getTrace());
  1431. Db::rollBack();
  1432. throw new BusinessException('数据更新异常~5');
  1433. }
  1434. }
  1435. /**
  1436. * @Desc
  1437. * @Author Gorden
  1438. * @Date 2024/3/12 8:45
  1439. *
  1440. * @param array $data
  1441. * @param $model
  1442. * @return array
  1443. * @throws BusinessException
  1444. */
  1445. private static function inputFilter(array $data, $model): array
  1446. {
  1447. $table = config('database.connections.mysql.prefix') . $model->getTable();
  1448. $allow_column = $model->getConnection()->select("desc `$table`");
  1449. if (!$allow_column) {
  1450. throw new BusinessException('表不存在', 2);
  1451. }
  1452. $columns = array_column($allow_column, 'Type', 'Field');
  1453. foreach ($data as $col => $item) {
  1454. if (!isset($columns[$col])) {
  1455. unset($data[$col]);
  1456. continue;
  1457. }
  1458. // 非字符串类型传空则为null
  1459. if ($item === '' && strpos(strtolower($columns[$col]), 'varchar') === false && strpos(strtolower($columns[$col]), 'text') === false) {
  1460. $data[$col] = null;
  1461. }
  1462. if (is_array($item)) {
  1463. $data[$col] = implode(',', $item);
  1464. }
  1465. if ($item != '' && (strpos(strtolower($columns[$col]), 'varchar') || strpos(strtolower($columns[$col]), 'text'))) {
  1466. $data[$col] = htmlspecialchars($item);
  1467. }
  1468. }
  1469. if (empty($data['created_at'])) {
  1470. unset($data['created_at']);
  1471. }
  1472. if (empty($data['updated_at'])) {
  1473. unset($data['updated_at']);
  1474. }
  1475. return $data;
  1476. }
  1477. /**
  1478. * @Desc 执行更新
  1479. * @Author Gorden
  1480. * @Date 2024/3/12 8:43
  1481. *
  1482. * @param $id
  1483. * @param $data
  1484. * @param $model
  1485. * @return void
  1486. */
  1487. private static function doUpdate($id, $data, $model)
  1488. {
  1489. $row = $model->find($id);
  1490. foreach ($data as $key => $val) {
  1491. $row->{$key} = $val;
  1492. }
  1493. $row->save();
  1494. }
  1495. /**
  1496. * @Desc 上架定时
  1497. * @Author Gorden
  1498. * @Date 2024/4/11 15:13
  1499. *
  1500. * @return void
  1501. */
  1502. public static function checkListing()
  1503. {
  1504. $key = Goods::LISTING_KEY_PREFIX . date('YmdHi');
  1505. $redis = Redis::connection();
  1506. if (!$redis->exists($key)) {
  1507. return;
  1508. }
  1509. $goodsIds = $redis->sMembers($key);
  1510. if (Goods::whereIn('goods_id', $goodsIds)->update(['goods_status' => 'ON'])) {
  1511. $redis->del($key);
  1512. }
  1513. }
  1514. /**
  1515. * @Desc 自动下架
  1516. * @Author Gorden
  1517. * @Date 2024/4/26 15:26
  1518. *
  1519. * @return void
  1520. */
  1521. public static function checkOffListing()
  1522. {
  1523. $key = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi');
  1524. $redis = Redis::connection();
  1525. if (!$redis->exists($key)) {
  1526. return;
  1527. }
  1528. $goodsIds = $redis->sMembers($key);
  1529. if (Goods::whereIn('goods_id', $goodsIds)->update(['goods_status' => 'OFF'])) {
  1530. $redis->del($key);
  1531. }
  1532. }
  1533. public static $week = [
  1534. '周一' => 1,
  1535. '周二' => 2,
  1536. '周三' => 3,
  1537. '周四' => 4,
  1538. '周五' => 5,
  1539. '周六' => 6,
  1540. '周日' => 7,
  1541. ];
  1542. }