多日调令导出

master
xy 2 years ago
parent b28a103abc
commit 02c296ec14

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

@ -286,6 +286,7 @@
$refs['dialog'].show();
}
"
@loaded="adjustAlignment"
>
<template #callback="{ row }">
<Button
@ -375,6 +376,7 @@ export default {
},
data() {
return {
firstAdjustTable: true,
op,
select: {
table_name: "",
@ -636,14 +638,13 @@ export default {
}
}
let alignLeft = [];
this.table.push(
Object.assign(
{
prop: i.field,
label: i.name,
width: i.width,
align: alignLeft.find((m) => m === i.field) ? "left" : "center",
align: "center",
fixed: i.is_fixed,
},
linkOb
@ -656,6 +657,35 @@ export default {
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: {

@ -12,7 +12,7 @@
<header-content :auths="auths_auth_mixin">
<template #search>
<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-->
<!-- style="margin-left: 10px"-->
<!-- type="primary"-->
@ -29,25 +29,30 @@
</div>
<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>
<div v-for="(item, index) in showData" :key="item.value">
<div class="item" v-if="item._data.length > 0">
<div v-for="(item, index) in showData.filter(i => i._data.size > 0)" :key="item.value">
<div class="item" v-if="item._data.size > 0">
<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">
{{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 class="time">
<span>时间</span>
<span>{{ $moment(item1.act_start_time).format('YYYY-MM-DD HH:mm') }} - {{ $moment(item1.act_end_time).format('HH:mm') }}</span>
</div>
<div class="content">
<span>内容</span>
<span>{{ item1.content }}</span>
<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;">
<div style="text-indent: 60px;">{{index1+1}}.{{index2+1}}</div>
<div>
<div class="time">
<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>
</div>
<div class="content">
<span>内容</span>
<span>{{ item2.to_transfer_id ? "[调整]" : "" }}{{ item2.content }}</span>
</div>
</div>
</div>
</div>
</div>
@ -64,7 +69,7 @@ import {
AlignmentType,
TextRun,
Packer,
convertInchesToTwip
convertInchesToTwip,
} from "docx";
import { saveAs } from 'file-saver';
import { index, save } from "@/api/system/baseForm";
@ -86,7 +91,7 @@ export default {
weather: {},
transfers: [],
showData: [],
selectDate: new Date(),
selectDate: [new Date(),new Date()],
}
},
methods: {
@ -207,11 +212,12 @@ export default {
table_name: "transfers",
page: 1,
page_size: 999,
sort_name: "equipment_id",
filter: [
{
key: 'start_time',
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',
@ -224,18 +230,23 @@ export default {
this.showData = this.areas.map(i => {
return {
...i,
_data: []
_data: new Map()
}
})
this.transfers.forEach(item => {
let filterData = this.showData.find(i => i.value === item.equipment_id_equipments_id_relation.area)
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) {
}
console.log(this.showData)
},
async exportDocx () {
@ -244,7 +255,7 @@ export default {
{
children: [
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,
alignment: AlignmentType.CENTER,
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({
spacing: {
@ -281,7 +292,7 @@ export default {
}),
]
}),
...i._data.map((i1, index1) => (
...Array.from(i._data).map((i1, index1) => (
[
new Paragraph({
spacing: {
@ -293,18 +304,27 @@ export default {
},
children: [
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,
}),
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()
@ -316,7 +336,7 @@ export default {
})
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: {
@ -355,12 +375,12 @@ export default {
padding: 6px 0;
}
.time {
text-indent: 60px;
text-indent: 10px;
line-height: 1.5;
}
.content {
text-indent: 60px;
text-indent: 10px;
line-height: 1.5;
}

Loading…
Cancel
Save