diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php
index 3af663c2..5685067a 100755
--- a/app/Http/Controllers/Api/ProjectController.php
+++ b/app/Http/Controllers/Api/ProjectController.php
@@ -724,7 +724,6 @@ class ProjectController extends AbstractController
'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id)->toArray(),
];
$task->pushMsg('add', $data);
- $data['task']['owner'] = 1;
return Base::retSuccess('添加成功', $data);
}
@@ -754,7 +753,6 @@ class ProjectController extends AbstractController
'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id)->toArray(),
];
$task->pushMsg('add', $data);
- $data['task']['owner'] = 1;
return Base::retSuccess('添加成功', $data);
}
@@ -764,7 +762,7 @@ class ProjectController extends AbstractController
* @apiParam {Number} task_id 任务ID
* @apiParam {String} [name] 任务描述
* @apiParam {Array} [times] 计划时间(格式:开始时间,结束时间;如:2020-01-01 00:00,2020-01-01 23:59)
- * @apiParam {Number} [owner] 修改负责人
+ * @apiParam {Array} [owner] 修改负责人
* @apiParam {String} [content] 任务详情(子任务不支持)
* @apiParam {String} [color] 背景色(子任务不支持)
* @apiParam {Array} [assist] 修改协助人员(子任务不支持)
diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php
index ac8bd8d6..cf5c0602 100644
--- a/app/Models/ProjectTask.php
+++ b/app/Models/ProjectTask.php
@@ -327,10 +327,16 @@ class ProjectTask extends AbstractModel
}
}
// 负责人
- $owner = intval($owner) ?: User::userid();
- if (!ProjectUser::whereProjectId($project_id)->whereUserid($owner)->exists()) {
- throw new ApiException($retPre . '负责人填写错误');
+ $owner = is_array($owner) ? $owner : [$owner];
+ $tmpArray = [];
+ foreach ($owner as $uid) {
+ if (intval($uid) == 0) continue;
+ if (!ProjectUser::whereProjectId($project_id)->whereUserid($uid)->exists()) {
+ throw new ApiException($retPre . '负责人填写错误');
+ }
+ $tmpArray[] = $uid;
}
+ $owner = $tmpArray;
// 创建人
$task->userid = User::userid();
// 排序位置
@@ -342,12 +348,12 @@ class ProjectTask extends AbstractModel
//
return AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) {
$task->save();
- if ($owner) {
+ foreach ($owner as $uid) {
ProjectTaskUser::createInstance([
'project_id' => $task->project_id,
'task_id' => $task->id,
'task_pid' => $task->parent_id ?: $task->id,
- 'userid' => $owner,
+ 'userid' => $uid,
'owner' => 1,
])->save();
}
@@ -392,27 +398,37 @@ class ProjectTask extends AbstractModel
}
// 负责人
if (Arr::exists($data, 'owner')) {
- $owner = intval($data['owner']);
- $row = ProjectTaskUser::whereTaskId($this->id)->whereUserid($owner)->first();
- if (empty($row)) {
- $row = ProjectTaskUser::createInstance([
- 'project_id' => $this->project_id,
+ $count = $this->task_user_count;
+ $array = [];
+ $owner = is_array($data['owner']) ? $data['owner'] : [$data['owner']];
+ foreach ($owner as $uid) {
+ if (intval($uid) == 0) continue;
+ if (!$this->project->useridInTheProject($uid)) continue;
+ //
+ ProjectTaskUser::updateInsert([
'task_id' => $this->id,
+ 'userid' => $uid,
+ ], [
+ 'project_id' => $this->project_id,
'task_pid' => $this->parent_id ?: $this->id,
- 'userid' => $owner,
'owner' => 1,
]);
- } else {
- $row->owner = 1;
- }
- $row->save();
- if ($this->parent_id) {
- ProjectTaskUser::whereTaskId($this->id)->where('id', '!=', $row->id)->delete();
- } else {
- ProjectTaskUser::whereTaskId($this->id)->where('id', '!=', $row->id)->update([ 'owner' => 0 ]);
+ $array[] = $uid;
+ if ($this->parent_id) {
+ break; // 子任务只能是一个负责人
+ }
}
+ ProjectTaskUser::whereTaskId($this->id)->whereOwner(1)->whereNotIn('userid', $array)->delete();
$this->syncDialogUser();
- $this->addLog("修改{任务}负责人为会员ID:" . $row->userid);
+ if (count($array) == 0) {
+ $this->addLog("删除{任务}负责人");
+ } else {
+ if ($count == 0) {
+ $this->addLog("认领{任务}");
+ } else {
+ $this->addLog("修改{任务}负责人");
+ }
+ }
}
// 计划时间
if (Arr::exists($data, 'times')) {
@@ -436,25 +452,29 @@ class ProjectTask extends AbstractModel
$assist = is_array($data['assist']) ? $data['assist'] : [$data['assist']];
foreach ($assist as $uid) {
if (intval($uid) == 0) continue;
+ if (!$this->project->useridInTheProject($uid)) continue;
//
- if (empty($this->useridInTheTask($uid))) {
- ProjectTaskUser::createInstance([
- 'project_id' => $this->project_id,
- 'task_id' => $this->id,
- 'task_pid' => $this->parent_id ?: $this->id,
- 'userid' => $uid,
- 'owner' => 0,
- ])->save();
- }
+ ProjectTaskUser::updateInsert([
+ 'task_id' => $this->id,
+ 'userid' => $uid,
+ ], [
+ 'project_id' => $this->project_id,
+ 'task_pid' => $this->parent_id ?: $this->id,
+ 'owner' => 0,
+ ]);
$array[] = $uid;
}
- ProjectTaskUser::whereTaskId($this->id)->where('owner', '!=', 1)->whereNotIn('userid', $array)->delete();
+ ProjectTaskUser::whereTaskId($this->id)->whereOwner(0)->whereNotIn('userid', $array)->delete();
$this->syncDialogUser();
- $this->addLog("修改协助人员");
+ if (count($array) == 0) {
+ $this->addLog("删除{任务}协助人员");
+ } else {
+ $this->addLog("修改{任务}协助人员");
+ }
}
// 背景色
if (Arr::exists($data, 'color') && $this->color != $data['color']) {
- $this->addLog("修改任务背景色:{$this->color} => {$data['color']}");
+ $this->addLog("修改{任务}背景色:{$this->color} => {$data['color']}");
$this->color = $data['color'];
}
// 内容
@@ -466,7 +486,7 @@ class ProjectTask extends AbstractModel
'content' => $data['content'],
]);
$this->desc = Base::getHtml($data['content']);
- $this->addLog("修改任务详细描述");
+ $this->addLog("修改{任务}详细描述");
$updateContent = true;
}
// 优先级
@@ -484,7 +504,7 @@ class ProjectTask extends AbstractModel
$p = true;
}
if ($p) {
- $this->addLog("修改任务优先级");
+ $this->addLog("修改{任务}优先级");
}
}
$this->save();
diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue
index d761eaab..badd5994 100644
--- a/resources/assets/js/pages/manage/components/ProjectList.vue
+++ b/resources/assets/js/pages/manage/components/ProjectList.vue
@@ -175,9 +175,12 @@
{{item.file_num}}
{{item.msg_num}}
@@ -986,6 +989,12 @@ export default {
return false;
},
+ ownerUser(list) {
+ return list.filter(({owner}) => owner == 1).sort((a, b) => {
+ return a.id - b.id;
+ });
+ },
+
formatTime(date) {
let time = Math.round(new Date(date).getTime() / 1000),
string = '';
diff --git a/resources/assets/js/pages/manage/components/TaskAdd.vue b/resources/assets/js/pages/manage/components/TaskAdd.vue
index 400c50c7..1d81e87c 100644
--- a/resources/assets/js/pages/manage/components/TaskAdd.vue
+++ b/resources/assets/js/pages/manage/components/TaskAdd.vue
@@ -63,7 +63,11 @@
@on-change="taskTimeChange(addData.times)"/>
-
+
@@ -94,7 +98,8 @@
+ :placeholder="$L('选择负责人')"
+ :project-id="projectId"/>
diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue
index 5c9f61e5..1800f777 100644
--- a/resources/assets/js/pages/manage/components/TaskDetail.vue
+++ b/resources/assets/js/pages/manage/components/TaskDetail.vue
@@ -83,7 +83,9 @@
-
+
+
+
--
@@ -98,6 +100,17 @@
{{columnName}}
{{taskDetail.id}}
+
+
+
-
+
{{$L('负责人')}}
@@ -193,17 +206,16 @@
-
-
+
+
-
--
@@ -584,9 +596,11 @@ export default {
getOwner() {
const {taskDetail} = this;
if (!$A.isArray(taskDetail.task_user)) {
- return null;
+ return [];
}
- return taskDetail.task_user.find(({owner}) => owner === 1);
+ return taskDetail.task_user.filter(({owner}) => owner === 1).sort((a, b) => {
+ return a.id - b.id;
+ });
},
getAssist() {
@@ -594,7 +608,9 @@ export default {
if (!$A.isArray(taskDetail.task_user)) {
return [];
}
- return taskDetail.task_user.filter(({owner}) => owner !== 1);
+ return taskDetail.task_user.filter(({owner}) => owner !== 1).sort((a, b) => {
+ return a.id - b.id;
+ });
},
menuList() {
@@ -856,19 +872,25 @@ export default {
},
openOwner() {
- this.$set(this.taskDetail, 'owner_userid', [this.getOwner.userid])
- this.$set(this.ownerData, 'owner_userid', [this.getOwner.userid]);
+ const list = this.getOwner.map(({userid}) => userid)
+ this.$set(this.taskDetail, 'owner_userid', list)
+ this.$set(this.ownerData, 'owner_userid', list)
this.ownerShow = true;
},
- onOwner() {
+ onOwner(pick) {
+ if (pick === true && this.getOwner.length === 0) {
+ this.ownerData.owner_userid = [this.userId];
+ }
if ($A.jsonStringify(this.taskDetail.owner_userid) === $A.jsonStringify(this.ownerData.owner_userid)) {
return;
}
+ let owner = this.ownerData.owner_userid;
+ if ($A.count(owner) == 0) owner = '';
this.ownerLoad++;
this.$store.dispatch("taskUpdate", {
task_id: this.taskDetail.id,
- owner: this.ownerData.owner_userid
+ owner: owner,
}).then(({msg}) => {
$A.messageSuccess(msg);
this.ownerLoad--;
@@ -885,7 +907,7 @@ export default {
const list = this.getAssist.map(({userid}) => userid)
this.$set(this.taskDetail, 'assist_userid', list)
this.$set(this.assistData, 'assist_userid', list);
- this.$set(this.assistData, 'disabled', [this.getOwner.userid]);
+ this.$set(this.assistData, 'disabled', this.getOwner.map(({userid}) => userid))
this.assistShow = true;
},
diff --git a/resources/assets/js/pages/manage/components/TaskRow.vue b/resources/assets/js/pages/manage/components/TaskRow.vue
index a34ab21a..fd336c41 100644
--- a/resources/assets/js/pages/manage/components/TaskRow.vue
+++ b/resources/assets/js/pages/manage/components/TaskRow.vue
@@ -67,9 +67,12 @@
@@ -206,6 +209,12 @@ export default {
}
},
+ ownerUser(list) {
+ return list.filter(({owner}) => owner == 1).sort((a, b) => {
+ return a.id - b.id;
+ });
+ },
+
formatTime(date) {
let time = Math.round(new Date(date).getTime() / 1000),
string = '';
diff --git a/resources/assets/js/pages/manage/setting/personal.vue b/resources/assets/js/pages/manage/setting/personal.vue
index 345af124..f80533b0 100644
--- a/resources/assets/js/pages/manage/setting/personal.vue
+++ b/resources/assets/js/pages/manage/setting/personal.vue
@@ -72,7 +72,7 @@ export default {
this.$refs.formDatum.validate((valid) => {
if (valid) {
let data = $A.cloneJSON(this.formDatum);
- if ($A.runNum(data.userimg) == 0) data.userimg = "";
+ if ($A.count(data.userimg) == 0) data.userimg = "";
this.loadIng++;
this.$store.dispatch("call", {
url: 'users/editdata',
diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js
index 6f2b5bea..3a3e5e16 100644
--- a/resources/assets/js/store/actions.js
+++ b/resources/assets/js/store/actions.js
@@ -861,7 +861,6 @@ export default {
return new Promise(function (resolve, reject) {
const post = state.method.cloneJSON(state.method.date2string(data));
if (state.method.isArray(post.column_id)) post.column_id = post.column_id.find((val) => val)
- if (state.method.isArray(post.owner)) post.owner = post.owner.find((val) => val)
//
dispatch("call", {
url: 'project/task/add',
@@ -926,7 +925,6 @@ export default {
taskUpdate({state, dispatch}, data) {
return new Promise(function (resolve, reject) {
const post = state.method.cloneJSON(state.method.date2string(data));
- if (state.method.isArray(post.owner)) post.owner = post.owner.find((id) => id)
//
dispatch("call", {
url: 'project/task/update',
diff --git a/resources/assets/sass/components/user-input.scss b/resources/assets/sass/components/user-input.scss
index 30db8be5..31d8b371 100755
--- a/resources/assets/sass/components/user-input.scss
+++ b/resources/assets/sass/components/user-input.scss
@@ -1,5 +1,6 @@
.common-user {
position: relative;
+ white-space: normal;
.common-user-loading {
position: absolute;
top: 2px;
diff --git a/resources/assets/sass/pages/components/project-list.scss b/resources/assets/sass/pages/components/project-list.scss
index f9daf215..e1c0c209 100644
--- a/resources/assets/sass/pages/components/project-list.scss
+++ b/resources/assets/sass/pages/components/project-list.scss
@@ -388,6 +388,12 @@
&:first-child {
margin-left: 0;
}
+ &.no-owner {
+ width: auto;
+ .ivu-btn-small {
+ font-size: 12px;
+ }
+ }
}
}
.task-icon {
@@ -671,6 +677,11 @@
&:first-child {
margin-left: 0;
}
+ &.no-owner {
+ height: 32px;
+ display: flex;
+ align-items: center;
+ }
}
}
}
diff --git a/resources/assets/sass/pages/components/task-detail.scss b/resources/assets/sass/pages/components/task-detail.scss
index 8cfb5de6..4df97a2f 100644
--- a/resources/assets/sass/pages/components/task-detail.scss
+++ b/resources/assets/sass/pages/components/task-detail.scss
@@ -52,6 +52,10 @@
}
}
}
+ .pick {
+ margin-left: 16px;
+ margin-right: -16px;
+ }
.menu {
font-size: 22px;
margin: 0 32px;