CheckController.class.php 5.81 KB
<?php
/**
 * Created by PhpStorm.
 * User: Slok
 * Date: 16/9/30
 * Time: 09:57
 */

namespace Api\Controller\Invite;

use Com\PackageValidate;
use Common\Common\User;
use Common\Model\AttrModel;
use Common\Service\AttrService;
use Common\Service\InviteUserService;
use Common\Service\UserService;
use Think\Log;

class CheckController extends AbstractController
{
    // 提交的值
    protected $postData = [];
    // 人员邀请信息表
    protected $inviteUserServ = null;

    /**
     * 审批
     * @author zhonglei
     */
    public function Index_post()
    {
        $this->getRequestParams();

        // 获取邀请详情
        $this->inviteUserServ = new InviteUserService();
        $inviteDetail = $this->getInviteDetail();

        // 写入被邀请人 人员数据
        $result = [];
        if ($this->postData['check_status'] != InviteUserService::CHECK_STATUS_FAIL) {
            $result = $this->createUser($inviteDetail);
        }
        // 更新邀请数据
        $this->updateInviteUser($result);

        // 发送消息异常, 不影响主流程
        try {
            $this->inviteUserServ->sendNotice($inviteDetail,
                $this->postData['check_status'],
                $this->postData['reason']);
        } catch (\Exception $e) {
            Log::record("邀请人员-审批发送审批记过通知异常: " . $e->getMessage());
        }

        return true;
    }

    /**
     * 获取请求参数
     */
    private function getRequestParams()
    {
        $validate = new PackageValidate([
            'invite_id' => 'require',
            'check_status' => 'require|in:' . implode(',', [InviteUserService::CHECK_STATUS_PASS,
                    InviteUserService::CHECK_STATUS_FAIL]),
            'reason' => 'requireIf:check_status, ' . InviteUserService::CHECK_STATUS_FAIL . '|max:20',

        ], [
            'invite_id.require' => '_ERR_INVITE_ID_IS_NULL',
            'check_status.require' => L('_ERR_PARAM_CAN_NOT_EMPTY', ['name' => '审批类型']),
            'check_status.in' => '_ERR_INVITE_INVALID_STATUS',
            'reason.requireIf' => L('_ERR_REJECT_REASON_EMPTY'),
            'reason.max' => L('_ERR_INVITE_INVALID_STATUS', ['max' => 20]),
        ], [
            'invite_id',
            'check_status',
            'reason'
        ]);
        $this->postData = $validate->postData;

        return true;
    }

    /**
     * 获取邀请记录详情
     */
    private function getInviteDetail()
    {
        // 获取待审批人员信息
        $inviteDetail = $this->inviteUserServ->get_by_conds(['invite_id' => $this->postData['invite_id']]);
        if (empty($inviteDetail)) {
            E('_ERR_INVITE_DATA_IS_NULL');
        }

        // 待审批人员是否处于待审批状态
        if ($inviteDetail['check_status'] != InviteUserService::CHECK_STATUS_WAIT) {
            E('_ERR_INVITE_CHECKED');
        }

        // 判断审核权限
        if (!$this->_hasCheckPower($inviteDetail)) {
            E('_ERR_NO_PERMISSION_APPROVAL_');
        }

        return $inviteDetail;
    }

    /**
     * 创建用户
     * @param $inviteDetail
     * @return bool|mixed
     */
    private function createUser($inviteDetail)
    {
        // 格式化表单数据,将field_name设置为key
        $form = unserialize($inviteDetail['form']);
        $form = array_combine_by_key($form, 'field_name');
        if (empty($form['dpIdList'])) {
            E('_ERR_DEPT_UNDEFINED');
        }

        // 格式化人员你数据 并 创建人员
        $userServ = new UserService();
        $insertData = $this->formatInsertData($inviteDetail, $form, $userServ);
        return $userServ->saveUser('', $insertData);
    }

    /**
     * 封装新增用户数据
     * @param $inviteDetail
     * @param $form
     * @param $userServ
     * @return array
     */
    private function formatInsertData($inviteDetail, $form, $userServ)
    {
        // 以架构接口参数字段为键,拼接用户信息
        $attrService = new AttrService();
        $attrs = $attrService->getAttrList(true, [AttrModel::ATTR_TYPE_SPECIAL, AttrModel::ATTR_TYPE_LEADER]);

        $data = [
            'dpIdList' => (array)$form['dpIdList']['attr_value']
        ];

        foreach ($attrs as $attr) {
            $serializeAttr = [
                AttrModel::ATTR_TYPE_CHECKBOX,
                AttrModel::ATTR_TYPE_PICTURE,
            ];

            if (in_array($form[$attr['field_name']]['type'], $serializeAttr)
                && !empty($form[$attr['field_name']]['attr_value'])
            ) {
                $data[$attr['field_name']] = serialize($form[$attr['field_name']]['attr_value']);
            } else {
                $data[$attr['field_name']] = $form[$attr['field_name']]['attr_value'];
            }
        }

        $inviteUserInfo = User::instance()->getByUid($inviteDetail['invite_uid']);
        $data['memJoinType'] = $userServ::USER_INVITE_JOIN;
        $data['memJoinInviter'] = $inviteUserInfo['memUsername'];

        return $data;
    }

    /**
     * 更新邀请人员信息
     * @param $result
     * @return bool
     */
    protected function updateInviteUser($result)
    {
        // 修改审批人UID、该人员审批状态、审批时间
        $upData = [
            'check_uid' => $this->uid,
            'check_status' => $this->postData['check_status'],
            'check_time' => MILLI_TIME,
        ];
        if (isset($result['memUid'])) {
            $upData['uid'] = $result['memUid'];
        }
        // 驳回理由
        if ($this->postData['check_status'] == InviteUserService::CHECK_STATUS_FAIL) {
            $upData['reason'] = I('post.reason', '', 'trim');
        }

        $updateResult = $this->inviteUserServ->update($this->postData['invite_id'], $upData);
        if (!$updateResult) {
            E('_ERR_CHECK_FAILED');
        }

        return true;
    }
}