调令调整、调整日志

master
xy 2 years ago
parent e0da0326db
commit 635abed7e1

@ -44,7 +44,7 @@
</th>
</tr>
<tr style="height: 36px">
<th>时间</th>
<th>日志</th>
<th style="width: 64%">内容</th>
</tr>
</thead>
@ -52,15 +52,23 @@
<tr>
<td>
<div>
<div>
{{
$moment(data.start_time).format("YYYY-MM-DD HH:mm")
}}
</div>
<div style="padding: 10px 0">~</div>
<div>
{{ $moment(data.end_time).format("YYYY-MM-DD HH:mm") }}
<div v-if="data.receive_time">{{ $moment(data.receive_time).format("YYYY-MM-DD HH:mm") }}</div>
<div v-if="data.notice_open_time">{{ $moment(data.notice_open_time).format("YYYY-MM-DD HH:mm") }}</div>
<div v-if="data.open_time">{{ $moment(data.open_time).format("YYYY-MM-DD HH:mm") }}</div>
<div v-if="data.notice_close_time">{{ $moment(data.notice_close_time).format("YYYY-MM-DD HH:mm") }}</div>
<div v-if="data.close_time">{{ $moment(data.close_time).format("YYYY-MM-DD HH:mm") }}</div>
<div v-if="data.id_logs_transfer_id_relation && data.id_logs_transfer_id_relation.length > 0">
<p v-for="item in data.id_logs_transfer_id_relation">{{ item.content }}</p>
</div>
<!-- <div>-->
<!-- {{-->
<!-- $moment(data.start_time).format("YYYY-MM-DD HH:mm")-->
<!-- }}-->
<!-- </div>-->
<!-- <div style="padding: 10px 0">~</div>-->
<!-- <div>-->
<!-- {{ $moment(data.end_time).format("YYYY-MM-DD HH:mm") }}-->
<!-- </div>-->
</div>
</td>
<td>
@ -375,7 +383,7 @@ export default {
}
).then((res) => {
let copyData = deepCopy(this.data);
copyData.status = 3;
copyData.status = copyData.tiaozhengleixing === 0 ? 5 : 3;
copyData.receive_time = this.$moment().format('YYYY-MM-DD HH:mm')
for (let key in copyData) {
if (/_relation/g.test(key)) {

@ -56,14 +56,14 @@
<div class="list-item__time">
执行时间{{ timeFormat(item.start_time) }}{{ timeFormat(item.end_time,'HH:mm') }}
<br>
发布时间{{ timeFormat(item.created_at) }}
发布时间{{ timeFormat(item.created_at,'YYYY-MM-DD HH:mm') }}
</div>
<div class="list-item__last">预计时长 {{ $moment(item.end_time).diff($moment(item.start_time),'hours', true).toFixed(2) }}小时</div>
<div class="list-item__operate">
<div v-for="(s, si) in status" :title="operateTitle(item, s)" class="step" @click="stepClick(item,s)">
<div v-for="(s, si) in (item.tiaozhengleixing === 0 ? closeStatus : status)" :title="operateTitle(item, s)" class="step" @click="stepClick(item,s)">
<div class="step-icon">
<div class="step-icon__cir" :class="`step-icon__cir-${stepFormat(item.status,s.value)}`"></div>
<div class="step-icon__line" :class="`step-icon__line-${stepFormat(item.status,s.value)}`" v-if="si < status.length-1"></div>
<div class="step-icon__line" :class="`step-icon__line-${stepFormat(item.status,s.value)}`" v-if="si < (item.tiaozhengleixing === 0 ? closeStatus : status).length-1"></div>
</div>
<div class="step-label">{{ s.label }}</div>
</div>
@ -88,6 +88,23 @@ export default {
inject: ["transfers", "nowTime", "auths"],
data() {
return {
closeStatus: [
{
value: 2,
label: "接收",
auth: "receive"
},
{
value: 5,
label: "确认关闭通知",
auth: "noticeClose"
},
{
value: 6,
label: "确认关闭",
auth: "close"
},
],
status: [
{
value: 4,

@ -56,14 +56,14 @@
<div class="list-item__time">
运行时间{{ timeFormat(item.start_time) }}{{ timeFormat(item.end_time,'HH:mm') }}
<br>
发布时间{{ timeFormat(item.created_at,'HH:mm') }}
发布时间{{ timeFormat(item.created_at,'YYYY-MM-DD HH:mm') }}
</div>
<div class="list-item__last">预计时长 {{ $moment(item.end_time).diff($moment(item.start_time),'hours', true).toFixed(2) }}小时</div>
<div class="list-item__operate">
<div v-for="(s, si) in status" :title="operateTitle(item, s)" class="step" @click="stepClick(item,s)">
<div v-for="(s, si) in (item.tiaozhengleixing === 0 ? closeStatus : status)" :title="operateTitle(item, s)" class="step" @click="stepClick(item,s)">
<div class="step-icon">
<div class="step-icon__cir" :class="`step-icon__cir-${stepFormat(item.status,s.value)}`"></div>
<div class="step-icon__line" :class="`step-icon__line-${stepFormat(item.status,s.value)}`" v-if="si < status.length-1"></div>
<div class="step-icon__line" :class="`step-icon__line-${stepFormat(item.status,s.value)}`" v-if="si < (item.tiaozhengleixing === 0 ? closeStatus : status).length-1"></div>
</div>
<div class="step-label">{{ s.label }}</div>
</div>
@ -88,6 +88,23 @@ export default {
inject: ["transfers", "nowTime", "auths"],
data() {
return {
closeStatus: [
{
value: 2,
label: "接收",
auth: "receive"
},
{
value: 5,
label: "确认关闭通知",
auth: "noticeClose"
},
{
value: 6,
label: "确认关闭",
auth: "close"
},
],
status: [
{
value: 2,

@ -109,7 +109,7 @@ export default {
date: this.$moment().format('YYYY-MM-DD')
}))[0]
infoObj.water = `${infos?.daily_water?.map(i => i.range + i.stnm + i.s_value + 'm,')?.toString()}`
infoObj.rain = `${infos?.daily_rain?.map(i => i.type + i.rain_value + 'mm,')?.toString()}`
infoObj.rain = `${infos?.daily_rain?.map(i => i.type + (typeof i.rain_value === "number" ? i.rain_value.toFixed(2) : parseFloat(i.rain_value).toFixed(2)) + 'mm,')?.toString()}`
this.weather = infoObj

@ -0,0 +1,211 @@
<template>
<div>
<xy-dialog
ref="dialog"
:is-show.sync="isShow"
type="form"
title="调令调整"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:content>
<div class="xy-table-item">
<div class="xy-table-item-label">调令内容 </div>
<div class="xy-table-item-content">
<el-input
type="textarea"
:autosize="{ minRows: 2 }"
v-model="form.content"
clearable
placeholder="请输入调令内容"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:tiaozhengleixing>
<div class="xy-table-item">
<div class="xy-table-item-label">调整类型 </div>
<div class="xy-table-item-content">
<el-select
v-model="form.tiaozhengleixing"
clearable
placeholder="请选择调整类型"
style="width: 300px"
>
<el-option
v-for="item in tiaozhengleixings"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import { show, save } from "@/api/system/baseForm";
export default {
props: {
tiaozhengleixings: {
type: Array,
default: () => [
{
id: 0,
value: "关闭"
},
{
id: 1,
value: "新开"
},
{
id: 2,
value: "其他"
}
],
},
},
data() {
return {
isShow: false,
id: "",
type: "",
form: {
content: "",
tiaozhengleixing: "",
},
rules: {},
originalData: "",
};
},
methods: {
show() {
this.isShow = true;
},
hidden() {
this.isShow = false;
},
init() {
for (let key in this.form) {
if (this.form[key] instanceof Array) {
this.form[key] = [];
} else {
this.form[key] = "";
}
}
this.$refs["dialog"].clearValidate();
},
setId(id) {
if (typeof id == "number") {
this.id = id;
} else {
console.error("error typeof id: " + typeof id);
}
},
getId() {
return this.id;
},
setType(type = "add") {
let types = ["add", "editor"];
if (types.includes(type)) {
this.type = type;
} else {
console.warn("Unknown type: " + type);
}
},
setForm(key = [], value = []) {
if (key instanceof Array) {
key.forEach((key, index) => {
this.form[key] = value[index] ?? "";
});
}
if (typeof key === "string") {
this.form[key] = value;
}
if (!key) {
this.init();
}
},
async getDetail() {
const res = await show({ id: this.id, table_name: "transfers" });
this.$integrateData(this.form, res);
this.originalData = JSON.stringify(this.form);
},
submit() {
let updateData = JSON.stringify(this.form);
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
}
if (this.type === "editor") {
Object.defineProperty(this.form, "id", {
value: this.id,
enumerable: true,
configurable: true,
writable: true,
});
}
save({
table_name: "transfers",
...this.form,
status: 2
}).then((res) => {
if (updateData !== this.originalData) {
let originalData = JSON.parse(this.originalData)
let nowData = JSON.parse(updateData)
let kv = new Map([
['content','调令内容'],
['tiaozhengleixing','调整状态']
])
let text = ""
for (let key in nowData) {
text += nowData[key] === originalData[key] ? "" : (`${kv.get(key)}】从"${this.tiaozhengleixings.find(i => i.id === originalData[key])?.value || originalData[key] || " "}"更改为"${this.tiaozhengleixings.find(i => i.id === nowData[key])?.value || nowData[key]}"` || " ")
}
save({
table_name: "logs",
transfer_id: this.getId(),
content: text
},false)
}
this.$message({
type: "success",
message: "操作成功",
});
this.isShow = false;
this.$emit("refresh");
});
},
},
watch: {
isShow(val) {
if (val) {
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = "";
this.type = "";
this.originalData = "";
this.init();
this.$refs["dialog"].clearValidate();
delete this.form.id;
}
},
},
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -166,7 +166,7 @@ export default {
date: this.$moment().format('YYYY-MM-DD')
}))[0]
infoObj.water = `${infos?.daily_water?.map(i => i.range + i.stnm + i.s_value + 'm,')?.toString()}`
infoObj.rain = `${infos?.daily_rain?.map(i => i.type + i.rain_value + 'mm,')?.toString()}`
infoObj.rain = `${infos?.daily_rain?.map(i => i.type + (typeof i.rain_value === "number" ? i.rain_value.toFixed(2) : parseFloat(i.rain_value).toFixed(2)) + 'mm,')?.toString()}`
this.weather = infoObj

@ -282,6 +282,18 @@
</div>
<!--$refs['drawer'].setId(row.id);
$refs['drawer'].show();-->
<el-row :gutter="10">
<el-col :span="4">
<el-tree :data="equipments"
node-key="id"
:style="{ 'max-height': treeHeight, 'overflow': 'scroll' }"
ref="elTree"
:props="{ children: 'children', label: 'name' }"
show-checkbox
@check="handleCheckChange">
</el-tree>
</el-col>
<el-col :span="20">
<xy-table
:btnCondition="btnCondition"
:span-method="objectSpanMethod"
@ -312,6 +324,18 @@
}
"
>
<template #adjust="{ row }">
<Button
size="small"
type="primary"
@click="
$refs['adjust'].setId(row.id),
$refs['adjust'].setType('editor'),
$refs['adjust'].show()
"
>调整</Button
>
</template>
<template #callback="{ row }">
<Button
size="small"
@ -352,6 +376,8 @@
>
</template>
</xy-table>
</el-col>
</el-row>
<dialoger
:table-name="customForm.tableName"
@ -373,6 +399,7 @@
></imports>
<callback ref="callback"></callback>
<adjust ref="adjust" @refresh="$refs['xyTable'].getTableData()"></adjust>
</div>
</template>
@ -396,6 +423,7 @@ 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 adjust from "@/views/order/component/adjust.vue";
import {deepCopy} from "@/utils";
import {mergeTableRow} from "@/utils/mergeTableRow";
export default {
@ -406,6 +434,7 @@ export default {
drawer,
imports,
callback,
adjust
},
mixins: [authMixin],
provide: {
@ -413,6 +442,7 @@ export default {
},
data() {
return {
equipments: [],
areas: [],
abilities: [],
window: {
@ -441,7 +471,12 @@ export default {
key: "start_time",
op: "like",
value: this.$moment().format('YYYY-MM-DD')
}
},
{
key: "equipment_id",
op: "in",
value: []
},
],
sort_name: 'start_time',
page_size: 9999,
@ -524,6 +559,25 @@ export default {
})
},
async getEquipments () {
const res = (await index({
table_name: 'equipments',
page: 1,
page_size: 9999
},false))?.data || []
this.equipments = this.areas.map(i => ({
id: `area_${i.value}`,
name: i.key,
children: res.filter(j => j.area === i.value)
}))
this.$nextTick(() => {
this.areas.forEach(i => {
this.$refs['elTree'].setChecked(`area_${i.value}`, true, true)
})
})
},
async getArea() {
const obj = (await formFieldShow({ id: 4 }, false))?.select_item;
if (obj && typeof obj === "object") {
@ -538,6 +592,7 @@ export default {
}
}
this.$bus.$emit("areas", this.areas);
await this.getEquipments()
},
async getAbility() {
const obj = (await formFieldShow({ id: 31 }, false))?.select_item;
@ -609,6 +664,13 @@ export default {
})
},
handleCheckChange (data, checked, indeterminate) {
this.treeValue = this.$refs['elTree'].getCheckedNodes(true)?.filter(i => !i.children)?.map(i => i.name).toString()
this.select.filter[3].value = this.$refs['elTree'].getCheckedNodes(true)?.filter(i => !i.children)?.map(i => i.id)
this.$refs['xyTable'].getTableData(true)
},
setTransferStatus (status,row) {
let copyRow = deepCopy(row);
copyRow.status = status;
@ -930,6 +992,10 @@ export default {
filter,
};
},
treeHeight () {
return (this.$refs['xyTable']?.tableHeight + 36 || 630) + 'px'
},
},
created() {
this.window.width = screen.availWidth * 0.95

@ -13,6 +13,9 @@
<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>
<Select clearable v-model="selectArea" placeholder="请选择范围" style="width: 140px;margin-left: 6px;">
<Option v-for="item in Array.from(areas)" :value="item[0]">{{ item[1] }}</Option>
</Select>
<Button
style="margin-left: 10px"
type="primary"
@ -26,6 +29,18 @@
</LxHeader>
</div>
<el-row :gutter="10">
<el-col :span="4">
<el-tree :data="equipments"
node-key="id"
:style="{ 'max-height': (tableHeight || 630) + 'px', 'overflow': 'scroll' }"
ref="elTree"
:props="{ children: 'children', label: 'name' }"
show-checkbox
@check="handleCheckChange">
</el-tree>
</el-col>
<el-col :span="20">
<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>
@ -68,6 +83,8 @@
</el-table-column>
</el-table-column>
</el-table>
</el-col>
</el-row>
</div>
</template>
<script>
@ -88,17 +105,46 @@
},
data() {
return {
selectArea: "",
weekSelect: new Date(),
tableHeight: '600px',
abilities: new Map(),
areas: new Map(),
equipments: [],
tableData: [],
list: [],
equipmentIds: [],
weekRange: [],
weekName: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
}
},
methods: {
handleCheckChange (data, checked, indeterminate) {
this.treeValue = this.$refs['elTree'].getCheckedNodes(true)?.filter(i => !i.children)?.map(i => i.name).toString()
this.equipmentIds = this.$refs['elTree'].getCheckedNodes(true)?.filter(i => !i.children)?.map(i => i.id)
this.getData()
},
async getEquipments () {
const res = (await index({
table_name: 'equipments',
page: 1,
page_size: 9999
},false))?.data || []
this.equipments = Array.from(this.areas).map(i => ({
id: `area_${i[0]}`,
name: i[1],
children: res.filter(j => j.area === i[0])
}))
this.$nextTick(() => {
Array.from(this.areas).forEach(i => {
this.$refs['elTree'].setChecked(`area_${i[0]}`, true, true)
})
})
},
async getArea() {
const obj = (await show({ id: 4 }, false))?.select_item;
if (obj && typeof obj === "object") {
@ -108,7 +154,7 @@
this.areas = new Map(keys.map((key) => [/^\d*$/.test(obj[key]) ? Number(obj[key]) : obj[key],key]));
}
}
await this.getEquipments();
},
async getAbility() {
const obj = (await show({ id: 31 }, false))?.select_item;
@ -140,6 +186,11 @@
key: "act_start_time",
op: "range",
value: `${this.weekRange.at(0)},${this.weekRange.at(-1)}`
},
{
key: "equipment_id",
op: "in",
value: this.equipmentIds
}
]
})
@ -175,7 +226,7 @@
}
this.tableData = mergeTableRow({
data: sortData(res.data),
data: this.selectArea ? sortData(res.data).filter(i => (i.equipment?.area === this.selectArea)) : sortData(res.data),
mergeColNames: ["equipment_id","equipment.area","equipment.name"], //
firstMergeColNames: ["equipment_id"], // firstMerge
firstMerge: "equipment_id", //

Loading…
Cancel
Save