diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 3cc616ac4..40b9fc26c 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -2,8 +2,13 @@ namespace App\Http\Controllers\Api; +use App\Models\AbstractModel; +use App\Models\File; +use App\Models\ProjectTaskUser; +use App\Models\ProjectUser; use App\Models\User; use App\Models\UserEmailVerification; +use App\Models\UserTransfer; use App\Module\Base; use Arr; use Cache; @@ -494,16 +499,18 @@ class UsersController extends AbstractController * @apiGroup users * @apiName operation * - * @apiParam {Number} userid 会员ID - * @apiParam {String} [type] 操作 + * @apiParam {Number} userid 会员ID + * @apiParam {String} [type] 操作 * - setadmin 设为管理员 * - clearadmin 取消管理员 - * - setdisable 设为禁用 - * - cleardisable 取消禁用 + * - setdisable 设为离职(需要参数 disable_time、transfer_userid) + * - cleardisable 取消离职 * - delete 删除会员 - * @apiParam {String} [password] 新的密码 - * @apiParam {String} [nickname] 昵称 - * @apiParam {String} [profession] 职位 + * @apiParam {String} [password] 新的密码 + * @apiParam {String} [nickname] 昵称 + * @apiParam {String} [profession] 职位 + * @apiParam {String} [disable_time] 离职时间 + * @apiParam {String} [transfer_userid] 离职交接人 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -524,6 +531,7 @@ class UsersController extends AbstractController $userInfo->checkSystem(1); // $upArray = []; + $transferUser = null; switch ($type) { case 'setadmin': $upArray['identity'] = array_diff($userInfo->identity, ['admin']); @@ -537,7 +545,14 @@ class UsersController extends AbstractController case 'setdisable': $upArray['identity'] = array_diff($userInfo->identity, ['disable']); $upArray['identity'][] = 'disable'; - $upArray['disable_at'] = Carbon::now(); + $upArray['disable_at'] = Carbon::parse($data['disable_time']); + $transferUser = User::find(intval($data['transfer_userid'])); + if (empty($transferUser)) { + return Base::retError('请选择正确的交接人'); + } + if (in_array('disable', $transferUser->identity)) { + return Base::retError('交接人已离职,请选择另一个交接人'); + } break; case 'cleardisable': @@ -583,8 +598,18 @@ class UsersController extends AbstractController } } if ($upArray) { - $userInfo->updateInstance($upArray); - $userInfo->save(); + AbstractModel::transaction(function() use ($type, $upArray, $userInfo, $transferUser) { + $userInfo->updateInstance($upArray); + $userInfo->save(); + if ($type === 'setdisable') { + $userTransfer = UserTransfer::createInstance([ + 'original_userid' => $userInfo->userid, + 'new_userid' => $transferUser->userid, + ]); + $userTransfer->save(); + $userTransfer->start(); + } + }); } // return Base::retSuccess('修改成功', $userInfo); diff --git a/app/Models/File.php b/app/Models/File.php index 3aba70d5a..0bf004d0a 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -405,4 +405,55 @@ class File extends AbstractModel } return $data; } + + /** + * 移交文件 + * @param $originalUserid + * @param $newUserid + * @return void + */ + public static function transfer($originalUserid, $newUserid) + { + // 创建一个文件夹存放移交的文件 + $name = User::userid2nickname($originalUserid) ?: ('ID:' . $originalUserid); + $file = File::createInstance([ + 'pid' => 0, + 'name' => "【{$name}】移交的文件", + 'type' => "folder", + 'ext' => "", + 'userid' => $newUserid, + 'created_id' => 0, + ]); + $file->saveBeforePids(); + + // 移交文件 + self::whereUserid($originalUserid)->chunkById(100, function($list) use ($file, $newUserid) { + /** @var self $item */ + foreach ($list as $item) { + if ($item->pid === 0) { + $item->pid = $file->id; + } + $item->userid = $newUserid; + $item->saveBeforePids(); + } + }); + + // 移交文件权限 + FileUser::whereUserid($originalUserid)->chunkById(100, function ($list) use ($newUserid) { + /** @var FileUser $item */ + foreach ($list as $item) { + $row = FileUser::whereFileId($item->file_id)->whereUserid($newUserid)->first(); + if ($row) { + // 已存在则删除原数据,判断改变已存在的数据 + $row->permission = max($row->permission, $item->permission); + $row->save(); + $item->delete(); + } else { + // 不存在则改变原数据 + $item->userid = $newUserid; + $item->save(); + } + } + }); + } } diff --git a/app/Models/ProjectTaskUser.php b/app/Models/ProjectTaskUser.php index d3c642a71..5e2e39d3b 100644 --- a/app/Models/ProjectTaskUser.php +++ b/app/Models/ProjectTaskUser.php @@ -13,6 +13,7 @@ namespace App\Models; * @property int|null $owner 是否任务负责人 * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\ProjectTask|null $projectTask * @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskUser newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskUser newQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskUser query() @@ -29,4 +30,45 @@ namespace App\Models; class ProjectTaskUser extends AbstractModel { + /** + * @return \Illuminate\Database\Eloquent\Relations\HasOne + */ + public function projectTask(): \Illuminate\Database\Eloquent\Relations\HasOne + { + return $this->hasOne(ProjectTask::class, 'id', 'task_id'); + } + + /** + * 移交任务身份 + * @param $originalUserid + * @param $newUserid + * @return void + */ + public static function transfer($originalUserid, $newUserid) + { + self::whereUserid($originalUserid)->chunk(100, function ($list) use ($newUserid) { + $tastIds = []; + /** @var self $item */ + foreach ($list as $item) { + $row = self::whereTaskId($item->task_id)->whereUserid($newUserid)->first(); + if ($row) { + // 已存在则删除原数据,判断改变已存在的数据 + $row->owner = max($row->owner, $item->owner); + $row->save(); + $item->delete(); + } else { + // 不存在则改变原数据 + $item->userid = $newUserid; + $item->save(); + } + if ($item->projectTask) { + $item->projectTask->addLog("移交{任务}身份给", ['userid' => [$newUserid]]); + if (!in_array($item->task_pid, $tastIds)) { + $tastIds[] = $item->task_pid; + $item->projectTask->syncDialogUser(); + } + } + } + }); + } } diff --git a/app/Models/ProjectUser.php b/app/Models/ProjectUser.php index 904ed2033..dfcf4e185 100644 --- a/app/Models/ProjectUser.php +++ b/app/Models/ProjectUser.php @@ -38,6 +38,36 @@ class ProjectUser extends AbstractModel return $this->hasOne(Project::class, 'id', 'project_id'); } + /** + * 移交项目身份 + * @param $originalUserid + * @param $newUserid + * @return void + */ + public static function transfer($originalUserid, $newUserid) + { + self::whereUserid($originalUserid)->chunkById(100, function ($list) use ($newUserid) { + /** @var self $item */ + foreach ($list as $item) { + $row = self::whereProjectId($item->project_id)->whereUserid($newUserid)->first(); + if ($row) { + // 已存在则删除原数据,判断改变已存在的数据 + $row->owner = max($row->owner, $item->owner); + $row->save(); + $item->delete(); + } else { + // 不存在则改变原数据 + $item->userid = $newUserid; + $item->save(); + } + if ($item->project) { + $item->project->addLog("移交项目身份给", ['userid' => $newUserid]); + $item->project->syncDialogUser(); + } + } + }); + } + /** * 退出项目 */ @@ -47,15 +77,13 @@ class ProjectUser extends AbstractModel ->whereUserid($this->userid) ->chunk(100, function ($list) { $tastIds = []; + /** @var ProjectTaskUser $item */ foreach ($list as $item) { + $item->delete(); if (!in_array($item->task_pid, $tastIds)) { $tastIds[] = $item->task_pid; + $item->projectTask?->syncDialogUser(); } - $item->delete(); - } - $tasks = ProjectTask::whereIn('id', $tastIds)->get(); - foreach ($tasks as $task) { - $task->syncDialogUser(); } }); $this->delete(); diff --git a/app/Models/User.php b/app/Models/User.php index 68b589b98..ad54796cf 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -28,7 +28,7 @@ use Carbon\Carbon; * @property string|null $line_at 最后在线时间(接口) * @property int|null $task_dialog_id 最后打开的任务会话ID * @property string|null $created_ip 注册IP - * @property string|null $disable_at 禁用时间 + * @property string|null $disable_at 禁用时间(离职时间) * @property int|null $email_verity 邮箱是否已验证 * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at @@ -64,7 +64,6 @@ class User extends AbstractModel protected $primaryKey = 'userid'; protected $hidden = [ - 'disable_at', 'updated_at', ]; diff --git a/app/Models/UserTransfer.php b/app/Models/UserTransfer.php new file mode 100644 index 000000000..79e22bda7 --- /dev/null +++ b/app/Models/UserTransfer.php @@ -0,0 +1,45 @@ +original_userid, $this->new_userid); + // 移交任务身份 + ProjectTaskUser::transfer($this->original_userid, $this->new_userid); + // 移交文件 + File::transfer($this->original_userid, $this->new_userid); + } +} diff --git a/database/migrations/2022_04_12_152136_users_change_disable_at.php b/database/migrations/2022_04_12_152136_users_change_disable_at.php new file mode 100644 index 000000000..ffb6b215c --- /dev/null +++ b/database/migrations/2022_04_12_152136_users_change_disable_at.php @@ -0,0 +1,28 @@ +getTablePrefix(); + DB::statement("ALTER TABLE `{$pre}users` MODIFY COLUMN `disable_at` timestamp NULL DEFAULT NULL COMMENT '禁用时间(离职时间)' AFTER `created_ip`"); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/database/migrations/2022_04_13_195604_create_user_transfers_table.php b/database/migrations/2022_04_13_195604_create_user_transfers_table.php new file mode 100644 index 000000000..3d3a21c88 --- /dev/null +++ b/database/migrations/2022_04_13_195604_create_user_transfers_table.php @@ -0,0 +1,33 @@ +id(); + $table->bigInteger('original_userid')->nullable()->default(0)->comment('原作者'); + $table->bigInteger('new_userid')->nullable()->default(0)->comment('交接人'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_transfers'); + } +} diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 742a0df06..c37aae0ce 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -314,7 +314,7 @@ + :size="1200"> @@ -322,7 +322,7 @@ + :size="1200"> @@ -330,7 +330,7 @@ + :size="1200"> @@ -338,7 +338,7 @@ + :size="1200"> diff --git a/resources/assets/js/pages/manage/components/TeamManagement.vue b/resources/assets/js/pages/manage/components/TeamManagement.vue index a7472b4d7..f3c6016b8 100644 --- a/resources/assets/js/pages/manage/components/TeamManagement.vue +++ b/resources/assets/js/pages/manage/components/TeamManagement.vue @@ -25,8 +25,18 @@ - - + + + +
  • +
    + {{$L("在职状态")}} +
    +
    +
  • @@ -77,21 +87,48 @@ @on-change="setPage" @on-page-size-change="setPageSize"/> + + + +
    + {{$L(`正在进行帐号【ID:${disableData.userid},${disableData.nickname}】离职操作。`)}} + + + + + +
    {{ $L(`${disableData.nickname}负责的项目、任务和文件将自动移交给交接人`) }}
    +
    +
    +
    + + +
    +