From c84b78391bbc6ff68ffb4a1e55ff9b603fa697dc Mon Sep 17 00:00:00 2001
From: 张晓波 <bingbo1993@126.com>
Date: 星期三, 18 十月 2023 14:40:58 +0800
Subject: [PATCH] Merge branch 'master' of http://111.30.93.211:10101/r/supipe

---
 web/src/api/modules/report.js                                                                               |   11 
 hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/controller/PipeReportController.java    |   31 +
 web/src/App.vue                                                                                             |   95 ----
 web/src/views/DuctpiecePLM/ReportCenter/BearReport.vue                                                      |  230 +++++++++++
 web/src/api/modules/device.js                                                                               |   30 +
 web/src/views/LayoutIndex/index.vue                                                                         |   93 ++++
 hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/impl/PipeReportServiceImpl.java |   48 ++
 hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/mapper/PipeReportMapper.java            |   28 +
 web/src/assets/report_icons.png                                                                             |    0 
 web/src/views/EquipmentManage/EquipSpot.vue                                                                 |  325 ++++++++++++++++
 web/src/views/DuctpiecePLM/ReportCenter/DuctReport.vue                                                      |  206 ++++++++++
 hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/entity/PipeReportEntity.java            |   51 ++
 web/src/views/LayoutIndex/components/LayoutAside.vue                                                        |    6 
 hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/PipeReportService.java          |   17 
 14 files changed, 1,072 insertions(+), 99 deletions(-)

diff --git a/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/controller/PipeReportController.java b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/controller/PipeReportController.java
new file mode 100644
index 0000000..8c4c4af
--- /dev/null
+++ b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/controller/PipeReportController.java
@@ -0,0 +1,31 @@
+package com.thhy.secure.modules.biz.pipereport.controller;
+
+import com.thhy.general.common.BasicResult;
+import com.thhy.secure.modules.biz.pipereport.service.PipeReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author QiuYuHao
+ * @CreateDate 2023-10-17 17:13:01
+ * 管片报表控制层
+ */
+@RestController
+@RequestMapping(value = "szpipereport")
+public class PipeReportController {
+
+	@Autowired
+	private PipeReportService pipeReportService;
+
+	@PostMapping(value = "pipeReport")
+	public BasicResult pipeReport(@RequestBody Map<String,Object> map){
+		return pipeReportService.getPipeReportList(map);
+	}
+
+	@PostMapping(value = "steelReport")
+	public BasicResult steelReport(@RequestBody Map<String,Object> map){
+		return pipeReportService.getSteelReportList(map);
+	}
+}
diff --git a/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/entity/PipeReportEntity.java b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/entity/PipeReportEntity.java
new file mode 100644
index 0000000..e1e48e4
--- /dev/null
+++ b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/entity/PipeReportEntity.java
@@ -0,0 +1,51 @@
+package com.thhy.secure.modules.biz.pipereport.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @Author QiuYuHao
+ * @CreateDate 2023-10-17 17:19:23
+ * 管片报表实体
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PipeReportEntity implements Serializable {
+	/**
+	 * 项目名称
+	 */
+	private String proName;
+	private String proId;
+
+	/**
+	 * 生产总数
+	 */
+	private Integer produceTotal;
+
+	/**
+	 * 合格总数
+	 */
+	private Integer qualifiedTotal;
+
+	/**
+	 * 未入模数量
+	 */
+	private Integer moldedNotNum;
+
+	/**
+	 * 入模数量
+	 */
+	private Integer moldedNum;
+
+	/**
+	 * 发运数量
+	 */
+	private Integer shippingNum;
+
+}
diff --git a/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/mapper/PipeReportMapper.java b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/mapper/PipeReportMapper.java
new file mode 100644
index 0000000..65e4a17
--- /dev/null
+++ b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/mapper/PipeReportMapper.java
@@ -0,0 +1,28 @@
+package com.thhy.secure.modules.biz.pipereport.mapper;
+
+import com.thhy.secure.modules.biz.pipereport.entity.PipeReportEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author QiuYuHao
+ * @CreateDate 2023-10-18 8:46:07
+ * 管片、钢筋笼报表mapper
+ */
+@Mapper
+public interface PipeReportMapper {
+
+	/**
+	 * 管片生产报表
+	 * @return
+	 */
+	List<PipeReportEntity> getPipeReportList(Map<String,Object> map);
+
+	/**
+	 * 钢筋笼生产报表
+	 * @return
+	 */
+	List<PipeReportEntity> getSteelReportList(Map<String,Object> map);
+}
diff --git a/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/PipeReportService.java b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/PipeReportService.java
new file mode 100644
index 0000000..ed1cad7
--- /dev/null
+++ b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/PipeReportService.java
@@ -0,0 +1,17 @@
+package com.thhy.secure.modules.biz.pipereport.service;
+
+import com.thhy.general.common.BasicResult;
+
+import java.util.Map;
+
+/**
+ * @Author QiuYuHao
+ * @CreateDate 2023-10-18 9:18:18
+ */
+public interface PipeReportService {
+
+	BasicResult getPipeReportList(Map<String,Object> map);
+
+	BasicResult getSteelReportList(Map<String,Object> map);
+
+}
diff --git a/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/impl/PipeReportServiceImpl.java b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/impl/PipeReportServiceImpl.java
new file mode 100644
index 0000000..f8fd726
--- /dev/null
+++ b/hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/pipereport/service/impl/PipeReportServiceImpl.java
@@ -0,0 +1,48 @@
+package com.thhy.secure.modules.biz.pipereport.service.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.thhy.general.common.BasicResult;
+import com.thhy.general.config.SysUserInfo;
+import com.thhy.general.utils.UserInfoUtils;
+import com.thhy.secure.modules.biz.pipereport.entity.PipeReportEntity;
+import com.thhy.secure.modules.biz.pipereport.mapper.PipeReportMapper;
+import com.thhy.secure.modules.biz.pipereport.service.PipeReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author QiuYuHao
+ * @CreateDate 2023-10-18 9:22:33
+ * 管片和钢筋笼报表实现
+ */
+@Service
+public class PipeReportServiceImpl implements PipeReportService
+{
+
+	@Autowired
+	private PipeReportMapper pipeReportMapper;
+
+	@Override
+	public BasicResult getPipeReportList(Map<String,Object> map) {
+		SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
+		String companyId = sysUserInfo.getCompanyId();
+		map.put("companyId",companyId);
+		PageHelper.startPage((Integer) map.get("pageNum"),(Integer)map.get("pageSize"));
+		List<PipeReportEntity> pipeReportList = pipeReportMapper.getPipeReportList(map);
+		return BasicResult.success(new PageInfo<PipeReportEntity>(pipeReportList));
+	}
+
+	@Override
+	public BasicResult getSteelReportList(Map<String, Object> map) {
+		SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
+		String companyId = sysUserInfo.getCompanyId();
+		map.put("companyId",companyId);
+		PageHelper.startPage((Integer) map.get("pageNum"),(Integer)map.get("pageSize"));
+		List<PipeReportEntity> steelReportList = pipeReportMapper.getSteelReportList(map);
+		return BasicResult.success(new PageInfo<PipeReportEntity>(steelReportList));
+	}
+}
diff --git a/web/src/App.vue b/web/src/App.vue
index e7defbc..0b4f5f3 100644
--- a/web/src/App.vue
+++ b/web/src/App.vue
@@ -12,52 +12,14 @@
   name: 'App',
   data(){
     return{
-      closeNotify:null,
-      timer:null,//定时器
-      alarmList:[
-      ],//报警信息组
+      
     }
   },
   mounted(){
-    this.timer = setInterval(()=>{
-      this.getAlarmDatas()
-    },60000)
+    
   },
   methods:{
-      //展示报警信息
-      showAlarmTips(){
-        const h = this.$createElement
-        this.alarmList.forEach((item)=>{
-          this.closeNotify =window.setTimeout(()=>{
-              this.$notify({
-                position: 'bottom-right',
-                showClose:true,
-                duration:5000,
-                dangerouslyUseHTMLString: true,
-                message:h("div",{class:"alarm_tips"},[
-                  h("div",{class:"alarm_tip_header"},[
-                    h("div",{class:"alarm_tip_text"},'钢筋预警'),
-                  ]),
-                  h("div",{class:"alarm_tip_content"},[
-                    h("div",{class:'alarm_tip_content_text'},`${item.steelName}`),
-                    h("div",{class:"alarm_tip_content_datas"},'已低于预警库存')
-                  ]),
-                ])
-              });
-          },0)
-        })
-      },
-      //获取报警数据
-       getAlarmDatas(){
-         this.$api.Rebar.alarmTipsBear({}).then(res=>{
-          if(res.statusMsg =='ok'){
-            this.alarmList = res.data
-            this.showAlarmTips()
-          }else{
-            this.$message.warning(res.statusMsg)
-          }
-        })
-      },
+      
   }
 }
 </script>
@@ -85,58 +47,7 @@
   background: url("./assets/alarm_bg.png") no-repeat;
   background-size: 100% 100%;
 }
-.alarm_tips{
-  display: flex;
-  flex-direction: column;
-  position: relative;
-  line-height: 45px;
 
-  .alarm_tip_header{
-    width: 100%;
-    display: flex;
-    justify-content: space-between;
-    position: absolute;
-    top: -20px;
-    
-    .alarm_tip_text{
-      color:#fff;
-      font-size: 16px;
-      margin-left: 10px;
-      padding-right:35px;
-      position: relative;
-      &::before{
-        content: "";
-        position: absolute;
-        top: 14px;
-        left: -20px;
-        width: 15px;
-        height: 15px;
-        background: url("./assets/alarm_icons.png") no-repeat;
-        background-size: 100% 100%;
-      }
-    }
-    .alarm_tip_time{
-      color: #999;
-    }
-    .alarm_tip_close{
-      color: #f42829;
-      cursor: pointer;
-    }
-  }
-  .alarm_tip_content{
-    display: flex;
-    padding-top: 5px;
-    .alarm_tip_content_text{
-      padding-top: 15px;
-      color: #f42829;
-    }
-    .alarm_tip_content_datas{
-      padding-left: 15px;
-      padding-top: 15px;
-      color: #fff;
-    }
-  }
-}
 
 .el-form-item {
   margin-bottom: 1.5rem;
diff --git a/web/src/api/modules/device.js b/web/src/api/modules/device.js
index a8d580f..43833a5 100644
--- a/web/src/api/modules/device.js
+++ b/web/src/api/modules/device.js
@@ -133,4 +133,34 @@
     // 删除设备维修信息
     deleteServiceDevice: params =>
         axios.get('/engineering/overhaul/overhaulDel', {params}),
+
+    /**
+     *  设备点检
+    */
+    // 查询设备点检列表信息
+    searchSpotCheckList: (params) =>
+        axios({
+            method: 'post',
+            url: '/m/checkDevice/findList',
+            headers: {
+                pageNum: params.pageNum,
+                pageSize: params.pageSize
+            },
+            data: params
+        }),
+    // 添加设备点检信息
+    insertSpotCheckInfo: (params) =>
+        axios.post('m/checkDevice/addCheckDevice', params),
+    // 修改设备点检信息
+    updateSpotCheckInfo: (params) =>
+    axios.post('m/checkDevice/addCheckDevice', params),
+    //删除设备点检信息
+    deleteSpotCheckInfo: (params) =>
+        axios.post('/m/checkDevice/delete', params),
+    // 获取点检详情
+    getSpotCheckDetail: (params) =>
+        axios.post('m/checkDevice/checkDeviceInfo', params),
+    // 获取全部设备信息
+    getAllDeviceData: () =>
+        axios.post('/m/checkDevice/deviceList'),
  }
\ No newline at end of file
diff --git a/web/src/api/modules/report.js b/web/src/api/modules/report.js
index 5d8374e..6d67229 100644
--- a/web/src/api/modules/report.js
+++ b/web/src/api/modules/report.js
@@ -10,6 +10,17 @@
     searchDieList: params =>
         axios.post('/engineering/device/mouldList', params),
 
+    /**
+     * 钢筋笼生产报表
+     */
+    searchBearsReports: params =>
+        axios.post('/secure/szpipereport/steelReport', params),
+
+    /**
+     * 管片生产报表
+     */
+    searchPipesReports: params =>
+        axios.post('/secure/szpipereport/pipeReport', params),
 
      /**
      *  安全考核报表
diff --git a/web/src/assets/report_icons.png b/web/src/assets/report_icons.png
new file mode 100644
index 0000000..25d18b2
--- /dev/null
+++ b/web/src/assets/report_icons.png
Binary files differ
diff --git a/web/src/views/DuctpiecePLM/ReportCenter/BearReport.vue b/web/src/views/DuctpiecePLM/ReportCenter/BearReport.vue
index 0b5e368..bddacd3 100644
--- a/web/src/views/DuctpiecePLM/ReportCenter/BearReport.vue
+++ b/web/src/views/DuctpiecePLM/ReportCenter/BearReport.vue
@@ -1,3 +1,229 @@
 <template>
-    <div>钢筋笼生产报表</div>
-</template>
\ No newline at end of file
+  <div class="main">
+    <div class="main_header">
+      <!-- <div class="header_item">
+        <span class="header_label">采集时间:</span>
+        <el-date-picker
+            v-model="search.time"
+            type="daterange"
+            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">
+      <div class="main_cards" v-for="(item,index) in dataList" :key="index">
+        <div class="main_cards_headers">{{item.proName}}</div>
+        <div class="main_cards_numbers">
+            <div class="cards_numbers_rows">
+                <div class="cards_numbers_show" style="margin-right:15px">
+                    <div class="numbers_rows_text">生产总数</div>
+                    <div class="numbers_rows_datas">{{item.produceTotal}}</div>
+                </div>
+                <div class="cards_numbers_show">
+                    <div class="numbers_rows_text">合格总数</div>
+                    <div class="numbers_rows_datas">{{item.qualifiedTotal}}</div>
+                </div>
+            </div>
+            <div class="cards_numbers_rows">
+                <div class="cards_numbers_show" style="margin-right:15px">
+                    <div class="numbers_rows_text">未入模</div>
+                    <div class="numbers_rows_datas">{{item.moldedNotNum}}</div>
+                </div>
+                <div class="cards_numbers_show">
+                    <div class="numbers_rows_text">已入模</div>
+                    <div class="numbers_rows_datas">{{item.moldedNum}}</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,downFiles } from '../../../plugins/public'; // 导入节流、动态切换组件尺寸方法
+  export default {
+    data() {
+      return {
+        size: changeSize(), // 组件尺寸
+        pageNum: 1,
+        pageSize: 10,
+        search:{},//查询条件
+        total: 0,
+        loading: false,
+        dataList: [], //钢筋笼生产报表列表
+        asyncTitle: true, // 对话框title 新增:true  修改:false
+        asyncVisible: false, // 添加 修改对话框
+      }
+    },
+    watch: {
+      asyncVisible(bol) {
+        if(!bol) {
+          this.ruleForm = {};
+          this.$refs.ruleForm.resetFields();
+        }
+      }
+    },
+    mounted() {
+      const that = this;
+      // 根据窗口大小动态修改组件尺寸
+      window.onresize = () => {
+        that.size = changeSize();
+      }
+      that.searchButtonInfo(true);
+    },
+    methods: {
+      // 查询按钮列表信息
+      searchButtonInfo(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        let params = Object.assign({},this.search,{
+          pageNum: this.pageNum,
+          pageSize: this.pageSize
+        })
+        this.loading = true;
+        this.$api.Report.searchBearsReports(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]
+        delete params.time
+        this.$api.DuctpiecePLM.exportSegmentSteam(params).then(res => {
+            downFiles(res, '管片蒸养信息', 'xls')
+            this.loadingView.close()
+        })
+        .catch(() => {
+          this.loadingView.close();
+        })
+      },
+      // 判断按钮权限信息
+      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{
+    display: flex;
+    align-content: flex-start;
+    flex-wrap: wrap;
+    overflow: auto!important;
+    .main_cards{
+        width: 500px;
+        height: 220px;
+        background-color: #031A46;
+        border-radius: 4px;
+        margin: 10px;
+        display: flex;
+        flex-direction: column;
+
+        .main_cards_headers{
+            flex: none;
+            width: 100%;
+            line-height: 50px;
+            position: relative;
+            color: #EBF8F9;
+            font-size: 24px;
+            padding-left: 50px;
+            background-color: #11ACBC;
+            border-top-left-radius: 4px;
+            border-top-right-radius: 4px;
+            &::before{
+                content: "";
+                width: 20px;
+                height: 20px;
+                position: absolute;
+                top: 15px;
+                left: 15px;
+                background: url("../../../assets/report_icons.png") no-repeat;
+                background-size: 100% 100%;
+            }
+
+        }
+        .main_cards_numbers{
+            height: calc(100% - 50px);
+            display: flex;
+            flex-direction: column;
+            justify-content: space-evenly;
+            flex: 1;
+            padding: 15px;
+
+            .cards_numbers_rows{
+                line-height: 40px;
+                display: flex;
+                justify-content: space-around;
+                border-radius: 4px;
+                .cards_numbers_show{
+                    width: 50%;
+                    display: flex;
+                    justify-content: space-around;
+                    background-color: #085172;
+                    border-radius: 4px;
+                    .numbers_rows_text{
+                        font-size: 20px;
+                        color: #EBF1F3;
+                    }
+                    .numbers_rows_datas{
+                        font-size: 24px;
+                        color: #18F7F9;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>
\ No newline at end of file
diff --git a/web/src/views/DuctpiecePLM/ReportCenter/DuctReport.vue b/web/src/views/DuctpiecePLM/ReportCenter/DuctReport.vue
index d409c58..b16145e 100644
--- a/web/src/views/DuctpiecePLM/ReportCenter/DuctReport.vue
+++ b/web/src/views/DuctpiecePLM/ReportCenter/DuctReport.vue
@@ -1,3 +1,205 @@
 <template>
-    <div>管片生产报表</div>
-</template>
\ No newline at end of file
+  <div class="main">
+    <div class="main_header">
+      <!-- <div class="header_item">
+        <span class="header_label">采集时间:</span>
+        <el-date-picker
+            v-model="search.time"
+            type="daterange"
+            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">
+      <div class="main_cards" v-for="(item,index) in dataList" :key="index">
+        <div class="main_cards_headers">{{item.proName}}</div>
+        <div class="main_cards_numbers">
+            <div class="cards_numbers_rows">
+                <div class="cards_numbers_show" style="margin-right:15px">
+                    <div class="numbers_rows_text">生产总数</div>
+                    <div class="numbers_rows_datas">{{item.produceTotal}}</div>
+                </div>
+                <div class="cards_numbers_show">
+                    <div class="numbers_rows_text">合格总数</div>
+                    <div class="numbers_rows_datas">{{item.qualifiedTotal}}</div>
+                </div>
+            </div>
+            <div class="cards_numbers_rows">
+                <div class="cards_numbers_show" style="margin-right:15px">
+                    <div class="numbers_rows_text">已发运数</div>
+                    <div class="numbers_rows_datas">{{item.shippingNum}}</div>
+                </div>
+                <div class="cards_numbers_show" style="background:none">
+                    <div class="numbers_rows_text"></div>
+                    <div class="numbers_rows_datas"></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,
+        dataList: [], //管片生产报表列表
+        asyncTitle: true, // 对话框title 新增:true  修改:false
+        asyncVisible: false, // 添加 修改对话框
+      }
+    },
+    watch: {
+      asyncVisible(bol) {
+        if(!bol) {
+          this.ruleForm = {};
+          this.$refs.ruleForm.resetFields();
+        }
+      }
+    },
+    mounted() {
+      const that = this;
+      // 根据窗口大小动态修改组件尺寸
+      window.onresize = () => {
+        that.size = changeSize();
+      }
+      that.searchButtonInfo(true);
+    },
+    methods: {
+      // 查询按钮列表信息
+      searchButtonInfo(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        let params = Object.assign({},this.search,{
+          pageNum: this.pageNum,
+          pageSize: this.pageSize
+        })
+        this.loading = true;
+        this.$api.Report.searchPipesReports(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';
+.main_content{
+    display: flex;
+    align-content: flex-start;
+    flex-wrap: wrap;
+    overflow: auto!important;
+    .main_cards{
+        width: 500px;
+        height: 220px;
+        background-color: #031A46;
+        border-radius: 4px;
+        margin: 10px;
+        display: flex;
+        flex-direction: column;
+
+        .main_cards_headers{
+            flex: none;
+            width: 100%;
+            line-height: 50px;
+            position: relative;
+            color: #EBF8F9;
+            font-size: 24px;
+            padding-left: 50px;
+            background-color: #11ACBC;
+            border-top-left-radius: 4px;
+            border-top-right-radius: 4px;
+            &::before{
+                content: "";
+                width: 20px;
+                height: 20px;
+                position: absolute;
+                top: 15px;
+                left: 15px;
+                background: url("../../../assets/report_icons.png") no-repeat;
+                background-size: 100% 100%;
+            }
+
+        }
+        .main_cards_numbers{
+            height: calc(100% - 50px);
+            display: flex;
+            flex-direction: column;
+            justify-content: space-evenly;
+            flex: 1;
+            padding: 15px;
+
+            .cards_numbers_rows{
+                line-height: 40px;
+                display: flex;
+                justify-content: space-around;
+                border-radius: 4px;
+                .cards_numbers_show{
+                    width: 50%;
+                    display: flex;
+                    justify-content: space-around;
+                    background-color: #085172;
+                    border-radius: 4px;
+                    .numbers_rows_text{
+                        font-size: 20px;
+                        color: #EBF1F3;
+                    }
+                    .numbers_rows_datas{
+                        font-size: 24px;
+                        color: #18F7F9;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>
\ No newline at end of file
diff --git a/web/src/views/EquipmentManage/EquipSpot.vue b/web/src/views/EquipmentManage/EquipSpot.vue
index 5058d0b..c4742f6 100644
--- a/web/src/views/EquipmentManage/EquipSpot.vue
+++ b/web/src/views/EquipmentManage/EquipSpot.vue
@@ -1,3 +1,324 @@
 <template>
-    <div>设备点检</div>
-</template>
\ No newline at end of file
+  <div class="main">
+    <div class="main_header">
+      <div class="header_item">
+        <span class="header_label">设备编号:</span>
+        <el-input v-model="bigDeviceName" clearable placeholder="请输入设备编号"></el-input>
+      </div>
+      <div class="header_item">
+        <span class="header_label">点检日期:</span>
+        <el-date-picker
+          v-model="timeData"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </div>
+      <div class="header_item">
+        <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchSpotCheckList(true)">查询</el-button>
+        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="propInsert()">新增</el-button>
+      </div>
+    </div>
+    <div class="main_content">
+      <el-table
+        v-loading="loading"
+        :data="spotCheckList"
+        height="100%">
+        <el-table-column label="序号" align="center" >
+          <template #default="scope">
+            <div>
+              <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="bigDeviceName" label="设备名称" align="center" ></el-table-column>
+        <el-table-column prop="bigDeviceModel" label="规格型号" align="center" ></el-table-column>
+        <el-table-column prop="bigNumber" label="设备编号" align="center" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="bigTypeStr" label="设备类型" align="center" ></el-table-column>
+        <el-table-column prop="checkTime" label="点检时间" align="center" ></el-table-column>
+        <el-table-column prop="checkTypeName" label="点检类型" align="center" ></el-table-column>
+        <el-table-column prop="adminUserName" label="责任人" align="center" ></el-table-column>
+        <el-table-column prop="adminUserPhone" label="责任人电话" align="center" ></el-table-column>
+        <el-table-column prop="checkContent" show-overflow-tooltip label="点检内容及结果" align="center" ></el-table-column>
+        <el-table-column label="操作" align="center" >
+          <template #default="{ row }">
+            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button>
+            <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteInfo(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 ? '新增点检' : '修改点检信息'"
+      :visible.sync="asyncSpot"
+      width="35%">
+      <el-form ref="form" :model="formSpot" :rules="rulesSpot" label-width="auto" class="rule_form">
+        <el-form-item label="设备名称:" prop="deviceId">
+          <el-select v-model="formSpot.deviceId" clearable placeholder="请选择设备" @change="selectDevice">
+            <el-option
+              v-for="item in deviceData"
+              :key="item.bigDeviceId"
+              :label="item.bigDeviceName"
+              :value="item.bigDeviceId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="规格型号:" prop="bigDeviceModel">
+          <el-input v-model="formSpot.bigDeviceModel" disabled placeholder="请输入规格型号"></el-input>
+        </el-form-item>
+        <el-form-item label="设备编号:" prop="bigNumber">
+          <el-input v-model="formSpot.bigNumber" disabled placeholder="请输入设备编号"></el-input>
+        </el-form-item>
+        <el-form-item label="设备类型:" prop="bigTypeName">
+          <el-input v-model="formSpot.bigTypeName" disabled placeholder="请输入设备类型"></el-input>
+        </el-form-item>
+        <el-form-item label="开始时间:" prop="checkTime">
+          <el-date-picker 
+            v-model="formSpot.checkTime" 
+            type="datetime"
+            value-format="yyyy-MM-dd HH:mm:ss" 
+            placeholder="请选择开始时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="点检类型:" prop="checkType">
+          <el-select v-model="formSpot.checkType" clearable placeholder="请选择点检类型">
+            <el-option
+              v-for="item in checkTypeData"
+              :key="item.dictId"
+              :label="item.dictName" 
+              :value="item.dictId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="点检内容及结果:" prop="checkContent">
+        <el-input 
+          type="textarea" 
+          v-model="formSpot.checkContent"
+          clearable
+          placeholder="请输入点检内容及结果">
+        </el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button @click="asyncSpot = false">取 消</el-button>
+        <el-button class="submit_btn" @click="asyncTitle ? submitInsertForm() : submitUpdateForm()">提 交</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { buttonPinia } from '../../pinia';
+import { throttle } from '../../plugins/public';
+  export default {
+    data() {
+      return {
+        bigDeviceName: '',
+        timeData: '',
+        pageNum: 1,
+        pageSize: 10,
+        total: 0,
+        loading: false,
+        spotCheckList: [],
+        asyncTitle: true, // true 新增 false 修改
+        asyncSpot: false,
+        formSpot: {},
+        rulesSpot: {
+					deviceId: [{
+						required: true,
+						message: '请选择设备',
+						trigger: ['blur', 'change']
+					}]
+				},
+        deviceData: [],
+        checkTypeData: []
+      }
+    },
+    mounted() {
+			this.searchSpotCheckList(true);
+    },
+    methods: {
+      // 获取全部设备信息
+      async getAllDeviceData() {
+        const { data } = await this.$api.Device.getAllDeviceData();
+        this.deviceData = data;
+      },
+			// 获取点检类型
+      async getChackAllTypes(){
+        const { data } = await this.$api.Dictionary.searchDictionary({
+						pageNum: 1,
+            pageSize: 100000000,
+            dictType: 'check_type'
+				});
+				this.checkTypeData = data.list;
+      },
+      // 查询设备点检列表信息
+      searchSpotCheckList(bol) {
+        if(bol) {
+            this.pageNum = 1;
+        }
+        this.loading = true;
+        this.spotCheckList = [];
+        this.$api.Device.searchSpotCheckList({
+					pageNum: this.pageNum,
+					pageSize: this.pageSize,
+					startTime: this.timeData ? this.timeData[0] : '',
+					endTime: this.timeData ? this.timeData[1] : ''
+        }).then(res => {
+					if(res.success) {
+						this.total = res.data.total;
+						this.spotCheckList = res.data.list;
+					}
+					this.loading = false;
+        }).catch(() => {
+            this.loading = false;
+        })
+      },
+      // 打开添加
+      propInsert() {
+        this.asyncTitle = true;
+        this.asyncSpot = true;
+      },
+			// 选择设备获取设备信息
+			selectDevice(data) {
+				this.$set(this.formSpot, 'bigDeviceModel', '');
+				this.$set(this.formSpot, 'bigNumber', '');
+				this.$set(this.formSpot, 'bigTypeName', '');
+				if(!data) return;
+				this.$api.Device.detailsBigDevice({
+					bigDeviceId: data
+				}).then(res => {
+					this.$set(this.formSpot, 'bigDeviceModel', res.data.bigDeviceModel);
+					this.$set(this.formSpot, 'bigNumber', res.data.bigNumber);
+					this.$set(this.formSpot, 'bigTypeName', res.data.bigTypeName);
+				})
+			},
+			// 打开修改信息
+			updateProp(row) {
+				this.$api.Device.getSpotCheckDetail({
+					id: row.id
+				}).then((res) => {
+					this.selectDevice(res.data.deviceId);
+					this.$set(this.formSpot, 'id', res.data.id);
+					this.$set(this.formSpot, 'deviceId', res.data.deviceId);
+					this.$set(this.formSpot, 'checkTime', res.data.checkTime);
+					this.$set(this.formSpot, 'checkType', res.data.checkType);
+					this.$set(this.formSpot, 'checkContent', res.data.checkContent);
+				});
+				this.asyncTitle = false;
+				this.asyncSpot = true;
+			},
+			// 删除设备点检信息
+      deleteInfo(row) {
+        this.$confirm("该操作将删除该点检信息,是否继续删除?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+       })
+       .then(() => {
+         this.$api.Device.deleteSpotCheckInfo({id: row.id})
+        .then(res => {
+          if(res.statusMsg === 'ok') {
+            this.searchSpotCheckList(true);
+            this.$message.success("删除成功!");
+          } else {
+            this.$message.warning(res.statusMsg);
+          }
+        })
+       })
+       .catch(() => {
+         this.$message.warning("您已取消");
+       })
+      },
+			// 提交添加信息
+			submitInsertForm: throttle(function() {
+				this.$refs.form.validate((valid) => {
+					if(valid) {
+						const params = {};
+						params.deviceId = this.formSpot.deviceId;
+						params.checkTime = this.formSpot.checkTime;
+						params.checkType = this.formSpot.checkType;
+						params.checkContent = this.formSpot.checkContent;
+						params.fileList = [];
+						this.$api.Device.insertSpotCheckInfo(params).then(res => {
+							if(res.success) {
+								this.asyncSpot = false;
+								this.searchSpotCheckList(true);
+								this.$message.success('添加成功!');
+							} else {
+								this.$message.warning(res.statusMsg);
+							}
+						})
+					}
+				})
+			}, 3000),
+			// 提交添加信息
+			submitUpdateForm: throttle(function() {
+				this.$refs.form.validate((valid) => {
+					if(valid) {
+						const params = {};
+						params.id = this.formSpot.id;
+						params.deviceId = this.formSpot.deviceId;
+						params.checkTime = this.formSpot.checkTime;
+						params.checkType = this.formSpot.checkType;
+						params.checkContent = this.formSpot.checkContent;
+						params.fileList = [];
+						this.$api.Device.updateSpotCheckInfo(params).then(res => {
+							if(res.success) {
+								this.asyncSpot = false;
+								this.searchSpotCheckList(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;
+      },
+      // 切换每页条数
+      changePageSize(size) {
+        this.pageSize = size;
+      }
+    },
+    watch: {
+      asyncSpot(bol) {
+        if(bol) {
+          this.getAllDeviceData();
+					this.getChackAllTypes();
+        } else {
+          this.formSpot = {};
+          this.$refs.form.resetFields();
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+@import '@/style/layout-main.scss';
+</style>
\ No newline at end of file
diff --git a/web/src/views/LayoutIndex/components/LayoutAside.vue b/web/src/views/LayoutIndex/components/LayoutAside.vue
index 3ed7255..8d29a32 100644
--- a/web/src/views/LayoutIndex/components/LayoutAside.vue
+++ b/web/src/views/LayoutIndex/components/LayoutAside.vue
@@ -21,7 +21,7 @@
 
               <template v-for="three in item.children">
                 <template v-if="three.children && three.children.length > 1">
-                  <el-submenu :key="three.name" :index="three.path">
+                  <el-submenu :key="three.name" :index="three.path" class="titles_two">
                     <template slot="title">
                       <span>{{three.meta.title}}</span>
                     </template>
@@ -117,6 +117,10 @@
   }
 }
 
+.titles_two{
+  padding-left: 15px;
+}
+
 /deep/ .el-menu {
   border-right: 0;
 }
diff --git a/web/src/views/LayoutIndex/index.vue b/web/src/views/LayoutIndex/index.vue
index b137c47..2dd17a2 100644
--- a/web/src/views/LayoutIndex/index.vue
+++ b/web/src/views/LayoutIndex/index.vue
@@ -98,6 +98,10 @@
       }
     };
     return {
+      closeNotify:null,
+      timer:null,//定时器
+      alarmList:[
+      ],//报警信息组
       size: changeSize(),
       realName:sessionStorage.getItem('realName'),
       asyncPassword: false, // 修改密码
@@ -129,8 +133,45 @@
         meta: item.meta
       }
     })
+    this.timer = setInterval(()=>{
+      this.getAlarmDatas()
+    },60000)
   },
   methods: {
+    //展示报警信息
+    showAlarmTips(){
+      const h = this.$createElement
+      this.alarmList.forEach((item)=>{
+        this.closeNotify =window.setTimeout(()=>{
+            this.$notify({
+              position: 'bottom-right',
+              showClose:true,
+              duration:5000,
+              dangerouslyUseHTMLString: true,
+              message:h("div",{class:"alarm_tips"},[
+                h("div",{class:"alarm_tip_header"},[
+                  h("div",{class:"alarm_tip_text"},'钢筋预警'),
+                ]),
+                h("div",{class:"alarm_tip_content"},[
+                  h("div",{class:'alarm_tip_content_text'},`${item.steelName}`),
+                  h("div",{class:"alarm_tip_content_datas"},'已低于预警库存')
+                ]),
+              ])
+            });
+        },0)
+      })
+    },
+    //获取报警数据
+      getAlarmDatas(){
+        this.$api.Rebar.alarmTipsBear({}).then(res=>{
+        if(res.statusMsg =='ok'){
+          this.alarmList = res.data
+          this.showAlarmTips()
+        }else{
+          this.$message.warning(res.statusMsg)
+        }
+      })
+    },
     // 退出登录
     quitSystem(val) {
       if(val === 'logout'){
@@ -190,6 +231,58 @@
 
 <style lang="scss" scoped>
 @import '../../style/layout-main.scss';
+.alarm_tips{
+  display: flex;
+  flex-direction: column;
+  position: relative;
+  line-height: 45px;
+
+  .alarm_tip_header{
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    position: absolute;
+    top: -20px;
+    
+    .alarm_tip_text{
+      color:#fff;
+      font-size: 16px;
+      margin-left: 10px;
+      padding-right:35px;
+      position: relative;
+      &::before{
+        content: "";
+        position: absolute;
+        top: 14px;
+        left: -20px;
+        width: 15px;
+        height: 15px;
+        background: url("../../assets/alarm_icons.png") no-repeat;
+        background-size: 100% 100%;
+      }
+    }
+    .alarm_tip_time{
+      color: #999;
+    }
+    .alarm_tip_close{
+      color: #f42829;
+      cursor: pointer;
+    }
+  }
+  .alarm_tip_content{
+    display: flex;
+    padding-top: 5px;
+    .alarm_tip_content_text{
+      padding-top: 15px;
+      color: #f42829;
+    }
+    .alarm_tip_content_datas{
+      padding-left: 15px;
+      padding-top: 15px;
+      color: #fff;
+    }
+  }
+}
 .layout {
   width: 100%;
   height: 100%;

--
Gitblit v1.9.3