Alioo
2025-02-25 a78672e878dfd35bd98eb9554eb967745ab31b25
!91 Merge remote-tracking branch 'origin/develop1.0' into develop_alioo
Merge pull request !91 from Alioo/develop_alioo
已修改5个文件
517 ■■■■ 文件已修改
zhitan-vue/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/styles/page.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/styles/ruoyi.scss 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/views/modelconfiguration/businessmodel/components/statisticalIndicators/StatisticModal.vue 360 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/views/modelconfiguration/businessmodel/components/statisticalIndicators/statisticalIndicators.vue 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/.env.development
@@ -6,6 +6,6 @@
# 系统/开发环境
# test
VITE_APP_BASE_API = 'http://127.0.0.1:8080'
VITE_APP_BASE_API = 'http://139.159.201.118:8201'
# hangmingjun
zhitan-vue/src/assets/styles/page.scss
@@ -49,6 +49,7 @@
  .chart-box {
    width: 100%;
    height: 320px;
    padding-top: 12px;
    div {
      width: 100%;
@@ -129,6 +130,7 @@
  .chart-box {
    width: 100%;
    height: 320px;
    padding-top: 12px;
    div {
      width: 100%;
zhitan-vue/src/assets/styles/ruoyi.scss
@@ -269,14 +269,11 @@
      td {
        word-break: break-word;
        background-color: #1d3778 !important;
        // color: #515a6e;
        color: #515a6e;
        height: 48px !important;
        // font-size: 13px;
        border-radius: 0px 0px 0px 0px;
        font-family: OPPOSans, OPPOSans;
        font-weight: 500;
        // font-size: 16px;
        color: #ffffff;
        border-bottom: none !important;
      }
@@ -833,14 +830,11 @@
        background-color: #F7F8FA !important;
        // color: #515a6e;
        height: 48px !important;
        // font-size: 13px;
        border-radius: 0px 0px 0px 0px;
        font-family: OPPOSans, OPPOSans;
        font-weight: 500;
        // font-size: 16px;
        color: #222222;
        border-bottom: none !important;
        // border-bottom: none !important;
      }
    }
@@ -889,7 +883,7 @@
  // 表格底部白线
  .el-table__inner-wrapper::before {
    background-color: transparent;
    // background-color: transparent;
  }
  /** 表单布局 **/
zhitan-vue/src/views/modelconfiguration/businessmodel/components/statisticalIndicators/StatisticModal.vue
@@ -1,229 +1,241 @@
<template>
    <el-dialog v-model="visible" title="选择统计指标" width="1100" @close="handleClose" destroy-on-close
        :close-on-click-modal="false" :close-on-press-escape="false">
        <el-row :gutter="24">
            <el-col :span="6">
                <el-tree ref="treeRef" :props="defaultProps" :data="treeData" node-key="id" highlight-current
                    :default-expanded-keys="treeExpandData" :expand-on-click-node="false" @node-click="changeNode"
                    accordion>
                    <template #default="{ node, data }">
                        <span>
                            <el-tooltip v-if="node.label.length > 6" class="item" effect="dark" :content="node.label"
                                placement="top-end">
                                <span>{{ node.label.slice(0, 6) + "..." }}</span>
                            </el-tooltip>
                            <span v-else id="b">{{ node.label }}</span>
                        </span>
  <el-dialog
    v-model="visible"
    title="选择统计指标"
    width="1100"
    @close="handleClose"
    destroy-on-close
    :close-on-click-modal="false"
    :close-on-press-escape="false"
  >
    <el-row :gutter="24">
      <el-col :span="6">
        <el-tree
          ref="treeRef"
          :props="defaultProps"
          :data="treeData"
          node-key="id"
          highlight-current
          :default-expanded-keys="treeExpandData"
          :expand-on-click-node="false"
          @node-click="changeNode"
          accordion
        >
          <template #default="{ node, data }">
            <span>
              <el-tooltip
                v-if="node.label.length > 6"
                class="item"
                effect="dark"
                :content="node.label"
                placement="top-end"
              >
                <span>{{ node.label.slice(0, 6) + "..." }}</span>
              </el-tooltip>
              <span v-else id="b">{{ node.label }}</span>
            </span>
          </template>
        </el-tree>
      </el-col>
      <el-col :span="18">
        <el-form :model="queryParams" :inline="true" label-width="120px">
          <el-form-item label="指标名称/编码" prop="name">
            <el-input v-model="queryParams.name" placeholder="请输入指标名称/编码" />
          </el-form-item>
          <el-form-item label="指标分类" prop="indexCategory">
            <el-select v-model="queryParams.indexCategory" clearable placeholder="选择种类" style="width: 170px">
              <el-option v-for="dict in sys_index_category" :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>
                    </template>
                </el-tree>
            </el-col>
            <el-col :span="18">
                <el-form :model="queryParams" :inline="true" label-width="120px">
                    <el-form-item label="指标名称/编码" prop="name">
                        <el-input v-model="queryParams.name" placeholder="请输入指标名称/编码" />
                    </el-form-item>
                    <el-form-item label="指标分类" prop="indexCategory">
                        <el-select v-model="queryParams.indexCategory" clearable placeholder="选择种类"
                            style="width: 170px;">
                            <el-option v-for="dict in sys_index_category" :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-table
          v-loading="loading"
          :data="tableData"
          row-key="indexId"
          @select="handleSelectChange"
          @select-all="handleSelectionAllChange"
          height="50vh"
          ref="energySettingTable"
        >
          <el-table-column type="selection" width="55" align="center" row-key="indexId" :reserve-selection="true" />
          <el-table-column label="指标编码" align="center" prop="code" />
          <el-table-column label="指标名称" align="center" prop="name" />
          <el-table-column
            label="单位"
            align="center"
            prop="unitId"
            :formatter="(row, c) => proxy.selectDictLabel(sys_unit, row.unitId)"
          />
        </el-table>
        <pagination
          v-show="total > 0"
          :total="total"
          v-model:page="queryParams.pageNum"
          v-model:limit="queryParams.pageSize"
          @pagination="getList"
        />
      </el-col>
    </el-row>
                <el-table v-loading="loading" :data="tableData" row-key="indexId" @select="handleSelectChange"
                    @select-all="handleSelectionAllChange" height="50vh" ref="energySettingTable">
                    <el-table-column type="selection" width="55" align="center" row-key="indexId"
                        :reserve-selection="true" />
                    <el-table-column label="指标编码" align="center" prop="code" />
                    <el-table-column label="指标名称" align="center" prop="name" />
                    <el-table-column label="单位" align="center" prop="unitId"
                        :formatter="(row, c) => proxy.selectDictLabel(sys_unit, row.unitId)" />
                </el-table>
                <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
                    v-model:limit="queryParams.pageSize" @pagination="getList" />
            </el-col>
        </el-row>
        <div slot="footer" class="text-right">
            <el-button type="primary" @click="handleOk">确定</el-button>
            <el-button @click="handleClose">取消</el-button>
        </div>
    </el-dialog>
    <div slot="footer" class="text-right">
      <el-button type="primary" @click="handleOk">确定</el-button>
      <el-button @click="handleClose">取消</el-button>
    </div>
  </el-dialog>
</template>
<script setup>
let { proxy } = getCurrentInstance()
let { sys_index_category } = proxy.useDict('sys_index_category')
let { sys_unit } = proxy.useDict('sys_unit')
import { listEnergyindex, treeList } from '@/api/modelConfiguration/indexWarehouse'
let { sys_index_category } = proxy.useDict("sys_index_category")
let { sys_unit } = proxy.useDict("sys_unit")
import { listEnergyindex, treeList } from "@/api/modelConfiguration/indexWarehouse"
let treeRef = ref(null)
let treeData = ref([])
let treeExpandData = ref([])
const defaultProps = ref({
    children: 'children',
    label: 'label',
  children: "children",
  label: "label",
})
let currentNode = ref(null)
//树点击
function changeNode(data, node, ev) {
    getList(data)
    //   if (statisticalIndicatorManagementRef.value) {
    //     statisticalIndicatorManagementRef.value.getList(data)
    //   }
  currentNode.value = data
  getList()
}
let isFirstLeafNode = ref(false)
//获取树列表
function getTreeList() {
    treeList({ modelCode: "JCZBK_CODE" }).then(res => {
        let { data } = res
        treeData.value = data;
        let chooseNode = null;
        if (data.length > 0) {
            if (data[0].children && data[0].children.length !== 0 && isFirstLeafNode.value) {
                if (data[0].children[0].children && data[0].children[0].children.length !== 0) {
                    chooseNode = data[0].children[0].children[0];
                } else {
                    chooseNode = data[0].children[0];
                }
            } else {
                chooseNode = data[0];
            }
            treeExpandData.value.push(chooseNode.id);
            nextTick(() => {
                treeRef.value.setCurrentKey(chooseNode.id);
                getList(chooseNode)
            });
  treeList({ modelCode: "JCZBK_CODE" }).then((res) => {
    let { data } = res
    treeData.value = data
    let chooseNode = null
    if (data.length > 0) {
      if (data[0].children && data[0].children.length !== 0 && isFirstLeafNode.value) {
        if (data[0].children[0].children && data[0].children[0].children.length !== 0) {
          chooseNode = data[0].children[0].children[0]
        } else {
          chooseNode = data[0].children[0]
        }
    })
      } else {
        chooseNode = data[0]
      }
      treeExpandData.value.push(chooseNode.id)
      currentNode.value = chooseNode
      nextTick(() => {
        treeRef.value.setCurrentKey(chooseNode.id)
        getList()
      })
    }
  })
}
let loading = ref(false)
let visible = ref(false)
let tableData = ref([])
let total = ref(0);
let total = ref(0)
let queryParams = ref({
    name: null,
    indexCategory: null,
    pageNum: 1,
    pageSize: 10,
  name: null,
  indexCategory: null,
  pageNum: 1,
  pageSize: 10,
})
let selectedStatistic = ref([])
function handleOpen(selectRow) {
    getTreeList()
    selectedStatistic.value = JSON.parse(JSON.stringify(selectRow))
    visible.value = true
  getTreeList()
  selectedStatistic.value = JSON.parse(JSON.stringify(selectRow))
  visible.value = true
}
let energySettingTable = ref(null)
let currentNode = ref(null)
function getList(modelNode) {
    currentNode.value = modelNode;
    if (modelNode) {
        loading.value = true;
        queryParams.value.nodeId = modelNode.id;
        queryParams.value.indexType = 'STATISTIC';
        listEnergyindex(queryParams.value).then(response => {
            tableData.value = response.rows;
            total.value = response.total;
            loading.value = false;
            nextTick(function () {
                energySettingTable.value.data.forEach(rowData => {
                    let exist = selectedStatistic.value.filter(
                        f => f.indexId === rowData.indexId).length;
                    if (exist > 0) {
                        energySettingTable.value.toggleRowSelection(rowData, true);
                    }
                });
            });
        });
    } else {
        tableData.value = [];
    }
function getList() {
  loading.value = true
  queryParams.value.nodeId = currentNode.value.id
  queryParams.value.indexType = "STATISTIC"
  listEnergyindex(queryParams.value).then((response) => {
    tableData.value = response.rows
    total.value = response.total
    loading.value = false
    nextTick(function () {
      energySettingTable.value.data.forEach((rowData) => {
        let exist = selectedStatistic.value.filter((f) => f.indexId === rowData.indexId).length
        if (exist > 0) {
          energySettingTable.value.toggleRowSelection(rowData, true)
        }
      })
    })
  })
}
function handleQuery() {
    queryParams.value.pageNum = 1;
    getList(currentNode.value)
  queryParams.value.pageNum = 1
  getList()
}
function resetQuery() {
    queryParams.value = {
        name: null,
        indexCategory: null,
        pageNum: 1,
        pageSize: 10,
    }
    getList(currentNode.value)
  queryParams.value = {
    name: null,
    indexCategory: null,
    pageNum: 1,
    pageSize: 10,
  }
  getList()
}
function handleClose() {
    visible.value = false
  visible.value = false
}
//判断一下 是全选还是全选取消
function formatterSelect(selection, data) {
    let idMap = {};
    selection.forEach(item => {
        idMap[item.indexId] = true;
    });
    let allIn = data.every(item => idMap.hasOwnProperty(item.indexId));
    return allIn;
  let idMap = {}
  selection.forEach((item) => {
    idMap[item.indexId] = true
  })
  let allIn = data.every((item) => idMap.hasOwnProperty(item.indexId))
  return allIn
}
function handleSelectionAllChange(selection) {
    if (formatterSelect(selection, tableData.value)) {
        selection.forEach(row => {
            let rowStatus = selectedStatistic.value.filter(f => f.indexId == row.indexId).length;
            if (rowStatus === 0) {
                selectedStatistic.value.push({
                    "indexId": row.indexId,
                    "code": row.code,
                    "name": row.name
                });
            }
        });
    } else {
        selectedStatistic.value = selectedStatistic.value.filter(f => {
            return !tableData.value.some(s => s.indexId == f.indexId);
        });
    }
  if (formatterSelect(selection, tableData.value)) {
    selection.forEach((row) => {
      let rowStatus = selectedStatistic.value.filter((f) => f.indexId == row.indexId).length
      if (rowStatus === 0) {
        selectedStatistic.value.push({
          indexId: row.indexId,
          code: row.code,
          name: row.name,
        })
      }
    })
  } else {
    selectedStatistic.value = selectedStatistic.value.filter((f) => {
      return !tableData.value.some((s) => s.indexId == f.indexId)
    })
  }
}
function handleSelectChange(selection, row) {
    let rowStatus = selection.filter(f => f.indexId === row.indexId).length;
    if (rowStatus > 0) {
        selectedStatistic.value.push({
            "indexId": row.indexId,
            "code": row.code,
            "name": row.name
        });
    } else {
        selectedStatistic.value = selectedStatistic.value.filter(
            f => f.indexId !== row.indexId);
    }
  let rowStatus = selection.filter((f) => f.indexId === row.indexId).length
  if (rowStatus > 0) {
    selectedStatistic.value.push({
      indexId: row.indexId,
      code: row.code,
      name: row.name,
    })
  } else {
    selectedStatistic.value = selectedStatistic.value.filter((f) => f.indexId !== row.indexId)
  }
}
function handleOk() {
    emit('statisticIndexConfirmSelect', selectedStatistic.value)
    visible.value = false
  emit("statisticIndexConfirmSelect", selectedStatistic.value)
  visible.value = false
}
defineExpose({ handleOpen });
let emit = defineEmits(['statisticIndexConfirmSelect'])
defineExpose({ handleOpen })
let emit = defineEmits(["statisticIndexConfirmSelect"])
</script>
<style scoped lang="scss">
zhitan-vue/src/views/modelconfiguration/businessmodel/components/statisticalIndicators/statisticalIndicators.vue
@@ -1,69 +1,68 @@
<template>
    <div class="table-box">
        <el-button class="mb20 " type="primary" icon="Plus" @click="handleAdd">
            新增
        </el-button>
        <el-button class="mb20 " icon="Delete" :disabled="multiple" @click="handleDel">
            批量删除
        </el-button>
        <el-table v-loading="loading" :data="tableData" height="calc(100vh - 370px)"
            @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55" align="center" show-overflow-tooltip />
            <el-table-column label="指标编码" align="center" prop="code" />
            <el-table-column label="指标名称" align="center" prop="name" />
            <el-table-column label="操作" align="center">
                <template #default="scope">
                    <el-button link type="primary" icon="Delete" @click="handleDel(scope.row)">
                        删除
                    </el-button>
                </template>
            </el-table-column>
        </el-table>
        <statisticModal ref="statisticModalRef" @statisticIndexConfirmSelect="statisticIndexConfirmSelect" />
  <div class="table-box">
    <div style="width: 100%; text-align: right; padding: 20px 20px 0 0">
      <el-button class="mb20" type="primary" icon="Plus" @click="handleAdd"> 新增 </el-button>
      <el-button class="mb20" icon="Delete" :disabled="multiple" @click="handleDel"> 批量删除 </el-button>
    </div>
    <el-table
      v-loading="loading"
      :data="tableData"
      height="calc(100vh - 370px)"
      @selection-change="handleSelectionChange"
    >
      <el-table-column type="selection" width="55" align="center" show-overflow-tooltip />
      <el-table-column label="指标编码" align="center" prop="code" />
      <el-table-column label="指标名称" align="center" prop="name" />
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button link type="primary" icon="Delete" @click="handleDel(scope.row)"> 删除 </el-button>
        </template>
      </el-table-column>
    </el-table>
    <statisticModal ref="statisticModalRef" @statisticIndexConfirmSelect="statisticIndexConfirmSelect" />
  </div>
</template>
<script setup>
let { proxy } = getCurrentInstance()
import { getSettingIndex, setNodeToIndex, delIndex } from '@/api/modelConfiguration/businessModel'
import statisticModal from './StatisticModal.vue'
import { getSettingIndex, setNodeToIndex, delIndex } from "@/api/modelConfiguration/businessModel"
import statisticModal from "./StatisticModal.vue"
let tableData = ref([])
let loading = ref(false)
let currentNode = ref(null)
function getList(modelNode) {
    if (!modelNode) {
        tableData.value = []
        return
  if (!modelNode) {
    tableData.value = []
    return
  }
  currentNode.value = modelNode
  loading.value = true
  getSettingIndex(modelNode.id).then((response) => {
    if (response.code === 200) {
      let result = response.data
      tableData.value = result.filter((f) => f.indexType === "STATISTIC")
      loading.value = false
    } else {
      proxy.$modal.msgError(response.msg)
    }
    currentNode.value = modelNode
    loading.value = true;
    getSettingIndex(modelNode.id).then((response) => {
        if (response.code === 200) {
            let result = response.data;
            tableData.value = result.filter(f => f.indexType === 'STATISTIC');
            loading.value = false
        } else {
            proxy.$modal.msgError(response.msg);
        }
    });
  })
}
let statisticModalRef = ref(null)
function handleAdd() {
    if (statisticModalRef.value) {
        statisticModalRef.value.handleOpen(tableData.value)
    }
  if (statisticModalRef.value) {
    statisticModalRef.value.handleOpen(tableData.value)
  }
}
function statisticIndexConfirmSelect(selectedIndex) {
    tableData.value = selectedIndex
    let indexIds = selectedIndex.map(item => item.indexId)
    setNodeToIndex(currentNode.value.id, indexIds, 'STATISTIC').then((response) => {
        if (response.code !== 200) {
            proxy.$modal.msgError(response.msg)
        }
    })
  tableData.value = selectedIndex
  let indexIds = selectedIndex.map((item) => item.indexId)
  setNodeToIndex(currentNode.value.id, indexIds, "STATISTIC").then((response) => {
    if (response.code !== 200) {
      proxy.$modal.msgError(response.msg)
    }
  })
}
// 选中数组
@@ -72,32 +71,34 @@
// 非多个禁用
let multiple = ref(true)
function handleDel(row) {
    const indexIds = row && row.indexId ? [row.indexId] : ids.value
    const indexNames = row.name || names.value
    proxy.$modal.confirm('是否确认删除指标名为"' + indexNames + '"的数据项?', '警告').then(function () {
        return delIndex(currentNode.value.id, indexIds);
    }).then((response) => {
        if (response.code === 200) {
            getList(currentNode.value)
            // 删除成功,更新表格数据
            // tableData.value = tableData.value.filter(f => f.indexId !== row.indexId)
            proxy.$modal.msgSuccess("删除成功");
        } else {
            // 删除失败,显示错误消息
            proxy.$modal.msgError(response.msg);
        }
    }).catch(() => {
    });
  const indexIds = row && row.indexId ? [row.indexId] : ids.value
  const indexNames = row.name || names.value
  proxy.$modal
    .confirm('是否确认删除指标名为"' + indexNames + '"的数据项?', "警告")
    .then(function () {
      return delIndex(currentNode.value.id, indexIds)
    })
    .then((response) => {
      if (response.code === 200) {
        getList(currentNode.value)
        // 删除成功,更新表格数据
        // tableData.value = tableData.value.filter(f => f.indexId !== row.indexId)
        proxy.$modal.msgSuccess("删除成功")
      } else {
        // 删除失败,显示错误消息
        proxy.$modal.msgError(response.msg)
      }
    })
    .catch(() => {})
}
defineExpose({
    getList
});
  getList,
})
function handleSelectionChange(selection) {
    ids.value = selection.map(item => item.indexId);
    names.value = selection.map(item => item.name);
    multiple.value = !selection.length
  ids.value = selection.map((item) => item.indexId)
  names.value = selection.map((item) => item.name)
  multiple.value = !selection.length
}
</script>