巡检计划和开发票接口联调

master
zhangdi 1 year ago
parent 1266e1d7d3
commit 92463905d3
  1. 35
      src/api/labManagement/repair.js
  2. 1
      src/api/labManagement/task.js
  3. 401
      src/views/businessManagement/inspection/repair.vue
  4. 3
      src/views/businessManagement/ordinary.vue
  5. 13
      src/views/operation/hand.vue

@ -70,3 +70,38 @@ export const servicemanSubmit = (data) =>{
data data
}) })
} }
// 客户确认完成
export const customerConfirmFinish = (data) =>{
return request({
url:'/api/lab-ops/maintenance/repair-customer-confirm-finish',
method:'post',
data
})
}
// 客户确认未完成
export const customerRefuseFinish = (data) =>{
return request({
url:'/api/lab-ops/maintenance/repair-customer-refuse-finish',
method:'post',
data
})
}
//确认付款完成
export const repairServiceConfirm = (data) =>{
return request({
url:'/api/lab-ops/maintenance/repair-service-confirm',
method:'post',
data
})
}
// 客服确认开发票
export const repairConfirmConfirm = (data) =>{
return request({
url:'/api/lab-ops/maintenance/repair-service-confirm-invoice',
method:'post',
data
})
}

@ -86,3 +86,4 @@ export const customerRefuse = (data) =>{
data data
}) })
} }

@ -1,75 +1,55 @@
<template> <template>
<basic-container style="max-height: 800px; overflow: hidden"> <basic-container style="max-height: 800px; overflow: hidden">
<avue-crud <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" v-model="form"
:option="option" :permission="permissionList" :before-open="beforeOpen" :before-close="beforeClose"
:table-loading="loading" @selection-change="selectionChange" @search-change="searchChange" @search-reset="searchReset"
:data="data" @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
:page.sync="page"
ref="crud"
v-model="form"
:permission="permissionList"
:before-open="beforeOpen"
:before-close="beforeClose"
@selection-change="selectionChange"
@search-change="searchChange"
@search-reset="searchReset"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad"
>
<template slot-scope="{ row }" slot="repairStatus"> <template slot-scope="{ row }" slot="repairStatus">
<el-tag size="small" :type="row.repairStatus == 0 ? 'info' <el-tag size="small" :type="row.repairStatus == 0 ? 'info'
: row.approvePoint != '' && (row.approvePoint == '客户审核维修方案' || row.approvePoint == '主管审核维修方案') && row.repairStatus == 1 ? 'danger' : row.approvePoint != '' && (row.approvePoint == '客户审核维修方案' || row.approvePoint == '主管审核维修方案') && row.repairStatus == 1 ? 'danger'
: row.repairStatus == 1 ? '' : row.repairStatus == 1 ? ''
: (row.repairStatus == 2 || row.repairStatus == 3) ? '' : (row.repairStatus == 2 || row.repairStatus == 3) ? ''
: row.repairStatus == 4 ? 'warning' : row.repairStatus == 4 ? 'warning'
: (row.repairStatus == 5 || row.repairStatus == 6) ? 'success' : '' " : (row.repairStatus == 5 || row.repairStatus == 6) ? 'success' : ''">
>
{{ row.repairStatus == 0 ? "无需维修" {{ row.repairStatus == 0 ? "无需维修"
: row.approvePoint != '' && (row.approvePoint == '客户审核维修方案' || row.approvePoint == '主管审核维修方案') && row.repairStatus == 1 ? '已驳回' : row.approvePoint != '' && (row.approvePoint == '客户审核维修方案' || row.approvePoint == '主管审核维修方案') &&
row.repairStatus == 1 ? '已驳回'
: row.repairStatus == 1 ? "待提交" : row.repairStatus == 1 ? "待提交"
: row.repairStatus == 2 ? "待审批" : row.repairStatus == 2 ? "待审批"
: row.repairStatus == 3 ? '待确认' : row.repairStatus == 3 ? '待确认'
: row.repairStatus == 4 ? '维修中' : row.repairStatus == 4 ? '维修中'
: row.repairStatus == 5 ? '维修完成' : row.repairStatus == 5 ? '维修完成'
: "" : row.repairStatus == 6 ? '待付款' : row.repairStatus == 7 ? '待开发票' : row.repairStatus == 8 ? '已开发票' : ""
}} }}
</el-tag> </el-tag>
</template> </template>
<template slot-scope="scope" slot="menuLeft"> <template slot-scope="scope" slot="menuLeft">
<el-button <el-button size="small" type="primary" @click="handleAdd">确认</el-button>
size="small" <el-button size="small" @click="clickInvoice">开具发票</el-button>
type="primary"
@click="handleAdd"
>确认</el-button
>
</template> </template>
<template slot-scope="{ row }" slot="menu"> <template slot-scope="{ row }" slot="menu">
<el-button @click="handleView(row)">查看</el-button> <el-button @click="handleView(row)" v-show="permission.repairDetails">查看</el-button>
<el-button @click="handleSubmit(row)" v-show="row.repairStatus == 1">提交</el-button> <el-button @click="handleSubmit(row)" v-show="permission.repairsubmit && row.repairStatus == 1">提交</el-button>
<el-button @click="handleCheck(row)" v-show="row.repairStatus == 2">审核</el-button> <el-button @click="handleCheck(row)" v-show="permission.repairapprove && row.repairStatus == 2">审核</el-button>
<el-button v-show="row.repairStatus == 3" @click="handleAccept(row)">确认</el-button> <el-button v-show="permission.repairconfirm && row.repairStatus == 3" @click="handleAccept(row)">确认</el-button>
<el-button v-show="row.repairStatus == 4" @click="handleFinish(row)">维修完成</el-button> <el-button v-show="permission.repaircomplete && row.repairStatus == 4"
@click="handleFinish(row)">维修完成</el-button>
<el-button v-show="permission.repairevaluate && row.repairStatus == 5"
@click="handleEvaluate(row)">评价</el-button>
<el-button v-show="permission.confirmpayment && row.repairStatus == 6"
@click="paymentFinish(row)">确认付款</el-button>
</template> </template>
</avue-crud> </avue-crud>
<el-dialog <el-dialog title="巡检异常维修" :visible.sync="dialogerror" :append-to-body="true" width="70%">
title="巡检异常维修"
:visible.sync="dialogerror"
:append-to-body="true"
width="70%"
>
<div style="height: 500px; overflow: auto"> <div style="height: 500px; overflow: auto">
<el-form ref="errorForm" :model="errorForm" :rules="addRules" label-width="120px" label-position="left"> <el-form ref="errorForm" :model="errorForm" :rules="addRules" label-width="120px" label-position="left">
<div> <div>
<div <div style="
style="
color: #101010; color: #101010;
font-size: 20px; font-size: 20px;
font-weight: 550; font-weight: 550;
margin-bottom: 20px; margin-bottom: 20px;
" ">
>
基本信息 基本信息
</div> </div>
<el-form-item label="单位名称" prop="deptName"> <el-form-item label="单位名称" prop="deptName">
@ -77,14 +57,12 @@
</el-form-item> </el-form-item>
</div> </div>
<div> <div>
<div <div style="
style="
color: #101010; color: #101010;
font-size: 20px; font-size: 20px;
font-weight: 550; font-weight: 550;
margin-bottom: 20px; margin-bottom: 20px;
" ">
>
巡检异常清单 巡检异常清单
</div> </div>
<el-form-item label="异常清单"> <el-form-item label="异常清单">
@ -116,14 +94,12 @@
</el-form-item> </el-form-item>
</div> </div>
<div v-show="errorForm.repairStatus == 2"> <div v-show="errorForm.repairStatus == 2">
<div <div style="
style="
color: #101010; color: #101010;
font-size: 20px; font-size: 20px;
font-weight: 550; font-weight: 550;
margin-bottom: 20px; margin-bottom: 20px;
" ">
>
主管审核 主管审核
</div> </div>
<el-form-item label="审核结果"> <el-form-item label="审核结果">
@ -137,14 +113,12 @@
</el-form-item> </el-form-item>
</div> </div>
<div v-show="errorForm.repairStatus == 3"> <div v-show="errorForm.repairStatus == 3">
<div <div style="
style="
color: #101010; color: #101010;
font-size: 20px; font-size: 20px;
font-weight: 550; font-weight: 550;
margin-bottom: 20px; margin-bottom: 20px;
" ">
>
客户确认 客户确认
</div> </div>
<el-form-item label="审核结果"> <el-form-item label="审核结果">
@ -157,6 +131,134 @@
<el-input type="textarea" v-model="errorForm.approveRemark" style="width: 98%;"></el-input> <el-input type="textarea" v-model="errorForm.approveRemark" style="width: 98%;"></el-input>
</el-form-item> </el-form-item>
</div> </div>
<div v-show="errorForm.repairStatus == 5">
<div style="
color: #101010;
font-size: 20px;
font-weight: 550;
margin-bottom: 20px;
">
维修效果确认
</div>
<el-form-item label="是否维修完成">
<el-select placeholder="请确认是否维修完成" style="width: 98%;" v-model="errorForm.approveResult1"
@change="changeResult">
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item label="维修未完成原因" v-show="rowStatus == 5 && errorForm.approveResult1 == 0">
<el-input type="textarea" v-model="errorForm.approveRemark" placeholder="请输入维修未完成原因"
style="width: 98%;"></el-input>
</el-form-item>
<div v-show="(rowStatus == 5 || isEvalute) && errorForm.approveResult1 == 1">
<div style="
color: #101010;
font-size: 20px;
font-weight: 550;
margin-bottom: 20px;
">
评价
</div>
<div>
<p>1.您对本次维修的质量方面满意吗</p>
<div style="display:flex;">
<div style="width: 150px;
border-radius: 5px;
height: 30px;
text-align: center;
line-height: 30px;
margin-right: 20px;
cursor:pointer;"
:style="{ background: errorForm.isOkQuality == '1' ? '#3a62d733' : 'rgb(239, 239, 239)', color: errorForm.isOkQuality == '1' ? '#3a62d7' : '#4f4f4f' }"
@click="clickQualityYes">满意</div>
<div style="width: 150px;
border-radius: 5px;
height: 30px;
background: rgb(239, 239, 239);
text-align: center;
line-height: 30px;
margin-right: 20px;cursor:pointer;"
:style="{ background: errorForm.isOkQuality == '0' ? '#3a62d733' : 'rgb(239, 239, 239)', color: errorForm.isOkQuality == '0' ? '#3a62d7' : '#4f4f4f' }"
@click="clickQualityNo">不满意</div>
</div>
</div>
<div>
<p>2.您对本次维修的安全方面满意吗</p>
<div style="display:flex;">
<div style="width: 150px;
border-radius: 5px;
height: 30px;
background: rgb(239, 239, 239);
text-align: center;
line-height: 30px;
margin-right: 20px;cursor:pointer;"
:style="{ background: errorForm.isOkSecure == '1' ? '#3a62d733' : 'rgb(239, 239, 239)', color: errorForm.isOkSecure == '1' ? '#3a62d7' : '#4f4f4f' }"
@click="clickSafeYes">满意</div>
<div style="width: 150px;
border-radius: 5px;
height: 30px;
background: rgb(239, 239, 239);
text-align: center;
line-height: 30px;
margin-right: 20px;cursor:pointer;"
:style="{ background: errorForm.isOkSecure == '0' ? '#3a62d733' : 'rgb(239, 239, 239)', color: errorForm.isOkSecure == '0' ? '#3a62d7' : '#4f4f4f' }"
@click="clickSafeNo">不满意</div>
</div>
</div>
<div>
<p>3.您对本次维修的时效方面满意吗</p>
<div style="display:flex;margin-bottom:30px;">
<div style="width: 150px;
border-radius: 5px;
height: 30px;
background: rgb(239, 239, 239);
text-align: center;
line-height: 30px;
margin-right: 20px;cursor:pointer;"
:style="{ background: errorForm.isOkValidity == '1' ? '#3a62d733' : 'rgb(239, 239, 239)', color: errorForm.isOkValidity == '1' ? '#3a62d7' : '#4f4f4f' }"
@click="clickTimeYes">满意</div>
<div style="width: 150px;
border-radius: 5px;
height: 30px;
background: rgb(239, 239, 239);
text-align: center;
line-height: 30px;
margin-right: 20px;cursor:pointer;"
:style="{ background: errorForm.isOkValidity == '0' ? '#3a62d733' : 'rgb(239, 239, 239)', color: errorForm.isOkValidity == '0' ? '#3a62d7' : '#4f4f4f' }"
@click="clickTimeNo">不满意</div>
</div>
</div>
</div>
<div v-show="(rowStatus == 5 || isEvalute) && errorForm.approveResult1 == 1">
<div style="
color: #101010;
font-size: 20px;
font-weight: 550;
margin-bottom: 20px;
">
签名
</div>
<div v-show="isEvalute">
<avue-sign ref="sign"></avue-sign>
<el-button @click="clearName">清空</el-button>
<el-button @click="confirmName">确定</el-button>
</div>
<div v-show="!isEvalute">
<img :src="errorForm.signatureUrl" alt="">
</div>
<el-form-item label="签名人" prop="signaturePerson">
<el-input :readonly="!isEvalute" placeholder="请输入签名人" v-model="errorForm.signaturePerson"></el-input>
</el-form-item>
<el-form-item label="签名时间" prop="signatureTime">
<el-date-picker :disabled="viewType == 'view'" v-model="errorForm.signatureTime" type="datetime"
style="width:98%;" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择签名时间">
</el-date-picker>
</el-form-item>
</div>
</div>
</el-form> </el-form>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@ -169,7 +271,8 @@
</template> </template>
<script> <script>
import {getRepairPage,solutionSave,solutionSubmit,supervisorConfirm,supervisorRefuse,customerConfirm,customerRefuse,servicemanSubmit} from '@/api/labManagement/repair' import { getRepairPage, solutionSave, solutionSubmit, supervisorConfirm, supervisorRefuse, customerConfirm, customerRefuse, servicemanSubmit, repairServiceConfirm, customerConfirmFinish, customerRefuseFinish, repairConfirmConfirm } from '@/api/labManagement/repair'
import { addFile } from '@/api/operation/hand'
import { getDetail } from '@/api/labManagement/task' import { getDetail } from '@/api/labManagement/task'
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
export default { export default {
@ -249,7 +352,11 @@ export default {
total: 0, total: 0,
}, },
selectedList: [], selectedList: [],
viewType:'' viewType: '',
isEvalute: false,
rowStatus: '',
nameImg: '',
} }
}, },
computed: { computed: {
@ -305,6 +412,65 @@ export default {
// this.errorForm = row // this.errorForm = row
// this.dialogerror = true // this.dialogerror = true
}, },
//
handleEvaluate(row) {
getDetail({ id: row.id }).then(res => {
this.rowStatus = res.data.data.repairStatus
this.viewType = 'evaluate'
this.errorForm = res.data.data
this.dialogerror = true
this.isEvalute = true
this.errorForm.isOkValidity = ''
this.errorForm.isOkQuality = ''
this.errorForm.isOkSecure = ''
let data = this.checkDeepData(res.data.data.details)
this.errorForm.tableData = data
})
},
//
changeResult(val) {
this.isFinish = val
console.log(this.isFinish)
},
clickQualityYes() {
if (this.viewType == 'evaluate') {
this.errorForm.isOkQuality = 1
}
},
clickQualityNo() {
if (this.viewType == 'evaluate') {
this.errorForm.isOkQuality = 0
}
},
clickSafeYes() {
if (this.viewType == 'evaluate') {
this.errorForm.isOkSecure = 1
}
},
clickSafeNo() {
if (this.viewType == 'evaluate') {
this.errorForm.isOkSecure = 0
}
},
clickTimeYes() {
if (this.viewType == 'evaluate') {
this.errorForm.isOkValidity = 1
}
},
clickTimeNo() {
if (this.viewType == 'evaluate') {
this.errorForm.isOkValidity = 0
}
},
clearName() {
this.$refs.sign.clear()
this.nameImg = ''
},
confirmName() {
this.nameImg = this.$refs.sign.submit(80, 50);
},
// //
handleSubmit(row) { handleSubmit(row) {
this.viewType = 'submit' this.viewType = 'submit'
@ -353,6 +519,57 @@ export default {
}) })
// this.errorForm = row // this.errorForm = row
// this.dialogerror = true // this.dialogerror = true
},
//
handleConfirm() {
console.log('this.detailForm.approveResult1', this.errorForm.approveResult1)
if (this.errorForm.approveResult1 == 0) {//
let query = {
id: this.errorForm.id,
approveResult: this.errorForm.approveResult1,
approvePerson: this.userInfo.user_id,
approveTime: moment().format('YYYY-MM-DD HH:mm:ss'),
approveRemark: this.errorForm.approveRemark
}
customerRefuseFinish(query).then(res => {
if (res.data.code == 200) {
this.$message.success('提交成功')
this.dialogerror = false
this.onLoad()
}
})
} else {//
if (this.nameImg != '') {
const formData = new FormData();
formData.append('file', this.base64toFile(this.nameImg));
addFile(formData).then(res => {
console.log('res----------->', res)
let query = {
id: this.errorForm.id,
isOkValidity: this.errorForm.isOkValidity,
isOkQuality: this.errorForm.isOkQuality,
isOkSecure: this.errorForm.isOkSecure,
signatureUrl: res.data.data.link,
signaturePerson: this.errorForm.signaturePerson,
signatureTime: this.errorForm.signatureTime,
}
customerConfirmFinish(query).then(res => {
console.log('res ========>', res)
if (res.data.code == 200) {
this.$message.success('评价成功')
this.dialogerror = false
this.onLoad()
}
})
})
} else {
this.$message.warning("请进行手写签名并点击确定按钮")
}
}
}, },
handleFinish(row) { handleFinish(row) {
this.$confirm('请确认是否维修完成?', '提示', { this.$confirm('请确认是否维修完成?', '提示', {
@ -368,6 +585,39 @@ export default {
}) })
}) })
}, },
base64toFile(dataurl, filename = 'file') {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let suffix = mime.split('/')[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
let file = new File([u8arr], `${filename}.${suffix}`, {
type: mime
})
console.log(file)
return file
},
//
paymentFinish(row) {
this.$confirm('请确认付款是否完成?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
repairServiceConfirm({ id: row.id }).then(res => {
if (res.data.code == 200) {
this.$message.success('维修完成')
this.onLoad()
}
})
})
},
// //
checkData(data, list) { checkData(data, list) {
data.forEach((item) => { data.forEach((item) => {
@ -526,6 +776,8 @@ export default {
} }
}) })
} }
} else if (this.viewType == 'evaluate') {
this.handleConfirm()
} }
// console.log('errorForm--------------->',this.errorForm) // console.log('errorForm--------------->',this.errorForm)
// this.$confirm('?', '', { // this.$confirm('?', '', {
@ -572,10 +824,39 @@ export default {
this.page.total = res.data.data.total this.page.total = res.data.data.total
}) })
}, },
//
clickInvoice() {
if (this.selectedList.length == 0) {
this.$message.warning('请至少选择一条数据')
} else {
let tmp = this.selectedList.find(item => item.repairStatus != 7)
if (tmp) {
this.$message.warning('请选择状态为待开发票的数据')
} else {
this.$confirm('请确认是否为已选择数据开具发票?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let queryData = []
this.selectedList.forEach(item => {
queryData.push({
id: item.id
})
})
repairConfirmConfirm(queryData).then(res => {
this.$message.success('发票开具成功')
this.onLoad()
})
}).catch(() => {
})
}
}
},
} }
} }
</script> </script>
<style> <style></style>
</style>

@ -953,7 +953,8 @@ export default {
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
serviceInvoice({id:row.id}).then(res =>{ let query=[{id:row.id}]
serviceInvoice(query).then(res =>{
if(res.data.code == 200){ if(res.data.code == 200){
this.$message.success('发票开具成功') this.$message.success('发票开具成功')
this.onLoad() this.onLoad()

@ -439,7 +439,7 @@ import { mapGetters } from "vuex";
import moment from "moment"; import moment from "moment";
import { dateFormat } from "../../util/date"; import { dateFormat } from "../../util/date";
import requestSub from '../components/requestSub.vue' import requestSub from '../components/requestSub.vue'
import { getList, getDetail, evaluateSign, addFile, saveData,customerConfirm,customerReject,customerRepairConfirm,customerRepairReject } from '@/api/operation/hand' import { getList, getDetail, evaluateSign, addFile, saveData,customerConfirm,customerReject,customerRepairConfirm,customerRepairReject,serviceInvoice } from '@/api/operation/hand'
import { getDeviceList } from '@/api/device/device' import { getDeviceList } from '@/api/device/device'
import { getChildList } from '@/api/system/dictbiz' import { getChildList } from '@/api/system/dictbiz'
let action = "https://api.avuejs.com/imgupload"; let action = "https://api.avuejs.com/imgupload";
@ -752,7 +752,16 @@ export default {
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let queryData = []
this.selectionList.forEach(item => {
queryData.push({
id: item.id
})
})
serviceInvoice(queryData).then(res=>{
this.$message.success('发票开具成功')
this.onLoad()
})
}).catch(() =>{ }).catch(() =>{
}) })

Loading…
Cancel
Save