SaveController.class.php 5.52 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 16/9/17
 * Time: 22:43
 */

namespace Apicp\Controller\User;

use Com\Rpc;
use Common\Common\User;
use Common\Common\StudyMapRight;
use Common\Model\AttrModel;
use Common\Service\AttrService;
use Common\Service\UserService;

class SaveController extends AbstractController
{

    /**
     * 用户加入方式: 管理员添加
     */
    const ADMIN_ADD_JOIN = 1;

    /**
     * 【通讯录】人员保存
     * @author liyifei
     * @time   2016-09-17 22:43:59
     */
    public function Index_post()
    {

        $uid = I('post.uid', '', 'trim');
        $list = I('post.list');
        $dpIds = I('post.dp_ids');

        if (!$this->_managePower()) {
            E('_ERR_ADMIN_PERMISSION_DENIED');
        }
        
        if (empty($list) || empty($dpIds)) {
            E('_ERR_PARAM_IS_NULL');
        }

        // 以架构接口参数字段为键,拼接用户信息
        $attrServ = new AttrService();
        $attrs = $attrServ->getAttrList(true, array(), true);
        $data = [
            'dpIdList' => $dpIds
        ];

        $list = array_combine(array_column($list, 'field_name'), $list);

        foreach ($attrs as $attr) {
            $fieldName = $attr['field_name'];
            // 日期类型 为空时 跳过
            if (($attr['type'] == AttrModel::ATTR_TYPE_DATE) &&
                    empty($list[$fieldName]['attr_value'])) {
                continue;
            }
            // 防止前端未传参时,赋值为null,UC在保存自定义属性的值时,null会导致保存失败!
            $data[$fieldName] = $list[$fieldName]['attr_value'] !== null ? $list[$fieldName]['attr_value'] : '';

            // 图片、多选项,序列化存储在架构
            $serializeAttr = [
                AttrModel::ATTR_TYPE_CHECKBOX,
                AttrModel::ATTR_TYPE_PICTURE,
            ];
            if (in_array($list[$fieldName]['type'], $serializeAttr) && !empty($data[$fieldName])) {
                $data[$fieldName] = serialize($data[$fieldName]);
            }
        }

        // 调用验证接口,验证参数传值是否符合规范
        $errors = $attrServ->checkValue($data);
        if (!empty($errors)) {
            E($errors[0]);
        }

        // 编辑的时候不修改人员 加入方式
        if (empty($uid)) {
            // 邀请记录信息
            $data['memJoinType'] = self::ADMIN_ADD_JOIN;
            if (!empty($this->_login->user['eaRealname'])) {
                $data['memJoinInviter'] = $this->_login->user['eaRealname'];
            } elseif (!empty($this->_login->user['eaMobile'])) {
                $data['memJoinInviter'] = $this->_login->user['eaMobile'];
            } elseif (!empty($this->_login->user['eaEmail'])) {
                $data['memJoinInviter'] = $this->_login->user['eaEmail'];
            } else {
                $data['memJoinInviter'] = '';
            }
        }

        // =========学习地图业务逻辑 Start=========
        $userSdk = &User::instance();
        $user_old = [];

        // 编辑前获取用户完整数据,用于编辑后对比组织、岗位、角色变化
        if (!empty($uid)) {
            $user_old = $userSdk->getByUid($uid);

            // 未关注的用户不进行对比
            if (isset($user_old['memSubscribeStatus']) && $user_old['memSubscribeStatus'] != User::SUBSCRIBE_STATUS_SUBSCRIBED) {
                $user_old = [];
            }
        }
        // =========学习地图业务逻辑 End=========

        $userServ = new UserService();
        $result = $userServ->saveUser($uid, $data);

        // 新增、修改用户成功时,UC返回该用户的完整信息
        if (isset($result['memUid'])) {
            $uid = $result['memUid'];
        }

        // =========学习地图业务逻辑 Start=========
        if (!empty($user_old)) {
            $user_new = $userSdk->getByUid($uid);

            // 用户部门、岗位和角色数据有差异
            if ($this->_contrastRight($user_old, $user_new)) {
                // 获取新的可参与学习的地图ID
                $studyMapRight = &StudyMapRight::instance();
                $map_ids_old = $studyMapRight->listMapId($user_old);
                $map_ids_new = $studyMapRight->listMapId($user_new);
                $diff_ids = array_diff($map_ids_new, $map_ids_old);

                if (!empty($diff_ids)) {
                    $url = rpcUrl('/Map/Rpc/User/SendNotice');
                    $parmas = ['uid' => $uid, 'map_ids' => array_values($diff_ids)];
                    Rpc::phprpc($url)->invoke('index', $parmas);
                }
            }
        }
        // =========学习地图业务逻辑 End=========

        $this->_result = [
            'uid' => $uid
        ];
    }

    /**
     * 对比用户部门、岗位和角色数据,有差异则返回true
     * @param array $user_old 旧的用户数据
     * @param array $user_new 新的用户数据
     * @return bool
     */
    private function _contrastRight($user_old, $user_new)
    {
        // 获取旧数据中部门、岗位和角色ID
        $old_ids = array_column($user_old['dpName'], 'dpId');
        $old_ids[] = $user_old['job']['jobId'];
        $old_ids[] = $user_old['role']['roleId'];

        // 获取新数据中部门、岗位和角色ID
        $new_ids = array_column($user_new['dpName'], 'dpId');
        $new_ids[] = $user_new['job']['jobId'];
        $new_ids[] = $user_new['role']['roleId'];

        return !empty(array_diff($old_ids, $new_ids)) || !empty(array_diff($new_ids, $old_ids));
    }
}