ExportController.class.php 8.52 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 16/9/17
 * Time: 22:47
 */

namespace Apicp\Controller\User;

use Com\PythonExcel;
use Common\Common\Constant;
use Common\Common\ExportDownload;
use Common\Common\User;
use Common\Common\Department;
use Common\Model\AttrModel;
use Common\Service\AttrService;
use Common\Service\UserService;

class ExportController extends AbstractController
{

    /**
     * 【通讯录】批量导出
     * @author zhonglei
     */
    public function Index_post()
    {
        $role = $this->_login->role;

        // 接收定义参数
        $dpId = I('post.department_id', '', 'trim');
        $keyword = I('post.keyword', '', 'trim');
        $status = I('post.status', '', 'trim');
        $active = I('post.active', '', 'trim');
        $mobile = I('post.mobile', '', 'trim');
        $email = I('post.email', '', 'trim');
        $jobIds = I('post.job_ids', '', 'trim');
        $roleIds = I('post.role_ids', '', 'trim');

        // UC查询条件
        $conds = [
            'departmentChildrenFlag' => UserService::DEPT_CHILDREN_FLAG,
            'memUsername' => $keyword,
            'memSubscribeStatus' => $status,
            'memMobile' => $mobile,
            'memEmail' => $email,
            'memActive' => $active
        ];
        if (!empty($dpId)) {
            $conds['dpIdList'] = (array)$dpId;
        } elseif (!empty($role['readDpIdList'])) {
            $conds['dpIdList'] = $role['readDpIdList'];
        }

        if (!empty($jobIds)) {
            $conds['jobIdList'] = (array)$jobIds;
        }

        if (!empty($roleIds)) {
            $conds['roleIdList'] = (array)$roleIds;
        }

        $newUser = new User();
        $userlist = $newUser->listAll($conds);

        // Excel单元格标题
        $attrServ = new AttrService();
        $attrs = $attrServ->getAttrList(true, array(), true);
        $titles = array();
        foreach ($attrs as $_attr) {
            if (1 == $_attr['is_required_cp'] || 1 == $_attr['is_required']) {
                $titles[] = array(
                    'value' => $_attr['attr_name'], // 单元格内容
                    'pattern' => array( // 单元格样式, 关于样式, 请参考: http://www.python-excel.org
                        'pattern' => 'solid',
                        'fore_colour' => 'red'
                    )
                );
            } else {
                $titles[] = $_attr['attr_name'];
            }
        }
        $titles[] = '加入状态';
        $titles[] = '微信插件';

        // 初始化标题简介数据
        $merge_titles = Constant::STAFF_LIST_TITLES_DESC;
        $merge_titles[] = array_values($titles);
        $merge_titles[] = Constant::STAFF_LIST_DATA;



        $title_xls[] = '填写说明';
        // 初始化默认值数据

        $deptServ = new Department();
        $rows = [];

        // 企业微信加入状态
        $joinStatus = [
            UserService::USER_STATUS_ALL => '全部',
            UserService::USER_STATUS_FOLLOW => '已加入',
            UserService::USER_STATUS_DISABLE => '已禁用',
            UserService::USER_STATUS_UNFOLLOW => '未加入'
        ];
        // 微信插件状态
        $wxPluginStatus = [
            1 => '已关注',
            0 => '未关注'
        ];

        foreach ($userlist as $v) {
            $row = [];

            foreach ($attrs as $attr) {
                $field_name = $attr['field_name'];
                $value = isset($v[$field_name]) ? $v[$field_name] : '';

                if (isset($v[$field_name])) {
                    // 根据属性类型格式化数据
                    switch ($attr['type']) {
                        // 日期
                        case AttrModel::ATTR_TYPE_DATE:
                            $value = rgmdate($value, 'Y-m-d');
                            break;
                        // 日期时间
                        case AttrModel::ATTR_TYPE_DATE_TIME:
                            $value = rgmdate($value, 'Y-m-d H:i:s');
                            break;
                        // 单选
                        case AttrModel::ATTR_TYPE_RADIO:
                            $default = '';
                            foreach ($attr['option'] as $val) {
                                if ($value == $val['value']) {
                                    $default = $val['name'];
                                    break;
                                }
                            }
                            $value = $default;
                            break;
                        // 下拉框单选
                        case AttrModel::ATTR_TYPE_DROPBOX:
                            $default = '';
                            foreach ($attr['option'] as $val) {
                                if ($value == $val['value']) {
                                    $default = $val['name'];
                                    break;
                                }
                            }
                            $value = $default;
                            break;
                        // 多选
                        case AttrModel::ATTR_TYPE_CHECKBOX:
                            $data = unserialize($value);
                            if (is_array($data)) {
                                $nameArr = array_column($data, 'name');
                                $value = implode(';', $nameArr);
                            }
                            break;
                        // 图片
                        case AttrModel::ATTR_TYPE_PICTURE:
                            $images = $attrServ->formatValueByType(AttrModel::ATTR_TYPE_PICTURE, $value);
                            if (!empty($images)) {
                                $urls = array_column($images, 'url');
                                if (is_array($urls)) {
                                    $value = implode(';', $urls);
                                }
                            }
                            break;
                        // 直属上级 V1.2.0版本迭代
                        case AttrModel::ATTR_TYPE_LEADER:
                            $leaders = $attrServ->formatValueByType(AttrModel::ATTR_TYPE_LEADER, $value, $userlist);
                            $value = '';
                            if (!empty($leaders)) {
                                $leaderName = '';
                                foreach ($leaders as $leader) {
                                    $leaderName .= $leader['name'] . ';';
                                }
                                $value = substr($leaderName, 0, -1);
                            }
                            break;
                    }
                }

                // 部门
                if ($field_name === 'dpName' && $v['dpName']) {
                    $dpIds = array_column($v['dpName'], 'dpId');
                    $dpNames = [];

                    foreach ($dpIds as $dpId) {
                        $dpNames[] = $deptServ->getCdNames($dpId);
                    }

                    $value = implode(';', $dpNames);
                }

                $row[] = $value;
            }

            // 企业微信加入状态
            $row[] = isset($joinStatus[$v['memSubscribeStatus']]) ? $joinStatus[$v['memSubscribeStatus']] : $v['memSubscribeStatus'];
            // 微信插件关注状态
            $row[] = isset($wxPluginStatus[$v['memWxpluginStatus']]) ? $wxPluginStatus[$v['memWxpluginStatus']] : $v['memWxpluginStatus'];

            if ($row) {
                $rows[] = $row;
            }
        }
        // 合并标题到数据中
        $data = array_merge($merge_titles, $rows);

        // 生成 Excel 并输出
        $filename = rgmdate(NOW_TIME, 'Y') . rgmdate(NOW_TIME, 'm') . rgmdate(NOW_TIME, 'd') . '_员工列表';

        // 生成文件路径
        $site_dir = ExportDownload::get_down_dir($this->_login->user['eaId'] . microtime(true));

        $ret = PythonExcel::instance()->write($site_dir . $filename . '.xls', $title_xls, $data);

        if ($ret) {
            // 数据写入到下载中心
            $conditon = [
                'title' => $filename,
                'ea_id' => $this->_login->user['eaId'],
                'type' => ExportDownload::EXCEL_TYPE,
                'size' => filesize($site_dir . $filename . '.xls'),
                'url' => $site_dir . $filename . '.xls',
                'username' => $this->_login->user['eaRealname'],
                'app_dir' => APP_DIR
            ];

            ExportDownload::insert_down_load($conditon);
        }

        return true;
    }
}