<?php /** * Created by PhpStorm. * User: tangxingguo * Date: 2017/7/24 * Time: 11:51 */ namespace Apicp\Controller\Dailytask; use Com\PackageValidate; use Common\Common\Constant; use Common\Common\DailytaskConfig; use Common\Service\DailytaskService; use Common\Service\UserSignService; class SaveSignSettingController extends \Apicp\Controller\AbstractController { /** * SaveSignSetting * @author tangxingguo * @desc 保存、编辑签到设置接口 * @param Int is_open:true 是否开启(1=未开启;2=已开启) * @param Int sign_type:true 签到规则类型(1=固定获取积分;2=递增获取积分) * @param Int sign_fixed.day_integral 每天签到获取积分数(前提条件:sign_type=1) * @param Int sign_fixed.reward_rule.cycle 连续签到天数(前提条件:sign_type=1) * @param Int sign_fixed.reward_rule.integral 一次性获取积分数(前提条件:sign_type=1) * @param Int sign_cycle.cycle 递增周期天数(前提条件:sign_type=2) * @param Int sign_cycle.first 首次签到获取积分数(前提条件:sign_type=2) * @param Int sign_cycle.integral 每连续签到多一天获取的积分数(前提条件:sign_type=2) */ public function Index_post() { // 验证规则 $rules = [ 'is_open' => 'require|integer|in:1,2', 'sign_type' => 'require|integer|in:1,2', 'sign_fixed' => 'array', 'sign_cycle' => 'array', ]; // 验证数据 $validate = new PackageValidate($rules, [], array_keys($rules)); $postData = $validate->postData; // 检查数据格式 if ($postData['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) { $sqlData = ['is_open' => Constant::DAILYTASK_IS_OPEN_FALSE]; } else { $sqlData = $this->formatPostData($postData); } // 数据入库 $dailytaskServ = new DailytaskService(); $signSetting = $dailytaskServ->get_by_conds(['app' => Constant::APP_SIGN]); if (empty($signSetting)) { // 添加 $dailytaskServ->insert($sqlData); } else { // 修改 $dailytaskServ->update($signSetting['dailytask_id'], $sqlData); // 对比数据是否变动,将所有人连续签到天数修改为0 if ($postData['is_open'] == Constant::DAILYTASK_IS_OPEN_TRUE) { $dbData = unserialize($signSetting['rules']); $diff = $this->diffData($postData, $dbData); if (!$diff) { $signServ = new UserSignService(); $signServ->update_by_conds([], ['sign_total' => 0]); } } } // 如果关闭签到,则删除首页栏目推荐 if ($postData['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) { // 签到是否推荐到首页icon栏目 $model = new \Common\Model\CommonModel('recommender', 'oa_common_'); $is_icon = $model->count_by_conds([ 'type' => Constant::TYPE_ICON, 'system' => Constant::SYSTEM_NO, 'app_dir' => 'Sign', ]); // 删除推荐 if ($is_icon) { $model->delete_by_conds([ 'type' => Constant::TYPE_ICON, 'system' => Constant::SYSTEM_NO, 'app_dir' => 'Sign', ]); } } // 清除缓存 $taskConfig = &DailytaskConfig::instance(); $taskConfig->clearCacheData(Constant::APP_SIGN); } /** * @desc 格式化请求数据 * @author tangxingguo * @param array $data 请求数据 * @return array */ private function formatPostData($data) { $sqlData = [ // 数据标识(数据库内app字段) 'app' => Constant::APP_SIGN, // 是否开启签到 'is_open' => $data['is_open'], // 更新时间 'update_time' => MILLI_TIME, ]; // 检查必要数据 switch ($data['sign_type']) { // 固定签到 case Constant::DAILYTASK_SIGN_TYPE_IS_FIXED: if (!isset($data['sign_fixed']['day_integral'])) { E('_ERR_DAILYTASK_SIGN_INTEGRAL_EMPTY'); } if (isset($data['sign_fixed']['reward_rule'])) { if (!is_array($data['sign_fixed']['reward_rule'])) { E('_ERR_DAILYTASK_SIGN_FIXED_FORMAT_ERROR'); } foreach ($data['sign_fixed']['reward_rule'] as $v) { if (!isset($v['cycle'], $v['integral'])) { E('_ERR_DAILYTASK_SIGN_FIXED_FORMAT_ERROR'); } } // 规则排序 $cycles = array_column($data['sign_fixed']['reward_rule'], 'cycle'); array_multisort($cycles, SORT_ASC, $data['sign_fixed']['reward_rule']); } $sqlData['rules'] = serialize(['sign_type' => $data['sign_type'], 'sign_fixed' => $data['sign_fixed']]); break; // 递增签到 case Constant::DAILYTASK_SIGN_TYPE_IS_CYCLE: if (!isset($data['sign_cycle']['cycle'], $data['sign_cycle']['first'], $data['sign_cycle']['integral'])) { E('_ERR_DAILYTASK_SIGN_CYCLE_FORMAT_ERROR'); } $sqlData['rules'] = serialize(['sign_type' => $data['sign_type'], 'sign_cycle' => $data['sign_cycle']]); break; } return $sqlData; } /** * @desc 比较规则是否有变动 * @author tangxingguo * @param array $postData 提交的数据 * @param array $dbData 数据库数据 * @return bool */ private function diffData($postData, $dbData) { // 提交的签到规则与数据库规则不同 if ($postData['sign_type'] != $dbData['sign_type']) { return false; } // 对比数据 switch ($postData['sign_type']) { // 固定签到 case Constant::DAILYTASK_SIGN_TYPE_IS_FIXED: // 每天签到获取积分数不一样 if ($postData['sign_fixed']['day_integral'] != $dbData['sign_fixed']['day_integral']) { return false; } // 规则存在是否相同 if (isset($postData['sign_fixed']['reward_rule']) != isset($dbData['sign_fixed']['reward_rule'])) { return false; } // 都不存在规则 if (!isset($postData['sign_fixed']['reward_rule'], $dbData['sign_fixed']['reward_rule'])) { return true; } // 固定签到规则数量不一样 if (count($postData['sign_fixed']['reward_rule']) != count($dbData['sign_fixed']['reward_rule'])) { return false; } // 值对比(前提:已经排序) foreach ($postData['sign_fixed']['reward_rule'] as $k => $v) { if ($v['cycle'] != $dbData['sign_fixed']['reward_rule'][$k]['cycle'] || $v['integral'] != $dbData['sign_fixed']['reward_rule'][$k]['integral']) { return false; } } break; // 递增签到 case Constant::DAILYTASK_SIGN_TYPE_IS_CYCLE: if ($postData['sign_cycle']['cycle'] != $dbData['sign_cycle']['cycle'] || $postData['sign_cycle']['first'] != $dbData['sign_cycle']['first'] || $postData['sign_cycle']['integral'] != $dbData['sign_cycle']['integral']) { return false; } break; } return true; } }