first commit
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
/**
|
||||
======================
|
||||
*模块数据获取公共文件
|
||||
======================
|
||||
*/
|
||||
use think\facade\Db;
|
||||
@@ -0,0 +1,439 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\task\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Task as TaskList;
|
||||
use app\task\validate\TaskCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$param['uid'] = $this->uid;
|
||||
$list = (new TaskList())->list($param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
View::assign('type', get_task_cate());
|
||||
View::assign('cate', get_work_cate());
|
||||
View::assign('task_cate', get_task_cate());
|
||||
View::assign('project', get_project($this->uid));
|
||||
View::assign('creater', get_admin_name());
|
||||
View::assign('user_info', get_login_admin());
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
//markdown数据处理
|
||||
if (isset($param['table-align'])) {
|
||||
unset($param['table-align']);
|
||||
}
|
||||
if (isset($param['docContent-html-code'])) {
|
||||
$param['content'] = $param['docContent-html-code'];
|
||||
$param['md_content'] = $param['docContent-markdown-doc'];
|
||||
unset($param['docContent-html-code']);
|
||||
unset($param['docContent-markdown-doc']);
|
||||
}
|
||||
if (isset($param['ueditorcontent'])) {
|
||||
$param['content'] = $param['ueditorcontent'];
|
||||
$param['md_content'] = '';
|
||||
}
|
||||
if (isset($param['end_time'])) {
|
||||
$param['end_time'] = strtotime(urldecode($param['end_time']));
|
||||
}
|
||||
if (isset($param['flow_status'])) {
|
||||
if ($param['flow_status'] == 3) {
|
||||
$param['over_time'] = time();
|
||||
} else {
|
||||
$param['over_time'] = 0;
|
||||
}
|
||||
}
|
||||
if (!isset($param['director_uid'])) {
|
||||
$param['director_uid'] = '';
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$task = (new TaskList())->detail($param['id']);
|
||||
try {
|
||||
validate(TaskCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$param['project_id'] = Db::name('Task')->where('id', $param['id'])->value('project_id');
|
||||
$res = TaskList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param, $task);
|
||||
|
||||
$ddurl = Db::name('Project')->where('id', $param['project_id'])->value('ddurl');
|
||||
$param['admin_id'] = $this->uid;
|
||||
if ($param['director_uid']) {
|
||||
// 检查 director_uid 是否被修改
|
||||
if ($param['director_uid'] != $task['director_uid']) {
|
||||
$send_user = Db::name('Admin')->where('id', $param['admin_id'])->value('name');
|
||||
$user_name = Db::name('Admin')->where('id', $param['director_uid'])->value('name');
|
||||
$text1 = "**" . $send_user . "** 给你指派了一个新任务,请及时跟进处理。";
|
||||
$text2 = "**" . '@' . $user_name . "**";
|
||||
$msg = $text2 . "\n\n" . $text1 . "\n\n";
|
||||
|
||||
$data = array(
|
||||
'msgtype' => 'actionCard',
|
||||
'actionCard' => array(
|
||||
'text' => $msg,
|
||||
'btnOrientation' => '0',
|
||||
'btns' => array(
|
||||
array(
|
||||
'title' => '查看详情',
|
||||
'actionURL' => 'dingtalk://dingtalkclient/page/link?url=' . urlencode('http://project.meteteme.com/task/index/index') . '&pc_slide=false'
|
||||
)
|
||||
)
|
||||
),
|
||||
'at' => array(
|
||||
'atUserIds' => array($user_name),
|
||||
'isAtAll' => false
|
||||
)
|
||||
);
|
||||
|
||||
$data_string = json_encode($data);
|
||||
|
||||
if ($data_string === false) {
|
||||
return to_assign(1, 'JSON编码错误');
|
||||
}
|
||||
|
||||
$header = array(
|
||||
'Content-Type: application/json; charset=utf-8',
|
||||
'Content-Length: ' . strlen($data_string)
|
||||
);
|
||||
|
||||
$options = array(
|
||||
'http' => array(
|
||||
'header' => $header,
|
||||
'method' => 'POST',
|
||||
'content' => $data_string,
|
||||
'ignore_errors' => true
|
||||
),
|
||||
);
|
||||
$context = stream_context_create($options);
|
||||
|
||||
$result = file_get_contents($ddurl, false, $context);
|
||||
|
||||
if ($result === false) {
|
||||
return to_assign(1, '钉钉消息发送失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(TaskCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$param['admin_id'] = $this->uid;
|
||||
|
||||
$is_bug = $param['is_bug'] == 1 ? 'BUG缺陷' : ($param['is_bug'] == 2 ? '优化建议' : '普通任务');
|
||||
$param['title'] = ' [ ' . $is_bug . ' ] ' . ' - ' . $param['title'];
|
||||
|
||||
$touid = $param['director_uid'];
|
||||
$touid = Db::name('Admin')->where('id', $touid)->value('name');
|
||||
$ddurl = Db::name('Project')->where('id', $param['project_id'])->value('ddurl');
|
||||
$result = '';
|
||||
|
||||
//添加数据
|
||||
$sid = TaskList::strict(false)->field(true)->insertGetId($param);
|
||||
|
||||
if ($sid) {
|
||||
|
||||
add_log('add', $sid, $param);
|
||||
$log_data = array(
|
||||
'module' => 'task',
|
||||
'task_id' => $sid,
|
||||
'new_content' => $param['title'],
|
||||
'field' => 'new',
|
||||
'action' => 'add',
|
||||
'admin_id' => $this->uid,
|
||||
'create_time' => time(),
|
||||
);
|
||||
Db::name('Log')->strict(false)->field(true)->insert($log_data);
|
||||
|
||||
//钉钉机器人通知部分
|
||||
|
||||
if ($ddurl) {
|
||||
$send_user = Db::name('Admin')->where('id', $param['admin_id'])->value('name');
|
||||
$user_name = Db::name('Admin')->where('id', $param['director_uid'])->value('name');
|
||||
$title = $param['title'];
|
||||
$text1 = "**" . $send_user . "** 发布了一个新任务,请及时跟进处理。";
|
||||
$text2 = "**" . '@' . $user_name . "**";
|
||||
$msg = $text2 . "\n\n" . $text1 . "\n\n" . $title;
|
||||
|
||||
$data = array(
|
||||
'msgtype' => 'actionCard',
|
||||
'actionCard' => array(
|
||||
'title' => $title,
|
||||
'text' => $msg,
|
||||
'btnOrientation' => '0',
|
||||
'btns' => array(
|
||||
array(
|
||||
'title' => '查看详情',
|
||||
'actionURL' => 'dingtalk://dingtalkclient/page/link?url=' . urlencode('http://project.meteteme.com/task/index/index') . '&pc_slide=false'
|
||||
)
|
||||
)
|
||||
),
|
||||
'at' => array(
|
||||
'atUserIds' => array($user_name),
|
||||
'isAtAll' => false
|
||||
)
|
||||
);
|
||||
|
||||
$data_string = json_encode($data);
|
||||
|
||||
if ($data_string === false) {
|
||||
return to_assign(1, 'JSON编码错误');
|
||||
}
|
||||
|
||||
$header = array(
|
||||
'Content-Type: application/json; charset=utf-8',
|
||||
'Content-Length: ' . strlen($data_string)
|
||||
);
|
||||
|
||||
$options = array(
|
||||
'http' => array(
|
||||
'header' => $header,
|
||||
'method' => 'POST',
|
||||
'content' => $data_string,
|
||||
'ignore_errors' => true
|
||||
),
|
||||
);
|
||||
$context = stream_context_create($options); // Define $context here
|
||||
|
||||
$result = file_get_contents($ddurl, false, $context);
|
||||
|
||||
// Handle the response as needed
|
||||
if ($result === false) {
|
||||
return to_assign(1, '钉钉消息发送失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '未提供有效的 $ddurl');
|
||||
}
|
||||
|
||||
|
||||
return to_assign(0, '添加成功', ['id' => $sid, 'ddurl' => $ddurl, '钉钉发送' => $result ? '发送成功' : '发送失败', '钉钉消息' => $context]);
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$detail = (new TaskList())->detail($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '任务不存在');
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
if (isset($param['project_id'])) {
|
||||
View::assign('project_id', $param['project_id']);
|
||||
}
|
||||
View::assign('cate', get_work_cate());
|
||||
View::assign('type', get_task_cate());
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = (new TaskList())->detail($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '任务不存在');
|
||||
} else {
|
||||
$role_uid = [$detail['admin_id'], $detail['director_uid']];
|
||||
$role_edit = 'view';
|
||||
if (in_array($this->uid, $role_uid)) {
|
||||
$role_edit = 'edit';
|
||||
}
|
||||
$project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id');
|
||||
if (in_array($detail['project_id'], $project_ids) || in_array($this->uid, $role_uid) || in_array($this->uid, explode(",", $detail['assist_admin_ids']))) {
|
||||
$file_array = Db::name('FileInterfix')
|
||||
->field('mf.id,mf.topic_id,mf.admin_id,f.name,f.filesize,f.filepath,a.name as admin_name')
|
||||
->alias('mf')
|
||||
->join('File f', 'mf.file_id = f.id', 'LEFT')
|
||||
->join('Admin a', 'mf.admin_id = a.id', 'LEFT')
|
||||
->order('mf.create_time desc')
|
||||
->where(array('mf.topic_id' => $id, 'mf.module' => 'task'))
|
||||
->select()->toArray();
|
||||
|
||||
$link_array = Db::name('LinkInterfix')
|
||||
->field('i.id,i.topic_id,i.admin_id,i.desc,i.url,a.name as admin_name')
|
||||
->alias('i')
|
||||
->join('Admin a', 'i.admin_id = a.id', 'LEFT')
|
||||
->order('i.create_time desc')
|
||||
->where(array('i.topic_id' => $id, 'i.module' => 'task', 'delete_time' => 0))
|
||||
->select()->toArray();
|
||||
|
||||
View::assign('detail', $detail);
|
||||
View::assign('file_array', $file_array);
|
||||
View::assign('link_array', $link_array);
|
||||
View::assign('role_edit', $role_edit);
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
} else {
|
||||
return to_assign(1, '您没权限查看该任务');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$detail = Db::name('Task')->where('id', $id)->find();
|
||||
if ($detail['admin_id'] != $this->uid) {
|
||||
return to_assign(1, "你不是该任务的创建人,无权限删除");
|
||||
}
|
||||
if (Db::name('Task')->where('id', $id)->update(['delete_time' => time()]) !== false) {
|
||||
$log_data = array(
|
||||
'module' => 'task',
|
||||
'field' => 'delete',
|
||||
'action' => 'delete',
|
||||
'task_id' => $detail['id'],
|
||||
'admin_id' => $this->uid,
|
||||
'old_content' => '',
|
||||
'new_content' => $detail['title'],
|
||||
'create_time' => time(),
|
||||
);
|
||||
Db::name('Log')->strict(false)->field(true)->insert($log_data);
|
||||
return to_assign(0, "删除成功");
|
||||
} else {
|
||||
return to_assign(0, "删除失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//获取任务基础资料
|
||||
public function gettask()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$task = Db::name('Task')->field('id, director_uid, project_id, admin_id, plan_hours, end_time, over_time, assist_admin_ids, cate, type, is_bug, priority, flow_status, done_ratio')
|
||||
->where('id', $id)
|
||||
->find();
|
||||
if ($task) {
|
||||
// 更新任务信息
|
||||
$updateData = [
|
||||
'director_uid' => $param['director_uid'] ?? $task['director_uid'],
|
||||
'assist_admin_ids' => $param['assist_admin_ids'] ?? $task['assist_admin_ids'],
|
||||
'priority' => $param['priority'] ?? $task['priority'],
|
||||
'type' => $param['type'] ?? $task['type'],
|
||||
'is_bug' => $param['is_bug'] ?? $task['is_bug'],
|
||||
'cate' => $param['cate'] ?? $task['cate'],
|
||||
'plan_hours' => $param['plan_hours'] ?? $task['plan_hours'],
|
||||
'end_time' => isset($param['end_time']) ? strtotime($param['end_time']) : $task['end_time'],
|
||||
'over_time' => isset($param['over_time']) ? strtotime($param['over_time']) : $task['over_time'],
|
||||
'flow_status' => $param['flow_status'] ?? $task['flow_status'],
|
||||
'done_ratio' => $param['done_ratio'] ?? $task['done_ratio'],
|
||||
'admin_id' => $param['admin_id'] ?? $task['admin_id'],
|
||||
];
|
||||
|
||||
// 判断任务状态,并修改任务进度
|
||||
switch ($updateData['flow_status']) {
|
||||
case 1:
|
||||
$updateData['done_ratio'] = 0;
|
||||
break;
|
||||
case 2:
|
||||
$updateData['done_ratio'] = 50;
|
||||
break;
|
||||
case 3:
|
||||
$updateData['done_ratio'] = 100;
|
||||
break;
|
||||
default:
|
||||
$updateData['done_ratio'] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
Db::name('Task')->where('id', $id)->update($updateData);
|
||||
|
||||
// 置换日期格式'YYYY-MM-DD'
|
||||
if (isset($updateData['end_time'])) {
|
||||
$task['end_time'] = $updateData['end_time'] > 0 ? date('Y-m-d', $updateData['end_time']) : '';
|
||||
if ($task['end_time'] === '1970-01-01') {
|
||||
$task['end_time'] = '';
|
||||
}
|
||||
}
|
||||
if (isset($updateData['over_time'])) {
|
||||
$task['over_time'] = $updateData['over_time'] > 0 ? date('Y-m-d', $updateData['over_time']) : '';
|
||||
if ($task['over_time'] === '1970-01-01') {
|
||||
$task['over_time'] = '';
|
||||
}
|
||||
}
|
||||
|
||||
switch ($updateData['priority']) {
|
||||
case 1:
|
||||
$task['priority'] = '低';
|
||||
break;
|
||||
case 2:
|
||||
$task['priority'] = '中';
|
||||
break;
|
||||
case 3:
|
||||
$task['priority'] = '高';
|
||||
break;
|
||||
case 4:
|
||||
$task['priority'] = '紧急';
|
||||
break;
|
||||
}
|
||||
|
||||
return json(['code' => 0, 'msg' => '更新成功', 'data' => ['detail' => $task]]);
|
||||
} else {
|
||||
return json(['code' => 1, 'msg' => '任务不存在']);
|
||||
}
|
||||
} else {
|
||||
return json(['code' => 1, 'msg' => '参数错误']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//获取工作类型
|
||||
public function getworkcate()
|
||||
{
|
||||
$cateList = Db::name('WorkCate')->field('id, title')->order('')->select();
|
||||
$typeList = Db::name('TaskCate')->field('id, title')->order('')->select();
|
||||
$adminList = Db::name('Admin')->field('id, name')->order('')->select();
|
||||
$response = [
|
||||
'code' => 0,
|
||||
'data' => [
|
||||
'cate' => $cateList,
|
||||
'admin_id' => $adminList,
|
||||
'type' => $typeList
|
||||
]
|
||||
];
|
||||
return json($response);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
// 这是系统自动生成的event定义文件
|
||||
return [
|
||||
|
||||
];
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
\app\home\middleware\Install::class,
|
||||
];
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
namespace app\task\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class TaskCheck extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
// 'plan_hours' => 'require|regex:/^[0-9]+(.[0-9]{1,1})?$/',
|
||||
'id' => 'require',
|
||||
'name' => 'require|checkOne',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '任务主题不能为空',
|
||||
'director_name.require' => '任务必须指派到人,请指派',
|
||||
// 'plan_hours.require' => '预估工时不能为空',
|
||||
// 'plan_hours.regex' => '预估工时只能是整数或者1位小数的数字',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
// 'hours' => ['plan_hours'],
|
||||
'edit' => ['id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="ms_title">新建任务</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<!-- 任务主题 -->
|
||||
<td class="layui-td-gray">任务主题<font> *</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" lay-reqText="请输入任务主题" placeholder="请输入任务主题"
|
||||
class="layui-input" value="">
|
||||
</td>
|
||||
|
||||
<!-- 任务优先级 -->
|
||||
<td class="layui-td-gray">优先级<span style="color: red"> *</span></td>
|
||||
<td>
|
||||
<select name="priority" lay-verify="required" lay-reqText="请选择优先级">
|
||||
<option value="1" selected>低</option>
|
||||
<option value="2">中</option>
|
||||
<option value="3">高</option>
|
||||
<option value="4">紧急</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<!-- 任务性质 -->
|
||||
<td class="layui-td-gray">任务性质<span style="color: red"> *</span></td>
|
||||
<td>
|
||||
<select name="is_bug" lay-verify="required" lay-reqText="请选择任务性质">
|
||||
<option value="2">优化建议(OPTIMIZATION)</option>
|
||||
<option value="1">问题缺陷(BUG)</option>
|
||||
<option value="0">普通任务(TASK)</option>
|
||||
</select>
|
||||
</td>
|
||||
<!-- 任务类型 -->
|
||||
<td class="layui-td-gray">任务类型<span style="color: red"> *</span></td>
|
||||
<td>
|
||||
<select name="type" lay-verify="required" lay-reqText="请选择任务类型">
|
||||
{volist name="type" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<!-- 工作类型 -->
|
||||
<td class="layui-td-gray">工作类型<span style="color: red"> *</span></td>
|
||||
<td>
|
||||
<select name="cate" lay-verify="required" lay-reqText="请选择工作类型">
|
||||
{volist name="cate" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<!-- 关联项目 -->
|
||||
<td class="layui-td-gray">关联项目</td>
|
||||
<td>
|
||||
<select id="projectId" name="project_id" lay-filter="project_id">
|
||||
{volist name=":get_project()" id="v"}
|
||||
<option value="{$v.id}">{$v.name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<!-- 结束日期 -->
|
||||
<td class="layui-td-gray-2">预计结束日期<span style="color: red"> *</span></td>
|
||||
<td>
|
||||
<input type="text" id="end_time" name="end_time" readonly lay-verify="required" lay-reqText="请选择结束时间"
|
||||
placeholder="请选择时间" class="layui-input" value="">
|
||||
</td>
|
||||
<!-- 工时预估 -->
|
||||
<td class="layui-td-gray">工时预估</td>
|
||||
<td>
|
||||
<input type="text" name="plan_hours" lay-reqText="请填写预估工时" placeholder="请填写预估工时" class="layui-input"
|
||||
value="">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<!-- 任务指派给谁 -->
|
||||
<td class="layui-td-gray">指派给<span style="color: red"> *</span></td>
|
||||
<td>
|
||||
<input type="hidden" name="director_uid" readonly value="">
|
||||
<input type="text" name="director_name" placeholder="请选择" readonly class="layui-input" value="">
|
||||
</td>
|
||||
{empty name="$project_id"}
|
||||
<td class="layui-td-gray">协作人</td>
|
||||
<td>
|
||||
<input type="hidden" name="assist_admin_ids" readonly value="">
|
||||
<input type="text" name="assist_admin_names" placeholder="请选择" readonly class="layui-input" value="">
|
||||
</td>
|
||||
|
||||
{else/}
|
||||
<td class="layui-td-gray">协作人</td>
|
||||
<td>
|
||||
<input type="hidden" name="project_id" readonly value="{$project_id}">
|
||||
<input type="hidden" name="assist_admin_ids" readonly value="">
|
||||
<input type="text" name="assist_admin_names" placeholder="请选择" readonly class="layui-input" value="">
|
||||
</td>
|
||||
{/empty}
|
||||
</tr>
|
||||
</table>
|
||||
<div>
|
||||
<div class="ms_title">详细描述<span style="color: red"> *</span></div>
|
||||
<div>
|
||||
<textarea id="mdContent" style="display:none;"></textarea>
|
||||
<div id="docContent"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function openInit() {
|
||||
const form = layui.form, layer = layui.layer, editor = layui.editormd, tool = layui.tool, laydate = layui.laydate, dropdown = layui.dropdown, employeepicker = layui.employeepicker;
|
||||
|
||||
//select按照倒序排列数据显示
|
||||
// 获取<select>元素
|
||||
const projectIdSelect = document.getElementById("projectId");
|
||||
// 获取所有<option>元素
|
||||
const options = Array.from(projectIdSelect.options);
|
||||
// 按照value属性对<option>元素进行降序排序
|
||||
options.sort((a, b) => b.value - a.value);
|
||||
// 清除<select>元素的内容
|
||||
projectIdSelect.innerHTML = '';
|
||||
// 将排序后的<option>元素添加回<select>元素
|
||||
options.forEach(option => projectIdSelect.appendChild(option));
|
||||
// 设置第一个显示的<option>元素为默认选择
|
||||
projectIdSelect.selectedIndex = 0;
|
||||
|
||||
//渲染编辑器
|
||||
form.render();
|
||||
var edit = editor.render('docContent', {
|
||||
markdown: $('#mdContent').val(),
|
||||
imageUploadURL: "/api/index/md_upload",
|
||||
lineNumbers: false,
|
||||
toolbarIcons: function () {
|
||||
return [
|
||||
"undo", "redo", "bold", "del", "italic", "quote", "h1", "h2", "h3", "h4", "h5",
|
||||
"list-ul", "list-ol", "hr", "link", "reference-link", "image", "code", "code-block", "table", "watch", "fullscreen"
|
||||
];
|
||||
},
|
||||
// height: window.innerHeight - 500,
|
||||
});
|
||||
|
||||
// 预计结束日期为当前时间+2T
|
||||
var currentDate = new Date();
|
||||
currentDate.setDate(currentDate.getDate() + 2);
|
||||
var currentDateTime = currentDate.toISOString().slice(0, 10);
|
||||
$('#end_time').val(currentDateTime);
|
||||
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#end_time'
|
||||
});
|
||||
|
||||
//选择负责人弹窗
|
||||
$('.page-content').on('click', '[name="director_name"]', function () {
|
||||
var ids = $('[name="director_uid"]').val(), names = $('[name="director_name"]').val();
|
||||
employeepicker.init({
|
||||
ids: ids,
|
||||
names: names,
|
||||
type: 0,
|
||||
department_url: "/api/index/get_department_tree",
|
||||
employee_url: "/api/index/get_employee",
|
||||
callback: function (ids, names, dids, departments) {
|
||||
$('[name="director_uid"]').val(ids);
|
||||
$('[name="director_name"]').val(names);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
//选择协作人人弹窗
|
||||
$('.page-content').on('click', '[name="assist_admin_names"]', function () {
|
||||
var ids = $('[name="assist_admin_ids"]').val(), names = $('[name="assist_admin_names"]').val(), assist_admin_id_array = [], assist_admin_name_array = [];
|
||||
if (ids.length > 0) {
|
||||
assist_admin_id_array = ids.split(',');
|
||||
assist_admin_name_array = names.split(',');
|
||||
}
|
||||
employeepicker.init({
|
||||
ids: assist_admin_id_array,
|
||||
names: assist_admin_name_array,
|
||||
department_url: "/api/index/get_department_tree",
|
||||
employee_url: "/api/index/get_employee",
|
||||
type: 1,
|
||||
callback: function (ids, names, dids, departments) {
|
||||
$('[name="assist_admin_ids"]').val(ids);
|
||||
$('[name="assist_admin_names"]').val(names);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
if (layui.taskTable) {
|
||||
layui.taskTable.reload();
|
||||
}
|
||||
}
|
||||
}
|
||||
tool.post("/task/index/add", data.field, callback);
|
||||
tool.close(500);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,433 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="style"}
|
||||
<style>
|
||||
.layui-unselect dl {
|
||||
max-height: 188px;
|
||||
}
|
||||
</style>
|
||||
{/block} {block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a><cite>任务中心</cite></a>
|
||||
</span>
|
||||
{/block} {block name="body"}
|
||||
<div id="taskList" class="table-content p-3">
|
||||
<input type="hidden" id="currentUserId" value="" />
|
||||
<div class="gougu-tab-bar border-t border-x">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-md6 gougu-tab">
|
||||
<!-- <ul class="gougu-tab-title" id="taskTab">
|
||||
<li class="tab-this" data-type="0">全部</li>
|
||||
</ul> -->
|
||||
</div>
|
||||
<div class="py-2 px-3" style="text-align: right">
|
||||
<div class="layui-btn-group mr-4" style="display: none">
|
||||
<button type="button" data-event="show" class="layui-btn layui-btn-sm layui-btn-normal">
|
||||
<i class="layui-icon"></i>列表
|
||||
</button>
|
||||
<button type="button" data-event="show" class="layui-btn layui-btn-sm layui-btn-primary">
|
||||
<i class="layui-icon"></i>看板
|
||||
</button>
|
||||
<button type="button" data-event="show" class="layui-btn layui-btn-sm layui-btn-primary">
|
||||
<i class="layui-icon"></i>日历
|
||||
</button>
|
||||
</div>
|
||||
<button class="layui-btn layui-btn-sm add-new">+ 新建任务</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-bar border-t border-x">
|
||||
<form id="taskForm" class="layui-form">
|
||||
<div class="layui-input-inline" style="width: 120px">
|
||||
<select name="flow_status" lay-filter="status">
|
||||
<option value="">任务状态</option>
|
||||
<option value="1">未开始</option>
|
||||
<option value="2">进行中</option>
|
||||
<option value="3">已完成</option>
|
||||
<option value="4">已拒绝</option>
|
||||
<option value="5">已关闭</option>
|
||||
<option value="6">未解决</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 100px">
|
||||
<select name="priority" lay-filter="priority">
|
||||
<option value="">优先级</option>
|
||||
<option value="1">低</option>
|
||||
<option value="2">中</option>
|
||||
<option value="3">高</option>
|
||||
<option value="4">紧急</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 140px">
|
||||
<select name="type" lay-filter="type">
|
||||
<option value="">任务类型</option>
|
||||
{volist name="type" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 200px">
|
||||
<select name="project_id" lay-filter="project">
|
||||
<option value="">所属项目</option>
|
||||
{volist name="project" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 100px">
|
||||
<input type="hidden" name="type" />
|
||||
<input name="director_uid" style="display: none" value="" />
|
||||
<input type="text" name="director" placeholder="负责人" readonly class="layui-input employeepicker"
|
||||
autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 200px">
|
||||
<input type="text" name="keywords" placeholder="主题/描述内容" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 200px">
|
||||
<select name="creater_id" lay-filter="creater">
|
||||
<option value="">创建人</option>
|
||||
{volist name="creater" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">
|
||||
搜索
|
||||
</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary layui-border-blue" lay-filter="clear">
|
||||
重置
|
||||
</button>
|
||||
<button type="reset" class="layui-btn" lay-filter="onlyme">只看我</button>
|
||||
<input id="loginusers" type="hidden" value="{$user_info.id}" />
|
||||
</form>
|
||||
</div>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = [
|
||||
"tool",
|
||||
"gouguEdit",
|
||||
"gouguComment",
|
||||
"gouguSchedule",
|
||||
"employeepicker",
|
||||
"editormd",
|
||||
];
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
form = layui.form,
|
||||
tool = layui.tool,
|
||||
employeepicker = layui.employeepicker;
|
||||
|
||||
layui.taskTable = table.render({
|
||||
elem: "#test",
|
||||
title: "任务列表",
|
||||
cellMinWidth: 80,
|
||||
url: "/task/index/index", //数据接口
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
height: "full-186",
|
||||
cols: [
|
||||
[
|
||||
{
|
||||
field: "id",
|
||||
title: "任务编号",
|
||||
width: 80,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
return "T" + d.id;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "type_name",
|
||||
title: "紧急程度",
|
||||
width: 80,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="layui-badge bg-priority-' +
|
||||
d.priority +
|
||||
'">' +
|
||||
d.priority_name +
|
||||
"</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "flow_name",
|
||||
title: "状态",
|
||||
align: "center",
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="layui-badge bg-flow-' +
|
||||
d.flow_status +
|
||||
'">' +
|
||||
d.flow_name +
|
||||
"</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "project_id",
|
||||
title: "所属项目",
|
||||
width: 200,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<a class="link-a"' +
|
||||
' data-href="/project/index/view/id/' +
|
||||
d.project_id +
|
||||
'">' +
|
||||
d.belong_project +
|
||||
"</a>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "title",
|
||||
title: "任务主题",
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = "";
|
||||
if (d.is_new == 1) {
|
||||
html += '<span class="new-label">新回复</span>';
|
||||
}
|
||||
html +=
|
||||
'<a class="open-a" data-href="/task/index/view/id/' +
|
||||
d.id +
|
||||
'" style="padding-left:10px;">' +
|
||||
d.title +
|
||||
"</a>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "type_name",
|
||||
title: "任务类型",
|
||||
width: 100,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="color-status-' +
|
||||
d.type +
|
||||
'">' +
|
||||
d.type_name +
|
||||
"</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "type_name",
|
||||
title: "任务性质",
|
||||
width: 220,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
if (d.is_bug === 0) {
|
||||
html = '<span class="color-status-2">普通任务(TASK)</span>';
|
||||
} else if (d.is_bug === 1) {
|
||||
html = '<span class="color-status-1">问题缺陷(BUG)</span>';
|
||||
} else if (d.is_bug === 2) {
|
||||
html = '<span class="color-status-4">优化建议(OPTIMIZATION)</span>';
|
||||
}
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "flow_name",
|
||||
title: "完成进度",
|
||||
align: "center",
|
||||
width: 150,
|
||||
templet: function (d) {
|
||||
var progress =
|
||||
'<div class="layui-progress layui-progress-big" lay-showpercent="true">';
|
||||
if (d.flow_status == 1) {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar layui-bg-red" lay-percent="0%" style="width:0%;text-align:center;">未开始</div>';
|
||||
} else if (d.flow_status == 2) {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar layui-bg-orange" lay-percent="50%" style="width:50%;text-align:center;">进行中</div>';
|
||||
} else if (d.flow_status == 3) {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar layui-bg-green" lay-percent="100%" style="width:100%;text-align:center;">已完成</div>';
|
||||
} else if (d.flow_status == 4) {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar bg-flow-4" lay-percent="100%" style="width:100%;text-align:center;color:#fff">已拒绝</div>';
|
||||
} else if (d.flow_status == 5) {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar bg-flow-5" lay-percent="100%" style="width:100%;text-align:center;color:#fff">已关闭</div>';
|
||||
} else if (d.flow_status == 6) {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar layui-bg-darkred" lay-percent="0%" style="width:100%;text-align:center;">未解决</div>';
|
||||
} else {
|
||||
progress +=
|
||||
'<div class="layui-progress-bar bg-flow-5" lay-percent="0%" style="width:0%;text-align:center;">0%</div>';
|
||||
}
|
||||
progress += "</div>";
|
||||
return progress;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "creater_name",
|
||||
title: "创建人",
|
||||
align: "center",
|
||||
width: 80,
|
||||
},
|
||||
{
|
||||
field: "director_name",
|
||||
title: "负责人",
|
||||
align: "center",
|
||||
width: 80,
|
||||
},
|
||||
// { field: "assist_admin_names", title: "协作人", width: 200 },
|
||||
// { field: "cate_name", title: "工作类型", width: 90, align: "center" },
|
||||
// {
|
||||
// field: "plan_hours",
|
||||
// title: "预估工时",
|
||||
// align: "center",
|
||||
// width: 80,
|
||||
// },
|
||||
{
|
||||
field: "end_time",
|
||||
title: "预计结束日期",
|
||||
width: 150,
|
||||
templet: function (d) {
|
||||
var html = d.end_time;
|
||||
if (d.delay > 0) {
|
||||
html +=
|
||||
'<span class="color-status-0 ml-1" style="font-size:12px;text-align:center;">逾期' +
|
||||
d.delay +
|
||||
"天</span>";
|
||||
}
|
||||
return html;
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
});
|
||||
|
||||
//选择人弹窗
|
||||
$("#taskList").on("click", ".employeepicker", function () {
|
||||
let that = $(this);
|
||||
let ids_name = that.attr("name") + "_uid";
|
||||
var ids = $('[name="' + ids_name + '"]').val(),
|
||||
names = that.val(),
|
||||
id_array = [],
|
||||
name_array = [];
|
||||
if (ids.length > 0) {
|
||||
id_array = ids.split(",");
|
||||
name_array = names.split(",");
|
||||
}
|
||||
employeepicker.init({
|
||||
ids: id_array,
|
||||
names: name_array,
|
||||
department_url: "/api/index/get_department_tree",
|
||||
employee_url: "/api/index/get_employee",
|
||||
callback: function (ids, names, dids, departments) {
|
||||
$('[name="' + ids_name + '"]').val(ids);
|
||||
that.val(names);
|
||||
tableReload();
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
//新增
|
||||
$("#taskList").on("click", ".add-new", function () {
|
||||
tool.open("/task/index/add");
|
||||
});
|
||||
|
||||
//查看模式
|
||||
$("#taskList").on("click", '[data-event="show"]', function () {
|
||||
layer.msg("开源版只支持列表模式");
|
||||
});
|
||||
|
||||
//任务类型
|
||||
$("#taskTab").on("click", "li", function () {
|
||||
$(this).addClass("tab-this").siblings().removeClass("tab-this");
|
||||
let type = $(this).data("type");
|
||||
$("#taskForm").find('[name="type"]').val(type);
|
||||
tableReload();
|
||||
});
|
||||
form.on("select(creater)", function (data) {
|
||||
tableReload();
|
||||
});
|
||||
form.on("select(status)", function (data) {
|
||||
tableReload();
|
||||
});
|
||||
form.on("select(priority)", function (data) {
|
||||
tableReload();
|
||||
});
|
||||
form.on("select(type)", function (data) {
|
||||
tableReload();
|
||||
});
|
||||
form.on("select(belong_project)", function (data) {
|
||||
tableReload();
|
||||
});
|
||||
form.on("select(project)", function (data) {
|
||||
tableReload();
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on("submit(webform)", function (data) {
|
||||
if (data.field.keywords == "") {
|
||||
return false;
|
||||
}
|
||||
tableReload();
|
||||
return false;
|
||||
});
|
||||
$("#taskForm").on("click", '[lay-filter="clear"]', function () {
|
||||
setTimeout(function () {
|
||||
tableReload();
|
||||
}, 10);
|
||||
});
|
||||
//只看我按钮代码
|
||||
$("#taskForm").on("click", '[lay-filter="onlyme"]', function () {
|
||||
|
||||
let loginuser = $("#loginusers").val(); // 从隐藏的输入字段中获取loginuser的值
|
||||
|
||||
$("#taskForm").find('[name="director_uid"]').val(loginuser); // 将director_uid的值设置为loginuser
|
||||
|
||||
let postData = {
|
||||
type: $("#taskForm").find('[name="type"]').val(),
|
||||
flow_status: $("#taskForm").find('[name="flow_status"]').val(),
|
||||
priority: $("#taskForm").find('[name="priority"]').val(),
|
||||
cate: $("#taskForm").find('[name="cate"]').val(),
|
||||
delay: $("#taskForm").find('[name="delay"]').val(),
|
||||
director_uid: $("#taskForm").find('[name="director_uid"]').val(),
|
||||
project_id: $("#taskForm").find('[name="project_id"]').val(),
|
||||
keywords: $("#taskForm").find('[name="keywords"]').val(),
|
||||
belong_project: $("#taskForm").find('[name="belong_project"]').val(),
|
||||
creater_name: $("#taskForm").find('[name="creater_name"]').val(),
|
||||
admin_id: $("#taskForm").find('[name="creater_id"]').val(),
|
||||
};
|
||||
layui.taskTable.reload({ where: postData });
|
||||
});
|
||||
|
||||
|
||||
|
||||
function tableReload() {
|
||||
let postData = {
|
||||
type: $("#taskForm").find('[name="type"]').val(),
|
||||
flow_status: $("#taskForm").find('[name="flow_status"]').val(),
|
||||
priority: $("#taskForm").find('[name="priority"]').val(),
|
||||
cate: $("#taskForm").find('[name="cate"]').val(),
|
||||
delay: $("#taskForm").find('[name="delay"]').val(),
|
||||
director_uid: $("#taskForm").find('[name="director_uid"]').val(),
|
||||
project_id: $("#taskForm").find('[name="project_id"]').val(),
|
||||
keywords: $("#taskForm").find('[name="keywords"]').val(),
|
||||
belong_project: $("#taskForm").find('[name="belong_project"]').val(),
|
||||
creater_name: $("#taskForm").find('[name="creater_name"]').val(),
|
||||
admin_id: $("#taskForm").find('[name="creater_id"]').val(),
|
||||
};
|
||||
layui.taskTable.reload({ where: postData });
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,716 @@
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<h3 class="h3-title hover-edit">
|
||||
<span class="layui-btn layui-btn-xs bg-priority-{$detail.priority}">{$detail.priority_name}</span>
|
||||
<span id="title_{$detail.id}" data-val="">{$detail.title}</span>
|
||||
<i class="iconfont icon-wodedianping" title="编辑" data-name="title"></i>
|
||||
</h3>
|
||||
<div>
|
||||
<span class="layui-badge layui-bg-gray">#T{$detail.id}</span>
|
||||
<span class="mx-2">{$detail.admin_name}</span>
|
||||
<span class="font-gray">创建于{$detail.times}<span id="editTips">{gt name="$detail.update_time"
|
||||
value="0"},最近更新于 {:time_trans($detail.update_time)}{/gt}</span></span>
|
||||
|
||||
<span class="layui-btn layui-btn-xs layui-bg-blue ml-4" id="editBtn">编辑任务</span>
|
||||
{eq name="$detail.admin_id" value="$params.uid"}
|
||||
<span class="layui-btn layui-btn-xs layui-btn-danger ml-4" id="delBtn">删除</span>
|
||||
{/eq}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row border-b">
|
||||
<div class="layui-col-md9 p-4 border-r">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">负责人</td>
|
||||
<td class="hover-edit"><span id="director_uid_{$detail.id}"
|
||||
data-val="{$detail.director_uid}">{$detail.director_name}</span></td>
|
||||
<td class="layui-td-gray">协作人</td>
|
||||
<td class="hover-edit"><span id="assist_admin_ids_{$detail.id}"
|
||||
data-val="{$detail.assist_admin_ids}">{$detail.assist_admin_names}</span></td>
|
||||
<td class="layui-td-gray">创建人</td>
|
||||
<td class="hover-edit"><span id="admin_id_{$detail.id}"
|
||||
data-val="{$detail.admin_id}">{$detail.admin_name}</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">任务类型</td>
|
||||
<td class="hover-edit"><span id="type_{$detail.id}"
|
||||
data-val="{$detail.type}">{$detail.type_name}</span></td>
|
||||
<td class="layui-td-gray">任务性质</td>
|
||||
<td class="hover-edit"><span id="is_bug_{$detail.id}"
|
||||
data-val="{$detail.is_bug}">{$detail.is_bug==0?'普通任务(TASK)':($detail.is_bug==2?'优化建议(OPTIMIZATION)':'问题缺陷(BUG)')}</span></td>
|
||||
<td class="layui-td-gray">工作类型</td>
|
||||
<td class="hover-edit"><span id="cate_{$detail.id}"
|
||||
data-val="{$detail.cate}">{$detail.cate_name}</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">优先级</td>
|
||||
<td class="hover-edit"><span class="color-priority-{$detail.priority}" id="priority_{$detail.id}"
|
||||
data-val="{$detail.priority}">{$detail.priority_name}</span>
|
||||
</td>
|
||||
<td class="layui-td-gray">预估工时</td>
|
||||
<td class="hover-edit"><span id="plan_hours_{$detail.id}" data-val="">{$detail.plan_hours}</span></td>
|
||||
<td class="layui-td-gray">任务状态</td>
|
||||
<td class="hover-edit">
|
||||
<span class="color-flow-{$detail.flow_status}" id="flow_status_{$detail.id}"
|
||||
data-val="{$detail.flow_status}">{$detail.flow_name}</span></td>
|
||||
<input type="hidden" name="done_ratio" id="done_ratio_val" value="{$detail.done_ratio}">
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">计划完成日期</td>
|
||||
<td class="hover-edit"><span id="end_time_{$detail.id}" data-val="">{$detail.end_time|
|
||||
date='Y-m-d'}</span>{gt name="$detail.delay" value="0"}<span class="layui-badge ml-2">逾期
|
||||
{$detail.delay} 天</span>{/gt}</td>
|
||||
<td class="layui-td-gray-2">实际完成日期</td>
|
||||
<td class="hover-edit">{eq name="$detail.over_time" value="0"}-{else/}{$detail.over_time|
|
||||
date='Y-m-d'}{/eq}</td>
|
||||
<td class="layui-td-gray">完成进度</td>
|
||||
<td class="hover-edit"><span class="color-done_ratio-{$detail.done_ratio}"
|
||||
id="done_ratio_{$detail.id}" data-val="{$detail.done_ratio}">{$detail.done_ratio}%</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="md-content hover-edit">
|
||||
<h5 class="py-4">任务描述<i class="iconfont icon-wodedianping" title="编辑" data-name="md_content"></i></h5>
|
||||
<div class="md-content-content" id="md_content_{$detail.id}" data-val="{$detail.md_content}">
|
||||
{$detail.content|raw}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-file">
|
||||
<h5 class="py-4">文件附件</h5>
|
||||
<div>
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="flieBtn">选择文件并上传</button>
|
||||
<span
|
||||
style="color:#FF5722; font-size:12px; margin-left: 8px;">上传前,请规范命名,最大只能上传{:get_system_info('upload_max_filesize')}的文件,超过请压缩成多个文件上传。</span>
|
||||
<div class="layui-upload-list" {empty name="$file_array" }style="display:none;" {/empty}>
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60%">文件</th>
|
||||
<th width="15%" style="text-align:center">文件大小</th>
|
||||
<th width="10%" style="text-align:center">上传人</th>
|
||||
<th width="15%" style="text-align:center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="flieList">
|
||||
{volist name="file_array" id="vo"}
|
||||
<tr>
|
||||
<td><a href="{$vo.filepath}" download="{$vo.name}" data-id="{$vo.id}">{$vo.name}</a>
|
||||
</td>
|
||||
<td style="text-align: center;">{$vo.filesize/1048576|round=2}MB</td>
|
||||
<td style="text-align: center;">{$vo.admin_name}</td>
|
||||
<td style="text-align: center;">
|
||||
<div class="layui-btn-group">
|
||||
<a class="layui-btn layui-btn-xs " href="{$vo.filepath}"
|
||||
download="{$vo.name}" data-id="{$vo.id}">下载</a>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-danger file-delete"
|
||||
data-uid="{$vo.admin_id}" data-id="{$vo.id}">删除</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-link">
|
||||
<h5 class="py-4">关联链接</h5>
|
||||
<div>
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="linkBtn">新增相关联链接</button>
|
||||
<span style="color:#FF5722; font-size:12px; margin-left: 8px;">请规范填写链接说明,方便大家查阅。</span>
|
||||
<div class="layui-upload-list" {empty name="$link_array" }style="display:none;" {/empty}>
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60%">链接</th>
|
||||
<th width="15%" style="text-align:center">说明</th>
|
||||
<th width="10%" style="text-align:center">添加人</th>
|
||||
<th width="15%" style="text-align:center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="linkList">
|
||||
{volist name="link_array" id="vo"}
|
||||
<tr data-id="{$vo.id}" id="link_{$vo.id}">
|
||||
<td><a href="{$vo.url}" target="_blank">{$vo.url}</a></td>
|
||||
<td>{$vo.desc}</td>
|
||||
<td style="text-align: center;">{$vo.admin_name}</td>
|
||||
<td style="text-align: center;">
|
||||
<div class="layui-btn-group">
|
||||
<span class="layui-btn layui-btn-xs link-edit" data-id="{$vo.id}"
|
||||
data-href="{$vo.url}" data-desc="{$vo.desc}">编辑</span>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-danger link-delete"
|
||||
data-uid="{$vo.admin_id}" data-id="{$vo.id}">删除</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3 p-4">
|
||||
<div class="pb-4">
|
||||
<p class="font-gray mb-2">关联产品:</p>
|
||||
<span>
|
||||
{gt name="$detail.project_id" value="0"}{$detail.product_name}{else/}<span
|
||||
class="font-gray">未设置</span>{/gt}
|
||||
</span>
|
||||
</div>
|
||||
<div class="pb-4 hover-{$role_edit}">
|
||||
<p class="font-gray mb-2">关联项目:</p>
|
||||
<span id="project_id_{$detail.id}" data-val="{$detail.project_id}">
|
||||
{gt name="$detail.project_id" value="0"}{$detail.project_name}{else/}<span
|
||||
class="font-gray">未设置</span>{/gt}
|
||||
</span>
|
||||
<i class="iconfont icon-wodedianping" title="编辑" data-name="project_id"></i>
|
||||
</div>
|
||||
|
||||
<div class="pb-4 mt-3">
|
||||
<h5 class="mb-4">工作记录<span class="layui-btn layui-btn-xs add-schedule right">+ 工作记录</span></h5>
|
||||
<div id="schedule_{$detail.id}">
|
||||
<span style="color:#999">暂无工作记录</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab layui-tab-brief px-4" lay-filter="docDemoTabBrief">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">操作日志({$detail.logs})</li>
|
||||
<li>员工评论({$detail.comments})</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content p-0">
|
||||
<div class="layui-tab-item logs-list ">
|
||||
<div id="log_task_{$detail.id}"></div>
|
||||
</div>
|
||||
<div class="layui-tab-item comment-list ">
|
||||
<div class="comment-input my-2">
|
||||
<input type="text" id="commentInput" readonly placeholder="发表一下你的看法" class="layui-input" value="">
|
||||
</div>
|
||||
<div id="comment_task_{$detail.id}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 判断任务状态,并修改任务进度
|
||||
if ($('#flow_status_{$detail.id}').text() === '已完成') {
|
||||
$('#done_ratio_{$detail.id}').text('100%').attr('title', '100');
|
||||
} else if ($('#flow_status_{$detail.id}').text() === '进行中') {
|
||||
$('#done_ratio_{$detail.id}').text('50%').attr('title', '50');
|
||||
} else if ($('#flow_status_{$detail.id}').text() === '未解决') {
|
||||
$('#done_ratio_{$detail.id}').text('0%').attr('title', '0');
|
||||
} else {
|
||||
$('#done_ratio_{$detail.id}').text('0%').attr('title', '0');
|
||||
}
|
||||
|
||||
function previewImg(obj) {
|
||||
var img = new Image();
|
||||
img.src = obj.src;
|
||||
var height = img.height + 50; // 原图片大小
|
||||
var width = img.width; //原图片大小
|
||||
var imgHtml = "<img src='" + obj.src + "' width='width' height='height'/>";
|
||||
//弹出层
|
||||
layer.open({
|
||||
type: 1,
|
||||
shade: 0.8,
|
||||
offset: 'auto',
|
||||
area: [width + 'px', 800 + 'px'], // area: [width + 'px',height+'px'] //原图显示
|
||||
shadeClose: true,
|
||||
scrollbar: false,
|
||||
title: "图片预览", //不显示标题
|
||||
content: imgHtml, //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
|
||||
cancel: function () {
|
||||
//layer.msg('捕获就是从页面已经存在的元素上,包裹layer的结构', { time: 5000, icon: 6 });
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
function openInit() {
|
||||
const admin_id = '{$detail.admin_id}';
|
||||
const detail_id = '{$detail.id}';
|
||||
const opsData = {
|
||||
flow_status: [
|
||||
{ 'id': 1, 'title': '未开始' },
|
||||
{ 'id': 2, 'title': '进行中' },
|
||||
{ 'id': 3, 'title': '已完成' },
|
||||
{ 'id': 4, 'title': '不解决' },
|
||||
{ 'id': 5, 'title': '已关闭' },
|
||||
{ 'id': 6, 'title': '未解决' },
|
||||
],
|
||||
is_bug: [
|
||||
{ 'id': 0, 'title': '普通任务(TASK)' },
|
||||
{ 'id': 1, 'title': '问题缺陷(BUG)' },
|
||||
{ 'id': 2, 'title': '优化建议(OPTIMIZATION)' },
|
||||
],
|
||||
priority: [
|
||||
{ 'id': 1, 'title': '低' },
|
||||
{ 'id': 2, 'title': '中' },
|
||||
{ 'id': 3, 'title': '高' },
|
||||
{ 'id': 4, 'title': '紧急' }
|
||||
],
|
||||
done_ratio: [
|
||||
{ 'id': 0, 'title': '0%' },
|
||||
{ 'id': 10, 'title': '20%' },
|
||||
{ 'id': 40, 'title': '40%' },
|
||||
{ 'id': 50, 'title': '50%' },
|
||||
{ 'id': 60, 'title': '60%' },
|
||||
{ 'id': 80, 'title': '80%' },
|
||||
{ 'id': 100, 'title': '100%' }
|
||||
]
|
||||
}
|
||||
const layer = layui.layer, edit = layui.gouguEdit, comment = layui.gouguComment, schedule = layui.gouguSchedule, upload = layui.upload, tool = layui.tool;
|
||||
|
||||
$('#flow_status_' + detail_id).on('click', function () {
|
||||
let flow_status = $(this).data('val');
|
||||
if (flow_status === '3') {
|
||||
$('#done_ratio_val').val('100');
|
||||
} else {
|
||||
$('#done_ratio_val').val('0');
|
||||
}
|
||||
});
|
||||
|
||||
$('.hover-edit').hover(function () {
|
||||
$(this).addClass('hover-on');
|
||||
}, function () {
|
||||
$(this).removeClass('hover-on');
|
||||
})
|
||||
|
||||
$('.hover-edit').on('click', 'i', function () {
|
||||
let name = $(this).data('name');
|
||||
let show_txt = $('#' + name + '_' + detail_id).text().replace(/[\r\n\t]/g, "");
|
||||
let real_txt = $('#' + name + '_' + detail_id).data('val');
|
||||
if (real_txt === '') {
|
||||
real_txt = show_txt;
|
||||
}
|
||||
editShow(detail_id, name, show_txt, real_txt);
|
||||
})
|
||||
|
||||
$('#delBtn').on('click', function () {
|
||||
layer.confirm('确定要删除该任务吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
setTimeout(function () {
|
||||
location.reload();
|
||||
}, 1000)
|
||||
}
|
||||
let postData = { "id": detail_id };
|
||||
tool.delete("/task/index/delete", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
$('#editBtn').on('click', function () {
|
||||
// 获取任务详情
|
||||
$.ajax({
|
||||
url: '/task/index/gettask',
|
||||
method: 'GET',
|
||||
data: { id: '{$detail.id}' },
|
||||
success: function (response) {
|
||||
if (response.code === 0) {
|
||||
const detail = response.data.detail;
|
||||
// 获取工作类型
|
||||
$.ajax({
|
||||
url: '/task/index/getworkcate',
|
||||
method: 'GET',
|
||||
success: function (workcateResponse) {
|
||||
if (workcateResponse.code === 0) {
|
||||
const cateList = workcateResponse.data.cate;
|
||||
const adminList = workcateResponse.data.admin_id;
|
||||
const typeList = workcateResponse.data.type;
|
||||
|
||||
const workcateOptions = cateList.map(cate => `
|
||||
<option value="${cate.id}" ${cate.id == detail.cate ? 'selected' : ''}>${cate.title}</option>
|
||||
`).join('');
|
||||
|
||||
const typeOptions = typeList.map(type => `
|
||||
<option value="${type.id}" ${type.id == detail.type ? 'selected' : ''}>${type.title}</option>
|
||||
`).join('');
|
||||
|
||||
const adminOptions = adminList.map(admin => `
|
||||
<option value="${admin.id}" ${admin.id == detail.director_uid ? 'selected' : ''}>${admin.name}</option>
|
||||
`).join('');
|
||||
|
||||
// 弹出层
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: '编辑任务',
|
||||
area: ['1000px', '500px'],
|
||||
content: `
|
||||
<form class="layui-form layui-form-pane" style="padding: 20px;">
|
||||
<input type="hidden" name="id" value="${detail.id}">
|
||||
<div class="layui-form-item" style="display:flex">
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">负责人</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<select name="director_uid" required lay-verify="required" class="layui-input" style="display:block">
|
||||
${adminOptions}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">协作人</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<input type="text" name="assist_admin_ids" autocomplete="off" value="功能还未做好" disabled class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">优先级</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<select name="priority" required lay-verify="required" value="${detail.flow_status}" style="display:block" class="layui-input">
|
||||
<option value="1" ${detail.priority == 1 ? 'selected' : ''}>低</option>
|
||||
<option value="2" ${detail.priority == 2 ? 'selected' : ''}>中</option>
|
||||
<option value="3" ${detail.priority == 3 ? 'selected' : ''}>高</option>
|
||||
<option value="4" ${detail.priority == 4 ? 'selected' : ''}>紧急</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display:flex">
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">任务类型</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<select name="type" required lay-verify="required" class="layui-input" style="display:block">
|
||||
${typeOptions}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">任务性质</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<select id="isBugSelect" name="is_bug" required lay-verify="required" value="${detail.flow_status}" style="display:block" class="layui-input">
|
||||
<option value="1" ${detail.is_bug == 1 ? 'selected' : ''}>普通任务(TASK)</option>
|
||||
<option value="2" ${detail.is_bug == 2 ? 'selected' : ''}>问题缺陷(BUG)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">工作类型</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<select name="cate" required lay-verify="required" class="layui-input" style="display:block">
|
||||
${workcateOptions}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display:flex">
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">预计工时</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<input type="text" name="plan_hours" placeholder="请输入预计工时" autocomplete="off" class="layui-input" value="${detail.plan_hours}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">计划完成日期</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<input type="text" name="end_time" required lay-verify="required" placeholder="请输入计划完成日期" autocomplete="off" class="layui-input" value="${detail.end_time}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">实际完成日期</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<input type="text" name="over_time" placeholder="请输入实际完成日期" autocomplete="off" class="layui-input" value="${detail.over_time}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display:flex">
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">任务状态</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<select name="flow_status" required lay-verify="required" value="${detail.flow_status}" style="display:block" class="layui-input">
|
||||
<option value="1" ${detail.flow_status == 1 ? 'selected' : ''}>未开始</option>
|
||||
<option value="2" ${detail.flow_status == 2 ? 'selected' : ''}>进行中</option>
|
||||
<option value="3" ${detail.flow_status == 3 ? 'selected' : ''}>已完成</option>
|
||||
<option value="4" ${detail.flow_status == 4 ? 'selected' : ''}>已拒绝</option>
|
||||
<option value="5" ${detail.flow_status == 5 ? 'selected' : ''}>已关闭</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">完成进度</label>
|
||||
<div class="layui-input-inline" style="width:180px; display: flex; align-items: center;">
|
||||
<input type="text" name="done_ratio" required lay-verify="required" placeholder="请输入完成进度" autocomplete="off" class="layui-input" value="${detail.done_ratio}" style="flex: 1;">
|
||||
<div class="layui-input-split layui-input-suffix">
|
||||
%
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">创建人</label>
|
||||
<div class="layui-input-inline" style="width:180px">
|
||||
<input type="text" name="admin_name" disabled required lay-verify="required" class="layui-input" value="{$detail.admin_name}" style="display:block">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveProject">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
`,
|
||||
success: function (layero, index) {
|
||||
// layui.config({
|
||||
// base: 'js/',
|
||||
// })
|
||||
layui.use(['form', 'laydate', 'multiSelect'], function () {
|
||||
var form = layui.form;
|
||||
var laydate = layui.laydate;
|
||||
var multiSelect = layui.multiSelect;
|
||||
|
||||
// 初始化日期选择器
|
||||
laydate.render({
|
||||
elem: 'input[name="end_time"]',
|
||||
type: 'date',
|
||||
format: 'yyyy-MM-dd',
|
||||
});
|
||||
|
||||
laydate.render({
|
||||
elem: 'input[name="over_time"]',
|
||||
type: 'date',
|
||||
format: 'yyyy-MM-dd',
|
||||
});
|
||||
|
||||
// 初始化多选
|
||||
multiSelect.init();
|
||||
|
||||
// 表单提交事件
|
||||
form.on('submit(saveProject)', function (data) {
|
||||
console.log(data.field); // 打印所有表单数据
|
||||
// 可以在这里发送AJAX请求,将数据提交到服务器
|
||||
$.ajax({
|
||||
url: '/task/index/gettask',
|
||||
method: 'POST',
|
||||
data: data.field,
|
||||
success: function (response) {
|
||||
layer.msg('保存成功');
|
||||
layer.close(index); // 关闭弹窗
|
||||
// location.reload();
|
||||
}
|
||||
});
|
||||
|
||||
return false; // 阻止表单跳转
|
||||
});
|
||||
|
||||
$('#get-val').click(function() {
|
||||
var vals = [],
|
||||
texts = [];
|
||||
$('select[multiple] option:selected').each(function() {
|
||||
vals.push($(this).val());
|
||||
texts.push($(this).text());
|
||||
})
|
||||
console.dir(vals);
|
||||
console.dir(texts);
|
||||
})
|
||||
});
|
||||
},
|
||||
cancel: function (index, layero) {
|
||||
layer.close(index); // 关闭弹窗
|
||||
return false; // 阻止默认关闭行为
|
||||
}
|
||||
});
|
||||
} else {
|
||||
layer.msg(workcateResponse.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
layer.msg(response.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 上传文件
|
||||
upload.render({
|
||||
elem: '#flieBtn'
|
||||
, url: '/api/index/upload'
|
||||
, accept: 'file'
|
||||
, exts: 'jpeg|jpg|png|gif|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z'
|
||||
, before: function (obj) {
|
||||
layer.msg('上传中...', { time: 3600000 });
|
||||
}
|
||||
, done: function (res, index, upload) {
|
||||
let callback = function (e) {
|
||||
layer.msg('上传成功');
|
||||
tool.load('/task/index/view?id=' + detail_id);
|
||||
}
|
||||
let postData = { 'topic_id': detail_id, 'file_id': res.data.id, 'file_name': res.data.name, 'module': 'task' };
|
||||
tool.post("/api/appendix/add", postData, callback);
|
||||
}
|
||||
, error: function (index, upload) {
|
||||
layer.msg('上传失败');
|
||||
}
|
||||
});
|
||||
|
||||
// 删除文件
|
||||
$('#flieList').on('click', '.file-delete', function () {
|
||||
let id = $(this).data('id');
|
||||
let uid = $(this).data('uid');
|
||||
if (uid != GOUGU_DEV.uid) {
|
||||
layer.msg('你不是该文件的上传人,无权限删除');
|
||||
return false;
|
||||
}
|
||||
layer.confirm('确定要删除该附件吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
tool.load('/task/index/view?id=' + detail_id);
|
||||
}
|
||||
let postData = { 'id': id };
|
||||
tool.delete("/api/appendix/delete", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
// 新增链接
|
||||
$('#linkBtn').on('click', function () {
|
||||
comment.addLink(0, detail_id, 'task', '', '');
|
||||
})
|
||||
|
||||
// 编辑链接
|
||||
$('#linkList').on('click', '.link-edit', function () {
|
||||
let id = $(this).data('id');
|
||||
let url = $(this).data('href');
|
||||
let desc = $(this).data('desc');
|
||||
comment.addLink(id, detail_id, 'task', url, desc);
|
||||
})
|
||||
|
||||
// 删除链接
|
||||
$('#linkList').on('click', '.link-delete', function () {
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要删除该链接吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
tool.load("/task/index/view?id=" + detail_id);
|
||||
}
|
||||
let postData = { "id": id };
|
||||
tool.delete("/api/appendix/delete_link", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
// 新增工作记录
|
||||
$('.add-schedule').on('click', function () {
|
||||
schedule.add(detail_id);
|
||||
})
|
||||
|
||||
// 加载工作记录
|
||||
schedule.load(detail_id);
|
||||
|
||||
// 加载评论
|
||||
comment.load(detail_id, 'task');
|
||||
$('#commentInput').on('click', function () {
|
||||
comment.editor(0, detail_id, 0, 0, 'task', '');
|
||||
})
|
||||
|
||||
// 回复
|
||||
$('#comment_task_' + detail_id).on('click', '[data-event="replay"]', function () {
|
||||
let pid = $(this).data('id');
|
||||
let padmin_id = $(this).data('uid');
|
||||
comment.editor(0, detail_id, pid, padmin_id, 'task', '');
|
||||
})
|
||||
|
||||
// 编辑
|
||||
$('#comment_task_' + detail_id).on('click', '[data-event="edit"]', function () {
|
||||
let id = $(this).data('id');
|
||||
let mdcontent = $('#comment_' + id).data('mdcontent');
|
||||
comment.editor(id, detail_id, 0, 0, 'task', mdcontent);
|
||||
})
|
||||
|
||||
// 删除
|
||||
$('#comment_task_' + detail_id).on('click', '[data-event="del"]', function () {
|
||||
let id = $(this).data('id');
|
||||
comment.del(id, detail_id, 'task');
|
||||
})
|
||||
|
||||
// 加载操作记录
|
||||
comment.log(detail_id, 'task');
|
||||
|
||||
let loading = false;
|
||||
|
||||
// 编辑任务信息
|
||||
let editPost = function (id, name, show_val, real_val) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
if (e.code == 0) {
|
||||
tool.load('/task/index/view/id/' + id);
|
||||
if (layui.pageTable) {
|
||||
setTimeout(function () {
|
||||
layui.pageTable.reload();
|
||||
}, 400)
|
||||
}
|
||||
}
|
||||
else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
let postData = { id: id };
|
||||
postData[name] = real_val;
|
||||
if (name == 'md_content') {
|
||||
postData['content'] = show_val;
|
||||
}
|
||||
tool.post("/task/index/add", postData, callback);
|
||||
}
|
||||
|
||||
// 显示编辑框
|
||||
function editShow(id, name, show_txt, real_txt) {
|
||||
if (loading == true) {
|
||||
return false;
|
||||
}
|
||||
if (name == "title" || name == "plan_hours") {
|
||||
edit.text(id, name, real_txt, editPost);
|
||||
}
|
||||
if (name == "end_time") {
|
||||
if (admin_id == GOUGU_DEV.uid) {
|
||||
edit.date(id, name, real_txt, editPost);
|
||||
} else {
|
||||
layer.msg('您没权限修改,请联系创建人修改');
|
||||
}
|
||||
}
|
||||
if (name == "director_uid") {
|
||||
edit.employee_one(id, name, show_txt, real_txt, editPost);
|
||||
}
|
||||
if (name == "assist_admin_ids") {
|
||||
edit.employee_more(id, name, show_txt, real_txt, editPost);
|
||||
}
|
||||
if (name == "flow_status" || name == "is_bug" || name == "priority" || name == "done_ratio") {
|
||||
edit.dropdown(id, name, real_txt, opsData[name], editPost);
|
||||
}
|
||||
if (name == "type") {
|
||||
loading = true;
|
||||
tool.get("/api/index/get_task_cate", {}, function (res) {
|
||||
let data = res.data;
|
||||
loading = false;
|
||||
edit.dropdown(id, name, real_txt, data, editPost, 0);
|
||||
});
|
||||
}
|
||||
if (name == "cate") {
|
||||
loading = true;
|
||||
tool.get("/api/index/get_work", {}, function (res) {
|
||||
let data = res.data;
|
||||
loading = false;
|
||||
edit.dropdown(id, name, real_txt, data, editPost, 0);
|
||||
});
|
||||
}
|
||||
if (name == "project_id") {
|
||||
if (admin_id == GOUGU_DEV.uid) {
|
||||
loading = true;
|
||||
tool.get("/api/index/get_project", {}, function (res) {
|
||||
let data = res.data;
|
||||
loading = false;
|
||||
edit.dropdown(id, name, real_txt, data, editPost, 1);
|
||||
});
|
||||
} else {
|
||||
layer.msg('您没权限修改,请联系创建人或负责人修改');
|
||||
}
|
||||
}
|
||||
if (name == "md_content") {
|
||||
edit.editor(id, name, real_txt, editPost);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user