|
@@ -0,0 +1,570 @@
|
|
|
|
|
+<%@ page contentType="text/html;charset=UTF-8" %>
|
|
|
|
|
+<%@ include file="/webpage/include/taglib.jsp"%>
|
|
|
|
|
+<html>
|
|
|
|
|
+<head>
|
|
|
|
|
+ <title>发票管理</title>
|
|
|
|
|
+ <meta name="decorator" content="default"/>
|
|
|
|
|
+ <script type="text/javascript" src="${ctxStatic}/layui/layui.js"></script>
|
|
|
|
|
+ <link rel='stylesheet' type="text/css" href="${ctxStatic}/layui/css/layui.css"/>
|
|
|
|
|
+ <script src="${ctxStatic}/common/html/js/script.js"></script>
|
|
|
|
|
+ <style>
|
|
|
|
|
+ #contractTypeDoc-error{
|
|
|
|
|
+ top:80px;
|
|
|
|
|
+ left:0;
|
|
|
|
|
+ }
|
|
|
|
|
+ /*超过5个汉字,调整label的长度,以下是配套的*/
|
|
|
|
|
+ .layui-item .layui-form-label{
|
|
|
|
|
+ width:90px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .form-group .layui-item .layui-input-block,
|
|
|
|
|
+ .query .layui-input-block {
|
|
|
|
|
+ margin-left: 116px;
|
|
|
|
|
+ }
|
|
|
|
|
+ #workInvoiceProjectRelationList td{
|
|
|
|
|
+ padding-left: 0px;
|
|
|
|
|
+ padding-right: 0px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-upload-section {
|
|
|
|
|
+ padding: 10px 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-upload-section .upload-btn {
|
|
|
|
|
+ display: inline-block;
|
|
|
|
|
+ padding: 5px 15px;
|
|
|
|
|
+ background-color: #1E9FFF;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ border-radius: 3px;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-upload-section .upload-btn:hover {
|
|
|
|
|
+ background-color: #0d8de6;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-preview-area {
|
|
|
|
|
+ display: inline-block;
|
|
|
|
|
+ vertical-align: middle;
|
|
|
|
|
+ margin-left: 10px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-preview-area img {
|
|
|
|
|
+ vertical-align: middle;
|
|
|
|
|
+ border: 1px solid #e6e6e6;
|
|
|
|
|
+ border-radius: 3px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-preview-area .file-link {
|
|
|
|
|
+ color: #007bff;
|
|
|
|
|
+ text-decoration: none;
|
|
|
|
|
+ margin-right: 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-preview-area .file-link:hover {
|
|
|
|
|
+ text-decoration: underline;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-preview-area .remove-file-btn {
|
|
|
|
|
+ color: #ff5722;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ margin-left: 5px;
|
|
|
|
|
+ text-decoration: none;
|
|
|
|
|
+ }
|
|
|
|
|
+ .file-preview-area .remove-file-btn:hover {
|
|
|
|
|
+ text-decoration: underline;
|
|
|
|
|
+ }
|
|
|
|
|
+ </style>
|
|
|
|
|
+ <script type="text/javascript">
|
|
|
|
|
+ var validateForm;
|
|
|
|
|
+ function doSubmit(obj){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。
|
|
|
|
|
+ // 逐项验证必填字段(带 * 号)
|
|
|
|
|
+ var errors = [];
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 证书名称
|
|
|
|
|
+ if (!$("#name").val()) {
|
|
|
|
|
+ errors.push("证书名称");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 2. 证书编号
|
|
|
|
|
+ if (!$.trim($("#num").val())) {
|
|
|
|
|
+ errors.push("证书编号");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 3. 发证日期
|
|
|
|
|
+ if (!$.trim($("#issuingDate").val())) {
|
|
|
|
|
+ errors.push("发证日期");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 4. 专业
|
|
|
|
|
+ if (!$("#major").val()) {
|
|
|
|
|
+ errors.push("专业");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 5. 取得方式
|
|
|
|
|
+ if (!$("#issType").val()) {
|
|
|
|
|
+ errors.push("取得方式");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 6. 证书文件(新选了文件 或 已有旧文件,二选一即可)
|
|
|
|
|
+ var hasNewFile = $("#certificateFile")[0].files && $("#certificateFile")[0].files.length > 0;
|
|
|
|
|
+ var hasOldFile = '${not empty workStaffCertificate.temporaryUrl}' === 'true';
|
|
|
|
|
+ if (!hasNewFile && !hasOldFile) {
|
|
|
|
|
+ errors.push("证书文件");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (errors.length > 0) {
|
|
|
|
|
+ parent.layer.msg("请填写或上传以下必填项:<br>" + errors.join("、"), {icon: 5, html: true, time: 3000});
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 7. 检查证书名称是否已存在(AJAX 异步验证)
|
|
|
|
|
+ /*var certName = $("#name").val();
|
|
|
|
|
+ var certId = $("#id").val() || '';
|
|
|
|
|
+ $.ajax({
|
|
|
|
|
+ url: '${ctx}/workstaff/workStaffBasicCertification/checkCertificateName',
|
|
|
|
|
+ type: 'post',
|
|
|
|
|
+ data: {name: certName, id: certId},
|
|
|
|
|
+ dataType: 'json',
|
|
|
|
|
+ success: function(data) {
|
|
|
|
|
+ if (data.success) {
|
|
|
|
|
+ $("#inputForm").submit();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ parent.layer.msg(data.msg || '该证书名称已存在,不可重复添加!', {icon: 5, time: 3000});
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ error: function() {
|
|
|
|
|
+ parent.layer.msg('系统异常,证书名称重复检查失败!', {icon: 5, time: 3000});
|
|
|
|
|
+ }
|
|
|
|
|
+ });*/
|
|
|
|
|
+ $("#inputForm").submit();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $(document).ready(function() {
|
|
|
|
|
+ var billingContent = $("#billingContent").val();
|
|
|
|
|
+ if(8 != billingContent){
|
|
|
|
|
+ $(".contractType").hide();
|
|
|
|
|
+ $("#contractTypeDoc").attr("class","form-control");
|
|
|
|
|
+ }else{
|
|
|
|
|
+ $(".contractType").show();
|
|
|
|
|
+ $("#contractTypeDoc").attr("class","form-control required");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ layui.use(['form', 'layer'], function () {
|
|
|
|
|
+ var form = layui.form;
|
|
|
|
|
+
|
|
|
|
|
+ $("#attachment_btn").click(function () {
|
|
|
|
|
+ $("#attachment_file").click();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 页面加载时初始化专业下拉框,传入当前专业值用于回显
|
|
|
|
|
+ loadMajorOptions(document.getElementById('name'), '${workStaffCertificate.major}');
|
|
|
|
|
+
|
|
|
|
|
+ validateForm = $("#inputForm").validate({
|
|
|
|
|
+ submitHandler: function(form){
|
|
|
|
|
+ loading('正在提交,请稍等...');
|
|
|
|
|
+ form.submit();
|
|
|
|
|
+ },
|
|
|
|
|
+ errorContainer: "#messageBox",
|
|
|
|
|
+ errorPlacement: function(error, element) {
|
|
|
|
|
+
|
|
|
|
|
+ $("#messageBox").text("输入有误,请先更正。");
|
|
|
|
|
+ if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
|
|
|
|
|
+ error.appendTo(element.parent().parent());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ error.insertAfter(element);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ laydate.render({
|
|
|
|
|
+ elem: '#issuingDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
|
|
|
|
|
+ event: 'focus', //响应事件。如果没有传入event,则按照默认的click
|
|
|
|
|
+ type : 'date'
|
|
|
|
|
+ , trigger: 'click'
|
|
|
|
|
+ , trigger: 'click'
|
|
|
|
|
+ });
|
|
|
|
|
+ laydate.render({
|
|
|
|
|
+ elem: '#registDate', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'
|
|
|
|
|
+ event: 'focus', //响应事件。如果没有传入event,则按照默认的click
|
|
|
|
|
+ type : 'date'
|
|
|
|
|
+ , trigger: 'click'
|
|
|
|
|
+ , trigger: 'click'
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ function addRow(list, idx, tpl, row){
|
|
|
|
|
+ var idx1 = $("#workAccountList tr").length;
|
|
|
|
|
+ if(list == '#workAccountList' && idx1 < 100){
|
|
|
|
|
+ bornTemplete(list, idx, tpl, row, idx1);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ function bornTemplete(list, idx, tpl, row, idx1){
|
|
|
|
|
+ $(list).append(Mustache.render(tpl, {
|
|
|
|
|
+ idx: idx, delBtn: true, row: row,
|
|
|
|
|
+ order:idx1 + 1
|
|
|
|
|
+ }));
|
|
|
|
|
+ $(list+idx).find("select").each(function(){
|
|
|
|
|
+ $(this).val($(this).attr("data-value"));
|
|
|
|
|
+ });
|
|
|
|
|
+ $(list+idx).find("input[type='checkbox'], input[type='radio']").each(function(){
|
|
|
|
|
+ var ss = $(this).attr("data-value").split(',');
|
|
|
|
|
+ for (var i=0; i<ss.length; i++){
|
|
|
|
|
+ if($(this).val() == ss[i]){
|
|
|
|
|
+ $(this).attr("checked","checked");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function delRow(obj, prefix) {
|
|
|
|
|
+ var id = $(prefix + "_invoiceId");
|
|
|
|
|
+ var delFlag = $(prefix + "_delFlag");
|
|
|
|
|
+ if (id.val() == "") {
|
|
|
|
|
+ $(obj).parent().parent().remove();
|
|
|
|
|
+ } else if (delFlag.val() == "0") {
|
|
|
|
|
+ delFlag.val("1");
|
|
|
|
|
+ $(obj).html("÷").attr("title", "撤回删除");
|
|
|
|
|
+ $(obj).parent().parent().addClass("error");
|
|
|
|
|
+ $(obj).parent().parent().addClass("hide");
|
|
|
|
|
+ } else if (delFlag.val() == "1") {
|
|
|
|
|
+ delFlag.val("0");
|
|
|
|
|
+ $(obj).html("×").attr("title", "删除");
|
|
|
|
|
+ $(obj).parent().parent().removeClass("error");
|
|
|
|
|
+ }
|
|
|
|
|
+ var length=$("#workInvoiceProjectRelationList tr").length;
|
|
|
|
|
+ var count=length;
|
|
|
|
|
+ for (var i=1;i<=length;i++) {
|
|
|
|
|
+ var delFlag = $("#workInvoiceProjectRelationList").find("tr").eq(i-1).find("input").eq(1).val();
|
|
|
|
|
+ if (delFlag == "1") {
|
|
|
|
|
+ count =count-1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(count==1){
|
|
|
|
|
+ $("#chargeType").val("2")
|
|
|
|
|
+ layui.form.render();
|
|
|
|
|
+ }else if (count>1){
|
|
|
|
|
+ $("#chargeType").val("1")
|
|
|
|
|
+ layui.form.render();
|
|
|
|
|
+ }else if(count == 0){
|
|
|
|
|
+ $("#projectFlag").val("");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function insertTitleCollection(tValue){
|
|
|
|
|
+ var list = "${workInvoice.workAttachments}";
|
|
|
|
|
+ var size = (list.split('url')).length-1;
|
|
|
|
|
+ var files = tValue;
|
|
|
|
|
+ for(var i = 0;i<files.length;i++) {
|
|
|
|
|
+ var file = files[i];
|
|
|
|
|
+ var attachmentId = "";
|
|
|
|
|
+ var attachmentFlag = "115";
|
|
|
|
|
+ var timestamp = new Date().getTime();
|
|
|
|
|
+
|
|
|
|
|
+ var storeAs = "workInvoice";
|
|
|
|
|
+ var uploadPath = "http://gangwan-app.oss-cn-hangzhou.aliyuncs.com/" + storeAs;
|
|
|
|
|
+ /*将这段字符串存到数据库即可*/
|
|
|
|
|
+ var divId = "_attachment";
|
|
|
|
|
+ $("#addFile" + divId).show();
|
|
|
|
|
+ multipartUploadWithStsCollection(storeAs, file, attachmentId, attachmentFlag, uploadPath, divId, size);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 根据证书名称级联加载专业选项
|
|
|
|
|
+ // selectedValue: 页面初始化时用于回显当前已选中的专业值
|
|
|
|
|
+ function loadMajorOptions(obj, selectedValue){
|
|
|
|
|
+ var certificateName = obj.value;
|
|
|
|
|
+ var $major = $("#major");
|
|
|
|
|
+ $major.html('<option value=""></option>');
|
|
|
|
|
+ if (certificateName == "") {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ $.ajax({
|
|
|
|
|
+ type: "post",
|
|
|
|
|
+ url: '${ctx}/workstaff/workStaffBasicInfo/getMessage',
|
|
|
|
|
+ data: {"type": certificateName},
|
|
|
|
|
+ dataType: "json",
|
|
|
|
|
+ async: false,
|
|
|
|
|
+ success: function(data){
|
|
|
|
|
+ if(data.success) {
|
|
|
|
|
+ for (var info in data.data){
|
|
|
|
|
+ if (selectedValue && data.data[info].value == selectedValue) {
|
|
|
|
|
+ $major.append(new Option(data.data[info].label, data.data[info].value, true, true));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $major.append(new Option(data.data[info].label, data.data[info].value));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 触发隐藏的文件选择框,根据证书名称判断是否限制文件类型
|
|
|
|
|
+ function triggerFileUpload() {
|
|
|
|
|
+ var certName = $("#name").val();
|
|
|
|
|
+ var pdfOnlyNames = ['161', '151', '181'];
|
|
|
|
|
+ var $fileInput = $("#certificateFile");
|
|
|
|
|
+ if (pdfOnlyNames.indexOf(certName) >= 0) {
|
|
|
|
|
+ $fileInput.attr('accept', '.pdf');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $fileInput.removeAttr('accept');
|
|
|
|
|
+ }
|
|
|
|
|
+ $fileInput.click();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 文件选择后预览(仅前端预览,未上传服务器)
|
|
|
|
|
+ function onFileSelected(obj) {
|
|
|
|
|
+ var file = obj.files[0];
|
|
|
|
|
+ if (!file) return;
|
|
|
|
|
+
|
|
|
|
|
+ // 一级造价师、一级建造师、一级监理师仅允许上传 PDF
|
|
|
|
|
+ var certName = $("#name").val();
|
|
|
|
|
+ var pdfOnlyNames = ['161', '151', '181'];
|
|
|
|
|
+ if (pdfOnlyNames.indexOf(certName) >= 0) {
|
|
|
|
|
+ var ext = file.name.split('.').pop().toLowerCase();
|
|
|
|
|
+ if (ext !== 'pdf') {
|
|
|
|
|
+ layer.msg("当前证书名称仅支持上传 PDF 文件!", {icon: 2});
|
|
|
|
|
+ obj.value = "";
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (file.size > 50 * 1024 * 1024) {
|
|
|
|
|
+ layer.msg("请上传50M以内文件!", {icon: 2});
|
|
|
|
|
+ obj.value = "";
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 生成 blob 地址
|
|
|
|
|
+ var url = window.URL.createObjectURL(file);
|
|
|
|
|
+ var ext = file.name.split('.').pop().toLowerCase();
|
|
|
|
|
+
|
|
|
|
|
+ // 可预览的类型:图片 + PDF
|
|
|
|
|
+ var previewableTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'pdf'];
|
|
|
|
|
+ var isPreviewable = previewableTypes.indexOf(ext) >= 0;
|
|
|
|
|
+
|
|
|
|
|
+ var $preview = $("#filePreviewArea");
|
|
|
|
|
+ var html = '';
|
|
|
|
|
+
|
|
|
|
|
+ if (isPreviewable) {
|
|
|
|
|
+ // 图片/PDF:正常预览
|
|
|
|
|
+ if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].indexOf(ext) >= 0) {
|
|
|
|
|
+ html = '<img src="' + url + '" width="80" height="80"'
|
|
|
|
|
+ + ' style="cursor:pointer; vertical-align:middle;"'
|
|
|
|
|
+ + ' onclick="previewLocalFile(\'' + url + '\')"'
|
|
|
|
|
+ + ' alt="图片预览" title="点击预览图片"/>'
|
|
|
|
|
+ + ' <span style="margin-left:5px;color:#666;font-size:12px;">' + file.name + '</span>';
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // PDF
|
|
|
|
|
+ html = '<i class="fa fa-file-pdf-o" style="font-size:18px;margin-right:5px;color:#d9534f;"></i>'
|
|
|
|
|
+ + '<a class="file-link" href="javascript:void(0)"'
|
|
|
|
|
+ + ' onclick="previewLocalFile(\'' + url + '\')"'
|
|
|
|
|
+ + ' title="点击预览PDF文件">' + file.name + '</a>';
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 非预览文件(docx/xlsx/zip等):去掉预览链接,改成提示
|
|
|
|
|
+ html = '<i class="fa fa-file" style="font-size:18px;margin-right:5px;color:#666;"></i>'
|
|
|
|
|
+ + '<span style="color:#666;">' + file.name + '</span>'
|
|
|
|
|
+ + '<span style="color:#999;font-size:12px;margin-left:5px;">(仅支持下载)</span>';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 下载和移除按钮,所有文件都保留
|
|
|
|
|
+ html += ' <a href="javascript:void(0)" onclick="downloadFile(\'' + url + '\',\'' + file.name + '\')" title="下载文件" style="color:#28a745;margin-left:5px;text-decoration:none;"><i class="fa fa-download"></i></a>'
|
|
|
|
|
+ + ' <a class="remove-file-btn" onclick="removeNewFile()" title="移除文件"><i class="fa fa-times"></i></a>';
|
|
|
|
|
+
|
|
|
|
|
+ $preview.html(html);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 移除新选择的文件,恢复原有文件展示
|
|
|
|
|
+ function removeNewFile() {
|
|
|
|
|
+ $("#certificateFile").val("");
|
|
|
|
|
+ var $preview = $("#filePreviewArea");
|
|
|
|
|
+ var $original = $("#originalFileDisplay");
|
|
|
|
|
+ if ($original.html().trim() !== "") {
|
|
|
|
|
+ $preview.html($original.html());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $preview.html('<span style="color:#999;font-size:12px;">未选择文件</span>');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 本地文件预览(未上传服务器的blob URL)
|
|
|
|
|
+ function previewLocalFile(url) {
|
|
|
|
|
+ parent.layer.open({
|
|
|
|
|
+ type: 2,
|
|
|
|
|
+ area: ['90%', '90%'],
|
|
|
|
|
+ title: '文件预览',
|
|
|
|
|
+ maxmin: true,
|
|
|
|
|
+ shade: 0.2,
|
|
|
|
|
+ shadeClose: true,
|
|
|
|
|
+ content: url,
|
|
|
|
|
+ btn: ['关闭'],
|
|
|
|
|
+ cancel: function(index){}
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 下载文件(通过 fetch 获取 blob,解决跨域时浏览器直接打开而非下载的问题)
|
|
|
|
|
+ function downloadFile(fileUrl, fileName) {
|
|
|
|
|
+ fetch(fileUrl)
|
|
|
|
|
+ .then(function(resp) { return resp.blob(); })
|
|
|
|
|
+ .then(function(blob) {
|
|
|
|
|
+ var blobUrl = window.URL.createObjectURL(blob);
|
|
|
|
|
+ var a = document.createElement('a');
|
|
|
|
|
+ a.href = blobUrl;
|
|
|
|
|
+ a.download = fileName || 'download';
|
|
|
|
|
+ document.body.appendChild(a);
|
|
|
|
|
+ a.click();
|
|
|
|
|
+ document.body.removeChild(a);
|
|
|
|
|
+ window.URL.revokeObjectURL(blobUrl);
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch(function() {
|
|
|
|
|
+ window.open(fileUrl, '_blank');
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ </script>
|
|
|
|
|
+</head>
|
|
|
|
|
+<body>
|
|
|
|
|
+<div class="single-form">
|
|
|
|
|
+ <div class="container">
|
|
|
|
|
+ <form:form id="inputForm" modelAttribute="workStaffCertificate" action="${ctx}/workstaff/workStaffBasicCertification/save" enctype="multipart/form-data" method="post" class="layui-form">
|
|
|
|
|
+ <form:hidden path="id"/>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="form-group layui-row first">
|
|
|
|
|
+ <div class="form-group-label"><h2>证书详情</h2></div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label"><span class="require-item">*</span>证书名称:</label>
|
|
|
|
|
+ <div class="layui-input-block readOnlyFFF">
|
|
|
|
|
+ <form:select path="name" id="name" class="form-control simple-select required" onchange="loadMajorOptions(this)">
|
|
|
|
|
+ <form:options items="${fns:getMainDictList('certificate_type')}" itemLabel="label" itemValue="value" htmlEscape="false"/>
|
|
|
|
|
+ </form:select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label"><span class="require-item">*</span>证书编号:</label>
|
|
|
|
|
+ <div class="layui-input-block">
|
|
|
|
|
+ <form:input id="num" path="num" htmlEscape="false" class="form-control required layui-input"/>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label">发证机关:</label>
|
|
|
|
|
+ <div class="layui-input-block">
|
|
|
|
|
+ <form:input id="issuingAuthority" path="issuingAuthority" htmlEscape="false" class="form-control layui-input"/>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label"><span class="require-item">*</span>发证日期:</label>
|
|
|
|
|
+ <div class="layui-input-block">
|
|
|
|
|
+ <input placeholder="请选择发证日期" style="background-color: #fff" class="laydate-icondate form-control layui-input layer-date required laydate-icon" readonly="readonly" id="issuingDate" name="issuingDate" value="<fmt:formatDate value="${workStaffCertificate.issuingDate}" pattern="yyyy-MM-dd"/>">
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label">注册日期:</label>
|
|
|
|
|
+ <div class="layui-input-block">
|
|
|
|
|
+ <input placeholder="请选择注册日期" style="background-color: #fff" class="laydate-icondate form-control layui-input layer-date laydate-icon" readonly="readonly" id="registDate" name="registDate" value="<fmt:formatDate value="${workStaffCertificate.registDate}" pattern="yyyy-MM-dd"/>">
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label double-line">注册证书编号:</label>
|
|
|
|
|
+ <div class="layui-input-block">
|
|
|
|
|
+ <form:input id="registNum" path="registNum" htmlEscape="false" class="form-control layui-input"/>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="layui-item layui-col-sm6 lw6">
|
|
|
|
|
+ <label class="layui-form-label"><span class="require-item">*</span>专业</label>
|
|
|
|
|
+ <div class="layui-input-block readOnlyFFF">
|
|
|
|
|
+ <select id="major" name="major" value="${workStaffCertificate.major}" lay-verify="required" lay-filter="majorFilter"></select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ <div class="layui-item layui-col-sm6">
|
|
|
|
|
+ <label class="layui-form-label"><span class="require-item">*</span>取得方式:</label>
|
|
|
|
|
+ <div class="layui-input-block readOnlyFFF">
|
|
|
|
|
+ <select name="issType" id="issType" class="form-control simple-select required">
|
|
|
|
|
+ <option value="考试" <c:if test="${'考试' eq workStaffCertificate.issType}">selected</c:if>>考试</option>
|
|
|
|
|
+ <option value="考核" <c:if test="${'考核' eq workStaffCertificate.issType}">selected</c:if>>考核</option>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="layui-item layui-col-sm12 file-upload-section">
|
|
|
|
|
+ <label class="layui-form-label"><span class="require-item">*</span>证书文件:</label>
|
|
|
|
|
+ <div class="layui-input-block">
|
|
|
|
|
+ <a class="upload-btn" onclick="triggerFileUpload()">
|
|
|
|
|
+ <i class="fa fa-upload"></i> 上传/替换文件
|
|
|
|
|
+ </a>
|
|
|
|
|
+ <input id="certificateFile" name="file" type="file" style="display:none" onchange="onFileSelected(this)"/>
|
|
|
|
|
+ <div class="file-preview-area" id="filePreviewArea" style="line-height: 40px">
|
|
|
|
|
+ <c:choose>
|
|
|
|
|
+ <c:when test="${not empty workStaffCertificate.temporaryUrl}">
|
|
|
|
|
+ <c:set var="certFileName" value="${workStaffCertificate.fileName}" />
|
|
|
|
|
+ <c:set var="certExt" value="${fn:toLowerCase(fn:substringAfter(certFileName, '.'))}" />
|
|
|
|
|
+ <c:choose>
|
|
|
|
|
+ <c:when test="${certExt == 'jpg' || certExt == 'jpeg' || certExt == 'png' || certExt == 'gif' || certExt == 'bmp' || certExt == 'webp'}">
|
|
|
|
|
+ <img src="${workStaffCertificate.temporaryUrl}" width="80" height="80" onclick="preview('预览','${workStaffCertificate.temporaryUrl}','90%','90%','1')" alt="${fns:abbr(workStaffCertificate.fileName,30)}"/>
|
|
|
|
|
+
|
|
|
|
|
+ </c:when>
|
|
|
|
|
+ <c:otherwise>
|
|
|
|
|
+ <c:choose>
|
|
|
|
|
+ <c:when test="${fn:containsIgnoreCase(workStaffCertificate.fileName,'pdf')}">
|
|
|
|
|
+ <a class="file-link" href="javascript:void(0)" onclick="preview('预览','${workStaffCertificate.temporaryUrl}','90%','90%','1')">${workStaffCertificate.fileName}</a>
|
|
|
|
|
+ </c:when>
|
|
|
|
|
+ <c:otherwise>
|
|
|
|
|
+ <a class="file-link" href="javascript:void(0)" onclick="preview('预览','${workStaffCertificate.temporaryUrl}','90%','90%')">${workStaffCertificate.fileName}</a>
|
|
|
|
|
+ </c:otherwise>
|
|
|
|
|
+ </c:choose>
|
|
|
|
|
+ </c:otherwise>
|
|
|
|
|
+ </c:choose>
|
|
|
|
|
+ <a href="javascript:void(0);" onclick="downloadFile('${workStaffCertificate.temporaryUrl}','${workStaffCertificate.fileName}')"
|
|
|
|
|
+ title="下载 ${workStaffCertificate.fileName}"
|
|
|
|
|
+ style="color:#28a745;margin-left:5px;text-decoration:none;">
|
|
|
|
|
+ <i class="fa fa-download"></i>
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </c:when>
|
|
|
|
|
+ <c:otherwise>
|
|
|
|
|
+ <span style="color:#999;font-size:12px;">未上传文件</span>
|
|
|
|
|
+ </c:otherwise>
|
|
|
|
|
+ </c:choose>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <span id="originalFileDisplay" style="display:none;">
|
|
|
|
|
+ <c:if test="${not empty workStaffCertificate.temporaryUrl}">
|
|
|
|
|
+ <c:set var="certFileName2" value="${workStaffCertificate.fileName}" />
|
|
|
|
|
+ <c:set var="certExt2" value="${fn:toLowerCase(fn:substringAfter(certFileName2, '.'))}" />
|
|
|
|
|
+ <c:choose>
|
|
|
|
|
+ <c:when test="${certExt2 == 'jpg' || certExt2 == 'jpeg' || certExt2 == 'png' || certExt2 == 'gif' || certExt2 == 'bmp' || certExt2 == 'webp'}">
|
|
|
|
|
+ <img src="${workStaffCertificate.temporaryUrl}" width="80" height="80" onclick="preview('预览','${workStaffCertificate.temporaryUrl}','90%','90%','1')" alt="${fns:abbr(workStaffCertificate.fileName,30)}"/>
|
|
|
|
|
+ </c:when>
|
|
|
|
|
+ <c:otherwise>
|
|
|
|
|
+ <c:choose>
|
|
|
|
|
+ <c:when test="${fn:containsIgnoreCase(workStaffCertificate.fileName,'pdf')}">
|
|
|
|
|
+ <a class="file-link" href="javascript:void(0)" onclick="preview('预览','${workStaffCertificate.temporaryUrl}','90%','90%','1')">${workStaffCertificate.fileName}</a>
|
|
|
|
|
+ </c:when>
|
|
|
|
|
+ <c:otherwise>
|
|
|
|
|
+ <a class="file-link" href="javascript:void(0)" onclick="preview('预览','${workStaffCertificate.temporaryUrl}','90%','90%')">${workStaffCertificate.fileName}</a>
|
|
|
|
|
+ </c:otherwise>
|
|
|
|
|
+ </c:choose>
|
|
|
|
|
+ </c:otherwise>
|
|
|
|
|
+ </c:choose>
|
|
|
|
|
+ <a href="javascript:void(0);" onclick="downloadFile('${workStaffCertificate.temporaryUrl}','${workStaffCertificate.fileName}')"
|
|
|
|
|
+ title="下载 ${workStaffCertificate.fileName}"
|
|
|
|
|
+ style="color:#28a745;margin-left:5px;text-decoration:none;">
|
|
|
|
|
+ <i class="fa fa-download"></i>
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </c:if>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <span style="color:#ff5722;font-size:12px;">
|
|
|
|
|
+ 若为:一级造价师、一级建造师、一级监理师请。上传证书网站上下载的pdf原文件
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ <div class="form-group layui-row page-end"></div>
|
|
|
|
|
+ </form:form>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</div>
|
|
|
|
|
+
|
|
|
|
|
+</body>
|
|
|
|
|
+</html>
|