diff --git a/application/api/controller/wdsxh/member/MemberBenefits.php b/application/api/controller/wdsxh/member/MemberBenefits.php index 0104f09..2926b18 100644 --- a/application/api/controller/wdsxh/member/MemberBenefits.php +++ b/application/api/controller/wdsxh/member/MemberBenefits.php @@ -20,16 +20,18 @@ class MemberBenefits extends Api protected $join_config_model = null; protected $level_model = null; - protected $benefits_model = null; protected $article_model = null; + protected $benefits_model = null; + protected $benefits_project_model = null; public function _initialize() { parent::_initialize(); $this->join_config_model = new \app\api\model\wdsxh\member\JoinConfig(); $this->level_model = new \app\api\model\wdsxh\member\Level(); - $this->benefits_model = new \app\api\model\wdsxh\member\MemberBenefits(); $this->article_model = new \app\api\model\wdsxh\article\Article(); + $this->benefits_model = new \app\api\model\wdsxh\member\MemberBenefits(); + $this->benefits_project_model = new \app\api\model\wdsxh\member\MemberBenefitsProject(); } /** @@ -63,36 +65,60 @@ class MemberBenefits extends Api // 查询该入会类型下的所有会员级别(按权重升序) $levels = $this->level_model - ->field(['id', 'join_config_id', 'name', 'image', 'fees', 'content']) + ->field(['id', 'join_config_id', 'benefits_project', 'name', 'image', 'fees', 'content']) ->where('join_config_id', $join_config_id) ->where('status', 'normal') ->order('weigh', 'asc') ->select(); // 查询该入会类型下的所有会员权益(按排序值升序,排除禁用的) + $levels_id = array_column($levels, 'id'); $all_benefits = $this->benefits_model ->field(['id', 'join_config_id', 'level_id', 'title', 'image', 'desc']) ->where('join_config_id', $join_config_id) + ->where('level_id', 'in', $levels_id) + ->where('disabled', 0) + ->order('sort', 'asc') + ->select(); + $benefis_maps = []; + foreach ($all_benefits as $key => $val) { + $benefis_maps['b_' . $val['level_id']][] = $val; + } + + // 查询该入会类型下的所有会员权益项目(按排序值升序,排除禁用的) + $all_benefits_project = $this->benefits_project_model + ->field(['id', 'join_config_id', 'name']) + ->where('join_config_id', $join_config_id) ->where('disabled', 0) ->order('sort', 'asc') ->select(); + $levels = collection($levels)->toArray(); // 为每个级别构建完整的权益列表(含 has 标记) $result_levels = []; foreach ($levels as $level) { - $benefits_with_flag = []; - foreach ($all_benefits as $key => $val) { - $benefits_with_flag[] = [ - 'id' => $val['id'], - 'join_config_id' => $val['join_config_id'], - 'title' => $val['title'], - 'image' => $val['image'], - 'desc' => $val['desc'], - 'has' => $level['id'] == $val['level_id'], + if (!isset($level['benefits'])) { + $level['benefits'] = []; + } + if (!empty($benefis_maps['b_' . $level['id']])) { + $level['benefits'][] = $benefis_maps['b_' . $level['id']]; + } + + $owned_ids = json_decode($level['benefits_project'], true) ?: []; + $owned_ids = array_map('intval', $owned_ids); + unset($level['benefits_project']); + if (!isset($level['all_benefits_projects'])) { + $level['all_benefits_projects'] = []; + } + foreach ($all_benefits_project as $v) { + $level['all_benefits_projects'][] = [ + 'id' => $v['id'], + 'join_config_id' => $v['join_config_id'], + 'name' => $v['name'], + 'has' => !empty($owned_ids) && in_array($val['id'], $owned_ids, true), ]; } - $level['benefits'] = $benefits_with_flag; $result_levels[] = $level; } diff --git a/application/api/model/wdsxh/member/MemberBenefitsProject.php b/application/api/model/wdsxh/member/MemberBenefitsProject.php new file mode 100644 index 0000000..ca50d05 --- /dev/null +++ b/application/api/model/wdsxh/member/MemberBenefitsProject.php @@ -0,0 +1,34 @@ + www.maiwd.cn +// +---------------------------------------------------------------------- +/** + * Class MemberBenefits + * Desc 会员权益项目模型 + * Create on 2024/3/8 9:56 + * Create by wangyafang + */ + +namespace app\api\model\wdsxh\member; + + +use app\api\model\wdsxh\Base; + +class MemberBenefitsProject extends Base +{ + // 表名 + protected $name = 'wdsxh_member_benefits_project'; + + // 自动写入时间戳字段 + protected $autoWriteTimestamp = false; + + // 定义时间戳字段名 + protected $createTime = false; + protected $updateTime = false; +}