SearchUtilsServices.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace crmeb\services\crud;
  12. use think\exception\ValidateException;
  13. use crmeb\services\crud\CrudOperatorEnum;
  14. use crmeb\services\crud\CrudFormEnum;
  15. class SearchUtilsServices
  16. {
  17. /**
  18. * 每个类型代表的意思,以及是否存在需要输入的筛选条件
  19. * @return array[]
  20. * @author Qinii
  21. */
  22. public function getComparator()
  23. {
  24. return [
  25. CrudOperatorEnum::OPERATOR_IN => ['label' => '包含', 'children' => true],
  26. CrudOperatorEnum::OPERATOR_NOT_IN => ['label' => '不包含', 'children' => true],
  27. CrudOperatorEnum::OPERATOR_GT => ['label' => '大于', 'children' => true],
  28. CrudOperatorEnum::OPERATOR_LT => ['label' => '小于', 'children' => true],
  29. CrudOperatorEnum::OPERATOR_EQ => ['label' => '等于', 'children' => true],
  30. CrudOperatorEnum::OPERATOR_GT_EQ => ['label' => '大于等于', 'children' => true],
  31. CrudOperatorEnum::OPERATOR_LT_EQ => ['label' => '小于等于', 'children' => true],
  32. CrudOperatorEnum::OPERATOR_NOT_EQ => ['label' => '不等于', 'children' => true],
  33. CrudOperatorEnum::OPERATOR_BT => ['label' => '介于', 'children' => true],
  34. CrudOperatorEnum::OPERATOR_N_DAY => ['label' => 'N天前', 'children' => true],
  35. CrudOperatorEnum::OPERATOR_LAST_DAY => ['label' => '最近N天', 'children' => true],
  36. //CrudOperatorEnum::OPERATOR_NEXT_DAY => ['label' => '未来N天', 'children' => true],
  37. CrudOperatorEnum::OPERATOR_TO_DAY => ['label' => '今天', 'children' => false],
  38. CrudOperatorEnum::OPERATOR_WEEK => ['label' => '本周', 'children' => false],
  39. CrudOperatorEnum::OPERATOR_MONTH => ['label' => '本月', 'children' => false],
  40. CrudOperatorEnum::OPERATOR_QUARTER => ['label' => '本季度', 'children' => false],
  41. CrudOperatorEnum::OPERATOR_IS_EMPTY => ['label' => '为空', 'children' => false],
  42. CrudOperatorEnum::OPERATOR_NOT_EMPTY => ['label' => '不为空', 'children' => false],
  43. ];
  44. }
  45. /**
  46. * 获取搜索
  47. * @param array $comparator
  48. * @param $type
  49. * @param $options
  50. * @return array
  51. * @author Qinii
  52. */
  53. public function get(array $comparator, $type, $options = [])
  54. {
  55. $this->checkType($type);
  56. $data = $this->getComparator();
  57. $res = [];
  58. foreach ($comparator as $omparator) {
  59. if (!isset($data[$omparator])) {
  60. throw new ValidateException('类型不存在');
  61. }
  62. $res[] = [
  63. 'value' => $omparator,
  64. 'label' => $data[$omparator]['label'],
  65. 'type' => $type,
  66. 'children' => $data[$omparator]['children'],
  67. 'options' => $options
  68. ];
  69. }
  70. return $res;
  71. }
  72. /**
  73. * 时间类型筛选
  74. * @return array
  75. * @author Qinii
  76. */
  77. public function getDate()
  78. {
  79. $date = [
  80. CrudOperatorEnum::OPERATOR_EQ,
  81. CrudOperatorEnum::OPERATOR_GT,
  82. CrudOperatorEnum::OPERATOR_GT_EQ,
  83. CrudOperatorEnum::OPERATOR_LT,
  84. CrudOperatorEnum::OPERATOR_LT_EQ,
  85. CrudOperatorEnum::OPERATOR_NOT_EQ,
  86. CrudOperatorEnum::OPERATOR_TO_DAY,
  87. CrudOperatorEnum::OPERATOR_WEEK,
  88. CrudOperatorEnum::OPERATOR_MONTH,
  89. CrudOperatorEnum::OPERATOR_QUARTER,
  90. ];
  91. $int = [
  92. //CrudOperatorEnum::OPERATOR_N_DAY,
  93. CrudOperatorEnum::OPERATOR_LAST_DAY,
  94. //CrudOperatorEnum::OPERATOR_NEXT_DAY,
  95. ];
  96. $res = $this->get($int, CrudFormEnum::FORM_INPUT_NUMBER);
  97. $resDate = $this->get($date, CrudFormEnum::FORM_DATE_TIME_PICKER, []);
  98. $resDates = $this->get([CrudOperatorEnum::OPERATOR_BT,], CrudFormEnum::FORM_DATE_TIME_PICKER);
  99. $res = array_merge($res, $resDates, $resDate);
  100. return $res;
  101. }
  102. /**
  103. * 数字类型筛选
  104. * @return array
  105. * @author Qinii
  106. */
  107. public function getNumber()
  108. {
  109. $op = [
  110. CrudOperatorEnum::OPERATOR_EQ,
  111. CrudOperatorEnum::OPERATOR_GT,
  112. CrudOperatorEnum::OPERATOR_GT_EQ,
  113. CrudOperatorEnum::OPERATOR_LT,
  114. CrudOperatorEnum::OPERATOR_LT_EQ,
  115. CrudOperatorEnum::OPERATOR_NOT_EQ,
  116. ];
  117. $res = $this->get($op, CrudFormEnum::FORM_INPUT_NUMBER, []);
  118. $res = array_merge($res, $this->get([CrudOperatorEnum::OPERATOR_BT], CrudFormEnum::FORM_INPUT_NUMBER));
  119. return $res;
  120. }
  121. /**
  122. * 定义筛选的填写方式
  123. * @param $type
  124. * @return void
  125. * @author Qinii
  126. * @day 2024/6/4
  127. */
  128. public function getType()
  129. {
  130. return [
  131. CrudFormEnum::FORM_INPUT_NUMBER,
  132. CrudFormEnum::FORM_INPUT,
  133. CrudFormEnum::FORM_SELECT,
  134. CrudFormEnum::FORM_DATE_TIME_PICKER
  135. ];
  136. }
  137. /**
  138. * 检测筛选方式是否在设置范围内
  139. * @param $comparator
  140. * @return bool
  141. * @author Qinii
  142. * @day 2024/6/4
  143. */
  144. public function checkComparator($comparator)
  145. {
  146. if (!in_array($comparator, array_keys($this->getComparator()))) {
  147. throw new ValidateException('筛选方式错误:' . $comparator);
  148. }
  149. return true;
  150. }
  151. /**
  152. * @param $type
  153. * @return true
  154. * @author Qinii
  155. * @day 2024/6/4
  156. */
  157. public function checkType($type)
  158. {
  159. if (!in_array($type, $this->getType())) {
  160. throw new ValidateException('数据类型错误:' . $type);
  161. }
  162. return true;
  163. }
  164. /**
  165. * 循环筛选参数,过滤掉不在允许范围内的参数,检查比较器是不是设置中的类型
  166. * @param $data
  167. * @param $field
  168. * @return array
  169. * @author Qinii
  170. * @day 2024/6/4
  171. */
  172. public function checkFilterConditions($data, $field)
  173. {
  174. $res = [];
  175. if (!empty($data)) {
  176. foreach ($data as $datum) {
  177. if (in_array($datum['property'], $field)) {
  178. $this->checkComparator($datum['comparator']);
  179. $this->checkType($datum['type']);
  180. // $datum = $this->checkFilterType($datum);
  181. $res[] = $datum;
  182. }
  183. }
  184. }
  185. return $res;
  186. }
  187. }