You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

346 lines
15 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="../../../component/layui/css/layui.css" />
<style>
html,
body {
height: 100%;
margin: 0;
overflow: hidden;
}
.dh_ico {
display: none;
}
.err_border {
border: 1px solid red !important;
}
.layui-layer-title {
padding: 0 80px 0 20px;
height: 50px;
line-height: 50px;
border-bottom: 1px solid #F0F0F0;
font-size: 14px;
color: #333;
overflow: hidden;
border-radius: 2px 2px 0 0;
}
.layui-layer-setwin {
width: 50px;
height: 100%;
position: absolute;
right: 15px;
top: 17px;
font-size: 0;
line-height: initial;
}
</style>
</head>
<body class="layui-bg-gray">
<div style="background-color: #fff;display: flex;justify-content: space-between;align-items:center;margin: 0 5px">
<div class="layui-layer-title" style="font-weight: bolder;">创建任务</div>
<div style="width: 140px;">
<button type="button" class="layui-btn layui-btn-sm" lay-on="save">保存</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" lay-on="returnList">返回</button>
</div>
</div>
<div class="layui-row layui-col-space10" style="height: 100%;">
<div class="layui-col-md2" style="height: 100%;">
<div class="layui-card" style="margin-top: 10px;margin-left: 10px;height: calc(100% - 60px);">
<div class="layui-card-header">Sheet表</div>
<div class="layui-card-body">
<ul class="layui-menu" id="sheetListView">
</ul>
<script id="sheetListScript" type="text/html">
{{# layui.each(d, function(index, item){ }}
<li lay-options="{ id: '{{item.sheet_index}}',table_name:'{{item.table_name}}' }" class="{{ index == 0 ? 'layui-menu-item-checked' : '' }}" >
<div class="layui-menu-body-title">
<a href="javascript:;">{{item.number}}. {{item.sheet_name}}</a>
<i id="ico{{item.sheet_index}}" class="layui-icon layui-icon-ok-circle {{ item.is_check == 0 ? 'dh_ico' : '' }}"
style="font-size: 18px; color: #04B543;margin-top: -10px;" ></i>
</div>
</li>
{{# }); }}
</select>
</script>
</div>
</div>
</div>
<div class="layui-col-md10" style="height: 100%;">
<div class="layui-card" style="margin-top: 10px;margin-right: 10px;height: calc(100% - 60px);">
<div class="layui-inline" style="margin-top: 15px;margin-bottom: 5px;">
<label class="layui-form-label" style="width: auto;margin-left: 1px;">数据库表名称:</label>
<div class="layui-input-inline">
<input type="text" id="tableName" placeholder="请输入数据库表名称" class="layui-input"
style="width: 300px;">
</div>
<div class="layui-input-inline">
<button class="layui-btn layui-btn-primary layui-border-green" lay-on="confirm">
<i class="layui-icon layui-icon-success"></i>
确认
</button>
</div>
</div>
<div class="layui-card-body">
<table id="data-table"></table>
<script type="text/html" id="fieldsType_select">
{{# var fieldsTypeList = [{"id":1,"name":"文本"},{"id":2,"name":"数值"},{"id":3,"name":"小数"},{"id":4,"name":"日期"}]; }}
<select name="fieldsType" class="layui-border fields-select" lay-ignore>
{{# layui.each(fieldsTypeList, function(index, item){ }}
<option value="{{item.id}}" {{item.id === d.data_type_id ? 'selected' : '' }}>{{item.name}}</option>
{{# }); }}
</select>
</script>
<script type="text/html" id="required_switch">
<input type="checkbox" title="是|否" lay-skin="switch" lay-filter="requiredSwitch" {{d.allow_blank == false ? "checked" : "" }}>
</script>
</div>
</div>
</div>
</div>
<script src="../../../component/layui/layui.js"></script>
<script>
layui.use(function () {
var form = layui.form;
var table = layui.table;
var $ = layui.jquery;
var util = layui.util;
var dropdown = layui.dropdown;
var errArr = [];
var laytpl = layui.laytpl;
var jobId = GetQueryString("job_id");
var initSheetIndex = 0;
var saveFlag = true;
//获取sheet列表
$.ajax({
type: 'GET',
async: false,
url: '/QingLong/collect/getSheets?job_id=' + jobId,
success: function (res) {
var sheetListTpl = sheetListScript.innerHTML;
var sheetListView = document.getElementById('sheetListView');
laytpl(sheetListTpl).render(res.data, function (html) {
sheetListView.innerHTML = html;
});
form.render();
}
});
tableRender(initSheetIndex);
function tableRender(sheetIndex) {
table.render({
id: 'setField',
elem: '#data-table',
url: '/QingLong/collect/getSheetStruct?job_id=' + jobId + '&sheet_index=' + sheetIndex,
height: 'full-150',
page: false,
even: true,
css: [
'.layui-table-cell{height: 50px; line-height: 40px;}',
'.layui-table-cell select{height: 36px; padding: 0 5px;}'
].join(''),
cols: [[
{ title: '序号', align: 'center', width: "5%", type: 'numbers' },
{ title: '字段名称', field: 'column_name', align: 'center', width: "20%", edit: 'text' },
{ title: '原始名称', field: 'original_name', align: 'center', width: "20%" },
{ title: '字段类型', align: 'center', width: "10%", templet: '#fieldsType_select' },
{ title: '必填', align: 'center', width: "10%", templet: '#required_switch' },
{ title: '数据范围(用,号分隔)', field: 'options', align: 'center', edit: 'text' }
]],
// skin: 'line',
defaultToolbar: [],
done: function (res, curr, count) {
var options = this;
$("#tableName").val(res.table_name);
// 获取当前行数据
table.getRowData = function (tableId, elem) {
var index = $(elem).closest('tr').data('index');
return table.cache[tableId][index] || {};
};
var tableViewElem = this.elem.next();
tableViewElem.find('.fields-select').on('change', function () {
var value = this.value;
var data = table.getRowData(options.id, this);
data.data_type_id = value;
$('#ico' + initSheetIndex).addClass('dh_ico');
});
form.on('switch(requiredSwitch)', function (obj) {
var data = table.getRowData(options.id, this);
if (obj.elem.checked) {
data.allow_blank = 0;
} else {
data.allow_blank = 1;
}
$('#ico' + initSheetIndex).addClass('dh_ico');
});
}
});
}
util.on({
confirm: function () {
var data = table.getData('setField');
if (errArr.length > 0) {
layer.msg("字段名称存在问题,请检查!", {
icon: 2,
time: 1500,
});
} else {
var tableName = $("#tableName").val();
$.ajax({
type: "POST",
async: false,
dataType: "json",
url: "/QingLong/collect/saveSheet",
data: {
"json": JSON.stringify(data),
"table_name": tableName,
"job_id": jobId,
"sheet_index": initSheetIndex
},
success: function (result) {
if (result.success) {
$('#ico' + initSheetIndex).removeClass('dh_ico');
saveFlag = true;
layer.msg("确认成功!", {
icon: 1,
time: 1500
});
} else {
layer.msg(result.message, {
icon: 2,
time: 1500
});
}
}
});
}
},
save: function () {
$.ajax({
type: 'GET',
async: false,
url: '/QingLong/collect/getSheets?job_id=' + jobId,
success: function (res) {
var data = res.data;
var count = 0;
for (var i = 0; i < data.length; i++) {
if (data[i].is_check === 0) {
count++;
}
}
if (count > 0) {
layer.msg('还有' + count + '个sheet未确认请确认后再保存', {
icon: 2,
time: 1500,
});
} else {
if (!saveFlag) {
layer.msg('有未确认的sheet表请确认后再保存', {
icon: 2,
time: 1500,
});
} else {
layer.open({
type: 2,
title: '保存任务',
shade: 0.1,
area: ['450px', '230px'],
content: './save_excel.html?job_id=' + jobId
});
}
}
}
});
},
returnList: function () {
returnTaskList();
}
});
//监听单元格编辑
table.on('edit(setField)', function (obj) {
saveFlag = false;
$('#ico' + initSheetIndex).addClass('dh_ico');
var field = obj.field;
if (field == "column_name") {
var regex = /^(?![_0-9])[a-z0-9_]{2,32}$/i;
var cellElem = obj.tr.find('td[data-field="column_name"]');
if (regex.test(obj.value)) {
var _index = errArr.indexOf(obj.index);
errArr.splice(_index, 1);
cellElem.removeClass('err_border');
} else {
if (!errArr.includes(obj.index)) {
errArr.push(obj.index);
}
layer.msg('刚修改的字段名称不正确,请重新修改!', {
icon: 2,
time: 2000
});
cellElem.addClass('err_border');
}
}
// console.log('修改的字段为' + obj.field + '<br>' + '修改的值为' + obj.value + '<br>' + JSON.stringify(obj.data));
});
//菜单的点击事件
dropdown.on('click(sheetListView)', function (options) {
initSheetIndex = options.id;
tableRender(options.id);
});
function GetQueryString(name, istop) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (typeof (istop) != "undefined") r = top.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]);
return null;
}
window.returnTaskList = function () {
window.location = "./task_list.html";
}
});
</script>
</body>
</html>