PriceRuleRepository.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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\repositories\store;
  12. use app\common\dao\store\PriceRuleDao;
  13. use app\common\repositories\BaseRepository;
  14. use app\common\repositories\system\RelevanceRepository;
  15. use think\facade\Db;
  16. /**
  17. * 价格说明
  18. */
  19. class PriceRuleRepository extends BaseRepository
  20. {
  21. public function __construct(PriceRuleDao $dao)
  22. {
  23. $this->dao = $dao;
  24. }
  25. /**
  26. * 根据条件获取规则列表
  27. *
  28. * 本函数用于根据给定的条件数组$where,获取规则列表。支持分页查询,每页返回$limit条记录,当前页码为$page。
  29. * 返回的结果包含规则列表和总记录数。
  30. *
  31. * @param array $where 查询条件数组
  32. * @param int $page 当前页码
  33. * @param int $limit 每页返回的记录数
  34. * @return array 包含规则列表和总记录数的数组
  35. */
  36. public function lst(array $where, $page, $limit)
  37. {
  38. // 根据$where条件搜索规则,并按照'sort'降序和'rule_id'降序排序
  39. $query = $this->dao->search($where)->order('sort DESC, rule_id DESC');
  40. // 计算满足条件的总记录数
  41. $count = $query->count();
  42. // 获取当前页的规则列表,同时加载每个规则的分类信息
  43. $list = $query->page($page, $limit)->with(['cate'])->select();
  44. // 返回包含总记录数和规则列表的数组
  45. return compact('count', 'list');
  46. }
  47. /**
  48. * 创建规则
  49. *
  50. * 本函数用于根据提供的数据创建新的规则,并为其关联指定的分类ID。在创建规则的过程中,会确保规则的默认状态
  51. * 根据提供的分类ID的数量来决定。如果分类ID的数量大于0,则规则设为非默认;否则,设为默认规则。
  52. *
  53. * @param array $data 包含规则信息的数据数组,其中'cate_id'字段被用于关联分类,但会被随后移除。
  54. * @return mixed 返回创建的规则对象。
  55. */
  56. public function createRule(array $data)
  57. {
  58. // 将$data['cate_id']转换为数组,用于后续处理
  59. $cateIds = (array)$data['cate_id'];
  60. // 移除$data中的'cate_id'字段,因为它不再需要
  61. unset($data['cate_id']);
  62. // 使用事务处理来确保数据库操作的一致性
  63. return Db::transaction(function () use ($cateIds, $data) {
  64. // 根据$cateIds的长度判断是否设置规则为默认规则
  65. $data['is_default'] = count($cateIds) ? 0 : 1;
  66. // 创建新的规则对象
  67. $rule = $this->dao->create($data);
  68. // 初始化用于批量插入关联数据的数组
  69. $inserts = [];
  70. // 遍历分类ID数组,为每个分类ID创建关联数据
  71. foreach ($cateIds as $id) {
  72. $inserts[] = [
  73. 'left_id' => $rule['rule_id'],
  74. 'right_id' => (int)$id,
  75. 'type' => RelevanceRepository::PRICE_RULE_CATEGORY
  76. ];
  77. }
  78. // 如果有需要插入的关联数据,则进行插入操作
  79. if (count($inserts)) {
  80. app()->make(RelevanceRepository::class)->insertAll($inserts);
  81. }
  82. // 返回创建的规则对象
  83. return $rule;
  84. });
  85. }
  86. /**
  87. * 更新规则信息并同步更新关联分类。
  88. *
  89. * 本函数主要用于处理规则的更新操作,包括规则本身信息的更新以及规则与分类关联关系的更新。
  90. * 在更新规则信息时,会检查是否设置了默认规则,并根据情况更新此字段。同时,会清除原有的分类关联关系,
  91. * 并根据新的分类ID列表重建关联关系。
  92. *
  93. * @param int $id 规则ID,用于定位需要更新的规则。
  94. * @param array $data 包含规则更新信息和分类ID的数据数组。
  95. * @return bool 更新操作是否成功的标志。
  96. */
  97. public function updateRule(int $id, array $data)
  98. {
  99. // 将数据中的分类ID提取为数组,后续处理规则的默认状态和关联关系
  100. $cateIds = (array)$data['cate_id'];
  101. // 从更新数据中移除 cate_id 字段,因为它将通过其他方式处理
  102. unset($data['cate_id']);
  103. // 设置更新时间
  104. $data['update_time'] = date('Y-m-d H:i:s');
  105. // 使用事务处理来确保数据的一致性
  106. return Db::transaction(function () use ($id, $cateIds, $data) {
  107. // 如果分类ID数量大于0,则设置规则为非默认;否则设置为默认
  108. $data['is_default'] = count($cateIds) ? 0 : 1;
  109. // 更新规则本身的信息
  110. $this->dao->update($id, $data);
  111. // 准备插入的新分类关联关系数据
  112. $inserts = [];
  113. foreach ($cateIds as $cid) {
  114. $inserts[] = [
  115. 'left_id' => $id,
  116. 'right_id' => (int)$cid,
  117. 'type' => RelevanceRepository::PRICE_RULE_CATEGORY
  118. ];
  119. }
  120. // 删除原有的规则与分类关联关系
  121. app()->make(RelevanceRepository::class)->query([
  122. 'left_id' => $id,
  123. 'type' => RelevanceRepository::PRICE_RULE_CATEGORY
  124. ])->delete();
  125. // 如果有新的分类ID需要关联,则插入新的关联关系
  126. if (count($inserts)) {
  127. app()->make(RelevanceRepository::class)->insertAll($inserts);
  128. }
  129. });
  130. }
  131. }