diff --git a/application/common.php b/application/common.php
index 6c146e1..d77f951 100644
--- a/application/common.php
+++ b/application/common.php
@@ -1,5 +1,15 @@
 <?php
 
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\Cell\DataType;
+use PhpOffice\PhpSpreadsheet\IOFactory;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Style\Alignment;
+use PhpOffice\PhpSpreadsheet\Style\Border;
+use PhpOffice\PhpSpreadsheet\Style\Color;
+use PhpOffice\PhpSpreadsheet\Style\Fill;
+use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
+use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
 use service\DataService;
 use service\NodeService;
 use service\RandomService;
@@ -206,6 +216,313 @@ function is_really_writable($file)
     return TRUE;
 }
 
+/**
+ * 使用PHPEXECL导入
+ *
+ * @param string $file 文件地址
+ * @param int $sheet 工作表sheet(传0则获取第一个sheet)
+ * @param int $columnCnt 列数(传0则自动获取最大列)
+ * @param array $options 操作选项
+ *                          array mergeCells 合并单元格数组
+ *                          array formula    公式数组
+ *                          array format     单元格格式数组
+ *
+ * @return array
+ * @throws Exception
+ */
+function importExcel(string $file = '', int $sheet = 0, int $columnCnt = 0, &$options = [])
+{
+    try {
+        /* 转码 */
+        $file = iconv("utf-8", "gb2312", $file);
+        if (empty($file) OR !file_exists($file)) {
+            throw new \Exception('文件不存在!');
+        }
+
+        /** @var Xlsx $objRead */
+        $objRead = IOFactory::createReader('Xlsx');
+
+        if (!$objRead->canRead($file)) {
+            /** @var Xls $objRead */
+            $objRead = IOFactory::createReader('Xls');
+
+            if (!$objRead->canRead($file)) {
+                throw new \Exception('只支持导入Excel文件!');
+            }
+        }
+
+        /* 如果不需要获取特殊操作,则只读内容,可以大幅度提升读取Excel效率 */
+        empty($options) && $objRead->setReadDataOnly(true);
+        /* 建立excel对象 */
+        $obj = $objRead->load($file);
+        /* 获取指定的sheet表 */
+        $currSheet = $obj->getSheet($sheet);
+
+        if (isset($options['mergeCells'])) {
+            /* 读取合并行列 */
+            $options['mergeCells'] = $currSheet->getMergeCells();
+        }
+
+        if (0 == $columnCnt) {
+            /* 取得最大的列号 */
+            $columnH = $currSheet->getHighestColumn();
+            /* 兼容原逻辑,循环时使用的是小于等于 */
+            $columnCnt = Coordinate::columnIndexFromString($columnH);
+        }
+
+        /* 获取总行数 */
+        $rowCnt = $currSheet->getHighestRow();
+        $data = [];
+
+        /* 读取内容 */
+        for ($_row = 1; $_row <= $rowCnt; $_row++) {
+            $isNull = true;
+
+            for ($_column = 1; $_column <= $columnCnt; $_column++) {
+                $cellName = Coordinate::stringFromColumnIndex($_column);
+                $cellId = $cellName . $_row;
+                $cell = $currSheet->getCell($cellId);
+
+                if (isset($options['format'])) {
+                    /* 获取格式 */
+                    $format = $cell->getStyle()->getNumberFormat()->getFormatCode();
+                    /* 记录格式 */
+                    $options['format'][$_row][$cellName] = $format;
+                }
+
+                if (isset($options['formula'])) {
+                    /* 获取公式,公式均为=号开头数据 */
+                    $formula = $currSheet->getCell($cellId)->getValue();
+
+                    if (0 === strpos($formula, '=')) {
+                        $options['formula'][$cellName . $_row] = $formula;
+                    }
+                }
+
+                if (isset($format) && 'm/d/yyyy' == $format) {
+                    /* 日期格式翻转处理 */
+                    $cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd');
+                }
+
+                $data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());
+
+                if (!empty($data[$_row][$cellName])) {
+                    $isNull = false;
+                }
+            }
+
+            /* 判断是否整行数据为空,是的话删除该行数据 */
+            if ($isNull) {
+                unset($data[$_row]);
+            }
+        }
+
+        return $data;
+    } catch (\Exception $e) {
+        throw $e;
+    }
+}
+
+/**
+ * Excel导出,TODO 可继续优化
+ *
+ * @param array $datas 导出数据,格式['A1' => 'XXXX公司报表', 'B1' => '序号']
+ * @param string $fileName 导出文件名称
+ * @param array $options 操作选项,例如:
+ *                           bool   print       设置打印格式
+ *                           string freezePane  锁定行数,例如表头为第一行,则锁定表头输入A2
+ *                           array  setARGB     设置背景色,例如['A1', 'C1']
+ *                           array  setWidth    设置宽度,例如['A' => 30, 'C' => 20]
+ *                           bool   setBorder   设置单元格边框
+ *                           array  mergeCells  设置合并单元格,例如['A1:J1' => 'A1:J1']
+ *                           array  formula     设置公式,例如['F2' => '=IF(D2>0,E42/D2,0)']
+ *                           array  format      设置格式,整列设置,例如['A' => 'General']
+ *                           array  alignCenter 设置居中样式,例如['A1', 'A2']
+ *                           array  bold        设置加粗样式,例如['A1', 'A2']
+ *                           string savePath    保存路径,设置后则文件保存到服务器,不通过浏览器下载
+ * @return bool
+ */
+function exportExcel(array $datas, string $fileName = '', array $options = []): bool
+{
+    try {
+        if (empty($datas)) {
+            return false;
+        }
+
+        set_time_limit(0);
+        /** @var Spreadsheet $objSpreadsheet */
+        $objSpreadsheet = app(Spreadsheet::class);
+        /* 设置默认文字居左,上下居中 */
+        $styleArray = [
+            'alignment' => [
+                'horizontal' => Alignment::HORIZONTAL_LEFT,
+                'vertical' => Alignment::VERTICAL_CENTER,
+            ],
+        ];
+        $objSpreadsheet->getDefaultStyle()->applyFromArray($styleArray);
+        /* 设置Excel Sheet */
+        $activeSheet = $objSpreadsheet->setActiveSheetIndex(0);
+
+        /* 打印设置 */
+        if (isset($options['print']) && $options['print']) {
+            /* 设置打印为A4效果 */
+            $activeSheet->getPageSetup()->setPaperSize(PageSetup:: PAPERSIZE_A4);
+            /* 设置打印时边距 */
+            $pValue = 1 / 2.54;
+            $activeSheet->getPageMargins()->setTop($pValue / 2);
+            $activeSheet->getPageMargins()->setBottom($pValue * 2);
+            $activeSheet->getPageMargins()->setLeft($pValue / 2);
+            $activeSheet->getPageMargins()->setRight($pValue / 2);
+        }
+
+        /* 行数据处理 */
+        foreach ($datas as $sKey => $sItem) {
+            /* 默认文本格式 */
+            $pDataType = DataType::TYPE_STRING;
+
+            /* 设置单元格格式 */
+            if (isset($options['format']) && !empty($options['format'])) {
+                $colRow = Coordinate::coordinateFromString($sKey);
+
+                /* 存在该列格式并且有特殊格式 */
+                if (isset($options['format'][$colRow[0]]) &&
+                    NumberFormat::FORMAT_GENERAL != $options['format'][$colRow[0]]) {
+                    $activeSheet->getStyle($sKey)->getNumberFormat()
+                        ->setFormatCode($options['format'][$colRow[0]]);
+
+                    if (false !== strpos($options['format'][$colRow[0]], '0.00') &&
+                        is_numeric(str_replace(['¥', ','], '', $sItem))) {
+                        /* 数字格式转换为数字单元格 */
+                        $pDataType = DataType::TYPE_NUMERIC;
+                        $sItem = str_replace(['¥', ','], '', $sItem);
+                    }
+                } elseif (is_int($sItem)) {
+                    $pDataType = DataType::TYPE_NUMERIC;
+                }
+            }
+
+            $activeSheet->setCellValueExplicit($sKey, $sItem, $pDataType);
+
+            /* 存在:形式的合并行列,列入A1:B2,则对应合并 */
+            if (false !== strstr($sKey, ":")) {
+                $options['mergeCells'][$sKey] = $sKey;
+            }
+        }
+
+        unset($datas);
+
+        /* 设置锁定行 */
+        if (isset($options['freezePane']) && !empty($options['freezePane'])) {
+            $activeSheet->freezePane($options['freezePane']);
+            unset($options['freezePane']);
+        }
+
+        /* 设置宽度 */
+        if (isset($options['setWidth']) && !empty($options['setWidth'])) {
+            foreach ($options['setWidth'] as $swKey => $swItem) {
+                $activeSheet->getColumnDimension($swKey)->setWidth($swItem);
+            }
+
+            unset($options['setWidth']);
+        }
+
+        /* 设置背景色 */
+        if (isset($options['setARGB']) && !empty($options['setARGB'])) {
+            foreach ($options['setARGB'] as $sItem) {
+                $activeSheet->getStyle($sItem)
+                    ->getFill()->setFillType(Fill::FILL_SOLID)
+                    ->getStartColor()->setARGB(Color::COLOR_YELLOW);
+            }
+
+            unset($options['setARGB']);
+        }
+
+        /* 设置公式 */
+        if (isset($options['formula']) && !empty($options['formula'])) {
+            foreach ($options['formula'] as $fKey => $fItem) {
+                $activeSheet->setCellValue($fKey, $fItem);
+            }
+
+            unset($options['formula']);
+        }
+
+        /* 合并行列处理 */
+        if (isset($options['mergeCells']) && !empty($options['mergeCells'])) {
+            $activeSheet->setMergeCells($options['mergeCells']);
+            unset($options['mergeCells']);
+        }
+
+        /* 设置居中 */
+        if (isset($options['alignCenter']) && !empty($options['alignCenter'])) {
+            $styleArray = [
+                'alignment' => [
+                    'horizontal' => Alignment::HORIZONTAL_CENTER,
+                    'vertical' => Alignment::VERTICAL_CENTER,
+                ],
+            ];
+
+            foreach ($options['alignCenter'] as $acItem) {
+                $activeSheet->getStyle($acItem)->applyFromArray($styleArray);
+            }
+
+            unset($options['alignCenter']);
+        }
+
+        /* 设置加粗 */
+        if (isset($options['bold']) && !empty($options['bold'])) {
+            foreach ($options['bold'] as $bItem) {
+                $activeSheet->getStyle($bItem)->getFont()->setBold(true);
+            }
+
+            unset($options['bold']);
+        }
+
+        /* 设置单元格边框,整个表格设置即可,必须在数据填充后才可以获取到最大行列 */
+        if (isset($options['setBorder']) && $options['setBorder']) {
+            $border = [
+                'borders' => [
+                    'allBorders' => [
+                        'borderStyle' => Border::BORDER_THIN, // 设置border样式
+                        'color' => ['argb' => 'FF000000'], // 设置border颜色
+                    ],
+                ],
+            ];
+            $setBorder = 'A1:' . $activeSheet->getHighestColumn() . $activeSheet->getHighestRow();
+            $activeSheet->getStyle($setBorder)->applyFromArray($border);
+            unset($options['setBorder']);
+        }
+
+        $fileName = !empty($fileName) ? $fileName : (date('YmdHis') . '.xlsx');
+
+        if (!isset($options['savePath'])) {
+            /* 直接导出Excel,无需保存到本地,输出07Excel文件 */
+            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            header(
+                "Content-Disposition:attachment;filename=" . iconv(
+                    "utf-8", "GB2312//TRANSLIT", $fileName
+                )
+            );
+            header('Cache-Control: max-age=0');//禁止缓存
+            $savePath = 'php://output';
+        } else {
+            $savePath = $options['savePath'];
+        }
+
+        ob_clean();
+        ob_start();
+        $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx');
+        $objWriter->save($savePath);
+        /* 释放内存 */
+        $objSpreadsheet->disconnectWorksheets();
+        unset($objSpreadsheet);
+        ob_end_flush();
+
+        return true;
+    } catch (Exception $e) {
+        return false;
+    }
+}
+
 /**
  * UTF8字符串加密
  * @param string $string
diff --git a/application/common/Model/DepartmentMember.php b/application/common/Model/DepartmentMember.php
index d69c3db..ded76e1 100644
--- a/application/common/Model/DepartmentMember.php
+++ b/application/common/Model/DepartmentMember.php
@@ -3,6 +3,12 @@
 namespace app\common\Model;
 
 
+use Exception;
+use service\RandomService;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\DbException;
+
 /**
  * 部门成员
  * Class ProjectMember
@@ -18,9 +24,9 @@ class DepartmentMember extends CommonModel
      * @param int $isOwner 是否拥有者
      * @param int $isPrincipal 是否负责人
      * @return DepartmentMember|MemberAccount
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws DbException
      */
     public function inviteMember($accountCode, $departmentCode = '', $isOwner = 0, $isPrincipal = 0)
     {
@@ -28,11 +34,11 @@ class DepartmentMember extends CommonModel
         if ($departmentCode) {
             $department = Department::where(['code' => $departmentCode])->find();
             if (!$department) {
-                throw new \Exception('该部门不存在', 1);
+                throw new Exception('该部门不存在', 1);
             }
             $hasJoined = self::where(['account_code' => $accountCode, 'department_code' => $departmentCode])->find();
             if ($hasJoined) {
-                throw new \Exception('已加入该部门', 2);
+                throw new Exception('已加入该部门', 2);
             }
             $data = [
                 'code' => createUniqueCode('departmentMember'),
@@ -53,8 +59,8 @@ class DepartmentMember extends CommonModel
         } else {
             try {
                 $result = MemberAccount::inviteMember($accountCode, $orgCode);
-            } catch (\Exception $e) {
-                throw new \Exception($e->getMessage(), 3);
+            } catch (Exception $e) {
+                throw new Exception($e->getMessage(), 3);
             }
             return $result;
         }
@@ -64,20 +70,20 @@ class DepartmentMember extends CommonModel
      * @param $accountCode
      * @param $departmentCode
      * @return bool
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws DbException
      */
     public function removeMember($accountCode, $departmentCode)
     {
         $orgCode = getCurrentOrganizationCode();
         $department = Department::where(['code' => $departmentCode])->find();
         if (!$department) {
-            throw new \Exception('该部门不存在', 1);
+            throw new Exception('该部门不存在', 1);
         }
         $hasJoined = self::where(['account_code' => $accountCode, 'department_code' => $departmentCode])->find();
         if (!$hasJoined) {
-            throw new \Exception('尚未加入该部门', 2);
+            throw new Exception('尚未加入该部门', 2);
         }
         $result = $hasJoined->delete();
         $department_codes = self::where(['account_code' => $accountCode, 'organization_code' => $orgCode])->column('department_code');
@@ -86,4 +92,88 @@ class DepartmentMember extends CommonModel
         MemberAccount::update(['department_code' => $department_codes], ['code' => $accountCode]);
         return $result;
     }
+
+    /**
+     * 导入成员
+     * @param \think\File $file
+     * @return bool
+     * @throws Exception
+     */
+    public function uploadFile(\think\File $file)
+    {
+        try {
+            $data = importExcel($file->getInfo()['tmp_name']);
+        } catch (Exception $e) {
+            return error('201', $e->getMessage());
+        }
+        $count = 0;
+        if ($data) {
+            $organizationCode = getCurrentOrganizationCode();
+            foreach ($data as $key => $item) {
+                if ($key > 3) {
+                    $name = trim($item['A']);
+                    $email = trim($item['B']);
+                    $departments = trim($item['C']);
+                    $position = trim($item['D']);
+                    $mobile = trim($item['E']);
+                    $password = trim($item['F']);
+                    $description = trim($item['G']);
+                    $member = Member::where(['email' => $email])->find();
+                    if (!$member) {
+                        //注册新账号
+                        $memberData = [
+                            'email' => $email,
+                            'name' => $name,
+                            'account' => RandomService::alnumLowercase(),
+                            'avatar' => 'https://static.vilson.xyz/cover.png',
+                            'status' => 1,
+                            'code' => createUniqueCode('member'),
+                            'password' => $password ? md5($password) : '',
+//                            'mobile' => $mobile,
+                        ];
+                        try {
+                            $result = Member::createMember($memberData);
+                        } catch (Exception $e) {
+                            return error(1, $e->getMessage());
+                        }
+                        $member = Member::get($result->id);
+                        $memberAccount = MemberAccount::inviteMember($member['code'], $organizationCode, $position, $mobile, '', $description);
+                        if (!isError($memberAccount)) {
+                            $count++;
+                        }
+                    } else {
+                        $memberAccount = MemberAccount::where(['member_code' => $member['code'], 'organization_code' => $organizationCode])->find();
+                    }
+                    if ($departments) {
+                        $departmentList = explode(';', $departments);
+                        if ($departmentList) {
+                            foreach ($departmentList as $departmentItems) {
+                                $departmentNames = explode('/', $departmentItems);
+                                if ($departmentNames) {
+                                    $department = null;
+                                    $pcode = '';
+                                    foreach ($departmentNames as $key => $departmentName) {
+                                        $department = Department::where(['name' => $departmentNames, 'pcode' => $pcode, 'organization_code' => $organizationCode])->find();
+                                        if (!$department) {
+                                            break;
+                                        }
+                                        $pcode = $department['code'];
+                                    }
+                                    if ($department) {
+                                        try {
+                                            $this->inviteMember($memberAccount['code'], $department['code']);
+                                        } catch (Exception $e) {
+                                            return error(2, $e->getMessage());
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+        return $count;
+    }
 }
diff --git a/application/common/Model/Member.php b/application/common/Model/Member.php
index a27d908..7767993 100644
--- a/application/common/Model/Member.php
+++ b/application/common/Model/Member.php
@@ -2,12 +2,18 @@
 
 namespace app\common\Model;
 
+use Exception;
 use PDOStatement;
 use service\JwtService;
 use service\NodeService;
 use service\RandomService;
 use think\Db;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\DbException;
+use think\exception\PDOException;
 use think\File;
+use think\Model;
 
 class Member extends CommonModel
 {
@@ -23,7 +29,17 @@ class Member extends CommonModel
         $list = MemberAccount::where(['member_code' => $member['code']])->order('id asc')->select()->toArray();
         $organizationList = [];
         if ($list) {
-            foreach ($list as $item) {
+            foreach ($list as &$item) {
+                $departments = '';
+                $departmentCodes = $item['department_code'];
+                if ($departmentCodes) {
+                    $departmentCodes = explode(',', $departmentCodes);
+                    foreach ($departmentCodes as $departmentCode) {
+                        $department = Department::where(['code' => $departmentCode])->field('name')->find();
+                        $departments .= "{$department['name']} ";
+                    }
+                }
+                $item['department'] = $departments;
                 $organization = Organization::where(['code' => $item['organization_code']])->find();
                 if ($organization) {
                     $organizationList[] = $organization;
@@ -51,9 +67,9 @@ class Member extends CommonModel
     /**
      * @param $memberData
      * @return Member
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws DbException
      */
     public static function createMember($memberData)
     {
@@ -128,10 +144,10 @@ class Member extends CommonModel
     /**
      * 钉钉登录
      * @param $userInfo
-     * @return Member|array|PDOStatement|string|\think\Model|null
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @return Member|array|PDOStatement|string|Model|null
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws DbException
      */
     public static function dingtalkLogin($userInfo)
     {
@@ -186,8 +202,8 @@ class Member extends CommonModel
      * @param File $file
      * @return array|bool
      * @throws \think\Exception
-     * @throws \think\exception\PDOException
-     * @throws \Exception
+     * @throws PDOException
+     * @throws Exception
      */
     public function uploadImg(File $file)
     {
diff --git a/application/common/Model/MemberAccount.php b/application/common/Model/MemberAccount.php
index 5fc93de..642e140 100644
--- a/application/common/Model/MemberAccount.php
+++ b/application/common/Model/MemberAccount.php
@@ -2,8 +2,13 @@
 
 namespace app\common\Model;
 
+use Exception;
 use service\NodeService;
 use think\Db;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\DbException;
+use think\exception\PDOException;
 use think\File;
 
 class MemberAccount extends CommonModel
@@ -13,9 +18,9 @@ class MemberAccount extends CommonModel
 
     /**
      * 获取当前用户菜单
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws DbException
      */
     public static function getAuthMenuList()
     {
@@ -29,12 +34,16 @@ class MemberAccount extends CommonModel
      * 邀请成员
      * @param $memberCode
      * @param $organizationCode
+     * @param string $position
+     * @param string $mobile
+     * @param string $department
+     * @param string $description
      * @return MemberAccount
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
      */
-    public static function inviteMember($memberCode, $organizationCode)
+    public static function inviteMember($memberCode, $organizationCode, $position = '', $mobile = '', $department = '', $description = '')
     {
         $hasJoined = MemberAccount::where(['member_code' => $memberCode, 'organization_code' => $organizationCode])->find();
         if ($hasJoined) {
@@ -50,8 +59,9 @@ class MemberAccount extends CommonModel
             $authId = $auth['id'];//权限id
         }
         $data = [
-            'position' => '资深工程师',
-            'department' => '某某公司-某某某事业群-某某平台部-某某技术部',
+            'position' => $position,
+            'department' => $department ?? '某某公司-某某某事业群-某某平台部-某某技术部',
+            'description' => $description ?? '',
             'code' => createUniqueCode('memberAccount'),
             'member_code' => $memberCode,
             'organization_code' => $organizationCode,
@@ -60,6 +70,7 @@ class MemberAccount extends CommonModel
             'status' => 1,
             'create_time' => nowTime(),
             'name' => $memberDate['name'],
+            'mobile' => $mobile,
             'email' => $memberDate['email'],
         ];
         return MemberAccount::create($data);
@@ -69,8 +80,8 @@ class MemberAccount extends CommonModel
      * @param File $file
      * @return array|bool
      * @throws \think\Exception
-     * @throws \think\exception\PDOException
-     * @throws \Exception
+     * @throws PDOException
+     * @throws Exception
      */
     public function uploadImg(File $file)
     {
@@ -100,7 +111,7 @@ class MemberAccount extends CommonModel
     /**
      * @param $accountCode
      * @return bool
-     * @throws \Exception
+     * @throws Exception
      */
     public function del($accountCode)
     {
@@ -116,9 +127,9 @@ class MemberAccount extends CommonModel
                 DepartmentMember::where(['account_code' => $accountCode, 'organization_code' => $orgCode])->delete();
             }
             Db::commit();
-        } catch (\Exception $e) {
+        } catch (Exception $e) {
             Db::rollback();
-            throw new \Exception($e->getMessage(), 201);
+            throw new Exception($e->getMessage(), 201);
         }
         return true;
     }
diff --git a/application/common/Model/Project.php b/application/common/Model/Project.php
index 12d6856..9f9c034 100644
--- a/application/common/Model/Project.php
+++ b/application/common/Model/Project.php
@@ -65,6 +65,7 @@ class Project extends CommonModel
                 'name' => $name,
                 'description' => $description,
                 'organization_code' => $orgCode,
+                'task_board_theme' => 'simple',
                 'cover' => FileService::getFilePrefix() . 'static/image/default/project-cover.png'
             ];
             $result = self::create($project);
diff --git a/application/project/controller/DepartmentMember.php b/application/project/controller/DepartmentMember.php
index 1ad6414..91315c9 100644
--- a/application/project/controller/DepartmentMember.php
+++ b/application/project/controller/DepartmentMember.php
@@ -5,7 +5,12 @@ namespace app\project\controller;
 use app\common\Model\Member;
 use app\common\Model\MemberAccount;
 use controller\BasicApi;
+use Exception;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\DbException;
 use think\facade\Request;
+use think\response\Download;
 
 /**
  * 部门成员
@@ -21,7 +26,7 @@ class DepartmentMember extends BasicApi
     }
 
     /**
-     * @throws \think\exception\DbException
+     * @throws DbException
      */
     public function index()
     {
@@ -46,9 +51,9 @@ class DepartmentMember extends BasicApi
 
     /**
      * 邀请成员查询
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws DbException
      */
     public function searchInviteMember()
     {
@@ -119,7 +124,7 @@ class DepartmentMember extends BasicApi
         }
         try {
             $this->model->inviteMember($data['accountCode'], $data['departmentCode']);
-        } catch (\Exception $e) {
+        } catch (Exception $e) {
             $this->error($e->getMessage(), $e->getCode());;
         }
         $this->success('');
@@ -136,9 +141,31 @@ class DepartmentMember extends BasicApi
         }
         try {
             $this->model->removeMember($data['accountCode'], $data['departmentCode']);
-        } catch (\Exception $e) {
+        } catch (Exception $e) {
             $this->error($e->getMessage(), $e->getCode());;
         }
         $this->success('');
     }
+
+    /**
+     * 下载导入成员模板
+     * @return Download
+     */
+    public function _downloadTemplate()
+    {
+        return download(env('root_path') . 'data/template/importMember.xlsx', '批量导入成员模板.xlsx');
+    }
+
+    /**
+     * 上传文件
+     */
+    public function uploadFile()
+    {
+        $count = $this->model->uploadFile(Request::file('file'));
+        if (isError($count)) {
+            $this->error($count['msg']);
+        }
+        $this->success('', $count);
+    }
+
 }
diff --git a/application/project/controller/Index.php b/application/project/controller/Index.php
index 6b08d98..7e59be6 100644
--- a/application/project/controller/Index.php
+++ b/application/project/controller/Index.php
@@ -3,6 +3,7 @@
 namespace app\project\controller;
 
 use app\common\Model\CommonModel;
+use app\common\Model\Department;
 use app\common\Model\Member;
 use app\common\Model\MemberAccount;
 use app\common\Model\Notify;
@@ -58,6 +59,18 @@ class Index extends BasicApi
             $member = getCurrentMember();
             $memberAccount = MemberAccount::where(['member_code' => $member['code'], 'organization_code' => $organizationCode])->find();
             $member = Member::where(['account' => $member['account']])->order('id asc')->find()->toArray();
+
+            $departments = '';
+            $departmentCodes = $memberAccount['department_code'];
+            if ($departmentCodes) {
+                $departmentCodes = explode(',', $departmentCodes);
+                foreach ($departmentCodes as $departmentCode) {
+                    $department = Department::where(['code' => $departmentCode])->field('name')->find();
+                    $departments .= "{$department['name']} ";
+                }
+            }
+            $member['position'] = $memberAccount['position'];
+            $member['department'] = $departments;
             $member['account_id'] = $memberAccount['id'];
             $member['is_owner'] = $memberAccount['is_owner'];
             $member['authorize'] = $memberAccount['authorize'];
@@ -66,7 +79,7 @@ class Index extends BasicApi
             setCurrentOrganizationCode($organizationCode);
 
             $list = MemberAccount::getAuthMenuList();
-            $this->success('', $list);
+            $this->success('', ['menuList' => $list, 'member' => $member]);
         }
         $this->error('请选择组织');
     }
@@ -101,6 +114,10 @@ class Index extends BasicApi
         $params = Request::only('mobile,mail,idcard,name,realname,avatar,id');
         $memberModel = new Member();
         $result = $memberModel->_edit($params, ['id' => Request::post('id')]);
+        if (isset($params['avatar'])) {
+            $member = Member::get($params['id']);
+            MemberAccount::update(['avatar' => $params['avatar']], ['member_code' => $member['code']]);
+        }
         if ($result) {
             $this->success('基本信息更新成功');
         }
@@ -114,6 +131,9 @@ class Index extends BasicApi
      */
     public function editPassword()
     {
+        var_dump(11);
+        die;
+
         $memberModel = new Member();
         $params = Request::only('password,newPassword,confirmPassword,id');
         $member = $memberModel->field('password')->get($params['id'])->toArray();
diff --git a/config/app.php b/config/app.php
index e7a2f35..7ba0810 100644
--- a/config/app.php
+++ b/config/app.php
@@ -6,7 +6,7 @@ return [
     // 应用名称
     'app_name'               => 'pearProject',
     // 应用版本
-    'app_version'            => '2.6.2',
+    'app_version'            => '2.7.0',
     // 应用地址
     'app_host'               => '',
     // 应用调试模式
diff --git a/data/template/importMember.xlsx b/data/template/importMember.xlsx
new file mode 100644
index 0000000..8aae9ef
Binary files /dev/null and b/data/template/importMember.xlsx differ