ArticleUpdateController.class.php 7.58 KB
<?php
/**
 * ArticleUpdateController.class.php
 * 更新文章推荐 RPC 接口
 * @author Deepseath
 * @version $Id$
 */
namespace Rpc\Controller\Recommender;

use Common\Service\CommonRecommenderService;
use Common\Model\CommonRecommenderModel;
use Think\Log;
use Common\Common\DataRight;
use Common\Service\CommonRecommenderRightService;
use Think\Exception;
use Common\Model\CommonRecommenderRightModel;

/**
 * 更新文章推荐 RPC 接口
 * @uses 调用方法:\Com\Rpc::phprpc(rpc 接口 url)->invoke(接口方法名, 需要传入的参数数组key-value);
 */
class ArticleUpdateController extends AbstractController
{

    /**
     * 更新文章推荐信息
     * @desc 【RPC】更新文章推荐信息接口
     * @param string app:true 被推荐数据所在应用模块目录标识名
     * @param string dataCategoryId:true 被推荐数据所属的分类Id,可以为空,但必须提供该参数
     * @param string dataId:true 被推荐数据的原始数据 Id。<strong style="color: red">注意:请确保被推荐数据 app、dataCategoryId、dataId 联合值为唯一</strong>
     * @param string title:false: 文章标题
     * @param string summary:false: 文章摘要
     * @param string attachId:false: 封面图片附件 ID
     * @param string pic:false: 封面图片 url
     * @param string url:false: 文章链接
     * @param integer dateline:false:0 文章发布时间戳,不设置或者为空,则以推荐时间为准
     * @param string dataType:false:0 数据类型
     * @param integer endTime:false:0 数据有效期截止时间
     * @param array right:false 文章阅读权限范围 为空=全公司;array=有范围
     * <pre>
     * + users 用户 id 列表
     * + tags 标签 id 列表
     * + departments 部门 id 列表
     * + roles 角色 id 列表
     * + jobs 岗位 id 列表
     * </pre>
     * @return boolean
     */
    public function Index()
    {
        if (!$this->_checkKeyParams()) {
            return false;
        }

        $keys = [
            'title',
            'summary',
            'attachId',
            'pic',
            'url',
            'dateline',
            'right',
            'dataType',
            'endTime',
        ];
        foreach ($keys as $_key) {
            if (!isset($this->_params[$_key])) {
                $this->_params[$_key] = '';
            }
        }

        if (empty($this->_params['app']) && empty($this->_params['dataId']) && empty($this->_params['dataCategoryId'])) {
            Log::record('推荐的数据标记为空');
            return $this->_set_error('_ERR_RECOMMENDER_ARTICLE_NULL_90003');
        }

        $recommenderService = new CommonRecommenderService();
        // 判断推荐的数据是否已存在
        $exists = $recommenderService->getDuplicate(CommonRecommenderModel::TYPE_ARTICLE, $this->_params['app']
            , $this->_params['dataId']);
        if (!empty($exists)) {
            $recommenderId = $exists['recommender_id'];
        } else {
            Log::record('该数据尚未被推荐过,更新改为新增推荐:app=' . $this->_params['app'] . '; dataId=' . $this->_params['dataId']
                . '; dataCategoryId=' . $this->_params['dataCategoryId']);
            $recommenderId = null;
        }

        // 推荐主表数据
        $data = [
            'type' => CommonRecommenderModel::TYPE_ARTICLE,
            'displayorder' => CommonRecommenderModel::VALUE_DISPLAYORDER_MIN,
            'hide' => CommonRecommenderModel::HIDE_NO,
            'system' => CommonRecommenderModel::SYSTEM_NO,
            'title' => $this->_params['title'],
            'attach_id' => $this->_params['attachId'],
            'pic' => $this->_params['pic'],
            'url' => $this->_params['url'],
            'description' => $this->_params['summary'],
            'app_dir' => $this->_params['app'],
            'app_identifier' => APP_IDENTIFIER,
            'data_id' => $this->_params['dataId'],
            'data_category_id' => $this->_params['dataCategoryId'],
            'data' => [],
            'dateline' => !$this->_params['dateline'] ? MILLI_TIME : $this->_params['dateline'],
            'adminer_id' => '',
            'adminer' => '',
            'data_type' => $this->_params['dataType'],
            'end_time' => $this->_params['endTime'],
        ];
        // 推荐权限表基础数据
        $dataRight = [
            'recommender_id' => $recommenderId,
            'type' => $data['type'],
            'displayorder' => $recommenderId,
            'hide' => $data['hide'],
            'system' => $data['system'],
            'app_dir' => $data['app_dir'],
            'app_identifier' => $data['app_identifier'],
            'data_id' => $data['data_id'],
            'data_category_id' => $data['data_category_id'],
            'dateline' => $data['dateline'],
            'adminer_id' => '',
            'adminer' => ''
        ];

        try {
            $recommenderService->start_trans();

            // 更新推荐主表数据
            $recommenderId = $recommenderService->recommenderUpdate($data, $recommenderId);
            // 更新排序号
            if (empty($exists)) {
                $recommenderService->update($recommenderId, [
                    'displayorder' => $recommenderId
                ]);
            }
            // 检查banner,存在更新banner信息
            $bannerInfo = $recommenderService->get_by_conds([
                'type' => CommonRecommenderModel::TYPE_BANNER,
                'app_dir' => $data['app_dir'],
                'data_id' => $data['data_id'],
            ]);
            if (!empty($bannerInfo)) {
                $newBanner = [
                    'title' => $this->_params['title'],
                    'attach_id' => $this->_params['attachId'],
                    'pic' => $this->_params['pic'],
                    'url' => $this->_params['url'],
                ];
                $recommenderService->update($bannerInfo['recommender_id'], $newBanner);
            }
            // 结束主表数据更新

            // 更新权限表
            $dataRight['recommender_id'] = $recommenderId;
            $dataRight['displayorder'] = $recommenderId;

            $recommenderRightService = new CommonRecommenderRightService();
            $dataRightService = new DataRight($recommenderRightService, [
                'field_obj_type' => 'obj_type',
                'field_obj_id' => 'obj_id',
                'field_data_id' => 'recommender_id',
                'obj_id_all' => CommonRecommenderRightModel::OBJ_ID_ALL_VALUE
            ]);
            // 初始化权限范围为全公司
            $rightData = [];
            if ($this->_params['right'] && is_array($this->_params['right'])) {
                // 如果传入了权限信息则设置权限数据
                $rightData = $this->_params['right'];
            }
            $dataRightService->update($recommenderId, $dataRight, $rightData);
            // 结束权限表更新

            $recommenderService->commit();
        } catch (Exception $e) {
            $recommenderService->rollback();
            $data['recommender_id'] = $recommenderId;
            Log::record('<!-- 更新推荐数据(失败):');
            Log::record(print_r($data, true));
            Log::record(print_r($e, true));
            Log::record('结束更新推荐数据 -->');
            return E(L('_ERR_RECOMMENDER_RPC_ARTICLE_UPDATE_ERROR_90009'));
        }

        $data['recommender_id'] = $recommenderId;
        Log::record('<!-- 更新推荐数据:');
        Log::record(print_r($data, true));
        Log::record('结束更新推荐数据 -->');

        return true;
    }
}