| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 | <% if (ctx.session.sessionUser.accountId === ctx.tender.data.user_id && ctx.tender.data.ledger_status === auditConst.status.checked &&        (settles.length === 0 || settles[settles.length- 1].audit_status === auditConst.status.checked)) { %><!--弹出添加期--><div class="modal fade" id="add-qi" data-backdrop="static">    <div class="modal-dialog" role="document">        <form class="modal-content" action="/tender/<%- ctx.tender.id %>/settle/add" method="post" onsubmit="return checkValidSettle(this);">            <div class="modal-header">                <h5 class="modal-title">添加新一期</h5>            </div>            <div class="modal-body">                <div class="form-group">                    <label>期</label>                    <input class="form-control form-control-sm" value="第 <%- settles.length + 1 %> 期" type="text" readonly="">                </div>                <div class="form-group">                    <label>结算年月<b class="text-danger">*</b></label>                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text" name="date" autocomplete="off">                </div>                <div class="form-group">                    <label>结算周期<b class="text-danger">*</b></label>                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text" name="period" autocomplete="off">                </div>            </div>            <div class="modal-footer">                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>                <button type="submit" class="btn btn-primary btn-sm" id="add-stage-btn">确定添加</button>            </div>        </form>    </div></div><% } %><!--审批流程/结果--><div class="modal fade" id="sp-list" data-backdrop="static">    <div class="modal-dialog modal-lg" role="document">        <div class="modal-content">            <div class="modal-header">                <h5 class="modal-title">审批流程</h5>            </div>            <div class="modal-body">                <div class="row">                    <div class="col-4 modal-height-500" style="overflow: auto">                        <div class="card mt-3">                            <ul class="list-group list-group-flush" id="auditor-list">                            </ul>                        </div>                    </div>                    <div class="col-8 modal-height-500" style="overflow: auto" id="audit-list">                    </div>                </div>            </div>            <div class="modal-footer">                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>            </div>        </div>    </div></div><% if (settles.length > 0 && settles[0].user_id === ctx.session.sessionUser.accountId) { %><!--设置--><div class="modal fade" id="edit" data-backdrop="static">    <div class="modal-dialog" role="document">        <form class="modal-content" action="/tender/<%- ctx.tender.id %>/settle/save" method="post" onsubmit="return checkValidSettle(this);">            <div class="modal-header">                <h5 class="modal-title">期编辑</h5>            </div>            <div class="modal-body">                <div class="form-group">                    <label>期</label>                    <input class="form-control form-control-sm" id="edit-name" value="第 <%- settles[0].order %> 期" type="text" readonly="" name="name">                </div>                <div class="form-group">                    <label>结算年月<b class="text-danger">*</b></label>                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly name="date" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text">                </div>                <div class="form-group">                    <label>结算周期<b class="text-danger">*</b></label>                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly name="period" placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text">                </div>            </div>            <div class="modal-footer">                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />                <input type="hidden" name="order" id="edit-order" value="<%- settles[0].order %>">                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>                <button type="submit" class="btn btn-primary btn-sm" id="edit-ok" >确定修改</button>            </div>        </form>    </div></div><% } %><script src="/public/js/datepicker/datepicker.min.js"></script><script src="/public/js/datepicker/datepicker.zh.js"></script><script src="/public/js/moment/moment.min.js"></script><script>    const tenderId = '<%- ctx.tender.id %>';    const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');    const auditType = JSON.parse('<%- JSON.stringify(auditType) %>');    $('.datepicker-here').datepicker({        autoClose: true,    });    $('.edit-stage').on('click', function () {        const index = parseInt($(this).data('index'));        const editDate = $('#edit-date').datepicker().data('datepicker');        $('#edit-name').val('第 ' + settles[index].order + ' 期');        $('#edit-order').val(settles[index].order);        if (settles[index].s_time && settles[index].s_time !== '') {            editDate.selectDate(new Date(settles[index].s_time));        }        const period = [];        for (const p of settles[index].period.split('~')) {            if (p && p !== '') {                period.push(new Date(p));            }        }        const editPeriod = $('#edit-period').datepicker().data('datepicker');        if (period.length > 0) {            editPeriod.selectDate(period);        }    });    function checkValidSettle(obj) {        const date = $('input[name=date]', obj).val();        if (date === '') {            toastr.error('请选择结算年月');            return false;        }        const period = $('input[name=period]', obj).val();        if (period === '') {            toastr.error('请选择结算周期');            return false;        }        const startDate = period.split('~')[0];        const endDate = period.split('~')[1] ? period.split('~')[1] : null;        if ((startDate.indexOf(date) === -1 && !endDate) || (startDate.indexOf(date) === -1 && endDate && endDate.indexOf(date) === -1)) {            toastr.error('所选日期与当前月份不匹配,请重新选择');            $('input[name="period"]', obj).parents('.form-group').find('.text-danger').remove();            $('input[name="period"]', obj).parents('.form-group').append('<small class="text-danger">所选日期与当前月份不匹配,请重新选择</small>');            return false;        }        return true;    }    $('#audit-list').on('click', 'a', function() {        const type = $(this).data('target')        const auditCard = $(this).parent().parent()        if (type === 'show') {            $(this).data('target', 'hide')            auditCard.find('.fold-card').slideDown('swing', () => {                auditCard.find('#end-target').text($(this).data('idx') + '#')                auditCard.find('#fold-btn').text('收起历史审核记录')            })        } else {            $(this).data('target', 'show')            auditCard.find('.fold-card').slideUp('swing', () => {                auditCard.find('#end-target').text('1#')                auditCard.find('#fold-btn').text('展开历史审核记录')            })        }    });    const getGroupAuditHtml = function (group) {        return group.map(u => { return `<small class="d-inline-block text-dark mx-1" title="${u.role}" data-auditorId="${u.aid}">${u.name}</small>`; }).join('');    };    const getAuditTypeHtml = function (type) {        if (type === auditType.key.common) return '';        return `<div class="li-subscript"><span class="badge badge-pill badge-${auditType.info[type].class} p-1 badge-bg-small"><small>${auditType.info[type].short}</small></span></div>`;    };    const getAuditTypeText = function (type) {        if (type === auditType.key.common) return '';        return `<span class="text-${auditType.info[type].class}">${auditType.info[type].long}</span>`;    };    const getAuditorsHtml = function (auditors) {        const auditorsHTML = [];        auditors.forEach((group, idx) => {            if (idx === 0) {                auditorsHTML.push(`<li class="list-group-item d-flex justify-content-between align-items-center">                    <span class="mr-1"><i class="fa fa fa-play-circle fa-rotate-90"></i></span>                <span class="text-muted">${getGroupAuditHtml(group)}</span>                <span class="badge badge-light badge-pill ml-auto"><small>原报</small></span>                </li>`);            } else if(idx === auditors.length -1 && idx !== 0) {                auditorsHTML.push(`<li class="list-group-item d-flex justify-content-between align-items-center">                    <span class="mr-1"><i class="fa fa fa-stop-circle fa-rotate-90"></i></span>                <span class="text-muted">${getGroupAuditHtml(group)}</span>                <div class="d-flex ml-auto">                ${getAuditTypeHtml(group[0].audit_type)}                <span class="badge badge-light badge-pill ml-auto"><small>终审</small></span>                </div>                </li>`);            } else {                auditorsHTML.push(`<li class="list-group-item d-flex justify-content-between align-items-center">                    <span class="mr-1"><i class="fa fa fa-chevron-circle-down"></i></span>                <span class="text-muted">${getGroupAuditHtml(group)}</span>                <div class="d-flex ml-auto">                ${getAuditTypeHtml(group[0].audit_type)}                <span class="badge badge-light badge-pill"><small>${transFormToChinese(idx)}审</small></span>                </div>                </li>`);            }        });        return auditorsHTML;    }    const getAuditHistroyHtml = function (auditHistory) {        const historyHTML = [];        auditHistory.forEach((his, idx) => {            if (idx === auditHistory.length - 1 && auditHistory.length !== 1) {                historyHTML.push(`<div class="text-right"><a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a></div>`);            }            historyHTML.push(`<div class="${idx < auditHistory.length - 1 ? 'fold-card' : ''}">`);            historyHTML.push(`<div class="text-center text-muted">${idx+1}#</div>`);            historyHTML.push(`<ul class="timeline-list list-unstyled mt-2 ${ idx === auditHistory.length - 1 && auditHistory.length !== 1 ? 'last-auditor-list' : '' }">`);            his.forEach((group) => {                historyHTML.push(`<li class="timeline-list-item pb-2 ${ group.audit_status === auditConst.status.uncheck && idx === auditHistory.length - 1 && auditHistory.length !== 1 ? 'is_uncheck' : ''}">`);                if (group.auditYear) {                    historyHTML.push(`<div class="timeline-item-date">${group.auditYear}<span>${group.auditDate}</span><span>${group.auditTime}</span></div>`);                }                if (group.audit_order < his.length - 1) {                    historyHTML.push('<div class="timeline-item-tail"></div>');                }                if (group.audit_status === auditConst.status.checked) {                    historyHTML.push('<div class="timeline-item-icon bg-success text-light"><i class="fa fa-check"></i></div>');                } else if (group.audit_status === auditConst.status.checkNo || group.audit_status === auditConst.status.checkNoPre || group.status === auditConst.status.checkCancel) {                    historyHTML.push('<div class="timeline-item-icon bg-warning text-light"><i class="fa fa-level-up"></i></div>');                } else if (group.audit_status === auditConst.status.checking) {                    historyHTML.push('<div class="timeline-item-icon bg-warning text-light"><i class="fa fa-ellipsis-h"></i></div>');                } else {                    historyHTML.push('<div class="timeline-item-icon bg-secondary text-light"></div>');                }                historyHTML.push('<div class="timeline-item-content">');                if (group.audit_order > 0) {                    const statuStr = group.audit_status !== auditConst.status.uncheck ?                        `<span class="pull-right ${auditConst.statusClass[group.audit_status]}">${auditConst.statusString[group.audit_status]}</span>` : '';                    historyHTML.push(`<div class="py-1">                        <span class="text-black-50">                        ${ !group.is_final ? group.audit_order + '' : '终' }审 ${getAuditTypeText(group.audit_type)}                        </span>                        ${statuStr}                    </div>`);                } else {                    historyHTML.push(` <div class="py-1">                        <span class="text-black-50">原报</span>                        <span class="pull-right text-success">${idx !== 0 ? '重新' : '' }上报审批</span>                    </div>`);                }                historyHTML.push('<div class="card"><div class="card-body px-3 py-0">');                for (const [i, auditor] of group.auditors.entries()) {                    historyHTML.push(`<div class="card-text p-2 py-3 row ${ ( i > 0 ? 'border-top' : '') }">`);                    historyHTML.push(`<div class="col"><span class="h6">${auditor.name}</span><span class="text-muted ml-1">${auditor.role}</span></div>`);                    historyHTML.push('<div class="col">');                    if (auditor.audit_status === auditConst.status.checked) {                        historyHTML.push('<span class="pull-right text-success"><i class="fa fa-check-circle"></i></span>');                    } if (auditor.audit_status === auditConst.status.checkNo || auditor.audit_status === auditConst.status.checkNoPre || auditor.audit_status === auditConst.status.checkCancel) {                        historyHTML.push('<span class="pull-right text-warning"><i class="fa fa-share-square fa-rotate-270"></i></span>');                    }                    historyHTML.push('</div>');                    if (group.audit_order > 0 && auditor.opinion) {                        historyHTML.push(`<div class="col-12 py-1 bg-light"><i class="fa fa-commenting-o mr-1"></i>${auditor.opinion}</div>`);                    }                    historyHTML.push('</div>');                }                historyHTML.push('</div></div>');                historyHTML.push('</div>');                historyHTML.push('</li>');            });            historyHTML.push('</div>');            historyHTML.push('</ul>');        });        return historyHTML.join('');    }    // 获取审批流程    $('a[data-target="#sp-list" ]').on('click', function () {        postData('/tender/' + tenderId + '/settle/auditors', { order: $(this).attr('s-order') }, function (result) {            $('#auditor-list').html(getAuditorsHtml(result.hisUserGroup));            $('#audit-list').html(getAuditHistroyHtml(result.auditHistory));        });    });    $(window).resize(checkTableWidth);    function checkTableWidth() {        if($('table th[name=contract_tp]').outerWidth() < 107) {            $('table th[name=contract_tp]').html('本期<br>合同计量');            $('table th[name=qc_tp]').html('本期数量<br>变更计量');            $('table th[name=tp]').html('本期<br>完成计量');            $('table th[name=pre_tp]').html('截止上期<br>完成计量');            $('table th[name=end_tp]').html('截止本期<br>完成计量');        } else {            $('table th[name=contract_tp]').html('本期合同计量');            $('table th[name=qc_tp]').html('本期数量变更计量');            $('table th[name=tp]').html('本期完成计量');            $('table th[name=pre_tp]').html('截止上期完成计量');            $('table th[name=end_tp]').html('截止本期完成计量');        }    }    $(function () {        checkTableWidth();    });</script>
 |