ActivityService.class.php 6.82 KB
<?php
/**
 * Created by PhpStorm.
 * User: yingcai
 * Date: 2018/3/23
 * Time: 下午4:01
 */

namespace Common\Service;

use Com\Validate;
use Common\Common\Constant;
use Common\Model\ActivityModel;

class ActivityService extends AbstractService
{
    // 构造方法
    public function __construct()
    {
        $this->_d = new ActivityModel();

        parent::__construct();
    }

    /**
     * 验证活动数据
     *
     * @param array $activity 活动数据
     * @param int $activity_status 活动状态
     *
     * @return bool
     */
    public function validate_for_data(&$activity, $activity_status = 0)
    {
        // 验证规则
        $rules = array(
            'is_all' => 'require|in:0,1',
            'title' => 'require|max:20',
            'start_time' => 'require',
            'end_time' => 'require',
            'integral' => 'require|number',
            'prize_list' => 'require',
            'rule' => 'require',
            'prize_intro' => 'require',
            'is_push_msg' => 'require|in:0,1',
            'activity_status' => 'require|in:0,1,2',
            'num_limit' => 'number',
            'limit_type' => 'in:1,2',
        );

        // 错误提示
        $msgs = array(
            'is_all' => L('_ERR_IS_ALL_INVALID'),
            'title.require' => L('_EMPTY_ACTIVITY_TITLE'),
            'title.max' => L('_ERR_TITLE_LENGTH'),
            'start_time' => L('_EMPTY_BEGIN_TIME'),
            'end_time' => L('_EMPTY_END_TIME'),
            'integral' => L('_EMPTY_INTEGRAL'),
            'prize_list' => L('_EMPTY_PRIZE_LIST'),
            'rule' => L('_EMPTY_ACTIVITY_RULE'),
            'prize_intro' => L('_EMPTY_PRIZE_INTRO'),
            'is_push_msg' => L('_ERR_IS_PUSH_MSG_INVALID'),
            'activity_status.require' => L('_EMPTY_ACTIVITY_STATUS'),
            'activity_status.in' => L('_ERR_ACTIVITY_STATUS_INVALID'),
        );

        // 开始验证
        $validate = new Validate($rules, $msgs);
        if (!$validate->check($activity)) {

            E($validate->getError());
        }

        // 进行中的活动不验证时间(编辑时用到)
        if ($activity_status != Constant::STATUS_ING) {

            // 开始时间不能小于当前时间
            if ($activity['start_time'] <= MILLI_TIME) {

                E('_ERR_BEGIN_TIME_LT_NOW_TIME');
            }

            // 开始时间不能大于结束时间
            if ($activity['start_time'] > $activity['end_time']) {

                E('_ERR_BEGIN_TIME_GT_END_TIME');
            }
        }

        // 如果不是全公司 && 参与权限为空
        if ($activity['is_all'] != Constant::IS_ALL_TRUE && empty($activity['right'])) {

            E('_ERR_RIGHT_EMPTY');
        }

        // 验证积分数是否是正整数
        if ($activity['integral'] <= 0) {

            E('_ERR_INTEGRAL_NUM_LT_ZERO');
        }

        // 验证奖品数量
        if (count($activity['prize_list']) != Constant::PRIZE_LIMIT_NUM) {

            E('_ERR_PRIZE_NUM_EIGHT');
        }

        // 验证奖品参数
        foreach ($activity['prize_list'] as $val) {

            if (empty($val['name'])) {
                // 奖品名称不能为空
                E('_EMPTY_PRIZE_NAME');
            }

            if (!\Com\Validator::is_len_in_range($val['name'], 1, 6, 'utf-8')) {
                // 奖品名称长度超限
                E(L('_ERR_PRIZE_NAME_LENGTH',['name' => $val['name']]));
            }

            if (empty($val['cover_id'])) {
                // 奖品:{$name}图片不能为空
                E(L('_EMPTY_PRIZE_COVER', ['name' => $val['name']]));
            }

            // 如果是可中奖的奖品(是否视为未中奖(0:否,1:是))
            if (!$val['is_prize']) {

                if (!intval($val['num'])) {
                    // 奖品:{$name}数量不能为空
                    E(L('_EMPTY_PRIZE_NUM', ['name' => $val['name']]));
                }

                if (empty($val['percent']) || !is_numeric($val['percent'])) {
                    // 奖品:{$name}中奖概率不能为空
                    E(L('_EMPTY_PRIZE_PERCENT', ['name' => $val['name']]));
                }

                if (intval($val['num']) < intval($val['lottery_max'])) {
                    // 奖品:{$name}中奖限制次数不得超过奖品数量
                    E(L('_ERR_PRIZE_NUM_LT_LOTTERY_MAX', ['name' => $val['name']]));
                }
            }
        }

        // 奖品概率之和不能大于100
        $percens = array_sum(array_column($activity['prize_list'], 'percent'));
        if ($percens > 100) {

            E('_ERR_PRIZE_PERCENT_SUM_GT_HUNDRED');
        }

        $is_prize_status = array_column($activity['prize_list'], 'is_prize');

        // 必须有一个不可中奖的奖品
        if (!in_array(Constant::NO_PRIZE, $is_prize_status)) {

            E('_ERR_MAST_NOT_NOE_PRIZE');
        }
        // 必须有一个可中奖的奖品
        if (!in_array(Constant::HAVE_PRIZE, $is_prize_status) && Constant::PRIZE_LIMIT_NUM == count($is_prize_status)) {

            E('_ERR_MAST_NOE_PRIZE');
        }

        $activity['rule'] = serialize($activity['rule']);
        $activity['prize_intro'] = serialize($activity['prize_intro']);

        return true;
    }

    /**
     * 组装发送消息的数据
     *
     * @param  int $ac_id 活动ID
     * @param  array $activity 活动信息数组
     *
     * @return array
     */
    public function assemble_msg_params($ac_id, $activity)
    {

        $right_params = [];
        $params = [
            'ac_id' => $ac_id,
            'title' => $activity['title'],
            'start_time' => $activity['start_time'],
            'end_time' => $activity['end_time'],
            'integral' => $activity['integral'],
        ];

        // 全公司
        if ($activity['is_all'] == Constant::IS_ALL_TRUE) {

            $params['is_all'] = $activity['is_all'];
        } else {

            $right = $activity['right'];
            $rightServ = new RightService();
            // 获取参与活动权限范围
            $right_params = $rightServ->list_by_right($right);
        }

        return $params = array_merge($params, $right_params);
    }


    /**
     * 根据条件查询总数据条数
     * @param array $params
     * @return int|mixed
     */
    public function count_by_where($params = [])
    {
        return $this->_d->count_by_where($params);
    }

    /**
     * 根据条件查询数据列表
     * @param array $params 查询条件
     * @param null $page_option 分页参数
     * @param array $order_option 排序参数
     * @param string $fields 查询字段
     * @return array|bool
     */
    public function list_by_where($params = [], $page_option = null, $order_option = [], $fields = '*')
    {
        return $this->_d->list_by_where($params,$page_option,$order_option,$fields);
    }

}