ShopGoodsModel.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace app\common\model;
  3. use app\common\model\TimeModel;
  4. use think\facade\Db;
  5. use function Composer\Autoload\includeFile;
  6. class ShopGoodsModel extends TimeModel
  7. {
  8. protected $name = "shop_goods";
  9. /**
  10. * @param array $map
  11. * @param array $paginate
  12. * @param string|null $field
  13. * @order sort->goods_id倒序排线
  14. * @return array
  15. */
  16. public static function list (array $map = [], array $paginate = [], array $orderMap = [], $filter)
  17. {
  18. $field = 'sort,category,goods_sn,goods_name,goods_img,min_original_price as original_price,min_price as price,rebate_score,sales_volume,inventory,attension_count,restrictions_num';
  19. $order = 'sort desc,goods_id desc';
  20. foreach ($map as $k => $v) {
  21. if (empty($v)) {
  22. unset($map[$k]);
  23. }
  24. }
  25. if (isset($map['ids'])) {
  26. $list['data'] = self::where(['goods_sn' => $map['ids']])->field($field)->select()->toArray();
  27. } else {
  28. if (!empty($orderMap['sort'])) {
  29. switch (intval($orderMap['sort'])) {
  30. case 1:
  31. $order = 'sort desc';
  32. break;
  33. case 2:
  34. $order = 'attension_count asc';
  35. break;
  36. case 3:
  37. $order = 'created_time desc';
  38. break;
  39. case 4:
  40. // 价格降序
  41. $order = 'price desc';
  42. break;
  43. case 5:
  44. $order = 'price asc';
  45. break;
  46. case 6:
  47. $order = 'sales_volume desc';
  48. break;
  49. case 7:
  50. $order = 'sales_volume asc';
  51. break;
  52. case 8:
  53. $order = 'rebate_score asc';
  54. break;
  55. case 9:
  56. $order = 'rebate_score desc';
  57. break;
  58. case 10:
  59. $order = 'rebate_score asc';
  60. break;
  61. case 11:
  62. // 10积分升序
  63. $order = 'rebate_score desc';
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. $where = [];
  70. if (isset($map['menu_id']) && intval($map['menu_id']) > 0){
  71. $where[] = ['menu_id', '=', $map['menu_id']];
  72. unset($map['menu_id']);
  73. }
  74. if (!empty($map['keywords'])) {
  75. $where[] = ['goods_name|hot_keywords', 'like', "%{$map['keywords']}%"];
  76. unset($map['keywords']);
  77. }
  78. if (!empty($map['cls'])) {
  79. $where[] = ['give_vip', '>', 0];
  80. unset($map['cls']);
  81. }
  82. $where[] = ['on_sale', '=', 1];
  83. $list = self::where($map)->where($where)->field($field)->order($order)->paginate($paginate['limit'])->toArray();
  84. }
  85. return $list['data'];
  86. }
  87. public static function details (array $map, ?string $field = '*'): array
  88. {
  89. $cache = false;
  90. if (($goodsBase = \services\CacheServices::get(md5('goodsDetail_' . $map['goods_sn']))) === false || empty($goodsBase)) {
  91. $field = 'menu_id,spec_name,goods_id,category,goods_sn,goods_name,goods_img,goods_img_banner,goods_remark,min_original_price as original_price,min_price as price,note,inventory,rebate_score,sales_volume,restrictions,rush_buy,buynote_template as buyNote,post_template_id,restrictions_num';
  92. $goodsBase = self::where(['goods_sn' => $map['goods_sn']])->field($field)->withAttr('goods_img_banner', function ($value) {
  93. return json_decode($value, true) ?: [];
  94. })->withAttr('goods_remark', function ($value) {
  95. return htmlspecialchars_decode($value);
  96. })->withAttr('buyNote', function ($value) {
  97. return htmlspecialchars_decode($value);
  98. })->findOrEmpty()->toArray();
  99. if (empty($goodsBase)) return [];
  100. $specRelation = Db::name('shop_goods_spec_relation')->field('spec_name,spec_value')->where(['goods_id' => $goodsBase['goods_id']])->withAttr('spec_value', function ($value) {
  101. return json_decode($value, true);
  102. })->select()->toArray();
  103. $goodsExpress = Db::name('express_delivery')->where(['id' => $goodsBase['post_template_id']])->findOrEmpty();
  104. $goodsSpec = Db::name('shop_goods_spec')->field('spec_ids,spec_text,original_price,price,picture,stock')->where(['goods_id' => $goodsBase['goods_id']])->select()->toArray();
  105. $goodsBase['expressNote'] = $goodsExpress['remake'] ?: '';
  106. $goodsBase['spec_relation'] = $specRelation;
  107. $goodsBase['goods_spec'] = $goodsSpec;
  108. $cache = true;
  109. \services\CacheServices::set(md5('goodsDetail_' . $map['goods_sn']), $goodsBase);
  110. }
  111. if (empty($cache)) {
  112. $goodsSpec = Db::name('shop_goods_spec')->field('spec_ids,spec_text,original_price,price,picture,stock')->where(['goods_id' => $goodsBase['goods_id']])->select()->toArray();
  113. $goodsBase['goods_spec'] = $goodsSpec;
  114. }
  115. return $goodsBase;
  116. }
  117. }