ludc
2023-12-14 43603c1cb538ae4d8c2f6ce4710121c8c95677bd
Merge remote-tracking branch 'origin/master'
已修改8个文件
已添加7个文件
1197 ■■■■■ 文件已修改
Source/UBCS-WEB/src/components/Master/MasterTransfer.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/StatisticsComponent/ColumnarChart.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/StatisticsComponent/mixCart.vue 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/Business.vue 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/LinkType.vue 556 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/statistic/statisticPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/StatisticConfig.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/StatisticConfigVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/StatisticConfigController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/StatisticConfigMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IStatisticConfigService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/StatisticConfigServiceImpl.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/StatisticConfigMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Master/MasterTransfer.vue
@@ -10,11 +10,11 @@
          <el-radio :label="1">全部</el-radio>
          <el-radio :label="2">页码</el-radio>
        </el-radio-group>
        <span v-if="radio === 2" style="margin-left: 20px;"><el-input v-model="pageExport"
                                                                      style="width: 150px"></el-input> ï¼ˆè¾“入页码或者页面范围,如:1-10)</span>
        <span v-if="radio === 2" style="margin-left: 20px;color: #F56C6C; ">
          <el-input v-model="pageExport" style="width: 150px"></el-input> ï¼ˆè¾“入页码或者页面范围,如:1-10)</span>
      </div>
    </div>
    <div style="text-align: center">
    <div v-loading="isLoading" style="text-align: center">
      <el-transfer
        v-model="value"
        :data="data"
@@ -44,6 +44,7 @@
      pageExport: "",
      data: [],
      value: [],
      isLoading: false,
      filterMethod(query, item) {
        return item.label.indexOf(query) > -1;
      },
@@ -156,6 +157,7 @@
        if (this.selectRow.length <= 0) {
          this.$message.warning('请选择要导出的模板')
        } else {
          this.isLoading = true;
          //已选择多选
          const selectList = []
          //已选择属性
@@ -178,6 +180,9 @@
            }).then(res => {
              this.handlerFile(res);
              this.escHandler();
              this.isLoading = false;
            }).catch(error => {
              this.isLoading = false;
            })
          } else {
@@ -188,12 +193,15 @@
              // console.log('res',res)
              this.handlerFile(res);
              this.escHandler();
              this.isLoading = false;
            }).catch(error => {
              this.isLoading = false;
            })
          }
        }
      } else if (this.radio === 1) {
        this.isLoading = true;
        if (this.value <= 0) {
          this.tableHeadData.map(item => item.prop)
            .forEach((prop, index) => {
@@ -203,12 +211,18 @@
            if (res) {
              func.downloadFileByBlobHandler(res);
              this.escHandler();
              this.isLoading = false;
            }
          }).catch(error => {
            this.isLoading = false;
          })
        } else {
          exportCode({codeClassifyOid: this.codeClassifyOid, ...this.exportArr, limit: -1}).then(res => {
            this.handlerFile(res);
            this.escHandler();
            this.isLoading = false;
          }).catch(error => {
            this.isLoading = false;
          })
        }
      } else if (this.radio === 2) {
@@ -237,6 +251,7 @@
          }
        }
        if (this.value >= 1) {
          this.isLoading = true;
          exportCode({
            codeClassifyOid: this.codeClassifyOid, ...this.exportArr,
            limit: this.limit,
@@ -246,9 +261,12 @@
            // console.log('res',res)
            this.handlerFile(res);
            this.escHandler();
            this.isLoading = false;
          }).catch(error => {
            this.isLoading = false;
          });
        } else {
          this.isLoading = true;
          this.tableHeadData.map(item => item.prop)
            .forEach((prop, index) => {
              this.exportArrTwo[`attrIdIndexMap[${index}]`] = prop;
@@ -259,10 +277,12 @@
            page: start,
            endPage: end
          }).then(res => {
            // console.log('res', res)
            this.isLoading = false;
            this.handlerFile(res);
            this.escHandler();
          })
          }).catch(error => {
            this.isLoading = false;
          });
        }
      }
    },
Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue
@@ -46,15 +46,15 @@
                <el-table-column v-if="tableData.length != 0" fixed label="序号" type="index" width="55">
                </el-table-column>
                <!--              ç”Ÿå‘½å‘¨æœŸ-->
<!--                <el-table-column v-for="(item,index) in lcstatusArray"-->
<!--                                 v-if=" lcstatusArray.length >= 0 && !item.hidden"-->
<!--                                 key="index" :show-overflow-tooltip="true" :sortable="item.sortable"-->
<!--                                 :width="item.width" align="center" label="生命周期值"-->
<!--                                 prop="lcstatus">-->
<!--                  <template slot-scope="scope">-->
<!--                    <span>{{ scope.row.lcstatus_text }}</span>-->
<!--                  </template>-->
<!--                </el-table-column>-->
                <!--                <el-table-column v-for="(item,index) in lcstatusArray"-->
                <!--                                 v-if=" lcstatusArray.length >= 0 && !item.hidden"-->
                <!--                                 key="index" :show-overflow-tooltip="true" :sortable="item.sortable"-->
                <!--                                 :width="item.width" align="center" label="生命周期值"-->
                <!--                                 prop="lcstatus">-->
                <!--                  <template slot-scope="scope">-->
                <!--                    <span>{{ scope.row.lcstatus_text }}</span>-->
                <!--                  </template>-->
                <!--                </el-table-column>-->
                <!--              ç¼–号-->
                <el-table-column v-for="(item, index) in CodeArray" v-if="CodeArray.length !== 0 && !item.hidden"
                                 key="index" :label="item.label" :prop="item.prop"
@@ -345,7 +345,7 @@
      },
      // ä¸»æ•°æ®æŒ‰é’®
      masterVrBtnList: [],
      fileOptions:{},
      fileOptions: {},
      result: '',
      elapsedTime: '',
    };
@@ -397,7 +397,7 @@
        this.tableData = newval;
        this.searchResults = newval
        this.doLayout();
        this.fileOptions= {
        this.fileOptions = {
          ownbizOid: "0",
          ownbizBtm: "0",
          fileDocClassify: '!=processAuditSuggest',
@@ -467,6 +467,7 @@
    templateOid: {
      handler(newval, oldval) {
        this.fileOptions.ownbizOid = "0";
        this.statusSelect = 'all'
      },
      deep: true,
    },
@@ -590,7 +591,7 @@
        func.downloadFileByBlobHandler(res);
        this.$message.success('下载成功,请查看!');
        this.isLoading = false;
      }).catch(error=>{
      }).catch(error => {
        this.$message.error(error);
      });
    },
@@ -927,40 +928,46 @@
      })
    },
    // æŽ’序
    sortChange(val) {
      // console.log(val)
      this.isLoading = true;
      let order = "";
      if (val.order == "ascending") {
        order = "asc";
      } else {
        order = "desc";
    async sortChange(val) {
      try {
        this.isLoading = true;
        const order = val.order == 'ascending' ? 'asc' : 'desc';
        const {data} = await TableData({
          templateOid: this.templateOid,
          codeClassifyOid: this.codeClassifyOid,
          order: order,
          sort: val.prop,
          page: this.page.currentPage,
          limit: this.page.pageSize,
        });
        this.data = data.data;
      } finally {
        this.isLoading = false;
      }
      TableData({
        templateOid: this.templateOid,
        codeClassifyOid: this.codeClassifyOid,
        order: order,
        sort: val.prop,
        page: this.page.currentPage,
        limit: this.page.pageSize,
      }).then((res) => {
        setTimeout(() => {
          this.data = res.data.data;
          this.isLoading = false;
        }, 100);
      });
    },
    //分页刷新
    async onLoad(val) {
      await TableData({
        templateOid: this.templateOid,
        codeClassifyOid: this.codeClassifyOid,
        page: this.page.currentPage,
        limit: this.page.pageSize,
      }).then((res) => {
      this.isLoading = true;
      try {
        let conditionMap = {};
        if (this.statusSelect !== 'all') {
          conditionMap.lcstatus = this.statusSelect;
        }
        const res = await TableData({
          templateOid: this.templateOid,
          codeClassifyOid: this.codeClassifyOid,
          page: this.page.currentPage,
          limit: this.page.pageSize,
          conditionMap
        });
        this.tableData = res.data.data;
        this.doLayout()
      });
        this.doLayout();
      } catch (error) {
        this.$message.error(error)
      } finally {
        this.isLoading = false;
      }
    },
    //多选
    handleSelectionChange(list) {
@@ -993,15 +1000,18 @@
      this.findvisible = true;
    },
    // é«˜çº§æŸ¥è¯¢
    echoContion(val) {
      FindData({
        templateOid: this.templateOid,
        codeClassifyOid: this.codeClassifyOid,
        ...val,
      }).then((res) => {
    async echoContion(val) {
      try {
        const res = await FindData({
          templateOid: this.templateOid,
          codeClassifyOid: this.codeClassifyOid,
          ...val,
        });
        this.tableData = res.data.data;
        this.page.total = res.data.total
      });
      } catch (error) {
      }
    },
    //相似项查询
    similarHandler() {
@@ -1071,17 +1081,20 @@
    //输入回车搜索
    tableFindInp() {
      this.isLoading = true;
      TableData({
        templateOid: this.templateOid,
        codeClassifyOid: this.codeClassifyOid,
        page: this.page.currentPage,
        limit: this.page.pageSize,
        ['conditionMap[' + this.keyWordFind + ']']: '*' + this.WupinFindValue + '*'
      }).then(res => {
        this.tableData = res.data.data;
        this.page.total = res.data.total;
      try {
        TableData({
          templateOid: this.templateOid,
          codeClassifyOid: this.codeClassifyOid,
          page: this.page.currentPage,
          limit: this.page.pageSize,
          ['conditionMap[' + this.keyWordFind + ']']: '*' + this.WupinFindValue + '*'
        }).then(res => {
          this.tableData = res.data.data;
          this.page.total = res.data.total;
        })
      } finally {
        this.isLoading = false;
      })
      }
    }
  }
Source/UBCS-WEB/src/components/StatisticsComponent/ColumnarChart.vue
@@ -36,7 +36,7 @@
            );
          });
          let colors = ['#2eadd6', '#FFA500'];
          let colors = ['#84C9E5', '#F68686'];
          const seriesData = [];
          for (let i = 0; i < newval.length; i++) {
@@ -92,7 +92,7 @@
  data() {
    return {
      chartOptions: {
        color:["#91CC75", "#5470C6"],
        color:['#84C9E5', '#F68686'],
        title: {
          text: "",
        },
Source/UBCS-WEB/src/components/StatisticsComponent/mixCart.vue
@@ -5,16 +5,14 @@
</template>
<script>
import 'echarts'
import echarts from'echarts'
import 'echarts/lib/chart/line'
import 'echarts/lib/chart/pie'
import 'echarts/lib/chart/bar'
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/title'
import 'echarts/lib/component/legend'
export default {
  name: "mixCart",
  name: "stackedAreaChart",
  props: {
    mixData: {
      type: Array,
@@ -28,8 +26,9 @@
  data() {
    return {
      chartOptions: {
        color: ['#84C9E5', '#F68686'],
        title: {
          text: "",
          text: '',
        },
        grid: {
          left: "3%",
@@ -40,18 +39,15 @@
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "shadow",
          },
            type: "cross"
          }
        },
        legend: {
          data: ["总量", "新增"],
          left: "center",
          textStyle: {
            fontSize: 14 // è°ƒæ•´å­—体大小
          }
          data: ['总量', '新增']
        },
        xAxis: {
          type: "category",
          boundaryGap: false,
          data: [
            "一月",
            "二月",
@@ -70,8 +66,10 @@
        yAxis: {
          type: "value",
        },
        series: [],
      },
        series: [
        ]
      }
    };
  },
  watch: {
@@ -79,40 +77,39 @@
      immediate: true,
      handler(newval, oldval) {
        if (newval) {
          const colors = ["#2eadd6", "#db3c3c"];
          const seriesData = newval.map((data, index) => ({
            name: index === 0 ? "总量" : "新增",
            type: index === 0 ? "bar" : "line",
            stack: index === 0 ? "总量" : null,
            data: data.map(value => ({value})),
            barWidth: 68,
            label: {
              show: true,
              position: "top"
            },
            itemStyle: {
              color: colors[index]
          const series = newval.map((data, index) => ({
            name: index === 0 ? '总量' : '新增',
            type: 'line',
            showSymbol: false,//是否显示折线上的标记点
            smooth: true,//平滑度
            areaStyle: {
              opacity: 1, //透明度
            },
            emphasis: {
              focus: "series"
            }
              focus: 'series'
            },
            stack: index === 0 ? '总量' : '新增', // æ ¹æ® index åŒºåˆ†æ€»é‡å’Œæ–°å¢žçš„堆叠情况
            data: data.map(value => ({value})),
            label: {
              show: true,
              position: 'top'
            },
          }));
          this.chartOptions.series = seriesData;
          this.chartOptions.series = series;
        }
      },
      }
    },
    chartName:{
      handler(newval,oldval){
        if(newval){
    chartName: {
      handler(newval, oldval) {
        if (newval) {
          this.chartOptions.title.text = newval + "数据统计"
        }
      },
      immediate:true,
      deep:true
      immediate: true,
      deep: true
    }
  },
  }
};
</script>
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue
@@ -46,6 +46,15 @@
                       style="height: calc(100vh - 290px)"
                       @node-click="nodeClick"
            >
              <template slot-scope="{ node, data }" class="el-tree-node__label">
                <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item" effect="dark"
                            open-delay="500"
                            placement="right-start">
                <span style="font-size: 14px;">
                {{ (node || {}).label }}
              </span>
                </el-tooltip>
              </template>
            </avue-tree>
          </div>
Source/UBCS-WEB/src/views/modeling/Business.vue
@@ -1,30 +1,37 @@
<template>
  <el-container>
<!--    <el-header class="businessHeader" style="height: 40px;padding:0 8px">-->
    <!--    <el-header class="businessHeader" style="height: 40px;padding:0 8px">-->
<!--    </el-header>-->
    <!--    </el-header>-->
    <el-container>
      <el-aside style="width: 20%">
        <basic-container class="businessTreeContainer">
          <div class="app">
            <div style="display: flex;margin-bottom: 10px;justify-content: space-around;">
              <el-button v-if="permissionList.addBtn"  size="mini" type="primary" @click="businessAdd" plain style="width: 60px">
              <el-button v-if="permissionList.addBtn" plain size="mini" style="width: 60px" type="primary"
                         @click="businessAdd">
                æ–°å¢ž
              </el-button>
              <el-button v-if="permissionList.editBtn"  size="mini" type="primary" @click="businessEdit" plain style="width: 60px">
              <el-button v-if="permissionList.editBtn" plain size="mini" style="width: 60px" type="primary"
                         @click="businessEdit">
                ä¿®æ”¹
              </el-button>
              <el-button v-if="permissionList.table"  size="mini" type="primary"
                         @click="selectFromTable" plain> ä»Žå·²æœ‰ä¸­èŽ·å–
              <el-button v-if="permissionList.table" plain size="mini"
                         type="primary" @click="selectFromTable"> ä»Žå·²æœ‰ä¸­èŽ·å–
              </el-button>
            </div>
            <avue-tree :data="treeData" :option="treeOption" class="businessTree" @node-click="nodeClick" style="width: fit-content;">
            <template slot-scope="{ node, data }" class="el-tree-node__label">
              <span>
            <avue-tree :data="treeData" :option="treeOption" class="businessTree" style="height: 70.3vh"
                       @node-click="nodeClick">
              <template slot-scope="{ node, data }" class="el-tree-node__label">
                <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item" effect="dark"
                            open-delay="250"
                            placement="right-start">
                <span>
                <i :class="(node || {}).level === 2 ? 'el-icon-star-off' : 'el-icon-folder-opened'"></i>
                {{ (node || {}).label }}
              </span>
            </template>
                </el-tooltip>
              </template>
            </avue-tree>
          </div>
@@ -87,17 +94,17 @@
                </template>
                {{ obj.lifeCycleName ? obj.lifeCycleName + '(' + obj.lifeCycleId + ')' : '' }}
              </el-descriptions-item>
<!--              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"-->
<!--                                    :labelStyle="descriptionOption.labelStyle">-->
<!--                <template slot="label">-->
<!--                  <i :class="icons.view"></i>-->
<!--                  è§†å›¾-->
<!--                </template>-->
<!--                <el-tag v-if="obj.viewText" size="small">-->
<!--                  {{ obj.viewText }}-->
<!--                </el-tag>-->
<!--                <span v-else></span>-->
<!--              </el-descriptions-item>-->
              <!--              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"-->
              <!--                                    :labelStyle="descriptionOption.labelStyle">-->
              <!--                <template slot="label">-->
              <!--                  <i :class="icons.view"></i>-->
              <!--                  è§†å›¾-->
              <!--                </template>-->
              <!--                <el-tag v-if="obj.viewText" size="small">-->
              <!--                  {{ obj.viewText }}-->
              <!--                </el-tag>-->
              <!--                <span v-else></span>-->
              <!--              </el-descriptions-item>-->
              <!-- <el-descriptions-item>
            <template slot="label">
              <i class="el-icon-arrow-down"></i>
@@ -125,7 +132,8 @@
            </avue-crud>
          </basic-container>
        </el-main>
        <el-dialog :visible="ref.visible" append-to-body title="从数据库中添加" width="700px" @close="dialoghandelfalse" top="9vh">
        <el-dialog :visible="ref.visible" append-to-body title="从数据库中添加" top="9vh" width="700px"
                   @close="dialoghandelfalse">
          é€‰æ‹©é¢†åŸŸï¼š
          <el-select v-model="domain" placeholder="请选择" size="small" @change="refOnLoad">
            <el-option v-for="item in domainOptions" :key="item.value" :label="item.label" :value="item.value">
@@ -163,7 +171,7 @@
  name: "Business",
  data() {
    return {
      type:"",
      type: "",
      //生命周期对话框状态
      packageLifeBox: false,
      //版本规则状态
@@ -187,7 +195,7 @@
        btmType: {},
      },
      loadOption: {
        height:'auto',
        height: 'auto',
        border: true,
        editBtn: false,
        addBtn: false,
@@ -396,26 +404,27 @@
.app {
  overflow: auto;
  overflow-y: auto;
  height: 84.3vh;
}
.app::-webkit-scrollbar {
  height: 15px; // çºµå‘滚动条 å¿…写
  background: white;
  border: white;
  width: 10px;
}
// æ»šåŠ¨æ¡çš„æ»‘å—
.app::-webkit-scrollbar-thumb {
  width: 10px;
  height: 10px;
  background-color: #ececec;
  border-radius: 20px;
  border: #ececec;
}
//
//.app::-webkit-scrollbar {
//  height: 15px; // çºµå‘滚动条 å¿…写
//  background: white;
//  border: white;
//  width: 10px;
//
//}
//
//// æ»šåŠ¨æ¡çš„æ»‘å—
//.app::-webkit-scrollbar-thumb {
//  width: 10px;
//  height: 10px;
//  background-color: #ececec;
//  border-radius: 20px;
//  border: #ececec;
//}
</style>
Source/UBCS-WEB/src/views/modeling/LinkType.vue
@@ -1,298 +1,306 @@
<template>
    <el-container>
        <!-- é¡¶ç«¯æŒ‰é’® -->
  <el-container>
    <!-- é¡¶ç«¯æŒ‰é’® -->
        <!-- ä¾§è¾¹æ æ ‘ -->
        <el-container>
            <el-aside style="width: 20%;">
                <basic-container class="businessTreeContainer">
                  <div class="app">
                    <div style="display: flex;margin-bottom: 10px;">
                      <el-button type="primary" @click="linkTypeAdd" size="mini"  v-if="permissionList.addBtn" plain>
                        æ–°å¢ž
                      </el-button>
                      <el-button type="primary" @click="linkTypeEdit" size="mini" v-if="permissionList.editBtn" plain>
                        ä¿®æ”¹
                      </el-button>
                    </div>
                    <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick"
                               class="businessTree">
                      <template class="el-tree-node__label" slot-scope="{ node, data }">
                            <span>
    <!-- ä¾§è¾¹æ æ ‘ -->
    <el-container>
      <el-aside style="width: 20%;">
        <basic-container class="businessTreeContainer">
          <div class="app">
            <div style="display: flex;margin-bottom: 10px;">
              <el-button v-if="permissionList.addBtn" plain size="mini" type="primary" @click="linkTypeAdd">
                æ–°å¢ž
              </el-button>
              <el-button v-if="permissionList.editBtn" plain size="mini" type="primary" @click="linkTypeEdit">
                ä¿®æ”¹
              </el-button>
            </div>
            <avue-tree :data="treeData" :option="treeOption" class="businessTree"
                       @node-click="nodeClick">
              <template slot-scope="{ node, data }" class="el-tree-node__label">
                <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item" effect="dark"
                            open-delay="250"
                            placement="bottom">
                    <span>
                                <i class="el-icon-star-on"></i>
                                {{ (node || {}).label }}
                            </span>
                </el-tooltip>
              </template>
            </avue-tree>
          </div>
        </basic-container>
      </el-aside>
      <el-container>
        <el-main>
          <basic-container>
            <p style="margin-top: 10px;font-weight: 570;font-size: 19px">基本信息</p>
            <el-descriptions :column="2" border class="margin-top" size="medium">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  <i :class="icons.id"></i>
                  è‹±æ–‡åç§°
                </template>
                {{ obj.id }}
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  <i :class="icons.name"></i>
                  ä¸­æ–‡åç§°
                </template>
                {{ obj.name }}
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  <i :class="icons.tableName"></i>
                  æ•°æ®åº“表名
                </template>
                {{ obj.tableName }}
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  <i :class="icons.domain"></i>
                  æ‰€å±žé¢†åŸŸ
                </template>
                <el-tag v-if="obj.domainText" size="small">
                  {{ obj.domainText }}
                </el-tag>
              </el-descriptions-item>
            </el-descriptions>
            <el-descriptions :column="2" border class="margin-top" direction="vertical">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  <i :class="icons.from"></i>
                  From端类型
                </template>
                <span v-for="item in obj.fromBtmTypes" style="margin-left:2px;">
                                    <el-tag effect="plain" size="small" style="margin-top: 2px;">
                                        {{ item.id + '(' + item.name + ')' }}
                                    </el-tag>
                                </span>
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  <i :class="icons.to"></i>
                  To段类型
                </template>
                <span v-for="item in obj.toBtmTypes" style="margin-left:2px">
                                    <el-tag effect="plain" size="small" style="margin-top: 2px;">
                                        {{ item.id + '(' + item.name + ')' }}
                                    </el-tag>
                                </span>
              </el-descriptions-item>
            </el-descriptions>
            <el-descriptions :column="2" border class="margin-top" size="medium">
              <!--
                  <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                      :contentStyle="descriptionOption.contentStyle">
                      <template slot="label">
                          <i :class="icons.main"></i>
                          ä¸»ç±»åž‹
                      </template>
                    </avue-tree>
                  </div>
                </basic-container>
            </el-aside>
            <el-container>
                <el-main>
                    <basic-container>
                        <p style="margin-top: 10px;font-weight: 570;font-size: 19px">基本信息</p>
                        <el-descriptions class="margin-top" :column="2" size="medium" border>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.id"></i>
                                    è‹±æ–‡åç§°
                                </template>
                                {{ obj.id }}
                            </el-descriptions-item>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.name"></i>
                                    ä¸­æ–‡åç§°
                                </template>
                                {{ obj.name }}
                            </el-descriptions-item>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.tableName"></i>
                                    æ•°æ®åº“表名
                                </template>
                                {{ obj.tableName }}
                            </el-descriptions-item>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.domain"></i>
                                    æ‰€å±žé¢†åŸŸ
                                </template>
                                <el-tag v-if="obj.domainText" size="small">
                                    {{ obj.domainText }}
                                </el-tag>
                            </el-descriptions-item>
                        </el-descriptions>
                        <el-descriptions class="margin-top" direction="vertical" :column="2" border>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.from"></i>
                                    From端类型
                                </template>
                                <span v-for="item in obj.fromBtmTypes" style="margin-left:2px;">
                                    <el-tag size="small" effect="plain" style="margin-top: 2px;">
                                        {{ item.id + '(' + item.name + ')' }}
                                    </el-tag>
                                </span>
                            </el-descriptions-item>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.to"></i>
                                    To段类型
                                </template>
                                <span v-for="item in obj.toBtmTypes" style="margin-left:2px">
                                    <el-tag size="small" effect="plain" style="margin-top: 2px;">
                                        {{ item.id + '(' + item.name + ')' }}
                                    </el-tag>
                                </span>
                            </el-descriptions-item>
                        </el-descriptions>
                       <el-descriptions class="margin-top" :column="2" size="medium" border>
                        <!--
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.main"></i>
                                    ä¸»ç±»åž‹
                                </template>
                                {{ obj.fromBtmTypeName }}
                            </el-descriptions-item>
                            <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                                :contentStyle="descriptionOption.contentStyle">
                                <template slot="label">
                                    <i :class="icons.main"></i>
                                    ä¸»ç±»åž‹
                                </template>
                                {{ obj.toBtmTypeName }}
                            </el-descriptions-item>
                            -->
                            <el-descriptions-item span='2' labelStyle="text-align:center;width:120px">
                                <template slot="label">
                                    <i :class="icons.desc"></i>
                                    æè¿°
                                </template>
                                {{ obj.description }}
                            </el-descriptions-item>
                        </el-descriptions>
                    </basic-container>
                    <!-- å±žæ€§åˆ—表-->
                    <basic-container>
                        <p style="margin-top: 10px;font-weight: 570;font-size: 19px">属性列表</p>
                        <avue-crud class="attributeCrud" v-model="obj" :data="obj.attributes" :option="loadOption">
                            <template slot="attrDataTypeText" slot-scope="{row}">
                                <el-tag>{{ row.attrDataTypeText }}</el-tag>
                            </template>
                        </avue-crud>
                    </basic-container>
                </el-main>
            </el-container>
        </el-container>
        <link-type-add ref="linkAdd" :linkType="addOption.linkType" :domainOption="domainOptions" :icons="icons" :linkStatus="linkStatus"
            @refreshTable="initTreeOnLoad">
        </link-type-add>
                      {{ obj.fromBtmTypeName }}
                  </el-descriptions-item>
                  <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                      :contentStyle="descriptionOption.contentStyle">
                      <template slot="label">
                          <i :class="icons.main"></i>
                          ä¸»ç±»åž‹
                      </template>
                      {{ obj.toBtmTypeName }}
                  </el-descriptions-item>
                  -->
              <el-descriptions-item labelStyle="text-align:center;width:120px" span='2'>
                <template slot="label">
                  <i :class="icons.desc"></i>
                  æè¿°
                </template>
                {{ obj.description }}
              </el-descriptions-item>
            </el-descriptions>
          </basic-container>
          <!-- å±žæ€§åˆ—表-->
          <basic-container>
            <p style="margin-top: 10px;font-weight: 570;font-size: 19px">属性列表</p>
            <avue-crud v-model="obj" :data="obj.attributes" :option="loadOption" class="attributeCrud">
              <template slot="attrDataTypeText" slot-scope="{row}">
                <el-tag>{{ row.attrDataTypeText }}</el-tag>
              </template>
            </avue-crud>
          </basic-container>
        </el-main>
      </el-container>
    </el-container>
    <link-type-add ref="linkAdd" :domainOption="domainOptions" :icons="icons" :linkStatus="linkStatus"
                   :linkType="addOption.linkType"
                   @refreshTable="initTreeOnLoad">
    </link-type-add>
  </el-container>
</template>
<script>
import {
    initTree,
    refOnLoad,
    getDomain,
    saveFromTable,
    getDetail
  initTree,
  refOnLoad,
  getDomain,
  saveFromTable,
  getDetail
} from "@/api/omd/linkType"
import {mapGetters} from "vuex";
export default {
    name: "LinkType",
    data() {
        return {
            linkStatus:'',
            addOption: {
                linkType: {
                    attributes:[]
                },
            },
            domain: null,
            domainOptions: [],
            icons: {
                id: 'el-icon-finished',
                name: 'el-icon-tickets',
                tableName: 'el-icon-date',
                domain: 'el-icon-folder-opened',
                from: 'el-icon-sort-down',
                to: 'el-icon-sort-up',
                main: 'el-icon-warning-outline',
                desc: 'el-icon-chat-line-square'
            },
            treeData: [],
            descriptionOption: {
                labelStyle: 'text-align:center;width:120px',
                contentStyle: 'width:240px;text-align:center;word-break;break-all;'
            },
            loadOption: {
                border: true,
                height: 'auto',
                editBtn: false,
                addBtn: false,
                menu: false,
                highlightCurrentRow: true,
                refreshBtn: false,
                columnBtn: false,
                column: [
                    {
                        label: '英文名称',
                        prop: 'id',
                        align: 'center'
                    }, {
                        label: '中文名称',
                        prop: 'name',
                        align: 'center'
                    },
                    {
                        label: '类型',
                        prop: 'attrDataTypeText',
                        align: 'center',
                        slot: true
                    },
                    {
                        label: '默认值',
                        prop: 'defaultValue',
                        align: 'center'
                    },
                    {
                        label: '说明',
                        prop: 'description',
                        align: 'center'
                    }
                ]
            },
            obj: {},
            treeOption: {
                height:'auto',
                defaultExpandAll: true,
                title: '链接类型树',
                addBtn: false,
                props: {
                    labelText: '',
                    label: 'label',
                    value: 'oid',
                    children: 'childList',
                }
            },
  name: "LinkType",
  data() {
    return {
      linkStatus: '',
      addOption: {
        linkType: {
          attributes: []
        },
      },
      domain: null,
      domainOptions: [],
      icons: {
        id: 'el-icon-finished',
        name: 'el-icon-tickets',
        tableName: 'el-icon-date',
        domain: 'el-icon-folder-opened',
        from: 'el-icon-sort-down',
        to: 'el-icon-sort-up',
        main: 'el-icon-warning-outline',
        desc: 'el-icon-chat-line-square'
      },
      treeData: [],
      descriptionOption: {
        labelStyle: 'text-align:center;width:120px',
        contentStyle: 'width:240px;text-align:center;word-break;break-all;'
      },
      loadOption: {
        border: true,
        height: 'auto',
        editBtn: false,
        addBtn: false,
        menu: false,
        highlightCurrentRow: true,
        refreshBtn: false,
        columnBtn: false,
        column: [
          {
            label: '英文名称',
            prop: 'id',
            align: 'center'
          }, {
            label: '中文名称',
            prop: 'name',
            align: 'center'
          },
          {
            label: '类型',
            prop: 'attrDataTypeText',
            align: 'center',
            slot: true
          },
          {
            label: '默认值',
            prop: 'defaultValue',
            align: 'center'
          },
          {
            label: '说明',
            prop: 'description',
            align: 'center'
          }
        ]
      },
      obj: {},
      treeOption: {
        height: 'auto',
        defaultExpandAll: true,
        title: '链接类型树',
        addBtn: false,
        props: {
          labelText: '',
          label: 'label',
          value: 'oid',
          children: 'childList',
        }
    },
    computed:{
      ...mapGetters(["permission"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.modeling_LinkType.LinkType_add, false),
          editBtn: this.vaildData(this.permission.modeling_LinkType.LinkType_edit, false),
        }
      }
    },
    created() {
        this.initTreeOnLoad();
        this.initDomainOption();
    },
    methods: {
        // æ ‘点击
        nodeClick(data) {
            getDetail(data.oid).then(res => {
                this.obj = res.data.data;
            })
        },
        // æ·»åŠ æŒ‰é’®ç‚¹å‡»äº‹ä»¶
        linkTypeAdd() {
            this.$refs.linkAdd.linkType = {};
            this.linkStatus = 'add';
            this.$refs.linkAdd.showSubmitDialog = true;
        },
        // ç¼–辑按钮点击事件
        linkTypeEdit() {
            var linktype = this.obj;
            linktype.fromBtmValues = this.obj.fromBtmTypes;
            linktype.toBtmValues = this.obj.toBtmTypes;
            linktype.attributes = this.obj.attributes;
            var json = JSON.stringify(linktype);
            this.addOption.linkType = JSON.parse(json);
            this.$refs.linkAdd.linkType = this.addOption.linkType;
            this.linkStatus = 'edit';
            this.$refs.linkAdd.showSubmitDialog = true;
        },
        // ä»Žå·²æœ‰ä¸­èŽ·å–æŒ‰é’®ç‚¹å‡»äº‹ä»¶
        selectFromTable() {
        },
        // åŠ è½½æœåŠ¡æ ‘
        initTreeOnLoad() {
            initTree().then(res => {
                this.treeData = res.data.data;
            });
        },
        // åŠ è½½æœåŠ¡ä¸‹æ‹‰æ¡†
        initDomainOption() {
            getDomain().then(res => {
                this.domainOptions = res.data.data;
            })
        },
      },
    }
  },
  computed: {
    ...mapGetters(["permission"]),
    permissionList() {
      return {
        addBtn: this.vaildData(this.permission.modeling_LinkType.LinkType_add, false),
        editBtn: this.vaildData(this.permission.modeling_LinkType.LinkType_edit, false),
      }
    }
  },
  created() {
    this.initTreeOnLoad();
    this.initDomainOption();
  },
  methods: {
    // æ ‘点击
    nodeClick(data) {
      getDetail(data.oid).then(res => {
        this.obj = res.data.data;
      })
    },
    // æ·»åŠ æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    linkTypeAdd() {
      this.$refs.linkAdd.linkType = {};
      this.linkStatus = 'add';
      this.$refs.linkAdd.showSubmitDialog = true;
    },
    // ç¼–辑按钮点击事件
    linkTypeEdit() {
      var linktype = this.obj;
      linktype.fromBtmValues = this.obj.fromBtmTypes;
      linktype.toBtmValues = this.obj.toBtmTypes;
      linktype.attributes = this.obj.attributes;
      var json = JSON.stringify(linktype);
      this.addOption.linkType = JSON.parse(json);
      this.$refs.linkAdd.linkType = this.addOption.linkType;
      this.linkStatus = 'edit';
      this.$refs.linkAdd.showSubmitDialog = true;
    },
    // ä»Žå·²æœ‰ä¸­èŽ·å–æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    selectFromTable() {
    },
    // åŠ è½½æœåŠ¡æ ‘
    initTreeOnLoad() {
      initTree().then(res => {
        this.treeData = res.data.data;
      });
    },
    // åŠ è½½æœåŠ¡ä¸‹æ‹‰æ¡†
    initDomainOption() {
      getDomain().then(res => {
        this.domainOptions = res.data.data;
      })
    },
  }
}
</script>
<style lang="scss" scoped>
.attributeCrud>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
    display: none !important;
.attributeCrud > .el-card:nth-of-type(2) > .el-card__body > .avue-crud__menu {
  display: none !important;
}
.app {
  overflow: auto;
  height: 84.3vh;
Source/UBCS-WEB/src/views/statistic/statisticPage.vue
@@ -37,7 +37,7 @@
              <el-option label="折线图" value="0"></el-option>
              <el-option label="饼状图" value="1"></el-option>
              <el-option label="柱状图" value="2"></el-option>
              <el-option label="柱状折线图" value="3"></el-option>
              <el-option label="堆叠折线图" value="3"></el-option>
            </el-select>
          </template>
        </el-table-column>
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/StatisticConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.vci.ubcs.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
 * ä¸»æ•°æ®ç»Ÿè®¡å¯¹è±¡
 * @author yuxc
 * @date 2023/12/13 11:13
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("PL_SYS_STATISTIC_CONFIG")
public class StatisticConfig implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @TableId
    private Long id;
    /**
     * ç”¨æˆ·id
     */
    private Long  userId;
    /**
     * ä¸šåŠ¡ç±»åž‹
     */
    private String btmname;
    /**
     * å›¾å½¢ids
     */
    private String chartIds;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createtime;
    /**
     * åˆ›å»ºäºº
     */
    private String creator;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    private Date lastmodifytime;
    /**
     * ä¿®æ”¹äºº
     */
    private String lastmodifier;
    /**
     *
     */
    private Date ts;
}
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/StatisticConfigVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.vci.ubcs.system.vo;
import com.vci.ubcs.system.entity.MdmCountConfig;
import com.vci.ubcs.system.entity.StatisticConfig;
import lombok.Data;
import java.util.List;
/**
 * @author ludc
 * @date 2023/10/18 8:56
 */
@Data
public class StatisticConfigVO extends StatisticConfig {
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/StatisticConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.vci.ubcs.system.controller;
import com.vci.ubcs.system.entity.StatisticConfig;
import com.vci.ubcs.system.service.IMdmCountConfigService;
import com.vci.ubcs.system.service.IStatisticConfigService;
import com.vci.ubcs.system.vo.MdmCountConfigVO;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author yuxc
 * @date 2023/12/13 15:47
 */
@NonDS
@RestController
@AllArgsConstructor
@RequestMapping("/statisticConfig")
//@Api(value = "字典", tags = "字典")
public class StatisticConfigController {
    private final IStatisticConfigService statisticConfigService;
    /**
     * ç»Ÿè®¡åˆ†æžä¿å­˜
     * @param statisticConfigs æ•°æ®ä¼ è¾“对象
     * @return æ•°æ®è¿”回
     */
    @PostMapping("/saveStatisticAnalysis")
    public R saveStatisticAnalysis(@RequestBody List<StatisticConfig> statisticConfigs){
        return statisticConfigService.saveStatisticConfig(statisticConfigs);
    }
    /**
     * ç»Ÿè®¡åˆ†æžåˆ é™¤å›¾å½¢
     * @param btmname ä¸šåŠ¡ç±»åž‹
     * @param chartId å›¾å½¢ID
     * @return æˆåŠŸä¸Žå¦
     */
    @PostMapping("/deleteChartId")
    public R deleteChartId(String btmname,String chartId){
        return statisticConfigService.deleteChartId(btmname,chartId);
    }
    /**
     * èŽ·å–ç”¨æˆ·é…ç½®çš„ä¸šåŠ¡ç±»åž‹ä¸Žç›¸å…³çš„å›¾å½¢
     * @return å›¾å½¢æ•°æ®ä¸Žä¸šåŠ¡ç±»åž‹ID
     */
    @GetMapping("/getBtmAndChartIds")
    public R getBtmAndChartIds(){
        return statisticConfigService.getBtmAndChartIds();
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/StatisticConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.vci.ubcs.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.system.entity.StatisticConfig;
/**
 * @author ludc
 * @date 2023/10/17 14:53
 */
public interface StatisticConfigMapper extends BaseMapper<StatisticConfig> {
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IStatisticConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.vci.ubcs.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.system.entity.StatisticConfig;
import org.springblade.core.tool.api.R;
import java.util.List;
/**
 * ä¸»æ•°æ®ç»Ÿè®¡é¦–页配置服务
 * @author ludc
 * @date 2023/10/17 14:44
 */
public interface IStatisticConfigService extends IService<StatisticConfig> {
    /**
     * ç»Ÿè®¡åˆ†æžä¿å­˜
     * @param statisticConfigs æ•°æ®ä¼ è¾“对象
     * @return æ•°æ®è¿”回
     */
    R saveStatisticConfig(List<StatisticConfig> statisticConfigs);
    /**
     * ç»Ÿè®¡åˆ†æžåˆ é™¤å›¾å½¢
     * @param btmname ä¸šåŠ¡ç±»åž‹
     * @param chartId å›¾å½¢ID
     * @return æˆåŠŸä¸Žå¦
     */
    R deleteChartId(String btmname, String chartId);
    /**
     * èŽ·å–ç”¨æˆ·é…ç½®çš„ä¸šåŠ¡ç±»åž‹ä¸Žç›¸å…³çš„å›¾å½¢
     * @return å›¾å½¢æ•°æ®ä¸Žä¸šåŠ¡ç±»åž‹ID
     */
    R getBtmAndChartIds();
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/StatisticConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package com.vci.ubcs.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.system.entity.MdmCountConfig;
import com.vci.ubcs.system.entity.StatisticConfig;
import com.vci.ubcs.system.mapper.MdmCountConfigMapper;
import com.vci.ubcs.system.mapper.StatisticConfigMapper;
import com.vci.ubcs.system.service.IMdmCountConfigService;
import com.vci.ubcs.system.service.IStatisticConfigService;
import com.vci.ubcs.system.vo.MdmCountConfigVO;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
 * ä¸»æ•°æ®ç»Ÿè®¡é¦–页配置服务
 * @author ludc
 * @date 2023/10/17 14:45
 */
@Service
public class StatisticConfigServiceImpl extends ServiceImpl<StatisticConfigMapper, StatisticConfig> implements IStatisticConfigService {
    /**
     * ç»Ÿè®¡åˆ†æžä¿å­˜
     * @param statisticConfigs æ•°æ®ä¼ è¾“对象
     * @return æ•°æ®è¿”回
     */
    @Override
    public R saveStatisticConfig(List<StatisticConfig> statisticConfigs) {
        QueryWrapper<StatisticConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id", AuthUtil.getUser().getUserId());
        wrapper.in("btmname", statisticConfigs.stream().map(StatisticConfig::getBtmname).collect(Collectors.toList()));
        List<StatisticConfig> list = this.list(wrapper);
        statisticConfigs.stream().map(e ->{
            list.stream().filter(lis -> e.getBtmname().equals(lis.getBtmname())).forEach(lis->{
                    e.setId(lis.getId());
                    e.setTs(new Date());
                    e.setCreator(lis.getCreator());
                    e.setCreatetime(lis.getCreatetime());
                    e.setLastmodifier(String.valueOf(AuthUtil.getUser().getUserId()));
                    e.setLastmodifytime(new Date());
            });
            if(e.getId() == null){
                e.setUserId(AuthUtil.getUser().getUserId());
                e.setTs(new Date());
                e.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
                e.setCreatetime(new Date());
                e.setLastmodifier(String.valueOf(AuthUtil.getUser().getUserId()));
                e.setLastmodifytime(new Date());
            }
            return e;
        }).collect(Collectors.toList());
        this.saveOrUpdateBatch(statisticConfigs);
        return R.success("操作成功!");
    }
    /**
     * ç»Ÿè®¡åˆ†æžåˆ é™¤å›¾å½¢
     * @param btmname ä¸šåŠ¡ç±»åž‹
     * @param chartId å›¾å½¢ID
     * @return æˆåŠŸä¸Žå¦
     */
    @Override
    public R deleteChartId(String btmname, String chartId) {
        QueryWrapper<StatisticConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id", AuthUtil.getUser().getUserId());
        wrapper.in("btmname",btmname);
        StatisticConfig statisticConfig = this.getOne(wrapper);
        if(StringUtil.isBlank(statisticConfig.getChartIds())){
            throw new ServiceException("未查到历史相关图形数据,请先保存!!");
        }
        List<String> chartIds = new ArrayList(Arrays.asList(statisticConfig.getChartIds().split(",")));
        chartIds.remove(chartId);
        statisticConfig.setChartIds(chartIds.stream().collect(Collectors.joining(",")));
        this.updateById(statisticConfig);
        return R.success("操作成功!!");
    }
    /**
     * èŽ·å–ç”¨æˆ·é…ç½®çš„ä¸šåŠ¡ç±»åž‹ä¸Žç›¸å…³çš„å›¾å½¢
     * @return å›¾å½¢æ•°æ®ä¸Žä¸šåŠ¡ç±»åž‹ID
     */
    @Override
    public R getBtmAndChartIds() {
        QueryWrapper<StatisticConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id", AuthUtil.getUser().getUserId());
        List<StatisticConfig> list = this.list(wrapper);
        Map<String, String> collect = list.stream().collect(Collectors.toMap(StatisticConfig::getBtmname, StatisticConfig::getChartIds));
        return R.data(collect);
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/StatisticConfigMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vci.ubcs.system.mapper.StatisticConfigMapper">
</mapper>