更新命名问题
This commit is contained in:
parent
9f374011ae
commit
6b78ee29cf
@ -26,7 +26,7 @@ class BusinessInfo extends BaseController
|
||||
$name = isset($_POST['name']) ? $_POST['name'] : '';
|
||||
$email = isset($_POST['email']) ? $_POST['email'] : '';
|
||||
$phone = isset($_POST['phone']) ? $_POST['phone'] : '';
|
||||
$ip = isset($_POST['IP']) ? $_POST['IP'] : '';
|
||||
$ip = isset($_POST['ip']) ? $_POST['ip'] : '';
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : '';
|
||||
$product = isset($_POST['product']) ? $_POST['product'] : '';
|
||||
$company = isset($_POST['company']) ? $_POST['company'] : '';
|
||||
|
||||
@ -92,6 +92,74 @@ class Index extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
// 上传程序
|
||||
public function upload_files()
|
||||
{
|
||||
if (request()->file('file')) {
|
||||
// 获取文件信息
|
||||
$file = request()->file('file');
|
||||
$file_name = $file->getOriginalName();
|
||||
$file_size = $file->getSize();
|
||||
$file_extension = pathinfo($file->getOriginalName(), PATHINFO_EXTENSION);
|
||||
|
||||
// 文件大小限制(单位:字节)
|
||||
$max_file_size = 500 * 1024 * 1024; // 500MB
|
||||
|
||||
// 检查文件大小
|
||||
if ($file_size > $max_file_size) {
|
||||
return json([
|
||||
'code' => 2,
|
||||
'msg' => '文件过大,已经超过500MB,请联系管理员!',
|
||||
'max_size' => $max_file_size,
|
||||
'file_size' => $file_size
|
||||
]);
|
||||
}
|
||||
|
||||
// 创建文件夹
|
||||
$upload_dir = 'upload/programes/' . date('Y-m-d') . '/';
|
||||
if (!is_dir($upload_dir)) {
|
||||
if (!mkdir($upload_dir, 0777, true) && !is_dir($upload_dir)) {
|
||||
throw new \RuntimeException(sprintf('Directory "%s" was not created', $upload_dir));
|
||||
}
|
||||
}
|
||||
|
||||
// 生成新文件名
|
||||
$new_name = $this->generateRandomName(5) . '.' . $file_extension;
|
||||
|
||||
// 保存文件
|
||||
$file->move($upload_dir, $new_name);
|
||||
|
||||
// 添加数据到数据库
|
||||
$data = [
|
||||
'path' => $upload_dir . $new_name,
|
||||
'uid' => $this->uid,
|
||||
'create_time' => date('Y-m-d H:i:s', time())
|
||||
];
|
||||
Db::name('DownloadFiles')->insert($data);
|
||||
|
||||
// 获取文件上传域名
|
||||
$fileDomain = $_SERVER['HTTP_HOST'];
|
||||
|
||||
// 构建文件访问地址
|
||||
$url = $fileDomain . '/upload/programes/' . date('Y-m-d') . '/' . $new_name;
|
||||
|
||||
// 返回 JSON 数据
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '文件上传成功!',
|
||||
'fileDomain' => $fileDomain,
|
||||
'filename' => $file_name,
|
||||
'filepath' => $upload_dir . $new_name,
|
||||
'file_size'=> $file_size,
|
||||
'file_extension'=> $file_extension,
|
||||
'url' => $url,
|
||||
'admin_id' => $this->uid
|
||||
]);
|
||||
} else {
|
||||
return json(['code' => 400, 'msg' => '未选择上传文件!']);
|
||||
}
|
||||
}
|
||||
|
||||
// 图床上传
|
||||
public function upload_picbed()
|
||||
{
|
||||
@ -581,7 +649,8 @@ class Index extends BaseController
|
||||
return json(['code' => 0, 'msg' => '', 'data' => $images]);
|
||||
}
|
||||
|
||||
public function getallstaff(){
|
||||
public function getallstaff()
|
||||
{
|
||||
$employees = Db::name('admin')
|
||||
->field('id, name, status') // 根据需要选择字段
|
||||
->where('status', 1) // 只获取在职员工
|
||||
|
||||
@ -5,6 +5,4 @@ return [
|
||||
//'think\middleware\SessionInit',
|
||||
//验证勾股cms是否完成安装
|
||||
\app\home\middleware\Install::class,
|
||||
// 跳过登录验证 AuthMiddleware
|
||||
\app\api\middleware\Auth::class,
|
||||
];
|
||||
@ -1,6 +1,7 @@
|
||||
<div class="table-content" id="scheduleList">
|
||||
<div class="layui-form-bar border-t border-x">
|
||||
<form class="layui-form">
|
||||
<input id="loginusers" type="hidden" value="{$user_info.id}" />
|
||||
<div class="layui-input-inline" style="width:110px;">
|
||||
<input type="text" name="username" placeholder="请选择员工" class="layui-input" readonly
|
||||
data-event="select" />
|
||||
@ -24,7 +25,7 @@
|
||||
title: '工作记录列表',
|
||||
cellMinWidth: 200,
|
||||
url: "/api/schedule/index", //数据接口
|
||||
where: { 'tid': project_id },
|
||||
where: { 'tid': project_id},
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [[ //表头
|
||||
|
||||
@ -19,7 +19,6 @@
|
||||
<script>
|
||||
function pageInit() {
|
||||
var project_id = document.getElementById('project_id').value;
|
||||
console.log('项目id:' + project_id);
|
||||
var table = layui.table, tool = layui.tool;
|
||||
layui.taskTable = table.render({
|
||||
elem: '#test',
|
||||
@ -97,6 +96,7 @@
|
||||
//只看我按钮代码
|
||||
$("#taskForm").on("click", '[lay-filter="onlyme"]', function () {
|
||||
let loginuser = $("#loginusers").val();
|
||||
let project_id = $("#project_id").val();
|
||||
let postData = {
|
||||
type: $("#taskForm").find('[name="type"]').val(),
|
||||
flow_status: $("#taskForm").find('[name="flow_status"]').val(),
|
||||
@ -104,7 +104,7 @@
|
||||
cate: $("#taskForm").find('[name="cate"]').val(),
|
||||
delay: $("#taskForm").find('[name="delay"]').val(),
|
||||
// director_uid: $("#taskForm").find('[name="director_uid"]').val(),
|
||||
project_id: $("#taskForm").find('[name="project_id"]').val(),
|
||||
project_id: project_id,
|
||||
keywords: $("#taskForm").find('[name="keywords"]').val(),
|
||||
belong_project: $("#taskForm").find('[name="belong_project"]').val(),
|
||||
creater_name: $("#taskForm").find('[name="creater_name"]').val(),
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
@ -44,6 +45,14 @@ abstract class BaseController
|
||||
* @var array
|
||||
*/
|
||||
protected $middleware = [];
|
||||
protected $module;
|
||||
protected $controller;
|
||||
protected $action;
|
||||
protected $param;
|
||||
protected $uid;
|
||||
protected $did;
|
||||
protected $name;
|
||||
|
||||
|
||||
/**
|
||||
* 分页数量
|
||||
@ -73,13 +82,11 @@ abstract class BaseController
|
||||
protected function initialize()
|
||||
{
|
||||
// 检测权限
|
||||
// $this->checkLogin();
|
||||
//每页显示数据量
|
||||
$this->pageSize = Request::param('page_size', \think\facade\Config::get('app.page_size'));
|
||||
//显示当前登录账户权限
|
||||
// $this->showLoginUserInfo();
|
||||
$this->checkLogin();
|
||||
$this->param = $this->request->param();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 显示当前登录账户信息
|
||||
*/
|
||||
@ -98,14 +105,71 @@ abstract class BaseController
|
||||
*/
|
||||
protected function checkLogin()
|
||||
{
|
||||
// 定义一个不需要登录验证的接口白名单
|
||||
$noNeedLogin = [
|
||||
'apiout/businessinfo/product_info',
|
||||
'apiout/businessinfo/bifill',
|
||||
'apiout/index/getpicbedfolder',
|
||||
'apiout/download/catelist',
|
||||
'apiout/download/cateinfo',
|
||||
];
|
||||
|
||||
// 当前请求的路径
|
||||
$currentPath = $this->module . '/' . $this->controller . '/' . $this->action;
|
||||
|
||||
// 检查当前路径是否在白名单中
|
||||
if (in_array($currentPath, $noNeedLogin)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($this->controller !== 'login' && $this->controller !== 'captcha') {
|
||||
$session_admin = get_config('app.session_admin');
|
||||
if (!Session::has($session_admin)) {
|
||||
$this->apiError('请先登录');
|
||||
if ($this->request->isAjax()) {
|
||||
return to_assign(404, '请先登录');
|
||||
} else {
|
||||
$this->uid = Session::get($session_admin)['id'];
|
||||
View::assign('login_user', $this->uid);
|
||||
// redirect('/home/login/index.html')->send();
|
||||
// exit;
|
||||
return to_assign(404, '请先登录');
|
||||
}
|
||||
} else {
|
||||
$loginUser = Session::get($session_admin);
|
||||
$loginInfo = Db::name('Admin')->where('id', $loginUser['id'])->find();
|
||||
$this->uid = $loginInfo['id'];
|
||||
|
||||
$params = [
|
||||
'uid' => $this->uid,
|
||||
'name' => $loginInfo['name'],
|
||||
'thumb' => $loginInfo['thumb'],
|
||||
'module' => $this->module,
|
||||
'controller' => $this->controller,
|
||||
'action' => $this->action,
|
||||
'url' => $this->module . '/' . $this->controller . '/' . $this->action,
|
||||
'version' => get_system_config('web', 'version')
|
||||
];
|
||||
View::assign('params', $params);
|
||||
// 验证用户访问权限
|
||||
if (($this->module == 'api') || ($this->module == 'home') || ($this->module == 'apiout')) {
|
||||
return true;
|
||||
} else {
|
||||
$reg_pwd = Db::name('Admin')->where(['id' => $this->uid])->value('reg_pwd');
|
||||
if ($reg_pwd !== '') {
|
||||
redirect('/home/user/edit_password.html')->send();
|
||||
exit;
|
||||
}
|
||||
if (!$this->checkAuth()) {
|
||||
if ($this->request->isAjax()) {
|
||||
return to_assign(202, '你没有权限,请联系管理员或者人事部');
|
||||
} else {
|
||||
echo '<div style="text-align:center;color:red;margin-top:20%;">你没有权限,请联系管理员或者人事部</div>';
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Api处理成功结果返回方法
|
||||
* @param $message
|
||||
@ -156,5 +220,4 @@ abstract class BaseController
|
||||
|
||||
throw new HttpResponseException($response);
|
||||
}
|
||||
|
||||
}
|
||||
106
app/apiout/controller/Businessinfo.php
Normal file
106
app/apiout/controller/Businessinfo.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c)
|
||||
* @company 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\apiout\controller;
|
||||
|
||||
use app\apiout\BaseController;
|
||||
use think\facade\Db;
|
||||
|
||||
class BusinessInfo extends BaseController
|
||||
{
|
||||
//商机填写接口
|
||||
public function bifill()
|
||||
{
|
||||
// 允许来自指定域名的跨域请求
|
||||
header('Access-Control-Allow-Origin: https://kd.meteteme.top');
|
||||
header('Access-Control-Allow-Headers: Content-Type');
|
||||
|
||||
header('Access-Control-Allow-Origin: https://www.meteteme.com');
|
||||
header('Access-Control-Allow-Headers: Content-Type');
|
||||
|
||||
// 获取表单数据
|
||||
$params = $this->request->post();
|
||||
|
||||
// 调试:打印接收到的参数
|
||||
error_log('Received POST parameters: ' . json_encode($params));
|
||||
|
||||
// 判断表单数据是否完整
|
||||
$requiredFields = ['name', 'email', 'phone', 'message', 'product', 'company', 'ip'];
|
||||
foreach ($requiredFields as $field) {
|
||||
if (!isset($params[$field]) || empty($params[$field])) {
|
||||
error_log("Missing or empty field: $field");
|
||||
return json(['code' => 2, 'msg' => '请填写完整的表单数据!']);
|
||||
}
|
||||
}
|
||||
|
||||
// 向数据库插入数据
|
||||
$result = Db::name('Information')->insert([
|
||||
'name' => $params['name'],
|
||||
'email' => $params['email'],
|
||||
'phone' => $params['phone'],
|
||||
'message' => $params['message'],
|
||||
'product' => $params['product'],
|
||||
'company' => $params['company'],
|
||||
'ip' => $params['ip'],
|
||||
'create_time' => time(),
|
||||
]);
|
||||
|
||||
// 判断插入结果
|
||||
if ($result) {
|
||||
$webhook = 'https://oapi.dingtalk.com/robot/send?access_token=c39726abd36659f92442847430eda90bebb360c438270f7c05bea388f1c8168c';
|
||||
|
||||
$title = '**有新的商机生成!**';
|
||||
$line = '------------------------------';
|
||||
$companynames = '公司名称:' . $params['company'];
|
||||
$names = '联 系 人 :' . $params['name'];
|
||||
$contents = '请及时进入项管系统查看!';
|
||||
$times = '创建日期:' . date('Y-m-d H:i:s', time());
|
||||
|
||||
$data = array(
|
||||
'msgtype' => 'actionCard',
|
||||
'actionCard' => array(
|
||||
'title' => $title,
|
||||
'text' => $title . "\n\n" . $companynames . "\n\n" . $names . "\n\n" . $times,
|
||||
'btnOrientation' => '0',
|
||||
'btns' => [
|
||||
[
|
||||
'title' => '查看商机',
|
||||
'actionURL' => 'dingtalk://dingtalkclient/page/link?url=' . urlencode('https://project.meteteme.com/information/index/index') . '&pc_slide=false'
|
||||
]
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$options = array(
|
||||
'http' => array(
|
||||
'header' => "Content-type: application/json",
|
||||
'method' => 'POST',
|
||||
'content' => json_encode($data),
|
||||
)
|
||||
);
|
||||
|
||||
$context = stream_context_create($options);
|
||||
$result = file_get_contents($webhook, false, $context);
|
||||
|
||||
return json(['code' => 0, 'msg' => '留言提交成功!']);
|
||||
} else {
|
||||
return json(['code' => 1, 'msg' => '留言提交失败!']);
|
||||
}
|
||||
}
|
||||
|
||||
//获取产品信息
|
||||
public function product_info()
|
||||
{
|
||||
// 查询Product表中的所有产品信息
|
||||
$products = Db::name('Product')->field('id, name')->select();
|
||||
|
||||
// 返回产品信息数组给前端,包括id和name
|
||||
return json(['code' => 0, 'msg' => '获取产品信息成功', 'data' => $products]);
|
||||
}
|
||||
}
|
||||
49
app/apiout/controller/Download.php
Normal file
49
app/apiout/controller/Download.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
namespace app\apiout\controller;
|
||||
|
||||
use app\apiout\BaseController;
|
||||
use app\model\Download as DownloadList;
|
||||
use app\model\DownloadCate as DownloadCateList;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Download extends BaseController
|
||||
{
|
||||
|
||||
//获取软件分类
|
||||
public function catelist()
|
||||
{
|
||||
$catelist = DownloadCateList::field('id, name, sort')
|
||||
->where('delete_time', null)
|
||||
->order('sort', 'desc')
|
||||
->select();
|
||||
return json(['code' => 0, 'msg' => '', 'data' => $catelist]);
|
||||
}
|
||||
|
||||
//获取分类详情
|
||||
public function cateinfo()
|
||||
{
|
||||
$id = get_params('id'); // 获取分类 ID 参数
|
||||
|
||||
if (!$id) {
|
||||
return json(['code' => 1, 'msg' => '分类 ID 不能为空', 'data' => []]);
|
||||
}
|
||||
|
||||
// 查询对应分类下的所有数据
|
||||
$cateinfo = DownloadList::field('id, cid, name, path, download_url, download_code, size ,type')
|
||||
->where('cid', $id)
|
||||
->select(); // 使用 select() 返回多个数据
|
||||
|
||||
if ($cateinfo->isEmpty()) {
|
||||
return json(['code' => 1, 'msg' => '该分类下没有数据', 'data' => []]);
|
||||
}
|
||||
|
||||
return json(['code' => 0, 'msg' => '', 'data' => $cateinfo]);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,8 +1,15 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
//验证勾股cms是否完成安装
|
||||
\app\home\middleware\Install::class,
|
||||
// 跳过登录验证 AuthMiddleware
|
||||
\app\apiout\middleware\Auth::class,
|
||||
];
|
||||
30
app/apiout/middleware/Auth.php
Normal file
30
app/apiout/middleware/Auth.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace app\apiout\middleware;
|
||||
|
||||
use Closure;
|
||||
use think\Request;
|
||||
use think\Response;
|
||||
|
||||
class Auth
|
||||
{
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
// 获取当前请求的控制器和方法
|
||||
$controller = $request->controller();
|
||||
$action = $request->action();
|
||||
|
||||
// 如果请求的控制器是 BusinessInfo 且方法是 product_info 或者是登录页面,则跳过验证
|
||||
if (($controller === 'BusinessInfo' && $action === 'product_info') || ($controller === 'Login' && $action === 'index')) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
// 执行登录验证逻辑
|
||||
// if (!session('?user_id')) {
|
||||
// // 未登录,返回错误或重定向到登录页面
|
||||
// return redirect('login/index');
|
||||
// }
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@ -7,13 +7,13 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\application\controller;
|
||||
namespace app\applications\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Application as ApplicationList;
|
||||
use app\model\StatusMapping as StatusMappingList;
|
||||
use app\model\ProjectCategory as ProjectCategoryList;
|
||||
use app\application\validate\ApplicationCheck;
|
||||
use app\applications\validate\ApplicationCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
@ -7,11 +7,11 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\application\controller;
|
||||
namespace app\applications\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Application as ApplicationList;
|
||||
use app\application\validate\ApplicationCheck;
|
||||
use app\applications\validate\ApplicationCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
@ -1,5 +1,5 @@
|
||||
<?php
|
||||
namespace app\application\validate;
|
||||
namespace app\applications\validate;
|
||||
|
||||
use think\facade\Db;
|
||||
use think\Validate;
|
||||
@ -81,6 +81,14 @@
|
||||
<h3 class="card-title">文件中转</h3>
|
||||
<p class="card-description">服务器内部资源跳转外部</p>
|
||||
</div>
|
||||
<!-- 单个卡片 -->
|
||||
<div class="card" id="rjxz">
|
||||
<div class="card-icon">
|
||||
<i class="fas fa-download"></i>
|
||||
</div>
|
||||
<h3 class="card-title">软件下载</h3>
|
||||
<p class="card-description">官网软件下载上传管理</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -95,6 +103,11 @@
|
||||
window.location.href = "/picbed/index/index";
|
||||
});
|
||||
|
||||
//跳转软件下载
|
||||
$("#rjxz").click(function () {
|
||||
window.location.href = "/download/index/index";
|
||||
});
|
||||
|
||||
//跳转Demos管理
|
||||
$("#bxgl").click(function () {
|
||||
window.location.href = "/reimbursement/index/index";
|
||||
@ -79,7 +79,7 @@ abstract class BaseController
|
||||
{
|
||||
// 定义一个不需要登录验证的接口白名单
|
||||
$whitelist = [
|
||||
'business/supplier/sendintention',
|
||||
// 'business/supplier/sendintention',
|
||||
// 其他不需要登录验证的接口可以继续添加到此数组
|
||||
];
|
||||
|
||||
|
||||
@ -8,23 +8,23 @@ use think\Response;
|
||||
|
||||
class Auth
|
||||
{
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
// 获取当前请求的控制器和方法
|
||||
$controller = $request->controller();
|
||||
$action = $request->action();
|
||||
// public function handle(Request $request, Closure $next): Response
|
||||
// {
|
||||
// // 获取当前请求的控制器和方法
|
||||
// $controller = $request->controller();
|
||||
// $action = $request->action();
|
||||
|
||||
// 如果请求的控制器是 Supplier 且方法是 sendintention,则跳过验证
|
||||
if ($controller === 'Supplier' && $action === 'sendintention') {
|
||||
return $next($request);
|
||||
}
|
||||
// // 如果请求的控制器是 Supplier 且方法是 sendintention,则跳过验证
|
||||
// if ($controller === 'Supplier' && $action === 'sendintention') {
|
||||
// return $next($request);
|
||||
// }
|
||||
|
||||
// 执行登录验证逻辑
|
||||
if (!session('?user_id')) {
|
||||
// 未登录,返回错误或重定向到登录页面
|
||||
return redirect('login/index');
|
||||
}
|
||||
// // 执行登录验证逻辑
|
||||
// if (!session('?user_id')) {
|
||||
// // 未登录,返回错误或重定向到登录页面
|
||||
// return redirect('login/index');
|
||||
// }
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
// return $next($request);
|
||||
// }
|
||||
}
|
||||
@ -3,7 +3,9 @@
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/business/index/nav"><cite>CRM</cite></a>
|
||||
<a href="/application/nav/index">
|
||||
<cite>应用</cite>
|
||||
</a>
|
||||
<a><cite>客户管理</cite></a>
|
||||
</span>
|
||||
{/block}
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/business/index/nav">
|
||||
<cite>CRM</cite>
|
||||
<a href="/application/nav/index">
|
||||
<cite>应用</cite>
|
||||
</a>
|
||||
<a>
|
||||
<cite>供应商管理</cite>
|
||||
@ -286,7 +286,7 @@
|
||||
shadeClose: true,
|
||||
shade: 0.8,
|
||||
area: ['70%', '90%'], // 宽高
|
||||
content: '/business/supplier/view/id/' + id,
|
||||
content: '/business/supplier/view?id=' + id,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
12
app/download/common.php
Normal file
12
app/download/common.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
/**
|
||||
======================
|
||||
*模块数据获取公共文件
|
||||
======================
|
||||
*/
|
||||
use think\facade\Db;
|
||||
311
app/download/controller/Index.php
Normal file
311
app/download/controller/Index.php
Normal file
@ -0,0 +1,311 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\download\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\model\Download as DownloadList;
|
||||
use app\model\DownloadCate as DownloadCateList;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$rows = empty($param['limit']) ? get_md_contentconfig('app.page_size') : $param['limit'];
|
||||
|
||||
// 获取域名
|
||||
$domain = 'https://project.meteteme.com/';
|
||||
|
||||
// 获取分类列表并转换为键值对数组
|
||||
$categories = DownloadCateList::whereNull('delete_time')
|
||||
->column('name', 'id');
|
||||
|
||||
// 获取用户列表并转换为键值对数组
|
||||
$users = Db::name('Admin')->column('name', 'id');
|
||||
|
||||
// 构建查询条件
|
||||
$query = DownloadList::whereNull('delete_time');
|
||||
|
||||
// 根据筛选条件添加查询条件
|
||||
if (!empty($param['name'])) {
|
||||
$query->where('name', 'like', '%' . $param['name'] . '%');
|
||||
}
|
||||
if (!empty($param['cid'])) {
|
||||
// 根据分类名称筛选
|
||||
$categoryId = array_search($param['cid'], $categories); // 将分类名称转换为分类 ID
|
||||
if ($categoryId !== false) {
|
||||
$query->where('cid', $categoryId);
|
||||
} else {
|
||||
// 如果分类名称不存在,返回空结果
|
||||
return table_assign(0, '', ['data' => [], 'total' => 0]);
|
||||
}
|
||||
}
|
||||
if (!empty($param['uid'])) {
|
||||
$query->where('uid', $param['uid']);
|
||||
}
|
||||
|
||||
// 获取分页数据
|
||||
$list = $query->field('id, cid, uid, name, version, path, description, download_url, download_code, size, type')
|
||||
->order('id desc')
|
||||
->paginate($rows, false);
|
||||
|
||||
// 反查数据
|
||||
$list->each(function ($item) use ($domain, $categories, $users) {
|
||||
$item['path'] = $domain . $item['path'];
|
||||
$item['cid'] = isset($categories[$item['cid']]) ? $categories[$item['cid']] : '未知分类';
|
||||
$item['uid'] = isset($users[$item['uid']]) ? $users[$item['uid']] : '未知用户';
|
||||
return $item;
|
||||
});
|
||||
|
||||
return table_assign(0, '', $list->toArray());
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params(); // 获取请求参数
|
||||
$uid = $this->uid; // 当前用户 ID
|
||||
|
||||
if (request()->isPost()) {
|
||||
// 验证必填字段
|
||||
if (empty($param['name'])) {
|
||||
return to_assign(1, '软件名称不能为空');
|
||||
}
|
||||
if (empty($param['cid'])) {
|
||||
return to_assign(1, '请选择软件分类');
|
||||
}
|
||||
|
||||
// 添加逻辑
|
||||
$param['uid'] = $uid; // 设置上传用户
|
||||
$param['create_time'] = date('Y-m-d H:i:s'); // 创建时间
|
||||
|
||||
// 插入数据并获取自增 ID
|
||||
$sid = DownloadList::strict(false)->field(true)->insertGetId($param);
|
||||
|
||||
if ($sid) {
|
||||
// 添加日志
|
||||
add_log('add', $sid, $param);
|
||||
$log_data = [
|
||||
'module' => 'download',
|
||||
'download_id' => $sid,
|
||||
'new_content' => $param['name'],
|
||||
'field' => 'new',
|
||||
'action' => 'add',
|
||||
'admin_id' => $uid,
|
||||
'create_time' => time(),
|
||||
];
|
||||
Db::name('Log')->strict(false)->field(true)->insert($log_data);
|
||||
|
||||
return to_assign(0, '添加成功', ['redirect' => 'javascript:history.back()']);
|
||||
} else {
|
||||
return to_assign(1, '添加失败');
|
||||
}
|
||||
} else {
|
||||
// 非 POST 请求,返回视图
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$uid = $this->uid;
|
||||
|
||||
$download = DownloadList::where('id', $id)
|
||||
->field('id, cid, uid, name, version, description, path, download_url, download_code')
|
||||
->find();
|
||||
|
||||
if ($download) {
|
||||
View::assign('detail', $download);
|
||||
} else {
|
||||
View::assign('message', '没有详细数据');
|
||||
}
|
||||
|
||||
if (request()->isPost()) {
|
||||
$data = [
|
||||
'cid' => $param['cid'],
|
||||
'uid' => $uid,
|
||||
'name' => $param['name'],
|
||||
'version' => $param['version'],
|
||||
'description' => $param['description'],
|
||||
'path' => $param['path'],
|
||||
'download_url' => $param['download_url'],
|
||||
'download_code' => $param['download_code'],
|
||||
'update_time' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
$res = DownloadList::where('id', $id)->update($data);
|
||||
|
||||
if ($res) {
|
||||
return to_assign(2, '更新成功!');
|
||||
} else {
|
||||
return to_assign(1, '更新失败');
|
||||
}
|
||||
}
|
||||
|
||||
return view();
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = (new DownloadList())->detail($id);
|
||||
// print_r($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '2.信息不存在');
|
||||
} else {
|
||||
if ($this->uid != $detail['admin_id']) { // 当前登录用户必须是上传者才能查看
|
||||
return to_assign(1, '您没权限查看该信息');
|
||||
}
|
||||
$role_uid = [$detail['admin_id'], $detail['director_uid']];
|
||||
$role_edit = 'edit';
|
||||
$view_uid = $role_uid;
|
||||
// if (!empty($detail['check_admin_ids'])) {
|
||||
// $view_uid = array_merge($role_uid, explode(",", $detail['check_admin_ids']));
|
||||
// }
|
||||
if (!in_array($this->uid, $view_uid) && $detail['is_open'] == 1) {
|
||||
return to_assign(1, '您没权限查看该信息');
|
||||
}
|
||||
$contact_array = Db::name('Businesscontact')
|
||||
->field('i.id,i.business_id,i.contact,i.post,i.phone,i.email,i.wechat,i.qq,a.name as admin_name')
|
||||
->alias('i')
|
||||
->join('Admin a', 'i.admin_id = a.id', 'LEFT')
|
||||
->join('DownloadList b', 'i.business_id = b.id', 'LEFT')
|
||||
->order('i.create_time desc')
|
||||
->where(array('i.business_id' => $id))
|
||||
->where('i.delete_time', null)
|
||||
->select()->toArray();
|
||||
|
||||
$file_array = Db::name('FileInterfix')
|
||||
->field('i.id,i.topic_id,i.admin_id,f.name,f.filesize,f.filepath,a.name as admin_name')
|
||||
->alias('i')
|
||||
->join('File f', 'i.file_id = f.id', 'LEFT')
|
||||
->join('Admin a', 'i.admin_id = a.id', 'LEFT')
|
||||
->order('i.create_time desc')
|
||||
->where(array('i.topic_id' => $id, 'i.module' => 'download'))
|
||||
->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' => 'download', 'delete_time' => 0))
|
||||
->select()->toArray();
|
||||
View::assign('detail', $detail);
|
||||
View::assign('contact_array', $contact_array);
|
||||
View::assign('file_array', $file_array);
|
||||
View::assign('link_array', $link_array);
|
||||
View::assign('role_edit', $role_edit);
|
||||
View::assign('id', $id);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function delete()
|
||||
{
|
||||
|
||||
$param = get_params();
|
||||
$request = request();
|
||||
|
||||
if ($request->isDelete() || $request->isAjax()) {
|
||||
$id = $param['id'];
|
||||
if (empty($id)) {
|
||||
return to_assign(1, "删除,缺少必要的参数");
|
||||
}
|
||||
|
||||
$detail = Db::name('Download')->where('id', $id)->find();
|
||||
if (!$detail) {
|
||||
return to_assign(1, "删除,记录不存在或缺少必要字段");
|
||||
}
|
||||
|
||||
if ($detail['uid'] != $this->uid) {
|
||||
return to_assign(1, "你不是图片的上传人,无权限删除");
|
||||
}
|
||||
|
||||
if (Db::name('Download')->where('id', $id)->update(['delete_time' => date('Y-m-d H:i:s')]) !== false) {
|
||||
$log_data = [
|
||||
'module' => 'download',
|
||||
'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()
|
||||
{
|
||||
$param = get_params();
|
||||
$request = request();
|
||||
if ($request->isDelete() || $request->isAjax()) {
|
||||
$ids = $param['ids'];
|
||||
if (empty($ids) || !is_array($ids)) {
|
||||
return to_assign(1, "批量删除,缺少必要的参数");
|
||||
}
|
||||
|
||||
foreach ($ids as $id) {
|
||||
$detail = Db::name('Download')->where('id', $id)->find();
|
||||
if (!$detail || !isset($detail['uid'])) {
|
||||
continue; // 跳过不存在的记录
|
||||
}
|
||||
|
||||
if (Db::name('Download')->where('id', $id)->update(['delete_time' => date('Y-m-d H:i:s')]) !== false) {
|
||||
$log_data = [
|
||||
'module' => 'Download',
|
||||
'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 catelist()
|
||||
{
|
||||
$catelist = DownloadCateList::field('id, name, description, sort')
|
||||
->where('delete_time', null)
|
||||
->select();
|
||||
return json(['code' => 0, 'msg' => '', 'data' => $catelist]);
|
||||
}
|
||||
|
||||
}
|
||||
5
app/download/event.php
Normal file
5
app/download/event.php
Normal file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
// 这是系统自动生成的event定义文件
|
||||
return [
|
||||
|
||||
];
|
||||
13
app/download/middleware.php
Normal file
13
app/download/middleware.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2023-2024 美天智能科技
|
||||
* @author 李志强
|
||||
* @link http://www.meteteme.com
|
||||
*/
|
||||
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
\app\home\middleware\Install::class,
|
||||
];
|
||||
33
app/download/validate/DownloadCheck.php
Normal file
33
app/download/validate/DownloadCheck.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
namespace app\download\validate;
|
||||
|
||||
use think\facade\Db;
|
||||
use think\Validate;
|
||||
|
||||
class DownloadCheck extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value, $rule, $data = [])
|
||||
{
|
||||
$count = Db::name('DownloadImages')->where(['name' => $data['name'], 'delete_time' => 0])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'maincontact' => 'require|checkOne',
|
||||
'id' => 'require',
|
||||
'name' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '客户单位不能为空',
|
||||
// 'name.checkOne' => '同样的商务信息已经存在',
|
||||
'maincontact.checkOne' => '同样的商务信息已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name'],
|
||||
'edit' => ['id'],
|
||||
];
|
||||
}
|
||||
175
app/download/view/index/add.html
Normal file
175
app/download/view/index/add.html
Normal file
@ -0,0 +1,175 @@
|
||||
<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-2">软件名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="name" name="name" lay-verify="required" lay-reqText="请输入软件名称"
|
||||
placeholder="请输入软件名称" class="layui-input" value="" />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">软件分类
|
||||
</td>
|
||||
<td>
|
||||
<select name="cid" id="cid" lay-verify="" lay-reqText="请选择软件分类" class="layui-select" lay-search=""
|
||||
lay-filter="cid"></select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">软件版本
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="version" lay-reqText="请输入软件版本" placeholder="请输入软件版本" class="layui-input"
|
||||
value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">上传文件</td>
|
||||
<td>
|
||||
<button type="button" class="layui-btn demo-class-accept" id="Uploadfiles">
|
||||
<i class="layui-icon layui-icon-upload"></i>
|
||||
上传文件
|
||||
</button>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">文件路径</td>
|
||||
<td>
|
||||
<input type="text" name="path" placeholder="文件路径" class="layui-input" value="" readonly />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">文件类型
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="type" class="layui-input" value="" readonly />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">文件大小</td>
|
||||
<td>
|
||||
<input type="text" name="size" class="layui-input" value="" readonly />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">下载链接
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="download_url" lay-reqText="请输入下载链接" placeholder="请输入下载链接" class="layui-input"
|
||||
value="" />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">分享码</td>
|
||||
<td>
|
||||
<input type="text" name="download_code" lay-reqText="请输入分享码" placeholder="请输入分享码" class="layui-input"
|
||||
value="" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">软件描述
|
||||
</td>
|
||||
<td colspan="4">
|
||||
<textarea name="description" lay-reqText="请输入" placeholder="请输入软件描述" class="layui-textarea"
|
||||
value=""></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pt-1">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform" id="ID-upload-demo-action">
|
||||
立即提交
|
||||
</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
layui.use(["form", "layer", "upload"], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
upload = layui.upload;
|
||||
|
||||
form.render();
|
||||
|
||||
// 软件分类加载
|
||||
fetch("/download/index/catelist")
|
||||
.then((response) => response.json())
|
||||
.then((result) => {
|
||||
var select = document.getElementById('cid');
|
||||
select.innerHTML = '<option value="">请选择软件类别</option>';
|
||||
|
||||
if (result.code === 0 && Array.isArray(result.data)) {
|
||||
results = result.data;
|
||||
results.forEach((item) => {
|
||||
var option = document.createElement("option");
|
||||
option.value = item.id;
|
||||
option.innerText = item.name;
|
||||
select.appendChild(option);
|
||||
});
|
||||
} else {
|
||||
console.error("意外的响应格式:", result);
|
||||
}
|
||||
|
||||
form.render("select");
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
});
|
||||
|
||||
// 上传文件逻辑
|
||||
upload.render({
|
||||
elem: '#Uploadfiles', // 上传按钮
|
||||
url: '/api/index/upload_files', // 上传接口
|
||||
accept: 'file', // 接收任意文件类型
|
||||
exts: 'exe|zip|rar|7z', // 限制文件类型
|
||||
auto: true, // 自动上传
|
||||
done: function (res) {
|
||||
if (res.code === 200) {
|
||||
// 上传成功后,将返回的文件路径设置到输入框中
|
||||
var filenameWithoutExtension = res.filename.replace(/\.[^/.]+$/, "");
|
||||
document.getElementById('name').value = filenameWithoutExtension;
|
||||
document.querySelector('input[name="path"]').value = res.filepath;
|
||||
document.querySelector('input[name="size"]').value = (res.file_size / (1024 * 1024)).toFixed(2) + ' MB';
|
||||
document.querySelector('input[name="type"]').value = res.file_extension;
|
||||
layer.msg('文件上传成功');
|
||||
} else {
|
||||
layer.msg('文件上传失败:' + res.msg);
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
layer.msg('上传接口异常');
|
||||
}
|
||||
});
|
||||
|
||||
// 提交表单逻辑
|
||||
form.on("submit(webform)", function (data) {
|
||||
// 验证文件路径和下载链接是否填写
|
||||
var path = document.querySelector('input[name="path"]').value;
|
||||
var downloadUrl = document.querySelector('input[name="download_url"]').value;
|
||||
|
||||
if (!path && !downloadUrl) {
|
||||
layer.msg("请先上传文件或填写下载链接");
|
||||
return false; // 阻止提交
|
||||
}
|
||||
|
||||
// 提交表单数据
|
||||
fetch("/download/index/add", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(data.field), // 仅提交表单字段
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((result) => {
|
||||
layer.msg(result.msg);
|
||||
if (result.code === 0) {
|
||||
setTimeout(function () {
|
||||
window.history.back(); // 返回上一页
|
||||
}, 1500);
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
layer.msg("提交失败,请重试");
|
||||
});
|
||||
|
||||
return false; // 阻止默认表单提交
|
||||
});
|
||||
});
|
||||
</script>
|
||||
185
app/download/view/index/edit.html
Normal file
185
app/download/view/index/edit.html
Normal file
@ -0,0 +1,185 @@
|
||||
<form class="layui-form page-content p-4">
|
||||
<h3 class="h3-title">软件信息</h3>
|
||||
<input type="hidden" value="{$detail.id}" id="id">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">软件名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="name" name="name" lay-verify="required" lay-reqText="请输入软件名称"
|
||||
placeholder="请输入软件名称" class="layui-input" value="{$detail.name}" />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">软件分类
|
||||
</td>
|
||||
<td>
|
||||
<select name="cid" id="cid" lay-verify="" lay-reqText="请选择软件分类" class="layui-select" lay-search=""
|
||||
lay-filter="cid">
|
||||
<!-- 分类选项会通过 JavaScript 动态加载 -->
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">软件版本
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="version" lay-reqText="请输入软件版本" placeholder="请输入软件版本" class="layui-input"
|
||||
value="{$detail.version}" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">上传文件</td>
|
||||
<td>
|
||||
<button type="button" class="layui-btn demo-class-accept" id="Uploadfiles">
|
||||
<i class="layui-icon layui-icon-upload"></i>
|
||||
上传文件
|
||||
</button>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">文件路径</td>
|
||||
<td>
|
||||
<input type="text" name="path" placeholder="文件路径" class="layui-input" value="{$detail.path}" readonly />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">文件类型
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="type" class="layui-input" value="{$detail.type}" readonly />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">文件大小</td>
|
||||
<td>
|
||||
<input type="text" name="size" class="layui-input" value="{$detail.size}" readonly />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">下载链接
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="download_url" lay-reqText="请输入下载链接" placeholder="请输入下载链接" class="layui-input"
|
||||
value="{$detail.download_url}" />
|
||||
</td>
|
||||
<td class="layui-td-gray-2">分享码</td>
|
||||
<td>
|
||||
<input type="text" name="download_code" lay-reqText="请输入分享码" placeholder="请输入分享码" class="layui-input"
|
||||
value="{$detail.download_code}" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">软件描述
|
||||
</td>
|
||||
<td colspan="4">
|
||||
<!-- 修复 textarea 的值绑定 -->
|
||||
<textarea name="description" placeholder="请输入软件描述"
|
||||
class="layui-textarea">{$detail.description}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pt-1">
|
||||
<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", "upload"], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
upload = layui.upload;
|
||||
|
||||
var selectedFile = null; // 用于存储选择的文件
|
||||
|
||||
// 上传文件逻辑
|
||||
upload.render({
|
||||
elem: '#Uploadfiles', // 上传按钮
|
||||
url: '/api/index/upload_files', // 上传接口
|
||||
accept: 'file', // 接收任意文件类型
|
||||
exts: 'exe|zip|rar|7z', // 限制文件类型
|
||||
auto: true, // 自动上传
|
||||
done: function (res) {
|
||||
if (res.code === 200) {
|
||||
// 上传成功后,将返回的文件路径设置到输入框中
|
||||
document.querySelector('input[name="path"]').value = res.filepath;
|
||||
layer.msg('文件上传成功');
|
||||
} else {
|
||||
layer.msg('文件上传失败:' + res.msg);
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
layer.msg('上传接口异常');
|
||||
}
|
||||
});
|
||||
|
||||
form.render();
|
||||
|
||||
|
||||
// 获取当前时间并格式化
|
||||
var updateTime = new Date().toISOString();
|
||||
var idValue = document.getElementById('id').value;
|
||||
console.log(idValue);
|
||||
|
||||
// 软件分类加载
|
||||
fetch("/download/index/catelist")
|
||||
.then((response) => response.json())
|
||||
.then((result) => {
|
||||
var select = document.getElementById('cid');
|
||||
select.innerHTML = '<option value="">请选择软件类别</option>';
|
||||
|
||||
if (result.code === 0 && Array.isArray(result.data)) {
|
||||
results = result.data;
|
||||
results.forEach((item) => {
|
||||
var option = document.createElement("option");
|
||||
option.value = item.id;
|
||||
option.innerText = item.name;
|
||||
if (item.id == "{$detail.cid}") {
|
||||
option.selected = true;
|
||||
}
|
||||
select.appendChild(option);
|
||||
});
|
||||
} else {
|
||||
console.error("意外的响应格式:", result);
|
||||
}
|
||||
|
||||
form.render("select");
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
});
|
||||
|
||||
// 监听提交事件
|
||||
form.on("submit(webform)", function (data) {
|
||||
// 发送请求并处理响应
|
||||
fetch("/download/index/edit?id=" + idValue, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
id: document.getElementById('id').value,
|
||||
name: document.getElementById('name').value,
|
||||
cid: document.querySelector('select[name="cid"]').value,
|
||||
version: document.querySelector('input[name="version"]').value,
|
||||
path: document.querySelector('input[name="path"]').value,
|
||||
download_url: document.querySelector('input[name="download_url"]').value,
|
||||
download_code: document.querySelector('input[name="download_code"]').value,
|
||||
description: document.querySelector('textarea[name="description"]').value,
|
||||
update_time: updateTime,
|
||||
}),
|
||||
|
||||
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();
|
||||
// location.reload(); // 刷新页面
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
311
app/download/view/index/index.html
Normal file
311
app/download/view/index/index.html
Normal file
@ -0,0 +1,311 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/application/nav/index">
|
||||
<cite>应用</cite>
|
||||
</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 layui-bg-blue add-new">+ 上传软件</button>
|
||||
<button class="layui-btn layui-btn-sm" id="refresh-btn">刷新</button>
|
||||
</div>
|
||||
<div class="layui-form-bar border-t border-x">
|
||||
<form id="taskForm" class="layui-form">
|
||||
<div class="layui-col-md4" style="width: 200px;margin-right: 10px;">
|
||||
<div class="layui-input-wrap">
|
||||
<div class="layui-input-prefix">
|
||||
<!-- <i class="layui-icon layui-icon-username"></i>-->
|
||||
</div>
|
||||
<input id="gys" type="text" name="name" value="" placeholder="请输入软件名称" class="layui-input"
|
||||
lay-affix="clear">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md4" style="width: 200px; margin-right: 10px;">
|
||||
<div class="layui-input-wrap">
|
||||
<select id="lxr" name="cid" lay-search="" lay-filter="cid">
|
||||
<option value="">请选择软件分类</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md4" style="width: 200px;margin-right: 10px;">
|
||||
<div class="layui-input-wrap">
|
||||
<input id="lxdh" type="text" name="uid" value="" placeholder="请输入上传者" class="layui-input"
|
||||
lay-affix="clear">
|
||||
</div>
|
||||
</div>
|
||||
<button class="layui-btn" lay-submit lay-filter="webform">搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</form>
|
||||
</div>
|
||||
<table class="layui-hide" id="download" lay-filter="download"></table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool', 'gouguEdit', 'gouguComment'];
|
||||
|
||||
function gouguInit() {
|
||||
var table = layui.table,
|
||||
form = layui.form,
|
||||
layer = layui.layer,
|
||||
tool = layui.tool;
|
||||
|
||||
//存储表格原始数据
|
||||
var originalData = [];
|
||||
|
||||
// 添加按钮
|
||||
$('.add-new').on('click', function () {
|
||||
tool.open('/download/index/add');
|
||||
});
|
||||
|
||||
// 刷新按钮
|
||||
$("#refresh-btn").on("click", function () {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
// 动态加载软件分类
|
||||
fetch("/download/index/catelist")
|
||||
.then((response) => response.json())
|
||||
.then((result) => {
|
||||
if (result.code === 0 && Array.isArray(result.data)) {
|
||||
var select = document.querySelector('select[name="cid"]');
|
||||
select.innerHTML = '<option value="">请选择软件分类</option>'; // 清空并添加默认选项
|
||||
|
||||
result.data.forEach((item) => {
|
||||
var option = document.createElement("option");
|
||||
option.value = item.name; // 使用分类名称作为 value
|
||||
option.innerText = item.name; // 显示分类名称
|
||||
select.appendChild(option);
|
||||
});
|
||||
|
||||
// 重新渲染 select
|
||||
form.render("select");
|
||||
} else {
|
||||
console.error("分类加载失败:", result.msg || "未知错误");
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("分类加载接口异常:", error);
|
||||
});
|
||||
|
||||
// 搜索按钮
|
||||
form.on('submit(webform)', function (data) {
|
||||
var field = data.field; // 获取表单字段
|
||||
|
||||
// 重新加载表格数据,传递筛选条件
|
||||
layui.pageTable.reload({
|
||||
where: {
|
||||
name: field.name || '', // 软件名称
|
||||
cid: field.cid || '', // 分类名称(通过分类名称筛选)
|
||||
uid: field.uid || '' // 上传用户
|
||||
},
|
||||
page: {
|
||||
curr: 1 // 重新从第 1 页开始
|
||||
}
|
||||
});
|
||||
|
||||
return false; // 阻止默认 form 提交
|
||||
});
|
||||
|
||||
// 表格渲染
|
||||
layui.pageTable = table.render({
|
||||
elem: '#download',
|
||||
title: '下载列表',
|
||||
cellMinWidth: 80,
|
||||
url: "/download/index/index", // 数据接口method: 'POST', // 使用 POST 方法传递筛选条件
|
||||
where: {}, // 初始筛选条件为空
|
||||
page: true, // 开启分页
|
||||
limit: 50,
|
||||
height: 'full-130',
|
||||
cols: [[
|
||||
// {
|
||||
// field: 'id',
|
||||
// title: '下载编号',
|
||||
// width: 100,
|
||||
// align: 'center',
|
||||
// rowspan: 2,
|
||||
// templet: function (d) {
|
||||
// return 'S' + d.id;
|
||||
// }
|
||||
// },
|
||||
{
|
||||
field: 'name',
|
||||
title: '软件名称',
|
||||
align: 'center',
|
||||
width: 300,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = '<span>' + (d.name || '-') + '</span>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'cid',
|
||||
title: '软件分类',
|
||||
align: 'center',
|
||||
width: 160,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = '<span>' + (d.cid || '-') + '</span>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'version',
|
||||
title: '软件版本',
|
||||
align: 'center',
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = '<span>' + (d.version || '-') + '</span>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'size',
|
||||
title: '软件大小',
|
||||
align: 'center',
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = '<span>' + (d.size || '-') + '</span>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'type',
|
||||
title: '软件类型',
|
||||
align: 'center',
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = '<span>' + (d.type || '-') + '</span>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'download_url',
|
||||
title: '下载链接',
|
||||
align: 'center',
|
||||
// width: 500,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
if (d.path && d.path !== 'https://project.meteteme.com/') {
|
||||
// 如果有 path 且 path 不等于指定值,则显示 path
|
||||
html += '<span>' + d.path + '</span>';
|
||||
}
|
||||
if (d.download_url) {
|
||||
// 如果有 download_url,则显示 download_url 并拼接 download_code
|
||||
var downloadCode = d.download_code || '-';
|
||||
html += '<span>' + d.download_url + ' 分享码:' + downloadCode + '</span>';
|
||||
}
|
||||
return html || '<span>-</span>'; // 如果都没有值,显示占位符
|
||||
}
|
||||
},
|
||||
// {
|
||||
// field: 'description',
|
||||
// title: '软件描述',
|
||||
// align: 'center',
|
||||
// rowspan: 2,
|
||||
// templet: function (d) {
|
||||
// var html = '<span>' + (d.description || '-') + '</span>';
|
||||
// return html;
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// field: 'uid',
|
||||
// title: '上传用户',
|
||||
// align: 'center',
|
||||
// width: 200,
|
||||
// rowspan: 2,
|
||||
// templet: function (d) {
|
||||
// var html = '<span>' + (d.uid || '-') + '</span>';
|
||||
// return html;
|
||||
// }
|
||||
// },
|
||||
{
|
||||
title: "操作",
|
||||
align: "center",
|
||||
width: 240,
|
||||
minWidth: 125,
|
||||
toolbar: "#barDemo",
|
||||
},
|
||||
]],
|
||||
done: function (res, curr, count) {
|
||||
// 仅在首次加载表格时保存原始数据
|
||||
if (originalData.length === 0) {
|
||||
originalData = res.data;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 搜索重置按钮
|
||||
$("#taskForm").on("click", '[lay-filter="clear"]', function () {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
table.on('tool(download)', function (obj) {
|
||||
var data = obj.data; // 获取当前行的数据
|
||||
|
||||
if (obj.event === 'edit') {
|
||||
var id = data.id; // 获取当前行数据的id
|
||||
var url = '/download/index/edit?id=' + id;
|
||||
tool.open(url);
|
||||
} else if (obj.event === 'delete') {
|
||||
layui.layer.confirm(
|
||||
"确定删除该软件吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
$.post(
|
||||
"/download/index/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);
|
||||
}
|
||||
);
|
||||
} else if (obj.event === 'view') {
|
||||
var id = data.id; // 获取当前行数据的id
|
||||
console.log('查看详情', id);
|
||||
// 查看详情
|
||||
layui.layer.open({
|
||||
type: 2, // iframe层
|
||||
title: '供应商详情',
|
||||
shadeClose: true,
|
||||
shade: 0.8,
|
||||
area: ['70%', '90%'], // 宽高
|
||||
content: '/download/index/view?id=' + id,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
</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-bg-red" lay-event="delete">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
261
app/download/view/index/view.html
Normal file
261
app/download/view/index/view.html
Normal file
@ -0,0 +1,261 @@
|
||||
<!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;
|
||||
}
|
||||
|
||||
.titles {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
padding: 20px 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.layui-table {
|
||||
width: 100%;
|
||||
table-layout: fixed;
|
||||
/* 固定表格布局,确保列宽固定 */
|
||||
}
|
||||
|
||||
.layui-table-form td {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
/* 不换行 */
|
||||
}
|
||||
|
||||
/* 除去特定的colspan=4单元格的均分计算 */
|
||||
.layui-table-form td:not(.layui-td-gray-2):not([colspan="4"]) {
|
||||
width: calc((100% - 200px) / 2);
|
||||
/* 计算其他td的宽度均分 */
|
||||
}
|
||||
|
||||
.layui-td-gray-2 {
|
||||
max-width: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
/* 针对业务范围和备注的样式 */
|
||||
.layui-table-form td[colspan="3"] {
|
||||
overflow: hidden;
|
||||
/* 隐藏溢出内容 */
|
||||
white-space: normal;
|
||||
/* 允许文本换行 */
|
||||
word-wrap: break-word;
|
||||
/* 自动换行 */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<div style="display: flex;align-items: center;justify-content: space-between;">
|
||||
<div>
|
||||
<h3 class="h3-title hover">
|
||||
<span id="name">供应商详情 - {$detail.supplier_name}</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div style="color: #969696;">创建日期:{$detail.create_time}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row border-b">
|
||||
<div>
|
||||
<div class="titles">基础信息</div>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">供应商名称
|
||||
</td>
|
||||
<td>
|
||||
{$detail.supplier_name|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">注册地址
|
||||
</td>
|
||||
<td>
|
||||
{$detail.registered_address|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">联系人名称
|
||||
</td>
|
||||
<td>
|
||||
{$detail.contact_name|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">联系电话
|
||||
</td>
|
||||
<td>
|
||||
{$detail.contact_phone|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">电子邮件
|
||||
</td>
|
||||
<td>
|
||||
{$detail.contact_email|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">微信
|
||||
</td>
|
||||
<td>
|
||||
{$detail.contact_wechat|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">规模
|
||||
</td>
|
||||
<td id="company-size">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">业务范围
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{$detail.business_scope|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="titles">开票信息</div>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">开票企业名称
|
||||
</td>
|
||||
<td style="max-width: 300px;">
|
||||
{$detail.invoice_company_name|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">纳税人识别号
|
||||
</td>
|
||||
<td>
|
||||
{$detail.taxpayer_id|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">开票地址
|
||||
</td>
|
||||
<td>
|
||||
{$detail.invoice_address|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">开票电话
|
||||
</td>
|
||||
<td>
|
||||
{$detail.invoice_phone|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">开户行
|
||||
</td>
|
||||
<td>
|
||||
{$detail.bank_name|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">开户帐号
|
||||
</td>
|
||||
<td>
|
||||
{$detail.bank_account|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="titles">其他</div>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注
|
||||
</td>
|
||||
<td colspan="4">
|
||||
{$detail.remarks|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合作意向
|
||||
</td>
|
||||
<td colspan="4">
|
||||
{$detail.intention|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</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); // 关闭弹出层
|
||||
})
|
||||
}
|
||||
|
||||
//规模转换
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var companySize = '{$detail.company_size|default="-"}'; // 获取公司规模数据
|
||||
var sizeText;
|
||||
|
||||
switch (companySize) {
|
||||
case '1':
|
||||
sizeText = '微型企业';
|
||||
break;
|
||||
case '2':
|
||||
sizeText = '小型企业';
|
||||
break;
|
||||
case '3':
|
||||
sizeText = '中型企业';
|
||||
break;
|
||||
case '4':
|
||||
sizeText = '大型企业';
|
||||
break;
|
||||
case '5':
|
||||
sizeText = '事业单位';
|
||||
break;
|
||||
case '6':
|
||||
sizeText = '国有企业';
|
||||
break;
|
||||
case '7':
|
||||
sizeText = '外企';
|
||||
break;
|
||||
case '8':
|
||||
sizeText = '其他';
|
||||
break;
|
||||
default:
|
||||
sizeText = '-'; // 默认值
|
||||
}
|
||||
|
||||
document.getElementById('company-size').textContent = sizeText;
|
||||
});
|
||||
|
||||
</script>
|
||||
<script src="/static/assets/layui/layui.js"></script>
|
||||
<script src="/static/assets/gougu/gouguInit.js"></script>
|
||||
@ -11,12 +11,57 @@ namespace app\information\controller;
|
||||
use app\base\BaseController;
|
||||
use app\model\Information as InformationList;
|
||||
use app\business_info\validate\InformationCheck;
|
||||
use Error;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Index extends BaseController
|
||||
{
|
||||
// 查询 IP 地址
|
||||
public function ipquery($ip)
|
||||
{
|
||||
$url = "https://cn.apihz.cn/api/ip/chaapi.php?ip={$ip}&id=10001344&key=3cffc3ad20630afffe65c3b908d6ebd4";
|
||||
$response = @file_get_contents($url);
|
||||
if ($response) {
|
||||
$ipData = json_decode($response, true);
|
||||
if ($ipData && isset($ipData['ip'])) {
|
||||
$q = "{$ipData['msg']}({$ipData['ip']})";
|
||||
if (is_string($q)) {
|
||||
return $q;
|
||||
}
|
||||
}
|
||||
}
|
||||
return '接口每分钟查询次数用完,请稍后再试';
|
||||
}
|
||||
|
||||
public function translateToChinese($q)
|
||||
{
|
||||
$id = 10001344;
|
||||
$key = '3cffc3ad20630afffe65c3b908d6ebd4 ';
|
||||
|
||||
// 构造请求URL
|
||||
$url = "https://cn.apihz.cn/api/zici/fanyiapihz.php?id=" . $id . "&key=" . $key . "&words=" . $q . "&ytype=1&etype=2&htype=0";
|
||||
|
||||
//调试输出语句
|
||||
var_dump($url);
|
||||
|
||||
// 发送请求并获取响应
|
||||
$response = @file_get_contents($url);
|
||||
|
||||
// 处理响应
|
||||
if ($response) {
|
||||
$data = json_decode($response, true);
|
||||
if (isset($data['translation'][0])) {
|
||||
return $data['translation'][0]; // 返回翻译结果
|
||||
}
|
||||
}
|
||||
|
||||
// 返回错误信息
|
||||
return $q;
|
||||
}
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
@ -28,21 +73,23 @@ class Index extends BaseController
|
||||
->order('id desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$bi = Db::name('Information')->where(['id' => $item->id])->find();
|
||||
|
||||
// 获取对应product id的name
|
||||
$product = Db::name('Product')->where(['id' => $bi['product']])->find();
|
||||
$productName = $product ? $product['name'] : '';
|
||||
|
||||
$item->name = $bi['name'];
|
||||
$item->email = $bi['email'];
|
||||
$item->phone = $bi['phone'];
|
||||
$item->message = $bi['message'];
|
||||
$item->product = $productName; // 将产品名称传递给前端
|
||||
$item->company = $bi['company'];
|
||||
$item->create_time = $bi['create_time'];
|
||||
$item->update_time = $bi['update_time'];
|
||||
$item->delete_time = $bi['delete_time'];
|
||||
// 这里简化查询逻辑,避免重复查询
|
||||
$item->product = Db::name('Product')->where('id', $item->product)->value('name') ?: '';
|
||||
$item->ip = $this->ipquery($item->ip); // 调用 ipquery 方法查询 IP 数据
|
||||
switch ($item->status) {
|
||||
case 0:
|
||||
$item->status = '新商机';
|
||||
break;
|
||||
case 1:
|
||||
$item->status = '已跟进';
|
||||
break;
|
||||
case 2:
|
||||
$item->status = '已转化';
|
||||
break;
|
||||
case 3:
|
||||
$item->status = '已关闭';
|
||||
break;
|
||||
}
|
||||
})
|
||||
->filter(function ($item) {
|
||||
return $item->delete_time === null;
|
||||
@ -60,7 +107,7 @@ class Index extends BaseController
|
||||
try {
|
||||
// 查询数据,分页设置每页10条
|
||||
$list = Db::name('Information')
|
||||
// ->field('id, title, content, create_time, update_time') // 选择所需字段
|
||||
// ->field('id, title, content, create_time, update_time') // 选择所需字段
|
||||
->order('id desc') // 按 id 倒序排序
|
||||
->paginate(10); // 每页10条记录
|
||||
|
||||
@ -188,52 +235,10 @@ class Index extends BaseController
|
||||
$detail = (new InformationList())->detail($id);
|
||||
// print_r($id);
|
||||
if (empty($detail)) {
|
||||
return to_assign(1, '2.信息不存在');
|
||||
return to_assign(1, '无法查询到详情信息');
|
||||
} else {
|
||||
if ($this->uid != $detail['admin_id']) { // 当前登录用户必须是上传者才能查看
|
||||
return to_assign(1, '您没权限查看该信息');
|
||||
}
|
||||
$role_uid = [$detail['admin_id'], $detail['director_uid']];
|
||||
$role_edit = 'edit';
|
||||
$view_uid = $role_uid;
|
||||
// if (!empty($detail['check_admin_ids'])) {
|
||||
// $view_uid = array_merge($role_uid, explode(",", $detail['check_admin_ids']));
|
||||
// }
|
||||
if (!in_array($this->uid, $view_uid) && $detail['is_open'] == 1) {
|
||||
return to_assign(1, '您没权限查看该信息');
|
||||
}
|
||||
$contact_array = Db::name('Businesscontact')
|
||||
->field('i.id,i.business_id,i.contact,i.post,i.phone,i.email,i.wechat,i.qq,a.name as admin_name')
|
||||
->alias('i')
|
||||
->join('Admin a', 'i.admin_id = a.id', 'LEFT')
|
||||
->join('Information b', 'i.business_id = b.id', 'LEFT')
|
||||
->order('i.create_time desc')
|
||||
->where(array('i.business_id' => $id))
|
||||
->where('i.delete_time', null)
|
||||
->select()->toArray();
|
||||
|
||||
$file_array = Db::name('FileInterfix')
|
||||
->field('i.id,i.topic_id,i.admin_id,f.name,f.filesize,f.filepath,a.name as admin_name')
|
||||
->alias('i')
|
||||
->join('File f', 'i.file_id = f.id', 'LEFT')
|
||||
->join('Admin a', 'i.admin_id = a.id', 'LEFT')
|
||||
->order('i.create_time desc')
|
||||
->where(array('i.topic_id' => $id, 'i.module' => 'picbed'))
|
||||
->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' => 'picbed', 'delete_time' => 0))
|
||||
->select()->toArray();
|
||||
View::assign('detail', $detail);
|
||||
View::assign('contact_array', $contact_array);
|
||||
View::assign('file_array', $file_array);
|
||||
View::assign('link_array', $link_array);
|
||||
View::assign('role_edit', $role_edit);
|
||||
View::assign('id', $id);
|
||||
// print_r($detail);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
@ -267,4 +272,5 @@ class Index extends BaseController
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
0
app/information/view/index/conversion.html
Normal file
0
app/information/view/index/conversion.html
Normal file
0
app/information/view/index/follow.html
Normal file
0
app/information/view/index/follow.html
Normal file
@ -3,7 +3,9 @@
|
||||
{block name="breadcrumb"}
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="http://www.meteteme.com/" target="_blank">江苏美天科技</a>
|
||||
<a href="/business/index/nav"><cite>CRM</cite></a>
|
||||
<a href="/application/nav/index">
|
||||
<cite>应用</cite>
|
||||
</a>
|
||||
<a><cite>商机管理</cite></a>
|
||||
</span>
|
||||
{/block} {block name="body"}
|
||||
@ -20,82 +22,22 @@
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ["tool", "gouguEdit", "gouguComment"];
|
||||
const moduleInit = ['tool', 'gouguEdit', 'gouguComment'];
|
||||
|
||||
function gouguInit() {
|
||||
var table = layui.table;
|
||||
var tool = layui.tool;
|
||||
|
||||
//新增商机按钮
|
||||
$(".add-new").on("click", function () {
|
||||
tool.open("/information/index/add");
|
||||
});
|
||||
|
||||
// 删除单条数据
|
||||
table.on("tool(information)", function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === "delete") {
|
||||
layui.layer.confirm(
|
||||
"确定删除该商机吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
$.post(
|
||||
"/information/index/delete",
|
||||
{ id: data.id },
|
||||
function (res) {
|
||||
if (res.code === 0) {
|
||||
// layui.layer.msg("删除成功");
|
||||
layui.layer.msg(res.msg);
|
||||
obj.del();
|
||||
} else {
|
||||
// layui.layer.msg("删除失败");
|
||||
layui.layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
layui.layer.close(index);
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
// 批量删除数据
|
||||
$("#delete-btn").on("click", function () {
|
||||
var checkStatus = table.checkStatus("information");
|
||||
var data = checkStatus.data;
|
||||
if (data.length === 0) {
|
||||
layui.layer.msg("请勾选要删除的商机");
|
||||
return;
|
||||
}
|
||||
layui.layer.confirm(
|
||||
"确定删除选中的商机吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
var ids = [];
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
ids.push(data[i].id);
|
||||
}
|
||||
$.post(
|
||||
"/information/index/batchDelete",
|
||||
{ ids: ids },
|
||||
function (res) {
|
||||
if (res.code === 0) {
|
||||
layui.layer.msg(res.msg);
|
||||
loadTableData();
|
||||
} else {
|
||||
layui.layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
layui.layer.close(index);
|
||||
}
|
||||
);
|
||||
});
|
||||
var table = layui.table,
|
||||
form = layui.form,
|
||||
tool = layui.tool;
|
||||
|
||||
function loadTableData() {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
|
||||
// 刷新按钮
|
||||
$("#refresh-btn").on("click", function () {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#information",
|
||||
title: "商机列表",
|
||||
@ -109,7 +51,7 @@
|
||||
{ field: "checkbox", type: "checkbox" }, // 添加复选框列
|
||||
{
|
||||
field: "id",
|
||||
title: "商机编号",
|
||||
title: "编号",
|
||||
width: 80,
|
||||
align: "center",
|
||||
rowspan: 2,
|
||||
@ -117,6 +59,25 @@
|
||||
return "BI - " + d.id;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "status",
|
||||
title: "状态",
|
||||
align: "center",
|
||||
width: 80,
|
||||
rowspan: 2,
|
||||
},
|
||||
{
|
||||
field: "company",
|
||||
title: "企业名称",
|
||||
align: "center",
|
||||
// width: 180,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="a1-' + d.company + '">' + d.company + "</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "name",
|
||||
title: "商机联系人",
|
||||
@ -129,18 +90,6 @@
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "email",
|
||||
title: "电子邮箱",
|
||||
align: "center",
|
||||
width: 170,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="a1-' + d.email + '">' + d.email + "</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "phone",
|
||||
title: "联系电话",
|
||||
@ -154,19 +103,31 @@
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "message",
|
||||
title: "商机留言",
|
||||
field: "email",
|
||||
title: "电子邮箱",
|
||||
align: "center",
|
||||
width: 170,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="a1-' + d.message + '">' + d.message + "</span>";
|
||||
'<span class="a1-' + d.email + '">' + d.email + "</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
// {
|
||||
// field: "message",
|
||||
// title: "商机留言",
|
||||
// align: "center",
|
||||
// rowspan: 2,
|
||||
// templet: function (d) {
|
||||
// var html =
|
||||
// '<span>' + d.message + "</span>";
|
||||
// return html;
|
||||
// },
|
||||
// },
|
||||
{
|
||||
field: "product",
|
||||
title: "所属项目",
|
||||
title: "咨询产品",
|
||||
width: 200,
|
||||
align: "center",
|
||||
rowspan: 2,
|
||||
@ -177,16 +138,11 @@
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "company",
|
||||
title: "企业名称",
|
||||
field: "ip",
|
||||
title: "IP地址",
|
||||
align: "center",
|
||||
width: 180,
|
||||
// width: 180,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="a1-' + d.company + '">' + d.company + "</span>";
|
||||
return html;
|
||||
},
|
||||
},
|
||||
{
|
||||
field: "create_time",
|
||||
@ -198,7 +154,7 @@
|
||||
{
|
||||
title: "操作",
|
||||
align: "center",
|
||||
width: 180,
|
||||
width: 280,
|
||||
minWidth: 125,
|
||||
toolbar: "#barDemo",
|
||||
},
|
||||
@ -243,12 +199,132 @@
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
//新增商机按钮
|
||||
$(".add-new").on("click", function () {
|
||||
tool.open("/information/index/add");
|
||||
});
|
||||
|
||||
// // 删除单条数据
|
||||
// table.on("tool(information)", function (obj) {
|
||||
// var data = obj.data;
|
||||
// if (obj.event === "delete") {
|
||||
// layui.layer.confirm(
|
||||
// "确定删除该商机吗?",
|
||||
// { icon: 3, title: "提示" },
|
||||
// function (index) {
|
||||
// $.post(
|
||||
// "/information/index/delete",
|
||||
// { id: data.id },
|
||||
// function (res) {
|
||||
// if (res.code === 0) {
|
||||
// // layui.layer.msg("删除成功");
|
||||
// layui.layer.msg(res.msg);
|
||||
// obj.del();
|
||||
// } else {
|
||||
// // layui.layer.msg("删除失败");
|
||||
// layui.layer.msg(res.msg);
|
||||
// }
|
||||
// }
|
||||
// );
|
||||
// layui.layer.close(index);
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
// });
|
||||
|
||||
table.on('tool(information)', function (obj) {
|
||||
var data = obj.data;
|
||||
var id = data.id;
|
||||
// console.log(data);
|
||||
if (obj.event === 'edit') {
|
||||
var url = '/information/index/edit?id=' + id;
|
||||
tool.open(url);
|
||||
} else if (obj.event === 'delete') {
|
||||
layui.layer.confirm(
|
||||
"确定删除该数据吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
$.post(
|
||||
"/information/index/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);
|
||||
}
|
||||
);
|
||||
} else if (obj.event === 'conversion') {
|
||||
var url = '/information/index/conversion?id=' + id;
|
||||
tool.open(url);
|
||||
} else if (obj.event === 'follow') {
|
||||
var url = '/information/index/follow?id=' + id;
|
||||
tool.open(url);
|
||||
} else if (obj.event === 'view') {
|
||||
console.log('查看详情', id);
|
||||
// 查看详情
|
||||
layui.layer.open({
|
||||
type: 2, // iframe层
|
||||
title: '商机详情',
|
||||
shadeClose: true,
|
||||
shade: 0.8,
|
||||
area: ['70%', '90%'], // 宽高
|
||||
content: '/information/index/view?id=' + id,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 批量删除数据
|
||||
$("#delete-btn").on("click", function () {
|
||||
var checkStatus = table.checkStatus("information");
|
||||
var data = checkStatus.data;
|
||||
if (data.length === 0) {
|
||||
layui.layer.msg("请勾选要删除的商机");
|
||||
return;
|
||||
}
|
||||
layui.layer.confirm(
|
||||
"确定删除选中的数据吗?",
|
||||
{ icon: 3, title: "提示" },
|
||||
function (index) {
|
||||
var ids = [];
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
ids.push(data[i].id);
|
||||
}
|
||||
$.post(
|
||||
"/information/index/batchDelete",
|
||||
{ ids: ids },
|
||||
function (res) {
|
||||
if (res.code === 0) {
|
||||
layui.layer.msg(res.msg);
|
||||
loadTableData();
|
||||
} else {
|
||||
layui.layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
layui.layer.close(index);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="barDemo">
|
||||
<a class="layui-btn layui-btn-sm " lay-event="detail">查看详情</a>
|
||||
{{# if(d.is_conversion == 0){ }}
|
||||
<a class="layui-btn layui-btn-sm" lay-event="conversion" style="width: 58px;">转化</a>
|
||||
{{# } else { }}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-disabled">已转化</a>
|
||||
{{# } }}
|
||||
<a class="layui-btn layui-btn-sm" lay-event="follow">跟进</a>
|
||||
<a class="layui-btn layui-btn-sm" lay-event="view">详情</a>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-normal" lay-event="delete">删除</a>
|
||||
</script>
|
||||
{/block}
|
||||
@ -1,467 +1,255 @@
|
||||
<div class="page-content">
|
||||
<!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;
|
||||
}
|
||||
|
||||
.titles {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
padding: 20px 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.layui-table {
|
||||
width: 100%;
|
||||
table-layout: fixed;
|
||||
/* 固定表格布局,确保列宽固定 */
|
||||
}
|
||||
|
||||
.layui-table-form td {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
/* 不换行 */
|
||||
}
|
||||
|
||||
/* 除去特定的colspan=4单元格的均分计算 */
|
||||
.layui-table-form td:not(.layui-td-gray-2):not([colspan="4"]) {
|
||||
width: calc((100% - 200px) / 2);
|
||||
/* 计算其他td的宽度均分 */
|
||||
}
|
||||
|
||||
.layui-td-gray-2 {
|
||||
max-width: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
/* 针对业务范围和备注的样式 */
|
||||
.layui-table-form td[colspan="3"] {
|
||||
overflow: hidden;
|
||||
/* 隐藏溢出内容 */
|
||||
white-space: normal;
|
||||
/* 允许文本换行 */
|
||||
word-wrap: break-word;
|
||||
/* 自动换行 */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<h3 class="h3-title hover-{$role_edit}">
|
||||
<span id="name">商务信息 - </span>
|
||||
<span id="name_{$detail.id}" data-val="">{$detail.name}</span>
|
||||
<i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}" data-name="name"></i>
|
||||
</h3>
|
||||
<div style="display: flex;align-items: center;justify-content: space-between;">
|
||||
<div>
|
||||
<span class="layui-badge layui-bg-gray">#B{$detail.id}</span>
|
||||
<span class="mx-2">{$detail.admin_name}</span>
|
||||
<span class="font-gray">创建于{$detail.times}<span id="editTips">{gt name="$detail.update_time" value="0"},最近更新于 {:time_trans($detail.update_time)}{/gt}</span>
|
||||
</span>
|
||||
{eq name="$detail.admin_id" value="$params.uid"}
|
||||
<span class="layui-btn layui-btn-xs layui-btn-danger ml-4" id="delBtn">
|
||||
<i class="layui-icon"></i>删除
|
||||
</span>
|
||||
{/eq}
|
||||
<h3 class="h3-title hover">
|
||||
<span id="name">商机详情 - {$detail.company}</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div style="color: #969696;">创建日期:{$detail.create_time}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row border-b">
|
||||
<div class="layui-col-md9 p-4 border-r">
|
||||
<div>
|
||||
<div class="titles">基础信息</div>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">创建人</td>
|
||||
<td colspan="5" class="hover-{$role_edit}">
|
||||
<span >{$detail.admin_name}</span>
|
||||
<td class="layui-td-gray-2">商机编号
|
||||
</td>
|
||||
<td class="layui-td-gray">访问权限</td>
|
||||
<td class="hover-{$role_edit}">
|
||||
<span id="is_open_{$detail.id}" data-val="{$detail.is_open}">
|
||||
{eq name="$detail.is_open" value="1" }
|
||||
内部 <span class="font-gray">(仅创建人、对接人、可访问)</span>
|
||||
{/eq}
|
||||
{eq name="$detail.is_open" value="2" }公开 <span class="font-gray">(有对接权限员工均可访问)</span>{/eq}
|
||||
</span>
|
||||
<i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}" data-name="is_open"></i>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">主要对接人</td>
|
||||
<td colspan="5" class="hover-{$role_edit}">
|
||||
<span id="director_uid_{$detail.id}" data-val="{$detail.director_uid}">{$detail.director_name}</span>
|
||||
<i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}" data-name="director_uid"></i>
|
||||
</td>
|
||||
<td class="layui-td-gray">内部可对接人员</td>
|
||||
<td colspan="5" class="hover-{$role_edit}">
|
||||
<span id="check_admin_ids_{$detail.id}" data-val="{$detail.check_admin_ids}">{$detail.check_admin_names}</span>
|
||||
<i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}" data-name="check_admin_ids"></i>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="md-content-content hover-{$role_edit}">
|
||||
<h5 class="py-4">备注信息<i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}" data-name="md_content"></i></h5>
|
||||
<div class="md_content" id="md_content_{$detail.id}" data-val="{$detail.md_content}">{$detail.md_content|raw}</div>
|
||||
</div>
|
||||
<div class="md-content-content hover-{$role_edit}">
|
||||
<h5 class="py-4">联系人
|
||||
<span data-method="setTop" id="contactadd" class="layui-btn layui-btn-xs layui-btn ml-4">
|
||||
<i class="layui-icon"></i>新增
|
||||
</span>
|
||||
</h5>
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="10%" style="text-align:center">联系人</th>
|
||||
<th width="10%" style="text-align:center">职务</th>
|
||||
<th width="15%" style="text-align:center">电话</th>
|
||||
<th width="15%" style="text-align:center">邮箱</th>
|
||||
<th width="10%" style="text-align:center">微信</th>
|
||||
<th width="10%" style="text-align:center">QQ</th>
|
||||
<th width="10%" style="text-align:center">创建人</th>
|
||||
<th width="20%" style="text-align:center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="contactList">
|
||||
{volist name="contact_array" id="vo"}
|
||||
<tr data-id="{$vo.id}" id="contact_{$vo.id}">
|
||||
<td style="text-align: center;">{$vo.contact}</td>
|
||||
<td style="text-align: center;">{$vo.post}</td>
|
||||
<td style="text-align: center;">{$vo.phone}</td>
|
||||
<td style="text-align: center;">{$vo.email}</td>
|
||||
<td style="text-align: center;">{$vo.wechat}</td>
|
||||
<td style="text-align: center;">{$vo.qq}</td>
|
||||
<td style="text-align: center;">{$detail.admin_name}</td>
|
||||
<td style="text-align: center;">
|
||||
<!-- <a class="layui-btn layui-btn-xs" id="contactedit" data-event="edit" data-id="1000">修改</a>-->
|
||||
<a class="layui-btn layui-btn-xs" data-id="{$vo.id}" data-contact="{$vo.contact}" data-post="{$vo.post}" data-phone="{$vo.phone}" data-email="{$vo.email}" data-wechat="{$vo.wechat}" data-qq="{$vo.qq}" id="contactedit" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs" data-id="{$vo.id}" id="contactdel" >删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{empty name="$contact_array" }
|
||||
<tr>
|
||||
<td colspan="8" class="content-none">暂无其他联系人</td>
|
||||
</tr>
|
||||
{/empty}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="detail-file">
|
||||
<h5 class="py-4">文件附件</h5>
|
||||
<div>
|
||||
{eq name="$role_edit" value="edit"}
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="flieBtn">选择文件并上传</button>
|
||||
<span style="color:#FF5722; font-size:12px; margin-left: 8px;">上传前,请规范命名,最大只能上传{:get_system_info('upload_max_filesize')}的文件,超过请压缩成多个文件上传。</span>
|
||||
<div class="layui-upload-list" {empty name="$file_array" }style="display:none;" {/empty}>
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60%" style="text-align:center">文件名</th>
|
||||
<th width="15%" style="text-align:center">文件大小</th>
|
||||
<th width="10%" style="text-align:center">上传人</th>
|
||||
<th width="15%" style="text-align:center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="flieList">
|
||||
{volist name="file_array" id="vo"}
|
||||
<tr>
|
||||
<td>{$vo.name}</td>
|
||||
<td style="text-align: center;">{$vo.filesize/1048576|round=2}MB</td>
|
||||
<td style="text-align: center;">{$vo.admin_name}</td>
|
||||
<td style="text-align: center;">
|
||||
<div class="layui-btn-group">
|
||||
<a class="layui-btn layui-btn-xs "
|
||||
href="{$vo.filepath}" download="{$vo.name}"
|
||||
data-id="{$vo.id}">下载</a>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-danger file-delete" data-uid="{$vo.admin_id}" data-id="{$vo.id}">删除</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60%">文件名</th>
|
||||
<th width="15%" style="text-align:center">文件大小</th>
|
||||
<th width="10%" style="text-align:center">上传人</th>
|
||||
<th width="15%" style="text-align:center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="flieList">
|
||||
{volist name="file_array" id="vo"}
|
||||
<tr data-id="{$vo.id}" id="flie_{$vo.id}">
|
||||
<td>{$vo.name}</td>
|
||||
<td style="text-align: center;">{$vo.filesize/1048576|round=2}MB</td>
|
||||
<td style="text-align: center;">{$vo.admin_name}</td>
|
||||
<td style="text-align: center;">
|
||||
<a class="layui-btn layui-btn-xs" href="{$vo.filepath}" download="{$vo.name}" data-id="{$vo.id}">下载</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{empty name="$file_array" }
|
||||
<tr>
|
||||
<td colspan="4" class="content-none">暂无附件</td>
|
||||
</tr>
|
||||
{/empty}
|
||||
</tbody>
|
||||
</table>
|
||||
{/eq}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-link">
|
||||
<h5 class="py-4">关联链接</h5>
|
||||
<div>
|
||||
{eq name="$role_edit" value="edit"}
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="linkBtn">新增相关联链接</button>
|
||||
<span style="color:#FF5722; font-size:12px; margin-left: 8px;">请规范填写链接说明,方便大家查阅。</span>
|
||||
<div class="layui-upload-list" {empty name="$link_array" }style="display:none;" {/empty}>
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60%">链接</th>
|
||||
<th width="15%" style="text-align:center">说明</th>
|
||||
<th width="10%" style="text-align:center">添加人</th>
|
||||
<th width="15%" style="text-align:center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="linkList">
|
||||
{volist name="link_array" id="vo"}
|
||||
<tr data-id="{$vo.id}" id="link_{$vo.id}">
|
||||
<td>
|
||||
<a href="{$vo.url}" target="_blank">{$vo.url}</a>
|
||||
{$detail.id|default="-"}
|
||||
</td>
|
||||
<td>{$vo.desc}</td>
|
||||
<td style="text-align: center;">{$vo.admin_name}</td>
|
||||
<td style="text-align: center;">
|
||||
<div class="layui-btn-group">
|
||||
<span class="layui-btn layui-btn-xs link-edit" data-id="{$vo.id}" data-url="{$vo.url}" data-desc="{$vo.desc}">编辑</span>
|
||||
<span class="layui-btn layui-btn-xs layui-btn-danger link-delete" data-uid="{$vo.admin_id}" data-id="{$vo.id}">删除</span>
|
||||
</div>
|
||||
<td class="layui-td-gray-2" id="status">商机状态
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60%">链接</th>
|
||||
<th width="30%" style="text-align:center">说明</th>
|
||||
<th width="10%" style="text-align:center">添加人</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="linkList">
|
||||
{volist name="link_array" id="vo"}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{$vo.url}" target="_blank">{$vo.url}</a>
|
||||
{$detail.status|default="-"}
|
||||
</td>
|
||||
<td>{$vo.desc}</td>
|
||||
<td style="text-align: center;">{$vo.admin_name}</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{empty name="$link_array" }
|
||||
<tr>
|
||||
<td colspan="3" class="content-none">暂无链接</td>
|
||||
<td class="layui-td-gray-2">企业名称
|
||||
</td>
|
||||
<td>
|
||||
{$detail.company|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">联系人
|
||||
</td>
|
||||
<td>
|
||||
{$detail.name|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">电子邮件
|
||||
</td>
|
||||
<td>
|
||||
{$detail.email|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">电话
|
||||
</td>
|
||||
<td>
|
||||
{$detail.phone|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">咨询产品
|
||||
</td>
|
||||
<td>
|
||||
{$detail.product|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">商机归属地IP
|
||||
</td>
|
||||
<td>
|
||||
{$detail.ip|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">需求概述
|
||||
</td>
|
||||
<td colspan="3">
|
||||
{$detail.message|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
{/empty}
|
||||
</tbody>
|
||||
</table>
|
||||
{/eq}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="layui-tab layui-tab-brief px-4" lay-filter="docDemoTabBrief">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">互动评论({$detail.comments})</li>
|
||||
<li>操作日志({$detail.logs})</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content p-0">
|
||||
<div class="layui-tab-item comment-list layui-show">
|
||||
<div class="comment-input my-2">
|
||||
<input type="text" id="commentInput" readonly placeholder="发表一下你的看法" class="layui-input" value="">
|
||||
</div>
|
||||
<div id="comment_business_{$detail.id}"></div>
|
||||
</div>
|
||||
<div class="layui-tab-item logs-list">
|
||||
<div id="log_business_{$detail.id}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div>
|
||||
<div class="titles">开票信息</div>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">开票企业名称
|
||||
</td>
|
||||
<td style="max-width: 300px;">
|
||||
{$detail.invoice_company_name|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">纳税人识别号
|
||||
</td>
|
||||
<td>
|
||||
{$detail.taxpayer_id|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">开票地址
|
||||
</td>
|
||||
<td>
|
||||
{$detail.invoice_address|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">开票电话
|
||||
</td>
|
||||
<td>
|
||||
{$detail.invoice_phone|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">开户行
|
||||
</td>
|
||||
<td>
|
||||
{$detail.bank_name|default="-"}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">开户帐号
|
||||
</td>
|
||||
<td>
|
||||
{$detail.bank_account|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div> -->
|
||||
|
||||
<!-- <div>
|
||||
<div class="titles">其他</div>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注
|
||||
</td>
|
||||
<td colspan="4">
|
||||
{$detail.remarks|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合作意向
|
||||
</td>
|
||||
<td colspan="4">
|
||||
{$detail.intention|default="-"}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="close">
|
||||
<button class="layui-btn layui-btn-normal" lay-event="close">关闭页面</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
function openInit() {
|
||||
const detail_id = '{$detail.id}';
|
||||
var layer = layui.layer, tool = layui.tool, edit = layui.gouguEdit, comment = layui.gouguComment,
|
||||
upload = layui.upload;
|
||||
|
||||
$('.hover-edit').hover(function () {
|
||||
$(this).addClass('hover-on');
|
||||
}, function () {
|
||||
$(this).removeClass('hover-on');
|
||||
})
|
||||
|
||||
$('.hover-edit').on('click', 'i', function () {
|
||||
let name = $(this).data('name');
|
||||
let show_txt = $('#' + name + '_' + detail_id).text().replace(/[\r\n\t]/g, "");
|
||||
let real_txt = $('#' + name + '_' + detail_id).data('val');
|
||||
if (real_txt === '') {
|
||||
real_txt = show_txt;
|
||||
}
|
||||
editShow(detail_id, name, show_txt, real_txt);
|
||||
})
|
||||
|
||||
$('#delBtn').on('click', function () {
|
||||
layer.confirm('确定要删除该产品吗?请慎重', {icon: 3, title: '提示'}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
location.reload();
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
let postData = {"id": detail_id};
|
||||
tool.delete("/business/index/delete", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
//添加联系人
|
||||
$('#contactadd').on('click', function () {
|
||||
comment.addContact(detail_id,'business');
|
||||
})
|
||||
|
||||
//编辑联系人
|
||||
$('#contactedit').on('click', function () {
|
||||
let id = $(this).data('id');
|
||||
let topic_id = $(this).data('topic_id');
|
||||
let contact = $(this).data('contact');
|
||||
let post = $(this).data('post');
|
||||
let phone = $(this).data('phone');
|
||||
let email = $(this).data('email');
|
||||
let wechat = $(this).data('wechat');
|
||||
let qq = $(this).data('qq');
|
||||
comment.editContact(id,topic_id, detail_id, 'business', contact, post, phone, email, wechat, qq);
|
||||
|
||||
})
|
||||
|
||||
//删除联系人
|
||||
$('#contactdel').on('click', function () {
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要删除该联系人吗?', {icon: 3, title: '提示'}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
tool.load("/business/index/view?id=" + detail_id);
|
||||
}
|
||||
let postData = {"id": id};
|
||||
tool.delete("/api/business/delete_contact", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
|
||||
upload.render({
|
||||
elem: '#flieBtn'
|
||||
, url: '/api/index/upload'
|
||||
, accept: 'file' //普通文件
|
||||
, exts: 'jpeg|jpg|png|gif|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z' //只允许上传文件
|
||||
, before: function (obj) {
|
||||
layer.msg('上传中...', {time: 3600000});
|
||||
}
|
||||
, done: function (res, index, upload) {
|
||||
let callback = function (e) {
|
||||
layer.msg('上传成功');
|
||||
tool.load("/business/index/view?id=" + detail_id);
|
||||
}
|
||||
let postData = {
|
||||
'topic_id': detail_id,
|
||||
'file_id': res.data.id,
|
||||
'file_name': res.data.name,
|
||||
'module': 'business'
|
||||
};
|
||||
tool.post("/api/appendix/add", postData, callback);
|
||||
}
|
||||
, error: function (index, upload) {
|
||||
layer.msg('上传失败');
|
||||
}
|
||||
});
|
||||
|
||||
$('#flieList').on('click', '.file-delete', function () {
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要删除该附件吗?', {icon: 3, title: '提示'}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
tool.load("/business/index/view?id=" + detail_id);
|
||||
}
|
||||
let postData = {"id": id};
|
||||
tool.delete("/api/appendix/delete", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
$('#linkBtn').on('click', function () {
|
||||
comment.addLink(0, detail_id, 'business', '', '');
|
||||
})
|
||||
|
||||
$('#linkList').on('click', '.link-edit', function () {
|
||||
let id = $(this).data('id');
|
||||
let url = $(this).data('url');
|
||||
let desc = $(this).data('desc');
|
||||
comment.addLink(id, detail_id, 'business', url, desc);
|
||||
})
|
||||
|
||||
$('#linkList').on('click', '.link-delete', function () {
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要删除该链接吗?', {icon: 3, title: '提示'}, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
tool.load("/business/index/view?id=" + detail_id);
|
||||
}
|
||||
let postData = {"id": id};
|
||||
tool.delete("/api/appendix/delete_link", postData, callback);
|
||||
});
|
||||
})
|
||||
|
||||
//评论
|
||||
comment.load(detail_id, 'business');
|
||||
$('#commentInput').on('click', function () {
|
||||
comment.editor(0, detail_id, 0, 0, 'business', '');
|
||||
})
|
||||
//回复
|
||||
$('#comment_business_' + detail_id).on('click', '[data-event="replay"]', function () {
|
||||
let pid = $(this).data('id');
|
||||
let padmin_id = $(this).data('uid');
|
||||
comment.editor(0, detail_id, pid, padmin_id, 'business', '');
|
||||
})
|
||||
//编辑
|
||||
$('#comment_business_' + detail_id).on('click', '[data-event="edit"]', function () {
|
||||
let id = $(this).data('id');
|
||||
let mdcontent = $('#comment_' + id).data('mdcontent');
|
||||
comment.editor(id, detail_id, 0, 0, 'business', mdcontent);
|
||||
})
|
||||
|
||||
//删除
|
||||
$('#comment_business_' + detail_id).on('click', '[data-event="del"]', function () {
|
||||
let id = $(this).data('id');
|
||||
comment.del(id, detail_id, 'business');
|
||||
})
|
||||
|
||||
//操作记录
|
||||
comment.log(detail_id, 'business');
|
||||
|
||||
let loading = false;
|
||||
let editPost = function (id, name, show_val, real_val) {
|
||||
let callback = function (e) {
|
||||
if (e.code == 0) {
|
||||
layer.closeAll();
|
||||
tool.load('/business/index/view/id/' + id);
|
||||
if (layui.pageTable) {
|
||||
setTimeout(function () {
|
||||
layui.pageTable.reload();
|
||||
}, 400)
|
||||
}
|
||||
} else {
|
||||
layer.msg(e.msg);
|
||||
}
|
||||
}
|
||||
let postData = {id: id};
|
||||
postData[name] = real_val;
|
||||
if (name == 'md_content') {
|
||||
postData['content'] = show_val;
|
||||
}
|
||||
tool.post("/business/index/add", postData, callback);
|
||||
}
|
||||
|
||||
function editShow(id, name, show_txt, real_txt) {
|
||||
if (loading == true) {
|
||||
return false;
|
||||
}
|
||||
if (name == "name") {
|
||||
edit.text(id, name, real_txt, editPost);
|
||||
}
|
||||
if (name == "director_uid") {
|
||||
edit.employee_one(id, name, show_txt, real_txt, editPost);
|
||||
}
|
||||
if (name == "check_admin_ids") {
|
||||
edit.employee_more(id, name, show_txt, real_txt, editPost);
|
||||
}
|
||||
if (name == "is_open") {
|
||||
let data = [
|
||||
{'id': 1, 'title': '内部(仅创建人、对接人、可访问)'},
|
||||
{'id': 2, 'title': '公开(有对接权限员工均可访问)'}
|
||||
];
|
||||
edit.select_type(id, name, real_txt, data, editPost);
|
||||
}
|
||||
if (name == "md_content") {
|
||||
edit.editor(id, name, real_txt, editPost);
|
||||
}
|
||||
}
|
||||
}
|
||||
</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); // 关闭弹出层
|
||||
})
|
||||
}
|
||||
|
||||
// //状态转换
|
||||
// document.addEventListener('DOMContentLoaded', function () {
|
||||
// var Status = '{$detail.status|default="-"}';
|
||||
// var sizeText;
|
||||
|
||||
// switch (Status) {
|
||||
// case '0':
|
||||
// sizeText = '新商机';
|
||||
// break;
|
||||
// case '1':
|
||||
// sizeText = '已跟进';
|
||||
// break;
|
||||
// case '2':
|
||||
// sizeText = '已转化';
|
||||
// break;
|
||||
// case '3':
|
||||
// sizeText = '已关闭';
|
||||
// break;
|
||||
// default:
|
||||
// sizeText = '-'; // 默认值
|
||||
// }
|
||||
|
||||
// document.getElementById('status').textContent = sizeText;
|
||||
// });
|
||||
|
||||
</script>
|
||||
<script src="/static/assets/layui/layui.js"></script>
|
||||
<script src="/static/assets/gougu/gouguInit.js"></script>
|
||||
34
app/model/Download.php
Normal file
34
app/model/Download.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
namespace app\model;
|
||||
|
||||
use think\facade\Db;
|
||||
use think\Model;
|
||||
|
||||
class Download extends Model
|
||||
{
|
||||
const ZERO = 0;
|
||||
const ONE = 1;
|
||||
|
||||
public static $Status = [
|
||||
self::ZERO => '关闭',
|
||||
self::ONE => '开启',
|
||||
];
|
||||
//详情
|
||||
public function detail($id)
|
||||
{
|
||||
$detail = Db::name('Download')->where(['id' => $id])->find();
|
||||
if (!empty($detail)) {
|
||||
$detail['name'] = Db::name('Download')->where(['id' => $detail['id']])->value('name');
|
||||
$detail['cid'] = Db::name('Download')->where('id', $detail['id'])->value('cid');
|
||||
$detail['uid'] = Db::name('Download')->where('id', $detail['id'])->value('uid');
|
||||
$detail['name'] = Db::name('Download')->where(['id' => $detail['id']])->value('name');
|
||||
$detail['version'] = Db::name('Download')->where(['id' => $detail['id']])->value('version');
|
||||
$detail['description'] = Db::name('Download')->where(['id' => $detail['id']])->value('description');
|
||||
$detail['path'] = Db::name('Download')->where(['id' => $detail['id']])->value('path');
|
||||
$detail['download_url'] = Db::name('Download')->where(['id' => $detail['id']])->value('download_url');
|
||||
$detail['download_code'] = Db::name('Download')->where(['id' => $detail['id']])->value('download_code');
|
||||
$detail['create_time'] = Db::name('Download')->where(['id' => $detail['id']])->value('create_time');
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
}
|
||||
40
app/model/DownloadCate.php
Normal file
40
app/model/DownloadCate.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
namespace app\model;
|
||||
|
||||
use think\facade\Db;
|
||||
use think\Model;
|
||||
|
||||
class DownloadCate extends Model
|
||||
{
|
||||
const ZERO = 0;
|
||||
const ONE = 1;
|
||||
|
||||
public static $Status = [
|
||||
self::ZERO => '关闭',
|
||||
self::ONE => '开启',
|
||||
];
|
||||
//详情
|
||||
public function detail($id)
|
||||
{
|
||||
$detail = Db::name('Supplier')->where(['id' => $id])->find();
|
||||
if (!empty($detail)) {
|
||||
$detail['supplier_name'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('supplier_name');
|
||||
$detail['contact_name'] = Db::name('Supplier')->where('id', $detail['id'])->value('contact_name');
|
||||
$detail['contact_phone'] = Db::name('Supplier')->where('id', $detail['id'])->value('contact_phone');
|
||||
$detail['contact_email'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('contact_email');
|
||||
$detail['contact_wechat'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('contact_wechat');
|
||||
$detail['registered_address'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('registered_address');
|
||||
$detail['business_scope'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('business_scope');
|
||||
$detail['company_size'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('company_size');
|
||||
$detail['invoice_company_name'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('invoice_company_name');
|
||||
$detail['taxpayer_id'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('taxpayer_id');
|
||||
$detail['invoice_address'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('invoice_address');
|
||||
$detail['invoice_phone'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('invoice_phone');
|
||||
$detail['bank_name'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('bank_name');
|
||||
$detail['bank_account'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('bank_account');
|
||||
$detail['remarks'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('remarks');
|
||||
$detail['create_time'] = Db::name('Supplier')->where(['id' => $detail['id']])->value('create_time');
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
}
|
||||
@ -1,8 +1,8 @@
|
||||
<?php
|
||||
namespace app\model;
|
||||
|
||||
use think\Model;
|
||||
use think\facade\Db;
|
||||
use think\Model;
|
||||
|
||||
class Information extends Model
|
||||
{
|
||||
@ -16,29 +16,33 @@ class Information extends Model
|
||||
//详情
|
||||
public function detail($id)
|
||||
{
|
||||
$detail = $this->where('id', $id)->find();
|
||||
$detail = Db::name('Information')->where(['id' => $id])->find();
|
||||
if (!empty($detail)) {
|
||||
$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
|
||||
$detail['director_name'] = Db::name('Admin')->where(['id' => $detail['director_uid']])->value('name');
|
||||
$check_admin_names = Db::name('Admin')->where('id', 'in', $detail['check_admin_ids'])->column('name');
|
||||
$detail['check_admin_names'] = implode(',', $check_admin_names);
|
||||
$detail['times'] = time_trans($detail['create_time']);
|
||||
$detail['logs'] = Db::name('Log')->where(['module' => 'business', 'business_id' => $detail['id']])->count();
|
||||
$detail['comments'] = Db::name('Comment')->where(['module' => 1, 'delete_time' => 0, 'topic_id' => $detail['id']])->count();
|
||||
$detail['projects'] = Db::name('Project')->where(['delete_time' => 0, 'id' => $detail['id']])->count();
|
||||
$detail['md_content'] = Db::name('Business')->where(['id' => $detail['id']])->value('md_content');
|
||||
$detail['content'] = Db::name('Business')->where(['id' => $detail['id']])->value('content');
|
||||
// print_r($detail['md_content']);
|
||||
// $task_map = [];
|
||||
// $task_map[] = ['delete_time', '=', 0];
|
||||
|
||||
//任务
|
||||
$task_cate = Db::name('TaskCate')->where(['status' => 1])->select()->toArray();
|
||||
foreach ($task_cate as $k => $v) {
|
||||
$task_map[] = ['type', '=', $v['id']];
|
||||
$task_cate[$k]['count'] = Db::name('Task')->where($task_map)->count();
|
||||
$detail['name'] = Db::name('Information')->where(['id' => $detail['id']])->value('name');
|
||||
$detail['email'] = Db::name('Information')->where('id', $detail['id'])->value('email');
|
||||
$detail['phone'] = Db::name('Information')->where('id', $detail['id'])->value('phone');
|
||||
$detail['message'] = Db::name('Information')->where(['id' => $detail['id']])->value('message');
|
||||
$productId = Db::name('Information')->where(['id' => $detail['id']])->value('product');
|
||||
$detail['product'] = Db::name('Product')->where(['id' => $productId])->value('name');
|
||||
$detail['company'] = Db::name('Information')->where(['id' => $detail['id']])->value('company');
|
||||
$detail['ip'] = Db::name('Information')->where(['id' => $detail['id']])->value('ip');
|
||||
$status = Db::name('Information')->where(['id' => $detail['id']])->value('status');
|
||||
switch ($status) {
|
||||
case 0:
|
||||
$detail['status'] = '新商机';
|
||||
break;
|
||||
case 1:
|
||||
$detail['status'] = '已跟进';
|
||||
break;
|
||||
case 2:
|
||||
$detail['status'] = '已转化';
|
||||
break;
|
||||
case 3:
|
||||
$detail['status'] = '已关闭';
|
||||
break;
|
||||
}
|
||||
$detail['task_cate'] = $task_cate;
|
||||
$timestamp = Db::name('Information')->where(['id' => $detail['id']])->value('create_time');
|
||||
$detail['create_time'] = date('Y-m-d H:i:s', $timestamp);
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
|
||||
@ -39,9 +39,9 @@ class Index extends BaseController
|
||||
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = ProductList::withoutField('content,md_content')
|
||||
->where(function ($query) use ($map1, $map2, $map3, $map4) {
|
||||
$query->where($map1)->whereor($map2)->whereor($map3)->whereor($map4);
|
||||
})
|
||||
// ->where(function ($query) use ($map1, $map2, $map3, $map4) {
|
||||
// $query->where($map1)->whereor($map2)->whereor($map3)->whereor($map4);
|
||||
// })
|
||||
->where('delete_time', 0)
|
||||
->order('id desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','gouguEdit','gouguComment'];
|
||||
const moduleInit = ['tool', 'gouguEdit', 'gouguComment'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
layui.pageTable = table.render({
|
||||
@ -31,42 +31,47 @@
|
||||
height: 'full-130',
|
||||
cols: [[
|
||||
{
|
||||
field: 'id', title: '产品编号', width: 100, align: 'center', fixed: 'left', rowspan: 2, templet: function (d) {
|
||||
field: 'id', title: '产品编号', width: 100, fixed: 'left', rowspan: 2, templet: function (d) {
|
||||
return 'P' + 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>';
|
||||
field: 'status', title: '状态', width: 100, rowspan: 2, templet: function (d) {
|
||||
var html = '<span>' + d.status_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, {
|
||||
field: 'name', title: '产品名称', align: 'center', rowspan: 2, templet: function (d) {
|
||||
var className = d.is_own == 1 ? 'ziyan' : 'feiziyan';
|
||||
var text = d.is_own == 1 ? '自研' : '非自研';
|
||||
var html = '<div style="display:grid;justify-content:center"><a class="open-a" data-href="/product/index/view/id/' + d.id + '" style="display: flex;justify-content: center;align-items: center;"><span class="' + className + '" style="float:left">' + text + '</span>' + '<p style="float:left">' + d.name + '</p>' + '</a></div>';
|
||||
field: 'is_own', title: '类型', width: 100, rowspan: 2, templet: function (d) {
|
||||
var text = d.is_own === 1 ? '自研' : '非自研';
|
||||
var html = '<span class="color-flow-' + d.is_own + '">' + text + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
, { field: 'director_name', title: '负责人', align: 'center', width: 80, rowspan: 2 }
|
||||
, { field: 'admin_name', title: '创建人', align: 'center', width: 80, rowspan: 2 }
|
||||
, { field: 'projects', title: '关联项目', align: 'center', width: 100, rowspan: 2 }
|
||||
, {
|
||||
field: 'name', title: '产品名称', rowspan: 2, templet: function (d) {
|
||||
var html = '<span>' + d.name + '</span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
// , { field: 'director_name', title: '负责人', width: 80, rowspan: 2 }
|
||||
, { field: 'admin_name', title: '创建人', width: 80, rowspan: 2 }
|
||||
, { field: 'projects', title: '关联项目', width: 100, 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': '修复率' }
|
||||
{ field: 'tasks_a_unfinish', style: 'color: #91CC75;', width: 80, 'title': '进行中' }
|
||||
, { field: 'tasks_a_finish', style: 'color: #FAC858;', width: 80, 'title': '已完成' }
|
||||
, { field: 'tasks_a_pensent', style: 'color: #EE6666;', width: 80, 'title': '完成率' }
|
||||
, { field: 'tasks_b_unfinish', style: 'color: #91CC75;', width: 80, 'title': '进行中' }
|
||||
, { field: 'tasks_b_finish', style: 'color: #FAC858;', width: 80, 'title': '已完成' }
|
||||
, { field: 'tasks_b_pensent', style: 'color: #EE6666;', width: 80, 'title': '修复率' }
|
||||
]]
|
||||
});
|
||||
|
||||
$('.add-new').on('click', function () {
|
||||
tool.open('/product/index/add');
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
@ -32,8 +32,22 @@ class Index extends BaseController
|
||||
->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];
|
||||
// 判断时间戳是否为空,如果为空则返回“-”
|
||||
$item->plan_time = $item->start_time && $item->end_time
|
||||
? date('Y-m-d', $item->start_time) . ' ~ ' . date('Y-m-d', $item->end_time)
|
||||
: '-';
|
||||
$item->project_plan_time = $item->project_start_time
|
||||
? (
|
||||
$item->project_end_time
|
||||
? (
|
||||
date('Y-m-d', $item->project_end_time) === '1970-01-01'
|
||||
? date('Y-m-d', $item->project_start_time) . ' ~ 至今'
|
||||
: date('Y-m-d', $item->project_start_time) . ' ~ ' . date('Y-m-d', $item->project_end_time)
|
||||
)
|
||||
: date('Y-m-d', $item->project_start_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;
|
||||
@ -100,7 +114,7 @@ class Index extends BaseController
|
||||
$flowNameData = isset($param['flowName']) ? $param['flowName'] : '';
|
||||
$flowUidsData = isset($param['chargeIds']) ? $param['chargeIds'] : '';
|
||||
$flowIdsData = isset($param['membeIds']) ? $param['membeIds'] : '';
|
||||
// $flowDateData = isset($param['cycleDate']) ? $param['cycleDate'] : '';
|
||||
// $flowDateData = isset($param['cycleDate']) ? $param['cycleDate'] : '';
|
||||
$flow = [];
|
||||
$time_1 = $param['start_time'];
|
||||
$time_2 = $param['end_time'];
|
||||
@ -108,7 +122,7 @@ class Index extends BaseController
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
// $flowDate = explode('到', $flowDateData[$key]);
|
||||
// $flowDate = explode('到', $flowDateData[$key]);
|
||||
// $start_time = strtotime(urldecode(trim($flowDate[0])));
|
||||
// $end_time = strtotime(urldecode(trim($flowDate[1])));
|
||||
// if ($start_time < $time_1) {
|
||||
@ -131,7 +145,7 @@ class Index extends BaseController
|
||||
$item['flow_uid'] = $flowUidsData[$key];
|
||||
$item['flow_ids'] = $flowIdsData[$key];
|
||||
$item['sort'] = $key;
|
||||
// $item['start_time'] = $start_time;
|
||||
// $item['start_time'] = $start_time;
|
||||
// $item['end_time'] = $end_time;
|
||||
$item['create_time'] = time();
|
||||
$flow[] = $item;
|
||||
@ -155,7 +169,7 @@ class Index extends BaseController
|
||||
if (!empty($param['team_admin_ids'])) {
|
||||
$project_users .= "," . $param['team_admin_ids'];
|
||||
}
|
||||
$project_array = explode(",", (string)$project_users);
|
||||
$project_array = explode(",", (string) $project_users);
|
||||
$project_array = array_unique($project_array);
|
||||
$project_user_array = [];
|
||||
foreach ($project_array as $k => $v) {
|
||||
@ -209,7 +223,7 @@ class Index extends BaseController
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = (new ProjectList())->detail($id);
|
||||
@ -222,13 +236,19 @@ class Index extends BaseController
|
||||
return json(['code' => 1, 'msg' => $e->getError()]);
|
||||
}
|
||||
|
||||
// Convert start_time and end_time from date string to Unix timestamp
|
||||
// 将时间从日期字符串转换为Unix时间戳
|
||||
if (!empty($param['start_time'])) {
|
||||
$param['start_time'] = strtotime($param['start_time']);
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$param['end_time'] = strtotime($param['end_time']);
|
||||
}
|
||||
if (!empty($param['project_start_time'])) {
|
||||
$param['project_start_time'] = strtotime($param['project_start_time']);
|
||||
}
|
||||
if (!empty($param['project_end_time'])) {
|
||||
$param['project_end_time'] = strtotime($param['project_end_time']);
|
||||
}
|
||||
|
||||
$param['update_time'] = time();
|
||||
$res = ProjectList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
@ -245,7 +265,7 @@ class Index extends BaseController
|
||||
}
|
||||
|
||||
// 将 $project_users 拆解为数组,去重
|
||||
$project_array = explode(",", (string)$project_users);
|
||||
$project_array = explode(",", (string) $project_users);
|
||||
$project_array = array_unique($project_array);
|
||||
|
||||
// 获取当前已有的项目用户
|
||||
@ -334,12 +354,12 @@ class Index extends BaseController
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// public function edit()
|
||||
// public function edit()
|
||||
// {
|
||||
// $param = get_params();
|
||||
// $id = isset($param['id']) ? $param['id'] : 0;
|
||||
@ -434,7 +454,7 @@ class Index extends BaseController
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
|
||||
// print_r('id是:'.$id);
|
||||
// print_r('id是:'.$id);
|
||||
|
||||
// 获取项目详细信息
|
||||
$detail = (new ProjectList())->detail($id);
|
||||
@ -473,7 +493,7 @@ class Index extends BaseController
|
||||
View::assign('detail', $detail); // 传递 detail
|
||||
return view();
|
||||
|
||||
// return json([
|
||||
// return json([
|
||||
// 'code' => 1,
|
||||
// 'msg' => '获取项目阶段信息成功',
|
||||
// 'data' => [
|
||||
|
||||
@ -1,46 +1,45 @@
|
||||
<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;}
|
||||
.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 class="layui-td-gray">项目名称<font>*</font>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="name" lay-verify="required" lay-reqText="请输入项目名称" placeholder="请输入项目名称" class="layui-input" value="">
|
||||
<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 class="layui-td-gray">项目简称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name_short" lay-verify="required" lay-reqText="请输入项目简称" placeholder="请输入项目简称" class="layui-input" value="">
|
||||
<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 class="layui-td-gray">项目类型<font>*</font>
|
||||
</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="是否是内部项目">
|
||||
@ -52,22 +51,51 @@
|
||||
</select>
|
||||
</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">关联客户</td>
|
||||
<td>
|
||||
<select name="business_id" id="business_id" lay-verify="" lay-search="" lay-reqText="请选择客户">
|
||||
<option value="">请选择客户</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="请选择关联产品">
|
||||
<select name="product_id" lay-verify="" lay-search="" 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 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>
|
||||
@ -77,7 +105,8 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" class="layui-td-gray" style="text-align:left; font-weight:600">项目阶段<font>*</font></td>
|
||||
<td colspan="6" class="layui-td-gray" style="text-align:left; font-weight:600">项目阶段<font>*</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
@ -91,7 +120,7 @@
|
||||
<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>
|
||||
<option value="{$voo}" {eq name="$kk" value="$k" } selected{/eq}>{$voo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
@ -99,14 +128,18 @@
|
||||
<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="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="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>
|
||||
@ -119,7 +152,7 @@
|
||||
<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>
|
||||
<option value="{$voo}" {eq name="$kk" value="$k" } selected{/eq}>{$voo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
@ -127,14 +160,18 @@
|
||||
<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="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="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>
|
||||
@ -143,7 +180,8 @@
|
||||
{/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>
|
||||
<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>
|
||||
@ -171,11 +209,11 @@
|
||||
form.render();
|
||||
|
||||
function fetchCustomers() {
|
||||
tool.get('/business/index/getlistsmore', {}, function(response) {
|
||||
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) {
|
||||
customers.forEach(function (customer) {
|
||||
var option = document.createElement('option');
|
||||
option.value = customer.id;
|
||||
option.text = customer.name;
|
||||
@ -209,13 +247,13 @@
|
||||
});
|
||||
});
|
||||
|
||||
$('.add-flow').on('click',function(){
|
||||
$('.add-flow').on('click', function () {
|
||||
let len = $('#flowList').find('.layui-form-item').length;
|
||||
let index = len+1;
|
||||
let index = len + 1;
|
||||
let type = $(this).data('type');;
|
||||
let tem=['<div class="layui-form-item layui-form-pane">\
|
||||
let tem = ['<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第'+index+'阶段</label>\
|
||||
<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>\
|
||||
@ -248,7 +286,7 @@
|
||||
</div>',
|
||||
'<div class="layui-form-item layui-form-pane">\
|
||||
<div class="layui-inline">\
|
||||
<label class="layui-form-label label-index">第'+index+'阶段</label>\
|
||||
<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>\
|
||||
@ -281,12 +319,12 @@
|
||||
});
|
||||
});
|
||||
});
|
||||
$('#flowList').on('click','.layui-btn-danger',function(){
|
||||
$('#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)+'阶段');
|
||||
if (items > 0) {
|
||||
$('.label-index').each(function (index, item) {
|
||||
$(this).html('第' + (index + 2) + '阶段');
|
||||
})
|
||||
}
|
||||
});
|
||||
@ -299,7 +337,7 @@
|
||||
tool.close(1000);
|
||||
}
|
||||
}
|
||||
tool.post("/project/index/add",data.field,callback);
|
||||
tool.post("/project/index/add", data.field, callback);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray">项目名称<font>*</font></td>
|
||||
<td>{$detail.name}</td>
|
||||
<td class="layui-td-gray-2">计划完成周期</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>
|
||||
|
||||
@ -71,7 +71,8 @@
|
||||
}
|
||||
}
|
||||
, { field: 'director_name', title: '负责人', align: 'center', width: 80, rowspan: 2 }
|
||||
, { field: 'plan_time', title: '项目周期', align: 'center', width: 240, rowspan: 2 }
|
||||
, { field: 'plan_time', title: '合同周期', align: 'center', width: 240, rowspan: 2 }
|
||||
, { field: 'project_plan_time', title: '项目周期', align: 'center', width: 240, rowspan: 2 }
|
||||
, { align: 'center', title: '关联任务', colspan: 3 }
|
||||
, { align: 'center', title: 'BUG缺陷', colspan: 3 }
|
||||
], [
|
||||
|
||||
@ -127,8 +127,8 @@
|
||||
<span class="font-gray">项目ID:</span>
|
||||
<span id="{$detail.id}" data-val="{$detail.id}">{$detail.id}</span>
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="id"></i>-->
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="id"></i>-->
|
||||
<!-- <button data-id="{$detail.id}" data-name="business_id">编辑</button> -->
|
||||
</div>
|
||||
<hr>
|
||||
@ -136,33 +136,48 @@
|
||||
<span class="font-gray">客户名称:</span>
|
||||
<span id="business_id_{$detail.id}"
|
||||
data-val="{$detail.business_id}">{$detail.business_id}</span>
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="business_id"></i>-->
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="business_id"></i>-->
|
||||
<!-- <button data-id="{$detail.id}" data-name="business_id">编辑</button> -->
|
||||
</div>
|
||||
<hr>
|
||||
<div class="py-1">
|
||||
<span class="font-gray">计划完成周期:</span>
|
||||
<span class="font-gray">合同周期:</span>
|
||||
<span id="start_time_{$detail.id}" data-val="">{$detail.start_time|date='Y-m-d'}</span>
|
||||
至 <span id="end_time_{$detail.id}" data-val="">{$detail.end_time|
|
||||
~ <span id="end_time_{$detail.id}" data-val="">{$detail.end_time|
|
||||
date='Y-m-d'}</span>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="py-1">
|
||||
<span class="font-gray">项目周期:</span>
|
||||
<span id="project_start_time_{$detail.id}"
|
||||
data-val="">{$detail.project_start_time|date='Y-m-d'}</span>
|
||||
~
|
||||
<span id="project_end_time_{$detail.id}" data-val="">
|
||||
{if $detail.project_end_time == '1970-01-01' || $detail.project_end_time == 0 ||
|
||||
$detail.project_end_time == ''}
|
||||
至今
|
||||
{else}
|
||||
{$detail.project_end_time|date='Y-m-d'}
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="py-1">
|
||||
<span class="font-gray">创建人:</span>{$detail.admin_name}
|
||||
<span class="font-gray" style="margin-left:32px">负责人:</span>
|
||||
<span id="director_uid_{$detail.id}"
|
||||
data-val="{$detail.director_uid}">{$detail.director_name}</span>
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="director_uid"></i>-->
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="director_uid"></i>-->
|
||||
<span class="font-gray" style="margin-left:32px">项目成员:</span>{$detail.team_admin_names}
|
||||
</div>
|
||||
<hr>
|
||||
<div class="py-1">
|
||||
<span class="font-gray">项目简介:</span>
|
||||
<span id="content_{$detail.id}" data-val="{$detail.content}">{$detail.content}</span>
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="content"></i>-->
|
||||
<!-- <i class="iconfont icon-wodedianping" title="编辑" data-id="{$detail.id}"-->
|
||||
<!-- data-name="content"></i>-->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@ -191,8 +206,8 @@
|
||||
<span class="gray">当前阶段:</span>{$step.flow_name}
|
||||
<span class="gray" style="margin-left:20px">负责人:</span>{$step.check_name}
|
||||
<span class="gray" style="margin-left:20px">成员:</span>{$step.flow_names}
|
||||
<!-- <span class="gray" style="margin-left:20px">周期:</span>{$step.start_time|time_format=###,'Y-m-d'}-->
|
||||
<!-- 到 {$step.end_time|time_format=###,'Y-m-d'}-->
|
||||
<!-- <span class="gray" style="margin-left:20px">周期:</span>{$step.start_time|time_format=###,'Y-m-d'}-->
|
||||
<!-- 到 {$step.end_time|time_format=###,'Y-m-d'}-->
|
||||
{eq name="$step.flow_uid" value="$login_user"}
|
||||
{neq name="$detail.status" value="4"}
|
||||
<div class="pt-3">
|
||||
@ -215,7 +230,7 @@
|
||||
<i class="layui-icon layui-icon-time"></i>
|
||||
{/gt}
|
||||
{eq name="$vo.sort" value="$detail.step_sort"}
|
||||
<!-- <i class="layui-icon layui-icon-username" data-on=""></i>-->
|
||||
<!-- <i class="layui-icon layui-icon-username" data-on=""></i>-->
|
||||
{/eq}
|
||||
{lt name="$vo.sort" value="$detail.step_sort"}
|
||||
<i class="layui-icon layui-icon-ok-circle" data-ok=""></i>
|
||||
@ -467,7 +482,7 @@
|
||||
if (deleteFilePaths) {
|
||||
$.ajax({
|
||||
url: basePath + 'deleteFile.do',
|
||||
data: {deleteFilePaths: deleteFilePaths},
|
||||
data: { deleteFilePaths: deleteFilePaths },
|
||||
dataType: 'JSON',
|
||||
Type: 'POST',
|
||||
async: false,
|
||||
@ -553,7 +568,7 @@
|
||||
, uploadListIns = upload.render({
|
||||
elem: '#testList'
|
||||
, url: basePath + 'upload.do'
|
||||
, data: {fileDir: fileDirIndex}
|
||||
, data: { fileDir: fileDirIndex }
|
||||
, accept: 'file'
|
||||
, multiple: true
|
||||
, auto: false
|
||||
@ -655,10 +670,10 @@
|
||||
var project_start_time = '{$detail.start_time| date="Y-m-d"}';
|
||||
const opsData = {
|
||||
status: [
|
||||
{'id': 1, 'title': '未开始'},
|
||||
{'id': 2, 'title': '进行中'},
|
||||
{'id': 3, 'title': '已完成'},
|
||||
{'id': 4, 'title': '已关闭'}
|
||||
{ 'id': 1, 'title': '未开始' },
|
||||
{ 'id': 2, 'title': '进行中' },
|
||||
{ 'id': 3, 'title': '已完成' },
|
||||
{ 'id': 4, 'title': '已关闭' }
|
||||
]
|
||||
}
|
||||
|
||||
@ -698,8 +713,8 @@
|
||||
show: false
|
||||
},
|
||||
data: [
|
||||
{value: 1048, name: '待处理'},
|
||||
{value: 735, name: '已完成'}
|
||||
{ value: 1048, name: '待处理' },
|
||||
{ value: 735, name: '已完成' }
|
||||
]
|
||||
}
|
||||
]
|
||||
@ -782,11 +797,11 @@
|
||||
radius: ['25%', '75%'],
|
||||
center: ['60%', '50%'],
|
||||
data: [
|
||||
{value: 40, name: '待解决'},
|
||||
{value: 38, name: '进行中'},
|
||||
{value: 32, name: '已解决'},
|
||||
{value: 28, name: '不解决'},
|
||||
{value: 26, name: '已关闭'}
|
||||
{ value: 40, name: '待解决' },
|
||||
{ value: 38, name: '进行中' },
|
||||
{ value: 32, name: '已解决' },
|
||||
{ value: 28, name: '不解决' },
|
||||
{ value: 26, name: '已关闭' }
|
||||
]
|
||||
}
|
||||
]
|
||||
@ -897,7 +912,7 @@
|
||||
itemStyle: {
|
||||
borderWidth: 0.5
|
||||
},
|
||||
yearLabel: {show: false},
|
||||
yearLabel: { show: false },
|
||||
monthLabel: {
|
||||
nameMap: 'cn',
|
||||
fontSize: 12
|
||||
@ -962,7 +977,7 @@
|
||||
itemStyle: {
|
||||
borderWidth: 0.5
|
||||
},
|
||||
yearLabel: {show: false},
|
||||
yearLabel: { show: false },
|
||||
monthLabel: {
|
||||
nameMap: 'cn',
|
||||
fontSize: 12
|
||||
@ -1005,7 +1020,7 @@
|
||||
data.push([this_date, 0]);
|
||||
}
|
||||
}
|
||||
var res = {'range': rangeArray, 'data': data};
|
||||
var res = { 'range': rangeArray, 'data': data };
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -1061,7 +1076,7 @@
|
||||
yArray = tem_y_array.concat(yArray);
|
||||
yArray2 = tem_y_array.concat(yArray2);
|
||||
}
|
||||
return {'x': xArray, 'y': yArray, 'y2': yArray2};
|
||||
return { 'x': xArray, 'y': yArray, 'y2': yArray2 };
|
||||
}
|
||||
|
||||
function cross_recursion(start, end, arr) {
|
||||
@ -1121,7 +1136,7 @@
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
let postData = {id: id};
|
||||
let postData = { id: id };
|
||||
postData[name] = real_val;
|
||||
tool.post("/project/index/edit", postData, callback);
|
||||
}
|
||||
@ -1157,7 +1172,7 @@
|
||||
|
||||
|
||||
$('#delProject').on('click', function () {
|
||||
layer.confirm('确定要删除该项目吗?请慎重', {icon: 3, title: '提示'}, function (index) {
|
||||
layer.confirm('确定要删除该项目吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
@ -1167,7 +1182,7 @@
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
let postData = {"id": project_id};
|
||||
let postData = { "id": project_id };
|
||||
tool.delete("/project/index/delete", postData, callback);
|
||||
});
|
||||
})
|
||||
@ -1253,23 +1268,40 @@
|
||||
</div>
|
||||
<div class="layui-form-item" style="display:flex">
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">开始时间</label>
|
||||
<label class="layui-form-label">合同开始</label>
|
||||
<div class="" style="width: 212px">
|
||||
<input type="text" name="start_time" required lay-verify="required" placeholder="请输入开始时间" autocomplete="off"
|
||||
<input type="text" name="start_time" placeholder="请输入开始时间" autocomplete="off"
|
||||
class="layui-input" id="start_time" value="${new Date(detail.start_time * 1000).toLocaleDateString('en-CA')}"
|
||||
onclick="layui.use('laydate', function(){ laydate({ elem: '#start_time', format: 'YYYY-MM-DD' }); })">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">结束时间</label>
|
||||
<label class="layui-form-label">合同结束</label>
|
||||
<div class="" style="width: 212px">
|
||||
<input type="text" name="end_time" required lay-verify="required" placeholder="请输入结束时间" autocomplete="off"
|
||||
<input type="text" name="end_time" placeholder="请输入结束时间" autocomplete="off"
|
||||
class="layui-input" id="end_time" value="${formatLocalDate(detail.end_time)}"
|
||||
onclick="layui.use('laydate', function(){ laydate({ elem: '#end_time', format: 'YYYY-MM-DD' }); })">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" style="display:flex">
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">项目开始</label>
|
||||
<div class="" style="width: 212px">
|
||||
<input type="text" name="project_start_time" placeholder="请输入开始时间" autocomplete="off"
|
||||
class="layui-input" id="project_start_time" value="${new Date(detail.project_start_time * 1000).toLocaleDateString('en-CA')}"
|
||||
onclick="layui.use('laydate', function(){ laydate({ elem: '#project_start_time', format: 'YYYY-MM-DD' }); })">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" style="display:flex;align-items:center;justify-content:center;">
|
||||
<label class="layui-form-label">项目结束</label>
|
||||
<div class="" style="width: 212px">
|
||||
<input type="text" name="project_end_time" placeholder="请输入结束时间" autocomplete="off"
|
||||
class="layui-input" id="project_end_time" value="${formatLocalDate(detail.project_end_time)}"
|
||||
onclick="layui.use('laydate', function(){ laydate({ elem: '#project_end_time', format: 'YYYY-MM-DD' }); })">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">项目简介</label>
|
||||
<div class="layui-input-block">
|
||||
@ -1290,6 +1322,8 @@
|
||||
|
||||
laydate.render({ elem: '#start_time', type: 'date', format: 'yyyy-MM-dd' });
|
||||
laydate.render({ elem: '#end_time', type: 'date', format: 'yyyy-MM-dd' });
|
||||
laydate.render({ elem: '#project_start_time', type: 'date', format: 'yyyy-MM-dd' });
|
||||
laydate.render({ elem: '#project_end_time', type: 'date', format: 'yyyy-MM-dd' });
|
||||
|
||||
form.on('submit(saveProject)', function (data) {
|
||||
$.ajax({
|
||||
@ -1339,11 +1373,11 @@
|
||||
|
||||
//关闭项目
|
||||
$('#closeProject').on('click', function () {
|
||||
layer.confirm('确定要关闭该项目吗?请慎重', {icon: 3, title: '提示'}, function (index) {
|
||||
layer.confirm('确定要关闭该项目吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/project/index/close",
|
||||
type: "POST",
|
||||
data: {"id": project_id},
|
||||
data: { "id": project_id },
|
||||
success: function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
@ -1362,11 +1396,11 @@
|
||||
|
||||
//开启项目
|
||||
$('#reopenProject').on('click', function () {
|
||||
layer.confirm('确定要开启该项目吗?请慎重', {icon: 3, title: '提示'}, function (index) {
|
||||
layer.confirm('确定要开启该项目吗?请慎重', { icon: 3, title: '提示' }, function (index) {
|
||||
$.ajax({
|
||||
url: "/project/index/open",
|
||||
type: "POST", // 根据实际情况调整请求类型
|
||||
data: {"id": project_id},
|
||||
data: { "id": project_id },
|
||||
success: function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
@ -1420,7 +1454,7 @@
|
||||
title: '提示'
|
||||
},
|
||||
function (index) {
|
||||
tool.post("/api/project/step_check", {id: project_id, check: check}, callback);
|
||||
tool.post("/api/project/step_check", { id: project_id, check: check }, callback);
|
||||
})
|
||||
}
|
||||
});
|
||||
@ -1434,7 +1468,7 @@
|
||||
//,multiple: true
|
||||
, bindAction: '#test9'
|
||||
, before: function (obj) {
|
||||
layer.msg('上传中...', {time: 3600000});
|
||||
layer.msg('上传中...', { time: 3600000 });
|
||||
}
|
||||
, done: function (res, index, upload) {
|
||||
let callback = function (e) {
|
||||
@ -1460,7 +1494,7 @@
|
||||
|
||||
$('#fileList').on('click', '.btn-delete', function () {
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要删除该附件吗?', {icon: 3, title: '提示'}, function (index) {
|
||||
layer.confirm('确定要删除该附件吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
@ -1468,7 +1502,7 @@
|
||||
location.reload();
|
||||
}, 2000)
|
||||
}
|
||||
let postData = {"id": id};
|
||||
let postData = { "id": id };
|
||||
tool.delete("/api/appendix/delete", postData, callback);
|
||||
});
|
||||
})
|
||||
@ -1484,7 +1518,7 @@
|
||||
})
|
||||
$('#linkList').on('click', '.link-delete', function () {
|
||||
let id = $(this).data('id');
|
||||
layer.confirm('确定要删除该链接吗?', {icon: 3, title: '提示'}, function (index) {
|
||||
layer.confirm('确定要删除该链接吗?', { icon: 3, title: '提示' }, function (index) {
|
||||
let callback = function (e) {
|
||||
layer.closeAll();
|
||||
layer.msg(e.msg);
|
||||
@ -1492,7 +1526,7 @@
|
||||
location.reload();
|
||||
}, 2000)
|
||||
}
|
||||
let postData = {"id": id};
|
||||
let postData = { "id": id };
|
||||
tool.delete("/api/appendix/delete_link", postData, callback);
|
||||
});
|
||||
})
|
||||
@ -1510,8 +1544,8 @@
|
||||
show: false
|
||||
},
|
||||
data: [
|
||||
{value: res.data.task_pie.count - res.data.task_pie.count_ok, name: '待处理'},
|
||||
{value: res.data.task_pie.count_ok, name: '已完成'}
|
||||
{ value: res.data.task_pie.count - res.data.task_pie.count_ok, name: '待处理' },
|
||||
{ value: res.data.task_pie.count_ok, name: '已完成' }
|
||||
]
|
||||
}
|
||||
];
|
||||
@ -1553,11 +1587,11 @@
|
||||
radius: ['25%', '75%'],
|
||||
center: ['60%', '50%'],
|
||||
data: [
|
||||
{value: res.data.bug_status.status_a, name: '待解决'},
|
||||
{value: res.data.bug_status.status_b, name: '进行中'},
|
||||
{value: res.data.bug_status.status_c, name: '已解决'},
|
||||
{value: res.data.bug_status.status_d, name: '不解决'},
|
||||
{value: res.data.bug_status.status_e, name: '已关闭'}
|
||||
{ value: res.data.bug_status.status_a, name: '待解决' },
|
||||
{ value: res.data.bug_status.status_b, name: '进行中' },
|
||||
{ value: res.data.bug_status.status_c, name: '已解决' },
|
||||
{ value: res.data.bug_status.status_d, name: '不解决' },
|
||||
{ value: res.data.bug_status.status_e, name: '已关闭' }
|
||||
]
|
||||
}
|
||||
]
|
||||
@ -1588,7 +1622,7 @@
|
||||
type: 'line',
|
||||
showSymbol: false,
|
||||
markLine: {
|
||||
data: [{type: 'average', name: 'Avg'}],
|
||||
data: [{ type: 'average', name: 'Avg' }],
|
||||
},
|
||||
lineStyle: {
|
||||
width: 2
|
||||
@ -1603,7 +1637,7 @@
|
||||
opacity: 0.1
|
||||
},
|
||||
markLine: {
|
||||
data: [{type: 'average', name: 'Avg'}],
|
||||
data: [{ type: 'average', name: 'Avg' }],
|
||||
},
|
||||
lineStyle: {
|
||||
width: 2
|
||||
@ -1634,7 +1668,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
tool.get('/api/project/get_chart_data', {'project_id': project_id}, callback);
|
||||
tool.get('/api/project/get_chart_data', { 'project_id': project_id }, callback);
|
||||
|
||||
window.onresize = function () {
|
||||
progressChart.resize();
|
||||
|
||||
@ -168,26 +168,28 @@ class Index extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
//编辑条目
|
||||
//编辑条目(查看)
|
||||
public function edititem($id)
|
||||
{
|
||||
$param = get_params();
|
||||
// 编辑逻辑
|
||||
$reimbursementLists = ReimbursementList::where('id', $param['id'])
|
||||
$reimbursementLists = ReimbursementList::where('id', $id)
|
||||
->field('id, pid, times, department, project, cate, price, creater, haveticket, tickets, remark, create_time')
|
||||
->find();
|
||||
// print_r($reimbursementLists);
|
||||
|
||||
if ($reimbursementLists) {
|
||||
// 获取项目名称
|
||||
$project = ProjectList::where('id', $reimbursementLists['project'])->value('name_short');
|
||||
// 获取发生时间
|
||||
$times = $reimbursementLists['times'];
|
||||
// 获取部门名称
|
||||
$department = DepartmentList::where('id', $reimbursementLists['department'])->value('title');
|
||||
// 获取创建者名称
|
||||
$creater = Admin::where('id', $reimbursementLists['creater'])->value('name');
|
||||
// print_r($creater);
|
||||
|
||||
if ($project) {
|
||||
$reimbursementLists['project'] = $project;
|
||||
if ($times) {
|
||||
$timesDate = date('Y年m月d日', strtotime($times));
|
||||
$reimbursementLists['times'] = $timesDate;
|
||||
}
|
||||
|
||||
if ($department) {
|
||||
$reimbursementLists['department'] = $department;
|
||||
}
|
||||
@ -195,21 +197,47 @@ class Index extends BaseController
|
||||
$reimbursementLists['creater'] = $creater;
|
||||
}
|
||||
|
||||
if ($reimbursementLists) {
|
||||
View::assign('detail', $reimbursementLists);
|
||||
} else {
|
||||
return json(["code" => 1, "msg" => "信息不存在"]); // 返回JSON格式数据
|
||||
View::assign('message', '没有详细数据');
|
||||
}
|
||||
}
|
||||
|
||||
$param['update_time'] = date('Y-m-d H:i:s', time());
|
||||
$param['update_time'] = date('Y-m-d', time());
|
||||
$res = ReimbursementList::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param, $reimbursementLists);
|
||||
return json(["code" => 0, "msg" => "编辑成功"]); // 返回JSON格式数据
|
||||
return view();
|
||||
// return $reimbursementLists;
|
||||
}
|
||||
|
||||
// 编辑条目详情
|
||||
public function editdetailitem()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isPost()) {
|
||||
$id = $param['id'];
|
||||
$reimbursementLists = ReimbursementList::where('id', $id)
|
||||
->field('id, pid, times, department, project, cate, price, creater, haveticket, tickets, remark, create_time')
|
||||
->find();
|
||||
|
||||
if ($reimbursementLists) {
|
||||
$dateString = $param['times'];
|
||||
$dateString = str_replace(['年', '月', '日'], '-', $dateString);
|
||||
$dateString = rtrim($dateString, '-');
|
||||
|
||||
$reimbursementLists->department = $param['department'];
|
||||
$reimbursementLists->project = $param['project'];
|
||||
$reimbursementLists->cate = $param['cate'];
|
||||
$reimbursementLists->price = $param['price'];
|
||||
$reimbursementLists->haveticket = $param['haveticket'];
|
||||
$reimbursementLists->tickets = $param['tickets'];
|
||||
$reimbursementLists->remark = $param['remark'];
|
||||
$reimbursementLists->save();
|
||||
return json(["code" => 0, "msg" => "编辑成功"]);
|
||||
} else {
|
||||
return json(["code" => -1, "msg" => "编辑失败"]); // 返回JSON格式数据
|
||||
return json(["code" => 1, "msg" => "信息不存在"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//添加
|
||||
@ -298,7 +326,7 @@ class Index extends BaseController
|
||||
}
|
||||
|
||||
// 查看报销详情
|
||||
public function viewitem($id)
|
||||
public function viewitemlist($id)
|
||||
{
|
||||
$reimbursementLists = ReimbursementList::where('pid', $id)
|
||||
->whereNull('delete_time')
|
||||
@ -457,45 +485,6 @@ class Index extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
public function editdetailitem($id)
|
||||
{
|
||||
$reimbursementLists = ReimbursementList::where('id', $id)
|
||||
->field('id, pid, times, department, project, cate, price, creater, haveticket, tickets, remark, create_time')
|
||||
->find();
|
||||
// print_r($reimbursementLists);
|
||||
|
||||
if ($reimbursementLists) {
|
||||
// 获取发生时间
|
||||
$times = $reimbursementLists['times'];
|
||||
// 获取部门名称
|
||||
$department = DepartmentList::where('id', $reimbursementLists['department'])->value('title');
|
||||
// 获取创建者名称
|
||||
$creater = Admin::where('id', $reimbursementLists['creater'])->value('name');
|
||||
// print_r($creater);
|
||||
|
||||
if ($times) {
|
||||
$timesDate = date('Y年m月d日', strtotime($times));
|
||||
$reimbursementLists['times'] = $timesDate;
|
||||
}
|
||||
|
||||
if ($department) {
|
||||
$reimbursementLists['department'] = $department;
|
||||
}
|
||||
if ($creater) {
|
||||
$reimbursementLists['creater'] = $creater;
|
||||
}
|
||||
|
||||
if ($reimbursementLists) {
|
||||
View::assign('detail', $reimbursementLists);
|
||||
} else {
|
||||
View::assign('message', '没有详细数据');
|
||||
}
|
||||
}
|
||||
|
||||
return view();
|
||||
// return $reimbursementLists;
|
||||
}
|
||||
|
||||
//编辑锁定状态
|
||||
public function editlock($id, $lock)
|
||||
{
|
||||
|
||||
349
app/reimbursement/view/index/edititem.html
Normal file
349
app/reimbursement/view/index/edititem.html
Normal file
@ -0,0 +1,349 @@
|
||||
<!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">
|
||||
<style>
|
||||
.close {
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form action="">
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<h3 class="h3-title hover">
|
||||
<span>报销编号 - </span><span>{$detail.id}</span>
|
||||
</h3>
|
||||
<input type="text" name="pid" lay-verify="" class="layui-input" value="{$detail.pid}" id="pid"
|
||||
style="display: none;"/>
|
||||
<input type="text" name="department" lay-verify="" class="layui-input" value="{$detail.department}"
|
||||
id="department" style="display: none;"/>
|
||||
<input type="text" name="project" lay-verify="" class="layui-input" value="{$detail.project}"
|
||||
id="project" style="display: none;"/>
|
||||
<input type="text" name="dates" lay-verify="" class="layui-input" value="" id="dates"
|
||||
style="display: none;"/>
|
||||
<input type="text" name="id" lay-verify="" class="layui-input" value="{$detail.id}" id="id"
|
||||
style="display: none;"/>
|
||||
</div>
|
||||
<div class="layui-row border-b">
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">费用类型</td>
|
||||
<td>
|
||||
<select name="cate" lay-verify="required" lay-reqText="请选择费用类型" class="layui-select"
|
||||
lay-search lay-filter="cate" style="width: 100%;" id="cate">
|
||||
<option value="">请选择费用类型</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">隶属项目</td>
|
||||
<td>
|
||||
<select name="project" lay-verify="required" lay-reqText="请选择隶属项目" class="layui-select"
|
||||
lay-search lay-filter="cate" style="width: 100%;" id="project">
|
||||
<option value="">请选择隶属项目</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">报销金额</td>
|
||||
<td>
|
||||
<input type="text" name="price" lay-verify="" lay-reqText="请填入报销金额,例如:52.00"
|
||||
placeholder="请填入报销金额,例如:52.00" class="layui-input" value="{$detail.price}"
|
||||
id="price"/>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">是否有票</td>
|
||||
<td>
|
||||
<select name="haveticket" lay-verify="required" lay-reqText="请选择" class="layui-select"
|
||||
lay-search lay-filter="haveticket" style="width: 100%;">
|
||||
<option value="无">无</option>
|
||||
<option value="有">有</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">发生时间</td>
|
||||
<td>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="times" class="layui-input" id="times" placeholder="yyyy年MM月dd日"
|
||||
value="{$detail.times}">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">上传票据</td>
|
||||
<td colspan="4">
|
||||
<input type="hidden" name="tickets" id="ticketsInput" value="{$detail.tickets}">
|
||||
<div id="no-ticket-msg" style="color: red;">当前无票,不可上传</div>
|
||||
<div class="layui-upload-drag" style="display: block;" id="ID-upload-demo-drag">
|
||||
<i class="layui-icon layui-icon-upload"></i>
|
||||
<div>点击上传,或将文件拖拽到此处</div>
|
||||
<div class="layui-hide" id="tickets">
|
||||
<hr>
|
||||
<img src="{#tickets}" alt="上传成功后渲染" style="max-width: 100%">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">上传附件</td>
|
||||
<td colspan="4">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal" id="uploadfile">选择多文件</button>
|
||||
<div class="layui-upload-list">
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col style="min-width: 100px;">
|
||||
<col width="150">
|
||||
<col width="260">
|
||||
<col width="150">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<th>文件名</th>
|
||||
<th>大小</th>
|
||||
<th>上传进度</th>
|
||||
<th>操作</th>
|
||||
</thead>
|
||||
<tbody id="update"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<button type="button" class="layui-btn" id="uploadfileaction">开始上传</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注</td>
|
||||
<td colspan="4">
|
||||
<input type="text" name="remark" lay-verify="" lay-reqText="" placeholder=""
|
||||
class="layui-input" value="{$detail.remark}" id="remark"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="close">
|
||||
<button class="layui-btn layui-btn-normal" lay-filter="webform" lay-submit="">
|
||||
立即提交
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</body>
|
||||
<script>
|
||||
const moduleInit = ["tool", "gouguEdit", "gouguComment"];
|
||||
|
||||
function gouguInit() {
|
||||
var table = layui.table;
|
||||
var tool = layui.tool;
|
||||
var dropdown = layui.dropdown;
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var upload = layui.upload;
|
||||
var element = layui.element;
|
||||
var laydate = layui.laydate;
|
||||
|
||||
upload.render({
|
||||
elem: '#ID-upload-demo-drag',
|
||||
url: '/api/index/upload',
|
||||
done: function (res) {
|
||||
layer.msg('上传成功');
|
||||
// 将图片路径赋值给隐藏的 input 元素
|
||||
document.getElementById('ticketsInput').value = res.data.filepath;
|
||||
console.log(res);
|
||||
}
|
||||
});
|
||||
|
||||
// 获取项目类别
|
||||
fetch("/reimbursement/index/getproject")
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
var select = document.querySelector('select[name="project"]');
|
||||
select.innerHTML = '<option value="">请选择项目类型</option>';
|
||||
data.data.forEach((project) => {
|
||||
var option = document.createElement("option");
|
||||
option.value = project.id;
|
||||
option.innerText = project.project;
|
||||
select.appendChild(option);
|
||||
});
|
||||
select.value = '{$detail.project}';
|
||||
form.render("select");
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
});
|
||||
|
||||
//渲染日期选择
|
||||
// laydate.render({
|
||||
// elem: '#times',
|
||||
// format: 'yyyy年MM月dd日',
|
||||
// done: function (value) {
|
||||
// console.log('您选择的日期是:' + value);
|
||||
// times = value.replace(/年|月/g, '-').replace('日', '');
|
||||
// }
|
||||
// });
|
||||
|
||||
// 上传附件渲染
|
||||
// 制作多文件上传表格
|
||||
var uploadListIns = upload.render({
|
||||
elem: '#uploadfile',
|
||||
elemList: $('#update'),
|
||||
url: '/api/index/upload',
|
||||
accept: 'file',
|
||||
multiple: true,
|
||||
number: 3,
|
||||
auto: false,
|
||||
bindAction: '#uploadfileaction',
|
||||
choose: function (obj) {
|
||||
var that = this;
|
||||
var files = this.files = obj.pushFile();
|
||||
// 读取本地文件
|
||||
obj.preview(function (index, file, result) {
|
||||
var tr = $('<tr id="upload-' + index + '">' +
|
||||
'<td>' + file.name + '</td>' +
|
||||
'<td>' + (file.size / 1024).toFixed(1) + 'kb</td>' +
|
||||
'<td><div class="layui-progress" lay-filter="progress-demo-' + index + '"><div class="layui-progress-bar" lay-percent=""></div></div></td>' +
|
||||
'<td>' +
|
||||
'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>' +
|
||||
'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>' +
|
||||
'</td>' +
|
||||
'</tr>');
|
||||
|
||||
// 单个重传
|
||||
tr.find('.demo-reload').on('click', function () {
|
||||
obj.upload(index, file);
|
||||
});
|
||||
// 删除
|
||||
tr.find('.demo-delete').on('click', function () {
|
||||
delete files[index];
|
||||
tr.remove();
|
||||
// 清空 input file 值,以免删除后出现同名文件不可选
|
||||
uploadListIns.config.elem.next()[0].value = '';
|
||||
});
|
||||
$('#update').append(tr);
|
||||
element.render('progress');
|
||||
});
|
||||
},
|
||||
done: function (res, index, upload) {
|
||||
var that = this;
|
||||
var tr = $('#update').find('tr#upload-' + index);
|
||||
var tds = tr.children();
|
||||
tds.eq(3).html('');
|
||||
delete this.files[index];
|
||||
return;
|
||||
//}
|
||||
this.error(index, upload);
|
||||
},
|
||||
allDone: function (obj) {
|
||||
console.log(obj);
|
||||
},
|
||||
error: function (index, upload) {
|
||||
var that = this;
|
||||
var tr = $('#update').find('tr#upload-' + index);
|
||||
var tds = tr.children();
|
||||
// 显示重传
|
||||
tds.eq(3).find('.demo-reload').removeClass('layui-hide');
|
||||
},
|
||||
progress: function (n, elem, e, index) {
|
||||
element.progress('progress-demo-' + index, n + '%');
|
||||
}
|
||||
});
|
||||
|
||||
// 获取费用类型
|
||||
fetch("/reimbursement/index/reimcate")
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
var select = document.querySelector('select[name="cate"]');
|
||||
// select.innerHTML = '<option value="">请选择费用类型</option>';
|
||||
data.data.forEach((cate) => {
|
||||
var option = document.createElement("option");
|
||||
option.value = cate.id;
|
||||
option.innerText = cate.cate;
|
||||
select.appendChild(option);
|
||||
});
|
||||
select.value = '{$detail.cate}';
|
||||
form.render("select");
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
});
|
||||
|
||||
//监听提交结果
|
||||
form.on("submit(webform)", function (data) {
|
||||
fetch("/reimbursement/index/editdetailitem", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
id: document.getElementById('id').value,
|
||||
pid: document.getElementById('pid').value,
|
||||
project: document.querySelector('select[name="project"]').value,
|
||||
department: document.getElementById('department').value,
|
||||
cate: document.querySelector('select[name="cate"]').value,
|
||||
haveticket: document.querySelector('select[name="haveticket"]').value,
|
||||
price: document.getElementById('price').value,
|
||||
remark: document.getElementById('remark').value,
|
||||
times: document.getElementById('times').value,
|
||||
tickets: document.getElementById('ticketsInput').value,
|
||||
}),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((result) => {
|
||||
layer.msg(result.msg, {
|
||||
time: 1000,
|
||||
end: function () {
|
||||
if (result.code === 0) {
|
||||
var index = window.parent.layer.getFrameIndex(window.name);
|
||||
window.parent.layer.close(index);
|
||||
window.parent.layui.table.reload('reimbursementdetail'); // 刷新表格
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
<script>
|
||||
// 获取是否有票选择框元素
|
||||
const haveticketSelect = document.querySelector('select[name="haveticket"]');
|
||||
// 获取上传票据区域元素
|
||||
const uploadSection = document.querySelector('#ID-upload-demo-drag');
|
||||
// 获取无票提示信息元素
|
||||
const noTicketMsg = document.getElementById('no-ticket-msg');
|
||||
|
||||
// 初始隐藏上传票据区域
|
||||
uploadSection.style.display = 'none';
|
||||
|
||||
// 监听是否有票选择框的change事件
|
||||
haveticketSelect.addEventListener('change', function () {
|
||||
// 如果选择了有票
|
||||
if (haveticketSelect.value === '有') {
|
||||
// 显示上传票据区域
|
||||
uploadSection.style.display = 'block';
|
||||
// 隐藏无票提示信息
|
||||
noTicketMsg.style.display = 'none';
|
||||
} else {
|
||||
// 否则隐藏上传票据区域
|
||||
uploadSection.style.display = 'none';
|
||||
// 显示无票提示信息
|
||||
noTicketMsg.style.display = 'block';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<script src="/static/assets/layui/layui.js"></script>
|
||||
<script src="/static/assets/gougu/gouguInit.js"></script>
|
||||
@ -59,19 +59,17 @@
|
||||
|
||||
// console.log(data);
|
||||
if (obj.event === 'view') {
|
||||
var id = data.id; // 获取当前行数据的id
|
||||
var id = data.id;
|
||||
// console.log(id);
|
||||
// 使用layer弹出层来显示详情页面
|
||||
layui.layer.open({
|
||||
type: 2, // iframe层
|
||||
type: 2,
|
||||
title: '报销详情',
|
||||
shadeClose: true,
|
||||
shade: 0.8,
|
||||
area: ['70%', '90%'], // 宽高
|
||||
area: ['70%', '90%'],
|
||||
content: '/reimbursement/index/view?id=' + id,
|
||||
|
||||
end: function () {
|
||||
// 弹出层关闭时刷新当前页面
|
||||
layui.table.reload('reimbursement');
|
||||
}
|
||||
});
|
||||
@ -168,7 +166,7 @@
|
||||
cols: [
|
||||
[
|
||||
{ type: 'checkbox' },
|
||||
{ field: 'id', width: 80, title: '编号', sort: true, align: "center", totalRowText: '合计:' },
|
||||
{ field: 'id', width: 100, title: '编号', sort: true, align: "center"},
|
||||
{
|
||||
field: "order",
|
||||
title: "账单编号",
|
||||
@ -195,13 +193,13 @@
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
},
|
||||
{
|
||||
field: "lock",
|
||||
title: "账单状态",
|
||||
align: "center",
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
},
|
||||
// {
|
||||
// field: "lock",
|
||||
// title: "账单状态",
|
||||
// align: "center",
|
||||
// width: 120,
|
||||
// rowspan: 2,
|
||||
// },
|
||||
{
|
||||
field: "department",
|
||||
title: "隶属部门",
|
||||
|
||||
@ -33,12 +33,19 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="page-content">
|
||||
<div class="page-content">
|
||||
<div class="p-4 border-b">
|
||||
<div style="display: flex;justify-content: space-between;align-items: center;">
|
||||
<div>
|
||||
<h3 class="h3-title hover">
|
||||
<span>基本信息</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div style="color: #b3b3b3;">
|
||||
创建时间:{$detail.create_time}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="text" value="{$detail.id}" id="pid" style="display: none;">
|
||||
<div class="layui-row border-b">
|
||||
<table class="layui-table layui-table-form">
|
||||
@ -48,10 +55,10 @@
|
||||
<td>
|
||||
{$detail.order}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">创建时间
|
||||
<td class="layui-td-gray-2">创建者
|
||||
</td>
|
||||
<td>
|
||||
{$detail.create_time}
|
||||
{$detail.creater}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -67,19 +74,6 @@
|
||||
<a href="javascript:;" onclick="editstatus('{$detail.id}')" style="margin-left: 20px;">修改</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">创建者
|
||||
</td>
|
||||
<td>
|
||||
{$detail.creater}
|
||||
</td>
|
||||
<td class="layui-td-gray-2">账单状态
|
||||
</td>
|
||||
<td>
|
||||
{$detail.lock}
|
||||
<a href="javascript:;" onclick="editlock('{$detail.id}')" style="margin-left: 20px;">修改</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">备注
|
||||
</td>
|
||||
@ -102,11 +96,11 @@
|
||||
<div class="layui-row border-b">
|
||||
<table class="layui-table layui-table-form" id="reimbursementdetail"></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="close">
|
||||
</div>
|
||||
<div class="close">
|
||||
<button class="layui-btn" onclick="printPage()">打印本页</button>
|
||||
<button class="layui-btn layui-bg-blue" id="refresh">刷新</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
@ -181,7 +175,7 @@
|
||||
$("#delete").on("click", function () {
|
||||
// 只有在未报销状态下才允许删除
|
||||
if (currentStatus === "已报销") return;
|
||||
layui.layer.confirm("确定删除该内容吗?", {icon: 3, title: "提示"}, function (index) {
|
||||
layui.layer.confirm("确定删除该内容吗?", { icon: 3, title: "提示" }, function (index) {
|
||||
var checkStatus = layui.table.checkStatus('reimbursementdetail'); // 获取选中行的状态
|
||||
var data = checkStatus.data; // 获取选中的数据
|
||||
if (data.length === 0) {
|
||||
@ -189,7 +183,7 @@
|
||||
return;
|
||||
}
|
||||
var id = data[0].id; // 获取第一个选中项的 ID
|
||||
$.post("/reimbursement/index/delete", {id: id}, function (res) {
|
||||
$.post("/reimbursement/index/delete", { id: id }, function (res) {
|
||||
if (res.code === 0) {
|
||||
layui.layer.msg(res.msg);
|
||||
layui.table.reload('reimbursementdetail'); // 刷新表格
|
||||
@ -215,15 +209,15 @@
|
||||
layui.pageTable = layui.table.render({
|
||||
elem: "#reimbursementdetail",
|
||||
// toolbar: '#toolbarDemo',
|
||||
cellMinWidth: 80,
|
||||
url: "/reimbursement/index/viewitem?id=" + pid,// 数据接口
|
||||
// cellMinWidth: 80,
|
||||
url: "/reimbursement/index/viewitemlist?id=" + pid,// 数据接口
|
||||
page: true,
|
||||
limit: 50,
|
||||
totalRow: true,
|
||||
filter: "reimbursementdetail",
|
||||
cols: [
|
||||
[
|
||||
{type: 'checkbox',},
|
||||
{ type: 'checkbox', },
|
||||
{
|
||||
field: 'id',
|
||||
width: 100,
|
||||
@ -267,26 +261,28 @@
|
||||
field: "price",
|
||||
title: "报销金额",
|
||||
align: "center",
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
return '<span>' + d.price + "</span>";
|
||||
},
|
||||
totalRow: true, // 添加此行以计算总计
|
||||
},
|
||||
{
|
||||
field: "haveticket",
|
||||
title: "是否有票",
|
||||
width: 120,
|
||||
align: "center",
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
return '<span>' + d.haveticket + "</span>";
|
||||
},
|
||||
},
|
||||
// {
|
||||
// field: "haveticket",
|
||||
// title: "是否有票",
|
||||
// width: 120,
|
||||
// align: "center",
|
||||
// rowspan: 2,
|
||||
// templet: function (d) {
|
||||
// return '<span>' + d.haveticket + "</span>";
|
||||
// },
|
||||
// },
|
||||
{
|
||||
field: "tickets",
|
||||
title: "发票查看",
|
||||
align: "center",
|
||||
width: 120,
|
||||
rowspan: 2,
|
||||
templet: function (d) {
|
||||
if (d.tickets) {
|
||||
@ -389,17 +385,17 @@
|
||||
$.ajax({
|
||||
url: '/reimbursement/index/editstatus',
|
||||
type: 'POST',
|
||||
data: {id: id, status: status},
|
||||
data: { id: id, status: status },
|
||||
success: function (response) {
|
||||
if (response.code === 0) {
|
||||
layer.closeAll();
|
||||
layer.msg(response.msg, {icon: 1});
|
||||
layer.msg(response.msg, { icon: 1 });
|
||||
} else {
|
||||
layer.msg(response.msg, {icon: 2});
|
||||
layer.msg(response.msg, { icon: 2 });
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
layer.msg('请求失败', {icon: 2});
|
||||
layer.msg('请求失败', { icon: 2 });
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -410,17 +406,17 @@
|
||||
$.ajax({
|
||||
url: '/reimbursement/index/editlock',
|
||||
type: 'POST',
|
||||
data: {id: id, lock: lock},
|
||||
data: { id: id, lock: lock },
|
||||
success: function (response) {
|
||||
if (response.code === 0) {
|
||||
layer.closeAll();
|
||||
layer.msg(response.msg, {icon: 1});
|
||||
layer.msg(response.msg, { icon: 1 });
|
||||
} else {
|
||||
layer.msg(response.msg, {icon: 2});
|
||||
layer.msg(response.msg, { icon: 2 });
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
layer.msg('请求失败', {icon: 2});
|
||||
layer.msg('请求失败', { icon: 2 });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -33,29 +33,13 @@
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 220px">
|
||||
<input name="uid" style="display: none" value="" />
|
||||
<input
|
||||
type="text"
|
||||
name="user"
|
||||
placeholder="执行员工,可多选,默认是自己"
|
||||
readonly
|
||||
class="layui-input employeepicker"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<input type="text" name="user" placeholder="执行员工,可多选,默认是自己" readonly class="layui-input employeepicker"
|
||||
autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width: 240px">
|
||||
<input
|
||||
type="text"
|
||||
name="keywords"
|
||||
placeholder="工作内容"
|
||||
class="layui-input"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<input type="text" name="keywords" placeholder="工作内容" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<button
|
||||
class="layui-btn layui-btn-normal"
|
||||
lay-submit=""
|
||||
lay-filter="webform"
|
||||
>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">
|
||||
搜索
|
||||
</button>
|
||||
<button type="reset" class="gougu-clear" lay-filter="clear">清空</button>
|
||||
@ -101,29 +85,36 @@
|
||||
{
|
||||
field: "work_cate",
|
||||
title: "工作类型",
|
||||
align: "center",
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
field: "project",
|
||||
title: "所属项目",
|
||||
width: 180,
|
||||
},
|
||||
{
|
||||
field: "task",
|
||||
title: "所属任务",
|
||||
width: 400,
|
||||
},
|
||||
{ field: "title", title: "工作内容" },
|
||||
{ field: "name", title: "执行员工", align: "center", width: 80 },
|
||||
{ field: "name", title: "执行员工", width: 120 },
|
||||
{
|
||||
field: "department",
|
||||
title: "所在部门",
|
||||
align: "center",
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
field: "create_time",
|
||||
title: "记录时间",
|
||||
align: "center",
|
||||
width: 150,
|
||||
width: 240,
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
align: "center",
|
||||
width: 100,
|
||||
width: 180,
|
||||
templet: function (d) {
|
||||
return '<div class="layui-btn-group"><span class="layui-btn layui-btn-xs" lay-event="edit">修改</span><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</span></div>';
|
||||
return '<div class="layui-btn-group" style="display:flex;justify-content:space-evenly;"><span class="layui-btn layui-btn-xs" lay-event="edit">修改</span><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</span></div>';
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
@ -29,7 +29,7 @@ class Index extends BaseController
|
||||
View::assign('type', get_task_cate());
|
||||
View::assign('cate', get_work_cate());
|
||||
View::assign('task_cate', get_task_cate());
|
||||
View::assign('project', get_project($this->uid));
|
||||
View::assign('project', get_project());
|
||||
View::assign('creater', get_admin_name());
|
||||
View::assign('user_info', get_login_admin());
|
||||
return view();
|
||||
@ -254,6 +254,7 @@ class Index extends BaseController
|
||||
if (isset($param['project_id'])) {
|
||||
View::assign('project_id', $param['project_id']);
|
||||
}
|
||||
View::assign('project', get_project());
|
||||
View::assign('cate', get_work_cate());
|
||||
View::assign('type', get_task_cate());
|
||||
View::assign('id', $id);
|
||||
|
||||
@ -136,7 +136,7 @@
|
||||
[
|
||||
{
|
||||
field: "id",
|
||||
title: "任务编号",
|
||||
title: "ID",
|
||||
width: 80,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
@ -145,9 +145,8 @@
|
||||
},
|
||||
{
|
||||
field: "type_name",
|
||||
title: "紧急程度",
|
||||
title: "优先级",
|
||||
width: 80,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="layui-badge bg-priority-' +
|
||||
@ -161,7 +160,6 @@
|
||||
{
|
||||
field: "flow_name",
|
||||
title: "状态",
|
||||
align: "center",
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html =
|
||||
@ -177,7 +175,6 @@
|
||||
field: "project_id",
|
||||
title: "所属项目",
|
||||
width: 200,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<a class="link-a"' +
|
||||
@ -211,7 +208,6 @@
|
||||
field: "type_name",
|
||||
title: "任务类型",
|
||||
width: 100,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html =
|
||||
'<span class="color-status-' +
|
||||
@ -226,7 +222,6 @@
|
||||
field: "type_name",
|
||||
title: "任务性质",
|
||||
width: 220,
|
||||
align: "center",
|
||||
templet: function (d) {
|
||||
var html = '';
|
||||
if (d.is_bug === 0) {
|
||||
@ -242,7 +237,6 @@
|
||||
{
|
||||
field: "flow_name",
|
||||
title: "完成进度",
|
||||
align: "center",
|
||||
width: 150,
|
||||
templet: function (d) {
|
||||
var progress =
|
||||
@ -276,14 +270,12 @@
|
||||
{
|
||||
field: "creater_name",
|
||||
title: "创建人",
|
||||
align: "center",
|
||||
width: 80,
|
||||
},
|
||||
{
|
||||
field: "director_name",
|
||||
title: "负责人",
|
||||
align: "center",
|
||||
width: 80,
|
||||
title: "指派负责人",
|
||||
width: 140,
|
||||
},
|
||||
// { field: "assist_admin_names", title: "协作人", width: 200 },
|
||||
// { field: "cate_name", title: "工作类型", width: 90, align: "center" },
|
||||
@ -296,7 +288,7 @@
|
||||
{
|
||||
field: "end_time",
|
||||
title: "预计结束日期",
|
||||
width: 150,
|
||||
width: 180,
|
||||
templet: function (d) {
|
||||
var html = d.end_time;
|
||||
if (d.delay > 0) {
|
||||
@ -386,12 +378,13 @@
|
||||
tableReload();
|
||||
}, 10);
|
||||
});
|
||||
|
||||
//只看我按钮代码
|
||||
$("#taskForm").on("click", '[lay-filter="onlyme"]', function () {
|
||||
|
||||
let loginuser = $("#loginusers").val(); // 从隐藏的输入字段中获取loginuser的值
|
||||
let loginuser = $("#loginusers").val();
|
||||
|
||||
$("#taskForm").find('[name="director_uid"]').val(loginuser); // 将director_uid的值设置为loginuser
|
||||
$("#taskForm").find('[name="director_uid"]').val(loginuser);
|
||||
|
||||
let postData = {
|
||||
type: $("#taskForm").find('[name="type"]').val(),
|
||||
@ -410,7 +403,7 @@
|
||||
});
|
||||
|
||||
|
||||
|
||||
//重新加载表格
|
||||
function tableReload() {
|
||||
let postData = {
|
||||
type: $("#taskForm").find('[name="type"]').val(),
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
"topthink/framework": "^6.1",
|
||||
"topthink/think-filesystem": "^2.0",
|
||||
"topthink/think-orm": "^2.0",
|
||||
"topthink/think-multi-app": "^1.0",
|
||||
"topthink/think-multi-app": "^1.1",
|
||||
"topthink/think-view": "^1.0",
|
||||
"topthink/think-captcha": "^3.0",
|
||||
"phpmailer/phpmailer": "^6.7",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user