StoreServiceDao.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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 app\common\dao\store\service;
  12. use app\common\dao\BaseDao;
  13. use app\common\model\store\service\StoreService;
  14. use think\db\BaseQuery;
  15. use think\db\exception\DataNotFoundException;
  16. use think\db\exception\DbException;
  17. use think\db\exception\ModelNotFoundException;
  18. use think\Model;
  19. /**
  20. * Class StoreServiceDao
  21. * @package app\common\dao\store\service
  22. * @author xaboy
  23. * @day 2020/5/29
  24. */
  25. class StoreServiceDao extends BaseDao
  26. {
  27. /**
  28. * @return string
  29. * @author xaboy
  30. * @day 2020/5/29
  31. */
  32. protected function getModel(): string
  33. {
  34. return StoreService::class;
  35. }
  36. /**
  37. * 根据条件搜索商店信息。
  38. *
  39. * 该方法通过接收一个包含各种搜索条件的数组,来查询数据库中符合这些条件的商店信息。
  40. * 查询时,只会返回未被删除的商店(is_del为0)。此外,可以根据传入的条件如状态、关键字、商家ID等进行过滤。
  41. * 这种灵活的查询方法允许根据不同的需求组合各种搜索条件,以获取精确的搜索结果。
  42. *
  43. * @param array $where 包含搜索条件的数组,每个条件对应数据库表中的一个字段。
  44. * @return BaseQuery 返回一个构建器对象,可用于进一步的查询操作或获取结果。
  45. */
  46. public function search(array $where)
  47. {
  48. // 从StoreService中获取数据库实例,并初始化查询构建器
  49. return StoreService::getDB()->where('is_del', 0)->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) {
  50. // 如果指定了状态,则添加状态条件到查询
  51. $query->where('status', $where['status']);
  52. })->when(isset($where['keyword']) && $where['keyword'] !== '', function ($query) use ($where) {
  53. // 如果指定了关键字,则添加模糊搜索条件到查询
  54. $query->whereLike('nickname', "%{$where['keyword']}%");
  55. })->when(isset($where['mer_id']) && $where['mer_id'] !== '', function ($query) use ($where) {
  56. // 如果指定了商家ID,则添加商家ID条件到查询
  57. $query->where('mer_id', $where['mer_id']);
  58. })->when(isset($where['customer']) && $where['customer'] !== '', function ($query) use ($where) {
  59. // 如果指定了客户名称,则添加客户名称条件到查询
  60. $query->where('customer', $where['customer']);
  61. })->when(isset($where['is_verify']) && $where['is_verify'] !== '', function ($query) use ($where) {
  62. // 如果指定了验证状态,则添加验证状态条件到查询
  63. $query->where('is_verify', $where['is_verify']);
  64. })->when(isset($where['is_goods']) && $where['is_goods'] !== '', function ($query) use ($where) {
  65. // 如果指定了商品状态,则添加商品状态条件到查询
  66. $query->where('is_goods', $where['is_goods']);
  67. })->when(isset($where['is_open']) && $where['is_open'] !== '', function ($query) use ($where) {
  68. // 如果指定了营业状态,则添加营业状态条件到查询
  69. $query->where('is_open', $where['is_open']);
  70. })->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) {
  71. // 如果指定了用户ID,则添加用户ID条件到查询
  72. $query->where('uid', $where['uid']);
  73. })->when(isset($where['service_id']) && $where['service_id'] !== '', function ($query) use ($where) {
  74. // 如果指定了服务ID,则添加服务ID条件到查询
  75. $query->where('service_id', $where['service_id']);
  76. });
  77. }
  78. /**
  79. * 根据用户ID和可选的商户ID获取服务信息
  80. *
  81. * 此方法用于查询与特定用户相关联的服务信息。它允许指定一个可选的商户ID来过滤结果,
  82. * 仅返回属于该商户的服务。这是在处理多商户系统中,针对特定用户和商户的服务查询的常见需求。
  83. *
  84. * @param int $uid 用户ID。这是查询服务所必需的参数,用于确定服务与哪个用户相关联。
  85. * @param int|null $merId 商户ID。这是一个可选参数,用于进一步筛选服务,只返回属于指定商户的服务。
  86. * 如果未提供此参数,则查询将不考虑商户过滤,返回与用户相关联的所有服务。
  87. * @return array|null 返回符合查询条件的服务信息数组。如果找不到符合条件的服务,则返回null。
  88. * @throws DataNotFoundException
  89. * @throws DbException
  90. * @throws ModelNotFoundException
  91. */
  92. public function getService($uid, $merId = null)
  93. {
  94. // 从StoreService中获取数据库实例,并构建查询条件
  95. return StoreService::getDB()->where('uid', $uid)->when(!is_null($merId), function ($query) use($merId) {
  96. // 如果提供了商户ID,则添加额外的查询条件来过滤商户
  97. $query->where('mer_id', $merId);
  98. })->where('is_del', 0)->where('is_open',1)->find();
  99. }
  100. /**
  101. * 检查指定字段是否存在指定值(且未被删除)。
  102. *
  103. * 此方法用于查询数据库中是否存在指定字段的值,并且该记录没有被删除。
  104. * 可以通过传递一个排除ID来排除特定的记录。
  105. *
  106. * @param string $field 要检查的字段名。
  107. * @param mixed $value 字段应该具有的值。
  108. * @param int|null $except 排除的ID,可选参数,用于排除特定的记录。
  109. * @return bool 如果找到符合条件的记录,则返回true,否则返回false。
  110. */
  111. public function fieldExists($field, $value, ?int $except = null): bool
  112. {
  113. // 初始化查询,查询具有指定字段值并且未被删除的记录
  114. $query = ($this->getModel())::getDB()->where($field, $value)->where('is_del', 0);
  115. // 如果提供了排除ID,则添加条件以排除该ID的记录
  116. if (!is_null($except)) {
  117. $query->where($this->getPk(), '<>', $except);
  118. }
  119. // 返回查询结果是否存在,即记录数是否大于0
  120. return $query->count() > 0;
  121. }
  122. /**
  123. * 检查指定商户ID和ID组合是否存在对应的记录。
  124. *
  125. * 本函数用于查询数据库中是否存在特定商户ID和ID组合的记录,
  126. * 其中ID通常代表某个实体的唯一标识,而mer_id则表示该实体所属的商户ID。
  127. * 函数通过计算符合条件的记录数量来判断记录是否存在,如果数量大于0,则表示存在。
  128. *
  129. * @param int $merId 商户ID,用于限定查询的商户范围。
  130. * @param int $id 需要查询的ID,用于指定具体的实体。
  131. * @return bool 如果存在符合条件的记录,则返回true,否则返回false。
  132. * @throws DbException
  133. */
  134. public function merExists(int $merId, int $id)
  135. {
  136. // 通过StoreService获取数据库操作对象,并构造查询条件,查询指定ID、商户ID,并且未被删除的记录数量。
  137. return StoreService::getDB()->where($this->getPk(), $id)->where('mer_id', $merId)->where('is_del', 0)->count($this->getPk()) > 0;
  138. }
  139. /**
  140. * 检查用户是否已设置特定服务
  141. *
  142. * 本函数用于查询指定用户是否为特定商家设置了服务。通过传入用户的ID($uid)和商家的ID($merId),
  143. * 函数将查询数据库中是否存在相应的服务记录。如果存在,则表示用户已设置该服务;如果不存在,则表示用户未设置。
  144. * 可选参数$except允许指定一个服务ID进行排除查询,即查询时不包括指定的服务ID。
  145. *
  146. * @param string $merId 商家ID,用于指定查询的商家。
  147. * @param string $uid 用户ID,用于指定查询的用户。
  148. * @param int|null $except 可选参数,用于指定需要排除的服务ID。
  149. * @return bool 如果用户已设置服务则返回true,否则返回false。
  150. * @throws DbException
  151. */
  152. public function issetService($merId, $uid, ?int $except = null)
  153. {
  154. // 通过StoreService获取数据库操作对象,并构造查询条件
  155. // 查询条件包括:用户ID($uid)、商家ID($merId)、服务未被删除('is_del'为0)
  156. // 如果传入了$except参数,则进一步排除指定的服务ID
  157. return StoreService::getDB()->where('uid', $uid)->when($except, function ($query, $except) {
  158. $query->where($this->getPk(), '<>', $except);
  159. })->where('mer_id', $merId)->where('is_del', 0)->count($this->getPk()) > 0;
  160. }
  161. /**
  162. * 检查用户是否绑定特定服务
  163. *
  164. * 本函数用于查询指定用户是否绑定了一定的服务实例。通过传入用户的ID($uid),
  165. * 它可以在数据库中搜索与该用户ID相关联的服务绑定记录。如果可选参数$except被提供,
  166. * 函数将排除这个ID,不考虑它是否被绑定。
  167. *
  168. * @param int $uid 用户的唯一标识符。用于查询与该用户相关联的绑定记录。
  169. * @param int|null $except 可选参数,用于指定一个ID,函数将排除这个ID进行查询。
  170. * 这允许检查用户是否绑定了除特定ID之外的任何服务。
  171. * @return bool 如果用户绑定了至少一个服务,则返回true;否则返回false。
  172. * @throws DbException
  173. */
  174. public function isBindService($uid, ?int $except = null)
  175. {
  176. // 从StoreService获取数据库实例,并构造查询条件
  177. // 首先,查询与用户ID($uid)匹配的记录
  178. return StoreService::getDB()->where('uid', $uid)
  179. // 如果提供了$except参数,则添加额外的查询条件,排除特定ID
  180. ->when($except, function ($query, $except) {
  181. $query->where($this->getPk(), '<>', $except);
  182. })
  183. // 确保查询不包括已删除的记录
  184. ->where('is_del', 0)
  185. // 计算满足条件的记录数,如果大于0,则表示用户绑定了服务
  186. ->count($this->getPk()) > 0;
  187. }
  188. /**
  189. * 删除记录
  190. *
  191. * 本函数用于标记指定ID的数据记录为删除状态。在实际数据库操作中,并不直接物理删除记录,
  192. * 而是通过将记录的is_del字段设置为1来表示该记录已被删除。这种方式可以避免因误删导致的数据损失,
  193. * 同时也便于后续如果需要恢复数据或进行数据清理工作。
  194. *
  195. * @param int $id 需要被标记为删除的记录的ID
  196. * @return int 返回影响的行数,即被标记为删除的记录数
  197. * @throws DbException
  198. */
  199. public function delete(int $id)
  200. {
  201. // 通过StoreService获取数据库操作对象,并构造SQL语句,更新指定ID的记录的is_del字段为1
  202. return StoreService::getDB()->where($this->getPk(), $id)->update(['is_del' => 1]);
  203. }
  204. /**
  205. * 根据商家ID获取聊天服务信息
  206. *
  207. * 本函数旨在通过商家ID从数据库中检索与聊天服务相关的特定信息。
  208. * 它使用了StoreService的数据库访问功能来执行查询,并应用了多个条件来筛选结果,
  209. * 包括商家ID、是否被删除、以及状态。查询结果按照状态、排序和创建时间进行排序。
  210. * 最后,隐藏了is_del字段以防止其在结果中显示。
  211. *
  212. * @param string $merId 商家ID,用于查询特定商家的聊天服务信息。
  213. * @return array 返回符合查询条件的聊天服务信息数组,如果不存在则为null。
  214. * @throws DataNotFoundException
  215. * @throws DbException
  216. * @throws ModelNotFoundException
  217. */
  218. public function getChatService($merId)
  219. {
  220. // 使用StoreService的数据库访问方法执行查询
  221. return StoreService::getDB()->where('mer_id', $merId)->where('is_del', 0)->where('status', 1)->order('status DESC, sort DESC, create_time ASC')
  222. ->hidden(['is_del'])->find();
  223. }
  224. /**
  225. * 根据商家ID获取随机服务信息
  226. *
  227. * 本函数旨在从数据库中检索与特定商家ID相关联的服务,并从中随机选择一个返回。
  228. * 它首先根据一系列条件过滤服务,如是否开启、是否删除、状态等,然后按照特定排序规则获取数据。
  229. * 如果没有找到符合条件的服务,或者找到了但数量为1,则直接返回该服务(如果存在)。
  230. * 在有多个服务符合要求的情况下,会随机选择一个返回。
  231. *
  232. * @param string $merId 商家ID,用于查询特定商家的服务
  233. * @return array|null 返回随机选择的服务信息数组,如果没有找到符合条件的服务则返回null
  234. * @throws DataNotFoundException
  235. * @throws DbException
  236. * @throws ModelNotFoundException
  237. */
  238. public function getRandService($merId)
  239. {
  240. // 根据条件从数据库中查询符合要求的服务,排序规则为状态降序、排序降序、创建时间升序
  241. $services = StoreService::getDB()->where('mer_id', $merId)->where('is_open',1)->where('is_del', 0)->where('status', 1)->order('status DESC, sort DESC, create_time ASC')
  242. ->hidden(['is_del'])->select();
  243. // 检查查询结果是否存在且不为空
  244. if (!$services || !count($services)) return null;
  245. // 如果只找到一个服务,直接返回该服务
  246. if (count($services) === 1) {
  247. return $services[0];
  248. }
  249. // 随机选择一个服务返回,确保随机数在有效范围内
  250. return $services[max(random_int(0, count($services) - 1), 0)];
  251. }
  252. /**
  253. * 根据服务ID获取有效服务信息
  254. *
  255. * 本函数用于从数据库中查询指定服务ID的服务信息,只返回开启状态、正常状态且未被删除的服务。
  256. * 这样可以确保获取到的信息是当前可用的服务,避免了返回已关闭、异常或被删除的服务信息。
  257. *
  258. * @param int $id 服务ID
  259. * @return array 返回符合查询条件的服务信息数组,如果未找到则返回空数组。
  260. * @throws DataNotFoundException
  261. * @throws DbException
  262. * @throws ModelNotFoundException
  263. */
  264. public function getValidServiceInfo($id)
  265. {
  266. // 通过StoreService类的getDB方法获取数据库操作对象
  267. // 然后使用where方法指定查询条件,包括服务ID、服务状态、是否开启以及是否被删除
  268. // 最后使用hidden方法隐藏is_del字段,不将其返回给调用者
  269. // 返回查询结果,如果不存在符合要求的服务,则返回空数组
  270. return StoreService::getDB()->where('service_id', $id)->where('is_open',1)->where('status', 1)->where('is_del', 0)->hidden(['is_del'])->find();
  271. }
  272. /**
  273. * 获取通知服务信息
  274. *
  275. * 本函数用于查询指定商户ID的通知服务相关信息。
  276. * 通过筛选条件,获取到满足条件的记录中与通知服务相关的用户ID、电话和昵称信息。
  277. * 主要用于通知服务的查询和管理,确保通知对象的准确性和有效性。
  278. *
  279. * @param string $merId 商户ID,用于指定查询的商户范围。
  280. * @return array 返回一个包含用户ID、电话和昵称的数组,数组中的每个元素代表一个满足条件的通知服务对象。
  281. */
  282. public function getNoticeServiceInfo($merId)
  283. {
  284. // 使用StoreService的数据库操作对象,查询满足条件的通知服务信息。
  285. // 条件包括:商户ID为$merId,状态为启用,通知开启,未被删除。
  286. // 返回查询结果中uid, phone, nickname字段组成的列数组。
  287. return StoreService::getDB()->where('mer_id', $merId)->where('status', 1)->where('notify', 1)
  288. ->where('is_del', 0)->column('uid,phone,nickname');
  289. }
  290. /**
  291. * 将指定记录的状态设置为关闭
  292. *
  293. * 本函数通过传入的ID和字段名称,更新对应记录的状态为关闭(0)。
  294. * 主要用于在数据库中更新某些实体的状态,例如文章、订单等的关闭操作。
  295. *
  296. * @param int $id 主键ID,用于定位特定记录
  297. * @param string $field 需要与ID匹配的字段名称,允许灵活指定字段进行匹配而非固定主键
  298. */
  299. public function close($id,$field)
  300. {
  301. // 使用模型获取数据库实例,并通过where子句指定条件,更新记录的状态为0(关闭)
  302. $this->getModel()::getDB()->where($field, $id)->update(['status' => 0]);
  303. }
  304. }