|
@@ -0,0 +1,443 @@
|
|
|
+<script setup>
|
|
|
+import { ref, reactive, nextTick } from 'vue'
|
|
|
+import { apiIndicatorImport } from '@/api/indicator'
|
|
|
+import { Search } from '@element-plus/icons-vue'
|
|
|
+import addEbdDialog from './components/addEbdDialog.vue';
|
|
|
+import edbDetailDialog from './components/edbDetailDialog.vue';
|
|
|
+import { ElMessage , ElMessageBox } from 'element-plus'
|
|
|
+import {usePermission} from '@/hooks/permission'
|
|
|
+const {hasPermission}=usePermission()
|
|
|
+
|
|
|
+const tableRef = ref();
|
|
|
+const tableLoading = ref(false);
|
|
|
+const total = ref(0);
|
|
|
+const tableData = ref([]);
|
|
|
+const sourceOptions = ref([]);
|
|
|
+const isSelectAll = ref(false);//真正意义上的全选或不全选
|
|
|
+const checkedList = ref([]);//不全选勾选中的 或 全选取消勾的
|
|
|
+const selectionReactCancel = ref(false);//手动设置选中中
|
|
|
+const filterObj = reactive({
|
|
|
+ page_no: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ source: '',
|
|
|
+ frequency: '',
|
|
|
+ keyWord: '',
|
|
|
+ sortParam:'',
|
|
|
+ sortType:'',
|
|
|
+ checkAll: false, //控制全选显示状态
|
|
|
+ checkSome: false
|
|
|
+});
|
|
|
+const isAddToBaseDia = ref(false);
|
|
|
+const lookEdbInfo = ref({});
|
|
|
+const isLookDataDia = ref(false);
|
|
|
+
|
|
|
+const frequencyOptions = [
|
|
|
+ { label:'日度',val: '日度' },
|
|
|
+ { label:'周度',val: '周度' },
|
|
|
+ { label:'旬度',val: '旬度' },
|
|
|
+ { label:'月度',val: '月度' },
|
|
|
+ { label:'季度',val: '季度' },
|
|
|
+ { label:'半年度',val: '半年度' },
|
|
|
+ { label:'年度',val: '年度' },
|
|
|
+];
|
|
|
+
|
|
|
+const tableColums = [
|
|
|
+ {
|
|
|
+ label: '指标ID',
|
|
|
+ key: 'IndexCode',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '指标名称',
|
|
|
+ key: 'IndexName',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '频度',
|
|
|
+ key: 'Frequency',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '单位',
|
|
|
+ key: 'Unit',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '渠道',
|
|
|
+ key: 'SourceName',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '指标开始时间',
|
|
|
+ key: 'StartDate',
|
|
|
+ sortable:true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '指标最新时间',
|
|
|
+ key: 'EndDate',
|
|
|
+ sortable:true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '入库时间',
|
|
|
+ sortable:true,
|
|
|
+ key: 'CreateTime'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '操作',
|
|
|
+ key: 'handle'
|
|
|
+ },
|
|
|
+
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
+async function getSource(){
|
|
|
+ let res = await apiIndicatorImport.getSourceList();
|
|
|
+ if(res.Ret!==200 ) return
|
|
|
+ sourceOptions.value = res.Data || [];
|
|
|
+}
|
|
|
+
|
|
|
+function filterChange(val){
|
|
|
+ filterObj.page_no = 1;
|
|
|
+ if(!val) {
|
|
|
+ isSelectAll.value = false
|
|
|
+ checkedList.value = []
|
|
|
+ filterObj.checkAll = false
|
|
|
+ filterObj.checkSome = false
|
|
|
+ }
|
|
|
+ getTableData(val?'filter':'')
|
|
|
+}
|
|
|
+
|
|
|
+function pageChange(page){
|
|
|
+ filterObj.page_no = page;
|
|
|
+ getTableData('pageChange')
|
|
|
+}
|
|
|
+
|
|
|
+function handleSortChange({prop,order}){
|
|
|
+ const propMap={
|
|
|
+ 'StartDate':'start_date',
|
|
|
+ 'EndDate':'end_date',
|
|
|
+ 'CreateTime':'create_time'
|
|
|
+ }
|
|
|
+ filterObj.sortParam = order?propMap[prop]||'':''
|
|
|
+ filterObj.sortType = order?order==='ascending'?'asc':'desc':''
|
|
|
+ filterChange()
|
|
|
+}
|
|
|
+
|
|
|
+async function getTableData(type='pageChange'){
|
|
|
+ const { frequency,page_no,pageSize,keyWord,source,sortParam,sortType } = filterObj;
|
|
|
+ let params = {
|
|
|
+ Frequency: frequency,
|
|
|
+ CurrentIndex: page_no,
|
|
|
+ PageSize: pageSize,
|
|
|
+ KeyWord: keyWord,
|
|
|
+ SourceName: source,
|
|
|
+ SortColumn: sortParam,
|
|
|
+ SortOrder: sortType
|
|
|
+ }
|
|
|
+ tableLoading.value = true;
|
|
|
+ let res = await apiIndicatorImport.getDataList(params);
|
|
|
+ tableLoading.value = false;
|
|
|
+ if(res.Ret != 200) return;
|
|
|
+ const { Data } = res;
|
|
|
+ tableData.value = Data.List || [];
|
|
|
+ total.value = Data.Paging.Totals;
|
|
|
+
|
|
|
+ await nextTick();
|
|
|
+ if(type==='filter'){
|
|
|
+ listCheckAllChange(true)
|
|
|
+ }else {
|
|
|
+ checkedSomeSelection()
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+function listCheckAllChange(value){
|
|
|
+ checkedList.value = [];
|
|
|
+ isSelectAll.value = value;
|
|
|
+ tableRef.value?.clearSelection();
|
|
|
+ value && (tableRef.value?.toggleAllSelection());
|
|
|
+}
|
|
|
+
|
|
|
+function checkedSomeSelection(){
|
|
|
+ selectionReactCancel.value=true
|
|
|
+ if(!isSelectAll.value){
|
|
|
+ checkedList.value.map(_ =>{
|
|
|
+ let row = tableData.value.find(item => item.IndexCode==_.IndexCode)
|
|
|
+ if(row){ //设置部分选中
|
|
|
+ setTimeout(()=>{
|
|
|
+ tableRef.value?.toggleRowSelection(row,true)
|
|
|
+ },20)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }else{
|
|
|
+ tableRef.value?.toggleAllSelection()
|
|
|
+ checkedList.value.map(_ =>{
|
|
|
+ let row = tableData.value.find(item => item.IndexCode==_.IndexCode)
|
|
|
+ if(row){ //设置部分不勾选
|
|
|
+ setTimeout(()=>{
|
|
|
+ tableRef.value?.toggleRowSelection(row,false)
|
|
|
+ },20)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ setTimeout(()=>{
|
|
|
+ selectionReactCancel.value=false
|
|
|
+ },30)
|
|
|
+}
|
|
|
+
|
|
|
+function selectHandle(selection,row){
|
|
|
+ if(selectionReactCancel.value) return
|
|
|
+ //当前项是选中还是取消选
|
|
|
+ let haveChecked = selection.some(_ => _.IndexCode === row.IndexCode);
|
|
|
+ // //全选取消选和不全选选中才有意义
|
|
|
+ if((haveChecked&&!isSelectAll.value) || (!haveChecked&&isSelectAll.value)) {
|
|
|
+ checkedList.value.push(row)
|
|
|
+ }else {
|
|
|
+ checkedList.value=checkedList.value.filter(_ => _.IndexCode!==row.IndexCode)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function selectAllPageHandle(selection){
|
|
|
+ if(selectionReactCancel.value) return
|
|
|
+ //当前页是选中还是取消
|
|
|
+ let haveChecked = selection && selection.length>0;
|
|
|
+ //全选取消选和不全选选中才有意义
|
|
|
+ if((haveChecked&&!isSelectAll.value) || (!haveChecked&&isSelectAll.value)) {
|
|
|
+ checkedList.value = [...checkedList.value,...tableData.value]
|
|
|
+ }else {
|
|
|
+ let pageIds = tableData.value.map(_ => _.IndexCode);
|
|
|
+ checkedList.value = checkedList.value.filter(_ => !pageIds.includes(_.IndexCode))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function selectionChange(){
|
|
|
+ if(selectionReactCancel.value) return
|
|
|
+ //设置全选框状态 选中 半选 不选
|
|
|
+ setTimeout(()=>{
|
|
|
+ checkedList.value = checkedList.value.filter((item, index, arr) => { //数组去重
|
|
|
+ return arr.findIndex((_) => _.IndexCode == item.IndexCode) == index;
|
|
|
+ });
|
|
|
+ //全选
|
|
|
+ if(
|
|
|
+ (checkedList.value.length===total.value&&total.value>0 && (!isSelectAll.value))
|
|
|
+ || (checkedList.value.length === 0 && isSelectAll.value)
|
|
|
+ ){
|
|
|
+ filterObj.checkAll = true
|
|
|
+ filterObj.checkSome = false
|
|
|
+ //不选
|
|
|
+ }else if(
|
|
|
+ (checkedList.value.length === 0 && (!isSelectAll.value))
|
|
|
+ || (checkedList.value.length === total.value && isSelectAll.value)
|
|
|
+ ){
|
|
|
+ filterObj.checkAll = false
|
|
|
+ filterObj.checkSome = false
|
|
|
+ //半选
|
|
|
+ }else{
|
|
|
+ filterObj.checkAll = false
|
|
|
+ filterObj.checkSome = true
|
|
|
+ }
|
|
|
+ },1)
|
|
|
+}
|
|
|
+
|
|
|
+function lookDataHandle(item){
|
|
|
+ lookEdbInfo.value = item;
|
|
|
+ isLookDataDia.value = true;
|
|
|
+}
|
|
|
+
|
|
|
+function deleteItem(item){
|
|
|
+ ElMessageBox.confirm(
|
|
|
+ `确定要删除该指标吗`,
|
|
|
+ '提示',
|
|
|
+ {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ }
|
|
|
+ )
|
|
|
+ .then(async () => {
|
|
|
+ let res = await apiIndicatorImport.busDataDelete({
|
|
|
+ DeleteList:[item.IndexCode],
|
|
|
+ UnDeleteList:[],
|
|
|
+ DeleteAll:false,
|
|
|
+ });
|
|
|
+ if(res.Ret != 200) return;
|
|
|
+ if(res.Data.NoDeleteEdbCodeList && res.Data.NoDeleteEdbCodeList.length > 0){
|
|
|
+ ElMessage.error('该指标已加到指标库,不支持删除')
|
|
|
+ } else {
|
|
|
+ ElMessage.success('删除成功');
|
|
|
+ getTableData();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch(() => {})
|
|
|
+}
|
|
|
+
|
|
|
+function batchDelete(){
|
|
|
+ let num = !isSelectAll.value ? checkedList.value?.length || 0 : total.value - (checkedList.value?.length || 0);
|
|
|
+ if(!num) return ElMessage.warning('请先选择指标');
|
|
|
+ ElMessageBox.confirm(
|
|
|
+ `已选择${num}个指标,操作删除后不可撤销,确认删除吗?`,
|
|
|
+ '提示',
|
|
|
+ {
|
|
|
+ confirmButtonText: '确认',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ }
|
|
|
+ )
|
|
|
+ .then(async () => {
|
|
|
+ let lists = checkedList.value.map(_=>_.IndexCode) || [];
|
|
|
+ let params = {
|
|
|
+ DeleteAll: isSelectAll.value,
|
|
|
+ DeleteList: !isSelectAll.value ? lists : [],
|
|
|
+ UnDeleteList: isSelectAll.value ? lists : [],
|
|
|
+ }
|
|
|
+ let res = await apiIndicatorImport.busDataDelete(params);
|
|
|
+ if(res.Data.NoDeleteEdbCodeList && res.Data.NoDeleteEdbCodeList.length > 0){
|
|
|
+ ElMessage.error(`${res.Data.NoDeleteEdbCodeList.join('、')}已加到指标库,不支持删除`)
|
|
|
+ } else {
|
|
|
+ ElMessage.success('批量删除成功');
|
|
|
+ }
|
|
|
+ getTableData();
|
|
|
+ })
|
|
|
+ .catch(() => {})
|
|
|
+}
|
|
|
+
|
|
|
+getSource();
|
|
|
+getTableData('init');
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <div class="indicator-import-wrap">
|
|
|
+ <div class="header">
|
|
|
+ <div class="left">
|
|
|
+ <el-select
|
|
|
+ v-model="filterObj.source"
|
|
|
+ @change="filterChange"
|
|
|
+ placeholder="请选择渠道"
|
|
|
+ clearable
|
|
|
+ size="large"
|
|
|
+ style="width: 230px;"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in sourceOptions"
|
|
|
+ :key="item.EdbBusinessSourceId"
|
|
|
+ :label="item.SourceName"
|
|
|
+ :value="item.SourceName"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+
|
|
|
+ <el-select
|
|
|
+ v-model="filterObj.frequency"
|
|
|
+ @change="filterChange"
|
|
|
+ placeholder="请选择频度"
|
|
|
+ clearable
|
|
|
+ size="large"
|
|
|
+ style="width: 230px;"
|
|
|
+ >
|
|
|
+ <el-option v-for="item in frequencyOptions" :key="item.val" :label="item.label" :value="item.val"/>
|
|
|
+ </el-select>
|
|
|
+
|
|
|
+ <el-input
|
|
|
+ v-model="filterObj.keyWord"
|
|
|
+ placeholder="指标ID/指标名称"
|
|
|
+ @change="filterChange"
|
|
|
+ clearable
|
|
|
+ style="width: 250px;"
|
|
|
+ size="large"
|
|
|
+ :prefix-icon="Search"
|
|
|
+ >
|
|
|
+ </el-input>
|
|
|
+
|
|
|
+ <el-checkbox
|
|
|
+ v-model="filterObj.checkAll"
|
|
|
+ :indeterminate="filterObj.checkSome"
|
|
|
+ :disabled="tableData.length===0"
|
|
|
+ style="margin-left:20px"
|
|
|
+ @change="listCheckAllChange"
|
|
|
+ >列表全选</el-checkbox>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <div class="right">
|
|
|
+ <el-button type="primary" size="large" style="padding:12px 30px;" @click="isAddToBaseDia = true" v-if="hasPermission('indicatorImport:add')">添加指标</el-button>
|
|
|
+ <el-button type="primary" size="large" plain style="padding:12px 30px;" v-if="hasPermission('indicatorImport:batchDelete')" @click="batchDelete">批量删除</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="main" v-if="hasPermission('indicatorImport:view')">
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ ref="tableRef"
|
|
|
+ element-loading-text="加载中..."
|
|
|
+ v-loading="tableLoading"
|
|
|
+ border
|
|
|
+ style="margin:20px 0"
|
|
|
+ @sort-change="handleSortChange"
|
|
|
+ @select="selectHandle"
|
|
|
+ @select-all="selectAllPageHandle"
|
|
|
+ @selection-change="selectionChange"
|
|
|
+ >
|
|
|
+ <el-table-column
|
|
|
+ type="selection"
|
|
|
+ width="55"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ v-for="item in tableColums"
|
|
|
+ :key="item.label"
|
|
|
+ :label="item.label"
|
|
|
+ :prop="item.key"
|
|
|
+ :width="item.widthsty"
|
|
|
+ :min-width="item.minwidthsty"
|
|
|
+ :sortable="item.sortable?true:false"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ <template #default="{row}">
|
|
|
+ <template v-if="item.key==='handle'">
|
|
|
+ <el-button type="primary" @click="lookDataHandle(row)" link v-if="hasPermission('indicatorImport:detail')">查看详情</el-button>
|
|
|
+ <el-button type="danger" link v-if="hasPermission('indicatorImport:delete')" @click="deleteItem(row)">删除</el-button>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="item.key==='IndexName'">
|
|
|
+ <span style="white-space: pre-wrap;">{{ row.IndexName }}</span>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <span v-else>{{ row[item.key] }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ <template #empty>
|
|
|
+ <el-empty description="暂无数据" />
|
|
|
+ </template>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <el-pagination
|
|
|
+ background
|
|
|
+ layout="total,prev,pager,next,jumper"
|
|
|
+ :current-page="filterObj.page_no"
|
|
|
+ :page-size="filterObj.pageSize"
|
|
|
+ :total="total"
|
|
|
+ @current-change="pageChange"
|
|
|
+ style=" justify-content: flex-end;border-top: none;"
|
|
|
+ />
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <el-empty v-else description="暂无权限"></el-empty>
|
|
|
+ </div>
|
|
|
+ <addEbdDialog v-model:show="isAddToBaseDia" @success="filterChange"></addEbdDialog>
|
|
|
+ <edbDetailDialog v-model:isShow="isLookDataDia" :edbInfo="lookEdbInfo"></edbDetailDialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+.indicator-import-wrap{
|
|
|
+ min-height: calc(100vh - 120px);
|
|
|
+ background-color: #fff;
|
|
|
+ border: 1px solid #c8cdd9;
|
|
|
+ border-radius: 4px;
|
|
|
+ box-shadow: 0 3px 6px rgba(0, 0, 0, .05);
|
|
|
+ padding: 20px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ overflow: auto;
|
|
|
+ .header{
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ .left,.right {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 14px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|