|
|
@@ -1,451 +1,581 @@
|
|
|
<template>
|
|
|
- <div ref="containerRef" class="app-container">
|
|
|
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
|
|
- <el-form-item label="上报单位" prop="repOrgGuid">
|
|
|
- <el-input v-model="queryParams.repOrgGuid" placeholder="请输入上报单位" clearable style="width: 240px" @keyup.enter="handleQuery" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="上报期间" prop="repName">
|
|
|
- <el-input v-model="queryParams.repName" placeholder="请输入上报期间" clearable style="width: 240px" @keyup.enter="handleQuery" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="上报状态" prop="repAct">
|
|
|
- <el-select v-model="queryParams.repAct" placeholder="请选择上报状态" clearable style="width: 240px">
|
|
|
- <el-option v-for="dict in rep_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
|
- <el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
-
|
|
|
- <el-row :gutter="10" class="mb8">
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['hidd:monrepperi:add']">新增</el-button>
|
|
|
- </el-col>
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['hidd:monrepperi:edit']">修改</el-button>
|
|
|
- </el-col>
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['hidd:monrepperi:remove']">删除</el-button>
|
|
|
- </el-col>
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hidd:monrepperi:export']">导出</el-button>
|
|
|
- </el-col>
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button type="info" plain icon="Unlock" @click="handleUnlock" v-hasPermi="['hidd:monrepperi:edit']">一键解锁</el-button>
|
|
|
- </el-col>
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button type="danger" plain icon="Bell" :disabled="multiple" @click="handleUrge" v-hasPermi="['hidd:monrepperi:edit']">督促上报</el-button>
|
|
|
- </el-col>
|
|
|
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-monrepperi-index"></right-toolbar>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <div class="table-wrapper">
|
|
|
- <el-table :height="tableHeight" v-loading="loading" :data="monRepPeriList" @selection-change="handleSelectionChange">
|
|
|
- <el-table-column type="selection" width="55" align="center" />
|
|
|
- <el-table-column label="上报单位" align="center" prop="repOrgGuid" v-if="columns.repOrgGuid.visible" :show-overflow-tooltip="true" />
|
|
|
- <el-table-column label="上报期间" align="center" prop="repName" v-if="columns.repName.visible" />
|
|
|
- <el-table-column label="上报状态" align="center" prop="repAct" v-if="columns.repAct.visible">
|
|
|
- <template #default="scope">
|
|
|
- <el-tag v-if="scope.row.repAct === '2'" type="success" effect="plain">已上报</el-tag>
|
|
|
- <el-tag v-else-if="scope.row.repAct === '1'" type="warning" effect="plain">待审批</el-tag>
|
|
|
- <el-tag v-else-if="scope.row.repAct === '3'" type="danger" effect="plain">已退回</el-tag>
|
|
|
- <el-tag v-else type="info" effect="plain">未上报</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="上报时间" align="center" prop="repTime" v-if="columns.repTime.visible" width="180" />
|
|
|
- <el-table-column label="退回说明" align="center" prop="returnDesc" v-if="columns.returnDesc.visible" :show-overflow-tooltip="true" />
|
|
|
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250">
|
|
|
- <template #default="scope">
|
|
|
- <el-tooltip content="修改" placement="top">
|
|
|
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hidd:monrepperi:edit']"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- <el-tooltip content="详情" placement="top">
|
|
|
- <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- <el-tooltip content="下级月报" placement="top">
|
|
|
- <el-button link type="primary" icon="Document" @click="handleSubMonth(scope.row)"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- <el-tooltip content="撤回审批" placement="top" v-if="scope.row.repAct === '2'">
|
|
|
- <el-button link type="warning" icon="Stamp" @click="handleVerify(scope.row)" v-hasPermi="['hidd:monrepperi:edit']"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- <el-tooltip content="删除" placement="top">
|
|
|
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hidd:monrepperi:remove']"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
+ <div class="app-container">
|
|
|
+ <div class="global-top-bar">
|
|
|
+ <span v-html="promptText" style="font-weight: bold; font-size: 13px;"></span>
|
|
|
+ </div>
|
|
|
+ <div class="month-layout">
|
|
|
+ <div class="tree-panel">
|
|
|
+ <div class="tree-header">
|
|
|
+ 上报状态
|
|
|
+ <span class="status-dot reported"></span> 已上报
|
|
|
+ <span class="status-dot unreported"></span> 未上报
|
|
|
+ <el-button link type="primary" icon="Refresh" @click="loadTree" style="float:right;" />
|
|
|
+ </div>
|
|
|
+ <el-tree
|
|
|
+ ref="treeRef"
|
|
|
+ :data="treeData"
|
|
|
+ :props="treeProps"
|
|
|
+ node-key="id"
|
|
|
+ :highlight-current="true"
|
|
|
+ :expand-on-click-node="true"
|
|
|
+ :default-expand-all="false"
|
|
|
+ @node-click="handleNodeClick"
|
|
|
+ >
|
|
|
+ <template #default="{ data }">
|
|
|
+ <span v-if="data.IsUpload !== undefined" :style="{ color: data.IsUpload === 1 ? '#579575' : '#D8B83F' }">
|
|
|
+ {{ data.label }}
|
|
|
+ </span>
|
|
|
+ <span v-else>{{ data.label }}</span>
|
|
|
+ </template>
|
|
|
+ </el-tree>
|
|
|
+ </div>
|
|
|
+ <div class="table-panel">
|
|
|
+ <div class="filter-bar">
|
|
|
+ <span class="filter-label">月报期间:</span>
|
|
|
+ <span style="font-size:13px;">{{ periodText }}</span>
|
|
|
+ <span class="filter-label" style="margin-left:12px;">上报单位:</span>
|
|
|
+ <el-radio-group v-model="unitType" @change="loadStats" class="filter-radios">
|
|
|
+ <el-radio value="0">本单位上报</el-radio>
|
|
|
+ <el-radio value="1">直属单位上报</el-radio>
|
|
|
+ <el-radio value="3">流域机构上报</el-radio>
|
|
|
+ <el-radio value="2">下级水行政部门上报</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ <el-button size="small" @click="handlePendingApproval" style="margin-left:auto;">
|
|
|
+ 待审批<el-badge v-if="pendingCount > 0" :value="pendingCount" :max="99" style="margin-left:4px;" />
|
|
|
+ </el-button>
|
|
|
+ <el-button size="small" type="primary" @click="handleReport">上报</el-button>
|
|
|
+ <el-button size="small" @click="handleBatchRevoke">撤销</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="action-bar">
|
|
|
+ <span class="filter-label">选择月份:</span>
|
|
|
+ <el-select v-model="selectedMonth" placeholder="请选择月份" size="small" style="width:160px" @change="handleMonthChange">
|
|
|
+ <el-option v-for="item in monthOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ <el-button size="small" @click="handleBatchUnlock" style="margin-left:12px;">一键解锁</el-button>
|
|
|
+ <el-button size="small" @click="handleCustomPeriod">自定义上报期</el-button>
|
|
|
+ </div>
|
|
|
+ <el-table v-loading="loading" :data="statsList" stripe border height="calc(100vh - 280px)" style="width: 100%">
|
|
|
+ <el-table-column label="序号" align="center" type="index" width="55" />
|
|
|
+ <el-table-column label="上报单位" align="center" min-width="130" :show-overflow-tooltip="true">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-link type="primary" @click="handleOrgDetail(scope.row)">{{ scope.row.repName || scope.row.orgName || '--' }}</el-link>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="上报时间" align="center" width="90">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.row.repAct === '1' ? (scope.row.repTime ? scope.row.repTime.substring(0, 10) : '--') : '' }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="隐患数量" align="center">
|
|
|
+ <el-table-column label="重大隐患" align="center" width="80" prop="impHiddCount" />
|
|
|
+ <el-table-column label="逾期未整改" align="center" width="90" prop="overUnImplRect" />
|
|
|
+ <el-table-column label="未落实整改" align="center" width="90" prop="unSolvedCount" />
|
|
|
+ <el-table-column label="正在整改" align="center" width="80" prop="solvingCount" />
|
|
|
+ <el-table-column label="完成整改" align="center" width="80" prop="hasSolvedCount" />
|
|
|
+ <el-table-column label="整改率" align="center" width="70">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.row.solveRate != null ? Number(scope.row.solveRate * 100).toFixed(2) + '%' : '0.00%' }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" align="center" width="110" fixed="right">
|
|
|
+ <template #default="scope">
|
|
|
+ <template v-if="unitType === '0'">
|
|
|
+ <el-button v-if="scope.row.repAct === '1'" link type="primary" @click="handleRevocApply(scope.row)">回撤</el-button>
|
|
|
+ <span v-else style="color: #999;">未上报</span>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <el-tag v-if="scope.row.repAct === '1'" type="success" size="small">已上报</el-tag>
|
|
|
+ <el-button v-else link type="warning" @click="handleSupervise(scope.row)">督促上报</el-button>
|
|
|
+ <el-button v-if="scope.row.repAct === '1'" link type="danger" @click="handleReturn(scope.row)">退回</el-button>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
- <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
-
|
|
|
- <!-- 添加或修改月报期间对话框 -->
|
|
|
- <el-dialog :title="title" v-model="open" width="600px" append-to-body>
|
|
|
- <el-form :model="form" :rules="rules" ref="monRepPeriRef" label-width="100px">
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="上报单位" prop="repOrgGuid">
|
|
|
- <el-input v-model="form.repOrgGuid" placeholder="请输入上报单位" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="上报期间" prop="repName">
|
|
|
- <el-select v-model="form.repName" placeholder="请选择上报期间" filterable allow-create>
|
|
|
- <el-option v-for="m in 12" :key="m" :label="currentYear + '年' + m + '月'" :value="currentYear + '-' + String(m).padStart(2, '0')" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="上报状态" prop="repAct">
|
|
|
- <el-select v-model="form.repAct" placeholder="请选择上报状态">
|
|
|
- <el-option v-for="dict in rep_stat" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="开始日期" prop="startDate">
|
|
|
- <el-date-picker v-model="form.startDate" type="date" placeholder="选择开始日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="结束日期" prop="endDate">
|
|
|
- <el-date-picker v-model="form.endDate" type="date" placeholder="选择结束日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="退回说明" prop="returnDesc">
|
|
|
- <el-input v-model="form.returnDesc" type="textarea" placeholder="请输入退回说明" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-dialog title="月报撤回申请" v-model="revocOpen" width="500px" append-to-body>
|
|
|
+ <el-form :model="revocForm" ref="revocRef" label-width="100px">
|
|
|
+ <el-form-item label="撤回原因" prop="revocDesc" :rules="[{ required: true, message: '请填写撤回原因', trigger: 'blur' }]">
|
|
|
+ <el-input v-model="revocForm.revocDesc" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请输入撤回原因(500字以内)" />
|
|
|
+ </el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button type="primary" @click="submitForm">确 定</el-button>
|
|
|
- <el-button @click="cancel">取 消</el-button>
|
|
|
- </div>
|
|
|
+ <el-button type="primary" @click="submitRevoc">确 定</el-button>
|
|
|
+ <el-button @click="revocOpen = false">取 消</el-button>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
|
|
|
- <!-- 撤回审批对话框 -->
|
|
|
- <el-dialog title="撤回审批" v-model="verifyOpen" width="600px" append-to-body>
|
|
|
- <el-form :model="verifyForm" :rules="verifyRules" ref="verifyRef" label-width="100px">
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="上报单位">
|
|
|
- <el-input v-model="verifyForm.repOrgGuid" disabled />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="上报期间">
|
|
|
- <el-input v-model="verifyForm.repName" disabled />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="审批结果" prop="verifyResult">
|
|
|
- <el-radio-group v-model="verifyForm.verifyResult">
|
|
|
- <el-radio label="1">通过</el-radio>
|
|
|
- <el-radio label="0">驳回</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="审批意见" prop="verifyOpinion">
|
|
|
- <el-input v-model="verifyForm.verifyOpinion" type="textarea" placeholder="请输入审批意见" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-dialog title="退回重报" v-model="returnOpen" width="500px" append-to-body>
|
|
|
+ <el-form :model="returnForm" ref="returnRef" label-width="100px">
|
|
|
+ <el-form-item label="退回说明" prop="returnDesc" :rules="[{ required: true, message: '请填写退回说明', trigger: 'blur' }]">
|
|
|
+ <el-input v-model="returnForm.returnDesc" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请输入退回说明(500字以内)" />
|
|
|
+ </el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button type="primary" @click="submitVerify">确 定</el-button>
|
|
|
- <el-button @click="verifyOpen = false">取 消</el-button>
|
|
|
- </div>
|
|
|
+ <el-button type="primary" @click="submitReturn">确 定</el-button>
|
|
|
+ <el-button @click="returnOpen = false">取 消</el-button>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
|
|
|
- <!-- 下级月报详情对话框 -->
|
|
|
- <el-dialog title="下级月报详情" v-model="subMonthOpen" width="800px" append-to-body>
|
|
|
- <el-table v-loading="subMonthLoading" :data="subMonthList">
|
|
|
- <el-table-column label="上报单位" align="center" prop="repOrgGuid" :show-overflow-tooltip="true" />
|
|
|
- <el-table-column label="上报期间" align="center" prop="repName" />
|
|
|
- <el-table-column label="上报状态" align="center" prop="repAct">
|
|
|
+ <el-dialog title="待审批列表" v-model="pendingOpen" width="800px" append-to-body>
|
|
|
+ <el-table :data="pendingList" stripe border>
|
|
|
+ <el-table-column label="序号" type="index" width="60" align="center" />
|
|
|
+ <el-table-column label="申请单位" align="center" prop="repOrgName" min-width="120" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="申请月份" align="center" prop="repTime" width="120" />
|
|
|
+ <el-table-column label="上报说明" align="center" prop="reportDesc" min-width="150" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="撤回原因" align="center" prop="revocDesc" min-width="150" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="操作" align="center" width="140">
|
|
|
<template #default="scope">
|
|
|
- <dict-tag :options="rep_stat" :value="scope.row.repAct" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="上报时间" align="center" prop="repTime" width="180" />
|
|
|
- <el-table-column label="操作" align="center" width="100">
|
|
|
- <template #default="scope">
|
|
|
- <el-tooltip content="查看" placement="top">
|
|
|
- <el-button link type="primary" icon="View" @click="handleSubMonthDetail(scope.row)"></el-button>
|
|
|
- </el-tooltip>
|
|
|
+ <el-button link type="primary" @click="handleApprove(scope.row)">同意</el-button>
|
|
|
+ <el-button link type="danger" @click="handleReject(scope.row)">不同意</el-button>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="pendingOpen = false">关 闭</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog title="一键解锁" v-model="unlockOpen" width="500px" append-to-body>
|
|
|
+ <el-form :model="unlockForm" ref="unlockRef" label-width="100px">
|
|
|
+ <el-form-item label="月份">
|
|
|
+ <span>{{ selectedMonth || '请先在左侧选择月份' }}</span>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="解锁说明">
|
|
|
+ <el-input v-model="unlockForm.unlockDesc" type="textarea" :rows="3" placeholder="请输入解锁说明(选填)" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-button type="primary" @click="submitUnlock">确 定</el-button>
|
|
|
+ <el-button @click="unlockOpen = false">取 消</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog title="自定义上报期" v-model="periodOpen" width="600px" append-to-body>
|
|
|
+ <el-form :model="periodForm" ref="periodRef" label-width="110px">
|
|
|
+ <el-form-item label="年份">
|
|
|
+ <el-select v-model="periodForm.year" placeholder="选择年份" style="width:150px">
|
|
|
+ <el-option v-for="y in availableYears" :key="y" :label="y + '年'" :value="y" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="月份">
|
|
|
+ <el-select v-model="periodForm.month" placeholder="选择月份" style="width:150px">
|
|
|
+ <el-option v-for="m in 12" :key="m" :label="m + '月'" :value="m" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="开始日期" prop="startDate" :rules="[{ required: true, message: '请选择开始日期', trigger: 'change' }]">
|
|
|
+ <el-date-picker v-model="periodForm.startDate" type="date" placeholder="选择开始日期" value-format="YYYY-MM-DD" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="结束日期" prop="endDate" :rules="[{ required: true, message: '请选择结束日期', trigger: 'change' }]">
|
|
|
+ <el-date-picker v-model="periodForm.endDate" type="date" placeholder="选择结束日期" value-format="YYYY-MM-DD" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-button type="primary" @click="submitPeriod">确 定</el-button>
|
|
|
+ <el-button @click="periodOpen = false">取 消</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :title="detailTitle" v-model="detailOpen" width="85%" top="5vh" append-to-body destroy-on-close>
|
|
|
+ <div v-loading="detailLoading" style="min-height:400px;">
|
|
|
+ <iframe v-if="detailOpen && detailUrl" :src="detailUrl" style="width:100%;height:70vh;border:0;" />
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="detailOpen = false">关 闭</el-button>
|
|
|
+ </template>
|
|
|
</el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
-<script setup name="BisOrgMonRepPeri">
|
|
|
-import { listBisOrgMonRepPeri, getBisOrgMonRepPeri, delBisOrgMonRepPeri, addBisOrgMonRepPeri, updateBisOrgMonRepPeri, batchUnlock, urgeReport } from "@/api/slaj/hidd"
|
|
|
-import { useTableHeight } from '@/hooks/useTableHeight'
|
|
|
-
|
|
|
-const { tableHeight, containerRef } = useTableHeight()
|
|
|
+<script setup name="MonthReport">
|
|
|
+import { getRepTreeData, getMonthListStats, revokeMonth, returnMonth, approveRevoke, batchUnlock, urgeReport, revokeApproveList, checkCanRevoke, addBisOrgMonRepPeri } from "@/api/slaj/hidd"
|
|
|
|
|
|
const { proxy } = getCurrentInstance()
|
|
|
-const { rep_stat } = proxy.useDict("rep_stat")
|
|
|
-
|
|
|
-const currentYear = new Date().getFullYear()
|
|
|
-
|
|
|
-const monRepPeriList = ref([])
|
|
|
-const open = ref(false)
|
|
|
-const loading = ref(true)
|
|
|
-const showSearch = ref(true)
|
|
|
-const ids = ref([])
|
|
|
-const single = ref(true)
|
|
|
-const multiple = ref(true)
|
|
|
-const total = ref(0)
|
|
|
-const title = ref("")
|
|
|
-
|
|
|
-// 撤回审批
|
|
|
-const verifyOpen = ref(false)
|
|
|
-const verifyForm = ref({})
|
|
|
-const verifyRules = {
|
|
|
- verifyResult: [{ required: true, message: "审批结果不能为空", trigger: "change" }]
|
|
|
-}
|
|
|
-
|
|
|
-// 下级月报
|
|
|
-const subMonthOpen = ref(false)
|
|
|
-const subMonthLoading = ref(false)
|
|
|
-const subMonthList = ref([])
|
|
|
-
|
|
|
-const columns = ref({
|
|
|
- repOrgGuid: { label: '上报单位', visible: true },
|
|
|
- repName: { label: '上报期间', visible: true },
|
|
|
- repAct: { label: '上报状态', visible: true },
|
|
|
- repTime: { label: '上报时间', visible: true },
|
|
|
- returnDesc: { label: '退回说明', visible: true }
|
|
|
-})
|
|
|
-
|
|
|
-const data = reactive({
|
|
|
- form: {},
|
|
|
- queryParams: {
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- repOrgGuid: undefined,
|
|
|
- repName: undefined,
|
|
|
- repAct: undefined
|
|
|
- },
|
|
|
- rules: {
|
|
|
- repOrgGuid: [{ required: true, message: "上报单位不能为空", trigger: "blur" }],
|
|
|
- repName: [{ required: true, message: "上报期间不能为空", trigger: "blur" }]
|
|
|
+
|
|
|
+const treeRef = ref(null)
|
|
|
+const treeData = ref([])
|
|
|
+const treeProps = { children: 'children', label: 'label' }
|
|
|
+
|
|
|
+const loading = ref(false)
|
|
|
+const statsList = ref([])
|
|
|
+const unitType = ref('1')
|
|
|
+const selectedMonth = ref('')
|
|
|
+const selectedYear = ref('')
|
|
|
+
|
|
|
+const promptText = ref('')
|
|
|
+
|
|
|
+function getPeriodText() {
|
|
|
+ const d = new Date()
|
|
|
+ let mon = d.getDate() <= 9 ? d.getMonth() : d.getMonth() + 1
|
|
|
+ if (mon === 0) mon = 12
|
|
|
+ const nextMonth = mon === 12 ? 1 : mon + 1
|
|
|
+ const nextYear = mon === 12 ? d.getFullYear() + 1 : d.getFullYear()
|
|
|
+ const start = d.getFullYear() + '-' + String(mon).padStart(2, '0') + '-07'
|
|
|
+ const end = nextYear + '-' + String(nextMonth).padStart(2, '0') + '-06'
|
|
|
+ return start + ' 至 ' + end
|
|
|
+}
|
|
|
+const periodText = ref(getPeriodText())
|
|
|
+
|
|
|
+const statsTotal = reactive({ directlyNum: 0, directlyRepNum: 0, riverInstNum: 0, riverInstRepNum: 0, subAdminNum: 0, subAdminRepNum: 0 })
|
|
|
+
|
|
|
+const revocOpen = ref(false)
|
|
|
+const revocForm = ref({})
|
|
|
+const returnOpen = ref(false)
|
|
|
+const returnForm = ref({})
|
|
|
+const pendingOpen = ref(false)
|
|
|
+const pendingList = ref([])
|
|
|
+const pendingCount = ref(0)
|
|
|
+const unlockOpen = ref(false)
|
|
|
+const unlockForm = ref({})
|
|
|
+const periodOpen = ref(false)
|
|
|
+const periodForm = ref({ year: new Date().getFullYear(), month: new Date().getMonth() + 1, startDate: '', endDate: '' })
|
|
|
+const availableYears = [new Date().getFullYear() - 2, new Date().getFullYear() - 1, new Date().getFullYear()]
|
|
|
+
|
|
|
+const detailOpen = ref(false)
|
|
|
+const detailTitle = ref('隐患月报详情')
|
|
|
+const detailLoading = ref(false)
|
|
|
+const detailUrl = ref('')
|
|
|
+
|
|
|
+const monthOptions = ref([])
|
|
|
+function buildMonthOptions() {
|
|
|
+ const options = []
|
|
|
+ const now = new Date()
|
|
|
+ for (let y = now.getFullYear(); y >= now.getFullYear() - 2; y--) {
|
|
|
+ for (let m = 12; m >= 1; m--) {
|
|
|
+ options.push({ value: y + '-' + String(m).padStart(2, '0'), label: y + '年' + m + '月' })
|
|
|
+ }
|
|
|
}
|
|
|
-})
|
|
|
+ monthOptions.value = options
|
|
|
+}
|
|
|
|
|
|
-const { queryParams, form, rules } = toRefs(data)
|
|
|
+function handleMonthChange(val) {
|
|
|
+ if (!val) return
|
|
|
+ const parts = val.split('-')
|
|
|
+ selectedYear.value = parts[0]
|
|
|
+ selectedMonth.value = val
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
+ loadPendingCount()
|
|
|
+}
|
|
|
|
|
|
-/** 查询月报期间列表 */
|
|
|
-function getList() {
|
|
|
- loading.value = true
|
|
|
- listBisOrgMonRepPeri(queryParams.value).then(res => {
|
|
|
- loading.value = false
|
|
|
- monRepPeriList.value = res.rows
|
|
|
- total.value = res.total
|
|
|
+function loadPendingCount() {
|
|
|
+ revokeApproveList().then(res => {
|
|
|
+ const list = res.rows || res.data || []
|
|
|
+ pendingCount.value = list.length
|
|
|
+ }).catch(() => {
|
|
|
+ pendingCount.value = 0
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-/** 搜索按钮操作 */
|
|
|
-function handleQuery() {
|
|
|
- queryParams.value.pageNum = 1
|
|
|
- getList()
|
|
|
+function loadTree() {
|
|
|
+ getRepTreeData().then(res => {
|
|
|
+ treeData.value = res.data || []
|
|
|
+ if (treeData.value.length > 0) {
|
|
|
+ const yearNode = treeData.value[0]
|
|
|
+ if (yearNode.children && yearNode.children.length > 0) {
|
|
|
+ const now = new Date()
|
|
|
+ const currentMonth = now.getMonth() + 1
|
|
|
+ let found = yearNode.children.find(n => Number(n.month) === currentMonth)
|
|
|
+ if (!found) found = yearNode.children[yearNode.children.length - 1]
|
|
|
+ setTimeout(() => {
|
|
|
+ treeRef.value?.setCurrentKey(found.id)
|
|
|
+ handleNodeClick(found)
|
|
|
+ selectedMonth.value = found.id
|
|
|
+ }, 100)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
-/** 重置按钮操作 */
|
|
|
-function resetQuery() {
|
|
|
- proxy.resetForm("queryRef")
|
|
|
- handleQuery()
|
|
|
+function handleNodeClick(data) {
|
|
|
+ if (!data.month) return
|
|
|
+ selectedMonth.value = data.id
|
|
|
+ selectedYear.value = data.pId
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
}
|
|
|
|
|
|
-/** 多选框选中数据 */
|
|
|
-function handleSelectionChange(selection) {
|
|
|
- ids.value = selection.map(item => item.guid)
|
|
|
- single.value = selection.length != 1
|
|
|
- multiple.value = !selection.length
|
|
|
+function updatePrompt() {
|
|
|
+ const d = new Date()
|
|
|
+ const dateStr = d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日'
|
|
|
+ let mon = d.getDate() <= 9 ? d.getMonth() : d.getMonth() + 1
|
|
|
+ if (mon === 0) mon = 12
|
|
|
+ const nextMonth = mon === 12 ? 1 : mon + 1
|
|
|
+ promptText.value = `温馨提示: 今天是${dateStr},${mon}月隐患月报: 直属单位月报上报情况:${statsTotal.directlyRepNum}/${statsTotal.directlyNum}; 流域机构月报上报情况:${statsTotal.riverInstRepNum}/${statsTotal.riverInstNum}; 下级水行政主管部门月报上报情况:${statsTotal.subAdminRepNum}/${statsTotal.subAdminNum}; 月报开始时间:${mon}月07日至${nextMonth}月09日`
|
|
|
}
|
|
|
|
|
|
-/** 新增按钮操作 */
|
|
|
-function handleAdd() {
|
|
|
- reset()
|
|
|
- open.value = true
|
|
|
- title.value = "添加月报期间"
|
|
|
+function loadPromptStats() {
|
|
|
+ if (!selectedMonth.value) return
|
|
|
+ getMonthListStats({ repTime: selectedMonth.value }).then(res => {
|
|
|
+ const data = res.data || []
|
|
|
+ statsTotal.directlyNum = 0
|
|
|
+ statsTotal.directlyRepNum = 0
|
|
|
+ statsTotal.riverInstNum = 0
|
|
|
+ statsTotal.riverInstRepNum = 0
|
|
|
+ statsTotal.subAdminNum = 0
|
|
|
+ statsTotal.subAdminRepNum = 0
|
|
|
+ data.forEach(item => {
|
|
|
+ const t = item.repType
|
|
|
+ if (t === '1') { statsTotal.directlyNum++; if (item.repAct === '1') statsTotal.directlyRepNum++ }
|
|
|
+ else if (t === '3') { statsTotal.riverInstNum++; if (item.repAct === '1') statsTotal.riverInstRepNum++ }
|
|
|
+ else if (t === '2') { statsTotal.subAdminNum++; if (item.repAct === '1') statsTotal.subAdminRepNum++ }
|
|
|
+ })
|
|
|
+ updatePrompt()
|
|
|
+ }).catch(() => { updatePrompt() })
|
|
|
}
|
|
|
|
|
|
-/** 修改按钮操作 */
|
|
|
-function handleUpdate(row) {
|
|
|
- reset()
|
|
|
- const guid = row.guid || ids.value
|
|
|
- getBisOrgMonRepPeri(guid).then(response => {
|
|
|
- form.value = response.data
|
|
|
- open.value = true
|
|
|
- title.value = "修改月报期间"
|
|
|
- })
|
|
|
+function loadStats() {
|
|
|
+ if (!selectedMonth.value) return
|
|
|
+ loading.value = true
|
|
|
+ getMonthListStats({ repTime: selectedMonth.value, unitType: unitType.value }).then(res => {
|
|
|
+ statsList.value = res.data || []
|
|
|
+ }).finally(() => { loading.value = false })
|
|
|
}
|
|
|
|
|
|
-/** 详情按钮操作 */
|
|
|
-function handleDetail(row) {
|
|
|
- const guid = row.guid || ids.value
|
|
|
- proxy.$router.push({ path: '/slaj/hidd/monthDetail', query: { guid: guid } })
|
|
|
+function handleReport() {
|
|
|
+ if (!selectedMonth.value) { proxy.$modal.msgWarning('请先在左侧选择月份'); return }
|
|
|
+ proxy.$router.push({ path: '/slaj/hidd/monthDetail', query: { month: selectedMonth.value, year: selectedYear.value } })
|
|
|
}
|
|
|
|
|
|
-/** 下级月报按钮 */
|
|
|
-function handleSubMonth(row) {
|
|
|
- subMonthLoading.value = true
|
|
|
- subMonthOpen.value = true
|
|
|
- // 查询下级单位的月报
|
|
|
- listBisOrgMonRepPeri({ parentGuid: row.guid }).then(res => {
|
|
|
- subMonthLoading.value = false
|
|
|
- subMonthList.value = res.rows
|
|
|
+function handleOrgDetail(row) {
|
|
|
+ const orgGuid = row.repOrgGuid || row.orgGuid
|
|
|
+ const orgName = row.repName || ''
|
|
|
+ detailTitle.value = '隐患月报详情'
|
|
|
+ detailUrl.value = `/slaj/hidd/monthDetail?guid=${row.guid}&month=${selectedMonth.value}&orgName=${encodeURIComponent(orgName)}`
|
|
|
+ detailOpen.value = true
|
|
|
+}
|
|
|
+
|
|
|
+function handleRevocApply(row) {
|
|
|
+ checkCanRevoke(selectedMonth.value).then(res => {
|
|
|
+ if (res.data === true || res.data === 'true') {
|
|
|
+ revocForm.value = { guid: row.guid, revocDesc: '' }
|
|
|
+ revocOpen.value = true
|
|
|
+ } else {
|
|
|
+ proxy.$modal.msgWarning('上级部门已上报无法撤回')
|
|
|
+ }
|
|
|
+ }).catch(() => {
|
|
|
+ revocForm.value = { guid: row.guid, revocDesc: '' }
|
|
|
+ revocOpen.value = true
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-/** 下级月报详情 */
|
|
|
-function handleSubMonthDetail(row) {
|
|
|
- proxy.$router.push({ path: '/slaj/hidd/subMonthDetail', query: { guid: row.guid } })
|
|
|
+function submitRevoc() {
|
|
|
+ proxy.$refs.revocRef.validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ revokeMonth(revocForm.value.guid, revocForm.value.revocDesc).then(() => {
|
|
|
+ proxy.$modal.msgSuccess('撤回申请已提交')
|
|
|
+ revocOpen.value = false
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
-/** 撤回审批按钮 */
|
|
|
-function handleVerify(row) {
|
|
|
- verifyForm.value = {
|
|
|
- guid: row.guid,
|
|
|
- repOrgGuid: row.repOrgGuid,
|
|
|
- repName: row.repName,
|
|
|
- verifyResult: undefined,
|
|
|
- verifyOpinion: undefined
|
|
|
+function handleSupervise(row) {
|
|
|
+ const orgGuid = row.repOrgGuid || row.orgGuid
|
|
|
+ if (orgGuid) {
|
|
|
+ urgeReport(orgGuid, selectedMonth.value).then(() => {
|
|
|
+ proxy.$modal.msgSuccess('已发送督促通知')
|
|
|
+ })
|
|
|
}
|
|
|
- verifyOpen.value = true
|
|
|
}
|
|
|
|
|
|
-/** 提交撤回审批 */
|
|
|
-function submitVerify() {
|
|
|
- proxy.$refs["verifyRef"].validate(valid => {
|
|
|
+function handleReturn(row) {
|
|
|
+ returnForm.value = { guid: row.guid, returnDesc: '' }
|
|
|
+ returnOpen.value = true
|
|
|
+}
|
|
|
+
|
|
|
+function submitReturn() {
|
|
|
+ proxy.$refs.returnRef.validate(valid => {
|
|
|
if (valid) {
|
|
|
- const data = {
|
|
|
- guid: verifyForm.value.guid,
|
|
|
- repAct: verifyForm.value.verifyResult === '1' ? '1' : '3',
|
|
|
- returnDesc: verifyForm.value.verifyOpinion
|
|
|
- }
|
|
|
- updateBisOrgMonRepPeri(data).then(response => {
|
|
|
- proxy.$modal.msgSuccess("审批成功")
|
|
|
- verifyOpen.value = false
|
|
|
- getList()
|
|
|
+ returnMonth(returnForm.value.guid, returnForm.value.returnDesc).then(() => {
|
|
|
+ proxy.$modal.msgSuccess('退回成功')
|
|
|
+ returnOpen.value = false
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-/** 一键解锁按钮 */
|
|
|
-function handleUnlock() {
|
|
|
- if (ids.value.length === 0) {
|
|
|
- proxy.$modal.msgError("请先选择要解锁的月报")
|
|
|
- return
|
|
|
- }
|
|
|
- proxy.$modal.confirm('是否确认对选中的' + ids.value.length + '个月报进行解锁操作?').then(function () {
|
|
|
- return batchUnlock(ids.value)
|
|
|
- }).then(() => {
|
|
|
- getList()
|
|
|
- proxy.$modal.msgSuccess("解锁成功")
|
|
|
- }).catch(() => {})
|
|
|
+function handlePendingApproval() {
|
|
|
+ revokeApproveList().then(res => {
|
|
|
+ pendingList.value = res.rows || res.data || []
|
|
|
+ pendingOpen.value = true
|
|
|
+ }).catch(() => {
|
|
|
+ pendingList.value = []
|
|
|
+ pendingOpen.value = true
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
-/** 督促上报按钮 */
|
|
|
-function handleUrge() {
|
|
|
- if (ids.value.length === 0) {
|
|
|
- proxy.$modal.msgError("请先选择要督促的月报")
|
|
|
- return
|
|
|
- }
|
|
|
- const selection = monRepPeriList.value.filter(item => ids.value.includes(item.guid))
|
|
|
- const notReported = selection.filter(item => item.repAct === '0')
|
|
|
- if (notReported.length === 0) {
|
|
|
- proxy.$modal.msgError("选中的单位均已上报,无需督促")
|
|
|
- return
|
|
|
+function handleApprove(row) {
|
|
|
+ approveRevoke(row.guid, true, '').then(() => {
|
|
|
+ proxy.$modal.msgSuccess('已同意撤回')
|
|
|
+ pendingList.value = pendingList.value.filter(r => r.guid !== row.guid)
|
|
|
+ pendingCount.value = pendingList.value.length
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function handleReject(row) {
|
|
|
+ approveRevoke(row.guid, false, '').then(() => {
|
|
|
+ proxy.$modal.msgSuccess('已驳回')
|
|
|
+ pendingList.value = pendingList.value.filter(r => r.guid !== row.guid)
|
|
|
+ pendingCount.value = pendingList.value.length
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function handleBatchUnlock() {
|
|
|
+ if (!selectedMonth.value) { proxy.$modal.msgWarning('请先在左侧选择月份'); return }
|
|
|
+ unlockForm.value = { unlockDesc: '' }
|
|
|
+ unlockOpen.value = true
|
|
|
+}
|
|
|
+
|
|
|
+function submitUnlock() {
|
|
|
+ const monthGuids = statsList.value.filter(r => r.repAct === '1').map(r => r.guid)
|
|
|
+ if (monthGuids.length === 0) {
|
|
|
+ proxy.$modal.msgWarning('当前月份没有已上报的单位')
|
|
|
+ unlockOpen.value = false; return
|
|
|
}
|
|
|
- const orgGuids = notReported.map(item => item.repOrgGuid).join(',')
|
|
|
- const repName = notReported[0]?.repName || ''
|
|
|
- proxy.$modal.confirm('是否确认对' + notReported.length + '个未上报单位进行督促?').then(function () {
|
|
|
- return urgeReport(orgGuids, repName)
|
|
|
- }).then(() => {
|
|
|
- proxy.$modal.msgSuccess("督促通知已发送")
|
|
|
+ batchUnlock(monthGuids).then(() => {
|
|
|
+ proxy.$modal.msgSuccess('解锁成功')
|
|
|
+ unlockOpen.value = false
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
}).catch(() => {})
|
|
|
}
|
|
|
|
|
|
-/** 提交按钮 */
|
|
|
-function submitForm() {
|
|
|
- proxy.$refs["monRepPeriRef"].validate(valid => {
|
|
|
+function handleCustomPeriod() {
|
|
|
+ periodForm.value = { year: new Date().getFullYear(), month: new Date().getMonth() + 1, startDate: '', endDate: '' }
|
|
|
+ periodOpen.value = true
|
|
|
+}
|
|
|
+
|
|
|
+function submitPeriod() {
|
|
|
+ proxy.$refs.periodRef.validate(valid => {
|
|
|
if (valid) {
|
|
|
- if (form.value.guid != undefined) {
|
|
|
- updateBisOrgMonRepPeri(form.value).then(response => {
|
|
|
- proxy.$modal.msgSuccess("修改成功")
|
|
|
- open.value = false
|
|
|
- getList()
|
|
|
- })
|
|
|
- } else {
|
|
|
- addBisOrgMonRepPeri(form.value).then(response => {
|
|
|
- proxy.$modal.msgSuccess("新增成功")
|
|
|
- open.value = false
|
|
|
- getList()
|
|
|
- })
|
|
|
- }
|
|
|
+ const p = periodForm.value
|
|
|
+ addBisOrgMonRepPeri({
|
|
|
+ repName: p.year + '年' + String(p.month).padStart(2, '0') + '月隐患期间表',
|
|
|
+ repAct: '2',
|
|
|
+ repType: '0',
|
|
|
+ repTime: p.year + '-' + String(p.month).padStart(2, '0'),
|
|
|
+ startDate: p.startDate,
|
|
|
+ endDate: p.endDate
|
|
|
+ }).then(() => {
|
|
|
+ proxy.$modal.msgSuccess('自定义上报期设置成功')
|
|
|
+ periodOpen.value = false
|
|
|
+ loadTree()
|
|
|
+ }).catch(() => {})
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-/** 删除按钮操作 */
|
|
|
-function handleDelete(row) {
|
|
|
- const guids = row.guid || ids.value
|
|
|
- proxy.$modal.confirm('是否确认删除月报期间编号为"' + guids + '"的数据项?').then(function () {
|
|
|
- return delBisOrgMonRepPeri(guids)
|
|
|
+function handleBatchRevoke() {
|
|
|
+ const canRevoke = statsList.value.filter(r => r.repAct === '1' && unitType.value === '0')
|
|
|
+ if (canRevoke.length === 0) {
|
|
|
+ proxy.$modal.msgWarning('当前没有可撤销的月报')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ proxy.$modal.confirm('是否确认撤销本月已上报的月报?').then(() => {
|
|
|
+ return revokeMonth(canRevoke[0].guid)
|
|
|
}).then(() => {
|
|
|
- getList()
|
|
|
- proxy.$modal.msgSuccess("删除成功")
|
|
|
+ proxy.$modal.msgSuccess('撤销成功')
|
|
|
+ loadStats()
|
|
|
+ loadPromptStats()
|
|
|
}).catch(() => {})
|
|
|
}
|
|
|
|
|
|
-/** 导出按钮操作 */
|
|
|
-function handleExport() {
|
|
|
- proxy.download("hidd/monrepperi/export", {
|
|
|
- ...queryParams.value
|
|
|
- }, `monRepPeri_${new Date().getTime()}.xlsx`)
|
|
|
-}
|
|
|
-
|
|
|
-/** 重置表单 */
|
|
|
-function reset() {
|
|
|
- form.value = {
|
|
|
- guid: undefined,
|
|
|
- repOrgGuid: undefined,
|
|
|
- repName: undefined,
|
|
|
- repAct: undefined,
|
|
|
- repTime: undefined,
|
|
|
- returnDesc: undefined,
|
|
|
- startDate: undefined,
|
|
|
- endDate: undefined
|
|
|
- }
|
|
|
- proxy.resetForm("monRepPeriRef")
|
|
|
-}
|
|
|
-
|
|
|
-onMounted(() => {
|
|
|
- getList()
|
|
|
-})
|
|
|
+onMounted(() => { loadTree(); buildMonthOptions(); loadPendingCount() })
|
|
|
</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.global-top-bar {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 10px 16px;
|
|
|
+ background: #fff;
|
|
|
+ border: 1px solid #e4e7ed;
|
|
|
+ border-radius: 4px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ min-height: 40px;
|
|
|
+}
|
|
|
+.top-bar-actions {
|
|
|
+ display: flex;
|
|
|
+ gap: 6px;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+.month-layout {
|
|
|
+ display: flex;
|
|
|
+ gap: 12px;
|
|
|
+ height: calc(100vh - 150px);
|
|
|
+}
|
|
|
+.tree-panel {
|
|
|
+ width: 220px;
|
|
|
+ min-width: 220px;
|
|
|
+ border: 1px solid #e4e7ed;
|
|
|
+ border-radius: 4px;
|
|
|
+ padding: 8px;
|
|
|
+ overflow-y: auto;
|
|
|
+ background: #fff;
|
|
|
+}
|
|
|
+.tree-header {
|
|
|
+ font-size: 12px;
|
|
|
+ padding: 4px 0 8px 0;
|
|
|
+ border-bottom: 1px solid #e4e7ed;
|
|
|
+ margin-bottom: 8px;
|
|
|
+}
|
|
|
+.status-dot {
|
|
|
+ display: inline-block;
|
|
|
+ width: 14px;
|
|
|
+ height: 14px;
|
|
|
+ border-radius: 2px;
|
|
|
+ vertical-align: middle;
|
|
|
+ margin: 0 2px;
|
|
|
+}
|
|
|
+.status-dot.reported { background-color: #579575; }
|
|
|
+.status-dot.unreported { background-color: #D8B83F; }
|
|
|
+.table-panel {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+.filter-bar {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding: 6px 10px;
|
|
|
+ background: #f9f9f9;
|
|
|
+ border: 1px solid #e4e7ed;
|
|
|
+ border-radius: 4px;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 4px;
|
|
|
+}
|
|
|
+.filter-label {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-right: 4px;
|
|
|
+ white-space: nowrap;
|
|
|
+}
|
|
|
+.filter-radios {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+}
|
|
|
+.action-bar {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding: 6px 10px;
|
|
|
+ background: #f9f9f9;
|
|
|
+ border: 1px solid #e4e7ed;
|
|
|
+ border-radius: 4px;
|
|
|
+ margin-top: 6px;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+:deep(.el-table__header-wrapper th > .cell) {
|
|
|
+ white-space: nowrap !important;
|
|
|
+}
|
|
|
+</style>
|