xy 2 years ago
parent 72fc773458
commit 92ba08a9f1

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

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

@ -44,43 +44,75 @@
<td>执行状态</td>
<td>
<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 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>
<div class="btns">
<Button type="primary" ghost @click="$refs['esign'].reset()"></Button>
<Button type="primary" @click="esignConfirm"></Button>
<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>
<div style="padding: 20px;height: 100%;" class="d-flex flex-column">
<div class="flex-1">
<template v-else-if="data.status === 3">
<div class="sign-container">
<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>
<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>
<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>
</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>
</tr>
</tbody>
@ -104,15 +136,14 @@ export default {
},
data() {
return {
jieshouren: "",
isShow: false,
data: {},
typeMap: new Map([
[1,'待下发'],
[2,'已下发'],
[3,'待执行'],
[3,'通知现场中'],
[4,'执行中'],
[5,'已取消'],
[5,'通知现场中'],
[6,'已完成']
])
}
@ -127,9 +158,9 @@ export default {
setData (data) {
this.data = data
},
async esignConfirm () {
async esignConfirm (isSign) {
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 file = base64toFile(base64,`${new Date().getTime()}.png`)
const form = new FormData();
@ -143,8 +174,11 @@ export default {
let copyData = deepCopy(this.data)
if (this.data.status === 2) {
copyData.status = 3;
copyData.jieshouren = this.jieshouren;
copyData.status = isSign ? 4 : 3;
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) {
if (/_relation/g.test(key)) {
delete copyData[key]
@ -174,6 +208,24 @@ export default {
})
}
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.end_sign = fileInfo.data?.id;
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 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>
<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 class="board-item__bottom d-flex jc-between ai-start">
<div class="time-info">
<div v-for="(label,key) in contentLK" style="display: inline-block;">
{{label}}{{ $moment(item[key]).format('YYYY-MM-DD HH:mm') || '-' }}
</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') }}
</div>
</div>
<div v-if="setTransferStatusNumber !== -1" @click.stop="showDetail(item)">
<dv-border-box-8 reverse class="fw-b text-center" style="width: 64px;height: 38px;line-height: 38px;cursor: pointer;"
<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: 72px;height: 40px;line-height: 40px;cursor: pointer;"
>{{setStatusText(item.status)}}</dv-border-box-8>
</div>
</div>
@ -202,9 +210,10 @@ export default {
setStatusText () {
return function (status) {
const textMap = new Map([
[2,'接收'],
[3,'确认'],
[4,'关闭']
[2,'确认开启'],
[3,'确认开启'],
[4,'确认关闭'],
[5,'确认关闭']
])
return textMap.get(status)
}

@ -236,7 +236,12 @@ export default {
key: "equipment_id",
align: "center",
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", [
h(
"el-popover",
@ -268,20 +273,16 @@ export default {
cursor: "pointer",
width: "20px",
height: "20px",
display: "inline-block",
display: (num && num !== 0) ? "inline-block" : "none",
background: "#367bc7",
color: "#fff",
},
},
this.dispatches.reduce((pre, cur) => {
return cur.equipment_id === row.equipment_id
? ++pre
: pre;
}, 0)
num
),
h("Table", {
style: {
width: "480px",
width: "540px",
},
props: {
size: "small",
@ -296,6 +297,7 @@ export default {
title: "开始时间",
key: "start_time",
align: "center",
width: 170,
render: (h, { row }) =>
h(
"span",
@ -307,6 +309,7 @@ export default {
{
title: "结束时间",
key: "end_time",
width: 170,
align: "center",
render: (h, { row }) =>
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: "内容",
minWidth: 120,
key: "content",
},
],

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

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

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

Loading…
Cancel
Save