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 @@