From f7bf478f4fe27e41121ac9a2633aa178c0c18909 Mon Sep 17 00:00:00 2001
From: 叶松 <2217086471@qq.com>
Date: 星期五, 22 九月 2023 10:26:13 +0800
Subject: [PATCH] 钢筋笼管理书写完成

---
 web/src/views/DuctpiecePLM/ReinManage/components/ReinsInvent.vue  |  216 ++++++++
 web/src/views/DuctpiecePLM/ReinManage/ReinsProduct.vue            |  586 ++++++++++++++++++++++
 web/src/views/DuctpiecePLM/ReinManage/ReinAnalyse.vue             |   65 ++
 web/src/views/DuctpiecePLM/ReinManage/components/ProductsData.vue |  217 ++++++++
 web/src/views/DuctpiecePLM/ReinManage/components/RingsNumber.vue  |  448 +++++++++++++++++
 5 files changed, 1,532 insertions(+), 0 deletions(-)

diff --git a/web/src/views/DuctpiecePLM/ReinManage/ReinAnalyse.vue b/web/src/views/DuctpiecePLM/ReinManage/ReinAnalyse.vue
new file mode 100644
index 0000000..b46fb2b
--- /dev/null
+++ b/web/src/views/DuctpiecePLM/ReinManage/ReinAnalyse.vue
@@ -0,0 +1,65 @@
+<template>
+  <div class="main">
+    <div class="main_tabs">
+      <el-tabs v-model="activeName" @tab-click="handleClick">
+            <el-tab-pane label="钢筋笼库存" name="first">
+                <reins-invent ref="Invents"></reins-invent> 
+            </el-tab-pane>
+            <el-tab-pane label="成环统计" name="second">
+                <rings-number ref="Rings"></rings-number>
+            </el-tab-pane>
+            <el-tab-pane label="生产数据统计" name="third">
+                <products-data ref="Products"></products-data>
+            </el-tab-pane>
+        </el-tabs>
+    </div>
+  </div>
+</template>
+<script>
+import ReinsInvent from './components/ReinsInvent.vue'//钢筋笼库存
+import RingsNumber from './components/RingsNumber.vue'//成环统计
+import ProductsData from './components/ProductsData.vue'//生产数据统计
+export default {
+    components:{
+        ReinsInvent,
+        RingsNumber,
+        ProductsData
+    },
+    data(){
+        return{
+            activeName:'first'
+        }
+    },
+    mounted(){
+        this.$refs.Invents.searchButtonInfo(true);
+        this.$refs.Invents.getAllProjects();
+    },
+    methods:{
+        //切换界面
+        handleClick(tab){
+            switch(tab.name){
+                case 'second':
+                    this.$refs.Rings.searchButtonInfo(true);
+                    this.$refs.Rings.getAllProjects();
+                    break;
+                case 'third':
+                    this.$refs.Products.searchSteelProducePlan();
+                    break;
+                default:
+                    this.$refs.Invents.searchButtonInfo(true);
+                    this.$refs.Invents.getAllProjects();
+            }
+        },
+    }
+}
+</script>
+<style scoped lang="scss">
+@import'@/style/layout-main.scss';
+/deep/ .el-tabs__content{
+    position: static;
+}
+
+/deep/.main {
+  background: none;
+}
+</style>
\ No newline at end of file
diff --git a/web/src/views/DuctpiecePLM/ReinManage/ReinsProduct.vue b/web/src/views/DuctpiecePLM/ReinManage/ReinsProduct.vue
new file mode 100644
index 0000000..2abf499
--- /dev/null
+++ b/web/src/views/DuctpiecePLM/ReinManage/ReinsProduct.vue
@@ -0,0 +1,586 @@
+<template>
+  <div class="main">
+    <div class="main_header">
+      <div class="header_item">
+        <span class="header_label">项目名称:</span>
+        <el-select v-model="search.proId" placeholder="请选择项目名称" clearable @change="changeSizes">
+            <el-option
+                v-for="item in optionsProject"
+                :key="item.proId"
+                :label="item.proName"
+                :value="item.proId">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">钢筋笼编号:</span>
+        <el-input v-model="search.produceNumber" :size="size" clearable placeholder="请输入钢筋笼编号"></el-input>
+      </div>
+      <div class="header_item">
+        <span class="header_label">制作人:</span>
+        <el-input v-model="search.realName" :size="size" clearable placeholder="请输入制作人"></el-input>
+      </div>
+      <div class="header_item">
+        <span class="header_label">生产班组:</span>
+        <el-select v-model="search.groupId" placeholder="请选择生产班组" clearable filterable>
+            <el-option
+                v-for="item in optionsDeparts"
+                :key="item.groupId"
+                :label="item.groupName"
+                :value="item.groupId">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">质量标注:</span>
+        <el-select v-model="search.isQualified" placeholder="请选择质量标注" clearable>
+            <el-option label="合格" value="1"></el-option>
+            <el-option label="不合格" value="2"></el-option>
+            <el-option label="报废" value="3"></el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">是否入模:</span>
+        <el-select v-model="search.isModel" placeholder="请选择是否入模" clearable>
+            <el-option label="已入模" value="1"></el-option>
+            <el-option label="未入模" value="2"></el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">配筋:</span>
+        <el-select v-model="search.reinforcementId" placeholder="请选择配筋" clearable>
+            <el-option
+                v-for="item in optionsReins"
+                :key="item.hasSteel"
+                :label="item.has"
+                :value="item.hasSteel">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">块号:</span>
+        <el-select v-model="search.blockNum" placeholder="请选择块号" clearable>
+            <el-option
+                v-for="item in optionsBlocks"
+                :key="item.blockNum"
+                :label="item.blockName"
+                :value="item.blockNum">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">打印时间:</span>
+        <el-date-picker
+            v-model="search.time"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            :default-time="['00:00:00','23:59:59']"
+            range-separator="-"
+            start-placeholder="起始时间"
+            end-placeholder="结束时间">
+        </el-date-picker>
+      </div>
+      <div class="header_item">
+        <span class="header_label">质检时间:</span>
+        <el-date-picker
+            v-model="search.times"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            :default-time="['00:00:00','23:59:59']"
+            range-separator="-"
+            start-placeholder="起始时间"
+            end-placeholder="结束时间">
+        </el-date-picker>
+      </div>
+      <div class="header_item">
+        <el-button :size="size" icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
+        <el-button :size="size" icon="el-icon-upload2" v-if="showButton('export')" @click="exportProp">导出Excel</el-button>
+      </div>
+    </div>
+    <div class="main_content">
+      <el-table
+        v-loading="loading"
+        :data="dataList"
+        height="100%"
+        :cell-style="cellStyle">
+        <el-table-column align="center" label="序号" width="60">
+          <template #default="scope">
+            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="produceNumber" label="钢筋笼编号" align="center" width="180" ></el-table-column>
+        <el-table-column prop="proName" label="项目名称" align="center" width="200" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="sizeName" label="尺寸" align="center" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="reinforcementName" label="配筋" align="center"></el-table-column>
+        <el-table-column prop="blockName" label="块号" align="center"></el-table-column>
+        <el-table-column prop="groupName" label="生产班组" align="center"></el-table-column>
+        <el-table-column prop="printTime" label="打印时间" align="center" width="150"></el-table-column>
+        <el-table-column prop="realName" label="制作人" align="center" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="qualityUserName" label="质检人" align="center"></el-table-column>
+        <el-table-column prop="qualityTime" label="质检时间" align="center" width="150"></el-table-column>
+        <el-table-column prop="isQualified" label="质量标注" align="center">
+            <template #default="{row}">
+                <div :class="{'isStand':row.isQualified===2&&row.isModel ===1}">{{row.isQualified===1?'合格':row.isQualified===2?'不合格':row.isQualified===3?'报废':''}}</div>
+            </template>
+        </el-table-column>
+        <el-table-column prop="isModel" label="是否入模" align="center">
+            <template #default="{row}">
+                <div :class="{'isStand':row.isQualified===2&&row.isModel ===1}">{{row.isModel===1?'已入模':row.isModel===2?'未入模':''}}</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="200">
+          <template #default="{ row }">
+            <el-button class="table_btn" size="mini" v-if="showButton('question')&&row.isQualified===2 || row.isQualified===3" @click="updateQuestion(row)">存在问题</el-button>
+            <el-button class="table_btn" size="mini" v-if="showButton('trace')" @click="traceInfo(row)">质量追溯</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="main_footer">
+      <el-pagination
+        background
+        @current-change="changePageNum"
+        @size-change="changePageSize"
+        :current-page="pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+    <el-dialog
+      class="prop_dialog"
+      :title="asyncTitle ? '存在问题' : '质量追溯'"
+      :close-on-click-modal="false"
+      :visible.sync="asyncVisible"
+      width="58%">
+      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form" v-if="asyncTitle">
+        <el-form-item label="质检结果:" prop="checkResult">
+          <span style="color:red">{{ruleForm.checkResult ==='1'?'合格':ruleForm.checkResult ==='2'?'不合格':ruleForm.checkResult ==='3'?'报废':''}}</span>
+        </el-form-item>
+        <el-form-item label="存在问题:" prop="checkFaildReason">
+          <el-input v-model="ruleForm.checkFaildReason" :size="size" type="textarea" :rows="3" :disabled="true" clearable placeholder="请输入盾构单位"></el-input>
+        </el-form-item>
+        <el-form-item label="图片:" v-if="showPhone">
+          <el-image
+              style="width:50px;height:50px; cursor: pointer;"
+              :src="phoneList[0]"
+              :preview-src-list="phoneList"
+              fit="contain">
+              <div slot="error" class="image-slot">
+                <img src="https://pipe.thhy-tj.com/group1/M00/00/03/bx5d1GRlfmCAEmAPAAAFoOEW2dU397.png" style="width:50px;height:50px">
+              </div>
+          </el-image>
+        </el-form-item>
+        <el-form-item label="问题处理结果:" prop="execResult">
+          <el-input v-model="ruleForm.execResult" :size="size" type="textarea" :rows="3" clearable placeholder="请输入问题处理结果"></el-input>
+        </el-form-item>
+        <el-form-item label="备注:" prop="remark">
+          <el-input 
+            v-model="ruleForm.remark" 
+            :size="size" 
+            type="textarea" 
+            :rows="3" 
+            clearable 
+            placeholder="请输入备注"
+            maxlength="200"
+            show-word-limit></el-input>
+        </el-form-item>
+      </el-form>
+      <div v-if="!asyncTitle">
+        <div class="reins_info">钢筋笼信息</div>
+        <div class="reins_info_content">
+            <div class="reins_info_items">
+                <div class="reins_info_titles">钢筋笼编号</div>  
+                <div class="reins_info_datas">{{rebarInfos.produceNumber}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">项目</div>  
+                <div class="reins_info_datas">{{rebarInfos.proName}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">尺寸</div>  
+                <div class="reins_info_datas">{{rebarInfos.sizeName}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">配筋</div>  
+                <div class="reins_info_datas">{{rebarInfos.reinforcementName}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">块号</div>  
+                <div class="reins_info_datas">{{rebarInfos.blockName}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">制作人</div>  
+                <div class="reins_info_datas">{{rebarInfos.realName}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">质检人</div>  
+                <div class="reins_info_datas">{{rebarInfos.qualityUserName}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">质检时间</div>  
+                <div class="reins_info_datas">{{rebarInfos.qualityTime}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">质检结果</div>  
+                <div class="reins_info_datas">{{rebarInfos.isQualified===1?'合格':rebarInfos.isQualified===2?'不合格':rebarInfos.isQualified===3?'报废':''}}</div>  
+            </div>
+            <div class="reins_info_items">
+                <div class="reins_info_titles">打印日期</div>  
+                <div class="reins_info_datas">{{rebarInfos.printTime}}</div>  
+            </div>
+        </div>
+      </div>
+      <div slot="footer" v-if="asyncTitle && execFlag!==1">
+        <el-button @click="asyncVisible = false">取 消</el-button>
+        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
+      </div>
+    </el-dialog>
+  </div>
+  
+</template>
+
+<script>
+import { buttonPinia } from '../../../pinia/index';
+import { throttle, changeSize,downFiles } from '../../../plugins/public'; // 导入节流、动态切换组件尺寸方法
+  export default {
+    data() {
+      return {
+        size: changeSize(), // 组件尺寸
+        pageNum: 1,
+        pageSize: 10,
+        steelProduceNum:null,
+        showPhone:false,//是否展示报废图片
+        phoneList:[],//展示图片族
+        search:{},//查询条件
+        execFlag:null,//是否提交过存在问题
+        total: 0,
+        loading: false,
+        dataList: [], //钢筋笼生产信息列表  is_qualified:是否合格 1合格2 不合格   is_model:是否入模  1入模2未入模
+        optionsDeparts:[],//生产班组
+        optionsReins:[],//配筋
+        optionsBlocks:[],//块号
+        asyncTitle: true, // 对话框title 新增:true  修改:false
+        asyncVisible: false, // 添加 修改对话框
+        optionsProject:[],//项目名称
+        rebarInfos:null,//质量追溯列表
+        ruleForm: {}, // 按钮表单
+        rules: {
+          segmentName: [{
+            required: true,
+            message: '请输入标段名称',
+            trigger: 'blur'
+          }],
+          shieldEnp: [{
+            required: true,
+            message: '请输入盾构单位',
+            trigger: 'blur'
+          }],
+          station: [{
+            required: true,
+            message: '请输入站点',
+            trigger: 'blur'
+          }],
+          proId: [{
+            required: true,
+            message: '请选择项目名称',
+            trigger: 'change'
+          }],
+          segmentAdmin: [{
+            required: true,
+            message: '请选择需求负责人',
+            trigger: 'change'
+          }],
+        },
+      }
+    },
+    watch: {
+      asyncVisible(bol) {
+        if(!bol) {
+          this.ruleForm = {};
+          this.$refs.ruleForm.resetFields();
+        }
+      }
+    },
+    mounted() {
+      const that = this;
+      // 根据窗口大小动态修改组件尺寸
+      window.onresize = () => {
+        that.size = changeSize();
+      }
+      that.searchButtonInfo(true);
+      that.getAllDeparts()
+      that.getAllProjects()
+    },
+    methods: {
+      //获得所有项目名称
+     getAllProjects(){
+        let obj = {
+            pageNum: 1,
+            pageSize: 100000000
+        }
+        this.$api.Engineer.searchProjects(obj).then(res=>{
+            if(res.statusMsg === 'ok'){
+                this.optionsProject = res.data.list
+            }else{
+                this.$message.warning(res.statusMsg)
+            }
+        })
+     },
+    cellStyle({row,column}){
+      if(row.isQualified===2&& row.isModel===1 &&column.property =="isQualified"&&column.property =="isModel"){
+        return {
+          'color':'red'
+        }
+      }
+    },
+    //通过选择项目选择尺寸
+     changeSizes(val){
+      this.$api.Reinforce.searchProjectBears({proId:val,pageNum: 1,
+          pageSize:1000000}).then(res=>{
+        if(res.statusMsg === 'ok'){
+            this.optionsReins = res.data.hasDtos
+            this.optionsBlocks = res.data.blokDtos
+        }else{
+            this.$message.warning(res.statusMsg)
+        }
+      })
+     },
+      //获取生产班组
+      getAllDeparts(){
+        this.$api.Personnerl.GETDEPARTMENTDATA({}).then(res=>{
+            if(res.statusMsg === 'ok'){
+                res.data.forEach(item=>{
+                  this.optionsDeparts.push(...item.groups)
+                })
+            }else{
+                this.$message.warning(res.statusMsg)
+            }
+        })
+      },
+      // 查询按钮列表信息
+      searchButtonInfo(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        let params = Object.assign({},this.search,{
+          pageNum: this.pageNum,
+          pageSize: this.pageSize
+        })
+        params.strTime = this.search.time&&this.search.time[0]
+        params.endTime = this.search.time&&this.search.time[1]
+        params.strTimes = this.search.times&&this.search.times[0]
+        params.endTimes = this.search.times&&this.search.times[1]
+        delete params.time
+        delete params.times
+        this.loading = true;
+        this.$api.Reinforce.searchReinforcement(params).then((res) => {
+          if(res.statusMsg === 'ok') {
+            this.total = res.data.total;
+            this.dataList = res.data.list;
+          }
+          this.loading = false;
+        })
+      },
+      // 转圈圈
+      functionLoading() {
+        this.loadingView = this.$loading({
+          lock: true,
+          text: '请稍后...',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        });
+      },
+      // 导出按钮信息
+      exportProp() {
+        this.functionLoading();
+        let params  = Object.assign({},this.search)
+        params.strTime = this.search.time&&this.search.time[0]
+        params.endTime = this.search.time&&this.search.time[1]
+        params.strTimes = this.search.times&&this.search.times[0]
+        params.endTimes = this.search.times&&this.search.times[1]
+        delete params.time
+        delete params.times
+        this.$api.Reinforce.exportDatas(params).then(res => {
+            downFiles(res, '钢筋笼生产信息', 'xls')
+            this.loadingView.close()
+        })
+        .catch(() => {
+          this.loadingView.close();
+        })
+      },
+      // 存在问题按钮
+      updateQuestion(row) {
+        this.steelProduceNum = row.produceNumber
+        this.asyncTitle = true;
+        this.asyncVisible = true;
+        this.$api.Reinforce.searchQuessions({steelProduceId: row.steelProduceId,steelProduceNum:row.produceNumber}).then(res=>{
+            if(res.statusMsg === 'ok'){
+              this.execFlag = res.data[0].execFlag
+              if(res.data[0].checkResult==='3'){
+                this.$set(this.ruleForm,'checkFaildReason',res.data[0].remark)
+                this.$set(this.ruleForm,'checkResult',res.data[0].checkResult)
+                res.data[0].checkFile.map(item=>{
+                    this.phoneList.push(`https://pipe.thhy-tj.com/${item}`)
+                })
+                this.showPhone = true
+              }else{
+                this.showPhone = false
+                // this.ruleForm = res.data[0]
+                if(res.data[0].checkDtos === null){
+                  // this.$set(this.ruleForm,'checkFaildReason',' '+res.data[0].remark)
+                }else{
+                  let arr =""
+                  let arr1 = ""
+                  let hmark = res.data[0].remark
+                  res.data[0].checkDtos.map(names=>{
+                    arr+=names.reasonName+","
+                    return arr
+                  })
+                  arr1 = arr.lastIndexOf(',')
+                  arr = arr.substring(0,arr1)
+                  this.$set(this.ruleForm,'checkFaildReason',arr+'。'+hmark)
+                }
+              }
+            }else{
+                this.$message.warning(res.statusMsg)
+            }
+        })
+      },
+      // 质量追溯按钮
+      traceInfo(row) {
+        this.asyncTitle = false;
+        this.asyncVisible = true;
+        this.$api.Reinforce.detailsReinforcement({steelProduceId:row.steelProduceId}).then(res=>{
+            if(res.statusMsg === 'ok'){
+                this.rebarInfos = res.data
+            }else{
+                this.$message.warning(res.statusMsg)
+            }
+        })
+      },
+      // 提交存在问题按钮
+      submitInsert: throttle(function() {
+        this.$refs.ruleForm.validate((valid) => {
+          if(valid) {
+            const params = Object.assign({}, this.ruleForm);
+            params.segmentList = this.needBlocks
+            params.steelProduceNum=this.steelProduceNum
+            this.$api.Reinforce.submitQuessions(params).then((res) => {
+              if(res.statusMsg === 'ok') {
+                this.asyncVisible = false;
+                this.searchButtonInfo(true);
+                this.$message.success('提交成功!');
+              } else {
+                this.$message.warning(res.statusMsg);
+              }
+            })
+          }
+        })
+      }, 3000),
+      // 提交修改按钮信息
+      submitUpdate: throttle(function() {
+        this.$refs.ruleForm.validate((valid) => {
+          if(valid) {
+            const params = Object.assign({}, this.ruleForm);
+            params.segmentList = this.needBlocks
+            this.$api.Engineer.updateSegment(params).then((res) => {
+              if(res.statusMsg === 'ok') {
+                this.asyncVisible = false;
+                this.searchButtonInfo(true);
+                this.$message.success('添加成功!');
+              } else {
+                this.$message.warning(res.statusMsg);
+              }
+            })
+          }
+        })
+      }, 3000),
+      // 判断按钮权限信息
+      showButton(str) {
+        const pinia = buttonPinia();
+        return pinia.$state.buttonInfo.includes(str);
+      },      
+      // 切换页数
+      changePageNum(page) {
+        this.pageNum = page;
+        this.searchButtonInfo();
+      },
+      // 切换每页条数
+      changePageSize(size) {
+        this.pageSize = size;
+        this.searchButtonInfo();
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+@import '../../../style/layout-main.scss';
+.reins_info{
+    color: #fff;
+    font-size: 16px;
+    position: relative;
+    padding:0px 0px 10px 10px;
+    border-bottom: 1px solid #0D5274;
+    &::before{
+        content: '';
+        width: 2px;
+        height: 18px;
+        background-color: #18F6F8;
+        position: absolute;
+        left: 2px;
+        top: 3px;
+    }
+}
+.reins_info_content{
+    display: flex;
+    margin: 20px 0px;
+    padding-right: 10px;
+    overflow: auto;
+    .reins_info_items{
+        border-top: 1px solid #1CB7E0;
+        flex: none;
+        .reins_info_titles{
+            border-left: 1px solid #1CB7E0;
+            border-right: 1px solid #1CB7E0;
+            border-bottom: 1px solid #1CB7E0;
+            text-align: center;
+            padding: 10px;
+            background-color: #082F57;
+            color: #0DEAF8;
+        }
+        .reins_info_datas{
+            height: 40px;
+            border-left: 1px solid #1CB7E0;
+            border-right: 1px solid #1CB7E0;
+            border-bottom: 1px solid #1CB7E0;
+            text-align: center;
+            padding: 10px;
+            background-color: #061C48;
+            color: #0DEAF8;
+        }
+    }
+}
+
+.isStand{
+    color: red;
+}
+
+//滚动条样式
+::-webkit-scrollbar {
+    width: 4px; 
+    height: 8px;   
+}
+::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    box-shadow: inset 0 0 5px #0DEAF8;
+    background: rgba(0,0,0,0.2);
+}
+::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px transparent;
+    border-radius: 0;
+    background: transparent;
+}
+</style>
\ No newline at end of file
diff --git a/web/src/views/DuctpiecePLM/ReinManage/components/ProductsData.vue b/web/src/views/DuctpiecePLM/ReinManage/components/ProductsData.vue
new file mode 100644
index 0000000..0c9482d
--- /dev/null
+++ b/web/src/views/DuctpiecePLM/ReinManage/components/ProductsData.vue
@@ -0,0 +1,217 @@
+<template>
+  <div class="main tabs_main" style="height:89%">
+    <div class="main_header">
+      <div class="header_item">
+        <span class="header_label">生产时间:</span>
+        <el-date-picker
+          v-model="timeData"
+          type="monthrange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </div>
+      <div class="header_item">
+        <el-button
+          v-if="showButton('search')"
+          icon="el-icon-search"
+          @click="searchSteelProducePlan()">
+          查询
+        </el-button>
+      </div>
+    </div>
+    <div class="main_content">
+      <div id="first_chart" class="main_content_chart"></div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { buttonPinia } from '../../../../pinia';
+export default {
+  name: 'RebarcageIndex',
+  data() {
+    return {
+      timeData: '',
+    }
+  },
+  mounted() {
+    const dateYear = new Date().getFullYear();
+    this.timeData = [`${dateYear}-01-01`, `${dateYear}-12-01`];
+    // this.searchSteelProducePlan();
+  },
+  methods: {
+    // 查询钢筋笼生产统计对比
+    async searchSteelProducePlan() {
+      const { data } = await this.$api.Analyse.searchSteelProducePlan({
+        startTime: this.timeData ? this.timeData[0] : '',
+        endTime: this.timeData ? this.timeData[1] : '',
+      });
+      if(data.length === 0) {
+        this.$message.warning('请选择生产时间');
+        return false;
+      }
+      this.$nextTick(() => {
+        this.createCharts('first_chart', data);
+      })
+    },
+    // 创建echart图表
+    createCharts(name, data) {
+      const labelData = data.map(item => item.month);
+      const firstData = data.map(item => item.count ? item.count : 0);
+      const secondData = data.map(item => item.rate ? item.rate : 0);
+      const chartsImage = this.$echarts.init(document.getElementById(name));
+      const option = {
+        tooltip: {
+          trigger: "axis",
+          formatter: function (params) {
+            var relVal = params[0].name;
+            for (var i = 0; i < params.length; i++) {
+              if (params[i].componentIndex === 0) {
+                relVal +=
+                  "<br/>" +
+                  params[i].marker +
+                  "月生产量" +
+                  " : " +
+                  params[i].value;
+              } else {
+                relVal +=
+                  "<br/>" +
+                  params[i].marker +
+                  "环比增长率" +
+                  " : " +
+                  params[i].value +
+                  "%";
+              }
+            }
+            return relVal;
+          },
+        },
+        grid: {
+          top: "15%",
+          right: "3%",
+          left: "2%",
+          bottom: "11%",
+        },
+        xAxis: [
+          {
+            type: "category",
+            data: labelData,
+            axisLine: {
+              lineStyle: {
+                width: 2,
+                color: "#B7E4F7",
+              },
+            },
+            axisLabel: {
+              color: "#B7E4F7",
+            },
+            axisTick: {
+              show: false,
+            },
+          },
+        ],
+        yAxis: [
+          {
+            type: "value",
+            max: 100,
+            splitNumber: 10,
+            axisLabel: {
+              formatter: "{value}",
+              textStyle: {
+                color: "#CAD3E0",
+              },
+            },
+            splitLine: {
+              lineStyle: {
+                width: 2,
+                type: "dashed",
+                color: "#28477C",
+              },
+            },
+          },
+          {
+            type: "value",
+            max: 100,
+            splitNumber: 10,
+            axisLabel: {
+              formatter: "{value}%",
+              textStyle: {
+                color: "#B7E4F7",
+              },
+            },
+            splitLine: {
+              show: false,
+            },
+          },
+        ],
+        series: [
+          {
+            type: "bar",
+            data: firstData,
+            yAxisIndex: 0,
+            itemStyle: {
+              normal: {
+                color: new this.$echarts.graphic.LinearGradient( 0, 0, 0, 1,
+                  [
+                    {
+                      offset: 0,
+                      color: "rgba(15, 106, 134, 1)", // 0% 处的颜色
+                    },
+                    {
+                      offset: 1,
+                      color: "rgba(28, 186, 233, 1)", // 100% 处的颜色
+                    },
+                  ],
+                  false
+                ),
+              },
+            },
+          },
+          {
+            type: "bar",
+            data: secondData,
+            yAxisIndex: 1,
+            itemStyle: {
+              normal: {
+                color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1,
+                  [
+                    {
+                      offset: 0,
+                      color: "rgba(194, 92, 61, 1)", // 0% 处的颜色
+                    },
+                    {
+                      offset: 1,
+                      color: "rgba(250, 205, 145, 1)", // 100% 处的颜色
+                    },
+                  ],
+                  false
+                ),
+              },
+            },
+          },
+        ],
+      }
+      chartsImage.clear();
+      chartsImage.setOption(option);
+      window.onresize = () => {
+        chartsImage.resize()
+      }
+    },
+    // 判断按钮权限信息
+    showButton(str) {
+      const pinia = buttonPinia();
+      return pinia.$state.buttonInfo.includes(str);
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "@/style/layout-main.scss";
+
+.main_content_chart {
+  height: 100%;
+}
+</style>
diff --git a/web/src/views/DuctpiecePLM/ReinManage/components/ReinsInvent.vue b/web/src/views/DuctpiecePLM/ReinManage/components/ReinsInvent.vue
new file mode 100644
index 0000000..ac992e6
--- /dev/null
+++ b/web/src/views/DuctpiecePLM/ReinManage/components/ReinsInvent.vue
@@ -0,0 +1,216 @@
+<template>
+  <div class="main tabs_main" style="height:89%">
+    <div class="main_header">
+        <div class="header_item">
+        <span class="header_label">项目名称:</span>
+        <el-select v-model="search.proId" placeholder="请选择项目名称" clearable @change="changeSizes">
+            <el-option
+                v-for="item in optionsProject"
+                :key="item.proId"
+                :label="item.proName"
+                :value="item.proId">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">尺寸:</span>
+        <el-select v-model="search.sizeId" placeholder="请选择尺寸" clearable>
+            <el-option
+                v-for="item in optionsSize"
+                :key="item.sizeId"
+                :label="item.sizeName"
+                :value="item.sizeId">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">配筋:</span>
+        <el-select v-model="search.reinforcementId" placeholder="请选择配筋" clearable>
+            <el-option
+                v-for="item in optionsReins"
+                :key="item.hasSteel"
+                :label="item.has"
+                :value="item.hasSteel">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">块号:</span>
+        <el-select v-model="search.blockId" placeholder="请选择块号" clearable>
+            <el-option
+                v-for="item in optionsBlocks"
+                :key="item.blockNum"
+                :label="item.blockName"
+                :value="item.blockNum">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <el-button :size="size" icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
+      </div>
+    </div>
+    <div class="main_content">
+      <el-table
+        v-loading="loading"
+        :data="dataList"
+        height="100%">
+        <el-table-column align="center" label="序号" width="60">
+          <template #default="scope">
+            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="proName" label="项目名称" align="center" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="sizeName" label="尺寸" align="center" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="reinforcementName" label="配筋" align="center"></el-table-column>
+        <el-table-column prop="blockNumName" label="块号" align="center"></el-table-column>
+        <el-table-column prop="stock" label="库存数量" align="center"></el-table-column>
+      </el-table>
+    </div>
+    <div class="main_footer">
+      <el-pagination
+        background
+        @current-change="changePageNum"
+        @size-change="changePageSize"
+        :current-page="pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import { buttonPinia } from '../../../../pinia/index';
+import { changeSize } from '../../../../plugins/public'; // 导入节流、动态切换组件尺寸方法
+  export default {
+    data() {
+      return {
+        size: changeSize(), // 组件尺寸
+        pageNum: 1,
+        pageSize: 10,
+        timer:null,//定时器
+        search:{},//查询条件
+        total: 0,
+        loading: false,
+        dataList: [], //钢筋笼库存信息列表
+        optionsReins:[],//配筋
+        optionsBlocks:[],//块号
+        optionsSize:[],//尺寸
+        optionsProject:[],//项目名称
+      }
+    },
+    mounted() {
+      const that = this;
+      // 根据窗口大小动态修改组件尺寸
+      window.onresize = () => {
+        that.size = changeSize();
+      }
+    //   that.searchButtonInfo(true);
+      that.timer = setInterval(()=>{
+        that.searchButtonInfo(true);
+      },30000)
+      // that.getAllTypes()
+    //   that.getAllProjects()
+    },
+    beforeDestroy() {
+        clearInterval(this.timer);
+        this.timer = null;
+    },
+    methods: {
+     //获得所有项目名称
+     getAllProjects(){
+        let obj = {
+            pageNum: 1,
+            pageSize: 100000000
+        }
+        this.$api.Engineer.searchProjects(obj).then(res=>{
+            if(res.statusMsg === 'ok'){
+                this.optionsProject = res.data.list
+            }else{
+                this.$message.warning(res.statusMsg)
+            }
+        })
+     },
+     //通过选择项目选择尺寸
+     changeSizes(val){
+      this.$api.Reinforce.searchProjectSize({proId:val,pageNum: 1,
+          pageSize:100000000}).then(res=>{
+        if(res.statusMsg === 'ok'){
+          if(this.search.proId ===""){
+            this.optionsSize = []
+          }else{
+            this.optionsSize = res.data.list
+          }
+        }else{
+            this.$message.warning(res.statusMsg)
+        }
+      })
+      this.$api.Reinforce.searchProjectBears({proId:val,pageNum: 1,
+          pageSize:1000000}).then(res=>{
+        if(res.statusMsg === 'ok'){
+            this.optionsReins = res.data.hasDtos
+            this.optionsBlocks = res.data.blokDtos
+        }else{
+            this.$message.warning(res.statusMsg)
+        }
+      })
+      
+     },
+    // //获取尺寸配筋转向等信息
+    //   getAllTypes(){
+    //     let params = {
+    //         pageNum: 1,
+    //         pageSize: 100000000
+    //     }
+    //     this.$api.Dictionary.searchDictionary(params).then(res=>{
+    //         if(res.statusMsg === 'ok'){
+    //             this.optionsSize = res.data.list.filter(item =>item.dictType === '1')
+    //             this.optionsReins = res.data.list.filter(item =>item.dictType === '2')
+    //             this.optionsBlocks = res.data.list.filter(item =>item.dictType === '5')
+    //         }else{
+    //             this.$message.warning(res.statusMsg)
+    //         }
+    //     })
+    //   },
+      // 查询按钮列表信息
+      searchButtonInfo(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        let params = Object.assign({},this.search,{
+          pageNum: this.pageNum,
+          pageSize: this.pageSize
+        })
+        this.loading = true;
+        this.$api.Reinforce.searchInventory(params).then((res) => {
+          if(res.statusMsg === 'ok') {
+            this.total = res.data.total;
+            this.dataList = res.data.list;
+          }
+          this.loading = false;
+        })
+      },
+      // 判断按钮权限信息
+      showButton(str) {
+        const pinia = buttonPinia();
+        return pinia.$state.buttonInfo.includes(str);
+      },      
+      // 切换页数
+      changePageNum(page) {
+        this.pageNum = page;
+        this.searchButtonInfo();
+      },
+      // 切换每页条数
+      changePageSize(size) {
+        this.pageSize = size;
+        this.searchButtonInfo();
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+@import '../../../../style/layout-main.scss';
+</style>
\ No newline at end of file
diff --git a/web/src/views/DuctpiecePLM/ReinManage/components/RingsNumber.vue b/web/src/views/DuctpiecePLM/ReinManage/components/RingsNumber.vue
new file mode 100644
index 0000000..334d8a5
--- /dev/null
+++ b/web/src/views/DuctpiecePLM/ReinManage/components/RingsNumber.vue
@@ -0,0 +1,448 @@
+<template>
+  <div class="main tabs_main" style="height:93%">
+    <div class="main_header">
+        <div class="header_item">
+        <span class="header_label">项目名称:</span>
+        <el-select v-model="search.proId" placeholder="请选择项目名称" clearable @change="changeSizes">
+            <el-option
+                v-for="item in optionsProject"
+                :key="item.proId"
+                :label="item.proName"
+                :value="item.proId">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">尺寸:</span>
+        <el-select v-model="search.sizeId" placeholder="请选择尺寸" clearable>
+            <el-option
+                v-for="item in optionsSize"
+                :key="item.sizeId"
+                :label="item.sizeName"
+                :value="item.sizeId">
+            </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <el-button :size="size" icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
+      </div>
+    </div>
+    <div class="main_content" style="display:flex;flex-wrap:wrap;overflow:auto;">
+      <div class="main_content_index" v-for="(item,index) in staticLists" :key="index">
+        <div class="main_content_top">
+            <div class="main_content_title">
+                <div class="main_text">{{item.proName}}</div>
+                <div class="main_datas">{{item.sizeName}}</div>
+            </div>
+        </div>
+        <div class="main_content_bottom">
+            <div class="content_top">
+                <div style="border:1px solid #39B5FE;background-color:#042548;border-radius:4px">
+                    <img src="../../../../assets/wheel.png" class="bottom_left">
+                </div>
+                <div class="bottom_right">
+                    <div class="plan_content_items" style="margin-bottom:16px">
+                        <div class="plan_content_title">序号</div>
+                        <div class="plan_content_datas" style="background-color:#052C55;color:#39B5FE" v-for="(its,indexs) in item.hasDtos" :key="indexs">{{indexs+1}}</div>
+                    </div>
+                    <div class="plan_content_items" style="margin-bottom:0px;border-bottom:0px solid transparent;">
+                        <div class="plan_content_title">管片配筋</div>
+                        <div class="plan_content_datas" v-for="(iten,idx) in item.hasDtos" :key="idx" :style="{'background': iten.colors || 'none'}">{{iten.has}}</div>
+                    </div>
+                    <div class="plan_content_items">
+                        <div class="plan_content_title">已成环数(环)</div>
+                        <div class="plan_content_datas" v-for="(loop,indexs) in item.hasDtos" :key="indexs">
+                          {{showLooping(item.looping,loop)}}
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="content_bottom">
+                <div class="content_bottom_rows">
+                    <div class="content_bottom_text">
+                        <span style="position:absolute;top:26px;left:10px;">配筋</span>
+                        <span style="position:absolute;top:8px;left:65px">块号</span>
+                    </div>
+                    <div class="content_bottom_datas" v-for="(block,index) in item.blokDtos" :key="index">{{block.blockName}}</div>
+                </div>
+                <div class="content_bottom_rebar">
+                    <div style="display: flex; flex-direction: column;">
+                        <div class="content_bottom_titles" v-for="(iten,index) in item.hasDtos" :key="index">{{iten.has}}</div>
+                    </div>
+                    <template v-if="item&&item.info.length !==0">
+                        <div style="display: flex; flex-direction: column; flex: 1" 
+                            v-for="(blockItem,blockIndex) in item.blokDtos" 
+                            :key="blockIndex">
+                            <div 
+                                class="content_bottom_num" 
+                                :class="{'bottom_nums':showCounts(item.info, hasItem, blockItem) !== 0}" 
+                                v-for="(hasItem,hasIndex) in item.hasDtos" 
+                                :key="hasIndex">
+                                {{showCounts(item.info, hasItem, blockItem)}}
+                            </div>
+                        </div>
+                    </template>
+                    <div v-else class="content_bottom_nodata" style="border-bottom:1px solid #39B5FE;">暂无数据</div>
+                </div>
+            </div>
+        </div>
+      </div>
+    </div>
+    <div class="main_footer">
+      <el-pagination
+        background
+        @current-change="changePageNum"
+        @size-change="changePageSize"
+        :current-page="pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import { buttonPinia } from '../../../../pinia/index';
+import { changeSize } from '../../../../plugins/public'; // 导入节流、动态切换组件尺寸方法
+  export default {
+    data() {
+      return {
+        size: changeSize(), // 组件尺寸
+        pageNum: 1,
+        pageSize: 10,
+        search:{},//查询条件
+        total: 0,
+        loading: false,
+        staticLists: [], //成环统计信息列表
+        optionsSize:[],//尺寸
+        optionsProject:[],//项目名称
+        numLists: [],//已成环数
+        nums:[],//配筋块号对应数量
+      }
+    },
+    mounted() {
+      const that = this;
+      // 根据窗口大小动态修改组件尺寸
+      window.onresize = () => {
+        that.size = changeSize();
+      }
+    //   that.searchButtonInfo(true);
+    //   that.getAllProjects()
+    },
+    methods: {
+     //获得所有项目名称 
+     getAllProjects(){
+        this.$api.Engineer.getAllProjects({}).then(res=>{
+            if(res.statusMsg === 'ok'){
+                this.optionsProject = res.data
+            }else{
+                this.$message.warning(res.statusMsg)
+            }
+        })
+     },
+      //通过选择项目选择尺寸
+     changeSizes(val){
+      this.$api.Reinforce.searchProjectSize({proId:val,pageNum: 1,
+          pageSize:100000000}).then(res=>{
+        if(res.statusMsg === 'ok'){
+          if(this.search.proId ===""){
+            this.optionsSize = []
+          }else{
+            this.optionsSize = res.data.list
+          }
+        }else{
+            this.$message.warning(res.statusMsg)
+        }
+      })
+     },
+      async getBlockData(proId) {
+        const { data } = await this.$api.Reinforce.searchProjectBears({
+            proId: proId
+        })
+        return data
+      },
+      async getLoopData(item) {
+        const { data } = await this.$api.Reinforce.searchRing({
+            proId:item.proId,sizeId:item.sizeId
+        })
+        return data;
+      },
+      // 查询按钮列表信息 
+      searchButtonInfo(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        let params = Object.assign({},this.search,{
+          pageNum: this.pageNum,
+          pageSize: this.pageSize
+        })
+        this.loading = true;
+        this.$api.Reinforce.searchProjectSize(params).then((res) => {
+          if(res.statusMsg === 'ok') {
+            this.total = res.data.total;
+            this.staticLists = res.data.list.map((item) => {
+            this.getBlockData(item.proId).then((data) => {
+                    this.$set(item, 'blokDtos', data.blokDtos || []);
+                    this.$set(item, 'hasDtos', data.hasDtos || []);
+                })
+                this.getLoopData(item).then((data) => {
+                    this.$set(item, 'info', data.info || []);
+                    this.$set(item, 'looping', data.looping || []);  
+                })
+                return item;
+            });
+          }
+          this.loading = false;
+        })
+      },
+      showLooping(loopData,hasItem){
+        if(loopData){
+          const dataList = loopData.filter(item =>item.reinforcementId === hasItem.hasSteel)
+          if(dataList &&dataList[0]){
+            return dataList[0].counts
+          }else{
+            return 0
+          }
+        }else{
+          return 0
+        }
+      },
+      // 
+      showCounts(infoData, hasItem, blockItem) {
+        if(infoData) {
+          infoData = infoData.flat(Infinity);
+          const dataList = infoData.filter(item => 
+            item.reinforcementId === hasItem.hasSteel && item.blockNum === blockItem.blockNum
+          )
+          if(dataList && dataList[0]) {
+            return dataList[0].inventory
+          } else {
+            return 0;
+          }
+        }
+      },
+      // 判断按钮权限信息
+      showButton(str) {
+        const pinia = buttonPinia();
+        return pinia.$state.buttonInfo.includes(str);
+      },      
+      // 切换页数
+      changePageNum(page) {
+        this.pageNum = page;
+        this.searchButtonInfo();
+      },
+      // 切换每页条数
+      changePageSize(size) {
+        this.pageSize = size;
+        this.searchButtonInfo();
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+@import '../../../../style/layout-main.scss';
+.main_content_index{
+    min-width: calc(50% - 16px);
+    height: 500px;
+    margin: 5px 16px 16px 0px;
+    .main_content_top{
+        height: 40px;
+        background-color: rgba(57,181,254,0.3);
+        border-top-left-radius: 6px;
+        border-top-right-radius: 6px;
+
+        .main_content_title{
+            height: 40px;
+            margin-left: 24px;
+            display: flex;
+            align-items: center;
+            flex-direction: row;
+            position: relative;
+            &::before{
+                width: 4px;
+                height: 20px;
+                content: '';
+                position: absolute;
+                left: -13px;
+                top: 10px;
+                background-color: #39B5FE;
+            }
+            .main_text{
+                color: #39B5FE;
+                font-size: 16px;
+                font-weight: 500;
+            }
+            .main_datas{
+                margin-left: 30px;
+                color: #39B5FE;
+                font-size: 16px;
+                font-weight: 500;
+            }
+        }
+    }
+    .main_content_bottom{
+        border-bottom-left-radius: 6px;
+        border-bottom-right-radius: 6px;
+        height: calc(100% - 50px);
+        background-color: #02163C;
+        padding: 20px;
+        overflow: auto;
+
+        .content_top{
+            display: flex;
+            height: 145px;
+            .bottom_left{
+                width: 100%;
+                height: 100%;
+                margin-left: -7px;
+                cursor: pointer;
+                &:hover{
+                    animation: rotate 3s linear infinite;
+                    }
+                    @keyframes rotate {
+                    0% {
+                    transform: rotateY(0deg);
+                    }
+                    100% {
+                    transform: rotateY(360deg);
+                    }
+                }
+            }
+            .bottom_right{
+                width: 100%;
+                min-width: 400px;
+
+                .plan_content_items{
+                    display: flex;
+                    border: 1px solid #39B5FE;
+                    margin: 0px 0px 8px 15px;
+
+                    .plan_content_title{
+                        width: 145px;
+                        padding: 12px 0px;
+                        flex: none;
+                        color: #39B5FE;
+                        text-align: center;
+                        background-color: #052C55;
+                    }
+                    .plan_content_datas{
+                        flex: 1;
+                        padding: 12px 0px;
+                        color: #fff;
+                        text-align: center;
+                        border-left: 1px solid #39B5FE;
+                    }
+                }
+            }
+        }
+        .content_bottom{
+            width: 100%;
+            height: calc(100% - 145px);
+            margin-top: 10px;
+            border-bottom: 1px solid #063B5B;
+
+            .content_bottom_rows{
+                display: flex;
+                text-align: center;
+                height: 50px;
+                border: 1px solid #09607A;
+                margin-bottom: 15px;
+                .content_bottom_text{
+                    span{
+                        color: #39B5FE;
+                    }
+                    flex: none;
+                    color: #fff;
+                    position: relative;
+                    width: 100px;
+                    height: 50px;
+                    background: linear-gradient(to top right,#085A76,#032249);
+                    &::before{
+                        content: '';
+                        width: 110%;
+                        height: 2px;
+                        background: linear-gradient(to bottom right,#085A76,#032249);
+                        position: absolute;
+                        top: 22px;
+                        left: -6px;
+                        transform: rotateZ(26deg);
+                    }
+                }
+                .content_bottom_datas{
+                    display: flex;
+                    flex: 1;
+                    align-items: center;
+                    justify-content: center;
+                    color: #39B5FE;
+                    border-left: 1px solid #09607A;
+                    background: linear-gradient(to bottom,#032048,#09607A);
+                    // cursor: pointer;
+                }
+            }
+            .content_bottom_rebar{
+                display: flex;
+                text-align: center;
+                height: calc(100% - 65px);
+                border-top: 1px solid #39B5FE;
+                border-left: 1px solid #39B5FE;
+                border-right: 1px solid #39B5FE;
+
+                .content_bottom_nodata{
+                    border-left: 1px solid #39B5FE;
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                    flex: 1;
+                    color: #fff;
+                }
+                .content_bottom_titles{
+                    color: #39B5FE;
+                    width: 100px;
+                    flex: 1;
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                    border-bottom: 1px solid #39B5FE;
+                    &:last-child{
+                        border-bottom-color: #39B5FE;
+                    }
+                }
+                .content_bottom_num{
+                    border-left: 1px solid #39B5FE;
+                    display: flex;
+                    flex: 1;
+                    align-items: center;
+                    justify-content: center;
+                    color: #fff;
+                    border-bottom: 1px solid #39B5FE;
+                    &:last-child{
+                        border-bottom-color: #39B5FE;
+                    }
+                }
+                .bottom_nums{
+                    background-color: #014C6E;
+                    color: #39B5FE;
+                }
+            }
+        }
+    }
+}
+//滚动条样式
+::-webkit-scrollbar {
+    width: 4px; 
+    height: 8px;   
+}
+::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    box-shadow: inset 0 0 5px #084E6B;
+    background: rgba(0,0,0,0.2);
+}
+::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px transparent;
+    border-radius: 0;
+    background: transparent;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3