增加维修详情

This commit is contained in:
龙运模 2024-10-23 17:01:21 +08:00
parent 3d958f9346
commit 527af5d028
8 changed files with 373 additions and 26 deletions

View File

@ -76,6 +76,13 @@ export default {
return await http.post(this.url, params);
},
},
info:{
url: `${config.API_URL}/repair.order.detail`,
name: "维修单详情",
post: async function (params) {
return await http.post(this.url, params);
},
},
confirm:{
url: `${config.API_URL}/repair.order.confirm`,
name: "维修工单确认",

View File

@ -0,0 +1,122 @@
<template>
<div class="selectedBox">
<div class="selected" @click.stop="downClick">
<span class="name">{{selectedName}}</span>
<el-icon class="icon" :class="downShow?'selectedIcon':''"><el-icon-arrow-down /></el-icon>
</div>
<slot name="down">
<div class="downMain" v-bind="$attrs" v-if="downShow">
<div class="item" :class="selectedValue===item.value?'itemTrue':''" @click="itemClick(item)" v-for="(item,index) in list" :key="index">{{item.name}}</div>
</div>
</slot>
</div>
</template>
<script>
import {eventBus} from "@/utils/eventBus";
export default {
name: "",
data(){
return{
downShow:false,
selectedName:'',
selectedValue:'',
list:[]
}
},
props:{
listData:{
type:Array
},
name:{
type:String
},
value:{
type:[String,Number]
}
},
watch:{
listData:{
handler(val){
this.list = val;
},
deep:true,
immediate:true
},
name:{
handler(val){
this.selectedName = val
},
immediate:true
},
value:{
handler(val){
this.selectedValue = val
},
immediate:true
}
},
mounted() {
},
methods:{
downClick(){
this.downShow = !this.downShow;
eventBus.$emit('searchDownShow',this.downShow);
},
downOut(){
this.downShow = false;
},
itemClick(item){
this.selectedName = item.name;
this.selectedValue = item.value;
this.downShow = false;
this.$emit('scSelect',{name:this.selectedName,value:this.selectedValue});
}
}
}
</script>
<style scoped lang="scss">
.selectedBox{
position: relative;
}
.selected{
padding: 0 10px;
color: #555;
display: flex;align-items: center;
height: 30px;
border-right: 1px solid #e9e9e9;
cursor: pointer;
.name{margin-right: 4px;}
.selectedIcon{
transform: rotate(180deg);
}
}
.downMain{
position: absolute;
left: 0;
top: 35px;
z-index: 100;
background: var(--el-bg-color);
width: 100%;
color: #555;
border-radius: 0 0 4px 4px;
background-color: var(--el-fill-color-blank);
transition: var(--el-transition-duration);
transform: translateZ(0);
box-shadow: 0 6px 4px rgba(180, 207, 235, 0.25);
//border: 1px solid var(--el-border-color-light);
.item{
padding: 0 10px;text-align: center;
}
.item:hover{
background-color: var(--el-color-primary-light-9);
color: var(--el-color-primary);
cursor: pointer;
}
.itemTrue{
color: var(--el-color-primary);
}
}
</style>

View File

@ -57,13 +57,13 @@
async getRemoteData(){
this.loading = true
this.dicParams[config.request.name] = this.dic
var res = {}
let res = {};
if(this.apiObj){
res = await this.apiObj.get(this.params)
}else if(this.dic){
res = await config.dicApiObj.get(this.params)
}
var response = config.parseData(res)
const response = config.parseData(res);
this.options = response.data
this.loading = false
this.initloading = false

View File

@ -15,6 +15,17 @@ const routes = [
title: "系统搜索",
},
},
{
name: "repair-info",
path:"/repair-info",
component:"order/repairList/repair-info",
meta: {
code:"",
icon: "sc-icon-Home",
title: "维修明细",
},
},
{
name: "home",

View File

@ -14,8 +14,8 @@
background: var(--el-color-white);
padding: 0;
box-shadow: none;
border-radius: 8px 0 0 8px;
border: 0;
border-radius: 4px 0 0 4px;
//border-top: 2px solid #c4c7ce;
//border-bottom: 2px solid #c4c7ce;
//border-left: 2px solid #c4c7ce;
@ -56,6 +56,11 @@
}
}
}
.searchInputNoBorder{
.el-input-group__prepend{
border-radius: 4px 0 0 0;
}
}
.searchInput .is-focus{
border-color: var(--el-color-primary);
}

View File

@ -1,20 +1,10 @@
<template>
<el-container class="searchBox">
<el-container class="searchBox" @click="scSelectHide">
<el-header class="searchHeader">
<div class="searchHeaderBack">
<el-input class="searchInput" v-focus type="text" size="large" v-model="keyword">
<el-input class="searchInput" :class="downBorder?'searchInputNoBorder':''" v-focus type="text" size="large" v-model="keyword">
<template #prepend>
<el-dropdown class="searchDrop" trigger="click" @command="dropdownChange">
<span class="dropTitle el-dropdown-link">
{{dropdownName}} <el-icon class="el-icon--right"><el-icon-arrow-down /></el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="a">维保工单</el-dropdown-item>
<el-dropdown-item command="b">维修工单</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<scSelect ref="scSelect" :listData="list" :name="dropdownName" :value="dropdownType" @scSelect="dropdownChange"></scSelect>
</template>
<template #append>
<div class="searchBtn" @click="searchClick">
@ -189,8 +179,13 @@
</template>
<script>
import scSelect from '/src/components/scSearchSelect';
import {eventBus} from "@/utils/eventBus";
export default {
name: "",
components:{
scSelect
},
data(){
return{
size:'small',
@ -198,6 +193,11 @@ export default {
keyword:"",
dropdownName:"维保工单",
dropdownType:'a',
downBorder:false,
list:[
{name:'维保工单',value:'a'},
{name:'维修工单',value:'b'},
],
params:{
repair_order_no:{
operator:"like",
@ -238,8 +238,20 @@ export default {
},
mounted() {
this.getStatusList();
eventBus.$on('searchDownShow', this.downResult);
},
unmounted() {
eventBus.$off('searchDownShow', this.downResult);
},
methods:{
downResult(e){
this.downBorder = e;
},
scSelectHide(){
this.$refs.scSelect.downShow = false;
this.downBorder = false;
},
async searchClick() {
let params = this.setObj();
this.loading = true;
@ -317,13 +329,9 @@ export default {
return obj;
},
dropdownChange(e){
this.dropdownType = e;
this.dropdownType = e.value;
this.dropdownName = e.name;
this.rows = [];
if(e === "a"){
this.dropdownName = '维保工单';
}else if(e === 'b'){
this.dropdownName = '维修工单'
}
}
}
}

View File

@ -28,9 +28,9 @@
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item icon="sc-icon-MaintenanceSetup">执行维修</el-dropdown-item>
<el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">工单详情</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-MaintenanceSetup" @click="table_upkeep(scope.row)">执行维修</el-dropdown-item>
<el-dropdown-item icon="sc-icon-See" @click="table_show(scope.row, 'see')">工单详情</el-dropdown-item>
<el-dropdown-item icon="sc-icon-OrderLog" @click="table_logs(scope.row)" divided>工单日志</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
@ -163,9 +163,13 @@ export default {
this.$refs.saveDialog.open()
})
},
//
table_upkeep(row){
eventBus.$emit('tagClose','/repair-info',{id:row.order_id});
},
//
table_show(row){
eventBus.$emit('tagClose','/order/order-info',{id:row.id});
eventBus.$emit('tagClose','/order/order-info',{id:row.order_id});
},
//
table_edit(row){

View File

@ -0,0 +1,190 @@
<template>
<el-container class="mainView">
<el-main>
<el-scrollbar style="width: 100%;">
<div class="title">维修单信息</div>
<div class="boxList boxListBorderBottom">
<el-row :gutter="24">
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">维修单号</span>
<div class="text">
<el-input disabled v-model="info.repair_order_no" :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">PE确认时间</span>
<div class="text">
<el-input disabled v-model="info.pe_confirmation_time" :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">故障类型</span>
<div class="text">
<el-input disabled v-model="info.fault_type" :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">故障描述</span>
<div class="text">
<el-input disabled v-model="info.fault_description" :size="size"></el-input>
</div>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">保修期结束</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
</el-row>
</div>
<div class="title">部件信息</div>
<div class="boxList boxListBorderBottom">
<el-row :gutter="24">
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">部件序列号</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">部件厂商</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">部件型号</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">零部件PN号</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<span></span>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">不良原因</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">不良现象</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">现场步骤分析</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
<el-col :span="6" :lg="6" :md="8" :xs="24">
<span class="name">SLA不达标原因</span>
<div class="text">
<el-input disabled :size="size"></el-input>
</div>
</el-col>
</el-row>
<div class="btnAdd">
<el-button type="primary" plain :size="size">添加部件信息</el-button>
<div class="cardBody">
<sc-table ref="table" :data="info.component_info" style="width: 100%;" :hidePagination="true" :hideDo="true" :hideEmpty="true" :size="size">
<sc-table-column type="index" label="序号" width="65"></sc-table-column>
<sc-table-column prop="component_serial_no" label="部件SN/Sp" :show-overflow-tooltip="true" width="160"></sc-table-column>
<sc-table-column prop="component_manufacturer" label="部件厂商" :show-overflow-tooltip="true" width="130"></sc-table-column>
<sc-table-column prop="component_model" label="部件型号" :show-overflow-tooltip="true" width="160"></sc-table-column>
<sc-table-column prop="component_pn" label="部件PN/Sp" :show-overflow-tooltip="true" width="150"></sc-table-column>
<sc-table-column prop="bd_backup_count" label="甚于BD数" :show-overflow-tooltip="true" width="120"></sc-table-column>
</sc-table>
</div>
</div>
</div>
<div class="btnBox">
<el-button type="primary" @click="submit">提交维修</el-button>
</div>
</el-scrollbar>
</el-main>
</el-container>
</template>
<script>
export default {
name: "",
data(){
return{
size:'small',
params:{
order_id:Number(this.$route.query.id)
},
info:{
component_info:[],
}
}
},
mounted() {
this.getInfo();
},
unmounted() {
},
methods:{
async getInfo() {
const res = await this.$API.orders.order.repair.info.post(this.params);
if(res.code == 200){
this.info = res.data;
}
},
async submit() {
const res = await this.$API.orders.order.repair.submit.post();
if(res.code == 200){
console.log(res.data)
}
},
}
}
</script>
<style scoped lang="scss">
.mainView{background: #fff;}
.title{color: #222;font-weight: 600;}
.boxListBorderBottom{
border-bottom: 1px solid #e8e8e8;
padding-bottom: 5px;
margin-bottom: 15px;
}
.boxList{
margin-top: 15px;
.el-row{
margin: 0 !important;
padding: 0;
.el-col{
margin: 0 0 12px 0;
padding: 0;
}
}
.name{
display: inline-block;
margin-bottom: 6px;
}
}
.btnBox{
text-align: right;
}
.cardBody{
margin-top: 15px;
}
</style>