hdm 338038c8b4 重写上传文件的模板展示,及js方法,图片、PDF文件支持在线查看功能,其他文件下载查看,系统整体提升了文件更能的操作体验。
修复了客户模块的日志展示错误bug,发票到账模块支持上传附件功能,可以上传到账凭据等资料。
2023-04-17 23:11:29 +08:00

583 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

layui.define(['tool'], function (exports) {
const layer = layui.layer, tool = layui.tool,form=layui.form, table=layui.table, upload = layui.upload;
// 查找指定的元素在数组中的位置
Array.prototype.indexOf = function (val) {
for (var i = 0; i < this.length; i++) {
if (this[i] == val) {
return i;
}
}
return -1;
};
// 通过索引删除数组元素
Array.prototype.remove = function (val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};
//格式化文件大小
function renderSize(value){
if(null==value||value==''){
return "0 Bytes";
}
var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
var index=0;
var srcsize = parseFloat(value);
index=Math.floor(Math.log(srcsize)/Math.log(1024));
var size =srcsize/Math.pow(1024,index);
size=size.toFixed(2);//保留的小数位数
return size+unitArr[index];
}
const obj = {
addFile: function (options) {
let that = this;
let settings = {
type:0,
btn: 'uploadBtn',
box: 'fileBox',
url: "/api/index/upload",
accept: 'file', //普通文件
exts: 'png|jpg|gif|jpeg|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z', //只允许上传文件格式
colmd:4,
isSave:false,
uidDelete:false,
ajaxSave:null,
ajaxDelete:null
};
let opts = $.extend({}, settings, options);
let box = $('#'+opts.box);
let boxInput = box.find('[data-type="file"]');
//删除
box.on('click', '.btn-delete', function () {
let file_id = $(this).data('id');
let id = $(this).data('id');
let uid = $(this).data('uid');
if (uid != login_admin && opts.uidDelete==true) {
layer.msg('你不是该文件的上传人,无权限删除');
return false;
}
let idsStr = boxInput.val(),idsArray = [];
if (typeof idsStr !== 'undefined' && idsStr != '') {
idsArray = idsStr.split(",");
idsArray.remove(file_id);
}
layer.confirm('确定删除该附件吗?', {
icon: 3,
title: '提示'
}, function(index) {
if (typeof (opts.ajaxDelete) === "function") {
//ajax删除
if(opts.type==1){
opts.ajaxDelete(file_id);
}
else{
opts.ajaxDelete(idsArray.join(','));
}
}
else{
//虚拟删除
boxInput.val(idsArray.join(','));
$('#fileItem' + file_id).remove();
}
layer.close(index);
});
})
//多附件上传
upload.render({
elem: '#'+opts.btn,
url: opts.url,
accept: opts.accept,
exts: opts.exts,
multiple: true,
before: function(obj){
layer.msg('上传中...', {icon: 16, time: 0});
},
done: function(res){
if (res.code == 0) {
//上传成功
if(opts.type==0){
let idsStr = boxInput.val(),idsArray = [];
if (typeof idsStr !== 'undefined' && idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.push(res.data.id);
let filesize = renderSize(res.data.filesize);
let type_icon = 'icon-sucaiziyuan';
let view_btn = '<a class="blue" href="'+res.data.filepath+'" download="'+res.data.name+'" target="_blank" title="下载查看"><i class="iconfont icon-tuiguangshezhi"></i></a>';
if(res.data.fileext == 'pdf'){
type_icon = 'icon-lunwenguanli';
view_btn = '<span class="file-view-pdf blue" data-href="'+res.data.filepath+'" title="在线查看"><i class="iconfont icon-yuejuan"></i></span>';
}
if(res.data.fileext == 'jpg' || res.data.fileext == 'jpeg' || res.data.fileext == 'png' || res.data.fileext == 'gif'){
type_icon = 'icon-sucaiguanli';
view_btn = '<span class="file-view-img blue" data-href="'+res.data.filepath+'" title="在线查看"><i class="iconfont icon-tupianguanli"></i></span>';
}
let temp = `<div class="layui-col-md${opts.colmd}" id="fileItem${res.data.id}">
<div class="file-card">
<i class="file-icon iconfont ${type_icon}"></i>
<div class="file-info">
<div class="file-title">${res.data.name}</div>
<div class="file-ops">${filesize},一分钟前</div>
</div>
<div class="file-tool">${view_btn}<span class="btn-delete red" data-id="${res.data.id}" title="删除"><i class="iconfont icon-shanchu"></i></span></div>
</div>
</div>`;
boxInput.val(idsArray.join(','));
box.append(temp);
if (typeof (opts.ajaxSave) === "function" && opts.isSave ==true) {
opts.ajaxSave(idsArray.join(','));
}
else{
layer.msg(res.msg);
}
}
if(opts.type==1){
if (typeof (opts.ajaxSave) === "function" && opts.isSave ==true) {
opts.ajaxSave(res);
}
}
}else{
layer.msg(res.msg);
}
}
});
},
//选择部门
departmentPicker:function(type,callback){
let select_type = type==1?'radio':'checkbox',departmentTable;
layer.open({
type:1,
title:'选择部门',
area:['500px','536px'],
content:`<div style="width:468px; height:420px; padding:12px;">
<div id="departmentBox"></div>
</div>`,
success:function(){
departmentTable=table.render({
elem: '#departmentBox'
,url: "/api/index/get_department"
,page: false //开启分页
,cols: [[
{type:select_type,title: '选择'}
,{field:'id', width:80, title: '编号', align:'center'}
,{field:'title',title: '部门名称'}
]]
});
},
btn: ['确定'],
btnAlign:'c',
yes: function(){
var checkStatus = table.checkStatus(departmentTable.config.id);
var data = checkStatus.data;
if(data.length>0){
callback(data);
layer.closeAll();
}else{
layer.msg('请选择部门');
return;
}
}
})
},
//选择岗位
positionPicker:function(type,callback){
let select_type = type==1?'radio':'checkbox',positionTable;
layer.open({
title:'选择岗位',
type:1,
area:['390px','436px'],
content:'<div style="padding:12px"><div id="positionBox"></div></div>',
success:function(){
positionTable=table.render({
elem: '#positionBox'
,url: "/api/index/get_position"
,page: false //开启分页
,cols: [[
{type:select_type,title: '选择'}
,{field:'id', width:80, title: '编号', align:'center'}
,{field:'name',title: '岗位名称'}
]]
});
},
btn: ['确定'],
btnAlign:'c',
yes: function(){
var checkStatus = table.checkStatus(positionTable.config.id);
var data = checkStatus.data;
if(data.length>0){
callback(data);
layer.closeAll();
}else{
layer.msg('请选择岗位');
return;
}
}
})
},
//选择服务类型
servicePicker:function(type,callback){
let select_type = type==1?'radio':'checkbox',departmentTable;
var serviceTable;
layer.open({
title: '选择服务类型',
area: ['500px', '536px'],
type: 1,
content: '<div class="picker-table"><div id="serviceTable"></div></div>',
success: function () {
serviceTable = table.render({
elem: '#serviceTable'
, url: '/api/index/get_services'
,page: false
, cols: [[
{ type: select_type, title: '选择' }
, { field: 'id', width: 100, title: '编号', align: 'center' }
, { field: 'title', title: '服务名称' }
]]
});
},
btn: ['确定'],
btnAlign: 'c',
yes: function(){
var checkStatus = table.checkStatus(serviceTable.config.id);
var data = checkStatus.data;
if(data.length>0){
callback(data);
layer.closeAll();
}else{
layer.msg('请选择服务类型');
return;
}
}
})
},
//选择客户
customerPicker:function(callback){
var customeTable;
layer.open({
title: '选择客户',
area: ['600px', '580px'],
type: 1,
content: '<div class="picker-table">\
<form class="layui-form pb-2">\
<div class="layui-input-inline" style="width:480px;">\
<input type="text" name="keywords" placeholder="客户名称" class="layui-input" autocomplete="off" />\
</div>\
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="search_customer">提交搜索</button>\
</form>\
<div id="customerTable"></div></div>',
success: function () {
customeTable = table.render({
elem: '#customerTable'
, url: '/contract/api/get_customer'
, page: true //开启分页
, limit: 10
, cols: [[
{ type: 'radio', title: '选择' }
, { field: 'id', width: 100, title: '编号', align: 'center' }
, { field: 'name', title: '客户名称' }
]]
});
//客户搜索提交
form.on('submit(search_customer)', function (data) {
customeTable.reload({ where: { keywords: data.field.keywords }, page: { curr: 1 } });
return false;
});
},
btn: ['确定'],
btnAlign: 'c',
yes: function () {
var checkStatus = table.checkStatus(customeTable.config.id);
var data = checkStatus.data;
if (data.length > 0) {
callback(data[0]);
layer.closeAll();
}
else {
layer.msg('请先选择客户');
return false;
}
}
})
},
//选择合同
contractPicker:function(callback){
var contractTable;
layer.open({
title: '选择合同',
area: ['720px', '580px'],
type: 1,
content: '<div class="picker-table">\
<form class="layui-form pb-2">\
<div class="layui-input-inline" style="width:600px;">\
<input type="text" name="keywords" placeholder="合同名称" class="layui-input" autocomplete="off" />\
</div>\
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="search_contract">提交搜索</button>\
</form>\
<div id="contractTable"></div></div>',
success: function () {
contractTable = table.render({
elem: '#contractTable'
, url: '/contract/api/get_contract'
, page: true //开启分页
, limit: 10
, cols: [[
{ type: 'radio', title: '选择' }
, { field: 'code', width: 168, title: '合同编号', align: 'center' }
, { field: 'name', title: '合同名称' }
, { field: 'customer_name', title: '客户名称',width: 240}
]]
});
//合同搜索提交
form.on('submit(search_contract)', function (data) {
contractTable.reload({ where: { keywords: data.field.keywords }, page: { curr: 1 } });
return false;
});
},
btn: ['确定'],
btnAlign: 'c',
yes: function () {
var checkStatus = table.checkStatus(contractTable.config.id);
var data = checkStatus.data;
if (data.length > 0) {
callback(data[0]);
layer.closeAll();
}
else {
layer.msg('请先选择合同');
return false;
}
}
})
},
//选择项目
projectPicker:function(callback){
var projectTable;
let projectLayer = layer.open({
title: '选择项目',
area: ['600px', '580px'],
type: 1,
content: '<div class="picker-table">\
<form class="layui-form pb-2">\
<div class="layui-input-inline" style="width:480px;">\
<input type="text" name="keywords" placeholder="项目名称" class="layui-input" autocomplete="off" />\
</div>\
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="search_project">提交搜索</button>\
</form>\
<div id="projectTable"></div></div>',
success: function () {
projectTable = table.render({
elem: '#projectTable'
, url: '/project/api/get_project'
, page: true //开启分页
, limit: 10
, cols: [[
{ type: 'radio', title: '选择' }
, { field: 'id', width: 100, title: '编号', align: 'center' }
, { field: 'title', title: '项目名称' }
]]
});
//合同搜索提交
form.on('submit(search_project)', function (data) {
projectTable.reload({ where: { keywords: data.field.keywords }, page: { curr: 1 } });
return false;
});
},
btn: ['确定'],
btnAlign: 'c',
yes: function () {
var checkStatus = table.checkStatus(projectTable.config.id);
var data = checkStatus.data;
if (data.length > 0) {
callback(data[0]);
layer.close(projectLayer);
}
else {
layer.msg('请先选择项目');
return false;
}
}
})
},
//选择任务
taskPicker:function(project_id,callback){
var taskTable;
let taskLayer = layer.open({
title: '选择任务',
area: ['600px', '580px'],
type: 1,
content: '<div class="picker-table">\
<form class="layui-form pb-2">\
<div class="layui-input-inline" style="width:480px;">\
<input type="text" name="keywords" placeholder="任务主题" class="layui-input" autocomplete="off" />\
</div>\
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="task_project">提交搜索</button>\
</form>\
<div id="taskTable"></div></div>',
success: function () {
taskTable = table.render({
elem: '#taskTable'
, url: '/project/api/get_task'
, page: true //开启分页
, limit: 10
, where:{'project_id':project_id}
, cols: [[
{ type: 'radio', title: '选择' }
, { field: 'id', width: 100, title: '编号', align: 'center' }
, { field: 'title', title: '任务主题' }
]]
});
//合同搜索提交
form.on('submit(search_project)', function (data) {
taskTable.reload({ where: { keywords: data.field.keywords }, page: { curr: 1 } });
return false;
});
},
btn: ['确定'],
btnAlign: 'c',
yes: function () {
var checkStatus = table.checkStatus(taskTable.config.id);
var data = checkStatus.data;
if (data.length > 0) {
callback(data[0]);
layer.close(taskLayer);
}
else {
layer.msg('请先选择任务主题');
return false;
}
}
})
}
};
//查看图片文件
$('body').on('click','.file-view-img',function () {
let href = $(this).data('href');
if(href){
let photos = { "data": [{"src": href}]};
layer.photos({
photos: photos
,anim: 5 //0-6的选择指定弹出图片动画类型默认随机请注意3.0之前的版本用shift参数
});
}
});
//查看pdf文件
$('body').on('click','.file-view-pdf',function () {
let href = $(this).data('href');
if(href){
layer.open({
type: 2,
title: '查看PDF文件可以最大化看',
shadeClose: true,
shade: false,
maxmin: true, //开启最大化最小化按钮
area: ['900px', '600px'],
content: href
});
}
});
//选择部门
$('body').on('click','.picker-depament',function () {
let that = $(this);
let callback = function(data){
that.val(data[0].title);
that.next().val(data[0].id);
}
obj.departmentPicker(1,callback);
});
$('body').on('click','.picker-depaments',function () {
let that = $(this),ids = [],names=[];
let callback = function(data){
for ( var i = 0; i <data.length; i++){
ids.push(data[i].id);
names.push(data[i].title);
}
that.val(names.join(','));
that.next().val(ids.join(','));
}
obj.departmentPicker(2,callback);
});
//选择岗位
$('body').on('click','.picker-position',function () {
let that = $(this);
let callback = function(data){
that.val(data[0].name);
that.next().val(data[0].id);
}
obj.positionPicker(1,callback);
});
$('body').on('click','.picker-positions',function () {
let that = $(this),ids = [],names=[];
let callback = function(data){
for ( var i = 0; i <data.length; i++){
ids.push(data[i].id);
names.push(data[i].name);
}
that.val(names.join(','));
that.next().val(ids.join(','));
}
obj.positionPicker(2,callback);
});
//选择服务
$('body').on('click','.picker-service',function () {
let that = $(this);
let callback = function(data){
that.val(data[0].title);
that.next().val(data[0].id);
}
obj.servicePicker(1,callback);
});
$('body').on('click','.picker-services',function () {
let that = $(this),ids = [],names=[];
let callback = function(data){
for ( var i = 0; i <data.length; i++){
ids.push(data[i].id);
names.push(data[i].title);
}
that.val(names.join(','));
that.next().val(ids.join(','));
}
obj.servicePicker(2,callback);
});
//选择客户
$('body').on('click','.picker-customer',function () {
let that = $(this);
let callback = function(data){
that.val(data.name);
that.next().val(data.id);
}
obj.customerPicker(callback);
});
//选择合同
$('body').on('click','.picker-contract',function () {
let that = $(this);
let callback = function(data){
that.val(data.name);
that.next().val(data.id);
}
obj.contractPicker(callback);
});
//选择项目
$('body').on('click','.picker-project',function () {
let that = $(this);
let callback = function(data){
that.val(data.title);
that.next().val(data.id);
}
obj.projectPicker(callback);
});
exports('oaTool', obj);
});