2023-11-15 xy

master
xy 2 years ago
parent c33497ffa0
commit 47207c3bcf

@ -33,11 +33,12 @@ export function show(params, isLoading = true) {
}) })
} }
export function save(data) { export function save(data, isLoading = true) {
return request({ return request({
method: "post", method: "post",
url: "/api/admin/base-form/save", url: "/api/admin/base-form/save",
data data,
isLoading
}) })
} }

@ -9,11 +9,12 @@ export function index(params,isLoading = false) {
}) })
} }
export function show(params) { export function show(params,isLoading = true) {
return request({ return request({
method: "get", method: "get",
url: "/api/admin/custom-form-field/show", url: "/api/admin/custom-form-field/show",
params params,
isLoading
}) })
} }

@ -171,3 +171,11 @@ export function debounce(func, delay) {
} }
} }
export function uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
let r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}

@ -271,11 +271,11 @@ export default {
render(h) { render(h) {
const dialog = new CreateDialog(this,[ const dialog = new CreateDialog(this,[
{ {
key: 'bengzhashuniu', key: 'equipment_id',
label: '泵闸枢纽', label: '泵闸枢纽',
render: h('el-transfer',{ render: h('el-transfer',{
props: { props: {
value: this.form['bengzhashuniu'], value: this.form['equipment_id'],
filterable: true, filterable: true,
data: this.pumps, data: this.pumps,
titles: ['源列表','目标列表'], titles: ['源列表','目标列表'],
@ -283,11 +283,11 @@ export default {
key: 'id', key: 'id',
label: 'name' label: 'name'
}, },
'right-default-checked': this.form['bengzhashuniu'] 'right-default-checked': this.form['equipment_id']
}, },
on: { on: {
'change':e => { 'change':e => {
this.form['bengzhashuniu'] = e; this.form['equipment_id'] = e;
this.form = Object.assign({},this.form); this.form = Object.assign({},this.form);
} }
} }

@ -471,7 +471,6 @@ export default {
this.form this.form
?.filter((i) => i.list_show) ?.filter((i) => i.list_show)
.forEach((i) => { .forEach((i) => {
if (i._relations) return
let linkOb = {}; let linkOb = {};
if (i.edit_input === "richtext") { if (i.edit_input === "richtext") {

@ -0,0 +1,58 @@
<template>
<div>
<LxHeader
icon="md-apps"
:text="$route.meta.title"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="调度指令"
>
</LxHeader>
<Card>
<div class="step">
<el-steps :active="currentStep" align-center process-status="finish" finish-status="success">
<el-step title="点位选择"></el-step>
<el-step title="调令内容"></el-step>
<el-step title="调令预览"></el-step>
<el-step title="完成"></el-step>
</el-steps>
</div>
<Divider></Divider>
<div class="content">
<step1 v-if="currentStep === 0"></step1>
</div>
</Card>
</div>
</template>
<script>
import LxHeader from "@/components/LxHeader/index.vue";
import step1 from "@/views/order/component/step1.vue";
export default {
components: {
LxHeader,
step1
},
data() {
return {
currentStep: 0,
}
},
methods: {},
computed: {},
}
</script>
<style scoped lang="scss">
::v-deep .ivu-steps .ivu-steps-title,::v-deep .ivu-steps .ivu-steps-head {
background: #0000;
}
.step {
width: 80%;
margin: 0 auto;
}
</style>

@ -0,0 +1,263 @@
<template>
<div>
<LxHeader
icon="md-apps"
:text="$route.meta.title"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="快速调令"
>
<template #content>
<Button type="primary" style="width: 120px;" @click="add"></Button>
</template>
</LxHeader>
<div class="content">
<Table :columns="columns" :data="data" stripe></Table>
</div>
<div class="btn">
<Button type="primary" ghost long style="max-width: 260px;margin-right: 40px;" @click="data = []">清空</Button>
<Button type="primary" long style="max-width: 260px;" @click="submit"></Button>
</div>
</div>
</template>
<script>
import { uuid } from "@/utils";
import { index, save } from "@/api/system/baseForm";
import LxHeader from "@/components/LxHeader";
export default {
components: {
LxHeader
},
props: {
equipments: Array
},
data() {
return {
form: {
no: '',
equipment_id: '',
start_time: '',
end_time: '',
content: '',
level: 1,
status: 1
},
columns: [
{
type: 'index',
width: 50,
title: ' '
},
{
title: '点位',
width: 160,
key: 'equipment_id',
align: 'center',
render: (h,{ row }) => {
return h('Select',{
props: {
value: row.equipment_id,
filterable: true,
size: 'small',
transfer: true
},
on: {
['on-select']:e => {
row.equipment_id = e.value;
}
}
},this.equipments.map(i => {
return h('Option',{
props: {
value: i.id,
}
},i.name)
}))
}
},
{
title: '开启时间',
width: 140,
align: 'center',
key: 'start_time',
render: (h,{ row }) => {
return h('TimePicker',{
props: {
value: row.start_time,
type: 'time',
size: 'small',
transfer: true
},
on: {
['on-change']:e => row.start_time = e
}
})
}
},
{
title: '结束时间',
width: 140,
align: 'center',
key: 'end_time',
render: (h,{ row }) => {
return h('TimePicker',{
props: {
value: row.end_time,
type: 'time',
size: 'small',
transfer: true
},
on: {
['on-change']:e => row.end_time = e
}
})
}
},
{
title: '调令内容',
minWidth: 200,
key: 'content',
render: (h,{ row }) => {
return h('Input',{
props: {
size: 'small',
value: row.content
},
on: {
['input']:e => row.content = e
}
})
}
},
{
title: '操作',
width: 140,
key: 'operate',
render: (h,{ row, index }) => {
return h('Poptip',{
props: {
title: '确认要删除吗?',
confirm: true,
transfer: true
},
on: {
['on-ok']:e => {
this.data.splice(index,1)
}
}
},[
h('Button',{
props: {
type: 'primary',
size: 'small'
}
},'删除')
])
}
}
],
data: []
}
},
methods: {
isTimeFormat (str) {
let regex = /^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/;
return regex.test(str);
},
add () {
this.$prompt('请输入内容','快速调令',{
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType: 'textarea',
closeOnClickModal: false,
inputPlaceholder: '点位 开始时间 结束时间 调令内容,\n点位 开始时间 结束时间 调令内容 \n每个值以空格隔开每条调令用","(英文逗号)分割',
beforeClose:(action, instance, done) => {
if (action === 'confirm') {
let value = instance._data.inputValue;
try {
let group = value.split(',').map(i => i.replace(/\n/g,''));
group.forEach((item,index) => {
let dataArr = item.split(/\s+/);
if (!this.equipments.find(i => i.name === dataArr[0])) {
throw new Error('未找到该点位');
}
if (!(this.isTimeFormat(dataArr[1]) && this.isTimeFormat(dataArr[2]))) {
throw new Error('时间格式有误');
}
})
done();
} catch (err) {
this.$message({
type: 'warning',
message: /^TypeError./.test(err) ? '数据格式有误' : err
})
}
} else {
done();
}
},
}).then(({ value, action }) => {
if (action === 'confirm') {
let uid = uuid();
let group = value.split(',').map(i => i.replace(/\n/g,''));
group.forEach((item,index) => {
let dataArr = item.split(/\s+/);
this.data.push({
no: uid,
equipment_id: this.equipments.find(i => i.name === dataArr[0])?.id,
start_time: `${this.$moment().format('YYYY-MM-DD')} ${dataArr[1]}`,
end_time: `${this.$moment().format('YYYY-MM-DD')} ${dataArr[2]}`,
content: dataArr[3] || '',
level: 1,
status: 1
})
})
}
}).catch(_ => {})
},
submit () {
console.log(this.data)
let promiseAll = this.data.map(form => {
return save({
table_name: 'transfers',
...form
},false)
})
let loadingInstance = this.$loading({
lock:true,
background:"rgba(0,0,0,0.4)",
text:"正在加载中..."
})
Promise.all(promiseAll).then(res => {
this.data = [];
loadingInstance.close();
this.$message({
type: 'success',
message: '添加成功'
})
}).catch(_ => {
loadingInstance.close()
})
}
},
computed: {},
}
</script>
<style scoped lang="scss">
.btn {
display: flex;
justify-content: center;
margin-top: 20px;
}
</style>
<style>
.el-message-box__input .el-textarea .el-textarea__inner {
min-height: 120px !important;
}
</style>

@ -0,0 +1,91 @@
<template>
<div>
<div class="select">
<div class="select-item">
<div class="select-item__title">
片区
</div>
<el-checkbox-group size="small" v-model="select.area">
<el-checkbox-button v-for="item in areas" :label="item.value">{{item.key}}</el-checkbox-button>
</el-checkbox-group>
</div>
<div class="select-item">
<div class="select-item__title">
类别
</div>
<el-checkbox-group size="small" v-model="select.type">
<el-checkbox-button v-for="item in types" :label="item.value">{{item.key}}</el-checkbox-button>
</el-checkbox-group>
</div>
</div>
<Divider></Divider>
<el-transfer v-model="pickedEquipments" :data="equipments()" :titles="['源列表','目标列表']" :props="{ key: 'id',label: 'name' }" :right-default-checked="pickedEquipments"></el-transfer>
<Button style="width: 200px;" type="primary">下一步</Button>
</div>
</template>
<script>
import { show } from "@/api/system/customFormField";
export default {
inject: ['equipments'],
data() {
return {
areas: [],
types: [],
select: {
area: '',
type: ''
},
pickedEquipments: [],
}
},
methods: {
async getArea () {
const obj = (await show({ 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],
};
});
}
}
},
async getType () {
const obj = (await show({ id: 1 },false))?.select_item;
if (obj && typeof obj === 'object') {
let keys = Object.keys(obj)
if (keys.length > 0) {
this.types = keys.map((key) => {
return {
key,
value: /^\d*$/.test(obj[key])
? Number(obj[key])
: obj[key],
};
});
}
}
},
},
computed: {},
created() {
this.getArea();
this.getType();
}
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,59 @@
<template>
<div>
<template v-if="isQuick">
<quickCreate :equipments="equipments"></quickCreate>
</template>
<template v-else>
<normalCreate></normalCreate>
</template>
</div>
</template>
<script>
import normalCreate from "@/views/order/component/normalCreate.vue";
import quickCreate from "@/views/order/component/quickCreate.vue";
import {index} from "@/api/system/baseForm";
export default {
components: {
quickCreate,
normalCreate
},
provide() {
return {
equipments: () => this.equipments
}
},
data() {
return {
equipments: [],
isQuick: false,
}
},
methods: {
async getEquipments () {
this.equipments = (await index({
table_name: 'equipments',
page: 1,
page_size: 9999
},false))?.data || []
},
},
computed: {},
mounted() {
this.$confirm('选择调令创建方式','调令方式',{
confirmButtonText: '快速调令',
cancelButtonText: '普通调令',
type: 'info',
closeOnPressEscape: false,
closeOnClickModal: false,
showClose: false
}).then(_ => this.isQuick = true).catch(_ => this.isQuick = false)
},
created() {
this.getEquipments();
}
}
</script>
<style scoped lang="scss">
</style>
Loading…
Cancel
Save