完善工单列表详情

This commit is contained in:
龙运模 2024-08-22 19:37:18 +08:00
parent 7db33a3ea9
commit f81c63f5f0
12 changed files with 725 additions and 190 deletions

View File

@ -147,8 +147,28 @@ export default {
post: async function (params) { post: async function (params) {
return await http.post(this.url,params); return await http.post(this.url,params);
} }
},
review:{
url: `${config.API_URL}/maintenance.order.approval`,
name: "维保工单审核",
post: async function (params) {
return await http.post(this.url,params);
}
},
submit:{
url: `${config.API_URL}/maintenance.order.submit`,
name: "提交维保工单",
post: async function (params) {
return await http.post(this.url,params);
}
},
send:{
url: `${config.API_URL}/maintenance.order.send.supplier`,
name: "下发维保工单",
post: async function (params) {
return await http.post(this.url,params);
}
} }
}, },
sock: { sock: {
list:{ list:{

View File

@ -0,0 +1,13 @@
<template>
<svg t="1724294325554" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4704" width="200" height="200"><path d="M396.672 779.456l123.84-123.904c22.528 7.488 45.056 12.544 68.864 12.544a206.72 206.72 0 0 0 206.464-206.528c0-28.8-6.272-56.32-16.256-81.28l-5.056-12.544c0-1.28-1.28-2.56-2.496-3.776a11.392 11.392 0 0 0-14.976 0l-115.136 115.2L570.56 410.24l112.64-112.64a12.096 12.096 0 0 0 0-17.536c-1.28-1.28-2.496-2.496-4.992-2.496l-7.488-4.992a206.848 206.848 0 0 0-81.344-17.536 206.72 206.72 0 0 0-206.464 206.464c0 23.808 3.712 47.552 12.48 68.864l-123.84 123.84c-16.32 16.256-26.304 38.784-26.304 62.592 0 23.744 8.768 46.272 26.24 62.528 33.792 33.792 90.112 33.856 125.184 0z m-97.6-28.8a49.216 49.216 0 0 1-13.76-35.008c0-12.544 4.992-25.088 14.976-35.072l142.72-141.44-5.12-12.48a174.848 174.848 0 0 1-13.696-66.304c0-91.328 75.072-166.4 166.4-166.4 12.608 0 25.216 1.28 37.568 3.712L524.288 401.536c-3.776 3.776-3.776 9.984 0 15.04l108.864 108.8a11.776 11.776 0 0 0 16.256 1.28l103.872-103.872c2.496 12.352 3.776 24.96 3.776 37.568 0 91.328-75.072 166.4-166.4 166.4a174.72 174.72 0 0 1-66.368-13.76L511.808 608l-143.936 142.656a46.976 46.976 0 0 1-68.8 0z" p-id="4705"></path><path d="M313.088 705.6a25.024 25.024 0 1 0 50.112 0 25.024 25.024 0 0 0-50.112 0z m199.296 258.56a27.584 27.584 0 0 1-26.496-17.536 28.608 28.608 0 0 1-2.112-11.072 28.608 28.608 0 0 1 17.6-26.624 27.456 27.456 0 0 1 11.008-1.92c215.616 0 391.168-175.488 391.168-390.848a392 392 0 0 0-104.96-266.88 28.416 28.416 0 0 1 22.336-47.36 28.544 28.544 0 0 1 19.584 9.216 450.304 450.304 0 0 1 120.256 304.96c0 246.976-201.28 448-448.384 448zM208 833.472a29.568 29.568 0 0 1-21.12-8.576A448.32 448.32 0 0 1 64 516.16c-0.064-246.912 201.28-448 448.384-448a28.16 28.16 0 0 1 28.608 28.608 28.608 28.608 0 0 1-17.664 26.624 27.52 27.52 0 0 1-10.944 1.92c-215.616 0-391.168 175.424-391.168 390.784 0 100.544 38.656 197.12 107.84 268.8a28.416 28.416 0 0 1-1.024 40.064 29.12 29.12 0 0 1-19.968 8.576z" p-id="4706"></path><path d="M412.16 282.688A28.8 28.8 0 0 1 396.8 277.76a27.584 27.584 0 0 1-12.672-28.736 28.032 28.032 0 0 1 4.16-10.24l100.096-157.376a28.032 28.032 0 0 1 39.168-8.576 27.584 27.584 0 0 1 12.8 28.8 28.032 28.032 0 0 1-4.16 10.304L436.032 269.248a27.264 27.264 0 0 1-23.872 13.376zM514.24 962.24a28.8 28.8 0 0 1-15.232-4.8 27.648 27.648 0 0 1-12.672-28.8 28.032 28.032 0 0 1 4.096-10.24l100.16-157.248a28.032 28.032 0 0 1 39.168-8.576 27.648 27.648 0 0 1 12.672 28.8 28.16 28.16 0 0 1-4.16 10.24L538.24 948.928a27.2 27.2 0 0 1-23.936 13.312z" p-id="4707"></path></svg>
</template>
<script>
export default {
name: "OrderMaintenance"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1724294298779" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4417" width="200" height="200"><path d="M874.92380445 953.76118557H149.01146851a33.98163001 33.98163001 0 0 1 0-67.96326002h725.91233594a33.98163001 33.98163001 0 1 1 0 67.96326002z m0-135.14979556H150.50018816a33.91690297 33.91690297 0 0 1-33.98163001-33.91690297v-120.06842482c0-59.35457963 48.28627741-107.64085703 107.64085703-107.64085703h137.22105743c-1.87708075-35.79398371-14.04574037-93.07730147-25.04931556-105.76377742a273.14757518 273.14757518 0 0 1-58.44840334-158.12784924 222.27222073 222.27222073 0 0 1 70.42288184-163.56491037 221.36604445 221.36604445 0 0 1 164.40636075-58.77203854 220.84822926 220.84822926 0 0 1 234.76451556 218.97114965 272.50030592 272.50030592 0 0 1-57.34804594 158.83984555c-11.84502557 13.85155925-24.14313927 70.94069703-26.14967296 106.73468075h137.22105742c59.28985259 0 107.57612999 48.28627741 107.57612999 107.64085702v121.75132445c0 18.77080519-15.21082482 33.91690297-33.98163 33.91690297zM184.48181703 750.71285703h656.33090446v-87.76969444a39.80705223 39.80705223 0 0 0-39.67759815-39.80705222H640.80655815a33.98163001 33.98163001 0 0 1-27.83257258-14.43410148 96.76673593 96.76673593 0 0 1-16.89372445-45.7619274 35.14671445 35.14671445 0 0 1-0.19418112-4.40143075c0.64726926-21.3598811 10.03267186-115.99062926 41.74885888-152.94969629a203.24250851 203.24250851 0 0 0 42.00776704-116.96153372A152.88497038 152.88497038 0 0 0 515.23634517 138.59043555a33.85217593 33.85217593 0 0 1-5.04869888 0 153.14387741 153.14387741 0 0 0-164.40636074 153.07915037 203.88977778 203.88977778 0 0 0 43.0433974 116.50844445c31.0689189 35.79398371 40.13068629 130.74836594 40.64850262 152.23770112 0 1.29453853 0 2.52435001-0.12945408 3.75416035a94.82492814 94.82492814 0 0 1-17.02317853 46.27974371 33.98163001 33.98163001 0 0 1-27.83257259 14.36937444H224.28886926a39.80705223 39.80705223 0 0 0-39.67759815 39.80705223v86.08679481z" p-id="4418"></path></svg>
</template>
<script>
export default {
name: "OrderReview"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1724294312548" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4559" width="200" height="200"><path d="M308.7170368 135.2893632a101.6414816 101.6414816 0 0 0 101.6414816 101.6414816H512V169.14962987H410.3585184a32.768 32.768 0 0 1-23.96918507-9.8910816 32.768 32.768 0 0 1-9.8910816-23.96918507 32.768 32.768 0 0 1 9.8910816-24.02986667 32.768 32.768 0 0 1 23.96918507-9.8910816H512V33.6478816H410.3585184A101.6414816 101.6414816 0 0 0 308.7170368 135.2893632z m406.5659264 0a101.6414816 101.6414816 0 0 1-101.6414816 101.6414816H512V169.14962987h101.6414816a32.768 32.768 0 0 0 23.96918507-9.8910816 32.768 32.768 0 0 0 9.8910816-23.96918507 32.768 32.768 0 0 0-9.8910816-24.02986667 32.768 32.768 0 0 0-23.96918507-9.8910816H512V33.6478816h101.6414816a101.6414816 101.6414816 0 0 1 101.6414816 101.6414816z" p-id="4560"></path><path d="M647.56242987 135.2893632a33.86026667 33.86026667 0 0 0 33.86026666 33.86026667h169.42269654v304.92444373a33.86026667 33.86026667 0 1 0 67.72053333 0V169.14962987a67.78121493 67.78121493 0 0 0-67.72053333-67.78121494h-169.42269654a33.86026667 33.86026667 0 0 0-33.86026666 33.92094827zM105.4340736 846.71905173a67.78121493 67.78121493 0 0 0 67.72053333 67.78121494h304.9244448a33.86026667 33.86026667 0 1 0 0-67.78121494H173.21528853V169.14962987H342.69866667a33.86026667 33.86026667 0 0 0 0-67.78121494H173.21528853A67.78121493 67.78121493 0 0 0 105.4947552 169.14962987v677.56942186z" p-id="4561"></path><path d="M342.63798507 304.65137813h271.00349653c22.57351147 0 33.86026667 11.2867552 33.86026667 33.86026667 0 22.63419307-11.2867552 33.92094827-33.86026667 33.92094827H342.69866667c-22.63419307 0-33.92094827-11.2867552-33.92094827-33.92094827 0-22.57351147 11.2867552-33.86026667 33.92094827-33.86026667zM342.63798507 440.1531264h135.50174826c22.57351147 0 33.86026667 11.3474368 33.86026667 33.9209472 0 22.57351147-11.2867552 33.86026667-33.86026667 33.86026667H342.63798507c-22.63419307 0-33.92094827-11.2867552-33.92094827-33.86026667 0-22.57351147 11.2867552-33.92094827 33.92094827-33.9209472zM547.62002987 735.30785173a169.48337813 169.48337813 0 0 0 126.46020693 83.4977184l67.72053333 117.41866667a101.6414816 101.6414816 0 0 0 138.96059307 37.13706667l-33.98162987-58.6183104a33.79958507 33.79958507 0 0 1-46.29997013-12.37902294L712.85570347 750.47822187a101.4594368 101.4594368 0 0 1-118.51093334-81.31318507 101.6414816 101.6414816 0 0 0 116.93321494 10.80130347l-33.92094827-58.7396736a33.86026667 33.86026667 0 0 1-46.23928853-12.37902187l-49.152-85.07543787a169.42269653 169.42269653 0 0 0-34.3457184 211.4749632z" p-id="4562"></path><path d="M840.77226667 566.0672c26.69985173 46.1179264 30.03733333 102.24829653 9.10222186 151.21825173l67.72053334 117.35798507a101.7628448 101.7628448 0 0 1-37.2584288 138.83922987l-33.79958614-58.67899307a33.86026667 33.86026667 0 0 0 12.37902294-46.23928853l-87.62405974-151.82506667a101.6414816 101.6414816 0 0 0-11.165392-143.20829653 101.5808 101.5808 0 0 1-49.152 106.5566816l-33.86026666-58.678992a33.86026667 33.86026667 0 0 0 12.43970346-46.2392896l-49.0913184-85.0754368a169.42269653 169.42269653 0 0 1 200.24888854 75.85185173v0.1213632z" p-id="4563"></path></svg>
</template>
<script>
export default {
name: "SaveMaintenance"
}
</script>
<style scoped>
</style>

View File

@ -67,6 +67,9 @@ export { default as OrderSee } from './OrderSee.vue'
export { default as OrderConfirm } from './OrderConfirm.vue' export { default as OrderConfirm } from './OrderConfirm.vue'
export { default as OrderLog } from './OrderLog.vue' export { default as OrderLog } from './OrderLog.vue'
export { default as OrderSetup } from './OrderSetup.vue' export { default as OrderSetup } from './OrderSetup.vue'
export { default as OrderMaintenance } from './OrderMaintenance.vue'
export { default as OrderReview } from './OrderReview.vue'
export { default as SaveMaintenance } from './SaveMaintenance.vue'
export { default as Home } from './menu/Home.vue' export { default as Home } from './menu/Home.vue'

View File

@ -5,26 +5,33 @@
.headerView{ .headerView{
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
display: flex;justify-content: space-between;align-items: center; display: flex;justify-content: space-between;align-items: center;
padding: 0 0 15px 0; padding: 5px 0 17px 0;
} }
.title{ .title{
font-weight: 500; font-weight: 500;
font-size: 13px; font-size: 13px;
} }
.cardBody{ .cardBody{
padding: 15px 0 0 0; padding: 12px 0 0 0;
display: flex;flex-direction: column; display: flex;flex-direction: column;
.el-row{ .el-row{
padding: 12px 0; padding: 10px 0;
.el-col{ .el-col{
display: flex;
.label{ .label{
width: 100px; flex-basis: 100px;
display: inline-block; justify-content: flex-end;
text-align: right;
color: #303133; color: #303133;
display: flex;
}
.labelText{
align-items: center;
} }
.text{ .text{
color: #222; color: #222;
display: flex;
flex: 1;
} }
} }
} }
@ -34,8 +41,8 @@
min-height: 800px; min-height: 800px;
margin-top: 10px; margin-top: 10px;
.cardItem{ .cardItem{
margin-bottom: 15px; margin-bottom: 12px;
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e9e9e9;
padding: 0 0 10px 0; padding: 0 0 10px 0;
} }
.cardItem:last-child{ .cardItem:last-child{
@ -43,3 +50,33 @@
} }
} }
} }
.orderSteps{
.el-step__main{
.el-step__title{
font-size: 12px;
}
}
.is-success .el-step__icon{
background: var(--el-color-success);
border-color: var(--el-color-success-light-5);
.el-icon{
color: var(--el-color-white);
}
}
.is-finish .el-step__icon{
background: var(--el-color-primary);
border-color: var(--el-color-primary-light-5);
.el-step__icon-inner{
color: var(--el-color-white);
}
}
.is-wait .el-step__icon{
background: var(--el-color-info);
border-color: var(--el-color-info-light-5);
.el-step__icon-inner{
color: var(--el-color-white);
}
}
}

View File

@ -1,163 +1,28 @@
<template> <template>
<el-container> <el-container>
<el-main class="orderMain"> <el-main class="orderMain" v-loading="loading" element-loading-text="加载中...">
<el-scrollbar> <el-scrollbar>
<div class="cardBox"> <detailView :data="info"></detailView>
<div class="headerView">
<div class="title">工单时间</div>
<div class="status">
<span class="name">当前状态</span>
<span class="text">{{info.business_status}}</span>
</div>
</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">创建时间</span>
<span class="text">{{info.created_at}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">PE确认时间</span>
<span class="text">{{info.pe_confirmation_time}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">过保时间</span>
<span class="text">{{info.warranty_end_date}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardBox footerCard">
<div class="cardItem">
<div class="title">流程进度</div>
<div class="cardBody">
<el-steps :active="2" align-center>
<el-step :status="item.node?'error':'finish'" v-for="item in info.process_engine" :key="item" :title="item.description" />
</el-steps>
</div>
</div>
<div class="cardItem">
<div class="title">维保单号</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维修单号</span>
<span class="text">{{info.repair_order_no}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardItem">
<div class="title">维保工单信息</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维修等级</span>
<span class="text">{{info.maintenance_plan}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">故障类型</span>
<span class="text">{{info.fault_type}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">故障内容</span>
<span class="text">{{info.fault_description}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维保等级</span>
<span class="text">{{info.maintenance_plan}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">是否关机</span>
<span class="text">{{info.requires_shutdown}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">机房城市</span>
<span class="text">{{info.city}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">园区</span>
<span class="text">{{info.park_name}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">机房</span>
<span class="text">{{info.data_center_name}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">机架位</span>
<span class="text">{{info.rack_position}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">整机SN</span>
<span class="text">{{info.device_sn}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">整机厂商</span>
<span class="text">{{info.device_manufacturer}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">整机型号</span>
<span class="text">{{info.device_model}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">部件SN/Sp</span>
<span class="text">{{info.component_serial_no}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">部件厂商</span>
<span class="text">{{info.component_manufacturer}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">部件型号</span>
<span class="text">{{info.component_model}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">部件PN/Sp</span>
<span class="text">{{info.component_pn}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">SLA截止时间</span>
<span class="text">{{info.sla_expiration}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">剩余BD数</span>
<span class="text">{{info.bd_backup_count}}</span>
</el-col>
</el-row>
</div>
</div>
</div>
</el-scrollbar> </el-scrollbar>
</el-main> </el-main>
</el-container> </el-container>
</template> </template>
<script> <script>
import detailView from "@/views/order/orderList/detailView";
export default { export default {
name: "order-info", name: "order-info",
components:{
detailView
},
data(){ data(){
return{ return{
loading:false,
params:{ params:{
order_id:Number(this.$route.query.id) order_id:Number(this.$route.query.id)
}, },
info:{} info:{}
} }
}, },
mounted() { mounted() {
@ -165,10 +30,34 @@ export default {
}, },
methods:{ methods:{
async getData() { async getData() {
this.loading = true;
const res = await this.$API.orders.order.maintenance.info.post(this.params); const res = await this.$API.orders.order.maintenance.info.post(this.params);
if(res.code == 200){ if(res.code == 200){
if(res.data.process_engine){
res.data.process_engine = this.processList(res.data.process_engine).processedList;
res.data.process_num = this.processList(res.data.process_engine).num;
}
this.info = res.data; this.info = res.data;
} }
this.loading = false;
},
processList(list) {
let obj = {
num:0,
processedList:this.$TOOL.objCopy(list)
}
let foundNodeTrue = false;
for (let i = 0; i < obj.processedList.length; i++) {
if (obj.processedList[i].node === true) {
foundNodeTrue = true;
obj.processedList[i].status = 'finish';
obj.num = i;
} else if (!foundNodeTrue) {
obj.processedList[i].status = 'success';
}
if (foundNodeTrue && obj.processedList[i].node !== true) break;
}
return obj;
} }
} }
} }

View File

@ -23,7 +23,7 @@ export default {
column: [], column: [],
}, },
params:{ params:{
bill_id: this.$route.query.id, bill_id: Number(this.$route.query.id),
bill_type:1, // 1 2 bill_type:1, // 1 2
} }
} }

View File

@ -0,0 +1,176 @@
<template>
<div class="cardBox">
<div class="headerView">
<div class="title">工单时间</div>
<div class="status">
<span class="name">当前状态</span>
<span class="text">{{info.business_status}}</span>
</div>
</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">创建时间</span>
<span class="text">{{info.created_at}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">PE确认时间</span>
<span class="text">{{info.pe_confirmation_time}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">过保时间</span>
<span class="text">{{info.warranty_end_date}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardBox footerCard">
<div class="cardItem">
<div class="title">流程进度</div>
<div class="cardBody">
<el-steps class="orderSteps" :active="info.process_num" align-center>
<el-step :status="item.status" v-for="item in info.process_engine" :key="item" :title="item.description" />
</el-steps>
</div>
</div>
<div class="cardItem">
<div class="title">维保单号</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维修单号</span>
<span class="text">{{info.repair_order_no}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardItem">
<div class="title">维保工单信息</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维修等级</span>
<span class="text">{{info.maintenance_plan}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">故障类型</span>
<span class="text">{{info.fault_type}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">故障内容</span>
<span class="text">{{info.fault_description}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维保等级</span>
<span class="text">{{info.maintenance_plan}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">是否关机</span>
<span class="text">{{info.requires_shutdown}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">机房城市</span>
<span class="text">{{info.city}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">园区</span>
<span class="text">{{info.park_name}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">机房</span>
<span class="text">{{info.data_center_name}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">机架位</span>
<span class="text">{{info.rack_position}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">整机SN</span>
<span class="text">{{info.device_sn}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">整机厂商</span>
<span class="text">{{info.device_manufacturer}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">整机型号</span>
<span class="text">{{info.device_model}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">部件SN/Sp</span>
<span class="text">{{info.component_serial_no}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">部件厂商</span>
<span class="text">{{info.component_manufacturer}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">部件型号</span>
<span class="text">{{info.component_model}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">部件PN/Sp</span>
<span class="text">{{info.component_pn}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">SLA截止时间</span>
<span class="text">{{info.sla_expiration}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">剩余BD数</span>
<span class="text">{{info.bd_backup_count}}</span>
</el-col>
</el-row>
</div>
</div>
<slot name="review"></slot>
</div>
</template>
<script>
export default {
name: "detailView",
props:{
data:{
type:Object
}
},
watch:{
data(val){
this.info = val;
}
},
data(){
return{
info:{}
}
},
mounted() {
},
methods:{
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -3,9 +3,9 @@
<el-header> <el-header>
<div class="left-panel"> <div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button> <el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button>
<el-button type="success" :size="size" icon="sc-icon-Review" :disabled="selection.length==0" @click="batch_del">批量审核</el-button> <el-button type="success" :size="size" icon="sc-icon-OrderReview" :disabled="selection.length==0" @click="batch_review">批量审核</el-button>
<el-button type="primary" plain :size="size" icon="sc-icon-OrderSetup" :disabled="selection.length==0" @click="batch_del">提交维保</el-button> <el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="save_maintenance">提交维保</el-button>
<el-button type="primary" plain :size="size" icon="sc-icon-OrderSetup" :disabled="selection.length==0" @click="batch_del">下发维保</el-button> <el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="issued_maintenance">下发维保</el-button>
<el-button type="danger" plain :size="size" icon="el-icon-Delete" :disabled="selection.length==0" @click="batch_del"></el-button> <el-button type="danger" plain :size="size" icon="el-icon-Delete" :disabled="selection.length==0" @click="batch_del"></el-button>
<scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess"> <scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header> <template #header>
@ -53,12 +53,12 @@
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button> <el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑工单</el-dropdown-item> <el-dropdown-item @click="table_edit(scope.row)" icon="sc-icon-Edit">编辑工单</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除工单</el-dropdown-item> <el-dropdown-item @click="table_del(scope.row)" icon="sc-icon-Delete">删除工单</el-dropdown-item>
<el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See" divided>审核工单</el-dropdown-item> <el-dropdown-item @click="table_review(scope.row)" icon="sc-icon-OrderReview" divided>审核工单</el-dropdown-item>
<el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">工单详情</el-dropdown-item> <el-dropdown-item @click="table_show(scope.row)" icon="sc-icon-See">工单详情</el-dropdown-item>
<el-dropdown-item icon="sc-icon-OrderSetup" @click="table_setup(scope.row)" divided>提交维保</el-dropdown-item> <el-dropdown-item icon="sc-icon-SaveMaintenance" @click="table_submit(scope.row)" divided>提交维保</el-dropdown-item>
<el-dropdown-item icon="sc-icon-OrderSetup" @click="table_setup(scope.row)">下发维保</el-dropdown-item> <el-dropdown-item icon="sc-icon-OrderMaintenance" @click="table_send(scope.row)">下发维保</el-dropdown-item>
<el-dropdown-item icon="sc-icon-OrderLog" @click="table_logs(scope.row)" divided>工单日志</el-dropdown-item> <el-dropdown-item icon="sc-icon-OrderLog" @click="table_logs(scope.row)" divided>工单日志</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
@ -158,7 +158,7 @@ export default {
// //
add(){ add(){
eventBus.$emit('tagClose','/order/create-order',{id:this.emailId}); eventBus.$emit('tagClose','/order/create-order');
}, },
// //
@ -192,15 +192,16 @@ export default {
// //
table_edit(row){ table_edit(row){
this.dialog.save = true eventBus.$emit('tagClose','/order/create-order',{id:row.id});
this.$nextTick(() => {
this.$refs.saveDialog.open('edit').setData(row)
})
}, },
// //
table_show(row){ table_show(row){
eventBus.$emit('tagClose','/order/order-info',{id:row.id}); eventBus.$emit('tagClose','/order/order-info',{id:row.id});
}, },
//
table_review(row){
eventBus.$emit('tagClose','/order/preview-order',{id:row.id});
},
// //
async table_del(row){ async table_del(row){
this.$confirm(`确定删除 ${row.repair_order_no} 吗?`, '提示', { this.$confirm(`确定删除 ${row.repair_order_no} 吗?`, '提示', {
@ -210,7 +211,6 @@ export default {
const res = await this.$API.orders.order.maintenance.delete.post(reqData); const res = await this.$API.orders.order.maintenance.delete.post(reqData);
if(res.code == 200){ if(res.code == 200){
this.$refs.table.refresh(); this.$refs.table.refresh();
this.$message.success("删除成功")
} }
}).catch(()=>{}) }).catch(()=>{})
}, },
@ -223,30 +223,68 @@ export default {
const res = await this.$API.orders.order.maintenance.delete.post(reqData); const res = await this.$API.orders.order.maintenance.delete.post(reqData);
if(res.code == 200){ if(res.code == 200){
this.$refs.table.refresh(); this.$refs.table.refresh();
this.$message.success("删除成功")
} }
}).catch(()=>{}) }).catch(()=>{})
}, },
async batch_review(){
this.$messageBox.prompt('如果拒绝,请输入审核不通过的理由。', '审核', {
confirmButtonText: '拒绝',
cancelButtonText: '通过',
cancelButtonClass:'cancelBtn el-button--primary',
confirmButtonClass:'saveBtn el-button--danger',
}).then(async ({value}) => {
let params = {
order_ids:this.selection.map(em=>em.id),
status:false,
opinion:value
}
const res = await this.$API.orders.order.maintenance.review.post(params);
if(res.code == 200){
this.$refs.table.refresh();
}
}).catch(async () => {
let params = {
order_ids: this.selection.map(em => em.id),
status: true,
}
const res = await this.$API.orders.order.maintenance.review.post(params);
if (res.code == 200) {
this.$refs.table.refresh();
}
})
},
async save_maintenance() {
const params = {order_ids: this.selection.map(em => em.id)};
const res = await this.$API.orders.order.maintenance.submit.post(params);
if (res.code == 200) {
this.$refs.table.refresh();
this.$message.success("操作成功")
}
},
async issued_maintenance() {
const params = {order_ids: this.selection.map(em => em.id)};
const res = await this.$API.orders.order.maintenance.send.post(params);
if (res.code == 200) {
this.$refs.table.refresh();
this.$message.success("操作成功")
}
},
// //
table_setup(){ async table_submit(row){
// row eventBus.$emit('tagClose','/order/submit-order',{id:row.id});
// this.$router.push({ },
// path: '/order/add-permission', async table_send(row) {
// query: { let params = {
// id: row.id, order_ids:[row.id]
// name:row.name }
// } const res = await this.$API.orders.order.maintenance.send.post(params);
// }) if (res.code == 200) {
this.$refs.table.refresh();
}
}, },
// //
table_logs(row){ table_logs(row){
this.$router.push({ eventBus.$emit('tagClose','/order/order-logs',{id:row.id});
path: '/order/order-logs',
query: {
id: row.id,
name:row.name
}
})
}, },
// //
selectionChange(selection){ selectionChange(selection){
@ -303,4 +341,12 @@ export default {
height: 20px; height: 20px;
margin: 0 auto; margin: 0 auto;
} }
.el-message-box{
::v-deep .cancelBtn{
}
::v-deep .saveBtn{
}
}
</style> </style>

View File

@ -1,24 +1,103 @@
<template> <template>
<div></div> <el-container>
<el-main class="orderMain" v-loading="loading" element-loading-text="加载中...">
<el-scrollbar>
<detailView :data="info">
<template #review>
<div class="reviewBox">
<el-input type="textarea" v-model="opinion" min="4" placeholder="请填写具体原因"></el-input>
<div class="btnView">
<el-button type="primary" :size="size" @click="save(1)" :loading="confirmLoading">审核通过</el-button>
<el-button type="danger" :size="size" @click="save(2)" :loading="cancelLoading">审核拒绝</el-button>
</div>
</div>
</template>
</detailView>
</el-scrollbar>
</el-main>
</el-container>
</template> </template>
<script> <script>
import detailView from "@/views/order/orderList/detailView";
export default { export default {
name: "preview-order", name: "preview-order",
components:{
detailView
},
data(){ data(){
return{ return{
size:'small',
loading:false,
confirmLoading:false,
cancelLoading:false,
opinion:"",
params:{
order_id:Number(this.$route.query.id)
},
info:{}
} }
}, },
mounted() { mounted() {
this.getData();
}, },
methods:{ methods:{
async getData() {
this.loading = true;
const res = await this.$API.orders.order.maintenance.info.post(this.params);
if(res.code == 200){
if(res.data.process_engine){
res.data.process_engine = this.processList(res.data.process_engine).processedList;
res.data.process_num = this.processList(res.data.process_engine).num;
}
this.info = res.data;
}
this.loading = false;
},
processList(list) {
let obj = {
num:0,
processedList:this.$TOOL.objCopy(list)
}
let foundNodeTrue = false;
for (let i = 0; i < obj.processedList.length; i++) {
if (obj.processedList[i].node === true) {
foundNodeTrue = true;
obj.processedList[i].status = 'finish';
obj.num = i;
} else if (!foundNodeTrue) {
obj.processedList[i].status = 'success';
}
if (foundNodeTrue && obj.processedList[i].node !== true) break;
}
return obj;
},
async save(type) {
let params = {
order_ids: [this.params.order_id],
status: type == 1?true:false,
opinion: this.opinion
}
if (type == 1) {
delete params.opinion
this.confirmLoading = true;
}else{
this.cancelLoading = true;
}
const res = await this.$API.orders.order.maintenance.review.post(params);
if (res.code == 200) {
await this.getData();
}
this.confirmLoading = false;
this.cancelLoading = false;
}
} }
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.btnView{
margin-top: 15px;
display: flex;justify-content: flex-end;
}
</style> </style>

View File

@ -0,0 +1,246 @@
<template>
<el-container>
<el-main class="orderMain" v-loading="loading" element-loading-text="加载中...">
<el-scrollbar>
<div class="cardBox">
<div class="headerView">
<div class="title">工单时间</div>
<div class="status">
<span class="name">当前状态</span>
<span class="text">{{info.business_status}}</span>
</div>
</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">创建时间</span>
<span class="text">{{info.created_at}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">PE确认时间</span>
<span class="text">{{info.pe_confirmation_time}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">过保时间</span>
<span class="text">{{info.warranty_end_date}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardBox footerCard">
<div class="cardItem">
<div class="title">流程进度</div>
<div class="cardBody">
<el-steps class="orderSteps" :active="info.process_num" align-center>
<el-step :status="item.status" v-for="item in info.process_engine" :key="item" :title="item.description" />
</el-steps>
</div>
</div>
<div class="cardItem">
<div class="title">维保单号</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维修单号</span>
<span class="text">{{info.repair_order_no}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardItem">
<div class="title">维保工单信息</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维修等级</span>
<span class="text">{{info.maintenance_plan}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">故障类型</span>
<span class="text">{{info.fault_type}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">故障内容</span>
<span class="text">{{info.fault_description}}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label">维保等级</span>
<span class="text">{{info.maintenance_plan}}</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label">是否关机</span>
<span class="text">{{info.requires_shutdown}}</span>
</el-col>
</el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row>
<el-col :span="8" :lg="6">
<span class="label labelText">机房城市</span>
<span class="text">
<el-input :size="size" v-model="info.city" placeholder="机房城市"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">园区</span>
<span class="text">
<el-input :size="size" v-model="info.park_name" placeholder="园区"></el-input>
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label labelText">机房</span>
<span class="text">
<el-input :size="size" v-model="info.data_center_name" placeholder="机房"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">机架位</span>
<span class="text">
<el-input :size="size" v-model="info.rack_position" placeholder="机架位"></el-input>
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label labelText">整机SN</span>
<span class="text">
<el-input :size="size" v-model="info.device_sn" placeholder="整机SN"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">整机厂商</span>
<span class="text">
<el-input :size="size" v-model="info.device_manufacturer" placeholder="整机厂商"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">整机型号</span>
<span class="text">
<el-input :size="size" v-model="info.device_model" placeholder="整机型号"></el-input>
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label labelText">部件SN/Sp</span>
<span class="text">
<el-input :size="size" v-model="info.component_serial_no" placeholder="部件SN/Sp"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">部件厂商</span>
<span class="text">
<el-input :size="size" v-model="info.component_manufacturer" placeholder="部件厂商"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">部件型号</span>
<span class="text">
<el-input :size="size" v-model="info.component_model" placeholder="部件型号"></el-input>
</span>
</el-col>
</el-row>
<el-row>
<el-col :span="8" :lg="6">
<span class="label labelText">部件PN/Sp</span>
<span class="text">
<el-input :size="size" v-model="info.component_pn" placeholder="部件PN/Sp"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">SLA截止时间</span>
<span class="text">
<el-input :size="size" v-model="info.sla_expiration" placeholder="SLA截止时间"></el-input>
</span>
</el-col>
<el-col :span="8" :lg="6">
<span class="label labelText">剩余BD数</span>
<span class="text">
<el-input :size="size" v-model="info.bd_backup_count" placeholder="剩余BD数"></el-input>
</span>
</el-col>
</el-row>
</div>
</div>
<div class="btnView">
<el-button type="primary" :size="size" @click="save" :loading="saveLoading">确认提交</el-button>
</div>
</div>
</el-scrollbar>
</el-main>
</el-container>
</template>
<script>
export default {
name: "submit-order",
data(){
return{
size:"small",
loading:false,
saveLoading:false,
params:{
order_id:Number(this.$route.query.id)
},
info:{}
}
},
mounted() {
this.getData();
},
methods:{
async getData() {
this.loading = true;
const res = await this.$API.orders.order.maintenance.info.post(this.params);
if(res.code == 200){
if(res.data.process_engine){
res.data.process_engine = this.processList(res.data.process_engine).processedList;
res.data.process_num = this.processList(res.data.process_engine).num;
}
this.info = res.data;
}
this.loading = false;
},
processList(list) {
let obj = {
num:0,
processedList:this.$TOOL.objCopy(list)
}
let foundNodeTrue = false;
for (let i = 0; i < obj.processedList.length; i++) {
if (obj.processedList[i].node === true) {
foundNodeTrue = true;
obj.processedList[i].status = 'finish';
obj.num = i;
} else if (!foundNodeTrue) {
obj.processedList[i].status = 'success';
}
if (foundNodeTrue && obj.processedList[i].node !== true) break;
}
return obj;
},
async save() {
const params = {order_ids: [this.params.order_id]};
this.saveLoading = true;
const res = await this.$API.orders.order.maintenance.submit.post(params);
if (res.code == 200) {
await this.getData();
}
this.saveLoading = false;
},
}
}
</script>
<style scoped lang="scss">
.btnView{
text-align: right;
}
</style>