多日调令导出

master
xy 2 years ago
parent b28a103abc
commit 02c296ec14

@ -13,21 +13,136 @@
<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 clearable v-model="select.filter[2].value" placeholder="请选择类型" style="width: 140px;" @on-change="e => !e ? select.filter[2].value = '' : ''"> <Select clearable v-model="select.filter[0].value" placeholder="请选择范围" style="width: 140px;margin-left: 6px;">
<Option v-for="item in Array.from(types)" :value="item[0]">{{ item[1] }}</Option>
</Select>
<Select clearable v-model="select.filter[1].value" placeholder="请选择范围" style="width: 140px;margin-left: 6px;" @on-change="e => !e ? select.filter[1].value = '' : ''">
<Option v-for="item in Array.from(areas)" :value="item[0]">{{ item[1] }}</Option> <Option v-for="item in Array.from(areas)" :value="item[0]">{{ item[1] }}</Option>
</Select> </Select>
<Input clearable v-model="select.filter[0].value" placeholder="关键词" style="width: 140px;margin-left: 6px;"/>
<Button <Button
style="margin-left: 10px" style="margin-left: 10px"
type="primary" type="primary"
@click="$refs['xyTable'].getTableData(true)" @click="$refs['xyTable'].getTableData(true)"
>查询</Button >查询</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>
</div> </div>
</template> </template>
<template #create> <template #create>
@ -83,6 +198,7 @@
$refs['dialog'].show(); $refs['dialog'].show();
} }
" "
@loaded="adjustAlignment"
> >
<template #callback="{ row }"> <template #callback="{ row }">
<Button <Button
@ -127,13 +243,19 @@
:form-info="form" :form-info="form"
ref="drawer" ref="drawer"
></drawer> ></drawer>
<imports
:table-name="customForm.tableName"
:form-info="form"
ref="imports"
@refresh="$refs['xyTable'].getTableData()"
></imports>
<callback ref="callback"></callback> <callback ref="callback"></callback>
</div> </div>
</template> </template>
<script> <script>
import { index as fieldIndex,show as fieldShow } from "@/api/system/customFormField"; import { index as fieldIndex, show as fieldShow } from "@/api/system/customFormField";
import { authMixin } from "@/mixin/authMixin"; import { authMixin } from "@/mixin/authMixin";
import { index, destroy, save } from "@/api/system/baseForm"; import { index, destroy, save } from "@/api/system/baseForm";
import { op } from "@/const/op"; import { op } from "@/const/op";
@ -148,6 +270,7 @@ import dialoger from "@/views/component/dialog.vue";
import LxHeader from "@/components/LxHeader/index.vue"; import LxHeader from "@/components/LxHeader/index.vue";
import headerContent from "@/components/LxHeader/XyContent.vue"; import headerContent from "@/components/LxHeader/XyContent.vue";
import drawer from "@/views/component/drawer.vue"; import drawer from "@/views/component/drawer.vue";
import imports from "@/views/component/imports.vue";
import callback from "@/views/order/component/callback.vue"; import callback from "@/views/order/component/callback.vue";
import {deepCopy} from "@/utils"; import {deepCopy} from "@/utils";
export default { export default {
@ -156,6 +279,7 @@ export default {
dialoger, dialoger,
headerContent, headerContent,
drawer, drawer,
imports,
callback, callback,
}, },
mixins: [authMixin], mixins: [authMixin],
@ -164,29 +288,21 @@ export default {
}, },
data() { data() {
return { return {
areas: new Map(),
firstAdjustTable: true,
op, op,
select: { select: {
table_name: "", table_name: "",
filter: [ filter: [
{
key: "name",
op: "like",
value: "",
},
{ {
key: "area", key: "area",
op: "eq", op: "eq",
value: "", value: "",
}, },
{
key: "type",
op: "eq",
value: "",
}
], ],
}, },
types: new Map(),
areas: new Map(),
selectQuery: [], selectQuery: [],
form: [], form: [],
table: [], table: [],
@ -197,6 +313,16 @@ export default {
}; };
}, },
methods: { methods: {
async getArea() {
const obj = (await fieldShow({ id: 4 }, false))?.select_item;
if (obj && typeof obj === "object") {
let keys = Object.keys(obj);
if (keys.length > 0) {
this.areas = new Map(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key]));
}
}
},
setTransferStatus (status,row) { setTransferStatus (status,row) {
let copyRow = deepCopy(row); let copyRow = deepCopy(row);
@ -437,14 +563,13 @@ export default {
} }
} }
let alignLeft = [];
this.table.push( this.table.push(
Object.assign( Object.assign(
{ {
prop: i.field, prop: i.field,
label: i.name, label: i.name,
width: i.width, width: i.width,
align: alignLeft.find((m) => m === i.field) ? "left" : "center", align: "center",
fixed: i.is_fixed, fixed: i.is_fixed,
}, },
linkOb linkOb
@ -458,25 +583,34 @@ export default {
}); });
}, },
adjustAlignment () {
async getArea() { if (this.firstAdjustTable) {
const obj = (await fieldShow({ id: 4 }, false))?.select_item; const data = this.$refs['xyTable'].getListData();
if (obj && typeof obj === "object") { if (data.length === 0) return;
let keys = Object.keys(obj); this.form.filter(i => i.list_show).forEach((i) => {
if (keys.length > 0) { let lengthTemp;
this.areas = new Map(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key])); let temp = 0;
} while (!lengthTemp || temp < data.length) {
} lengthTemp = data[temp][i.field]?.length??0;
}, temp++;
async getType() { }
const obj = (await fieldShow({ id: 1 }, false))?.select_item; for (let j = 0;j < data.length;j++) {
if (obj && typeof obj === "object") { if (/^-?\d+\.\d+/.test(data[j][i.field])) {
let keys = Object.keys(obj); this.table.find(a => a.prop === i.field).align = 'right';
if (keys.length > 0) { return
this.types = new Map(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key])); }
} if (Math.abs(lengthTemp - (data[j][i.field]?.length)??0) > 4) {
this.table.find(a => a.prop === i.field).align = 'left';
return
}
}
})
this.$nextTick(() => {
this.$refs['xyTable'].doLayout();
this.firstAdjustTable = false;
})
} }
}, }
}, },
computed: { computed: {
@ -513,9 +647,8 @@ export default {
}, },
}, },
created() { created() {
this.getType();
this.getArea();
this.getFormDetail(); this.getFormDetail();
this.getArea();
}, },
}; };
</script> </script>

@ -286,6 +286,7 @@
$refs['dialog'].show(); $refs['dialog'].show();
} }
" "
@loaded="adjustAlignment"
> >
<template #callback="{ row }"> <template #callback="{ row }">
<Button <Button
@ -375,6 +376,7 @@ export default {
}, },
data() { data() {
return { return {
firstAdjustTable: true,
op, op,
select: { select: {
table_name: "", table_name: "",
@ -636,14 +638,13 @@ export default {
} }
} }
let alignLeft = [];
this.table.push( this.table.push(
Object.assign( Object.assign(
{ {
prop: i.field, prop: i.field,
label: i.name, label: i.name,
width: i.width, width: i.width,
align: alignLeft.find((m) => m === i.field) ? "left" : "center", align: "center",
fixed: i.is_fixed, fixed: i.is_fixed,
}, },
linkOb linkOb
@ -656,6 +657,35 @@ export default {
label: "序号", label: "序号",
}); });
}, },
adjustAlignment () {
if (this.firstAdjustTable) {
const data = this.$refs['xyTable'].getListData();
if (data.length === 0) return;
this.form.filter(i => i.list_show).forEach((i) => {
let lengthTemp;
let temp = 0;
while (!lengthTemp || temp < data.length) {
lengthTemp = data[temp][i.field]?.length??0;
temp++;
}
for (let j = 0;j < data.length;j++) {
if (/^-?\d+\.\d+/.test(data[j][i.field])) {
this.table.find(a => a.prop === i.field).align = 'right';
return
}
if (Math.abs(lengthTemp - (data[j][i.field]?.length)??0) > 4) {
this.table.find(a => a.prop === i.field).align = 'left';
return
}
}
})
this.$nextTick(() => {
this.$refs['xyTable'].doLayout();
this.firstAdjustTable = false;
})
}
}
}, },
computed: { computed: {

@ -12,7 +12,7 @@
<header-content :auths="auths_auth_mixin"> <header-content :auths="auths_auth_mixin">
<template #search> <template #search>
<div style="display: flex"> <div style="display: flex">
<el-date-picker v-model="selectDate" size="small" :clearable="false" style="width: 140px;" @change="getTransfer"></el-date-picker> <el-date-picker type="daterange" v-model="selectDate" size="small" :clearable="false" style="width: 220px;" @change="getTransfer"></el-date-picker>
<!-- <Button--> <!-- <Button-->
<!-- style="margin-left: 10px"--> <!-- style="margin-left: 10px"-->
<!-- type="primary"--> <!-- type="primary"-->
@ -29,25 +29,30 @@
</div> </div>
<el-card> <el-card>
<div class="title">{{ $moment(selectDate).format('YYYY-MM-DD') }}调度指令执行情况</div> <div class="title">{{ selectDate[0] ? $moment(selectDate[0]).format('YYYY-MM-DD') : "-" }} ~ {{ selectDate[1] ? $moment(selectDate[1]).format('YYYY-MM-DD') : "-" }}调度指令执行情况</div>
<p style="text-indent: 30px;line-height: 1.2;padding: 20px 0;">{{ weather.weather }}</p> <p style="text-indent: 30px;line-height: 1.2;padding: 20px 0;">{{ weather.weather }}</p>
<div v-for="(item, index) in showData" :key="item.value"> <div v-for="(item, index) in showData.filter(i => i._data.size > 0)" :key="item.value">
<div class="item" v-if="item._data.length > 0"> <div class="item" v-if="item._data.size > 0">
<div class="sub-title">{{ numberToChinese(index+1) }}. {{ item.key }}</div> <div class="sub-title">{{ numberToChinese(index+1) }}. {{ item.key }}</div>
<div v-for="(item1, index1) in item._data" :key="item1.id"> <div v-for="(item1, index1) in Array.from(item._data)" :key="item1[0]">
<div class="name"> <div class="name">
{{index1+1}}.{{ item1.equipment_id_equipments_id_relation ? item1.equipment_id_equipments_id_relation.name : '' }} {{index1+1}}.{{ item1[1][0].equipment_id_equipments_id_relation ? item1[1][0].equipment_id_equipments_id_relation.name : '' }}
</div> </div>
<div class="time"> <div v-for="(item2, index2) in item1[1].sort((a,b) => new Date(a.act_start_time).valueOf() - new Date(b.act_start_time).valueOf())" :key="item2.id" style="display: flex;">
<span>时间</span> <div style="text-indent: 60px;">{{index1+1}}.{{index2+1}}</div>
<span>{{ $moment(item1.act_start_time).format('YYYY-MM-DD HH:mm') }} - {{ $moment(item1.act_end_time).format('HH:mm') }}</span> <div>
</div> <div class="time">
<div class="content"> <span>时间</span>
<span>内容</span> <span>{{ item2.act_start_time ? $moment(item2.act_start_time).format('YYYY-MM-DD HH:mm') : "-" }} ~ {{ item2.act_end_time ? $moment(item2.act_end_time).format('HH:mm') : "-" }}</span>
<span>{{ item1.content }}</span> </div>
<div class="content">
<span>内容</span>
<span>{{ item2.to_transfer_id ? "[调整]" : "" }}{{ item2.content }}</span>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -64,7 +69,7 @@ import {
AlignmentType, AlignmentType,
TextRun, TextRun,
Packer, Packer,
convertInchesToTwip convertInchesToTwip,
} from "docx"; } from "docx";
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import { index, save } from "@/api/system/baseForm"; import { index, save } from "@/api/system/baseForm";
@ -86,7 +91,7 @@ export default {
weather: {}, weather: {},
transfers: [], transfers: [],
showData: [], showData: [],
selectDate: new Date(), selectDate: [new Date(),new Date()],
} }
}, },
methods: { methods: {
@ -207,11 +212,12 @@ export default {
table_name: "transfers", table_name: "transfers",
page: 1, page: 1,
page_size: 999, page_size: 999,
sort_name: "equipment_id",
filter: [ filter: [
{ {
key: 'start_time', key: 'start_time',
op: 'range', op: 'range',
value: `${this.$moment(this.selectDate).startOf('days').format('YYYY-MM-DD HH:mm:ss')},${this.$moment(this.selectDate).endOf('days').format('YYYY-MM-DD HH:mm:ss')}` value: `${this.$moment(this.selectDate[0]||new Date()).startOf('days').format('YYYY-MM-DD HH:mm:ss')},${this.$moment(this.selectDate[1]||new Date()).endOf('days').format('YYYY-MM-DD HH:mm:ss')}`
}, },
{ {
key: 'status', key: 'status',
@ -224,18 +230,23 @@ export default {
this.showData = this.areas.map(i => { this.showData = this.areas.map(i => {
return { return {
...i, ...i,
_data: [] _data: new Map()
} }
}) })
this.transfers.forEach(item => { this.transfers.forEach(item => {
let filterData = this.showData.find(i => i.value === item.equipment_id_equipments_id_relation.area) let filterData = this.showData.find(i => i.value === item.equipment_id_equipments_id_relation.area)
if (filterData) { if (filterData) {
filterData._data.push(item) if (filterData._data.has(item.equipment_id)) {
filterData._data.get(item.equipment_id).push(item)
} else {
filterData._data.set(item.equipment_id, [item])
}
} }
}) })
} catch (e) { } catch (e) {
} }
console.log(this.showData)
}, },
async exportDocx () { async exportDocx () {
@ -244,7 +255,7 @@ export default {
{ {
children: [ children: [
new Paragraph({ new Paragraph({
text: `${this.$moment(this.selectDate).format('YYYY年MM月DD日')}调度指令执行情况`, text: `${this.selectDate[0] ? this.$moment(this.selectDate[0]).format('YYYY年MM月DD日') : "-"} ~ ${this.selectDate[1] ? this.$moment(this.selectDate[1]).format('YYYY年MM月DD日') : "-"}调度指令执行情况`,
heading: HeadingLevel.HEADING_1, heading: HeadingLevel.HEADING_1,
alignment: AlignmentType.CENTER, alignment: AlignmentType.CENTER,
spacing: { spacing: {
@ -266,7 +277,7 @@ export default {
}) })
] ]
}), }),
...this.showData.filter(i => (i._data && i._data.length>0)).map((i, index) => ( ...this.showData.filter(i => (i._data && i._data.size>0)).map((i, index) => (
[ [
new Paragraph({ new Paragraph({
spacing: { spacing: {
@ -281,7 +292,7 @@ export default {
}), }),
] ]
}), }),
...i._data.map((i1, index1) => ( ...Array.from(i._data).map((i1, index1) => (
[ [
new Paragraph({ new Paragraph({
spacing: { spacing: {
@ -293,18 +304,27 @@ export default {
}, },
children: [ children: [
new TextRun({ new TextRun({
text: `${index1+1}. ${i1.equipment_id_equipments_id_relation.name}`, text: `${index1+1}. ${i1[1][0].equipment_id_equipments_id_relation ? i1[1][0].equipment_id_equipments_id_relation.name : ''}`,
size: 24, size: 24,
}), }),
new TextRun({
text: `\n时间 ${this.$moment(i1.act_start_time).format('YYYY-MM-DD HH:mm')} - ${this.$moment(i1.act_end_time).format('HH:mm')}`,
size: 18
}),
new TextRun({
text: `\n内容${i1.content || ''}`,
size: 18
})
] ]
}),
...i1[1].sort((a,b) => new Date(a.act_start_time).valueOf() - new Date(b.act_start_time).valueOf()).map((i2, index2) => {
return new Paragraph({
indent: {
firstLine: convertInchesToTwip(0.8)
},
children: [
new TextRun({
text: `${index1+1}.${index2+1}`,
size: 20,
}),
new TextRun({
text: `时间: ${i2.act_start_time ? this.$moment(i2.act_start_time).format('YYYY-MM-DD HH:mm') : "-" } ~ ${ i2.act_end_time ? this.$moment(i2.act_end_time).format('HH:mm') : "-" }\n\t${ i2.to_transfer_id ? "[调整]" : "" }内容:${i2.content || ''}`,
size: 18
})
]
})
}) })
] ]
)).flat() )).flat()
@ -316,7 +336,7 @@ export default {
}) })
const blob = await Packer.toBlob(document) const blob = await Packer.toBlob(document)
saveAs(blob, `${this.$moment(this.selectDate).format('YYYY-MM-DD')}调令.docx`) saveAs(blob, `${this.selectDate[0] ? this.$moment(this.selectDate[0]).format('YYYY年MM月DD日') : "-"} ~ ${this.selectDate[1] ? this.$moment(this.selectDate[1]).format('YYYY年MM月DD日') : "-"}调度指令执行情况`)
} }
}, },
computed: { computed: {
@ -355,12 +375,12 @@ export default {
padding: 6px 0; padding: 6px 0;
} }
.time { .time {
text-indent: 60px; text-indent: 10px;
line-height: 1.5; line-height: 1.5;
} }
.content { .content {
text-indent: 60px; text-indent: 10px;
line-height: 1.5; line-height: 1.5;
} }

Loading…
Cancel
Save