xy 2 years ago
parent 72fc773458
commit 92ba08a9f1

@ -216,7 +216,7 @@ export default {
let paginationHeight = 37; // let paginationHeight = 37; //
let topHeight = 50; // let topHeight = 50; //
this.tableHeight = this.tableHeight =
clientHeight - lxHeader_height - topHeight - paginationHeight - 20 - 25; clientHeight - lxHeader_height - topHeight - paginationHeight - 20 - 25 + (this.isPage ? 0 : 36);
//console.log(this.tableHeight) //console.log(this.tableHeight)
}, },
async getTableData(isRefresh = false) { async getTableData(isRefresh = false) {

@ -115,7 +115,7 @@ export default {
if (i.status === 2 || i.status === 3) { if (i.status === 2 || i.status === 3) {
this.transfers1.push(i) this.transfers1.push(i)
} }
if (i.status === 4) { if (i.status === 4 || i.status === 5) {
this.transfers2.push(i) this.transfers2.push(i)
} }
if (i.status === 6) { if (i.status === 6) {

@ -44,43 +44,75 @@
<td>执行状态</td> <td>执行状态</td>
<td> <td>
<template v-if="data.status === 2"> <template v-if="data.status === 2">
<div class="d-flex ai-center pl-4 pb-4" style="width: 46%;">
<span style="word-break: keep-all;">接收人</span>
<el-input size="small" v-model="jieshouren"></el-input>
</div>
<div class="btns">
<Button type="primary" @click="esignConfirm"></Button>
</div>
</template>
<template v-else-if="data.status !== 6">
<div class="sign-container"> <div class="sign-container">
<div v-if="data.act_start_time">
<div>
<p style="text-align: left;">开启时间{{ $moment(data.act_start_time).format("YYYY-MM-DD HH:mm") }}</p>
<img style="height: 50px;" class="d-flex" :src="data.start_sign_uploads_id_relation ? data.start_sign_uploads_id_relation.url : ''" alt="">
</div>
</div>
<vEsign style="flex: 1;" ref="esign" line-color="#eee" bg-color="" :line-width="5"></vEsign> <vEsign style="flex: 1;" ref="esign" line-color="#eee" bg-color="" :line-width="5"></vEsign>
<div class="btns"> <div class="btns">
<Button type="primary" ghost @click="$refs['esign'].reset()"></Button> <Button type="primary" ghost @click="$refs['esign'].reset()"></Button>
<Button type="primary" @click="esignConfirm"></Button> <Button type="primary" @click="esignConfirm(false)"></Button>
<Button type="primary" @click="esignConfirm(true)"></Button>
</div> </div>
</div> </div>
</template> </template>
<template v-else> <template v-else-if="data.status === 3">
<div style="padding: 20px;height: 100%;" class="d-flex flex-column"> <div class="sign-container">
<div class="flex-1"> <vEsign style="flex: 1;" ref="esign" line-color="#eee" bg-color="" :line-width="5"></vEsign>
<div class="btns">
<Button type="primary" ghost @click="$refs['esign'].reset()"></Button>
<Button type="primary" @click="esignConfirm(true)"></Button>
</div>
</div>
</template>
<template v-else-if="data.status === 4">
<div class="sign-container">
<div v-if="data.act_start_time">
<div>
<p style="text-align: left;">开启时间{{ $moment(data.act_start_time).format("YYYY-MM-DD HH:mm") }}</p> <p style="text-align: left;">开启时间{{ $moment(data.act_start_time).format("YYYY-MM-DD HH:mm") }}</p>
<img style="height: 50px;" class="d-flex" :src="data.start_sign_uploads_id_relation ? data.start_sign_uploads_id_relation.url : ''" alt=""> <img style="height: 50px;" class="d-flex" :src="data.start_sign_uploads_id_relation ? data.start_sign_uploads_id_relation.url : ''" alt="">
</div> </div>
<div style="margin-top: 20px;" class="flex-1"> </div>
<p style="text-align: left;">关闭时间{{ $moment(data.act_end_time).format("YYYY-MM-DD HH:mm") }}</p>
<img style="height: 50px;" class="d-flex" :src="data.end_sign_uploads_id_relation ? data.end_sign_uploads_id_relation.url : ''" alt=""> <vEsign style="flex: 1;" ref="esign" line-color="#eee" bg-color="" :line-width="5"></vEsign>
<div class="btns">
<Button type="primary" ghost @click="$refs['esign'].reset()"></Button>
<Button type="primary" @click="esignConfirm(false)"></Button>
<Button type="primary" @click="esignConfirm(true)"></Button>
</div>
</div>
</template>
<template v-else-if="data.status === 5">
<div class="sign-container">
<div v-if="data.act_start_time">
<div>
<p style="text-align: left;">开启时间{{ $moment(data.act_start_time).format("YYYY-MM-DD HH:mm") }}</p>
<img style="height: 50px;" class="d-flex" :src="data.start_sign_uploads_id_relation ? data.start_sign_uploads_id_relation.url : ''" alt="">
</div> </div>
</div> </div>
</template>
<vEsign style="flex: 1;" ref="esign" line-color="#eee" bg-color="" :line-width="5"></vEsign>
<div class="btns">
<Button type="primary" ghost @click="$refs['esign'].reset()"></Button>
<Button type="primary" @click="esignConfirm(true)"></Button>
</div>
</div>
</template>
<template v-else>
<div style="padding: 20px;height: 100%;" class="d-flex flex-column">
<div class="flex-1">
<p style="text-align: left;">开启时间{{ $moment(data.act_start_time).format("YYYY-MM-DD HH:mm") }}</p>
<img style="height: 50px;" class="d-flex" :src="data.start_sign_uploads_id_relation ? data.start_sign_uploads_id_relation.url : ''" alt="">
</div>
<div style="margin-top: 20px;" class="flex-1">
<p style="text-align: left;">关闭时间{{ $moment(data.act_end_time).format("YYYY-MM-DD HH:mm") }}</p>
<img style="height: 50px;" class="d-flex" :src="data.end_sign_uploads_id_relation ? data.end_sign_uploads_id_relation.url : ''" alt="">
</div>
</div>
</template>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -104,15 +136,14 @@ export default {
}, },
data() { data() {
return { return {
jieshouren: "",
isShow: false, isShow: false,
data: {}, data: {},
typeMap: new Map([ typeMap: new Map([
[1,'待下发'], [1,'待下发'],
[2,'已下发'], [2,'已下发'],
[3,'待执行'], [3,'通知现场中'],
[4,'执行中'], [4,'执行中'],
[5,'已取消'], [5,'通知现场中'],
[6,'已完成'] [6,'已完成']
]) ])
} }
@ -127,9 +158,9 @@ export default {
setData (data) { setData (data) {
this.data = data this.data = data
}, },
async esignConfirm () { async esignConfirm (isSign) {
let fileInfo; let fileInfo;
if (this.data.status !== 2) { if (this.$refs['esign'] && isSign) {
const base64 = await this.$refs['esign'].generate({ format:'image/png', quality: 0.7 }); const base64 = await this.$refs['esign'].generate({ format:'image/png', quality: 0.7 });
const file = base64toFile(base64,`${new Date().getTime()}.png`) const file = base64toFile(base64,`${new Date().getTime()}.png`)
const form = new FormData(); const form = new FormData();
@ -143,8 +174,11 @@ export default {
let copyData = deepCopy(this.data) let copyData = deepCopy(this.data)
if (this.data.status === 2) { if (this.data.status === 2) {
copyData.status = 3; copyData.status = isSign ? 4 : 3;
copyData.jieshouren = this.jieshouren; if (isSign) {
copyData.start_sign = fileInfo.data?.id;
copyData.act_start_time = this.$moment().format('YYYY-MM-DD HH:mm');
}
for (let key in copyData) { for (let key in copyData) {
if (/_relation/g.test(key)) { if (/_relation/g.test(key)) {
delete copyData[key] delete copyData[key]
@ -174,6 +208,24 @@ export default {
}) })
} }
if (this.data.status === 4) { if (this.data.status === 4) {
copyData.status = isSign ? 6 : 5;
if (isSign) {
copyData.end_sign = fileInfo.data?.id;
copyData.act_end_time = this.$moment().format('YYYY-MM-DD HH:mm');
}
for (let key in copyData) {
if (/_relation/g.test(key)) {
delete copyData[key]
}
}
save({
table_name: 'transfers',
...copyData
}).then(_ => {
this.$emit('refresh')
})
}
if (this.data.status === 5) {
copyData.status = 6; copyData.status = 6;
copyData.end_sign = fileInfo.data?.id; copyData.end_sign = fileInfo.data?.id;
copyData.act_end_time = this.$moment().format('YYYY-MM-DD HH:mm'); copyData.act_end_time = this.$moment().format('YYYY-MM-DD HH:mm');

@ -14,18 +14,26 @@
<div style="width: 100%;height: 100%;padding: 30px 20px;line-height: 1;" class="d-flex flex-column jc-between flex-1"> <div style="width: 100%;height: 100%;padding: 30px 20px;line-height: 1;" class="d-flex flex-column jc-between flex-1">
<div class="board-item__top d-flex jc-between ai-center"> <div class="board-item__top d-flex jc-between ai-center">
<dv-decoration-11 style="width: 160px;height: 48px;">{{ item.equipment_id_equipments_id_relation ? item.equipment_id_equipments_id_relation.name : '' }}</dv-decoration-11> <dv-decoration-11 style="width: 160px;height: 48px;">{{ item.equipment_id_equipments_id_relation ? item.equipment_id_equipments_id_relation.name : '' }}</dv-decoration-11>
<template v-if="item.status === 3 || item.status === 2">
<dv-percent-pond :config="{
value: item.status === 2 ? 0 : 50,
colors: ['#01c4f9', '#c135ff'],
lineDash: [6,3]
}"
style="width:140px;height:36px;zoom: 0.9;" />
</template>
</div> </div>
<div class="board-item__bottom d-flex jc-between ai-start"> <div class="board-item__bottom d-flex jc-between ai-start">
<div class="time-info"> <div class="time-info">
<div v-for="(label,key) in contentLK" style="display: inline-block;"> <div v-for="(label,key) in contentLK" style="display: inline-block;">
{{label}}{{ $moment(item[key]).format('YYYY-MM-DD HH:mm') || '-' }} {{label}}{{ $moment(item[key]).format('YYYY-MM-DD HH:mm') || '-' }}
</div> </div>
<div v-if="setTransferStatusNumber === 4" :style="{ 'color': lastTimeColor($moment(new Date(item.start_time)).diff($moment(time),'minutes')) }"> <div v-if="item.status === 3 || item.status === 2" :style="{ 'color': lastTimeColor($moment(new Date(item.start_time)).diff($moment(time),'minutes')) }">
倒计时{{ $moment(new Date(item.start_time)).diff($moment(time),'minutes') }} 倒计时{{ $moment(new Date(item.start_time)).diff($moment(time),'minutes') }}
</div> </div>
</div> </div>
<div v-if="setTransferStatusNumber !== -1" @click.stop="showDetail(item)"> <div v-if="item.status && item.status !== 6 && item.status !== 7" @click.stop="showDetail(item)">
<dv-border-box-8 reverse class="fw-b text-center" style="width: 64px;height: 38px;line-height: 38px;cursor: pointer;" <dv-border-box-8 reverse class="fw-b text-center" style="width: 72px;height: 40px;line-height: 40px;cursor: pointer;"
>{{setStatusText(item.status)}}</dv-border-box-8> >{{setStatusText(item.status)}}</dv-border-box-8>
</div> </div>
</div> </div>
@ -202,9 +210,10 @@ export default {
setStatusText () { setStatusText () {
return function (status) { return function (status) {
const textMap = new Map([ const textMap = new Map([
[2,'接收'], [2,'确认开启'],
[3,'确认'], [3,'确认开启'],
[4,'关闭'] [4,'确认关闭'],
[5,'确认关闭']
]) ])
return textMap.get(status) return textMap.get(status)
} }

@ -236,7 +236,12 @@ export default {
key: "equipment_id", key: "equipment_id",
align: "center", align: "center",
render: (h, { row, index }) => { render: (h, { row, index }) => {
let text = row.equipment ? row.equipment.name : ""; const text = row.equipment ? row.equipment.name : "";
const num = this.dispatches.reduce((pre, cur) => {
return cur.equipment_id === row.equipment_id
? ++pre
: pre;
}, 0)
return h("div", [ return h("div", [
h( h(
"el-popover", "el-popover",
@ -268,20 +273,16 @@ export default {
cursor: "pointer", cursor: "pointer",
width: "20px", width: "20px",
height: "20px", height: "20px",
display: "inline-block", display: (num && num !== 0) ? "inline-block" : "none",
background: "#367bc7", background: "#367bc7",
color: "#fff", color: "#fff",
}, },
}, },
this.dispatches.reduce((pre, cur) => { num
return cur.equipment_id === row.equipment_id
? ++pre
: pre;
}, 0)
), ),
h("Table", { h("Table", {
style: { style: {
width: "480px", width: "540px",
}, },
props: { props: {
size: "small", size: "small",
@ -296,6 +297,7 @@ export default {
title: "开始时间", title: "开始时间",
key: "start_time", key: "start_time",
align: "center", align: "center",
width: 170,
render: (h, { row }) => render: (h, { row }) =>
h( h(
"span", "span",
@ -307,6 +309,7 @@ export default {
{ {
title: "结束时间", title: "结束时间",
key: "end_time", key: "end_time",
width: 170,
align: "center", align: "center",
render: (h, { row }) => render: (h, { row }) =>
h( h(
@ -316,8 +319,29 @@ export default {
) )
), ),
}, },
{
title: "调令等级",
width: 90,
key: "level",
align: "center",
render: (h, { row }) => {
let type = new Map([
[1,'一般'],
[2,'紧急']
])
return h('span',type.get(row.level));
},
},
{
title: '类别',
width: 80,
key: 'leibie',
align: 'center',
render: (h,{ row }) => h('span', (this.abilities.find(i => i.value === row.leibie))?.key)
},
{ {
title: "内容", title: "内容",
minWidth: 120,
key: "content", key: "content",
}, },
], ],

@ -205,6 +205,9 @@ export default {
async getDispatches () { async getDispatches () {
try { try {
this.loading = true; this.loading = true;
if (this.select.filter.find(i => i.key === 'start_time')) {
this.select.filter.pop();
}
this.select.filter.push({ this.select.filter.push({
key: "start_time", key: "start_time",
op: "like", op: "like",
@ -242,7 +245,7 @@ export default {
}, },
created() { created() {
this.getDispatches() this.getDispatches()
this.$bus.$on('pickDate',e => (this.date = e)) this.$bus.$on('pickDate',e => (this.date = e,this.getDispatches()))
this.$bus.$on('yinpaishui',e => (this.abilities = e)) this.$bus.$on('yinpaishui',e => (this.abilities = e))
this.$bus.$on('areas',e => (this.areas = e)) this.$bus.$on('areas',e => (this.areas = e))
this.$bus.$on('createdTransfer',_ => (this.getDispatches())) this.$bus.$on('createdTransfer',_ => (this.getDispatches()))

@ -12,98 +12,114 @@
<slot> <slot>
<header-content :auths="auths_auth_mixin"> <header-content :auths="auths_auth_mixin">
<template #search> <template #search>
<div style="display: flex"> <div style="display: flex;">
<Select <!-- <el-date-picker-->
v-model="select.filter[0].key" <!-- size="small"-->
style="width: 100px" <!-- :clearable="false"-->
placeholder="搜索条目" <!-- v-model="select.filter[3].value"-->
> <!-- value-format="yyyy-MM-dd"-->
<Option <!-- placeholder="日期选择"-->
v-for="item in form" <!-- format="yyyy-MM-dd"-->
:key="item.id" <!-- style="width: 130px;"-->
:value="item.field" <!-- ></el-date-picker>-->
>{{ item.name }}</Option <Select clearable v-model="select.filter[2].value" placeholder="请选择类别" style="width: 140px;margin-left: 6px;">
> <Option v-for="item in abilities" :value="item.value">{{ item.key }}</Option>
</Select> </Select>
<Select <Select clearable v-model="select.filter[1].value" placeholder="请选择范围" style="width: 140px;margin-left: 6px;">
v-model="select.filter[0].op" <Option v-for="item in areas" :value="item.value">{{ item.key }}</Option>
style="width: 100px; margin-left: 10px"
placeholder="搜索条件"
>
<Option
v-for="item in op"
:key="item.value"
:value="item.value"
>{{ item.label }}</Option
>
</Select> </Select>
<template <Input style="width: 140px;margin-left: 6px;" clearable v-model="select.filter[0].value" placeholder="搜索内容"/>
v-if=" <!-- <Select-->
select.filter[0].op !== 'range' && <!-- v-model="select.filter[0].key"-->
!columnArrTest(select.filter[0].key) <!-- style="width: 100px"-->
" <!-- placeholder="搜索条目"-->
> <!-- >-->
<Input <!-- <Option-->
v-model="select.filter[0].value" <!-- v-for="item in form"-->
style="width: 150px; margin-left: 10px" <!-- :key="item.id"-->
placeholder="请填写关键词" <!-- :value="item.field"-->
/> <!-- >{{ item.name }}</Option-->
</template> <!-- >-->
<template <!-- </Select>-->
v-else-if=" <!-- <Select-->
select.filter[0].op !== 'range' && <!-- v-model="select.filter[0].op"-->
columnArrTest(select.filter[0].key) <!-- style="width: 100px; margin-left: 10px"-->
" <!-- placeholder="搜索条件"-->
> <!-- >-->
<Select <!-- <Option-->
v-model="select.filter[0].value" <!-- v-for="item in op"-->
style="width: 150px; margin-left: 10px" <!-- :key="item.value"-->
placeholder="请选择关键词" <!-- :value="item.value"-->
> <!-- >{{ item.label }}</Option-->
<Option <!-- >-->
v-for="item in getColumnParams(select.filter[0].key)" <!-- </Select>-->
:key="item.id" <!-- <template-->
:value=" <!-- v-if="-->
getColumnField(select.filter[0].key)._relations <!-- select.filter[0].op !== 'range' &&-->
? item[ <!-- !columnArrTest(select.filter[0].key)-->
getColumnField(select.filter[0].key)._relations <!-- "-->
.foreign_key <!-- >-->
] <!-- <Input-->
: item.value <!-- v-model="select.filter[0].value"-->
" <!-- style="width: 150px; margin-left: 10px"-->
>{{ <!-- placeholder="请填写关键词"-->
item.key || <!-- />-->
item.value || <!-- </template>-->
item.name || <!-- <template-->
item.no || <!-- v-else-if="-->
item.mingcheng || <!-- select.filter[0].op !== 'range' &&-->
item.id <!-- columnArrTest(select.filter[0].key)-->
}}</Option <!-- "-->
> <!-- >-->
</Select> <!-- <Select-->
</template> <!-- v-model="select.filter[0].value"-->
<template v-else> <!-- style="width: 150px; margin-left: 10px"-->
<Input <!-- placeholder="请选择关键词"-->
:value="select.filter[0].value.split(',')[0]" <!-- >-->
style="width: 150px; margin-left: 10px" <!-- <Option-->
placeholder="范围开始关键词" <!-- v-for="item in getColumnParams(select.filter[0].key)"-->
@input="(e) => inputStartHandler(e, select.filter[0])" <!-- :key="item.id"-->
/> <!-- :value="-->
<span <!-- getColumnField(select.filter[0].key)._relations-->
style=" <!-- ? item[-->
margin-left: 10px; <!-- getColumnField(select.filter[0].key)._relations-->
display: flex; <!-- .foreign_key-->
align-items: center; <!-- ]-->
" <!-- : item.value-->
></span <!-- "-->
> <!-- >{{-->
<Input <!-- item.key ||-->
:value="select.filter[0].value.split(',')[1]" <!-- item.value ||-->
style="width: 150px; margin-left: 10px" <!-- item.name ||-->
placeholder="范围结束关键词" <!-- item.no ||-->
@input="(e) => inputEndHandler(e, select.filter[0])" <!-- item.mingcheng ||-->
/> <!-- item.id-->
</template> <!-- }}</Option-->
<!-- >-->
<!-- </Select>-->
<!-- </template>-->
<!-- <template v-else>-->
<!-- <Input-->
<!-- :value="select.filter[0].value.split(',')[0]"-->
<!-- style="width: 150px; margin-left: 10px"-->
<!-- placeholder="范围开始关键词"-->
<!-- @input="(e) => inputStartHandler(e, select.filter[0])"-->
<!-- />-->
<!-- <span-->
<!-- style="-->
<!-- margin-left: 10px;-->
<!-- display: flex;-->
<!-- align-items: center;-->
<!-- "-->
<!-- ></span-->
<!-- >-->
<!-- <Input-->
<!-- :value="select.filter[0].value.split(',')[1]"-->
<!-- style="width: 150px; margin-left: 10px"-->
<!-- placeholder="范围结束关键词"-->
<!-- @input="(e) => inputEndHandler(e, select.filter[0])"-->
<!-- />-->
<!-- </template>-->
<Button <Button
style="margin-left: 10px" style="margin-left: 10px"
type="primary" type="primary"
@ -111,126 +127,126 @@
>查询</Button >查询</Button
> >
<xy-selectors <!-- <xy-selectors-->
style="margin-left: 10px" <!-- style="margin-left: 10px"-->
@reset="reset" <!-- @reset="reset"-->
@search="$refs['xyTable'].getTableData(true)" <!-- @search="$refs['xyTable'].getTableData(true)"-->
> <!-- >-->
<template> <!-- <template>-->
<div class="select"> <!-- <div class="select">-->
<div <!-- <div-->
class="select__item" <!-- class="select__item"-->
v-for="(item, index) in select.filter" <!-- v-for="(item, index) in select.filter"-->
:key="`${item.value}-${index}`" <!-- :key="`${item.value}-${index}`"-->
> <!-- >-->
<p>条件{{ index + 1 }}</p> <!-- <p>条件{{ index + 1 }}</p>-->
<Select <!-- <Select-->
v-model="item.key" <!-- v-model="item.key"-->
style="width: 100px" <!-- style="width: 100px"-->
placeholder="搜索条目" <!-- placeholder="搜索条目"-->
> <!-- >-->
<Option <!-- <Option-->
v-for="item in form" <!-- v-for="item in form"-->
:key="item.id" <!-- :key="item.id"-->
:value="item.field" <!-- :value="item.field"-->
>{{ item.name }}</Option <!-- >{{ item.name }}</Option-->
> <!-- >-->
</Select> <!-- </Select>-->
<Select <!-- <Select-->
v-model="item.op" <!-- v-model="item.op"-->
style="width: 100px; margin-left: 10px" <!-- style="width: 100px; margin-left: 10px"-->
placeholder="搜索条件" <!-- placeholder="搜索条件"-->
> <!-- >-->
<Option <!-- <Option-->
v-for="item in op" <!-- v-for="item in op"-->
:key="item.value" <!-- :key="item.value"-->
:value="item.value" <!-- :value="item.value"-->
>{{ item.label }}</Option <!-- >{{ item.label }}</Option-->
> <!-- >-->
</Select> <!-- </Select>-->
<template <!-- <template-->
v-if=" <!-- v-if="-->
item.op !== 'range' && !columnArrTest(item.key) <!-- item.op !== 'range' && !columnArrTest(item.key)-->
" <!-- "-->
> <!-- >-->
<Input <!-- <Input-->
v-model="item.value" <!-- v-model="item.value"-->
style="width: 150px; margin-left: 10px" <!-- style="width: 150px; margin-left: 10px"-->
placeholder="请填写关键词" <!-- placeholder="请填写关键词"-->
/> <!-- />-->
</template> <!-- </template>-->
<template <!-- <template-->
v-else-if=" <!-- v-else-if="-->
item.op !== 'range' && columnArrTest(item.key) <!-- item.op !== 'range' && columnArrTest(item.key)-->
" <!-- "-->
> <!-- >-->
<Select <!-- <Select-->
v-model="item.value" <!-- v-model="item.value"-->
style="width: 150px; margin-left: 10px" <!-- style="width: 150px; margin-left: 10px"-->
placeholder="请选择关键词" <!-- placeholder="请选择关键词"-->
> <!-- >-->
<Option <!-- <Option-->
v-for="item in getColumnParams(item.key)" <!-- v-for="item in getColumnParams(item.key)"-->
:key="item.id" <!-- :key="item.id"-->
:value=" <!-- :value="-->
getColumnField(item.key)._relations <!-- getColumnField(item.key)._relations-->
? item[ <!-- ? item[-->
getColumnField(item.key)._relations <!-- getColumnField(item.key)._relations-->
.foreign_key <!-- .foreign_key-->
] <!-- ]-->
: item.value <!-- : item.value-->
" <!-- "-->
>{{ <!-- >{{-->
item.key || <!-- item.key ||-->
item.value || <!-- item.value ||-->
item.name || <!-- item.name ||-->
item.no || <!-- item.no ||-->
item.mingcheng || <!-- item.mingcheng ||-->
item.id <!-- item.id-->
}}</Option <!-- }}</Option-->
> <!-- >-->
</Select> <!-- </Select>-->
</template> <!-- </template>-->
<template v-else> <!-- <template v-else>-->
<Input <!-- <Input-->
:value="item.value.split(',')[0]" <!-- :value="item.value.split(',')[0]"-->
style="width: 150px; margin-left: 10px" <!-- style="width: 150px; margin-left: 10px"-->
placeholder="范围开始关键词" <!-- placeholder="范围开始关键词"-->
@input="(e) => inputStartHandler(e, item)" <!-- @input="(e) => inputStartHandler(e, item)"-->
/> <!-- />-->
<span style="margin-left: 10px"></span> <!-- <span style="margin-left: 10px"></span>-->
<Input <!-- <Input-->
:value="item.value.split(',')[1]" <!-- :value="item.value.split(',')[1]"-->
style="width: 150px; margin-left: 10px" <!-- style="width: 150px; margin-left: 10px"-->
placeholder="范围结束关键词" <!-- placeholder="范围结束关键词"-->
@input="(e) => inputEndHandler(e, item)" <!-- @input="(e) => inputEndHandler(e, item)"-->
/> <!-- />-->
</template> <!-- </template>-->
<el-button <!-- <el-button-->
v-if="index !== 0" <!-- v-if="index !== 0"-->
size="small" <!-- size="small"-->
type="danger" <!-- type="danger"-->
icon="el-icon-delete" <!-- icon="el-icon-delete"-->
circle <!-- circle-->
style="margin-left: 10px" <!-- style="margin-left: 10px"-->
@click="select.filter.splice(index, 1)" <!-- @click="select.filter.splice(index, 1)"-->
></el-button> <!-- ></el-button>-->
</div> <!-- </div>-->
</div> <!-- </div>-->
<div class="add-btn"> <!-- <div class="add-btn">-->
<el-button <!-- <el-button-->
size="small" <!-- size="small"-->
type="primary" <!-- type="primary"-->
icon="el-icon-plus" <!-- icon="el-icon-plus"-->
circle <!-- circle-->
@click=" <!-- @click="-->
select.filter.push({ key: '', op: '', value: '' }) <!-- select.filter.push({ key: '', op: '', value: '' })-->
" <!-- "-->
></el-button> <!-- ></el-button>-->
<span>新增一条</span> <!-- <span>新增一条</span>-->
</div> <!-- </div>-->
</template> <!-- </template>-->
</xy-selectors> <!-- </xy-selectors>-->
</div> </div>
</template> </template>
<template #create> <template #create>
@ -256,6 +272,7 @@
</template> </template>
<Button type="primary" @click="cloneTransfer"></Button> <Button type="primary" @click="cloneTransfer"></Button>
<template #distribute> <template #distribute>
<Button type="primary" @click="pickNoDistribute"></Button>
<Button type="primary" @click="distributeTransfers"></Button> <Button type="primary" @click="distributeTransfers"></Button>
</template> </template>
</header-content> </header-content>
@ -266,6 +283,7 @@
<!--$refs['drawer'].setId(row.id); <!--$refs['drawer'].setId(row.id);
$refs['drawer'].show();--> $refs['drawer'].show();-->
<xy-table <xy-table
:is-page="false"
:btn-width="300" :btn-width="300"
:auths="auths_auth_mixin" :auths="auths_auth_mixin"
:delay-req="true" :delay-req="true"
@ -305,7 +323,7 @@
</template> </template>
<template #oa="{ row }"> <template #oa="{ row }">
<Button <Button
v-if="row.shifouzouliucheng" v-if="row.shifouzouliucheng && (row.liuchengzhuangtai == 1 || !row.liuchengzhuangtai)"
size="small" size="small"
type="primary" type="primary"
@click="toOa(row)" @click="toOa(row)"
@ -363,6 +381,7 @@ import { op } from "@/const/op";
import { download } from "@/utils/downloadRequest"; import { download } from "@/utils/downloadRequest";
import { getparameter } from "@/api/system/dictionary"; import { getparameter } from "@/api/system/dictionary";
import { show } from "@/api/system/customForm"; import { show } from "@/api/system/customForm";
import { show as formFieldShow } from "@/api/system/customFormField"
import * as XLSX from "xlsx"; import * as XLSX from "xlsx";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import { listdept } from "@/api/system/department"; import { listdept } from "@/api/system/department";
@ -389,6 +408,8 @@ export default {
}, },
data() { data() {
return { return {
areas: [],
abilities: [],
window: { window: {
width: 0, width: 0,
height: 0, height: 0,
@ -401,12 +422,28 @@ export default {
table_name: "", table_name: "",
filter: [ filter: [
{ {
key: "", key: "content",
op: "", op: "like",
value: "", value: ""
},
{
key: "area",
op: "eq",
value: ""
}, },
{
key: "leibie",
op: "eq",
value: ""
},
{
key: "start_time",
op: "like",
value: this.$moment().format('YYYY-MM-DD')
}
], ],
sort_name: 'start_time' sort_name: 'start_time',
page_size: 9999,
}, },
selectQuery: [], selectQuery: [],
form: [], form: [],
@ -418,6 +455,46 @@ export default {
}; };
}, },
methods: { methods: {
pickNoDistribute () {
this.$refs['xyTable'].getListData()?.forEach(item => {
console.log(item)
if (item.status === 1) {
this.$refs['xyTable'].toggleRowSelection(item)
}
})
},
async getArea() {
const obj = (await formFieldShow({ id: 4 }, false))?.select_item;
if (obj && typeof obj === "object") {
let keys = Object.keys(obj);
if (keys.length > 0) {
this.areas = keys.map((key) => {
return {
key,
value: /^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],
};
});
}
}
this.$bus.$emit("areas", this.areas);
},
async getAbility() {
const obj = (await formFieldShow({ id: 31 }, false))?.select_item;
if (obj && typeof obj === "object") {
let keys = Object.keys(obj);
if (keys.length > 0) {
this.abilities = keys.map((key) => {
return {
key,
value: /^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],
};
});
}
}
this.$bus.$emit("yinpaishui", this.abilities);
},
async toOa (row) { async toOa (row) {
if (!this.oaToken) { if (!this.oaToken) {
this.oaToken = (await getOaToken()).oatoken this.oaToken = (await getOaToken()).oatoken
@ -780,6 +857,8 @@ export default {
this.window.left = (window.screen.width - 10 - this.window.width) / 2 this.window.left = (window.screen.width - 10 - this.window.width) / 2
this.getFormDetail(); this.getFormDetail();
this.getArea();
this.getAbility();
}, },
}; };
</script> </script>

@ -1,305 +1,295 @@
<template> <template>
<div style="padding: 20px 0;"> <div>
<el-table :data="tableData" :span-method="objectSpanMethod" style="width: 100%" stripe height="800px"> <div ref="lxHeader">
<el-table-column type="index" label="序号" width="50" header-align="center" align="center" fixed="left"> <LxHeader
</el-table-column> icon="md-apps"
:text="$route.meta.title"
<el-table-column prop="area" label="所属区域" header-align="center" width="100" fixed="left" align="center"> style="margin-bottom: 10px; border: 0px; margin-top: 15px"
</el-table-column> >
<el-table-column prop="target" label="控制工程名称" header-align="center" width="150" fixed="left"> <div slot="content"></div>
</el-table-column> <slot>
<el-table-column prop="unit" label="管理单位" header-align="center" width="150" fixed="left"> <header-content :auths="auths_auth_mixin">
</el-table-column> <template #search>
<el-table-column prop="gate" label="闸门(孔×米)" header-align="center" width="150" fixed="left"> <div style="display: flex">
</el-table-column> <el-date-picker v-model="weekSelect" format="yyyy 第 WW 周" type="week" size="small" style="width: 150px;"></el-date-picker>
<el-table-column prop="gm" label="泵站规模×m3/s" header-align="center" width="150" fixed="left"> <Button
</el-table-column> style="margin-left: 10px"
<el-table-column label="11月18日" header-align="center"> type="primary"
<el-table-column prop="x1" label="星期六" min-width="220" header-align="center"> @click="getData"
</el-table-column> >查询</Button
</el-table-column> >
<el-table-column label="11月19日" header-align="center"> </div>
<el-table-column prop="x2" label="星期日" min-width="220" header-align="center"> </template>
</el-table-column> </header-content>
</el-table-column> </slot>
<el-table-column label="11月20日" header-align="center"> </LxHeader>
<el-table-column prop="x3" label="星期一" min-width="220" header-align="center"> </div>
</el-table-column>
</el-table-column> <el-table :data="tableData" :span-method="objectSpanMethod" style="width: 100%" stripe :height="tableHeight">
<el-table-column label="11月21日" header-align="center"> <el-table-column type="index" label="序号" width="50" header-align="center" align="center" fixed="left">
<el-table-column prop="x4" label="星期二" min-width="220" header-align="center"> </el-table-column>
</el-table-column>
</el-table-column> <el-table-column prop="equipment.area"
<el-table-column label="11月22日" header-align="center"> label="所属区域"
<el-table-column prop="x5" label="星期三" min-width="220" header-align="center"> header-align="center"
</el-table-column> width="100"
</el-table-column> fixed="left"
<el-table-column label="11月23日" header-align="center"> align="center" :formatter="(row, column, cellValue) => (areas.get(cellValue))">
<el-table-column prop="x6" label="星期四" min-width="220" header-align="center"> </el-table-column>
</el-table-column> <el-table-column prop="equipment.name" label="控制工程名称" header-align="center" width="150" fixed="left">
</el-table-column> </el-table-column>
<el-table-column label="11月24日" header-align="center"> <el-table-column prop="unit" label="管理单位" header-align="center" width="150" fixed="left">
<el-table-column prop="x7" label="星期五" min-width="220" header-align="center"> <template>
</el-table-column> <span>河道处</span>
</el-table-column> </template>
</el-table> </el-table-column>
<el-table-column prop="gate" label="闸门(孔×米)" header-align="center" width="150" fixed="left">
</div> <template>
</template> <span>14m</span>
<script> </template>
import { </el-table-column>
mergeTableRow <el-table-column prop="gm" label="泵站规模×m3/s" header-align="center" width="150" fixed="left">
} from "@/utils/mergeTableRow" <template>
<span>3×5m3/s</span>
export default { </template>
data() { </el-table-column>
return { <el-table-column :label="weekRange[i]" header-align="center" v-for="i in 6">
tableData: [], <el-table-column prop="x1" :label="weekName[i]" min-width="220" header-align="center">
list: [{ <template #default="{ row }">
area: '东线', <div>
unit: '河道处', <p v-for="item in row._sortData[i]">
target: '娄江枢纽', {{ $moment(item.act_start_time).format('HH:mm') }} ~ {{ $moment(item.act_end_time).format('HH:mm') }}
gate: '14m', {{ item.content }}
gm: '3×5m3/s', {{ abilities.get(item.leibie) }}
x1: "7:00-9:00两台外排", </p>
x2: "", </div>
x3: "7:00-9:00两台外排", </template>
x4: "7:00-9:00两台外排", </el-table-column>
x5: "7:00-9:00两台外排", </el-table-column>
x6: "7:00-9:00两台外排", </el-table>
x7: "7:00-9:00两台外排", </div>
}, { </template>
area: '东线', <script>
unit: '河道处', import { index } from "@/api/system/baseForm"
target: '娄江枢纽', import {
gate: '14m', mergeTableRow
gm: '3×5m3/s', } from "@/utils/mergeTableRow"
x1: "7:00-9:00两台外排", import { show } from "@/api/system/customFormField";
x2: "", import headerContent from "@/components/LxHeader/XyContent.vue";
x3: "7:00-9:00两台外排", import { authMixin } from "@/mixin/authMixin";
x4: "7:00-9:00两台外排", import LxHeader from "@/components/LxHeader";
x5: "7:00-9:00两台外排", import {AlignmentType, convertInchesToTwip, Document, HeadingLevel, Packer, Paragraph, TextRun} from "docx";
x6: "7:00-9:00两台外排", export default {
x7: "7:00-9:00两台外排", mixins: [authMixin],
}, { components: {
area: '东线', headerContent,
unit: '河道处', LxHeader
target: '娄江枢纽', },
gate: '14m', data() {
gm: '3×5m3/s', return {
x1: "7:00-9:00两台外排", weekSelect: new Date(),
x2: "", tableHeight: '600px',
x3: "7:00-9:00两台外排", abilities: new Map(),
x4: "7:00-9:00两台外排", areas: new Map(),
x5: "7:00-9:00两台外排", tableData: [],
x6: "7:00-9:00两台外排", list: [],
x7: "7:00-9:00两台外排", weekRange: [],
}, { weekName: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
area: '东线', }
unit: '河道处', },
target: '娄江枢纽', methods: {
gate: '14m', async getArea() {
gm: '3×5m3/s', const obj = (await show({ id: 4 }, false))?.select_item;
x1: "7:00-9:00两台外排", if (obj && typeof obj === "object") {
x2: "", let keys = Object.keys(obj);
x3: "7:00-9:00两台外排", console.log(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key]))
x4: "7:00-9:00两台外排", if (keys.length > 0) {
x5: "7:00-9:00两台外排", this.areas = new Map(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key]));
x6: "7:00-9:00两台外排", }
x7: "7:00-9:00两台外排", }
}, {
area: '东线', },
unit: '河道处', async getAbility() {
target: '娄江枢纽', const obj = (await show({ id: 31 }, false))?.select_item;
gate: '14m', if (obj && typeof obj === "object") {
gm: '3×5m3/s', let keys = Object.keys(obj);
x1: "7:00-9:00两台外排", if (keys.length > 0) {
x2: "", this.abilities = new Map(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key]));
x3: "7:00-9:00两台外排", }
x4: "7:00-9:00两台外排", }
x5: "7:00-9:00两台外排", },
x6: "7:00-9:00两台外排",
x7: "7:00-9:00两台外排", async getData () {
}, { this.weekRange = [this.$moment(this.weekSelect).startOf('week').format('YYYY-MM-DD')]
area: '东线', for (let i = 1;i <= 6;i++) {
unit: '河道处', this.weekRange.push(this.$moment(this.weekRange[0]).add(i,'day').format('YYYY-MM-DD'))
target: '娄江枢纽', }
gate: '14m', const res = await index({
gm: '3×5m3/s', table_name: 'transfers',
x1: "7:00-9:00两台外排", page: 1,
x2: "", page_size: 999,
x3: "7:00-9:00两台外排", sort_name: 'equipment_id',
x4: "7:00-9:00两台外排", filter: [
x5: "7:00-9:00两台外排", {
x6: "7:00-9:00两台外排", key: "status",
x7: "7:00-9:00两台外排", op: "eq",
}, { value: 6
area: '东线', },
unit: '河道处', {
target: '娄江枢纽', key: "act_start_time",
gate: '14m', op: "range",
gm: '3×5m3/s', value: `${this.weekRange.at(0)},${this.weekRange.at(-1)}`
x1: "7:00-9:00两台外排", }
x2: "", ]
x3: "7:00-9:00两台外排", })
x4: "7:00-9:00两台外排", const sortData = (arr) => {
x5: "7:00-9:00两台外排", let equipments = new Map();
x6: "7:00-9:00两台外排", // type
x7: "7:00-9:00两台外排", let grouped = arr.reduce((acc, cur) => {
}, { if (!acc[cur.equipment_id]) {
area: '东线', acc[cur.equipment_id] = [];
unit: '河道处', equipments.set(cur.equipment_id,cur)
target: '娄江枢纽', }
gate: '14m', acc[cur.equipment_id].push(cur);
gm: '3×5m3/s', return acc;
x1: "7:00-9:00两台外排", }, {});
x2: "",
x3: "7:00-9:00两台外排", // dataundefined
x4: "7:00-9:00两台外排", for (let equipment in grouped) {
x5: "7:00-9:00两台外排", grouped[equipment].sort((a, b) => (Number(this.$moment(a.act_start_time).diff(this.$moment(b.act_start_time),'days'))));
x6: "7:00-9:00两台外排", let sorted = Array.from({length: 7}, () => []);
x7: "7:00-9:00两台外排", for (let item of grouped[equipment]) {
}, { sorted[this.weekRange.indexOf(this.$moment(item.act_start_time).format('YYYY-MM-DD'))].push(item);
area: '东线', }
unit: '河道处', grouped[equipment] = sorted;
target: '娄江枢纽', }
gate: '14m',
gm: '3×5m3/s', //
x1: "7:00-9:00两台外排", let result = [];
x2: "", for (let equipment in grouped) {
x3: "7:00-9:00两台外排", result.push({ equipment_id: Number(equipment),equipment: equipments.get(Number(equipment))?.equipment_id_equipments_id_relation, _sortData: grouped[equipment] });
x4: "7:00-9:00两台外排", }
x5: "7:00-9:00两台外排",
x6: "7:00-9:00两台外排", return result;
x7: "7:00-9:00两台外排", }
}, {
area: '东线', this.tableData = mergeTableRow({
unit: '河道处', data: sortData(res.data),
target: '娄江枢纽', mergeColNames: ["equipment_id","equipment.area","equipment.name"], //
gate: '14m', firstMergeColNames: ["equipment_id"], // firstMerge
gm: '3×5m3/s', firstMerge: "equipment_id", //
x1: "7:00-9:00两台外排", })
x2: "", console.log(this.tableData)
x3: "7:00-9:00两台外排", },
x4: "7:00-9:00两台外排",
x5: "7:00-9:00两台外排", objectSpanMethod({
x6: "7:00-9:00两台外排", row,
x7: "7:00-9:00两台外排", column,
}, { rowIndex,
area: '东线', columnIndex
unit: '河道处', }) {
target: '娄江枢纽', const span = column['property'] + '-span'
gate: '14m', if (row[span]) {
gm: '3×5m3/s', return row[span]
x1: "7:00-9:00两台外排", }
x2: "", },
x3: "7:00-9:00两台外排",
x4: "7:00-9:00两台外排", async exportDocx () {
x5: "7:00-9:00两台外排", const makeText = (dayData) => {
x6: "7:00-9:00两台外排", let children = [];
x7: "7:00-9:00两台外排", children.push(
}, { new Paragraph({
area: '东线', text: `${this.$moment(this.selectDate).format('YYYY年MM月DD日')}调度指令执行情况`,
unit: '河道处', heading: HeadingLevel.HEADING_1,
target: '娄江枢纽', alignment: AlignmentType.CENTER,
gate: '14m', spacing: {
gm: '3×5m3/s', after: 400
x1: "7:00-9:00两台外排", }
x2: "", })
x3: "7:00-9:00两台外排", )
x4: "7:00-9:00两台外排", }
x5: "7:00-9:00两台外排", const document = new Document({
x6: "7:00-9:00两台外排", sections: [
x7: "7:00-9:00两台外排", {
}, { children: [
area: '东线', new Paragraph({
unit: '河道处', text: `${this.$moment(this.selectDate).format('YYYY年MM月DD日')}调度指令执行情况`,
target: '娄江枢纽', heading: HeadingLevel.HEADING_1,
gate: '14m', alignment: AlignmentType.CENTER,
gm: '3×5m3/s', spacing: {
x1: "7:00-9:00两台外排", after: 400
x2: "", }
x3: "7:00-9:00两台外排", }),
x4: "7:00-9:00两台外排", new Paragraph({
x5: "7:00-9:00两台外排", indent: {
x6: "7:00-9:00两台外排", firstLine: convertInchesToTwip(0.5)
x7: "7:00-9:00两台外排", },
}, { spacing: {
area: '东线', before: 200,
unit: '河道处', line: 500
target: '娄江枢纽', },
gate: '14m', children: [
gm: '3×5m3/s', new TextRun({
x1: "7:00-9:00两台外排", text: "今日小雨转晴北风2级气温22℃~29℃。水情信息8:00新塘3.06m环城河北3.02m觅渡桥2.99m人民桥3.00m16:00新塘3.03m环城河北2.90m觅渡桥2.92m人民桥2.95m。",
x2: "", size: 18,
x3: "7:00-9:00两台外排", })
x4: "7:00-9:00两台外排", ]
x5: "7:00-9:00两台外排", }),
x6: "7:00-9:00两台外排", ...this.transfers.map((i, index) => (
x7: "7:00-9:00两台外排", [
}, { new Paragraph({
area: '东线', spacing: {
unit: '河道处', before: 200,
target: '娄江枢纽', line: 400
gate: '14m', },
gm: '3×5m3/s', children: [
x1: "7:00-9:00两台外排", new TextRun({
x2: "", text: `${this.numberToChinese(index+1)}${i.equipment_id_equipments_id_relation?.name}`,
x3: "7:00-9:00两台外排", size: 28,
x4: "7:00-9:00两台外排", bold: true,
x5: "7:00-9:00两台外排", }),
x6: "7:00-9:00两台外排", ]
x7: "7:00-9:00两台外排", }),
}, { new Paragraph({
area: '西线', spacing: {
unit: '河道处', before: 200,
target: '娄江枢纽', line: 400
gate: '14m', },
gm: '3×5m3/s', indent: {
x1: "7:00-9:00两台外排", firstLine: convertInchesToTwip(0.5)
x2: "", },
x3: "7:00-9:00两台外排", children: [
x4: "7:00-9:00两台外排", new TextRun({
x5: "7:00-9:00两台外排", text: `1、时间${this.$moment(i.act_start_time).format('YYYY-MM-DD HH:mm')} - ${this.$moment(i.act_end_time).format('YYYY-MM-DD HH:mm')} 2、实际执行情况${i.content}`,
x6: "7:00-9:00两台外排", size: 18,
x7: "7:00-9:00两台外排", })
}, { ]
area: '西线', })
unit: '河道处', ]
target: '娄江枢纽', )).flat()
gate: '14m', ]
gm: '3×5m3/s', },
x1: "7:00-9:00两台外排", ]
x2: "", })
x3: "7:00-9:00两台外排",
x4: "7:00-9:00两台外排", const blob = await Packer.toBlob(document)
x5: "7:00-9:00两台外排", saveAs(blob, 'test.docx')
x6: "7:00-9:00两台外排", }
x7: "7:00-9:00两台外排", },
}] created() {
} this.getAbility()
}, this.getArea()
methods: { this.getData()
objectSpanMethod({ },
row, mounted() {
column, let clientHeight = document.documentElement.clientHeight;
rowIndex, let lxheader = document.querySelector(".v-header")?.getBoundingClientRect();
columnIndex let lxHeader_height = lxheader.height + 25; //
}) { let paginationHeight = 37; //
const span = column['property'] + '-span' let topHeight = 50; //
if (row[span]) { this.tableHeight =
return row[span] clientHeight - lxHeader_height - topHeight - paginationHeight - 20 - 25 + 36;
} }
} }
},
created() {
this.tableData = mergeTableRow({
data: this.list,
mergeColNames: ["area"], //
firstMergeColNames: ["area"], // firstMerge
firstMerge: 'area' //
})
}
}
</script> </script>

Loading…
Cancel
Save