diff --git a/hg-monitor-web-base/src/main/resources/static/src/controller/commonDetail.js b/hg-monitor-web-base/src/main/resources/static/src/controller/commonDetail.js index a14e25e..9991dbf 100644 --- a/hg-monitor-web-base/src/main/resources/static/src/controller/commonDetail.js +++ b/hg-monitor-web-base/src/main/resources/static/src/controller/commonDetail.js @@ -3376,6 +3376,14 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele "provider": res.provider, "model": res.model }; + // 增加详情页接口-记录操作日志 + admin.req({ + url: common.domainName + `/api-web/inspectionReportRecord/add?resId=${resId}`, + success:(res) =>{ + + } + }); + $.ajax({ url: common.domainName + "/api-web/favorites/checkResIsExist", async: false, diff --git a/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanAdd.js b/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanAdd.js index 2ba8d98..86f672b 100644 --- a/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanAdd.js +++ b/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanAdd.js @@ -1,5 +1,5 @@ /** 采集协议基本信息 */ -layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'view', 'laytpl', 'bustype', 'userlist', 'admin'], function (exports) { +layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'view', 'setStep', 'laytpl', 'bustype', 'userlist', 'admin'], function (exports) { var $ = layui.$; var form = layui.form; var common = layui.common; @@ -8,6 +8,7 @@ layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'vie var view = layui.view; var laytpl = layui.laytpl; var admin = layui.admin; + var setStep = layui.setStep; //对外暴露的接口 exports('shutdownplanAdd', function (data) { var cutoverId = data.cutoverId; @@ -29,8 +30,16 @@ layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'vie var userSelect; var acceptUserName = ''; - setTimeout(function () { + new setStep({ + content: '.stepCont-shutdownplan', + steps: ['1', '2'], + descriptionHeader: ['基本信息', '升级申请审批信息'], + showBtn: false, + pageCount: '.pageCont', + curStep: 1,//当前显示第几页 + }) + setTimeout(function () { laydate.render({ elem: '#shutdownplanEditStartTime' @@ -41,6 +50,27 @@ layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'vie elem: '#shutdownplanEditEndTime' , type: 'datetime' }); + + laydate.render({ + elem: 'input[name="appDate"]' + , type: 'datetime' + }); + + + admin.req({ + url: domainName + '/inspection-report/file/document/list?id=63a5c772d6fb6c7dba6bd3d4d337315c&name=&types=&docIds=&checkAuth=true', + data: {}, + success: function (res) { + if (res && res.success) { + let opt = ''; + res.data.forEach(item => { + opt += `<option value="${item.id}">${item.fileName}</option>` + }) + $('select[name="appDept"]').append(opt); + } + } + }); + admin.req({ url: domainName + '/api-web/home/business/findAllBusType', data: {'type': 'per'}, @@ -223,8 +253,47 @@ layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'vie } }, 0); + form.on('submit(verifyShutdownplanBtn)', function (data) { + $('#verifyShutdownplanBtn').attr('verify-result',true); + + document.querySelectorAll('#page2 input').forEach((e,i) => { + $(e).attr("lay-verify","required"); + }) + + // 获取业务名称 + let arr = busIdSelect.getValue() + + // 系统名称:填写停机业务(会存在多个业务系统名称) + $('input[name="appName"]').val(arr.map(item => item.name).join(',')); + + + // 申请日期:填写停机计划当天日期 + let now = new Date(); + let year = now.getFullYear(); // 获取年份 + let month = now.getMonth() + 1; // 获取月份(注意,月份是从0开始计数的,所以需要加1) + let date = now.getDate(); // 获取日期 + let hours = now.getHours(); // 获取小时 + let minutes = now.getMinutes(); // 获取分钟 + let seconds = now.getSeconds(); // 获取秒钟 + $('input[name="appDate"]').val(`${year}-${month}-${date} ${hours}:${minutes}:${seconds}`); + + // 升级时间:计划升级开始止结束时间 + $('input[name="upgradeStartTime"]').val($('#shutdownplanEditStartTime').val()); + $('input[name="upgradeEndTime"]').val($('#shutdownplanEditEndTime').val()); + + // 申请内容:填停机计划名称 + $('input[name="appContent"]').val(data.field.cutoverName); + + }); + form.on('submit(saveshutdownplanBtn)', function (data) { var bean = data.field; + + delete bean['upgradeStartTime'] + delete bean['upgradeEndTime'] + delete bean['appName'] + delete bean['upgradeEndTime'] + bean.acceptUserName = acceptUserName; var loading = layer.load(2); $.ajax({ @@ -331,4 +400,4 @@ layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'xmSelect', 'vie } } }); -}); \ No newline at end of file +}); diff --git a/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanIndex.js b/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanIndex.js index 886ca77..9bbf3c9 100644 --- a/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanIndex.js +++ b/hg-monitor-web-base/src/main/resources/static/src/controller/shutdownplanIndex.js @@ -261,13 +261,14 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', return html } }, { - title: '操作', fixed: 'right', align: 'center', minWidth: 100, templet: function (d) { + title: '操作', fixed: 'right', align: 'center', minWidth: 150, templet: function (d) { var html = '<div><button shutdownplan-data-delete="' + d.cutoverId + '" class="layui-btn layui-btn-normal layui-btn-xs" lay-tips="删除"><i class="layui-icon layui-icon-delete"></i></button>'; if (d.stopStatus == '2') { html += '<button shutdownplan-data-stop="' + d.cutoverId + '" class="layui-btn layui-btn-normal layui-btn-xs" lay-tips="暂停"><i class="layui-icon layui-icon-pause"></i></button>' } else if (d.stopStatus == '3') { html += '<button shutdownplan-data-start="' + d.cutoverId + '" class="layui-btn layui-btn-normal layui-btn-xs" lay-tips="恢复"><i class="layui-icon layui-icon-play"></i></button>' } + html += '<button shutdownplan-data-down="' + d.cutoverId + '" class="layui-btn layui-btn-normal layui-btn-xs" lay-tips="下载"><i class="layui-icon layui-icon-download-circle"></i></button>' html += '</div>'; return html } @@ -294,6 +295,11 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', $('[shutdownplan-data-delete]').on('click', function () { deleteByIds($(this).attr("shutdownplan-data-delete")); }); + // 下载 + $('[shutdownplan-data-down]').on('click', function () { + let id = $(this).attr("shutdownplan-data-down") + window.open(common.domainName + `/api-web/manage/cutover/docDownload?cutoverId=${id}&access_token=${accessToken}`); + }); $('[shutdownplan-data-res]').unbind('click').on('click', function () { var $that = $(this); var id = $that.attr("shutdownplan-data-res"); @@ -521,13 +527,13 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', layer.open({ id: 'shutdownplanEditHtml', content: laytpl(res.body).render(JSON.stringify(params)), - btn: ['保存', '取消'], + //btn: ['保存', '取消'], + btn: ['下一步','上一步', '保存', '取消'], title: `<a class="layui-icon layui-icon-edit win_title_icon"></a>停机计划`+titleName, type: '1', resize: false, - area: ['80%', '90%'], + area: ['80%', '95%'], success: function (indexm, layero) { - //start 停机模式从数据字典中获取 2022-05-24 admin.req({ url: common.domainName + '/api-web/manage/ddic/findSucDdics/shutdown_plan_mode' , method: 'POST' @@ -545,10 +551,40 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', }).error(function (error) { console.error(error); }); - //end lsq 2022-05-24 + + $('.layui-layer-btn1').hide(); + $('.layui-layer-btn2').hide(); }, yes: function (index, layero) { + // 下一步 + $("#verifyShutdownplanBtn").trigger("click"); + let result = $('#verifyShutdownplanBtn').attr('verify-result'); + if(result && result === 'true'){ + $(".ystep-container-steps").find("li:nth-child(2)").trigger("click") + $('.layui-layer-btn0').hide(); + $('.layui-layer-btn1').show(); + $('.layui-layer-btn2').show(); + } + return false; + + }, + btn2: function (index, layero) { + // 上一步 + $(".ystep-container-steps").find("li:nth-child(1)").trigger("click") + $('.layui-layer-btn0').show(); + $('.layui-layer-btn1').hide(); + $('.layui-layer-btn2').hide(); + + document.querySelectorAll('#page2 input').forEach((e,i) => { + $(e).attr("lay-verify",""); + }) + $('#verifyShutdownplanBtn').attr('verify-result',false); + return false; + }, + btn3: function (index, layero) { + // 保存 $("#saveshutdownplanBtn").trigger("click"); + return false; } }) }) diff --git a/hg-monitor-web-base/src/main/resources/static/src/views/baseconfig/shutdownplan/add.html b/hg-monitor-web-base/src/main/resources/static/src/views/baseconfig/shutdownplan/add.html index d0a76b8..02db3b2 100644 --- a/hg-monitor-web-base/src/main/resources/static/src/views/baseconfig/shutdownplan/add.html +++ b/hg-monitor-web-base/src/main/resources/static/src/views/baseconfig/shutdownplan/add.html @@ -1,100 +1,210 @@ <article> <div class="layui-card-body shutdownplan-base-area layui-form-pane" style="padding-top:0px;"> - <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;"> - <legend>基本信息</legend> - </fieldset> <form class="layui-form layui-form-pane" id="shutdownplanAddForm" lay-filter="shutdownplan-add-form" - onsubmit="return false" style="max-width: 90%;margin-top: 5px;margin-left: 5%"> - <input name="cutoverId" type="hidden"> - <div class="layui-form-item"> - <label class="layui-form-label" style="min-width: 120px!important;">计划名称<span - style="color: red">*</span>:</label> - <div class="layui-inline"> - <div class="layui-input-inline layui-input-inline--long"> - <input autocomplete="off" class="layui-input" lay-verify="required" name="cutoverName" - placeholder="停机计划" type="text"> - </div> + onsubmit="return false" style="max-width: 90%;margin-left: 5%"> + + <div class="stepCont stepCont-shutdownplan"> + <!-- 菜单导航显示--> + <div class="inspection-add-title"> + <div class='ystep-container ystep-lg ystep-blue'></div> </div> - </div> - <div class="layui-form-item"> - <div class="layui-inline"> - <label class="layui-form-label" - style="min-width: 120px!important;max-width: 120px!important;">计划时间<span - style="color: red">*</span>:</label> - <div class="layui-inline"> - <div class="layui-input-inline layui-input-inline--long"> - <input class="layui-input" id="shutdownplanEditStartTime" lay-verify="required" name="startTime" - placeholder="开始时间" readonly="readonly" type="text"> + <!-- 分页容器--> + <div class="pageCont"> + <!--step1--> + <div class="stepPage" id="page1"> + <fieldset class="layui-elem-field layui-field-title" style="margin-top: 0px;"> + <legend>基本信息</legend> + </fieldset> + + <input name="cutoverId" type="hidden"> + <div class="layui-form-item"> + <label class="layui-form-label" style="min-width: 120px!important;">计划名称<span + style="color: red">*</span>:</label> + <div class="layui-inline"> + <div class="layui-input-inline layui-input-inline--long"> + <input autocomplete="off" class="layui-input" lay-verify="required" + name="cutoverName" + placeholder="停机计划" type="text"> + </div> + </div> </div> - </div> - <div class="layui-inline layui-inline--sm">-</div> - <div class="layui-inline"> - <div class="layui-input-inline layui-input-inline--long"> - <input class="layui-input" id="shutdownplanEditEndTime" lay-verify="required" name="endTime" - placeholder="结束时间" readonly="readonly" type="text"> + <div class="layui-form-item"> + <div class="layui-inline"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">计划时间<span + style="color: red">*</span>:</label> + <div class="layui-inline"> + <div class="layui-input-inline layui-input-inline--long"> + <input class="layui-input" id="shutdownplanEditStartTime" lay-verify="required" + name="startTime" + placeholder="开始时间" readonly="readonly" type="text"> + </div> + </div> + <div class="layui-inline layui-inline--sm">-</div> + <div class="layui-inline"> + <div class="layui-input-inline layui-input-inline--long"> + <input class="layui-input" id="shutdownplanEditEndTime" lay-verify="required" + name="endTime" + placeholder="结束时间" readonly="readonly" type="text"> + </div> + </div> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">停机模式<span + style="color: red">*</span>:</label> + <div class="layui-input-block" id="shutdownDdic"> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-inline layui-inline-xm-select"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">停机业务<span + style="color: red">*</span>:</label> + <div class="layui-input-inline"> + <div class="xm-select-demo" id="shutdown_plan_add_biz"></div> + </div> + </div> + <div class="layui-inline layui-inline-xm-select"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">停机资源<span + style="color: red">*</span>:</label> + <div class="layui-input-inline"> + <div class="xm-select-demo" id="shutdown_plan_add_res" + lay-tips="停机资源必须是停机业务下的资源"></div> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-inline layui-inline-xm-select"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">影响业务:</label> + <div class="layui-input-inline"> + <div class="xm-select-demo" id="shutdown_plan_add_affected_biz"></div> + </div> + </div> + <div class="layui-inline layui-inline-xm-select"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">影响资源:</label> + <div class="layui-input-inline"> + <div class="xm-select-demo" id="shutdown_plan_add_affected_res" + lay-tips="影响资源必须是停机业务或影响业务下的资源"></div> + </div> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-inline layui-inline-xm-select"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">接收人:</label> + <div class="layui-input-inline"> + <div class="xm-select-demo" id="shutdown_plan_add_acceptUserName"></div> + </div> + </div> + </div> + <div class="layui-form-item" style="display: flex;"> + <label class="layui-form-label textarea-label" + style="min-width: 120px!important;max-width: 120px!important;">描述:</label> + <div class="layui-input-block" + style="width: calc(100% - 120px)!important;margin-left: 0px!important;"> + <textarea class="layui-textarea" name="cutoverDesc"></textarea> + </div> </div> </div> - </div> - </div> - <div class="layui-form-item"> - <label class="layui-form-label" style="min-width: 120px!important;max-width: 120px!important;">停机模式<span - style="color: red">*</span>:</label> - <div class="layui-input-block" id="shutdownDdic"> - </div> - </div> - <div class="layui-form-item"> - <div class="layui-inline layui-inline-xm-select"> - <label class="layui-form-label" - style="min-width: 120px!important;max-width: 120px!important;">停机业务<span - style="color: red">*</span>:</label> - <div class="layui-input-inline"> - <div class="xm-select-demo" id="shutdown_plan_add_biz"></div> - </div> - </div> - <div class="layui-inline layui-inline-xm-select"> - <label class="layui-form-label" - style="min-width: 120px!important;max-width: 120px!important;">停机资源<span - style="color: red">*</span>:</label> - <div class="layui-input-inline"> - <div class="xm-select-demo" id="shutdown_plan_add_res" lay-tips="停机资源必须是停机业务下的资源"></div> - </div> - </div> - </div> - <div class="layui-form-item"> - <div class="layui-inline layui-inline-xm-select"> - <label class="layui-form-label" - style="min-width: 120px!important;max-width: 120px!important;">影响业务:</label> - <div class="layui-input-inline"> - <div class="xm-select-demo" id="shutdown_plan_add_affected_biz"></div> - </div> - </div> - <div class="layui-inline layui-inline-xm-select"> - <label class="layui-form-label" - style="min-width: 120px!important;max-width: 120px!important;">影响资源:</label> - <div class="layui-input-inline"> - <div class="xm-select-demo" id="shutdown_plan_add_affected_res" - lay-tips="影响资源必须是停机业务或影响业务下的资源"></div> - </div> - </div> - </div> - <div class="layui-form-item"> - <div class="layui-inline layui-inline-xm-select"> - <label class="layui-form-label" - style="min-width: 120px!important;max-width: 120px!important;">接收人:</label> - <div class="layui-input-inline"> - <div class="xm-select-demo" id="shutdown_plan_add_acceptUserName"></div> + + <!--step2--> + <div class="stepPage" id="page2"> + + <fieldset class="layui-elem-field layui-field-title" style="margin-top: 0px;"> + <legend>升级申请审批信息</legend> + </fieldset> + + <div class="layui-form-item" style="display: flex"> + <label class="layui-form-label" style="min-width: 120px!important;">申请单位<span + style="color: red">*</span>:</label> + <div class="layui-inline" style="min-width: calc(100% - 120px)!important;"> + <select name="appDept"> + </select> + </div> + </div> + + <div class="layui-form-item" style="display: flex"> + <label class="layui-form-label" style="min-width: 120px!important;"> + 申请人<span style="color: red">*</span>: + </label> + <div class="layui-inline" style="min-width: calc(100% - 120px)!important;"> + <input autocomplete="off" class="layui-input" name="appUser" placeholder="申请人" type="text"> + </div> + </div> + + <div class="layui-form-item" style="display: flex"> + <label class="layui-form-label" style="min-width: 120px!important;"> + 联系电话<span style="color: red">*</span>: + </label> + <div class="layui-inline" style="min-width: calc(100% - 120px)!important;"> + <input autocomplete="off" class="layui-input" name="appPhone" placeholder="联系电话" type="text"> + </div> + </div> + + <div class="layui-form-item" style="display: flex;"> + <label class="layui-form-label" style="min-width: 120px!important;">版本号<span + style="color: red">*</span>:</label> + <div class="layui-inline" style="width: calc(100% - 120px)!important;margin-left: 0px!important;"> + <input autocomplete="off" class="layui-input" name="appVersion" placeholder="版本号" type="text"> + </div> + </div> + + <div class="layui-form-item" style="display: flex;"> + <label class="layui-form-label" style="min-width: 120px!important;">系统名称</label> + <div class="layui-inline" style="min-width: calc(100% - 120px)!important;"> + <input autocomplete="off" class="layui-input" name="appName" readonly="readonly" placeholder="系统名称" type="text"> + </div> + </div> + + <div class="layui-form-item" style="display: flex;"> + <label class="layui-form-label" style="min-width: 120px!important;">申请日期:</label> + <div class="layui-inline" style="min-width: calc(100% - 120px)!important;"> + <input autocomplete="off" class="layui-input" name="appDate" readonly="readonly" placeholder="申请日期" type="text"> + </div> + </div> + + + <div class="layui-form-item"> + <div class="layui-inline"> + <label class="layui-form-label" + style="min-width: 120px!important;max-width: 120px!important;">升级日期:</label> + <div class="layui-inline"> + <div class="layui-input-inline layui-input-inline--long"> + <input class="layui-input" id="upgradeStartTime" name="upgradeStartTime" + placeholder="开始时间" readonly="readonly" type="text"> + </div> + </div> + <div class="layui-inline layui-inline--sm">-</div> + <div class="layui-inline"> + <div class="layui-input-inline layui-input-inline--long"> + <input class="layui-input" id="upgradeEndTime" name="upgradeEndTime" + placeholder="结束时间" readonly="readonly" type="text"> + </div> + </div> + </div> + </div> + + <div class="layui-form-item" style="display: flex;"> + <label class="layui-form-label" style="min-width: 120px!important;">申请内容:</label> + <div class="layui-inline" style="min-width: calc(100% - 120px)!important;"> + <input autocomplete="off" class="layui-input" name="appContent" readonly="readonly" placeholder="申请内容" type="text"> + </div> + </div> </div> </div> </div> - <div class="layui-form-item" style="display: flex;"> - <label class="layui-form-label textarea-label" - style="min-width: 120px!important;max-width: 120px!important;">描述:</label> - <div class="layui-input-block" style="width: calc(100% - 120px)!important;margin-left: 0px!important;"> - <textarea class="layui-textarea" name="cutoverDesc"></textarea> - </div> - </div> - <button id="saveshutdownplanBtn" lay-filter="saveshutdownplanBtn" lay-submit style="display: none" - type="submit">提交 + + <button id="saveshutdownplanBtn" lay-filter="saveshutdownplanBtn" lay-submit style="display: none" type="submit"> + 提交 + </button> + + <button id="verifyShutdownplanBtn" lay-filter="verifyShutdownplanBtn" lay-submit style="display: none" type="submit"> + 验证 </button> </form> </div> diff --git a/hg-monitor-web-base/src/main/resources/static/src/views/ins/config.html b/hg-monitor-web-base/src/main/resources/static/src/views/ins/config.html new file mode 100644 index 0000000..dfc61ff --- /dev/null +++ b/hg-monitor-web-base/src/main/resources/static/src/views/ins/config.html @@ -0,0 +1,4 @@ +<title>运维单位巡检配置</title> +<iframe class="layadmin-iframe" src="/vue3/index.html#/inspectionConfig" style="height: 99.5%!important;"/> + + diff --git a/hg-monitor-web-base/src/main/resources/static/vue3/public/css/base.css b/hg-monitor-web-base/src/main/resources/static/vue3/public/css/base.css index f2a56d6..464595d 100644 --- a/hg-monitor-web-base/src/main/resources/static/vue3/public/css/base.css +++ b/hg-monitor-web-base/src/main/resources/static/vue3/public/css/base.css @@ -264,3 +264,56 @@ custom-class="config-dialog" width: 10px; . el-scrollbar__bar . is-horizontal > div } + + +/*最外层样式*/ +.container { + +} + +.container .cm-card,.container-fluid .cm-card { + overflow-y: auto; + border-radius: 3px; +} + +.container .cm-card .search,.container-fluid .cm-card .search { + padding: 6px 10px; + display: flex; +} + +.container .cm-page-top-nav,.container-fluid.cm-page-top-nav{ + display: flex; + justify-content: space-between; + margin-bottom: 5px; + margin-top: 5px; + border-radius: 2px; + padding-top: 10px; + height: 45px; + padding-left: 5px; +} + +.container .cm-card .cm-page-body,.container-fluid .cm-card .cm-page-body { + height: calc(100% - 5px); +} + +.container .cm-page-top-nav > div:nth-child(2),.container-fluid.cm-page-top-nav > div:nth-child(2){ + margin-right:76px!important; +} + +.container .cm-page-table-nav,.container-fluid.cm-page-table-nav{ + padding-top: 10px; + padding-bottom: 10px; + text-align: left; + padding-left: 10px; +} + +.container .search-form .el-form-item,.container-fluid .search-form .el-form-item{ + margin: 0px; + padding: 0px; + margin-right: 5px; +} + +/*搜索框*/ +.keyword-input{ + width: 240px!important; +} diff --git a/hg-monitor-web-base/src/main/resources/static/vue3/src/components/common/page/index.html b/hg-monitor-web-base/src/main/resources/static/vue3/src/components/common/page/index.html new file mode 100644 index 0000000..f6765c5 --- /dev/null +++ b/hg-monitor-web-base/src/main/resources/static/vue3/src/components/common/page/index.html @@ -0,0 +1,17 @@ +<div :style="{'height':height+'px','max-height':height+'px'}" :class="isFluid ? 'container-fluid' : 'container'"> + <div :style="{'min-height':height+'px','max-height':height+'px','height':'100%'}" class="cm-card"> + <div class="cm-page-top-nav" v-if="showNav"> + <div> + <slot name="search"></slot> + </div> + <div> + <slot name="btns"></slot> + </div> + </div> + <div v-if="showBodySplit && showNav === false" style="border-top: solid 5px var(--page-el-bg-color)!important;"></div> + <div class="cm-page-body"> + <slot></slot> + </div> + </div> +</div> + diff --git a/hg-monitor-web-base/src/main/resources/static/vue3/src/components/common/page/index.js b/hg-monitor-web-base/src/main/resources/static/vue3/src/components/common/page/index.js new file mode 100644 index 0000000..e1c2a31 --- /dev/null +++ b/hg-monitor-web-base/src/main/resources/static/vue3/src/components/common/page/index.js @@ -0,0 +1,29 @@ +export default { + name: 'pageIndex', + template: '', + components: {}, + props: { + // 是否全屏 + isFluid: { + type: Boolean, + default: false + }, + showNav:{ + type: Boolean, + default: false + }, + showBodySplit:{ + type: Boolean, + default: false + } + }, + setup(props, {attrs, slots, emit}) { + const {proxy} = Vue.getCurrentInstance(); + let height = Vue.ref(window.innerHeight - 10); + + return { + height + } + } + +} diff --git a/hg-monitor-web-base/src/main/resources/static/vue3/src/main.js b/hg-monitor-web-base/src/main/resources/static/vue3/src/main.js index 0f549dc..d89c7b3 100644 --- a/hg-monitor-web-base/src/main/resources/static/vue3/src/main.js +++ b/hg-monitor-web-base/src/main/resources/static/vue3/src/main.js @@ -54,6 +54,8 @@ Promise.all([ .component('cm-user-type-tree-input', Vue.defineAsyncComponent(() => myImport('components/common/inputusertree/index'))) //菜单下拉树 .component('cm-tree-select-menu', Vue.defineAsyncComponent(() => myImport('components/common/treeSelectMenu/index'))) + // cm-page + .component('cm-page', Vue.defineAsyncComponent(() => myImport('components/common/page/index'))) //机构用户下拉树 .component('cm-tree-select-org-user', Vue.defineAsyncComponent(() => myImport('components/common/treeSelectOrgUser/index'))); diff --git a/hg-monitor-web-qh/src/main/resources/static/vue3/src/router/index.js b/hg-monitor-web-qh/src/main/resources/static/vue3/src/router/index.js index d3fd98c..6f1e463 100644 --- a/hg-monitor-web-qh/src/main/resources/static/vue3/src/router/index.js +++ b/hg-monitor-web-qh/src/main/resources/static/vue3/src/router/index.js @@ -296,6 +296,12 @@ const routes = [{ path: '/vue3/x6/index', name: 'operationLogUserList', component: () => myImport('views/x6/index') + }, + // 运维单位系统巡检记录报表功能 + { + path: '/inspectionConfig', + name: 'inspectionConfig', + component: () => myImport('views/inspectionConfig/index') } ]; diff --git a/hg-monitor-web-qh/src/main/resources/static/vue3/src/views/inspectionConfig/index.html b/hg-monitor-web-qh/src/main/resources/static/vue3/src/views/inspectionConfig/index.html new file mode 100644 index 0000000..f0110e3 --- /dev/null +++ b/hg-monitor-web-qh/src/main/resources/static/vue3/src/views/inspectionConfig/index.html @@ -0,0 +1,109 @@ +<cm-page :showNav="true"> + <template #search> + <el-form class="search-form" ref="form" :model="queryParams" label-width="80px" :inline="true"> + <el-form-item> + <el-select v-model="queryParams.type" placeholder="请选巡检类型"> + <el-option v-for="(item,index) in typeArr" :label="item.label" :value="item.value"></el-option> + </el-select> + </el-form-item> + </el-form> + </template> + <template #btns> + <el-button type="primary" size="mini" @click="getList">搜索</el-button> + </template> + + <template #default> + <div class="cm-page-table-nav"> + <el-button type="primary" size="small" @click="addModel">新增</el-button> + <el-button size="small" @click="deleteByIds" :disabled="multiple">批量删除</el-button> + </div> + <cm-table-page :columns="tableData.columns" :dataList="tableData.dataList" + :height="height - 163" + :loading="false" + :pageSize="queryParams.pageSize" + :showBorder="false" + :showIndex="false" + :showPage="true" + :showSelection="true" + :showTools="true" + :total="count" + :toolsWith="100" + @selectionChange="selectionChange" + @loaddata="refreshList"> + <template #default="{row,prop,column}"> + <div v-if="prop=='type'"> + {{ getTypeLabel(row) }} + </div> + </template> + <template #tools="{scope}"> + <div class="list-handle"> + <span class="btn-link" @click="editModel(scope.row)">编辑</span> + <span class="btn-link" @click="deleteByIds(scope.row)">删除</span> + </div> + </template> + </cm-table-page> + + <cm-dialog :showDialogVisible="showDialog" :showFooter="true" :title="title" okText="保存" @hidedialog="closeDialog" @okfunc="saveConfig" + width="80%"> + <template v-slot> + <el-form ref="formRef" :model="formParams" label-width="100px" style="display: flex" v-if="formParams.id === -1"> + <el-form-item label="时间范围" prop="timeRange" :rules="[{required: true,message: '请选择日期',trigger: 'blur'}]"> + <el-date-picker + v-model="formParams.timeRange" + type="datetimerange" + format="YYYY-MM-DD" + value-format="YYYY-MM-DD" + range-separator="至" + start-placeholder="开始时间" + end-placeholder="结束时间"/> + </el-form-item> + + <el-form-item label="巡检类型" prop="type" :rules="[{required: true,message: '请选择巡检类型',trigger: 'change',}]"> + <el-select v-model="formParams.type" placeholder="请选择巡检类型" style="width: 100%" @change="typeChange"> + <el-option v-for="(item,index) in typeArr" :label="item.label" :value="item.value"></el-option> + </el-select> + </el-form-item> + <el-button style="margin-left: 10px" type="primary" size="mini" @click="addConfig">添加</el-button> + </el-form> + + <div style="border-radius: 10px;padding: 5px;"> + <div style="text-align: left;padding-left: 10px"> + 配置列表 + </div> + <el-form ref="configFormRef" label-width="100px" > + <div v-if="configArr.length == 0"> + 暂无配置! + </div> + <div v-else v-for="(item,index) in configArr" style="border: 1px solid rgb(244, 235, 235);padding: 10px 5px;margin: 2px;border-radius: 5px;box-shadow: 1px 1px 5px -1px;"> + <div style="display: flex;flex-direction: row;width: 100%;height: 40px;"> + <el-form-item style="width: 25%;padding: 0px 10px" label="年份" prop="year" > + <el-input type="number" v-model="item.year" placeholder="年份"></el-input> + </el-form-item> + <el-form-item style="width: 25%;padding: 0px 10px" label="月份" prop="month" > + <el-input type="number" v-model="item.month" placeholder="月份"></el-input> + </el-form-item> + <el-form-item style="width: 25%;padding: 0px 10px" label="类型" prop="item.type" > + <el-select v-model="item.type" placeholder="请选巡检类型" @change="typeChange(item)"> + <el-option v-for="(item,index) in typeArr" :label="item.label" :value="item.value"></el-option> + </el-select> + </el-form-item> + <el-form-item style="width: 25%;padding: 0px 10px" label="巡检次数" prop="item.number"> + <el-input v-model="item.number" placeholder="巡检次数"></el-input> + </el-form-item> + </div> + <div style="display: flex;flex-direction: row;width: 100%;height: 40px;"> + <el-form-item style="width: calc((100% - 100px)/2);padding: 0px 10px" label="日期" prop="item.days"> + <el-input v-model="item.days" placeholder="日期"></el-input> + </el-form-item> + <el-form-item style="width: calc((100% - 100px)/2);padding: 0px 10px" label="巡检周期" prop="item.times" > + <el-input v-model="item.times" placeholder="巡检周期"></el-input> + </el-form-item> + <el-button v-if="formParams.id === -1" style="margin-left: 10px;width: 100px" type="danger" size="mini" @click="deleteConfig(item,index)">删除</el-button> + </div> + </div> + </el-form> + </div> + </template> + </cm-dialog> + </template> +</cm-page> diff --git a/hg-monitor-web-qh/src/main/resources/static/vue3/src/views/inspectionConfig/index.js b/hg-monitor-web-qh/src/main/resources/static/vue3/src/views/inspectionConfig/index.js new file mode 100644 index 0000000..16fdb0b --- /dev/null +++ b/hg-monitor-web-qh/src/main/resources/static/vue3/src/views/inspectionConfig/index.js @@ -0,0 +1,291 @@ +import global from "../../../src/script/global.js"; + +export default { + name: "algorithm", + template: "", + props: {}, + setup() { + let height = Vue.ref(window.innerHeight); + const {proxy} = Vue.getCurrentInstance(); + + let queryParams = Vue.ref({ + type: '', + pageNum: 1, + pageSize: 20, + }); + let count = Vue.ref(0); + let multiple = Vue.ref(true); + let ids = []; + + let typeArr = [ + {label: '征期', value: 0, number: 4, times: '7:00-9:30,9:30-13:00,13:00-15:30,15:30-18:00'}, + {label: '非征期', value: 1, number: 2, times: '7:00-13:00,13:00-18:00'}, + {label: '节假日', value: 2, number: 1, times: '7:00-18:00'}, + ]; + + let tableData = Vue.ref({ + dataList: [], + columns: [ + { + prop: 'year', + label: '年份', + align: 'center', + }, { + prop: 'month', + label: '月份', + align: 'center', + }, { + prop: 'days', + label: '日期', + align: 'center', + width:300 + }, { + prop: 'times', + label: '巡检时间', + align: 'center', + width:300 + }, { + prop: 'type', + label: '巡检类型', + align: 'center' + }, { + prop: 'number', + label: '巡检次数', + align: 'center', + }, { + prop: 'createBy', + label: '创建人', + align: 'center', + }, { + prop: 'createTime', + label: '创建时间', + align: 'center', + width:180 + } + ] + }) + let showDialog = Vue.ref(false); + let title = Vue.ref('新增'); + let formParams = Vue.ref({ + timeRange: '', + type: '', + number: 0, + times: '' + }); + /** + * year: '', + * month: '', + * days: '', + * times: '', + * type: '', + * number: '' + */ + let configArr = Vue.ref([]) + let formRef = Vue.ref(); + let configFormRef = Vue.ref(); + + /** + * 加载列表 + */ + const getList = () => { + proxy.$http.get( '/api-web/inspectionExcelConfig/list', queryParams.value,res => { + if(res && res.success){ + count.value = res.count; + tableData.value.dataList = res.data; + } + }) + } + + /** + * 多选 + * @param params + */ + const selectionChange = (params) => { + multiple.value = !params.length; + ids = params.map(item => item.id); + } + + /** + * 刷新表格数据 + * @param page + * @param limit + */ + const refreshList = ({page, limit}) => { + queryParams.value.pageNum = page; + queryParams.value.pageSize = limit; + } + + + /** + * 新增弹框 + */ + const addModel = () => { + showDialog.value = true; + formParams.value = { + timeRange: '', + type: '', + number: 0, + times: '', + id:-1 + }; + configArr.value = []; + } + + /** + * 关闭弹框 + */ + const closeDialog = () => { + showDialog.value = false; + } + + /** + * 保存 + */ + const saveConfig = () => { + let arr = configArr.value; + if(arr.length > 0){ + let url = '/api-web/inspectionExcelConfig/update'; + if(formParams.value.id === -1){ + url = '/api-web/inspectionExcelConfig/add'; + } + proxy.$http.post(url,arr,res => { + if(res && res.success){ + global.showMsg("操作成功!", "success"); + closeDialog(); + getList(); + } + }); + } + } + + /** + * 查看详情 + * @param row + */ + const editModel = (row) => { + title.value = '编辑' + showDialog.value = true; + formParams.value.id = row.id; + proxy.$http.get('/api-web/inspectionExcelConfig/info', {id:row.id},res => { + configArr.value = [res.object] + }); + } + + /** + * 批量删除 + * @param row + */ + const deleteByIds = (row) => { + let id = ids; + if(multiple.value){ + id = [row.id]; + } + + if (!id) { + global.showMsg("请选择要删除的数据!", "warning"); + return; + } + + global.confirm("确认删除吗?", function () { + proxy.$http.get('/api-web/inspectionExcelConfig/delete?idList=' + id.join(','), {},(res) => { + if (res.success) { + global.showMsg("删除成功", "success"); + closeDialog() + getList(); + } else { + global.showMsg("删除失败", "error"); + } + }) + }) + } + + + const typeChange = (val) => { + if(typeof val === 'object'){ + let typeInfo = typeArr.find(e => e.value == val.type); + val.number = typeInfo.number + val.times = typeInfo.times + return; + } + let typeInfo = typeArr.find(e => e.value == val); + formParams.value.number = typeInfo.number + formParams.value.times = typeInfo.times + } + + const addConfig = () => { + formRef.value.validate((valid) => { + let data = formParams.value; + let arr = data.timeRange; + let startDate = new Date(arr[0]); + let endDate = new Date(arr[1]); + + var currentDate = new Date(startDate); + while (currentDate <= endDate) { + let year = dayjs(new Date(currentDate)).format('YYYY'); + let month = dayjs(new Date(currentDate)).format('MM'); + let day = dayjs(new Date(currentDate)).format('DD'); + + let isAdd = configArr.value.find((e, i) => e.days.indexOf(day) !== -1); + if (isAdd) { + proxy.$global.showMsg("当前时间范围内存在多种巡检类型!", "warning"); + return; + } + + let current = configArr.value.find((e, i) => e.year === year && e.month === month && data.type === e.type); + if (current) { + if (current.days.indexOf(day) === -1) { + current.days = current.days + "," + day; + } + } else { + configArr.value.push({ + year: year, + month: month, + days: day, + times: data.times, + type: data.type, + number: data.number + }) + } + currentDate.setDate(currentDate.getDate() + 1); + } + formRef.value.resetFields(); + formParams.value = { + id:-1 + } + }) + } + + const deleteConfig = (item, index) => { + configArr.value.splice(index, 1); + } + + const getTypeLabel = (row) => { + let typeInfo = typeArr.find(e => e.value == row.type); + if(typeInfo){ + return typeInfo.label; + } + return ''; + } + + + Vue.onMounted(() => { + getList(); + }) + + return { + height, + // 搜索条件 + typeArr, queryParams, + // 表格 + tableData, count, refreshList, selectionChange, multiple, getList, editModel, + + deleteByIds, + title, addModel, showDialog, closeDialog, saveConfig, + + formRef, formParams, configArr, typeChange, addConfig, deleteConfig, + + configFormRef, + getTypeLabel + } + } +}