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,212 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\project\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\ProjectDemo as ProjectDemoList;
|
||||
use app\model\DevelopmentLanguage as DevelopmentLanguageList;
|
||||
use app\project\validate\ProjectDemoCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Demo extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$rows = empty($param['limit']) ? get_md_contentconfig('app.page_size') : $param['limit'];
|
||||
|
||||
$list = ProjectDemoList::withoutField('')
|
||||
->where('delete_time', null)
|
||||
->order('name')
|
||||
->order('create_time', 'desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$bi = Db::name('ProjectDemo')->where(['id' => $item->id])->find();
|
||||
$item->name = $bi['name'];
|
||||
$item->url = $bi['url'];
|
||||
$item->url_cate = $bi['url_cate'];
|
||||
$item->cate = $bi['cate'];
|
||||
$item->remark = $bi['remark'];
|
||||
$item->language = Db::name('development_language')->where('id', $bi['language'])->value('name');
|
||||
})
|
||||
->filter(function ($item) {
|
||||
return $item->delete_time === null;
|
||||
});
|
||||
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
$projectdemo = (new ProjectDemoList())->detail($param['id']);
|
||||
try {
|
||||
validate(ProjectDemoCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = ProjectDemoList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param, $projectdemo);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(ProjectDemoCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
// $exist = ProjectDemoList::where('name', $param['name'])
|
||||
// ->where('id', '<>', $param['id'])->find();
|
||||
// if ($exist) {
|
||||
// return to_assign(1, '该信息已存在');
|
||||
// }
|
||||
$param['create_time'] = date('Y-m-d H:i:s', time());
|
||||
$param['admin_id'] = $this->uid;
|
||||
$sid = ProjectDemoList::strict(false)->field(true)->insertGetId($param);
|
||||
if ($sid) {
|
||||
add_log('add', $sid, $param);
|
||||
$log_data = array(
|
||||
'module' => 'plans',
|
||||
// 'id' => $sid,
|
||||
'new_content' => $param['name'],
|
||||
'field' => 'new',
|
||||
'action' => 'add',
|
||||
'admin_id' => $this->uid,
|
||||
'create_time' => time(),
|
||||
);
|
||||
Db::name('Log')->strict(false)->field(true)->insert($log_data);
|
||||
}
|
||||
return to_assign(2, '添加成功!');
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$detail = (new ProjectDemoList())->detail($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '1.信息不存在');
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$edit = ProjectDemoList::where('id', $id)->find();
|
||||
if (empty($edit)) {
|
||||
return to_assign(1, '信息不存在');
|
||||
} else {
|
||||
View::assign('edit', $edit);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = (new ProjectDemoList())->detail($id);
|
||||
// print_r($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '2.信息不存在');
|
||||
} else {
|
||||
View::assign('detail', $detail);
|
||||
// print_r($detail);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
$request = request();
|
||||
if ($request->isDelete() || $request->isAjax()) {
|
||||
$id = get_params("id");
|
||||
$detail = Db::name('ProjectDemo')->where('id', $id)->find();
|
||||
if (Db::name('ProjectDemo')->where('id', $id)->update(['delete_time' => date('Y-m-d H:i:s')]) !== false) {
|
||||
$log_data = array(
|
||||
'module' => 'projectdemo',
|
||||
'field' => 'delete',
|
||||
'action' => 'delete',
|
||||
'admin_id' => $this->uid,
|
||||
'old_content' => '',
|
||||
'new_content' => $detail['name'],
|
||||
'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 batch_delete()
|
||||
{
|
||||
$request = request();
|
||||
if ($request->isDelete() || $request->isAjax()) {
|
||||
$ids = get_params("ids");
|
||||
foreach ($ids as $id) {
|
||||
$detail = Db::name('ProjectDemo')->where('id', $id)->find();
|
||||
if (Db::name('ProjectDemo')->where('id', $id)->update(['delete_time' => date('Y-m-d H:i:s')]) !== false) {
|
||||
$log_data = array(
|
||||
'module' => 'projectdemo',
|
||||
'field' => 'delete',
|
||||
'action' => 'delete',
|
||||
'admin_id' => $this->uid,
|
||||
'old_content' => '',
|
||||
'new_content' => $detail['name'],
|
||||
'create_time' => time(),
|
||||
);
|
||||
Db::name('Log')->strict(false)->field(true)->insert($log_data);
|
||||
}
|
||||
}
|
||||
return to_assign(0, "批量删除成功");
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
// 获取开发语言
|
||||
public function getLanguage()
|
||||
{
|
||||
$languages = DevelopmentLanguageList::order('id', 'aec')->column('name', 'id');
|
||||
$formattedLanguages = [];
|
||||
foreach ($languages as $id => $language) {
|
||||
$formattedLanguages[] = ["id" => $id, "language" => $language];
|
||||
}
|
||||
|
||||
return json($formattedLanguages);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,674 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\project\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Project as ProjectList;
|
||||
use app\model\Business as BusinessList;
|
||||
use app\project\validate\ProjectCheck;
|
||||
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();
|
||||
$project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => null])->column('project_id');
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = ProjectList::withoutField('content,md_content')
|
||||
// ->where([['delete_time', '=', 0], ['id', 'in', $project_ids]])
|
||||
->where([['delete_time', '=', 0]])
|
||||
->order('status asc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$item->director_name = Db::name('Admin')->where(['id' => $item->director_uid])->value('name');
|
||||
$item->plan_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time);
|
||||
$item->status_name = ProjectList::$Status[(int)$item->status];
|
||||
|
||||
$business = BusinessList::where('id', $item->business_id)->find();
|
||||
$item->business_id = $business ? ($business->name_short ?: $business->name) : null;
|
||||
|
||||
$task_map = [];
|
||||
$task_map[] = ['project_id', '=', $item->id];
|
||||
$task_map[] = ['delete_time', '=', 0];
|
||||
|
||||
|
||||
//任务
|
||||
$task_map_a = $task_map;
|
||||
$task_map_a[] = ['is_bug', '=', 0];
|
||||
//任务总数
|
||||
$item->tasks_a_total = Db::name('Task')->where($task_map_a)->count();
|
||||
//已完成任务
|
||||
$task_map_a[] = ['flow_status', '>', 2]; //已完成
|
||||
$item->tasks_a_finish = Db::name('Task')->where($task_map_a)->count();
|
||||
//未完成任务
|
||||
$item->tasks_a_unfinish = $item->tasks_a_total - $item->tasks_a_finish;
|
||||
if ($item->tasks_a_total > 0) {
|
||||
$item->tasks_a_pensent = round($item->tasks_a_finish / $item->tasks_a_total * 100, 2) . "%";
|
||||
} else {
|
||||
$item->tasks_a_pensent = "100%";
|
||||
}
|
||||
|
||||
//缺陷
|
||||
$task_map_b = $task_map;
|
||||
$task_map_b[] = ['is_bug', '=', 1];
|
||||
//缺陷总数
|
||||
$item->tasks_b_total = Db::name('Task')->where($task_map_b)->count();
|
||||
//已完成缺陷
|
||||
$task_map_b[] = ['flow_status', '>', 2]; //已完成
|
||||
$item->tasks_b_finish = Db::name('Task')->where($task_map_b)->count();
|
||||
//未完成缺陷
|
||||
$item->tasks_b_unfinish = $item->tasks_b_total - $item->tasks_b_finish;
|
||||
if ($item->tasks_b_total > 0) {
|
||||
$item->tasks_b_pensent = round($item->tasks_b_finish / $item->tasks_b_total * 100, 2) . "%";
|
||||
} else {
|
||||
$item->tasks_b_pensent = "100%";
|
||||
}
|
||||
});
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
if (isset($param['start_time'])) {
|
||||
// 仅保留日期部分(年-月-日),忽略时间(时:分:秒)
|
||||
$param['start_time'] = strtotime(date('Y-m-d', strtotime(urldecode($param['start_time']))));
|
||||
}
|
||||
|
||||
if (isset($param['end_time'])) {
|
||||
// 仅保留日期部分(年-月-日),忽略时间(时:分:秒)
|
||||
$param['end_time'] = strtotime(date('Y-m-d', strtotime(urldecode($param['end_time']))));
|
||||
}
|
||||
|
||||
$param['step_sort'] = 0;
|
||||
$flowNameData = isset($param['flowName']) ? $param['flowName'] : '';
|
||||
$flowUidsData = isset($param['chargeIds']) ? $param['chargeIds'] : '';
|
||||
$flowIdsData = isset($param['membeIds']) ? $param['membeIds'] : '';
|
||||
// $flowDateData = isset($param['cycleDate']) ? $param['cycleDate'] : '';
|
||||
$flow = [];
|
||||
$time_1 = $param['start_time'];
|
||||
$time_2 = $param['end_time'];
|
||||
foreach ($flowNameData as $key => $value) {
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
// $flowDate = explode('到', $flowDateData[$key]);
|
||||
// $start_time = strtotime(urldecode(trim($flowDate[0])));
|
||||
// $end_time = strtotime(urldecode(trim($flowDate[1])));
|
||||
// if ($start_time < $time_1) {
|
||||
// if ($key == 0) {
|
||||
// return to_assign(1, '第' . ($key + 1) . '阶段的开始时间不能小于计划开始时间');
|
||||
// } else {
|
||||
// return to_assign(1, '第' . ($key + 1) . '阶段的开始时间不能小于第' . ($key) . '阶段的结束时间');
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// if ($end_time > $time_2) {
|
||||
// return to_assign(1, '第' . ($key + 1) . '阶段的结束时间不能大于计划结束时间');
|
||||
// break;
|
||||
// } else {
|
||||
// $time_1 = $end_time;
|
||||
// }
|
||||
$item = [];
|
||||
$item['flow_name'] = $value;
|
||||
$item['type'] = 1;
|
||||
$item['flow_uid'] = $flowUidsData[$key];
|
||||
$item['flow_ids'] = $flowIdsData[$key];
|
||||
$item['sort'] = $key;
|
||||
// $item['start_time'] = $start_time;
|
||||
// $item['end_time'] = $end_time;
|
||||
$item['create_time'] = time();
|
||||
$flow[] = $item;
|
||||
}
|
||||
//var_dump($flow);exit;
|
||||
|
||||
try {
|
||||
validate(ProjectCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$param['admin_id'] = $this->uid;
|
||||
$sid = ProjectList::strict(false)->field(true)->insertGetId($param);
|
||||
if ($sid) {
|
||||
$project_users = $this->uid;
|
||||
if (!empty($param['director_uid'])) {
|
||||
$project_users .= "," . $param['director_uid'];
|
||||
}
|
||||
if (!empty($param['team_admin_ids'])) {
|
||||
$project_users .= "," . $param['team_admin_ids'];
|
||||
}
|
||||
$project_array = explode(",", (string)$project_users);
|
||||
$project_array = array_unique($project_array);
|
||||
$project_user_array = [];
|
||||
foreach ($project_array as $k => $v) {
|
||||
if (is_numeric($v)) {
|
||||
$project_user_array[] = array(
|
||||
'uid' => $v,
|
||||
'admin_id' => $this->uid,
|
||||
'project_id' => $sid,
|
||||
'create_time' => time(),
|
||||
);
|
||||
}
|
||||
}
|
||||
Db::name('ProjectUser')->strict(false)->field(true)->insertAll($project_user_array);
|
||||
|
||||
//增加阶段
|
||||
foreach ($flow as $key => &$value) {
|
||||
$value['action_id'] = $sid;
|
||||
}
|
||||
Db::name('Step')->strict(false)->field(true)->insertAll($flow);
|
||||
|
||||
add_log('add', $sid, $param);
|
||||
$log_data = array(
|
||||
'module' => 'project',
|
||||
'project_id' => $sid,
|
||||
'new_content' => $param['name'],
|
||||
'field' => 'new',
|
||||
'action' => 'add',
|
||||
'admin_id' => $this->uid,
|
||||
'old_content' => '',
|
||||
'create_time' => time(),
|
||||
);
|
||||
Db::name('Log')->strict(false)->field(true)->insert($log_data);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
$detail = (new ProjectList())->detail($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '项目不存在');
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
$section = ['项目开始', '调研阶段', '报价阶段', '招投标阶段', '签约阶段', '研发阶段', '测试阶段', '交付阶段', '项目完结'];
|
||||
View::assign('section', $section);
|
||||
View::assign('user_info', get_login_admin());
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = (new ProjectList())->detail($id);
|
||||
|
||||
if (request()->isPost()) {
|
||||
if ($this->uid == $detail['admin_id'] || $this->uid == $detail['director_uid']) {
|
||||
try {
|
||||
validate(ProjectCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
return json(['code' => 1, 'msg' => $e->getError()]);
|
||||
}
|
||||
|
||||
// Convert start_time and end_time from date string to Unix timestamp
|
||||
if (!empty($param['start_time'])) {
|
||||
$param['start_time'] = strtotime($param['start_time']);
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$param['end_time'] = strtotime($param['end_time']);
|
||||
}
|
||||
|
||||
$param['update_time'] = time();
|
||||
$res = ProjectList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
// 新增 team_admin_ids 处理逻辑
|
||||
$project_users = $this->uid;
|
||||
if (!empty($param['director_uid'])) {
|
||||
$project_users .= "," . $param['director_uid'];
|
||||
}
|
||||
|
||||
// 如果 team_admin_ids 存在,则拆解并加入到 $project_users
|
||||
if (!empty($param['team_admin_ids'])) {
|
||||
$project_users .= "," . $param['team_admin_ids'];
|
||||
}
|
||||
|
||||
// 将 $project_users 拆解为数组,去重
|
||||
$project_array = explode(",", (string)$project_users);
|
||||
$project_array = array_unique($project_array);
|
||||
|
||||
// 获取当前已有的项目用户
|
||||
$existing_users = Db::name('ProjectUser')->where('project_id', $param['id'])->column('uid');
|
||||
$delete_users = array_diff($existing_users, $project_array); // 找出要删除的用户
|
||||
|
||||
// 删除用户,将 `delete_time` 设置为当前时间
|
||||
if (!empty($delete_users)) {
|
||||
Db::name('ProjectUser')->where('project_id', $param['id'])
|
||||
->whereIn('uid', $delete_users)
|
||||
->update(['delete_time' => time()]);
|
||||
}
|
||||
|
||||
// 插入新用户(如果之前没有的话)
|
||||
$project_user_array = [];
|
||||
foreach ($project_array as $k => $v) {
|
||||
if (is_numeric($v)) {
|
||||
$project_user_array[] = array(
|
||||
'uid' => $v,
|
||||
'admin_id' => $this->uid,
|
||||
'project_id' => $param['id'],
|
||||
'create_time' => time(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 插入或更新 ProjectUser 表
|
||||
Db::name('ProjectUser')->strict(false)->field(true)->insertAll($project_user_array);
|
||||
|
||||
// 更新阶段的处理逻辑(保持不变)
|
||||
if (isset($param['director_uid'])) {
|
||||
$project_user = [
|
||||
'uid' => $param['director_uid'],
|
||||
'admin_id' => $this->uid,
|
||||
'project_id' => $param['id'],
|
||||
'create_time' => time(),
|
||||
'delete_time' => 0,
|
||||
];
|
||||
$has = Db::name('ProjectUser')->where(['uid' => $param['director_uid'], 'project_id' => $param['id']])->find();
|
||||
if (empty($has)) {
|
||||
Db::name('ProjectUser')->strict(false)->field(true)->insert($project_user);
|
||||
} else {
|
||||
Db::name('ProjectUser')->where(['id' => $has['id']])->strict(false)->field(true)->update($project_user);
|
||||
}
|
||||
}
|
||||
|
||||
add_log('edit', $param['id'], $param, $detail);
|
||||
}
|
||||
return json(['code' => 0, 'msg' => '编辑成功']);
|
||||
} else {
|
||||
return json(['code' => 1, 'msg' => '只有创建人或者负责人才有权限编辑']);
|
||||
}
|
||||
} else {
|
||||
if (empty($detail)) {
|
||||
return json(['code' => 1, 'msg' => '项目不存在']);
|
||||
} else {
|
||||
$step_array = Db::name('Step')
|
||||
->field('s.*,a.name as check_name')
|
||||
->alias('s')
|
||||
->join('Admin a', 'a.id = s.flow_uid', 'LEFT')
|
||||
->order('s.sort asc')
|
||||
->where(['s.action_id' => $id, 's.type' => 1, 's.delete_time' => 0])
|
||||
->select()->toArray();
|
||||
foreach ($step_array as &$vv) {
|
||||
$flow_names = Db::name('Admin')->where([['id', 'in', $vv['flow_ids']]])->column('name');
|
||||
$vv['flow_names'] = implode(',', $flow_names);
|
||||
}
|
||||
|
||||
$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(['mf.topic_id' => $id, 'mf.module' => 'project'])
|
||||
->select()->toArray();
|
||||
|
||||
return json([
|
||||
'code' => 0,
|
||||
'msg' => '成功',
|
||||
'data' => [
|
||||
'detail' => $detail,
|
||||
'step_array' => $step_array,
|
||||
'file_array' => $file_array,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// public function edit()
|
||||
// {
|
||||
// $param = get_params();
|
||||
// $id = isset($param['id']) ? $param['id'] : 0;
|
||||
// $detail = (new ProjectList())->detail($id);
|
||||
// if (request()->isPost()) {
|
||||
// if ($this->uid == $detail['admin_id'] || $this->uid == $detail['director_uid']) {
|
||||
// if (isset($param['start_time'])) {
|
||||
// $param['start_time'] = strtotime(urldecode($param['start_time']));
|
||||
// if ($param['start_time'] >= $detail['end_time']) {
|
||||
// return to_assign(1, '开始时间不能大于计划结束时间');
|
||||
// }
|
||||
// }
|
||||
// if (isset($param['end_time'])) {
|
||||
// $param['end_time'] = strtotime(urldecode($param['end_time']));
|
||||
// if ($param['end_time'] <= $detail['start_time']) {
|
||||
// return to_assign(1, '计划结束时间不能小于开始时间');
|
||||
// }
|
||||
// }
|
||||
// try {
|
||||
// validate(ProjectCheck::class)->scene('edit')->check($param);
|
||||
// } catch (ValidateException $e) {
|
||||
// // 验证失败 输出错误信息
|
||||
// return to_assign(1, $e->getError());
|
||||
// }
|
||||
// $param['update_time'] = time();
|
||||
// $res = ProjectList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
// if ($res) {
|
||||
// if (isset($param['director_uid'])) {
|
||||
// $project_user = array(
|
||||
// 'uid' => $param['director_uid'],
|
||||
// 'admin_id' => $this->uid,
|
||||
// 'project_id' => $param['id'],
|
||||
// 'create_time' => time(),
|
||||
// 'delete_time' => 0,
|
||||
// );
|
||||
// $has = Db::name('ProjectUser')->where(array('uid' => $param['director_uid'], 'project_id' => $param['id']))->find();
|
||||
// if (empty($has)) {
|
||||
// Db::name('ProjectUser')->strict(false)->field(true)->insert($project_user);
|
||||
// } else {
|
||||
// Db::name('ProjectUser')->where(array('id' => $has['id']))->strict(false)->field(true)->update($project_user);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// add_log('edit', $param['id'], $param, $detail);
|
||||
// }
|
||||
// return to_assign();
|
||||
// } else {
|
||||
// return to_assign(1, '只有创建人或者负责人才有权限编辑');
|
||||
// }
|
||||
// } else {
|
||||
// if (empty($detail)) {
|
||||
// return to_assign(1, '项目不存在');
|
||||
// } else {
|
||||
// //项目阶段
|
||||
// $step_array = Db::name('Step')
|
||||
// ->field('s.*,a.name as check_name')
|
||||
// ->alias('s')
|
||||
// ->join('Admin a', 'a.id = s.flow_uid', 'LEFT')
|
||||
// ->order('s.sort asc')
|
||||
// ->where(array('s.action_id' => $id, 's.type' => 1, 's.delete_time' => 0))
|
||||
// ->select()->toArray();
|
||||
// foreach ($step_array as $kk => &$vv) {
|
||||
// $vv['start_time'] = date('Y-m-d', $vv['start_time']);
|
||||
// $vv['end_time'] = date('Y-m-d', $vv['end_time']);
|
||||
// $flow_names = Db::name('Admin')->where([['id', 'in', $vv['flow_ids']]])->column('name');
|
||||
// $vv['flow_names'] = implode(',', $flow_names);
|
||||
// }
|
||||
//
|
||||
// $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' => 'project'))
|
||||
// ->select()->toArray();
|
||||
// View::assign('file_array', $file_array);
|
||||
//
|
||||
// View::assign('step_array', $step_array);
|
||||
// View::assign('detail', $detail);
|
||||
// View::assign('id', $id);
|
||||
// return view();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//编辑项目阶段
|
||||
public function editstep()
|
||||
{
|
||||
// 获取请求参数
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
|
||||
// print_r('id是:'.$id);
|
||||
|
||||
// 获取项目详细信息
|
||||
$detail = (new ProjectList())->detail($id);
|
||||
if (!$detail) {
|
||||
$detail = [];
|
||||
}
|
||||
|
||||
$step_array = [];
|
||||
$step_array = Db::name('Step')
|
||||
->where('action_id', '=', $id)
|
||||
->where('delete_time', '=', 0)
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
// 处理查询结果
|
||||
foreach ($step_array as &$vv) {
|
||||
// 格式化时间字段
|
||||
// $vv['start_time'] = date('Y-m-d', $vv['start_time']);
|
||||
// $vv['end_time'] = date('Y-m-d', $vv['end_time']);
|
||||
|
||||
// 获取相关的人员名字
|
||||
$flow_names = Db::name('Admin')
|
||||
->whereIn('id', explode(',', $vv['flow_ids']))
|
||||
->column('name');
|
||||
$vv['flow_names'] = implode(',', $flow_names);
|
||||
|
||||
// 获取负责人名字(只有一个负责人)
|
||||
$vv['check_name'] = Db::name('Admin')
|
||||
->where('id', $vv['flow_uid']) // 只查找一个负责人
|
||||
->value('name'); // 获取负责人名称
|
||||
}
|
||||
|
||||
|
||||
View::assign('step_array', $step_array);
|
||||
View::assign('id', $id);
|
||||
View::assign('detail', $detail); // 传递 detail
|
||||
return view();
|
||||
|
||||
// return json([
|
||||
// 'code' => 1,
|
||||
// 'msg' => '获取项目阶段信息成功',
|
||||
// 'data' => [
|
||||
// 'step_array' => $step_array,
|
||||
// 'id' => $id,
|
||||
// 'detail' => $detail
|
||||
// ]
|
||||
// ]);
|
||||
}
|
||||
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = (new ProjectList())->detail($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '项目不存在');
|
||||
} else {
|
||||
$tids = Db::name('Task')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->column('id');
|
||||
$detail['schedules'] = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->count();
|
||||
$detail['hours'] = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->sum('labor_time');
|
||||
$detail['plan_hours'] = Db::name('Task')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->sum('plan_hours');
|
||||
$detail['documents'] = Db::name('Document')->where([['module', '=', 'project'], ['topic_id', '=', $detail['id']], ['delete_time', '=', 0]])->count();
|
||||
$detail['tasks'] = Db::name('Task')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->count();
|
||||
$detail['tasks_finish'] = Db::name('Task')->where([['project_id', '=', $detail['id']], ['flow_status', '>', 2], ['delete_time', '=', 0]])->count();
|
||||
$detail['tasks_unfinish'] = $detail['tasks'] - $detail['tasks_finish'];
|
||||
$detail['business_id'] = BusinessList::where('id', $detail['business_id'])->value('name');
|
||||
|
||||
$task_map = [];
|
||||
$task_map[] = ['project_id', '=', $detail['id']];
|
||||
$task_map[] = ['delete_time', '=', 0];
|
||||
|
||||
//任务
|
||||
$task_cate = Db::name('TaskCate')->where(['status' => 1])->select()->toArray();
|
||||
foreach ($task_cate as $k => $v) {
|
||||
$task_map_item = $task_map;
|
||||
$task_map_item[] = ['type', '=', $v['id']];
|
||||
$task_cate[$k]['count'] = Db::name('Task')->where($task_map_item)->count();
|
||||
$task_map_item[] = ['flow_status', '>', 2];
|
||||
$task_cate[$k]['unfinish'] = Db::name('Task')->where($task_map_item)->count();
|
||||
}
|
||||
$detail['task_cate'] = $task_cate;
|
||||
//判断是否是创建者或者负责人
|
||||
$role = 0;
|
||||
if ($detail['director_uid'] == $this->uid) {
|
||||
$role = 1; //负责人
|
||||
}
|
||||
if ($detail['admin_id'] == $this->uid) {
|
||||
$role = 2; //创建人
|
||||
}
|
||||
|
||||
$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' => 'project'))
|
||||
->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' => 'project', 'delete_time' => 0))
|
||||
->select()->toArray();
|
||||
|
||||
//项目阶段
|
||||
$step_array = Db::name('Step')
|
||||
->field('s.*,a.name as check_name')
|
||||
->alias('s')
|
||||
->join('Admin a', 'a.id = s.flow_uid', 'LEFT')
|
||||
->order('s.sort asc')
|
||||
->where(array('s.action_id' => $id, 's.type' => 1, 's.delete_time' => 0))
|
||||
->select()->toArray();
|
||||
|
||||
//阶段操作记录
|
||||
$step_record = Db::name('StepRecord')
|
||||
->field('s.*,a.name as check_name,p.flow_name')
|
||||
->alias('s')
|
||||
->join('Admin a', 'a.id = s.check_uid', 'LEFT')
|
||||
->join('Step p', 'p.id = s.step_id', 'LEFT')
|
||||
->order('s.check_time asc')
|
||||
->where(array('s.action_id' => $id, 's.type' => 1))
|
||||
->select()->toArray();
|
||||
foreach ($step_record as $kk => &$vv) {
|
||||
$vv['check_time_str'] = date('Y-m-d :H:i', $vv['check_time']);
|
||||
$vv['status_str'] = '提交';
|
||||
if ($vv['status'] == 0) {
|
||||
$vv['status_str'] = '重新设置';
|
||||
} else if ($vv['status'] == 1) {
|
||||
$vv['status_str'] = '确认完成';
|
||||
} else if ($vv['status'] == 2) {
|
||||
$vv['status_str'] = '回退';
|
||||
}
|
||||
if ($vv['status'] == 3) {
|
||||
$vv['status_str'] = '撤销';
|
||||
}
|
||||
if ($vv['content'] == '') {
|
||||
$vv['content'] = '无';
|
||||
}
|
||||
}
|
||||
|
||||
//当前项目阶段
|
||||
$step = Db::name('Step')->where(array('action_id' => $id, 'type' => 1, 'sort' => $detail['step_sort'], 'delete_time' => 0))->find();
|
||||
if (!empty($step)) {
|
||||
$step['check_name'] = Db::name('Admin')->where(['id' => $step['flow_uid']])->value('name');
|
||||
$flow_names = Db::name('Admin')->where([['id', 'in', $step['flow_ids']]])->column('name');
|
||||
$step['flow_names'] = implode(',', $flow_names);
|
||||
if ($this->uid == $step['flow_uid']) {
|
||||
$is_check_admin = 1;
|
||||
}
|
||||
}
|
||||
|
||||
View::assign('step', $step);
|
||||
View::assign('step_array', $step_array);
|
||||
View::assign('step_record', $step_record);
|
||||
|
||||
View::assign('file_array', $file_array);
|
||||
View::assign('link_array', $link_array);
|
||||
View::assign('detail', $detail);
|
||||
View::assign('role', $role);
|
||||
View::assign('id', $id);
|
||||
View::assign('login_user', $this->uid);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$id = get_params("id");
|
||||
$count_task = Db::name('Task')->where([['project_id', '=', $id], ['delete_time', '=', 0]])->count();
|
||||
if ($count_task > 0) {
|
||||
return to_assign(1, "该项目下有关联的任务,无法删除");
|
||||
}
|
||||
$detail = Db::name('Project')->where('id', $id)->find();
|
||||
if ($detail['admin_id'] != $this->uid) {
|
||||
return to_assign(1, "你不是该项目的创建人,无权限删除");
|
||||
}
|
||||
if (Db::name('Project')->where('id', $id)->update(['delete_time' => time()]) !== false) {
|
||||
$log_data = array(
|
||||
'module' => 'project',
|
||||
'field' => 'delete',
|
||||
'action' => 'delete',
|
||||
'project_id' => $detail['id'],
|
||||
'admin_id' => $this->uid,
|
||||
'old_content' => '',
|
||||
'new_content' => $detail['name'],
|
||||
'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 close()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$id = get_params("id");
|
||||
$detail = Db::name('Project')->where('id', $id)->find();
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, "项目不存在");
|
||||
}
|
||||
Db::name('Project')->where('id', $id)->update(['status' => 4]);
|
||||
return to_assign(0, "关闭成功");
|
||||
} else {
|
||||
return to_assign(1, "错误的请求方式");
|
||||
}
|
||||
}
|
||||
|
||||
//开启项目
|
||||
public function open()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$id = get_params("id");
|
||||
$detail = Db::name('Project')->where('id', $id)->find();
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, "项目不存在");
|
||||
}
|
||||
Db::name('Project')->where('id', $id)->update(['status' => 2]);
|
||||
return to_assign(0, "开启成功");
|
||||
} else {
|
||||
return to_assign(1, "错误的请求方式");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\project\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Project as ProjectList;
|
||||
use app\project\validate\ProjectCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Nav extends BaseController
|
||||
{
|
||||
public function index(){
|
||||
return view();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
// 这是系统自动生成的event定义文件
|
||||
return [
|
||||
|
||||
];
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
//验证勾股OA是否完成安装
|
||||
\app\home\middleware\Install::class,
|
||||
];
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
namespace app\project\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
class ProjectCheck extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$count = Db::name('Project')->where(['name'=>$data['name'],'delete_time'=>0])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
protected $rule = [
|
||||
'name' => 'require|checkOne',
|
||||
'code' => 'alphaNum|length:5,10',
|
||||
'id' => 'require'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '项目名称不能为空',
|
||||
'name.checkOne' => '同样的项目名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name','code'],
|
||||
'edit' => ['id']
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
namespace app\project\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
class ProjectDemoCheck extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$count = Db::name('Project')->where(['name'=>$data['name'],'delete_time'=>0])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
protected $rule = [
|
||||
// 'name' => 'require|checkOne',
|
||||
'code' => 'alphaNum|length:5,10',
|
||||
'id' => 'require'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '项目名称不能为空',
|
||||
// 'name.checkOne' => '同样的项目名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['code'],
|
||||
'edit' => ['id']
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">添加Demo</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="name" lay-verify="required" lay-reqText="请输入项目名称" placeholder="请输入项目名称"
|
||||
class="layui-input" value="" />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">网址<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="url" lay-verify="required" lay-reqText="请输入网址"
|
||||
placeholder="例如:api.meteteme.top" class="layui-input" value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">网址类型
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="url_cate" lay-verify="required" lay-reqText="请输入网址类型" placeholder="例如:API"
|
||||
class="layui-input" value="" />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">项目类型
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="cate" lay-verify="required" lay-reqText="请输入项目类型" placeholder="例如:电子商城"
|
||||
class="layui-input" value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目语言
|
||||
</td>
|
||||
<td>
|
||||
<select name="language" lay-verify="" lay-reqText="请选择项目语言" class="layui-select" lay-search=""
|
||||
lay-filter="language"></select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注
|
||||
</td>
|
||||
<td colspan="4">
|
||||
<textarea name="schedule" lay-verify="" lay-reqText="请输入" placeholder="请输入备注" class="layui-textarea"
|
||||
value=""></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pt-1">
|
||||
<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>
|
||||
layui.use(["form", "layer"], function () {
|
||||
var laydate = layui.laydate;
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
|
||||
fetch("/project/demo/getLanguage")
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
var select = document.querySelector('select[name="language"]');
|
||||
select.innerHTML = '<option value="">请选择项目语言</option>';
|
||||
data.forEach((language) => {
|
||||
var option = document.createElement("option");
|
||||
option.value = language.id;
|
||||
option.innerText = language.language;
|
||||
select.appendChild(option);
|
||||
});
|
||||
form.render("select");
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
});
|
||||
|
||||
// 监听提交事件
|
||||
form.on("submit(webform)", function (data) {
|
||||
// 发送请求并处理响应
|
||||
fetch("/project/demo/add", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(data.field),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((result) => {
|
||||
layer.msg(result.msg);
|
||||
if (result.code === 2) {
|
||||
setTimeout(function () {
|
||||
document.querySelector("form").reset(); // Reset the form
|
||||
location.reload(); // 刷新页面
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title></title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<link rel="stylesheet" href="/static/assets/gougu/css/gougu.css">
|
||||
<!-- <link rel="stylesheet" href="/static/assets/gougu/css/layout.css"> -->
|
||||
<style>
|
||||
.close {
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<h3 class="h3-title hover">
|
||||
<span id="name">DEMO详情 - {$detail.name}</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="layui-row border-b">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目名称
|
||||
</td>
|
||||
<td>
|
||||
{$detail.name}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">网址
|
||||
</td>
|
||||
<td>
|
||||
<a href="{$detail.url}" target="_blank" rel="">{$detail.url}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">网址类型
|
||||
</td>
|
||||
<td>
|
||||
{$detail.url_cate}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">项目类型
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{$detail.cate}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目语言
|
||||
</td>
|
||||
<td>
|
||||
{$detail.language}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">创建时间
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{$detail.create_time}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注
|
||||
</td>
|
||||
<td colspan="4">
|
||||
{$detail.remark}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="close">
|
||||
<button class="layui-btn layui-btn-normal" lay-event="close">关闭页面</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<script>
|
||||
const moduleInit = ["tool", "gouguEdit", "gouguComment"];
|
||||
|
||||
function gouguInit() {
|
||||
var table = layui.table;
|
||||
var tool = layui.tool;
|
||||
var dropdown = layui.dropdown;
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
|
||||
$('[lay-event="close"]').on('click', function () {
|
||||
// 直接使用layer.close方法关闭最顶层的弹出层
|
||||
var index = parent.layer.getFrameIndex(window.name); // 获取iframe层的索引
|
||||
parent.layer.close(index); // 关闭弹出层
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
<script src="/static/assets/layui/layui.js"></script>
|
||||
<script src="/static/assets/gougu/gouguInit.js"></script>
|
||||
@@ -0,0 +1,219 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a><cite>Demo管理</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
{block name="body"}
|
||||
<div class="table-content p-3">
|
||||
<div class="layui-form-bar border-t border-x">
|
||||
<button class="layui-btn layui-btn-sm " id="add-demo">+ 添加Demo</button>
|
||||
<button class="layui-btn layui-btn-sm" id="refresh-btn">刷新</button>
|
||||
<button class="layui-btn layui-btn-sm" id="batch_delete">批量删除</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="demoList" lay-filter="demoList"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool', 'gouguEdit', 'gouguComment', 'gouguSchedule', 'employeepicker', 'editormd'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
var $ = layui.jquery;
|
||||
|
||||
// 刷新按钮
|
||||
$("#refresh-btn").on("click", function () {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
//新增计划按钮
|
||||
$("#add-demo").on("click", function () {
|
||||
tool.open("/project/demo/add");
|
||||
});
|
||||
|
||||
|
||||
// 合并删除和编辑操作的监听函数
|
||||
table.on('tool(demoList)', function (obj) {
|
||||
var data = obj.data; // 获取当前行的数据
|
||||
var id = data.id; // 获取当前行数据的id
|
||||
|
||||
if (obj.event === 'view') {
|
||||
// 查看详情
|
||||
layui.layer.open({
|
||||
type: 2, // iframe层
|
||||
title: 'DEMO详情',
|
||||
shadeClose: true,
|
||||
shade: 0.8,
|
||||
area: ['70%', '90%'], // 宽高
|
||||
content: '/project/demo/view/id/' + id,
|
||||
});
|
||||
} else if (obj.event === 'edit') {
|
||||
// 编辑
|
||||
layui.layer.open({
|
||||
type: 2, // iframe层
|
||||
title: '编辑DEMO',
|
||||
shadeClose: true,
|
||||
shade: 0.8,
|
||||
area: ['70%', '90%'], // 宽高
|
||||
content: '/project/demo/edit/id/' + id,
|
||||
});
|
||||
} else if (obj.event === 'delete') {
|
||||
// 删除
|
||||
layui.layer.confirm(
|
||||
"确定删除该内容吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
$.post(
|
||||
"/project/demo/delete",
|
||||
{ id: data.id },
|
||||
function (res) {
|
||||
if (res.code === 0) {
|
||||
layui.layer.msg(res.msg);
|
||||
obj.del(); // 删除表格中的对应行数据
|
||||
} else {
|
||||
layui.layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
layui.layer.close(index);
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
//批量删除数据
|
||||
$("#batch_delete").on("click", function () {
|
||||
var checkStatus = table.checkStatus('demoList');
|
||||
var data = checkStatus.data;
|
||||
var ids = data.map(item => item.id);
|
||||
|
||||
if (ids.length === 0) {
|
||||
layui.layer.msg("请选择要删除的数据");
|
||||
return;
|
||||
}
|
||||
|
||||
layui.layer.confirm(
|
||||
"确定删除选中的内容吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
$.post(
|
||||
"/project/demo/batch_delete",
|
||||
{ ids: ids },
|
||||
function (res) {
|
||||
if (res.code === 0) {
|
||||
layui.layer.msg("批量删除成功");
|
||||
location.reload(); // 重新加载表格数据
|
||||
} else {
|
||||
layui.layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
layui.layer.close(index);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
//渲染表格
|
||||
layui.pageTable = table.render({
|
||||
elem: '#demoList',
|
||||
title: 'Demo列表',
|
||||
cellMinWidth: 80,
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
height: 'full-130',
|
||||
url: "/project/demo/index", //数据接口
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: 'Demo列表',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{ type: 'checkbox', fixed: 'left' },
|
||||
{
|
||||
field: 'name', title: '项目名称', align: 'center', width: 250, sort: true, rowspan: 2, templet: function (d) {
|
||||
var html = '<span>' + d.name + '</span>';
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: 'url', title: '网址(点击复制)', align: 'center', width: 350, rowspan: 2, sort: true, templet: function (d) {
|
||||
var html = '<span style="cursor: pointer; color: #01AAED;" onclick="copyToClipboard(\'' + d.url + '\')">' + d.url + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {
|
||||
field: 'url_cate', title: '网址类型', align: 'center', width: 120, sort: true, rowspan: 2, templet: function (d) {
|
||||
var html = '<span>' + d.url_cate + '</span>';
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: 'cate', title: '项目类型', align: 'center', width: 120, sort: true, rowspan: 2, templet: function (d) {
|
||||
var html = '<span>' + d.cate + '</span>';
|
||||
return html;
|
||||
}
|
||||
}, {
|
||||
field: "language",
|
||||
title: "项目语言",
|
||||
align: "center",
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
if (d.language) {
|
||||
var html = '<span class="a1-' + d.language + '">' + d.language + "</span>";
|
||||
return html;
|
||||
} else {
|
||||
return "未填写";
|
||||
}
|
||||
}
|
||||
}, {
|
||||
field: "remark",
|
||||
title: "备注",
|
||||
align: "center",
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
if (d.remark) {
|
||||
var html = '<span class="a1-' + d.remark + '">' + d.remark + "</span>";
|
||||
return html;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
},
|
||||
}, {
|
||||
fixed: 'right',
|
||||
title: "操作",
|
||||
align: "center",
|
||||
width: 220,
|
||||
minWidth: 220,
|
||||
toolbar: "#barDemo",
|
||||
},
|
||||
|
||||
]]
|
||||
});
|
||||
|
||||
$('.layui-form-bar').on('click', '.add-project', function () {
|
||||
tool.open('/project/index/add');
|
||||
});
|
||||
}
|
||||
|
||||
// 添加复制到剪切板的函数
|
||||
function copyToClipboard(text) {
|
||||
navigator.clipboard.writeText(text).then(function () {
|
||||
// 复制成功后,使用Layui的layer.msg显示提示
|
||||
layer.msg('复制成功', { icon: 1, time: 1000 });
|
||||
}, function (err) {
|
||||
// 复制失败处理
|
||||
layer.msg('复制失败', { icon: 2 });
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-xs" lay-event="view">查看详情</a>
|
||||
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delete">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title></title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<link rel="stylesheet" href="/static/assets/gougu/css/gougu.css">
|
||||
<!-- <link rel="stylesheet" href="/static/assets/gougu/css/layout.css"> -->
|
||||
<style>
|
||||
.close {
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<h3 class="h3-title hover">
|
||||
<span id="name">DEMO详情 - {$detail.name}</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="layui-row border-b">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目名称
|
||||
</td>
|
||||
<td>
|
||||
{$detail.name}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">网址
|
||||
</td>
|
||||
<td>
|
||||
<a href="{$detail.url}" target="_blank" rel="">{$detail.url}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">网址类型
|
||||
</td>
|
||||
<td>
|
||||
{$detail.url_cate}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">项目类型
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{$detail.cate}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">项目语言
|
||||
</td>
|
||||
<td>
|
||||
{$detail.language}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">创建时间
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{$detail.create_time}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注
|
||||
</td>
|
||||
<td colspan="4">
|
||||
{$detail.remark}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="close">
|
||||
<button class="layui-btn layui-btn-normal" lay-event="close">关闭页面</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<script>
|
||||
const moduleInit = ["tool", "gouguEdit", "gouguComment"];
|
||||
|
||||
function gouguInit() {
|
||||
var table = layui.table;
|
||||
var tool = layui.tool;
|
||||
var dropdown = layui.dropdown;
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
|
||||
$('[lay-event="close"]').on('click', function () {
|
||||
// 直接使用layer.close方法关闭最顶层的弹出层
|
||||
var index = parent.layer.getFrameIndex(window.name); // 获取iframe层的索引
|
||||
parent.layer.close(index); // 关闭弹出层
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
<script src="/static/assets/layui/layui.js"></script>
|
||||
<script src="/static/assets/gougu/gouguInit.js"></script>
|
||||
@@ -0,0 +1,307 @@
|
||||
<style>
|
||||
.layui-form-item.layui-form-pane{margin-bottom:8px;}
|
||||
.layui-form-pane .layui-form-label {width:60px; padding:8px;}
|
||||
.layui-form-pane .layui-form-label.label-index,.layui-form-pane .layui-form-label.label-first {width:80px;}
|
||||
.layui-form-item .layui-input-inline {margin-right:4px;}
|
||||
.layui-form-item .layui-inline {margin-right:0; margin-bottom:0;}
|
||||
</style>
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">新建项目</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name" lay-verify="required" lay-reqText="请输入项目名称" placeholder="请输入项目名称" class="layui-input" value="">
|
||||
</td>
|
||||
<td class="layui-td-gray">项目简称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name_short" lay-verify="required" lay-reqText="请输入项目简称" placeholder="请输入项目简称" class="layui-input" value="">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">计划完成周期</td>
|
||||
<td id="date">
|
||||
<div class="layui-input-inline" style="width:100px;">
|
||||
<input type="text" id="start_time" name="start_time" readonly lay-reqText="请选择开始时间" placeholder="请选择" class="layui-input" value="">
|
||||
</div>
|
||||
-
|
||||
<div class="layui-input-inline" style="width:100px;">
|
||||
<input type="text" id="end_time" name="end_time" readonly lay-reqText="请选择结束时间" placeholder="请选择" class="layui-input" value="">
|
||||
</div>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">负责人<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="director_name" placeholder="请选择项目负责人" readonly class="layui-input picker-one" value="{$user_info.name}">
|
||||
<input type="hidden" name="director_uid" lay-verify="required" readonly lay-reqText="请选择项目负责人" value="{$user_info.id}">
|
||||
</td>
|
||||
<td class="layui-td-gray">项目成员<span style="color: red">*</span></td>
|
||||
<td>
|
||||
<input type="text" id="team_admin_names" name="team_admin_names" placeholder="请选择项目成员" readonly class="layui-input picker-more" value="{$user_info.name}">
|
||||
<input type="hidden" id="team_admin_ids" name="team_admin_ids" class="layui-input" value="{$user_info.id}">
|
||||
</td>
|
||||
<td class="layui-td-gray">项目类型<font>*</font></td>
|
||||
<td>
|
||||
<!-- <select name="product_id" lay-verify="required" lay-reqText="请选择关联产品">-->
|
||||
<select name="project_type" lay-verify="" lay-reqText="是否是内部项目">
|
||||
<option value="">请选择项目类型</option>
|
||||
<option value="1">申报项目</option>
|
||||
<option value="2">维护保障项目</option>
|
||||
<option value="3">开发项目【外部】</option>
|
||||
<option value="4">开发项目【内部】</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">关联产品</td>
|
||||
<td>
|
||||
<!-- <select name="product_id" lay-verify="required" lay-reqText="请选择关联产品">-->
|
||||
<select name="product_id" lay-verify="" lay-reqText="请选择关联产品">
|
||||
<option value="">请选择关联产品</option>
|
||||
{volist name=":get_product()" id="v"}
|
||||
<option value="{$v.id}">{$v.name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">关联客户</td>
|
||||
<td>
|
||||
<select name="business_id" id="business_id" lay-verify="" lay-reqText="请选择客户">
|
||||
<option value="">请选择客户</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目简介<span style="color: red">*</span></td>
|
||||
<td colspan="5">
|
||||
<textarea name="content" class="layui-textarea" lay-verify="required" lay-reqText="请完善项目简介"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" class="layui-td-gray" style="text-align:left; font-weight:600">项目阶段<font>*</font></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<div id="flowList">
|
||||
{volist name = "$section" id="vo" key="k"}
|
||||
{eq name="key" value="0"}
|
||||
<div class="layui-form-item layui-form-pane">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label label-first">第{$key+1}阶段</label>
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<select name="flowName[]" lay-filter="flowName" lay-reqText="请选择阶段名称">
|
||||
<option value="">请选择</option>
|
||||
{volist name = "section" id="voo" key="kk"}
|
||||
<option value="{$voo}" {eq name="$kk" value ="$k"} selected{/eq}>{$voo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">负责人</label>
|
||||
<div class="layui-input-inline" style="width:120px;">
|
||||
<input type="text" name="chargeNames[]" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-reqText="请选择阶段负责人" value="{$user_info.name}">
|
||||
<input type="hidden" name="chargeIds[]" value="{$user_info.id}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">成员</label>
|
||||
<div class="layui-input-inline" style="width:168px;">
|
||||
<input type="text" name="membeNames[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-reqText="请选择阶段成员">
|
||||
<input type="hidden" name="membeIds[]" value="{$user_info.id}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="layui-form-item layui-form-pane">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label label-index">第{$key+1}阶段</label>
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<select name="flowName[]" lay-filter="flowName" lay-reqText="请选择阶段名称">
|
||||
<option value="">请选择</option>
|
||||
{volist name = "section" id="voo" key="kk"}
|
||||
<option value="{$voo}" {eq name="$kk" value ="$k"} selected{/eq}>{$voo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">负责人</label>
|
||||
<div class="layui-input-inline" style="width:120px;">
|
||||
<input type="text" name="chargeNames[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-reqText="请选择阶段负责人">
|
||||
<input type="hidden" name="chargeIds[]" value="{$user_info.id}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">成员</label>
|
||||
<div class="layui-input-inline" style="width:168px;">
|
||||
<input type="text" name="membeNames[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-reqText="请选择阶段成员">
|
||||
<input type="hidden" name="membeIds[]" value="{$user_info.id}">
|
||||
</div>
|
||||
</div>
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>
|
||||
</div>
|
||||
{/eq}
|
||||
{/volist}
|
||||
</div>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-normal add-flow" data-type="0">+ 添加固定阶段</span><span class="layui-btn layui-btn-xs add-flow" data-type="1">+ 添加自定义阶段</span>
|
||||
<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
|
||||
<p><strong>温馨提示</strong></p>
|
||||
<p>1、项目开始流转前,请确保已完善好各项目信息。</p>
|
||||
<p>2、项目开始流转后,只有项目管理员,创建人和负责人可修改项目信息。</p>
|
||||
<p>3、项目管理员,创建人和负责人可以修改项目阶段的信息,但是修改完成后已流转的项目阶段需要重新走一遍流程。</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<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() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
laydate = layui.laydate,
|
||||
employeepicker = layui.employeepicker;
|
||||
|
||||
form.render();
|
||||
|
||||
function fetchCustomers() {
|
||||
tool.get('/business/index/getlistsmore', {}, function(response) {
|
||||
if (response.code == 1) {
|
||||
var customers = response.data;
|
||||
var customerSelect = document.getElementById('business_id');
|
||||
customers.forEach(function(customer) {
|
||||
var option = document.createElement('option');
|
||||
option.value = customer.id;
|
||||
option.text = customer.name;
|
||||
customerSelect.appendChild(option);
|
||||
});
|
||||
form.render('select');
|
||||
} else {
|
||||
layer.msg('获取客户数据失败');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fetchCustomers();
|
||||
|
||||
form.render();
|
||||
|
||||
|
||||
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#date',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
|
||||
//日期
|
||||
lay('.select-time-range').each(function () {
|
||||
laydate.render({
|
||||
elem: this,
|
||||
range: '到',
|
||||
trigger: 'click'
|
||||
});
|
||||
});
|
||||
|
||||
$('.add-flow').on('click',function(){
|
||||
let len = $('#flowList').find('.layui-form-item').length;
|
||||
let index = len+1;
|
||||
let type = $(this).data('type');;
|
||||
let tem=['<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第'+index+'阶段</label>\
|
||||
<div class="layui-input-inline" style="width:150px;">\
|
||||
<select name="flowName[]" lay-filter="flowName" lay-verify="required" lay-reqText="请选择阶段名称">\
|
||||
<option value="">请选择</option>\
|
||||
<option value="调研阶段">调研阶段</option>\
|
||||
<option value="报价阶段">报价阶段</option>\
|
||||
<option value="招投标阶段">招投标阶段</option>\
|
||||
<option value="签约阶段">签约阶段</option>\
|
||||
<option value="研发阶段">研发阶段</option>\
|
||||
<option value="测试阶段">测试阶段</option>\
|
||||
<option value="交付阶段">交付阶段</option>\
|
||||
<option value="项目完结">项目完结</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">负责人</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="chargeName[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-verify="required" lay-reqText="请选择阶段负责人">\
|
||||
<input type="hidden" name="chargeIds[]" value="{$user_info.id}">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">成员</label>\
|
||||
<div class="layui-input-inline" style="width:168px;">\
|
||||
<input type="text" name="membeNames[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-verify="required" lay-reqText="请选择阶段成员">\
|
||||
<input type="hidden" name="membeIds[]" value="{$user_info.id}">\
|
||||
</div>\
|
||||
</div>\
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
|
||||
</div>',
|
||||
'<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第'+index+'阶段</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="flowName[]" autocomplete="off" placeholder="输入阶段名称" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">负责人</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="chargeNames[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-verify="required" lay-reqText="请选择阶段负责人">\
|
||||
<input type="hidden" name="chargeIds[]" value="{$user_info.id}">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">成员</label>\
|
||||
<div class="layui-input-inline" style="width:168px;">\
|
||||
<input type="text" name="membeNames[]" value="{$user_info.name}" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-verify="required" lay-reqText="请选择阶段成员">\
|
||||
<input type="hidden" name="membeIds[]" value="{$user_info.id}">\
|
||||
</div>\
|
||||
</div>\
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
|
||||
</div>'
|
||||
];
|
||||
$('#flowList').append(tem[type]);
|
||||
form.render();
|
||||
//日期
|
||||
lay('.select-time-range').each(function () {
|
||||
laydate.render({
|
||||
elem: this,
|
||||
range: '到',
|
||||
trigger: 'click'
|
||||
});
|
||||
});
|
||||
});
|
||||
$('#flowList').on('click','.layui-btn-danger',function(){
|
||||
$(this).parents('.layui-form-item').remove();
|
||||
var items = $('.label-index').length;
|
||||
if(items>0){
|
||||
$('.label-index').each(function(index,item){
|
||||
$(this).html('第'+(index+2)+'阶段');
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/project/index/add",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,197 @@
|
||||
<style>
|
||||
.layui-form-item.layui-form-pane{margin-bottom:8px;}
|
||||
.layui-form-pane .layui-form-label {width:60px; padding:8px;}
|
||||
.layui-form-pane .layui-form-label.label-index,.layui-form-pane .layui-form-label.label-first {width:80px;}
|
||||
.layui-form-item .layui-input-inline {margin-right:4px;}
|
||||
.layui-form-item .layui-inline {margin-right:0; margin-bottom:0;}
|
||||
</style>
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="pb-3">编辑项目阶段</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目名称<font>*</font></td>
|
||||
<td>{$detail.name}</td>
|
||||
<td class="layui-td-gray-2">计划完成周期</td>
|
||||
<td>{$detail.start_time|date='Y-m-d'} - {$detail.end_time|date='Y-m-d'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">负责人</td>
|
||||
<td>{$detail.director_name}</td>
|
||||
<td class="layui-td-gray">项目成员</td>
|
||||
<td colspan="3">{$detail.team_admin_names}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目简介</td>
|
||||
<td colspan="3">{$detail.content}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8" class="layui-td-gray" style="text-align:left; font-weight:600">项目阶段</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
<div id="flowList">
|
||||
{volist name="$step_array" id="vo"}
|
||||
<div class="layui-form-item layui-form-pane">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label {$key==0?'label-first':'label-index'}">第{$key+1}阶段</label>
|
||||
<div class="layui-input-inline" style="width:120px;">
|
||||
<input type="text" name="flowName[]" autocomplete="off" value="{$vo.flow_name}" placeholder="输入阶段名称" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">负责人</label>
|
||||
<div class="layui-input-inline" style="width:120px;">
|
||||
<input type="text" name="chargeNames[]" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-verify="required" lay-reqText="请选择阶段负责人" value="{$vo.check_name}">
|
||||
<input type="hidden" name="chargeIds[]" value="{$vo.flow_uid}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">成员</label>
|
||||
<div class="layui-input-inline" style="width:168px;">
|
||||
<input type="text" name="membeNames[]" value="{$vo.flow_names}" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-verify="required" lay-reqText="请选择阶段成员">
|
||||
<input type="hidden" name="membeIds[]" value="{$vo.flow_ids}">
|
||||
</div>
|
||||
</div>
|
||||
{$key==0?'':'<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>'}
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-normal add-flow" data-type="0">+ 添加固定阶段</span><span class="layui-btn layui-btn-xs add-flow" data-type="1">+ 添加自定义阶段</span>
|
||||
<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
|
||||
<p><strong>温馨提示</strong></p>
|
||||
<p>1、项目开始流转前,请确保已完善好各项目信息。</p>
|
||||
<p>2、项目开始流转后,只有项目负责人可修改项目信息。</p>
|
||||
<p>3、项目负责人可以修改项目阶段的信息,但是修改完成后已流转的项目阶段需要重新走一遍流程。</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$detail.id}" />
|
||||
<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() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
laydate = layui.laydate,
|
||||
employeepicker = layui.employeepicker;
|
||||
|
||||
form.render();
|
||||
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#date',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
|
||||
//日期
|
||||
lay('.select-time-range').each(function () {
|
||||
laydate.render({
|
||||
elem: this,
|
||||
range: '到',
|
||||
trigger: 'click'
|
||||
});
|
||||
});
|
||||
|
||||
$('.add-flow').on('click',function(){
|
||||
let len = $('#flowList').find('.layui-form-item').length;
|
||||
let index = len+1;
|
||||
let type = $(this).data('type');;
|
||||
let tem=['<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第'+index+'阶段</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<select name="flowName[]" lay-filter="flowName" lay-verify="required" lay-reqText="请选择阶段名称">\
|
||||
<option value="">请选择</option>\
|
||||
<option value="调研阶段">调研阶段</option>\
|
||||
<option value="报价阶段">报价阶段</option>\
|
||||
<option value="招投标阶段">招投标阶段</option>\
|
||||
<option value="签约阶段">签约阶段</option>\
|
||||
<option value="研发阶段">研发阶段</option>\
|
||||
<option value="测试阶段">测试阶段</option>\
|
||||
<option value="交付阶段">交付阶段</option>\
|
||||
<option value="项目完结">项目完结</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">负责人</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="chargeName[]" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-verify="required" lay-reqText="请选择阶段负责人">\
|
||||
<input type="hidden" name="chargeIds[]">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">成员</label>\
|
||||
<div class="layui-input-inline" style="width:168px;">\
|
||||
<input type="text" name="membeNames[]" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-verify="required" lay-reqText="请选择阶段成员">\
|
||||
<input type="hidden" name="membeIds[]">\
|
||||
</div>\
|
||||
</div>\
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
|
||||
</div>',
|
||||
'<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第'+index+'阶段</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="flowName[]" autocomplete="off" placeholder="输入阶段名称" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">负责人</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="chargeNames[]" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-verify="required" lay-reqText="请选择阶段负责人">\
|
||||
<input type="hidden" name="chargeIds[]">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">成员</label>\
|
||||
<div class="layui-input-inline" style="width:168px;">\
|
||||
<input type="text" name="membeNames[]" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-verify="required" lay-reqText="请选择阶段成员">\
|
||||
<input type="hidden" name="membeIds[]">\
|
||||
</div>\
|
||||
</div>\
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
|
||||
</div>'
|
||||
];
|
||||
$('#flowList').append(tem[type]);
|
||||
form.render();
|
||||
//日期
|
||||
lay('.select-time-range').each(function () {
|
||||
laydate.render({
|
||||
elem: this,
|
||||
range: '到',
|
||||
trigger: 'click'
|
||||
});
|
||||
});
|
||||
});
|
||||
$('#flowList').on('click','.layui-btn-danger',function(){
|
||||
$(this).parents('.layui-form-item').remove();
|
||||
var items = $('.label-index').length;
|
||||
if(items>0){
|
||||
$('.label-index').each(function(index,item){
|
||||
$(this).html('第'+(index+2)+'阶段');
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},2000);
|
||||
}
|
||||
}
|
||||
tool.post("/api/project/reset_check",data.field,callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,222 @@
|
||||
<style>
|
||||
.layui-form-item.layui-form-pane {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.layui-form-pane .layui-form-label {
|
||||
width: 60px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.layui-form-pane .layui-form-label.label-index, .layui-form-pane .layui-form-label.label-first {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.layui-form-item .layui-input-inline {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.layui-form-item .layui-inline {
|
||||
margin-right: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="pb-3">编辑项目阶段</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目名称<font>*</font></td>
|
||||
<td>{$detail.name|default='未定义'}</td>
|
||||
<td class="layui-td-gray-2">计划完成周期</td>
|
||||
<td>{$detail.start_time|date='Y-m-d'} - {$detail.end_time|date='Y-m-d'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">负责人</td>
|
||||
<td>{$detail.director_name}</td>
|
||||
<td class="layui-td-gray">项目成员</td>
|
||||
<td colspan="3">{$detail.team_admin_names}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目简介</td>
|
||||
<td colspan="3">{$detail.content|default='暂无简介'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8" class="layui-td-gray" style="text-align:left; font-weight:600">项目阶段</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
<div id="flowList">
|
||||
{volist name="step_array" id="vo"}
|
||||
<div class="layui-form-item layui-form-pane">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label {$key==0?'label-first':'label-index'}">第{$key+1}阶段</label>
|
||||
<div class="layui-input-inline" style="width:120px;">
|
||||
<input type="text" name="flowName[]" autocomplete="off" value="{$vo.flow_name}"
|
||||
placeholder="输入阶段名称" class="layui-input" lay-verify="required"
|
||||
lay-reqText="请输入阶段名称">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">负责人</label>
|
||||
<div class="layui-input-inline" style="width:120px;">
|
||||
<input type="text" name="chargeNames[]" autocomplete="off" readonly
|
||||
placeholder="选择阶段负责人" class="layui-input picker-one" lay-verify="required"
|
||||
lay-reqText="请选择阶段负责人" value="{$vo.check_name}">
|
||||
<input type="hidden" name="chargeIds[]" value="{$vo.flow_uid}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">成员</label>
|
||||
<div class="layui-input-inline" style="width:168px;">
|
||||
<input type="text" name="membeNames[]" value="{$vo.flow_names}" autocomplete="off"
|
||||
readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more"
|
||||
lay-verify="required" lay-reqText="请选择阶段成员">
|
||||
<input type="hidden" name="membeIds[]" value="{$vo.flow_ids}">
|
||||
</div>
|
||||
</div>
|
||||
{$key==0?'':'<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>'}
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-normal add-flow" data-type="0">+ 添加固定阶段</span><span
|
||||
class="layui-btn layui-btn-xs add-flow" data-type="1">+ 添加自定义阶段</span>
|
||||
<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
|
||||
<p><strong>温馨提示</strong></p>
|
||||
<p>1、项目开始流转前,请确保已完善好各项目信息。</p>
|
||||
<p>2、项目开始流转后,只有项目负责人可修改项目信息。</p>
|
||||
<p>3、项目负责人可以修改项目阶段的信息,但是修改完成后已流转的项目阶段需要重新走一遍流程。</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="padding: 10px 0">
|
||||
<input type="hidden" name="id" value="{$detail.id}"/>
|
||||
<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() {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool,
|
||||
laydate = layui.laydate,
|
||||
employeepicker = layui.employeepicker;
|
||||
|
||||
form.render();
|
||||
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#date',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
|
||||
//日期
|
||||
lay('.select-time-range').each(function () {
|
||||
laydate.render({
|
||||
elem: this,
|
||||
range: '到',
|
||||
trigger: 'click'
|
||||
});
|
||||
});
|
||||
|
||||
$('.add-flow').on('click', function () {
|
||||
let len = $('#flowList').find('.layui-form-item').length;
|
||||
let index = len + 1;
|
||||
let type = $(this).data('type');
|
||||
;
|
||||
let tem = ['<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第' + index + '阶段</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<select name="flowName[]" lay-filter="flowName" lay-verify="required" lay-reqText="请选择阶段名称">\
|
||||
<option value="">请选择</option>\
|
||||
<option value="调研阶段">调研阶段</option>\
|
||||
<option value="报价阶段">报价阶段</option>\
|
||||
<option value="招投标阶段">招投标阶段</option>\
|
||||
<option value="签约阶段">签约阶段</option>\
|
||||
<option value="研发阶段">研发阶段</option>\
|
||||
<option value="测试阶段">测试阶段</option>\
|
||||
<option value="交付阶段">交付阶段</option>\
|
||||
<option value="项目完结">项目完结</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">负责人</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="chargeName[]" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-reqText="请选择阶段负责人" value="{$vo.check_name}">\
|
||||
<input type="hidden" name="chargeIds[]" value="{$vo.flow_uid}">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">成员</label>\
|
||||
<div class="layui-input-inline" style="width:168px;">\
|
||||
<input type="text" name="membeNames[]" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-reqText="请选择阶段成员" value="{$vo.flow_names}">\
|
||||
<input type="hidden" name="membeIds[]" value="{$vo.flow_ids}">\
|
||||
</div>\
|
||||
</div>\
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
|
||||
</div>',
|
||||
'<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第' + index + '阶段</label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="flowName[]" autocomplete="off" placeholder="输入阶段名称" class="layui-input" lay-reqText="请输入阶段名称">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">负责人 </label>\
|
||||
<div class="layui-input-inline" style="width:120px;">\
|
||||
<input type="text" name="chargeNames[]" autocomplete="off" readonly placeholder="选择阶段负责人" class="layui-input picker-one" lay-reqText="请选择阶段负责人">\
|
||||
<input type="hidden" name="chargeIds[]">\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label">成员</label>\
|
||||
<div class="layui-input-inline" style="width:168px;">\
|
||||
<input type="text" name="membeNames[]" autocomplete="off" readonly placeholder="选择阶段成员,可多选" class="layui-input picker-more" lay-reqText="请选择阶段成员">\
|
||||
<input type="hidden" name="membeIds[]">\
|
||||
</div>\
|
||||
</div>\
|
||||
<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
|
||||
</div>'
|
||||
];
|
||||
$('#flowList').append(tem[type]);
|
||||
form.render();
|
||||
//日期
|
||||
lay('.select-time-range').each(function () {
|
||||
laydate.render({
|
||||
elem: this,
|
||||
range: '到',
|
||||
trigger: 'click'
|
||||
});
|
||||
});
|
||||
});
|
||||
$('#flowList').on('click', '.layui-btn-danger', function () {
|
||||
$(this).parents('.layui-form-item').remove();
|
||||
var items = $('.label-index').length;
|
||||
if (items > 0) {
|
||||
$('.label-index').each(function (index, item) {
|
||||
$(this).html('第' + (index + 2) + '阶段');
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
location.reload();
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
tool.post("/api/project/reset_check", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,93 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{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 class="table-content p-3">
|
||||
<div class="layui-form-bar border-t border-x">
|
||||
<button class="layui-btn layui-btn-sm add-project">+ 新建项目</button>
|
||||
</div>
|
||||
<table class="layui-hide" id="projectList" lay-filter="project"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool', 'gouguEdit', 'gouguComment', 'gouguSchedule', 'employeepicker', 'editormd'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
layui.pageTable = table.render({
|
||||
elem: '#projectList',
|
||||
title: '项目列表',
|
||||
cellMinWidth: 80,
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
height: 'full-130',
|
||||
url: "/project/index/index", //数据接口
|
||||
cols: [[
|
||||
{
|
||||
field: 'id', title: '项目编号', width: 100, align: 'center', fixed: 'left', rowspan: 2, templet: function (d) {
|
||||
return 'M' + d.id;
|
||||
}
|
||||
}
|
||||
, {
|
||||
field: 'status', title: '状态', align: 'center', width: 100, rowspan: 2, templet: function (d) {
|
||||
var html = '<span class="layui-btn layui-btn-xs bg-status-' + d.status + '">' + d.status_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {
|
||||
field: 'project_type', title: '项目类型', align: 'center', width: 140, rowspan: 2, templet: function (d) {
|
||||
var typeText = '';
|
||||
if (d.project_type == 1) {
|
||||
typeText = '申报项目';
|
||||
} else if (d.project_type == 2) {
|
||||
typeText = '维护保障项目';
|
||||
} else if (d.project_type == 3) {
|
||||
typeText = '开发项目【外部】';
|
||||
} else if (d.project_type == 4) {
|
||||
typeText = '开发项目【内部】';
|
||||
}
|
||||
var html = '<span class="layui-btn-xs ">' + typeText + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {
|
||||
field: 'business_id', title: '客户单位', align: 'center', width: 140, rowspan: 2, templet: function (d) {
|
||||
var html = '<span>' + d.business_id + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {
|
||||
field: 'name', title: '项目名称', rowspan: 2, templet: function (d) {
|
||||
var html = '<a class="link-a" data-href="/project/index/view/id/' + d.id + '">' + d.name + '</a>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, { field: 'director_name', title: '负责人', align: 'center', width: 80, rowspan: 2 }
|
||||
, { field: 'plan_time', title: '项目周期', align: 'center', width: 240, rowspan: 2 }
|
||||
, { align: 'center', title: '关联任务', colspan: 3 }
|
||||
, { align: 'center', title: 'BUG缺陷', colspan: 3 }
|
||||
], [
|
||||
{ field: 'tasks_a_unfinish', align: 'center', style: 'color: #91CC75;', width: 80, 'title': '进行中' }
|
||||
, { field: 'tasks_a_finish', align: 'center', style: 'color: #FAC858;', width: 80, 'title': '已完成' }
|
||||
, { field: 'tasks_a_pensent', align: 'center', style: 'color: #EE6666;', width: 80, 'title': '完成率' }
|
||||
, { field: 'tasks_b_unfinish', align: 'center', style: 'color: #91CC75;', width: 80, 'title': '进行中' }
|
||||
, { field: 'tasks_b_finish', align: 'center', style: 'color: #FAC858;', width: 80, 'title': '已完成' }
|
||||
, { field: 'tasks_b_pensent', align: 'center', style: 'color: #EE6666;', width: 80, 'title': '修复率' }
|
||||
]]
|
||||
});
|
||||
|
||||
$('.layui-form-bar').on('click', '.add-project', function () {
|
||||
tool.open('/project/index/add');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,21 @@
|
||||
<div class="sub-menu" style="width: 200px;">
|
||||
<div id="subMenu" class="sub-menu-content" style="width: 200px;">
|
||||
<ul>
|
||||
<li class="sub-menu-title active"><a href="/project/index/view?id={$id}"><i class="far fa-eye"></i><span class="text">项目概览</span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=task"><a href="javascript:;"><i class="fas fa-tasks"></i><span class="text">项目任务<cite>({$detail.tasks})</cite></span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=document"><a href="javascript:;"><i class="fas fa-book"></i><span class="text">项目文档<cite>({$detail.documents})</cite></span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=schedule"><a href="javascript:;"><i class="fas fa-clipboard-list"></i><span class="text">工作记录<cite>({$detail.schedules})</cite></span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=comment"><a href="javascript:;"><i class="fas fa-comment-alt"></i><span class="text">项目评论<cite>({$detail.comments})</cite></span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=user"><a href="javascript:;"><i class="fas fa-users"></i><span class="text">项目人员<cite>({$detail.users})</cite></span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=log"><a href="javascript:;"><i class="fas fa-project-diagram"></i><span class="text">项目动态</span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=robot"><a href="javascript:;"><i class="fas fa-robot"></i><span class="text">钉钉机器人</span></a></li>
|
||||
<li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=attachment"><a href="javascript:;"><i class="fas fa-paperclip"></i><span class="text">附件管理</span></a></li>
|
||||
<!-- <li class="sub-menu-title" data-event="subpage" data-page="/api/project/view/id/{$id}?page=log"><a href="javascript:;"><i class="bi bi-balloon"></i><span class="text">沟通进度</span></a></li>-->
|
||||
</ul>
|
||||
</div>
|
||||
<div class="menu-bar">
|
||||
<div class="menu-bar-content">
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,182 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{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 class="table-content p-3">
|
||||
<div class="container">
|
||||
<!-- 项目管理 -->
|
||||
<div class="category">
|
||||
<h2 class="category-title">项目管理</h2>
|
||||
<div class="card-row">
|
||||
<!-- 单个卡片 -->
|
||||
<div class="card" id="xmgl">
|
||||
<div class="card-icon">
|
||||
<i class="fas fa-project-diagram"></i>
|
||||
</div>
|
||||
<h3 class="card-title">项目管理</h3>
|
||||
<p class="card-description">添加真实业务项目</p>
|
||||
</div>
|
||||
|
||||
<!-- 单个卡片 -->
|
||||
<div class="card" id="dmgl">
|
||||
<div class="card-icon">
|
||||
<i class="fas fa-tasks"></i>
|
||||
</div>
|
||||
<h3 class="card-title">内部Demo管理</h3>
|
||||
<p class="card-description">企业内部Demo管理</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- <div class="layui-form-bar border-t border-x"
|
||||
style="display: flex; justify-content: center; align-items: center; height: 94vh !important;">
|
||||
<div class="btn_list">
|
||||
<div class="btns xmjhgl">
|
||||
<button class="layui-btn diy-button layui-bg-blue">
|
||||
<svg t="1722242789918" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="8135" width="100" height="100">
|
||||
<path
|
||||
d="M449.408 896H192a64 64 0 0 1-64-64V192a64 64 0 0 1 64-64h576a64 64 0 0 1 64 64v219.008c23.04 10.112 44.096 23.424 64 38.464V192a128 128 0 0 0-128-128H192a128 128 0 0 0-128 128v640a128 128 0 0 0 128 128h321.728a322.432 322.432 0 0 1-64.32-64z"
|
||||
fill="#ffffff" p-id="8136"></path>
|
||||
<path
|
||||
d="M704 448a256 256 0 1 0 0 512 256 256 0 0 0 0-512z m0 447.872a191.872 191.872 0 1 1 0-383.808 191.872 191.872 0 0 1 0 383.808z"
|
||||
fill="#ffffff" p-id="8137"></path>
|
||||
<path
|
||||
d="M800 672h-64V640a32 32 0 0 0-64 0v64a32 32 0 0 0 32 32h96a32 32 0 0 0 0-64zM438.848 265.216a31.808 31.808 0 0 0-44.992 0L287.232 371.84l-42.688-42.688a30.72 30.72 0 1 0-43.456 43.456l59.584 59.584c1.344 2.304 2.432 4.672 4.416 6.656 6.656 6.592 15.36 9.408 23.936 9.088a30.848 30.848 0 0 0 21.824-9.024c0.704-0.704 1.024-1.6 1.6-2.432l126.4-126.336a31.744 31.744 0 0 0 0-44.928zM544 320a32 32 0 0 0 0 64h192a32 32 0 0 0 0-64h-192zM393.856 489.216L287.232 595.84l-42.688-42.688a30.72 30.72 0 1 0-43.456 43.456l59.584 59.584c1.344 2.304 2.432 4.672 4.416 6.656 6.656 6.592 15.36 9.408 23.936 9.088a30.848 30.848 0 0 0 21.824-9.024c0.704-0.704 1.024-1.6 1.6-2.432l126.4-126.336a31.872 31.872 0 0 0-44.992-44.928z"
|
||||
fill="#ffffff" p-id="8138"></path>
|
||||
</svg>
|
||||
<strong>项目计划管理</strong>
|
||||
<p>管理项目开发计划</p>
|
||||
</button>
|
||||
</div>
|
||||
<div class="btns xmgl">
|
||||
<button class="layui-btn diy-button">
|
||||
<svg t="1713799963992" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="8224" width="100" height="100">
|
||||
<path
|
||||
d="M410.67 544H133.33A69.33 69.33 0 0 0 64 613.33v277.34A69.33 69.33 0 0 0 133.33 960h277.34A69.33 69.33 0 0 0 480 890.67V613.33A69.33 69.33 0 0 0 410.67 544zM402 842a40 40 0 0 1-40 40H182a40 40 0 0 1-40-40V662a40 40 0 0 1 40-40h180a40 40 0 0 1 40 40z m488.67-298H613.33A69.33 69.33 0 0 0 544 613.33v277.34A69.33 69.33 0 0 0 613.33 960h277.34A69.33 69.33 0 0 0 960 890.67V613.33A69.33 69.33 0 0 0 890.67 544zM882 842a40 40 0 0 1-40 40H662a40 40 0 0 1-40-40V662a40 40 0 0 1 40-40h180a40 40 0 0 1 40 40zM410.67 64H133.33A69.33 69.33 0 0 0 64 133.33v277.34A69.33 69.33 0 0 0 133.33 480h277.34A69.33 69.33 0 0 0 480 410.67V133.33A69.33 69.33 0 0 0 410.67 64zM402 362a40 40 0 0 1-40 40H182a40 40 0 0 1-40-40V182a40 40 0 0 1 40-40h180a40 40 0 0 1 40 40z m292.49 94.18a81.35 81.35 0 0 0 115 0l126.69-126.67a81.35 81.35 0 0 0 0-115L809.51 87.82a81.35 81.35 0 0 0-115 0L567.82 214.49a81.35 81.35 0 0 0 0 115z"
|
||||
fill="#ffffff" p-id="8225"></path>
|
||||
</svg>
|
||||
<strong>项目管理</strong>
|
||||
<p>添加真实业务项目</p>
|
||||
</button>
|
||||
</div>
|
||||
<div class="btns dmgl">
|
||||
<button class="layui-btn diy-button layui-bg-purple">
|
||||
<svg t="1713800009771" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="10099" width="100" height="100">
|
||||
<path
|
||||
d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m256 460.101818a152.203636 152.203636 0 0 1-87.272727 65.861818 80.058182 80.058182 0 0 1-24.436364 3.956364 29.090909 29.090909 0 1 1 0-57.949091 14.661818 14.661818 0 0 0 6.283636-1.396364 93.090909 93.090909 0 0 0 56.087273-40.96 76.101818 76.101818 0 0 0 10.938182-39.563636 89.832727 89.832727 0 0 0-94.254545-83.781818 106.123636 106.123636 0 0 0-51.2 13.265454 81.92 81.92 0 0 0-43.752728 69.818182v244.829091a139.636364 139.636364 0 0 1-72.610909 120.552727 159.883636 159.883636 0 0 1-79.825454 20.48 148.247273 148.247273 0 0 1-153.6-141.963636 135.68 135.68 0 0 1 19.781818-69.818182 151.04 151.04 0 0 1 87.272727-65.629091 86.807273 86.807273 0 0 1 24.436364-4.189091 29.090909 29.090909 0 0 1 25.367272 14.661819 29.090909 29.090909 0 0 1-25.367272 43.52 16.523636 16.523636 0 0 0-6.516364 1.396363 95.418182 95.418182 0 0 0-55.854545 40.96 74.007273 74.007273 0 0 0-10.938182 39.563637 90.065455 90.065455 0 0 0 94.952727 83.781818 106.821818 106.821818 0 0 0 51.2-13.265455 82.385455 82.385455 0 0 0 43.52-69.818182V390.283636a139.636364 139.636364 0 0 1 72.843636-120.552727 152.436364 152.436364 0 0 1 79.127273-21.410909 148.247273 148.247273 0 0 1 153.6 141.963636 136.378182 136.378182 0 0 1-19.781818 69.818182z"
|
||||
fill="#ffffff" p-id="10100"></path>
|
||||
</svg>
|
||||
<strong>内部Demo管理</strong>
|
||||
<p>企业内部Demo管理</p>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
//跳转项目计划管理
|
||||
$('#xmjhgl').click(function () {
|
||||
window.location.href = '/project/plan/index';
|
||||
});
|
||||
|
||||
//跳转项目管理
|
||||
$('#xmgl').click(function () {
|
||||
window.location.href = '/project/index/index';
|
||||
});
|
||||
|
||||
//跳转Demos管理
|
||||
$('#dmgl').click(function () {
|
||||
window.location.href = '/project/demo/index';
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
font-family: "Microsoft YaHei", sans-serif;
|
||||
}
|
||||
|
||||
.category {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.category-title {
|
||||
font-size: 20px;
|
||||
color: #2196f3;
|
||||
margin-bottom: 25px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid #2196f3;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.card-row {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
gap: 2.5%;
|
||||
margin-bottom: 30px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.card {
|
||||
width: 18%;
|
||||
background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.card-icon {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
margin-bottom: 15px;
|
||||
background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.card-icon i {
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 18px;
|
||||
color: #2196f3;
|
||||
margin-bottom: 10px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.card-description {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
line-height: 1.5;
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
Reference in New Issue
Block a user