diff --git a/package.json b/package.json index d26c426..b9020ab 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "vue": "2.6.10", "vue-awesome": "^4.5.0", "vue-count-to": "^1.0.13", + "vue-esign": "^1.1.4", "vue-router": "3.0.6", "vuedraggable": "^2.24.3", "vuex": "3.1.0", diff --git a/src/settings.js b/src/settings.js index cb8b07e..46696f8 100644 --- a/src/settings.js +++ b/src/settings.js @@ -12,5 +12,16 @@ module.exports = { * @type {boolean} true | false * @description Whether show the logo in sidebar */ - sidebarLogo: false + sidebarLogo: false, + + /** + * @type {number} + * @description 通知刷新分钟间隔 + */ + refreshNoticeTime: 2 * 60 * 1000, + /** + * @type {number} + * @description 调令列表刷新分钟间隔 + */ + refreshTransferTime: 2 * 60 * 1000, } diff --git a/src/styles/iconfont.css b/src/styles/iconfont.css index 12ee468..5a7b696 100644 --- a/src/styles/iconfont.css +++ b/src/styles/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4329577 */ - src: url('iconfont.woff2?t=1699943620567') format('woff2'), - url('iconfont.woff?t=1699943620567') format('woff'), - url('iconfont.ttf?t=1699943620567') format('truetype'); + src: url('iconfont.woff2?t=1704262099598') format('woff2'), + url('iconfont.woff?t=1704262099598') format('woff'), + url('iconfont.ttf?t=1704262099598') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-shengchanhejiagongqingkuang:before { + content: "\e9b8"; +} + .icon-shenpi1:before { content: "\e77e"; } diff --git a/src/styles/iconfont.ttf b/src/styles/iconfont.ttf index 7370e85..88aab39 100644 Binary files a/src/styles/iconfont.ttf and b/src/styles/iconfont.ttf differ diff --git a/src/styles/iconfont.woff b/src/styles/iconfont.woff index 11e7305..655ddc8 100644 Binary files a/src/styles/iconfont.woff and b/src/styles/iconfont.woff differ diff --git a/src/styles/iconfont.woff2 b/src/styles/iconfont.woff2 index 86066c1..81b25e5 100644 Binary files a/src/styles/iconfont.woff2 and b/src/styles/iconfont.woff2 differ diff --git a/src/styles/scss/index.scss b/src/styles/scss/index.scss index 6024140..755e0c5 100644 --- a/src/styles/scss/index.scss +++ b/src/styles/scss/index.scss @@ -130,8 +130,8 @@ //下方区域的布局 .content-box { - display: grid; - grid-template-columns: 2fr 5fr; + //display: grid; + //grid-template-columns: 2fr 5fr; } // 底部数据 diff --git a/src/utils/index.js b/src/utils/index.js index cfc63a5..89c2e75 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -179,3 +179,18 @@ export function uuid() { return v.toString(16); }); } + +export function base64toFile (dataurl, filename = 'file') { + let arr = dataurl.split(',') + let mime = arr[0].match(/:(.*?);/)[1] + let suffix = mime.split('/')[1] + let bstr = atob(arr[1]) + let n = bstr.length + let u8arr = new Uint8Array(n) + while (n--) { + u8arr[n] = bstr.charCodeAt(n) + } + return new File([u8arr], `${filename}.${suffix}`, { + type: mime + }) +} diff --git a/src/views/bigScreen/bigScreen.vue b/src/views/bigScreen/bigScreen.vue index 0e258f0..4b1d7b2 100644 --- a/src/views/bigScreen/bigScreen.vue +++ b/src/views/bigScreen/bigScreen.vue @@ -61,11 +61,11 @@
-
- - - -
+ + + + +
@@ -109,7 +109,8 @@ export default { provide() { return { load: this.load, - cancelLoading: this.cancelLoading + cancelLoading: this.cancelLoading, + showModal: this.showModal } }, components: { @@ -141,18 +142,25 @@ export default { this.timeFn(); this.cancelLoading(); - setTimeout(() => { - this.$alert('时间:2023-01-02', '收到一条紧急条令', { - confirmButtonText: '确定', - customClass: "big-screen-modal", - type: "warning" - }); - },3000) }, beforeDestroy () { clearInterval(this.timing) }, methods: { + showModal (isEmergent = false, message) { + let modal = this.$alert('', `收到一条${isEmergent ? '紧急': ''}信息`, { + message, + confirmButtonText: '确定', + customClass: isEmergent ? "big-screen-modal big-screen-modal-warning" : "big-screen-modal", + iconClass: "el-icon-message-solid" + }); + + if (!isEmergent) { + setTimeout(() => { + modal.close() + },10 * 10000) + } + }, fullscreen () { document.fullscreenElement ? document.exitFullscreen() : document.documentElement.requestFullscreen() }, @@ -193,4 +201,32 @@ export default { div:has(.big-screen-modal) { z-index: 9999999 !important; } +.big-screen-modal-warning { + filter: drop-shadow(0 0 1px rgb(200,0,0)) + drop-shadow(0 0 3px rgb(215, 9, 9)) + drop-shadow(0 0 4px rgb(224, 40, 40)) + drop-shadow(0 0 5px rgb(225, 91, 91)); + animation: warning 1.5s ease-in-out infinite alternate; +} +@keyframes warning { + to { + filter: drop-shadow(0 0 3px rgb(200,0,0)) + drop-shadow(0 0 9px rgb(215, 9, 9)) + drop-shadow(0 0 12px rgb(224, 40, 40)) + drop-shadow(0 0 20px rgb(225, 91, 91)); + } +} +.big-screen-modal-warning .el-message-box__status { + color: rgb(200, 0 ,0); + transform-origin: 50% 0; + //animation: wobble 4s infinite; +} +@keyframes wobble { + from { + transform: rotate(-30deg); + } + to { + transform: rotate(30deg); + } +} diff --git a/src/views/bigScreen/component/bottom.vue b/src/views/bigScreen/component/bottom.vue index 6d3fd4a..e3e8cf8 100644 --- a/src/views/bigScreen/component/bottom.vue +++ b/src/views/bigScreen/component/bottom.vue @@ -1,57 +1,98 @@ diff --git a/src/views/bigScreen/component/centerRight1.vue b/src/views/bigScreen/component/centerRight1.vue index fb09445..99723e0 100644 --- a/src/views/bigScreen/component/centerRight1.vue +++ b/src/views/bigScreen/component/centerRight1.vue @@ -10,44 +10,62 @@ 待执行 + :content-l-k="{ + start_time: '开启时间', + end_time: '关闭时间' + }" + @refresh="getTransfer(true)" + @showDetail="d => ($refs['detailTransfer'].setData(d),$refs['detailTransfer'].show())">
执行中 + :content-l-k="{ + start_time: '开启时间', + act_start_time: '开启执行时间', + end_time: '关闭时间', + }" + @refresh="getTransfer(true)" + @showDetail="d => ($refs['detailTransfer'].setData(d),$refs['detailTransfer'].show())">
已完成 + :content-l-k="{ + start_time: '开启时间', + act_start_time: '开启执行时间', + end_time: '关闭时间', + act_end_time: '关闭执行时间', + }" + @refresh="getTransfer(true)" + @showDetail="d => ($refs['detailTransfer'].setData(d),$refs['detailTransfer'].show())">
- + diff --git a/src/views/bigScreen/component/detailTransfer.vue b/src/views/bigScreen/component/detailTransfer.vue index f5d6c42..0d2942e 100644 --- a/src/views/bigScreen/component/detailTransfer.vue +++ b/src/views/bigScreen/component/detailTransfer.vue @@ -1,13 +1,18 @@ diff --git a/src/views/bigScreen/component/transferBoard.vue b/src/views/bigScreen/component/transferBoard.vue index f3ff2af..39adb43 100644 --- a/src/views/bigScreen/component/transferBoard.vue +++ b/src/views/bigScreen/component/transferBoard.vue @@ -9,7 +9,7 @@ line-height: ${heights[index]}px; transition: all .2s; `" - @click="showModal(item)"> + @click="showDetail(item)">
@@ -17,15 +17,15 @@

{{ item.equipment_id_equipments_id_relation ? item.equipment_id_equipments_id_relation.name : '' }}

-
-
- 执行时间:{{ item.start_time }} +
+
+ {{label}}:{{ $moment(item[key]).format('YYYY-MM-DD HH:mm') || '-' }}
-
- 倒计时:{{ $moment(new Date(item.start_time)).diff($moment(),'minutes') > 0 ? $moment(new Date(item.start_time)).diff($moment(),'minutes') : '-' }}分 +
+ 倒计时:{{ $moment(new Date(item.start_time)).diff($moment(time),'minutes') }}分
-
+
{{setStatusText}}
@@ -42,12 +42,15 @@ import { deepCopy } from "@/utils"; import { save } from "@/api/system/baseForm"; export default { + inject: ['showModal'], props: { transfers: Array, - setTransferStatusNumber: Number + setTransferStatusNumber: Number, + contentLK: Object, }, data() { return { + nowRow: {}, dom: '', needCalc: false, rowNum: 4, @@ -67,21 +70,31 @@ export default { [4,'执行中'], [5,'已取消'], [6,'已完成'] - ]) + ]), + time: new Date(), + timer: null } }, methods: { - showModal (item) { - this.$emit('showModal',item) + showDetail (item) { + this.nowRow = deepCopy(item); + console.log(this.nowRow) + this.$emit('showDetail',item) }, - setTransferStatus (status,row) { - if (!this.setTransferStatusNumber) { - console.warn('setTransferStatusNumber is required') - return + setTransferStatus (data) { + const { status, start_sign, end_sign } = data; + + let copyRow = deepCopy(this.nowRow); + if (status === 4) { + copyRow.act_start_time = this.$moment().format('YYYY-MM-DD HH:mm') + copyRow.start_sign = start_sign + } + if (status === 6) { + copyRow.act_end_time = this.$moment().format('YYYY-MM-DD HH:mm') + copyRow.end_sign = end_sign } - let copyRow = deepCopy(row); - copyRow.status = this.setTransferStatusNumber; + copyRow.status = status; for (let key in copyRow) { if (/_relation/g.test(key)) { delete copyRow[key] @@ -189,11 +202,23 @@ export default { computed: { setStatusText () { if (this.setTransferStatusNumber === 4) return '执行'; - if (this.setTransferStatusNumber === 6) return '完成'; - } + if (this.setTransferStatusNumber === 6) return '关闭'; + }, + lastTimeColor () { + return function (min) { + if (min <= 0) { + return "red" + } else if (min > 0 && min <= 5) { + return "orange" + } else { + return "#eee" + } + } + }, }, watch: { async transfers(val) { + const h = this.$createElement; if (val && val.length > 0) { this.rows = val.map((i,index) => ({...i,scroll: index})) this.copyTransfers = deepCopy(val); @@ -201,6 +226,33 @@ export default { await this.initWH(false); this.calcHeights(); await this.animation(true); + + this.timer = setInterval(() => { + this.time = new Date() + + this.rows.forEach(item => { + if (item.status === 2) { + let lastMins = this.$moment(new Date(item.start_time)).diff(this.$moment(),'minutes') + if (lastMins === 3) { + this.showModal(true,h('div',[ + h('p',item.equipment_id_equipments_id_relation?.name), + h('p',item.content), + h('p',`开始时间:${this.$moment(item.start_time).format('YYYY-MM-DD HH:mm')}`) + ])) + } + } + if (item.status === 4) { + let lastMins = this.$moment(new Date(item.end_time)).diff(this.$moment(),'minutes') + if (lastMins === 3) { + this.showModal(true,h('div',[ + h('p',item.equipment_id_equipments_id_relation?.name), + h('p',item.content), + h('p',`结束时间:${this.$moment(item.end_time).format('YYYY-MM-DD HH:mm')}`) + ])) + } + } + }) + },1000 * 60) } else { this.rows = [] this.copyTransfers = [] @@ -214,6 +266,8 @@ export default { async mounted() { }, destroyed () { + clearInterval(this.timer) + this.$bus.$off('transferSave') const { stopAnimation } = this stopAnimation(); @@ -253,6 +307,14 @@ export default { width: 100%; } } + .time-info { + line-height: 1.5; + width: 86%; + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-column-gap: 10px; + grid-row-gap: 5px; + } } ::v-deep .row-item .ceil { width: 100%; diff --git a/src/views/order/component/createDispatch.vue b/src/views/order/component/createDispatch.vue index f87be51..6a38757 100644 --- a/src/views/order/component/createDispatch.vue +++ b/src/views/order/component/createDispatch.vue @@ -43,10 +43,10 @@ {{ abilities.find(i => i.value === ability) ? abilities.find(i => i.value === ability).key : '' }} 调令

- - - - + + + +
@@ -82,7 +83,9 @@ import { mergeTableRow } from "@/utils/mergeTableRow"; import { show } from "@/api/system/customFormField"; export default { inject: ["equipments"], - props: {}, + props: { + + }, data() { return { createType: 1, @@ -168,16 +171,15 @@ export default { { title: '机组运行状态', width: 200, - render: (h) => { - let num = Math.round(Math.random() * 8) + render: (h,{ row }) => { const create = () => { let dom = []; - for (let i = 0;i<=num;i++) { + for (let i = 0;i<=row._random;i++) { dom.push(h('div',{ style: { width: '14px', height: '14px', - background: i === num-1 ? 'red' : 'green', + background: i === row._random-1 ? 'red' : 'green', 'border-radius': '100%', 'margin-left': '6px' } @@ -211,6 +213,7 @@ export default { type: "time", size: "small", transfer: true, + format: "HH:mm" }, on: { ["on-change"]: (e) => (this.data[index].start_time = e), @@ -230,6 +233,7 @@ export default { type: "time", size: "small", transfer: true, + format: "HH:mm" }, on: { ["on-change"]: (e) => (this.data[index].end_time = e), @@ -263,7 +267,7 @@ export default { width: 140, key: "level", align: "center", - render: (h, { row }) => { + render: (h, { row, index }) => { return h( "Select", { @@ -276,6 +280,7 @@ export default { on: { ["on-select"]: (e) => { row.level = e.value; + this.data[index].level = e.value; }, }, }, @@ -473,6 +478,10 @@ export default { } } this.$bus.$emit('yinpaishui',this.abilities) + }, + + pickDate () { + this.$bus.$emit('pickDate',this.date) } }, computed: { @@ -501,7 +510,8 @@ export default { end_time: "", content: "", level: 1, - leibie: this.ability + leibie: this.ability, + _random: Math.round(Math.random() * 8) })) || []; }, select: { diff --git a/src/views/order/component/dispatchList.vue b/src/views/order/component/dispatchList.vue index 70f0327..3c0b811 100644 --- a/src/views/order/component/dispatchList.vue +++ b/src/views/order/component/dispatchList.vue @@ -1,7 +1,16 @@ @@ -53,10 +62,11 @@ export default { loading: false, areas: [], abilities: [], + date: this.$moment().format("YYYY-MM-DD"), select: { table_name: 'transfers', page: 1, - page_size: 10, + page_size: 999, sort_name: 'equipment_id', filter: [ { @@ -79,16 +89,6 @@ export default { total: 0, data: [], columns: [ - { - title: "点位", - width: 240, - key: "equipment_id", - align: "center", - render: (h, { row, index }) => { - let text = row.equipment_id_equipments_id_relation ? row.equipment_id_equipments_id_relation.name : ""; - return h('span',text); - }, - }, { title: "范围", width: 140, @@ -100,6 +100,16 @@ export default { return h('span',text) } }, + { + title: "点位", + width: 240, + key: "equipment_id", + align: "center", + render: (h, { row, index }) => { + let text = row.equipment_id_equipments_id_relation ? row.equipment_id_equipments_id_relation.name : ""; + return h('span',text); + }, + }, { title: '类别', width: 100, @@ -195,6 +205,11 @@ export default { async getDispatches () { try { this.loading = true; + this.select.filter.push({ + key: "start_time", + op: "like", + value: this.date + }) const res = await index(this.select); this.data = res.data; this.total = res.total; @@ -225,11 +240,13 @@ export default { }, created() { this.getDispatches() + this.$bus.$on('pickDate',e => (this.date = e)) this.$bus.$on('yinpaishui',e => (this.abilities = e)) this.$bus.$on('areas',e => (this.areas = e)) this.$bus.$on('createdTransfer',_ => (this.getDispatches())) }, destroyed() { + this.$bus.$off('pickDate') this.$bus.$off('areas') this.$bus.$off('yinpaishui') this.$bus.$off('createdTransfer') @@ -240,6 +257,8 @@ export default {