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