diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php
index ff3029ac..e669e98b 100755
--- a/app/Http/Controllers/Api/DialogController.php
+++ b/app/Http/Controllers/Api/DialogController.php
@@ -247,43 +247,8 @@ class DialogController extends AbstractController
if (Base::isError($data)) {
return Base::retError($data['msg']);
} else {
- $fileData = $data['data'];
- $fileData['thumb'] = $fileData['thumb'] ?: 'images/ext/file.png';
- switch ($fileData['ext']) {
- case "docx":
- $fileData['thumb'] = 'images/ext/doc.png';
- break;
- case "xlsx":
- $fileData['thumb'] = 'images/ext/xls.png';
- break;
- case "pptx":
- $fileData['thumb'] = 'images/ext/ppt.png';
- break;
- case "ai":
- case "avi":
- case "bmp":
- case "cdr":
- case "doc":
- case "eps":
- case "gif":
- case "mov":
- case "mp3":
- case "mp4":
- case "pdf":
- case "ppt":
- case "pr":
- case "psd":
- case "rar":
- case "svg":
- case "tif":
- case "txt":
- case "xls":
- case "zip":
- $fileData['thumb'] = 'images/ext/' . $fileData['ext'] . '.png';
- break;
- }
- //
- $msg = $fileData;
+ $msg = $data['data'];
+ $msg['thumb'] = Base::unFillUrl($msg['thumb']);
$msg['size'] *= 1024;
//
return WebSocketDialogMsg::sendMsg($dialog_id, 'file', $msg, $user->userid, $extra_int, $extra_str);
diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php
index d4d76fca..654af2b5 100755
--- a/app/Http/Controllers/Api/ProjectController.php
+++ b/app/Http/Controllers/Api/ProjectController.php
@@ -7,6 +7,7 @@ use App\Models\Project;
use App\Models\ProjectColumn;
use App\Models\ProjectLog;
use App\Models\ProjectTask;
+use App\Models\ProjectTaskFile;
use App\Models\ProjectUser;
use App\Models\User;
use App\Module\Base;
@@ -723,7 +724,7 @@ class ProjectController extends AbstractController
* @apiParam {String} name 任务描述
* @apiParam {String} [content] 任务详情
* @apiParam {Array} [times] 计划时间(格式:开始时间,结束时间;如:2020-01-01 00:00,2020-01-01 23:59)
- * @apiParam {mixed} [owner] 负责人,留空为自己
+ * @apiParam {Number} [owner] 负责人,留空为自己
* @apiParam {Array} [subtasks] 子任务(格式:[{name,owner,times}])
* @apiParam {Number} [top] 添加的任务排到列表最前面
*/
@@ -750,9 +751,6 @@ class ProjectController extends AbstractController
// 列表
$column = null;
$newColumn = null;
- if (is_array($column_id)) {
- $column_id = Base::arrayFirst($column_id);
- }
if ($column_id) {
if (intval($column_id) > 0) {
$column = $project->projectColumn->find($column_id);
@@ -760,6 +758,8 @@ class ProjectController extends AbstractController
if (empty($column)) {
$column = ProjectColumn::whereProjectId($project->id)->whereName($column_id)->first();
}
+ } else {
+ $column = ProjectColumn::whereProjectId($project->id)->orderBy('id')->first();
}
if (empty($column)) {
$column = ProjectColumn::createInstance([
@@ -798,7 +798,8 @@ class ProjectController extends AbstractController
* @apiParam {String} [color] 任务描述(子任务不支持)
* @apiParam {String} [content] 任务详情(子任务不支持)
* @apiParam {Array} [times] 计划时间(格式:开始时间,结束时间;如:2020-01-01 00:00,2020-01-01 23:59)
- * @apiParam {mixed} [owner] 修改负责人
+ * @apiParam {Number} [owner] 修改负责人
+ * @apiParam {Array} [assist] 修改协助人员
*
* @apiParam {String|false} [complete_at] 完成时间(如:2020-01-01 00:00,false表示未完成)
*/
@@ -850,6 +851,76 @@ class ProjectController extends AbstractController
return $result;
}
+ /**
+ * {post} 上传文件
+ *
+ * @apiParam {Number} task_id 任务ID
+ * @apiParam {String} [filename] post-文件名称
+ * @apiParam {String} [image64] post-base64图片(二选一)
+ * @apiParam {File} [files] post-文件对象(二选一)
+ */
+ public function task__upload()
+ {
+ $user = User::authE();
+ if (Base::isError($user)) {
+ return $user;
+ } else {
+ $user = User::IDE($user['data']);
+ }
+ //
+ $task_id = Base::getPostInt('task_id');
+ // 任务
+ $task = ProjectTask::whereId($task_id)->first();
+ if (empty($task)) {
+ return Base::retError('任务不存在');
+ }
+ // 项目
+ $project = Project::select($this->projectSelect)
+ ->join('project_users', 'projects.id', '=', 'project_users.project_id')
+ ->where('projects.id', $task->project_id)
+ ->where('project_users.userid', $user->userid)
+ ->first();
+ if (empty($project)) {
+ return Base::retError('项目不存在或不在成员列表内');
+ }
+ //
+ $path = "uploads/task/" . $task->id . "/";
+ $image64 = Base::getPostValue('image64');
+ $fileName = Base::getPostValue('filename');
+ if ($image64) {
+ $data = Base::image64save([
+ "image64" => $image64,
+ "path" => $path,
+ "fileName" => $fileName,
+ ]);
+ } else {
+ $data = Base::upload([
+ "file" => Request::file('files'),
+ "type" => 'file',
+ "path" => $path,
+ "fileName" => $fileName,
+ ]);
+ }
+ //
+ if (Base::isError($data)) {
+ return Base::retError($data['msg']);
+ } else {
+ $fileData = $data['data'];
+ $file = ProjectTaskFile::createInstance([
+ 'project_id' => $task->project_id,
+ 'task_id' => $task->id,
+ 'name' => $fileData['name'],
+ 'size' => $fileData['size'] * 1024,
+ 'ext' => $fileData['ext'],
+ 'path' => $fileData['path'],
+ 'thumb' => Base::unFillUrl($fileData['thumb']),
+ 'userid' => $user->userid,
+ ]);
+ $file->save();
+ return Base::retSuccess("上传成功", $file->find($file->id));
+ }
+ }
+
/**
* 归档任务
*
diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php
index 638a74c3..1074486d 100644
--- a/app/Http/Middleware/VerifyCsrfToken.php
+++ b/app/Http/Middleware/VerifyCsrfToken.php
@@ -27,6 +27,9 @@ class VerifyCsrfToken extends Middleware
// 修改任务
'api/project/task/update/',
+ // 上传任务问题
+ 'api/project/task/upload/',
+
// 聊天发文件
'api/dialog/msg/sendfile/',
];
diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php
index 4fee6f20..642a3907 100644
--- a/app/Models/ProjectTask.php
+++ b/app/Models/ProjectTask.php
@@ -299,10 +299,7 @@ class ProjectTask extends AbstractModel
}
}
// 负责人
- if (is_array($owner)) {
- $owner = Base::arrayFirst($owner);
- }
- $owner = $owner ?: User::token2userid();
+ $owner = intval($owner) ?: User::token2userid();
if (!ProjectUser::whereProjectId($project_id)->whereUserid($owner)->exists()) {
return Base::retError($retPre . '负责人填写错误');
}
@@ -360,9 +357,6 @@ class ProjectTask extends AbstractModel
public function updateTask($data)
{
return AbstractModel::transaction(function () use ($data) {
- $content = $data['content'];
- $times = $data['times'];
- $owner = $data['owner'];
// 标题
if (Arr::exists($data, 'name')) {
if (empty($data['name'])) {
@@ -373,25 +367,48 @@ class ProjectTask extends AbstractModel
$this->name = $data['name'];
}
// 负责人
- if ($owner) {
- if (is_array($owner)) {
- $owner = Base::arrayFirst($owner);
- }
- $ownerUser = ProjectTaskUser::whereTaskId($this->id)->whereOwner(1)->first();
- if ($ownerUser->userid != $owner) {
- $ownerUser->owner = 0;
- $ownerUser->save();
+ if (Arr::exists($data, 'owner')) {
+ $row = ProjectTaskUser::whereTaskId($this->id)->whereOwner(1)->first();
+ if ($row->userid != $data['owner']) {
+ if (!User::find(intval($data['owner']))) {
+ return Base::retError('请选择正确的负责人');
+ }
+ $row->owner = 0;
+ $row->save();
ProjectTaskUser::updateInsert([
'project_id' => $this->parent_id,
'task_id' => $this->id,
- 'userid' => $owner,
+ 'userid' => $data['owner'],
], [
'owner' => 1,
]);
}
}
+ // 协助人员
+ if (Arr::exists($data, 'assist')) {
+ $array = [];
+ $assist = is_array($data['assist']) ? $data['assist'] : [$data['assist']];
+ foreach ($assist as $uid) {
+ if (intval($uid) == 0) continue;
+ if (ProjectTaskUser::whereTaskId($this->id)->whereUserid($uid)->whereOwner(1)->exists()) continue;
+ //
+ if (!ProjectTaskUser::whereTaskId($this->id)->whereUserid($uid)->where('owner', '!=', 1)->exists()) {
+ ProjectTaskUser::createInstance([
+ 'project_id' => $this->parent_id,
+ 'task_id' => $this->id,
+ 'userid' => $uid,
+ 'owner' => 0,
+ ])->save();
+ }
+ $array[] = $uid;
+ }
+ ProjectTaskUser::whereTaskId($this->id)->where('owner', '!=', 1)->whereNotIn('userid', $array)->delete();
+ }
// 计划时间
- if ($times) {
+ if (Arr::exists($data, 'times')) {
+ $this->start_at = null;
+ $this->end_at = null;
+ $times = $data['times'];
list($start, $end) = is_string($times) ? explode(",", $times) : (is_array($times) ? $times : []);
if (Base::isDate($start) && Base::isDate($end)) {
if ($start != $end) {
@@ -407,14 +424,14 @@ class ProjectTask extends AbstractModel
$this->color = $data['color'];
}
// 内容
- if ($content && $this->parent_id === 0) {
+ if (Arr::exists($data, 'content')) {
ProjectTaskContent::updateInsert([
'project_id' => $this->parent_id,
'task_id' => $this->id,
], [
- 'content' => $content,
+ 'content' => $data['content'],
]);
- $this->desc = Base::getHtml($content);
+ $this->desc = Base::getHtml($data['content']);
}
// 优先级
if (Arr::exists($data, 'p_level')) {
@@ -428,6 +445,8 @@ class ProjectTask extends AbstractModel
}
}
$this->save();
+ if ($this->start_at instanceof \DateTimeInterface) $this->start_at = $this->start_at->format('Y-m-d H:i:s');
+ if ($this->end_at instanceof \DateTimeInterface) $this->end_at = $this->end_at->format('Y-m-d H:i:s');
return Base::retSuccess('修改成功');
});
}
diff --git a/app/Models/ProjectTaskFile.php b/app/Models/ProjectTaskFile.php
index c2a824ba..7b3307b3 100644
--- a/app/Models/ProjectTaskFile.php
+++ b/app/Models/ProjectTaskFile.php
@@ -2,6 +2,8 @@
namespace App\Models;
+use App\Module\Base;
+
/**
* Class ProjectTaskFile
*
@@ -37,5 +39,23 @@ namespace App\Models;
*/
class ProjectTaskFile extends AbstractModel
{
+ /**
+ * 地址
+ * @param $value
+ * @return string
+ */
+ public function getPathAttribute($value)
+ {
+ return Base::fillUrl($value);
+ }
+ /**
+ * 缩略图
+ * @param $value
+ * @return string
+ */
+ public function getThumbAttribute($value)
+ {
+ return Base::fillUrl($value ?: Base::extIcon($this->ext));
+ }
}
diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php
index 70bc9cfb..bf1ac009 100644
--- a/app/Models/WebSocketDialogMsg.php
+++ b/app/Models/WebSocketDialogMsg.php
@@ -79,8 +79,8 @@ class WebSocketDialogMsg extends AbstractModel
$value = Base::json2array($value);
if ($this->type === 'file') {
$value['type'] = in_array($value['ext'], ['jpg', 'jpeg', 'png', 'gif']) ? 'img' : 'file';
- $value['url'] = Base::fillUrl($value['path']);
- $value['thumb'] = Base::fillUrl($value['thumb']);
+ $value['path'] = Base::fillUrl($value['path']);
+ $value['thumb'] = Base::fillUrl($value['thumb'] ?: Base::extIcon($value['ext']));
}
return $value;
}
diff --git a/app/Module/Base.php b/app/Module/Base.php
index 39afa96b..50b3a055 100755
--- a/app/Module/Base.php
+++ b/app/Module/Base.php
@@ -2486,6 +2486,50 @@ class Base
return true;
}
+ /**
+ * 获取后缀名图标相对地址
+ * @param $ext
+ * @return string
+ */
+ public static function extIcon($ext)
+ {
+ $value = 'images/ext/file.png';
+ switch ($ext) {
+ case "docx":
+ $value = 'images/ext/doc.png';
+ break;
+ case "xlsx":
+ $value = 'images/ext/xls.png';
+ break;
+ case "pptx":
+ $value = 'images/ext/ppt.png';
+ break;
+ case "ai":
+ case "avi":
+ case "bmp":
+ case "cdr":
+ case "doc":
+ case "eps":
+ case "gif":
+ case "mov":
+ case "mp3":
+ case "mp4":
+ case "pdf":
+ case "ppt":
+ case "pr":
+ case "psd":
+ case "rar":
+ case "svg":
+ case "tif":
+ case "txt":
+ case "xls":
+ case "zip":
+ $value = 'images/ext/' . $ext . '.png';
+ break;
+ }
+ return $value;
+ }
+
/**
* 排列组合(无重复)
* @param $arr
diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue
index ad1d3836..dcc40c3a 100644
--- a/resources/assets/js/pages/manage.vue
+++ b/resources/assets/js/pages/manage.vue
@@ -110,7 +110,7 @@
maxWidth: projectOpenTask._dialog || projectOpenTask._msgText ? '1200px' : '640px'
}"
footer-hide>
-