first commit

This commit is contained in:
2026-07-23 09:40:36 +08:00
commit 090abf48fa
989 changed files with 145728 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
{extend name="../../base/view/common/base" /}
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-3">新建任务</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">任务主题<font>*</font></td>
<td colspan="3"><input type="text" name="title" lay-verify="required" lay-reqText="请输入任务主题" placeholder="请输入任务主题" class="layui-input" value=""></td>
<td class="layui-td-gray-2">任务优先级<span style="color: red">*</span></td>
<td>
<select name="priority" lay-verify="required" lay-reqText="请选择优先级">
{volist name=":get_priority()" id="vo"}
{gt name="$key" value="0"}
<option value="{$key}">{$vo}</option>
{/gt}
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">工作类型<span style="color: red">*</span></td>
<td>
<select name="work_id" lay-verify="required" lay-reqText="请选择工作类型">
<option value="">请选择</option>
{volist name=":get_base_data('WorkCate')" id="vo"}
<option value="{$vo.id}">{$vo.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">预估工时<span style="color: red">*</span></td>
<td><input type="text" name="plan_hours" lay-verify="required|number" lay-reqText="请填写预估工时" placeholder="请填写预估工时" class="layui-input" value=""></td>
<td class="layui-td-gray-2">预计结束日期<span style="color: red">*</span></td>
<td><input type="text" name="end_time" readonly lay-verify="required" lay-reqText="请选择预计结束日期" placeholder="请选择时间" class="layui-input tool-time" value=""></td>
</tr>
<tr>
<td class="layui-td-gray">负责人</td>
<td>
<input type="text" name="director_name" placeholder="请选择" readonly class="layui-input picker-admin" value="">
<input type="hidden" name="director_uid" readonly value="0">
</td>
{empty name="$project_id"}
<td class="layui-td-gray">协作人</td>
<td>
<input type="text" name="assist_admin_names" placeholder="请选择" readonly class="layui-input picker-admin" data-type="2" value="">
<input type="hidden" name="assist_admin_ids" readonly value="">
</td>
<td class="layui-td-gray">关联项目</td>
<td>
<input type="text" name="project_name" placeholder="所属项目" readonly class="layui-input picker-oa" data-types="project" autocomplete="off" />
<input type="hidden" name="project_id" value="0" />
</td>
{else/}
<td class="layui-td-gray">协作人</td>
<td colspan="3">
<input type="hidden" name="project_id" readonly value="{$project_id}">
<input type="text" name="assist_admin_names" placeholder="请选择" readonly class="layui-input picker-admin" data-type="2" value="">
<input type="hidden" name="assist_admin_ids" readonly value="">
</td>
{/empty}
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">详细描述<font>*</font></td>
<td colspan="5">
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="0" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tinymce','oaPicker'];
function gouguInit() {
var form = layui.form,tool=layui.tool, oaPicker = layui.oaPicker;
//编辑器初始化
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善任务描述内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/project/task/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
+111
View File
@@ -0,0 +1,111 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.layui-unselect dl {max-height:188px;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:100px;">
<input type="text" name="username" placeholder="请选择评论人" class="layui-input picker-admin" readonly />
<input type="text" name="uid" value="" style="display:none" />
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="关键字,输入评论内容" class="layui-input"/>
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<div>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
</div>
<script type="text/html" id="toolbarDemo">
<h3>任务评论</h3>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus','oaPicker'];
function gouguInit() {
var form = layui.form,table = layui.tablePlus,tool=layui.tool, work = layui.oaSchedule;
layui.commentTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,title:'评论列表'
,url: "/project/task/comment"
,cellMinWidth: 80
,is_excel:true
,height: 'full-110'
,cols: [[ //表头
{field: 'id', title: '序号',fixed: 'left', width:80, align:'center'}
,{field: 'content', title: '评论内容'}
,{field: 'project', title: '关联项目&任务', width:300,templet:function(d){
var html='';
if(d.labor_type==0){
html='<span class="layui-color-'+d.labor_type+'">-</span>';
}
else if(d.module =='project'){
html='<span class="green">『项目』</span><a data-href="/project/index/view/id/'+d.topic_id+'.html" class="side-a">'+d.topic_name+'</a>';
}
else{
html='<span class="blue">『任务』</span><a data-href="/project/task/view/id/'+d.topic_id+'.html" class="side-a">'+d.topic_name+'</a>';
}
return html;
}}
,{field: 'to_names', title: '@关联人', width:160}
,{field: 'admin_name', title: '评论人', align:'center',width:80}
,{field: 'create_time', title: '评论时间', align:'center',width:150}
,{field: 'right', title: '操作',fixed:'right', width:90, align:'center',templet:function(d){
if(d.read==0){
return '<button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="read">设为已读</button>';
}
else if(d.read==2){
return '<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</button>';
}
else{
return '-';
}
}}
]]
});
table.on('tool(test)', function(obj){
var data = obj.data;
if (obj.event === 'read') {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.commentTable.reload();
}
}
tool.post("/project/api/read_comment", { id: data.id }, callback);
}
if (obj.event === 'del') {
layer.confirm('确定要删除该评论吗?', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/project/api/delete_comment", { id: data.id }, callback);
layer.close(index);
});
return;
}
return;
});
}
</script>
{/block}
<!-- /脚本 -->
+146
View File
@@ -0,0 +1,146 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="style"}
<style>
.layui-unselect dl {
max-height: 188px;
}
</style>
{/block}
{block name="body"}
<div class="p-page">
<div class="gg-form-bar border-t border-x">
<form id="taskForm" class="layui-form" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:100px;">
<select name="status" lay-filter="status">
<option value="">任务状态</option>
{volist name=":get_task_status()" id="vo"}
{gt name="$key" value="0"}
<option value="{$key}">{$vo}</option>
{/gt}
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="priority" lay-filter="priority">
<option value="">优先级</option>
{volist name=":get_priority()" id="vo"}
{gt name="$key" value="0"}
<option value="{$key}">{$vo}</option>
{/gt}
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:100px;">
<select name="work_id" lay-filter="cate">
<option value="">工作类型</option>
{volist name=":get_base_data('WorkCate')" id="vo"}
<option value="{$vo.id}">{$vo.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:240px;">
<input type="text" name="project_name" placeholder="所属项目" readonly class="layui-input picker-oa" data-types="project" autocomplete="off" />
<input name="project_id" style="display: none;" value="" />
</div>
<div class="layui-input-inline" style="width:160px;">
<input type="text" name="director" placeholder="任务负责人,可多选" readonly class="layui-input picker-admin" data-type="2" autocomplete="off" />
<input name="director_uid" style="display: none;" value="" />
</div>
<div class="layui-input-inline" style="width:240px;">
<input type="text" name="keywords" placeholder="关键字,任务主题/描述内容" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
</div>
<table class="layui-hide" id="task" lay-filter="task"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="add">+ 新建任务</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus','oaPicker'];
function gouguInit() {
var table = layui.tablePlus, form = layui.form, tool = layui.tool;
layui.taskTable = table.render({
elem: '#task',
title: '任务列表',
toolbar: '#toolbarDemo',
is_excel:true,
cellMinWidth: 80,
url: "/project/task/datalist", //数据接口
height: 'full-114',
cols: [[
{field: 'id', title: '任务编号', width: 80, align: 'center', fixed: 'left', templet: function (d) {
return 'T' + d.id;
}}
,{ field: 'status', title: '任务状态', align: 'center', width: 90, templet: function (d) {
var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
return html;
}
}
, { field: 'cate_name', title: '工作类型', width: 90, align: 'center'}
,{field:'title',title: '任务主题', minWidth: 300,templet:function(d){
var html = '<span class="layui-badge layui-bg-'+d.priority+'">'+d.priority_name+'</span> <a data-href="/project/task/view/id/'+d.id+'.html" class="side-a">'+d.title+'</a>';
return html;
}}
,{field:'director_name',title: '负责人', align:'center',width: 80}
,{field:'assist_admin_names',title: '协作人',width: 160}
,{field:'plan_hours',title: '预估工时', align:'center',width: 80}
,{field:'end_time',title: '预计结束日期', width: 150,templet:function(d){
var html = d.end_time;
if(d.delay>0){
html+= '<span class="red ml-1" style="font-size:12px;">逾期'+d.delay+'天</span>';
}
return html;
}}
,{field: 'right', title: '操作',fixed:'right', width:90, align:'center',templet:function(d){
var html='<div class="layui-btn-group"><button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</button><button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</button></div>';
return html;
}}
]]
});
//触发事件
table.on('toolbar(task)', function(obj){
if(obj.event === 'add'){
tool.side('/project/task/add');
return;
}
});
table.on('tool(task)', function(obj){
if(obj.event === 'view'){
tool.side('/project/task/view/id/'+obj.data.id);
return;
}
if(obj.event === 'del'){
layer.confirm('您确定要删除该任务?', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.taskTable.reload();
}
}
tool.delete("/project/task/del", { id: obj.data.id }, callback);
layer.close(index);
});
}
});
}
</script>
{/block}
<!-- /脚本 -->
+234
View File
@@ -0,0 +1,234 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.layui-unselect dl {max-height:188px;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:180px;">
<input type="text" class="layui-input tool-time" data-range="至" placeholder="选择时间区间" readonly name="range_time">
</div>
<div class="layui-input-inline" style="width:100px;">
<input type="text" name="username" placeholder="请选择员工" class="layui-input picker-admin" readonly />
<input type="text" name="uid" value="" style="display:none" />
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="关键字,输入工作内容" class="layui-input"/>
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<div>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
</div>
<script type="text/html" id="toolbarDemo">
<h3>任务工时</h3>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const is_leader = '{$is_leader}';
const role_auth = '{$role_auth}';
const hour_auth = '{$hour_auth}';
const moduleInit = ['tool','tablePlus','oaPicker','oaSchedule'];
function gouguInit() {
var form = layui.form,table = layui.tablePlus,tool=layui.tool, work = layui.oaSchedule,laydate = layui.laydate;
layui.scheduleTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,title:'工时列表'
,url: "/project/task/hour"
,cellMinWidth: 80
,is_excel:true
,height: 'full-114'
,cols: [[ //表头
{field: 'id', title: '序号',fixed: 'left', width:80, align:'center'}
,{field: 'labor_type_string', title: '工作类型', align:'center',width:90,templet:function(d){
var html='';
if(d.labor_type==0){
html='<span class="layui-color-'+d.labor_type+'">-</span>';
}
else if(d.labor_type == 1){
html='<span class="layui-color-'+d.labor_type+'">案头工作</span>';
}
else if(d.labor_type == 2){
html='<span class="layui-color-'+d.labor_type+'">外勤工作</span>';
}
return html;
}}
,{field: 'work_cate', title: '工作类别', align:'center',width:80}
,{field: 'start_time', title: '工作时间范围', align:'center',width:186,templet:function(d){
var html=d.start_time+'至'+d.end_time;
return html;
}}
,{field: 'name', title: '执行人', align:'center',width:80}
,{field: 'labor_time', title: '工时', align:'center',width:80}
,{field: 'title', title: '工作内容'}
,{field: 'task', title: '关联任务', width:200}
,{field: 'project', title: '关联项目', width:180}
,{field: 'create_time', title: '记录时间', align:'center',width:150}
,{field: 'right', title: '操作',fixed:'right', width:180, align:'center',templet:function(d){
var html='<div class="layui-btn-group">';
if(hour_auth==2 && d.admin_id==login_admin){
//开放员工自己调整
html+='<button class="layui-btn layui-btn-xs layui-bg-orange" lay-event="time">调整工时</button>';
html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</button>';
}
if(hour_auth==3 && is_leader > 0){
//开放部门负责人调整
html+='<button class="layui-btn layui-btn-xs layui-bg-orange" lay-event="time">调整工时</button>';
html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</button>';
}
if(hour_auth==4 && role_auth > 0){
//开放日常办公数据管理员调整
html+='<button class="layui-btn layui-btn-xs layui-bg-orange" lay-event="time">调整工时</button>';
html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</button>';
}
if(d.admin_id==login_admin){
html+='<button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button>';
}
html+='<button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</button>';
html+='</div>';
return html;
}}
]]
});
//更改工时
table.on('tool(test)', function(obj){
var data = obj.data;
if(obj.event === 'time'){
var content='<form class="layui-form" style="width:568px">\
<table class="layui-table" style="margin:15px 15px 0;">\
<tr>\
<td class="layui-td-gray-2">工作时间范围<font>*</font></td>\
<td>\
<input id="start_time_a" name="start_time_a" style="width:120px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:5px; width: 80px;"><select lay-filter="start_time_b" id="start_time_b"></select></div> 至 <input id="end_time_a" name="end_time_a" style="width:120px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:5px; width: 80px;"><select lay-filter="end_time_b" id="end_time_b"></select></div>\
</td>\
</tr>\
</table>\
</form>';
layer.open({
type:1,
title:'调整工时',
area:['600px','388px'],
content:content,
success:function(){
//日期时间范围
laydate.render({
elem: '#start_time_a',
type: 'date',
max:0,
format: 'yyyy-MM-dd',
showBottom: false,
done:function(a,b,c){
$('#end_time_a').val(a);
}
});
//日期时间范围
laydate.render({
elem: '#end_time_a',
type: 'date',
max:0,
format: 'yyyy-MM-dd',
showBottom: false,
done:function(a,b,c){
$('#start_time_a').val(a);
}
});
$('#start_time_b,#end_time_b').empty();
var hourArray=[];
for(var h=0;h<24;h++){
var t=h<10?'0'+h:h
var t_1=t+':00',t_2=t+':15',t_3=t+':30',t_4=t+':45';
hourArray.push(t_1,t_2,t_3,t_4);
}
var html_1='', html_2='',def_h1='09:00',def_h2='09:30';
for(var s=0;s<hourArray.length;s++){
var check_1='',check_2='';
if(hourArray[s]==def_h1){
check_1='selected';
}
if(hourArray[s]==def_h2){
check_2='selected';
}
html_1 += '<option value="'+hourArray[s]+'" '+check_1+'>'+hourArray[s]+'</option>';
html_2 += '<option value="'+hourArray[s]+'" '+check_2+'>'+hourArray[s]+'</option>';
}
$('#start_time_b').append(html_1);
$('#end_time_b').append(html_2);
form.render();
},
btn: ['确定提交'],
btnAlign: 'c',
yes: function(idx){
let start_time_a = $('#start_time_a').val();
let end_time_a = $('#end_time_a').val();
let start_time_b = $('#start_time_b').val();
let end_time_b = $('#end_time_b').val();
if(start_time_a=='' || end_time_a==''){
layer.msg('请选择工作时间范围');
return;
}
$.ajax({
url: "/oa/api/update_schedule",
type:'post',
data:{
id:data.id,
admin_id:data.admin_id,
start_time_a:start_time_a,
end_time_a:end_time_a,
start_time_b:start_time_b,
end_time_b:end_time_b
},
success:function(e){
layer.msg(e.msg);
if(e.code==0){
layer.close(idx);
layui.scheduleTable.reload();
}
}
})
}
})
}
else if(obj.event === 'edit'){
work.add(0, obj.data);
}
else if(obj.event === 'view'){
work.view(obj.data);
}
else if(obj.event === 'del'){
layer.confirm('您确定要删除该工作记录?', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.scheduleTable.reload();
}
}
tool.delete("/oa/schedule/del", { id: obj.data.id }, callback);
layer.close(index);
});
}
});
}
</script>
{/block}
<!-- /脚本 -->
+255
View File
@@ -0,0 +1,255 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.layui-tab-title .layui-this{background-color:#fff;}
.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
.layui-card-tips {color: #969696;}
.layui-card-value {padding: 4px 0 16px;font-size: 18px;color: #1E9FFF;}
.content-content{line-height:1.6;}
.content-content p{margin-bottom:6px;}
.content-content img{max-width:100%; padding:8px; box-sizing: border-box;}
.log-item i{font-weight:800; color:#323232}
.log-content strong{margin:0 4px; color:#323232}
.layui-unselect dl {max-height:188px;}
.layui-table td.table-content img{max-width:100%; height:auto;}
</style>
{/block}
{block name="body"}
<div class="p-page">
<h3 class="pb-3">任务详情</h3>
<table class="layui-table layui-table-form" id="task">
<tr>
<td class="layui-td-gray">任务主题</td>
<td colspan="3" class="click-edit" data-types="text" data-field="title">{$detail.title|default=''}</td>
<td class="layui-td-gray">工作类型</td>
<td class="click-edit" data-types="picker" data-field="work_id" data-type="1" data-picker="workcate">{$detail.cate_name|default='-'}</td>
</tr>
<tr>
<td class="layui-td-gray">负责人员</td>
<td class="click-edit" data-types="adminpicker" data-field="director_uid" data-type="1" data-ids="{$detail.director_uid}" data-names="{$detail.director_name|default=''}">{$detail.director_name|default=''}</td>
<td class="layui-td-gray">协作人</td>
<td colspan="3" class="click-edit" data-types="adminpicker" data-field="assist_admin_ids" data-type="2" data-ids="{$detail.assist_admin_ids}" data-names="{$detail.assist_admin_names|default=''}">{$detail.assist_admin_names|default=''}</td>
</tr>
<tr>
<td class="layui-td-gray">优先级</td>
<td class="click-edit" data-types="dropdown" data-field="priority" data-array="priority" data-text="{$detail.priority}">{$detail.priority_name}</td>
<td class="layui-td-gray">关联项目</td>
<td colspan="3" class="click-edit" data-types="picker" data-field="project_id" data-type="1" data-picker="project">{$detail.project_name|default='-'}</td>
</tr>
<tr>
<td class="layui-td-gray">完成进度</td>
<td class="click-edit" data-types="num" data-field="done_ratio" data-text="{$detail.done_ratio}" data-min="0" data-max="100">{$detail.done_ratio|default='0'}%</td>
<td class="layui-td-gray">估计结束日期</td>
<td class="click-edit" data-types="oadate" data-field="end_time">{$detail.end_time|date='Y-m-d'}</span>{gt name="$detail.delay" value="0"}<span class="red">『逾期 {$detail.delay}天』</span>{/gt}</td>
<td class="layui-td-gray-3">估计工作量(工时)</td>
<td class="click-edit" data-types="num" data-field="plan_hours">{$detail.plan_hours|default=''}</td>
</tr>
<tr>
<td class="layui-td-gray">任务状态</td>
<td class="click-edit" data-types="dropdown" data-field="status" data-array="status" data-text="{$detail.status}">{$detail.status_name}</td>
<td class="layui-td-gray-2">实际完成日期</td>
<td>{eq name="$detail.over_time" value="0"}-{else/}{$detail.over_time|date='Y-m-d'}{/eq}</td>
<td class="layui-td-gray">实际工时</td>
<td>{eq name="$detail.work_hours" value="0"}-{else/}{$detail.work_hours}{/eq}</td>
</tr>
<tr>
<td class="layui-td-gray">相关附件 <button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids|default=''}">
{notempty name="$file_array"}
{volist name="$file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
{/volist}
{/notempty}
</div>
</td>
</tr>
<tr>
<td colspan="6" class="click-edit" data-types="editor" data-field="content" data-target="content" style="background-color:#FAFAFA;"><strong>任务描述</strong></td>
</tr>
<tr>
<td colspan="6" id="content" class="table-content">{$detail.content|raw}</td>
</tr>
</table>
<div class="layui-tab layui-tab-card" style="margin:0;" lay-filter="docDemoTabBrief">
<ul class="layui-tab-title">
<li class="layui-this">工作记录({$detail.schedules})</li>
<li>员工评论(<span id="commentTotal">0</span>)</li>
<li>操作日志(<span id="logListTotal">0</span>)</li>
</ul>
<div class="layui-tab-content py-1 px-3" style="background-color:#fff;">
<div class="layui-tab-item layui-show py-2">
<table class="layui-hide" id="table_work" lay-filter="table_work"></table>
</div>
<div class="layui-tab-item comment-list">
<div class="comment-input my-2">
<input type="text" id="commentInput" readonly placeholder="发表一下你的看法" class="layui-input" value="">
</div>
<div id="commentBox"></div>
</div>
<div class="layui-tab-item logs-list">
<div id="logList" class="log-timeline p-3"></div>
</div>
</div>
</div>
</div>
<script type="text/html" id="toolbarDemo">
<div>
<div class="layui-input-inline" style="margin-right:12px;"><strong>工作日志</strong></div><div class="layui-input-inline"><button class="layui-btn layui-btn-xs" type="button" lay-event="add">+ </button></div>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const admin_id = '{$detail.admin_id}';
const detail_id = '{$detail.id}';
const status_array = {:json_encode(get_task_status(1),JSON_UNESCAPED_UNICODE)};
const priority_array = {:json_encode(get_priority(1),JSON_UNESCAPED_UNICODE)};
const moduleInit = ['tool','oaPicker','oaEdit','oaSchedule','oaComment','uploadPlus'];
function gouguInit() {
const oaEdit = layui.oaEdit,work = layui.oaSchedule,comment = layui.oaComment, uploadPlus = layui.uploadPlus, tool = layui.tool, table = layui.table;
oaEdit.log('logList','Task',detail_id);
comment.init({
"box":'commentBox',//容器id
"input": 'commentInput',
"topic_id":detail_id,
"module": 'task',
});
let edit_callback = function(e){
layer.msg(e.msg);
if(e.code==0){
setTimeout(function(){
location.reload();
},1000)
}
}
//附件上传
var attachment = new uploadPlus({
"target":'uploadBtn',
"targetBox":'uploadBox',
"attachment":{
"type":1,//0ajax多文件模式,1ajax单文件单记录模式
"uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
"ajaxSave":function(res){
tool.post('/project/api/add_file',{'topic_id':detail_id,'file_id':res.data.id,'file_name': res.data.name, 'module': 'task'},edit_callback);
},
"ajaxDelete":function(file_id){
tool.delete('/project/api/delete_file', {id: file_id}, edit_callback);
}
}
});
//快捷编辑
oaEdit.init({
box:'task',
id:detail_id,
url: "/project/task/add",
dropdown:{
status:status_array,
priority:priority_array
}
});
//工作记录相关
layui.scheduleTable = table.render({
elem: "#table_work"
, toolbar: "#toolbarDemo"
,url: "/oa/api/get_schedule"
,page: true
,limit: 20
,where:{task_id:detail_id}
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '工作内容',minWidth:240}
,{field: 'name', title: '所属人员', align:'center',width:80}
,{field: 'start_time', title: '工作时间范围', align:'center',width:260,templet:function(d){
var html=d.start_time+' 至 '+d.end_time;
return html;
}}
,{field: 'labor_type_string', title: '工作类型', align:'center',width:80}
,{field: 'labor_time', title: '工时', align:'center',width:80}
,{field:'create_time', title: '创建时间',width:150,align:'center'}
,{width:90,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
if(d.admin_id !== login_admin){
return btn1;
}
else{
var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
html = '<div class="layui-btn-group">'+btn1+btn2+'</div>';
return html;
}
}}
]]
});
table.on('toolbar(table_work)',function (obj) {
if (obj.event === 'add') {
work.add(detail_id,{'id':0});
}
});
table.on('tool(table_work)',function (obj) {
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
var data = obj.data;
if (obj.event === 'view') {
work.view(data);
return;
}
if (obj.event === 'edit') {
work.add(data.task_id,data);
return;
}
if (obj.event === 'del') {
layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/project/task/del", { id: data.id }, callback);
layer.close(index);
});
return;
}
});
//工作记录相关
$('.add-schedule').on('click', function () {
work.add(detail_id,{'id':0});
})
//回复
$('#comment_task_' + detail_id).on('click', '[data-event="replay"]', function () {
let pid = $(this).data('id');
let to_uid = $(this).data('uid');
let to_unames = $(this).data('unames');
comment.textarea(0,detail_id,'task','',pid,to_uid,to_unames);
})
//编辑
$('#comment_task_' + detail_id).on('click', '[data-event="edit"]', function () {
let id = $(this).data('id');
let content = $('#comment_' + id).data('content');
comment.textarea(id, detail_id, 'task', content,0,0,'');
})
//删除
$('#comment_task_' + detail_id).on('click', '[data-event="del"]', function () {
let id = $(this).data('id');
comment.del(id, detail_id, 'task');
})
}
</script>
{/block}