SearchGoods.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <?php
  2. namespace app\common\model\search;
  3. use app\common\enum\GoodsEnum;
  4. use app\common\enum\PresellEnum;
  5. use app\common\enum\YesNoEnum;
  6. use app\common\logic\GoodsActivityLogic;
  7. use app\common\model\DiscountGoods;
  8. use app\common\model\DistributionGoods;
  9. use app\common\model\GoodsBrand;
  10. use app\common\model\GoodsCategory;
  11. use app\common\model\GoodsCategoryIndex;
  12. use app\common\model\GoodsItem;
  13. use app\common\model\PresellGoods;
  14. use think\facade\Validate;
  15. trait SearchGoods
  16. {
  17. /**
  18. * @notes 关键词搜索
  19. * @param $query
  20. * @param $value
  21. * @param $data
  22. * @author cjhao
  23. * @date 2021/8/16 18:01
  24. */
  25. public function searchKeywordAttr($query, $value, $data)
  26. {
  27. if ($value) {
  28. $query->where('code|name', 'like', '%' . $value . '%');
  29. }
  30. }
  31. /**
  32. * @notes 搜索条形码
  33. * @param $query
  34. * @param $value
  35. * @param $data
  36. * @return void
  37. * @author lbzy
  38. * @datetime 2023-12-21 11:49:39
  39. */
  40. function searchBarCodeAttr($query, $value, $data)
  41. {
  42. Validate::must($value) && $query->where('id', 'in', GoodsItem::where('bar_code', $value)->column('goods_id'));
  43. }
  44. /**
  45. * @notes 分类搜索
  46. * @param $query
  47. * @param $value
  48. * @param $data
  49. * @author cjhao
  50. * @date 2021/8/16 18:02
  51. */
  52. public function searchCategoryIdAttr($query, $value, $data)
  53. {
  54. if ($value) {
  55. $goodsCategory = GoodsCategory::find($value);
  56. $level = $goodsCategory['level'] ?? '';
  57. $categoryIds = [];
  58. switch ($level) {
  59. case 1:
  60. $categoryIds = GoodsCategory::alias('A')
  61. ->join('goods_category B', 'A.id = B.pid')
  62. ->where(['A.pid' => $value])
  63. ->field('A.id as aid,B.id as bid')
  64. ->select()->toArray();
  65. $categoryIds = array_merge(array_column($categoryIds, 'aid'), array_column($categoryIds, 'bid'));
  66. break;
  67. case 2:
  68. $categoryIds = GoodsCategory::where(['pid' => $value])
  69. ->column('id');
  70. break;
  71. }
  72. $categoryIds = array_merge([(int)$value], $categoryIds);
  73. $goodsIds = GoodsCategoryIndex::where(['category_id' => $categoryIds])->column('goods_id');
  74. $query->where('id', 'in', $goodsIds);
  75. }
  76. }
  77. /**
  78. * @notes 品牌搜索
  79. * @param $query
  80. * @param $value
  81. * @param $data
  82. * @return void
  83. * @author lbzy
  84. * @datetime 2023-11-08 09:49:20
  85. */
  86. public function searchBrandIdAttr($query, $value, $data)
  87. {
  88. $value && $query->where('brand_id', 'in', $value);
  89. }
  90. /**
  91. * @notes 商品类型筛选
  92. * @param $query
  93. * @param $value
  94. * @param $data
  95. * @author cjhao
  96. * @date 2022/4/21 18:05
  97. */
  98. public function searchGoodsTypeAttr($query, $value, $data)
  99. {
  100. if ($value) {
  101. $query->where('type', '=', $value);
  102. }
  103. }
  104. /**
  105. * @notes 供应商搜索
  106. * @param $query
  107. * @param $value
  108. * @param $data
  109. * @author cjhao
  110. * @date 2021/8/16 18:02
  111. */
  112. public function searchSupplierIdAttr($query, $value, $data)
  113. {
  114. if ($value) {
  115. $query->where('supplier_id', '=', $value);
  116. }
  117. }
  118. /**
  119. * @notes 价格排序
  120. * @param $query
  121. * @param $value
  122. * @param $data
  123. * @author cjhao
  124. * @date 2021/8/16 18:02
  125. */
  126. public function searchPriceAttr($query, $value, $data)
  127. {
  128. if ($value) {
  129. $query->order(['min_price' => $value]);
  130. }
  131. }
  132. /**
  133. * @notes 销售排序
  134. * @param $query
  135. * @param $value
  136. * @param $data
  137. * @author cjhao
  138. * @date 2021/8/16 18:02
  139. */
  140. public function searchSaleAttr($query, $value, $data)
  141. {
  142. if ($value) {
  143. $query->order(['sales_num' => $value]);
  144. }
  145. }
  146. /**
  147. * @notes 商品名称搜索
  148. * @param $query
  149. * @param $value
  150. * @param $data
  151. * @author cjhao
  152. * @date 2021/8/16 18:02
  153. */
  154. public function searchNameAttr($query, $value, $data)
  155. {
  156. if (Validate::must($value)) {
  157. $brandId = GoodsBrand::where('name', $value)->where('is_show', 1)->value('id');
  158. if ($brandId) {
  159. $query->where('brand_id', $brandId);
  160. } else {
  161. $query->where('name', 'like', '%' . $value . '%');
  162. }
  163. }
  164. }
  165. /**
  166. * @notes 类型搜索
  167. * @param $query
  168. * @param $value
  169. * @param $data
  170. * @author cjhao
  171. * @date 2021/8/16 18:02
  172. */
  173. public function searchTypeAttr($query, $value, $data)
  174. {
  175. switch ($value) {
  176. case 1: //销售中 todo 列出「销售状态:销售中」的商品
  177. $query->where(['status' => GoodsEnum::STATUS_SELL]);
  178. break;
  179. case 2: //库存预警 todo 列出「销售状态:销售中」且「库存预警:开启预警」 且「0 < 总库存 < 库存预警值」
  180. $query->where([
  181. ['status', '=', GoodsEnum::STATUS_SELL],
  182. ['stock_warning', '>', 0],
  183. ['total_stock', '>', 0],
  184. ]);
  185. $query->whereColumn('stock_warning', '>', 'total_stock');
  186. break;
  187. case 3: //已售罄 todo 「销售状态:销售中」且 「总库存 == 0」
  188. $query->where(['status' => GoodsEnum::STATUS_SELL, 'total_stock' => 0]);
  189. break;
  190. case 4: //仓库中 todo 列出「销售状态:仓库中」的商品
  191. $query->where(['status' => GoodsEnum::STATUS_STORAGE]);
  192. break;
  193. }
  194. }
  195. /**
  196. * @notes 根据活动状态搜索
  197. * @param $query
  198. * @param $value
  199. * @param $data
  200. * @return bool
  201. * @throws \think\db\exception\DataNotFoundException
  202. * @throws \think\db\exception\DbException
  203. * @throws \think\db\exception\ModelNotFoundException
  204. * @author cjhao
  205. * @date 2022/9/1 17:10
  206. */
  207. public function searchActivityTypeAttr($query, $value, $data)
  208. {
  209. //全部
  210. if('' == $value){
  211. return false;
  212. }
  213. //未参与
  214. if(0 == $value){
  215. $activityLists = GoodsActivityLogic::activityInfo();
  216. $goodsIds = array_keys($activityLists);
  217. return $query->where('id', 'not in', $goodsIds);
  218. }else{
  219. //参与某个活动
  220. $activityLists = GoodsActivityLogic::activityInfo([],$value);
  221. $goodsIds = array_keys($activityLists);
  222. return $query->where('id', 'in', $goodsIds);
  223. }
  224. return false;
  225. }
  226. /**
  227. * @notes 根据分销状态搜索
  228. * @param $query
  229. * @param $value
  230. * @param $data
  231. * @author Tab
  232. * @date 2021/7/23 16:01
  233. */
  234. public function searchIsDistributionAttr($query, $value, $data)
  235. {
  236. // 获取已开启分销的商品id
  237. $joinIds = DistributionGoods::where('is_distribution', YesNoEnum::YES)->column('goods_id');
  238. if ($value == 1) {
  239. // 分销商品
  240. return $query->where('id', 'in', $joinIds);
  241. }
  242. if ($value == 0) {
  243. // 非分销商品
  244. return $query->where('id', 'not in', $joinIds);
  245. }
  246. return false;
  247. }
  248. /**
  249. * @notes 是否折扣商品
  250. * @param $query
  251. * @param $value
  252. * @param $data
  253. * @return mixed
  254. * @author cjhao
  255. * @date 2022/5/5 15:31
  256. */
  257. public function searchDiscountAttr($query, $value, $data)
  258. {
  259. if ($value) {
  260. $query->where('is_discount', '=', $value);
  261. }
  262. if (0 == $value) {
  263. $query->where('is_discount = 0 or is_discount is null');
  264. }
  265. }
  266. /**
  267. * @notes 状态筛选
  268. * @param $query
  269. * @param $value
  270. * @param $data
  271. * @author cjhao
  272. * @date 2022/5/5 15:38
  273. */
  274. public function searchStatusAttr($query, $value, $data)
  275. {
  276. if ('' !== $value) {
  277. $query->where('status', '=', $value);
  278. }
  279. }
  280. /**
  281. * @notes 搜索最大价格 max_price
  282. * @param $query
  283. * @param $value
  284. * @param $data
  285. * @return void
  286. * @author lbzy
  287. * @datetime 2023-11-08 09:51:26
  288. */
  289. function searchMaxPriceAttr($query, $value, $data)
  290. {
  291. Validate::must($value) && $query->where('max_price', '<=', $value);
  292. }
  293. /**
  294. * @notes 搜索最小价格 min_price
  295. * @param $query
  296. * @param $value
  297. * @param $data
  298. * @return void
  299. * @author lbzy
  300. * @datetime 2023-11-08 09:52:16
  301. */
  302. function searchMinPriceAttr($query, $value, $data)
  303. {
  304. Validate::must($value) && $query->where('min_price', '>=', $value);
  305. }
  306. /**
  307. * @notes 搜搜是否会员价 is_member_price 0或1
  308. * @param $query
  309. * @param $value
  310. * @param $data
  311. * @return void
  312. * @author lbzy
  313. * @datetime 2023-11-08 09:58:32
  314. */
  315. function searchIsMemberPriceAttr($query, $value, $data)
  316. {
  317. if (Validate::must($value)) {
  318. $discountGoodsIds = DiscountGoods::where('is_discount', 1)->column('goods_id');
  319. if ($value == 1) {
  320. $query->whereIn('id', $discountGoodsIds);
  321. } else {
  322. $query->whereNotIn('id', $discountGoodsIds);
  323. }
  324. }
  325. }
  326. /**
  327. * @notes 搜索预售 presell
  328. * @param $query
  329. * @param $value
  330. * @param $data
  331. * @return void
  332. * @author lbzy
  333. * @datetime 2024-05-07 09:35:15
  334. */
  335. function searchPresellAttr($query, $value, $data)
  336. {
  337. if (Validate::must($value)) {
  338. $goodsIds = PresellGoods::alias('pg')
  339. ->join('presell p', 'pg.presell_id=p.id')
  340. ->where('p.status', 'in' , PresellEnum::STATUS_GOODS_HAS)
  341. ->column('pg.goods_id');
  342. if ($value == 0) {
  343. $query->whereNotIn('id', $goodsIds);
  344. }
  345. if ($value == 1) {
  346. $query->whereIn('id', $goodsIds);
  347. }
  348. }
  349. }
  350. }