lanan-repair-app/pages-order/orderDetail/orderDetail.vue
2024-11-07 14:16:06 +08:00

1413 lines
46 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<view class="containerBody">
<VNavigationBar background-color="#fff" title="工单详情" title-color="#333"></VNavigationBar>
<view class="body" v-if="null!=ticketInfo">
<view class="card cardInfo carCard">
<view :class="{'end': ticketInfo.ticketsStatus == '02'}" class="orderFlag">
<template>
<image v-if="ticketInfo.ticketsStatus == '02'" mode="aspectFit" src="/static/icons/orderEnd.png"
style="width: 48rpx;height: 48rpx"></image>
<image v-else mode="aspectFit" src="/static/icons/orderIng.png"
style="width: 48rpx;height: 48rpx"></image>
<view class="flagBody">
<text>{{ ticketInfo.ticketsStatus == '02' ? '已完成' : ticketInfo.statusStr }}</text>
<text class="flagDesc" v-if="nowRepair.repairItemId">当前工单维修项目:{{ nowRepair.itemName }}</text>
<text class="flagDesc" v-if="ticketInfo.nowRepairName">当前处理人:{{ ticketInfo.nowRepairName }}</text>
</view>
</template>
</view>
<view v-if="wares && wares.length>0" v-for="item in wares" class="noReviewPart" @click="showReviewList(item)">
<u-icon color="#E8A321" name="error-circle-fill" size="14"></u-icon>
<text class="messageText">当前项目有待审批的配件申请单!</text>
<u-icon color="#E8A321" name="arrow-right" size="14"></u-icon>
</view>
<view class="carTitle">车辆信息</view>
<view class="carDetail">
<view class="carHeader">
<image v-show="ticketInfo.carInfo.logoImg" :src="imgUrlPrex + ticketInfo.carInfo.logoImg" class="carImage" mode="aspectFill"></image>
<view class="carHeaderRight">
<text class="carNumber">{{ ticketInfo.carNo }}</text>
<text class="carType">{{ ticketInfo.carBrandName }}</text>
</view>
</view>
<view class="carBody">
<view style="display: flex;align-items: center">
<view class="infoItem" style="flex: 1">
<view class="label">车架号</view>
<view class="value">{{ ticketInfo.carVin }}</view>
</view>
<!-- <view class="infoItem" style="flex: 1">-->
<!-- <view class="label">发动机号</view>-->
<!-- <view class="value">{{ ticketInfo.fdjNo }}</view>-->
<!-- </view>-->
<view class="infoItem" style="flex: 1">
<view class="label">注册日期</view>
<view class="value">{{ ticketInfo.carRegisterDate }}</view>
</view>
</view>
<template v-if="carInfo.showAll">
<view style="display: flex;align-items: center">
<view class="infoItem" style="flex: 1">
<view class="label">年检到期时间</view>
<view class="value">{{ ticketInfo.nextInspectionDate}}</view>
</view>
<view class="infoItem" style="flex: 1">
<view class="label">保险到期时间</view>
<view class="value">{{ ticketInfo.insuranceExpiryDate}}</view>
</view>
</view>
</template>
</view>
<view class="carFoot">
<template v-if="!carInfo.showAll">
<text @click="() => $set(carInfo, 'showAll', true)">展开</text>
<image mode="aspectFit" src="/static/icons/bottom.png" style="width: 28rpx;height: 28rpx"></image>
</template>
<template v-else>
<text @click="() => carInfo.showAll = false">收起</text>
<!--<image mode="aspectFit" src="/static/icons/bottom.png" style="width: 28rpx;height: 28rpx"></image>-->
</template>
</view>
</view>
</view>
<view class="card cardInfo userCard">
<view class="userTitle">客户信息</view>
<view class="userContainer">
<view style="display: flex;align-items: center">
<view class="infoItem" style="flex: 1">
<text class="label">姓名</text>
<text class="value">{{ ticketInfo.userName }}</text>
</view>
<view class="infoItem" style="flex: 1">
<text class="label">性别</text>
<text class="value">{{ ticketInfo.customerInfo.sex === '1' ? '女' : '男' }}</text>
</view>
</view>
<template v-if="userInfo.showAll">
<view style="display: flex;align-items: center">
<view class="infoItem" style="flex: 1">
<text class="label">联系方式</text>
<text class="value">{{ ticketInfo.userMobile }}</text>
</view>
<view class="infoItem" style="flex: 1">
<text class="label">生日</text>
<text class="value">{{ ticketInfo.birthday }}</text>
</view>
</view>
<view class="infoItem">
<text class="label">联系地址</text>
<text class="value">
{{ ticketInfo.customerInfo.address }}
</text>
</view>
</template>
</view>
<view v-if="loginUser.roleCodes.includes('weixiu') || loginUser.roleCodes.includes('service_advisor')||loginUser.roleCodes.includes('general_inspection')" class="userFoot">
<template v-if="!userInfo.showAll">
<text @click="() => $set(userInfo, 'showAll', true)">展开</text>
<image mode="aspectFit" src="/static/icons/bottom.png" style="width: 28rpx;height: 28rpx"></image>
</template>
<template v-else>
<text @click="() => userInfo.showAll = false">收起</text>
<!--<image mode="aspectFit" src="/static/icons/bottom.png" style="width: 28rpx;height: 28rpx"></image>-->
</template>
</view>
</view>
<view v-if="ticketInfo.projects && ticketInfo.projects.length > 0" class="card cardInfo projCard">
<view class="projTitle">维修项目</view>
<view class="projList">
<template>
<view v-for="item in ticketInfo.projects" :key="item.id" class="projEditItem">
<view class="projEditLine1">
<text>{{ item.itemName }}</text>
<text v-if="canSeeMoney" class="projAmount">¥{{ item.itemMoney }}</text>
</view>
<view class="projBaseInfo" v-if="(loginUser.roleCodes.includes('weixiu') || loginUser.roleCodes.includes('service_advisor')||loginUser.roleCodes.includes('general_inspection')) && isDetail == '0'" >
<!-- 可编辑-->
<view v-if="canSeeMoney">售价:<input @input="onKeyInput('sj',item)" style="background: white;padding: 0 10rpx" type="decimal" placeholder="请输入售价" v-model="item.itemPrice" /></view>
<view>数量:<input @input="onKeyInput('sl',item)" style="background: white;padding: 0 10rpx" type="number" placeholder="请输入数量" v-model="item.itemCount" /></view>
<!-- <view>单位:{{ item.itemUnit}}</view>-->
<view v-if="canSeeMoney">折扣:<input @input="onKeyInput('zk',item)" style="background: white;padding: 0 10rpx" type="decimal" placeholder="请输入折扣0-1" v-model="item.itemDiscount" /></view>
<view v-if="canSeeMoney">金额:<input type="number" disabled placeholder="请输入售价" v-model="item.itemMoney" /></view>
</view>
<view v-else class="projBaseInfo" v-if="(loginUser.roleCodes.includes('weixiu') || loginUser.roleCodes.includes('service_advisor')||loginUser.roleCodes.includes('general_inspection')) && isDetail != '0'" >
<!-- 只读 -->
<view v-if="canSeeMoney">售价:{{ item.itemPrice || "" }}</view>
<view>数量:{{ item.itemCount || "" }}</view>
<!-- <view>单位:{{ item.itemUnit}}</view>-->
<view v-if="canSeeMoney">折扣:{{ item.itemDiscount || "" }}</view>
<view v-if="canSeeMoney">金额:{{ item.itemMoney || "" }}</view>
</view>
<view class="projEditFoot">
<view class="block1">
<template>
<view class="editPeople">
<view class="editForm">
<text class="label">销售人员</text>
<text >{{item.saleName || ""}}
</text>
</view>
<image v-if="isDetail == '0'" src="/static/icons/edit.png" style="width: 28rpx;height: 28rpx"
@click="editPeople('xs', item)"></image>
</view>
</template>
<template v-if="isDetail == '0'">
<image @click="editPeople('xs', item)"src="/pages-order/static/addIcon.png" style="width: 28rpx;height: 28rpx"></image>
<!-- <text class="addText" @click="editPeople('xs', item)">添加销售人员</text>-->
</template>
</view>
<view class="line"></view>
<view class="block2">
<template>
<view class="editPeople">
<view class="editForm">
<text class="label">施工人员</text>
<text >{{ item.repairNames || ""}}</text>
</view>
<image v-if="isDetail == '0'" src="/static/icons/edit.png" style="width: 28rpx;height: 28rpx"
@click="editPeople('sg', item)"></image>
</view>
</template>
<template v-if="isDetail == '0'">
<image @click="editPeople('sg', item)" src="/pages-order/static/addIcon.png" style="width: 28rpx;height: 28rpx"></image>
<!-- <text class="addText" @click="editPeople('sg', item)">添加施工人员</text>-->
</template>
</view>
</view>
</view>
</template>
</view>
</view>
<view v-if="ticketInfo.wares && ticketInfo.wares.length > 0" class="card cardInfo projCard">
<view class="projTitle">维修配件 <view class="dl-ifcus" v-if="canOpenCus"><text>是否开放给客户</text><switch :checked="ticketInfo.partShow == '1'" style="transform:scale(0.7)" @change="toPartShow" /></view></view>
<view class="projList">
<template>
<view v-for="item in ticketInfo.wares" :key="item.id" class="projEditItem">
<view class="projEditLine1">
<text>{{ item.itemName }}</text>
<text v-if="canSeeMoney" class="projAmount">¥{{ item.itemMoney }}</text>
</view>
<view class="projBaseInfo">
<view v-if="canSeeMoney">售价:{{ item.itemPrice || "" }}</view>
<view>数量:{{ item.itemCount || "" }}</view>
<view>单位:{{ item.itemUnit || ""}}</view>
<view v-if="canSeeMoney">折扣:{{ item.itemDiscount || "" }}</view>
<view v-if="canSeeMoney">金额:{{ item.itemMoney || "" }}</view>
</view>
</view>
</template>
</view>
</view>
<view v-if="isDetail == '1'" class="card cardInfo projCard">
<view class="projTitle">维修进度记录表</view>
<view class="projList">
<view class="tushi-box">
<view class="tushi-item">- 待维修 </view>
<view class="tushi-item" style="color: #E8A321">○ 维修中 </view>
<view class="tushi-item" style="color: #17DBB1;">√ 已完成</view>
</view>
<uni-table ref="table" :loading="false" border stripe emptyText="暂无数据">
<uni-tr>
<uni-th width="50" align="center">序号</uni-th>
<uni-th align="center">维修项目</uni-th>
<uni-th width="100" align="center" colspan="3">维修状态</uni-th>
</uni-tr>
<uni-tr v-for="(item, index) in tableData" :key="index">
<uni-td align="center">{{ index+1 }}</uni-td>
<uni-td>{{ item.itemName }}</uni-td>
<uni-td align="center"><text v-if="item.itemStatus=='01'">-</text></uni-td>
<uni-td align="center"><text v-if="item.itemStatus=='02'" style="color: #E8A321">○</text></uni-td>
<uni-td align="center"><text v-if="item.itemStatus=='03'" style="color: #17DBB1;">√</text></uni-td>
</uni-tr>
</uni-table>
</view>
</view>
<view v-if="isDetail == '1'" class="card cardInfo projCard">
<view class="projTitle">维修记录</view>
<view class="projList">
<template>
<view v-for="item in ticketInfo.records" :key="item.id" class="projItem">
<view class="projTop">
<text class="projName">{{ item.type }}【{{item.roleName}}-{{item.dealUserName}}】</text>
<!-- <text class="projAmount">${{ item.amount }}</text>-->
</view>
<view class="projBody">
<view class="projDate" style="padding: 10rpx 0 0 0" v-if="item.projectName">
<text class="projDateText">本次维修项目:{{ item.projectName }}</text>
</view>
<view class="projDate" style="padding: 10rpx 0">
<image mode="aspectFit" src="/static/icons/date.png" style="width: 24rpx;height: 24rpx"></image>
<text class="projDateText">{{ item.createTime }}</text>
</view>
<template >
<view class="projDesc">
{{ item.remark }}
</view>
<view class="projImg">
<image v-for="(img, imgIndex) in item.itemList" @click="prviewImage(item.itemList,imgIndex)" :key="imgIndex" :src="imgUrlPrex + img.image"
class="projImgItem"></image>
</view>
<view class="projSend" v-if="item.itemList.length>0 && canOpenCus">
<!-- <template >-->
<!-- <image mode="aspectFit" src="/static/icons/sendSuccess.png"-->
<!-- style="width: 28rpx;height: 28rpx"></image>-->
<!-- <text style="color: #858BA0">已发送客户</text>-->
<!-- </template>-->
<template >
<image mode="aspectFit" src="/static/icons/send.png" style="width: 28rpx;height: 28rpx"></image>
<text style="color: #0174F6" @click="sendCusImgManage(item.itemList)">发送给客户</text>
</template>
</view>
</template>
</view>
</view>
</template>
</view>
</view>
</view>
<view v-if="isDetail == '0'" class="foot">
<view class="submit" @click="submit">保存工单</view>
</view>
</view>
<!-- 悬浮操作-->
<uni-fab v-if="content.length>0" ref="fab" :pattern="pattern" :content="content" :horizontal="horizontal" :vertical="vertical"
:direction="direction" @trigger="trigger" @fabClick="fabClick" />
<!-- 普通弹窗---拍照上传 -->
<uni-popup ref="popup" background-color="#fff">
<view class="popup-content">
<view v-if="!ifCallCus">
<view class="dl-avatar-box">
<uni-file-picker :value="fileList" :sizeType="sizeType" @select="afterRead" @delete="deleteFile" limit="9" title="最多选择9张图片"></uni-file-picker>
</view>
<button type="primary" @click="saveWorkingItem">保存</button>
</view>
<view v-else>
<view class="formItem">
<view class="formLabel">服务顾问姓名</view>
<view class="formContainer">
<input placeholder="请填写联系人姓名" v-model="callServiceInfo.name" type="text"/>
</view>
</view>
<view class="formItem">
<view class="formLabel">服务顾问手机号</view>
<view class="formContainer">
<input placeholder="请填写联系人联系方式" v-model="callServiceInfo.tel" type="number"/>
</view>
</view>
<button type="primary" @click="saveWorkingItem">通知客户取车</button>
</view>
</view>
</uni-popup>
<view >
<u-modal :show="show" :title="title" confirmText="电话" cancelText="短信" showCancelButton
@cancel="message" @confirm="phone " closeOnClickOverlay @close="show = false">
客户:<view v-if="ticketInfo">{{ ticketInfo.userName}}{{ ticketInfo.userMobile }}</view>
</u-modal>
</view>
</view>
</template>
<script>
import VNavigationBar from '@/components/VNavigationBar.vue'
import {bus} from "@/utils/eventBus";
import request from '@/utils/request';
import upload from '@/utils/upload'
import {getOrderStatusText,formatDate,formatTimestamp,getDictTextByCodeAndValue,saveTicketsRecords} from "@/utils/utils";
import {getUserInfo,setJSONData,setStorageWithExpiry,getStorageWithExpiry} from '@/utils/auth'
import config from '@/config'
export default {
components: {
VNavigationBar,
},
data() {
return {
show:false,
title:'通知客户',
linkContent:'请选择通知客户方式',
//以下是悬浮操作需要的参数
direction: 'vertical',
horizontal: 'right',
vertical: 'bottom',
pattern: {
color: '#7A7E83',
backgroundColor: '#fff',
selectedColor: '#007AFF',
buttonColor: '#007AFF',
iconColor: '#fff'
},
content: [],
//维修配件申请单
wares:[],
sizeType:['compressed'],
//上传的图片数组
fileList: [],
imgUrlPrex:config.baseImageUrl,
//是否详情页(0否1是)
isDetail:'1',
// role: 'yewu',
ticketId: '',
//工单信息
ticketInfo: null,
//当前维修的项目
nowRepair:{
repairItemId:"",
itemName:"",
},
//是否可以授权给客户看
canOpenCus:false,
//是否可以看见钱
canSeeMoney:false,
//当前选择的操作:working-维修期间|done_half-阶段完成|done-全部完成递交下一维修班组选人维修
nowChooseOperate:"",
carInfo: {},
userInfo: {},
loginUser:{},
selectedProj: [],
submitData:[],
//是否是通知客户取车操作,默认都不是
ifCallCus:false,
//维修项目进度记录表
tableData:[],
//通知客户取车联系人对象
callServiceInfo:{
name:"",
tel:""
},
};
},
onLoad(data) {
this.loginUser = getUserInfo()
this.canSeeMoney = !this.loginUser.roleCodes.includes('repair_staff');
console.log(this.loginUser,294)
console.log(data)
if (data.id) {
this.ticketId = data.id
}
if (data.isDetail){
this.isDetail = data.isDetail
}
},
onShow(){
//获取订单详情
this.getOrderDetail()
//查维修进度记录
this.getProjItem()
//获取当前订单是否有审批的配件
this.waresByTicket()
},
methods: {
/**
* 监听输入框
*/
onKeyInput(type,item){
this.$nextTick(()=>{
if("zk"==type && (item.itemDiscount<0 || item.itemDiscount>1)){
uni.showToast({
title: '请输入正确的折扣数字0-1',
icon: 'none'
})
item.itemDiscount=1
return
}
if((item.itemPrice && item.itemPrice>0) && (item.itemCount && item.itemCount>0) && (item.itemDiscount && item.itemDiscount>0 && item.itemDiscount<=1)){
//数据符合要求重新计算
item.itemMoney = item.itemPrice*item.itemCount*item.itemDiscount
}
})
console.log(item,"item")
},
/**
* 预览图片
*/
prviewImage(imgList, index) {
let urls = []
imgList.forEach(i => {
urls.push(this.imgUrlPrex+i.image)
})
uni.previewImage({
urls: urls,
current: index
});
},
submit (){
let canSubmit = true
//校验所有项目、配件是否填写了价格、数量、折扣,并且是否合理
if(this.ticketInfo.projects && this.ticketInfo.projects.length>0){
this.ticketInfo.projects.map((item)=>{
if(!item.repairIds || item.repairIds==null || item.repairIds==''){
//某个维修项目没选施工人员
canSubmit=false
uni.showToast({
title: '维修项目'+item.itemName+'请选择施工人员!',
icon: 'none'
})
return
}
if((item.itemPrice && item.itemPrice>0) && (item.itemCount && item.itemCount>0) && (item.itemDiscount && item.itemDiscount>0 && item.itemDiscount<=1)){
//数据符合要求重新计算
item.itemMoney = item.itemPrice*item.itemCount*item.itemDiscount
}else{
canSubmit=false
uni.showToast({
title: '维修项目'+item.itemName+'价格有误!',
icon: 'none'
})
return
}
})
}
//APP暂时不修改配件的信息--
// if(this.ticketInfo.wares && this.ticketInfo.wares.length>0){
// this.ticketInfo.wares.map((item)=>{
// if((item.itemPrice && item.itemPrice>0) && (item.itemCount && item.itemCount>0) && (item.itemDiscount && item.itemDiscount>0 && item.itemDiscount<=1)){
// //数据符合要求重新计算
// item.itemMoney = item.itemPrice*item.itemCount*item.itemDiscount
// }else{
// canSubmit=false
// uni.showToast({
// title: '维修配件'+item.itemName+'价格有误!',
// icon: 'none'
// })
// return
// }
// })
// }
if(canSubmit){
//更新工单配件价格
request({
url: '/admin-api/repair/titem/updateRepairItem',
method: 'PUT',
data:this.ticketInfo.projects
}).then((res) => {
if(res.code==200){
uni.showToast({
title: '操作成功!',
icon: 'none'
})
setTimeout(()=>{
uni.navigateTo({
url: '/pages-home/home/home'
})
},700)
}else{
uni.showToast({
title: '操作失败,请联系管理员',
icon: 'none'
})
}
})
}
},
afterRead(file) {
for (let i = 0; i < file.tempFilePaths.length; i++) {
upload({
url:'/admin-api/infra/file/upload',
filePath: file.tempFilePaths[i]
}).then((res)=>{
this.fileList.push({
url: config.baseImageUrl+res.data
})
console.log(this.fileList)
})
}
},
deleteFile(file, index) {
console.log('删除文件');
this.fileList.splice(index, 1);
},
/**
* 保存工作记录信息
*/
async saveWorkingItem(){
try {
let fileStr = this.fileList.map(item=>item.url.replace(config.baseImageUrl,"")).join(",")
if("working"==this.nowChooseOperate){
//维修中拍照
const result = await saveTicketsRecords(this.ticketInfo.id,null,this.nowRepair.repairItemId,null,"sgz","施工中拍照记录",fileStr,"","");
console.log(result)
}else if("done_half"==this.nowChooseOperate){
//阶段完成
const result = await saveTicketsRecords(this.ticketInfo.id, '03',this.nowRepair.repairItemId,"03","sgwczj","阶段完成",fileStr,"","");
}else if("other"==this.nowChooseOperate){
//项目完成
const result = await saveTicketsRecords(this.ticketInfo.id, '03',this.nowRepair.repairItemId,"03","sgwczj","维修完成移交下一班组维修",fileStr,"","");
}else if("done"==this.nowChooseOperate){
//移交总检
const result = await saveTicketsRecords(this.ticketInfo.id, '03',this.nowRepair.repairItemId,"03","sgwczj","维修完成移交总检",fileStr,"02","");
}else if("check"==this.nowChooseOperate){
//总检拍照
let dataObj = {
id: this.ticketInfo.id,
remark: "车辆总检",
image: fileStr
}
request({
url: '/admin-api/repair/tickets/inspection',
method: 'POST',
data:dataObj
}).then((res) => {
})
}else if("out"==this.nowChooseOperate){
//出厂检验
let dataObj = {
id: this.ticketInfo.id,
remark: "车辆出厂检验",
image: fileStr
}
request({
url: '/admin-api/repair/tickets/confirm',
method: 'POST',
data:dataObj
}).then((res) => {
})
}else if("callCus"==this.nowChooseOperate){
//服务顾问通知客户取车
let dataObj = {
id: this.ticketInfo.id,
name:this.callServiceInfo.name,
mobile:this.callServiceInfo.tel,
}
request({
url: '/admin-api/repair/tickets/noticeCus',
method: 'POST',
data:dataObj
}).then((res) => {
})
}
this.$refs.popup.close()
uni.showToast({
title: '操作成功',
icon: 'none'
})
if("done"==this.nowChooseOperate || "check"==this.nowChooseOperate || "callCus"==this.nowChooseOperate || "out"==this.nowChooseOperate){
//移交总检需要返回| 总检拍照后需要返回
setTimeout(() => {
uni.navigateBack()
},500)
}
if("other"==this.nowChooseOperate){
//移交下一班组维修,需要指派下一个维修人
setTimeout(()=>{
uni.navigateTo({
url: '/pages-order/choosePeople/choosePeople?id=' + this.ticketInfo.id+'&itemId='+this.nowRepair.repairItemId +'&ifDetail=true'
})
},500)
}
} catch (error) {
console.error(error);
}
},
/**
* 判断工单状态和角色控制显示什么操作按钮
*/
checkRoleOperate(){
this.content = []
if(this.loginUser.roleCodes.includes("service_advisor")){
//服务顾问
this.canOpenCus = true
if(this.ticketInfo.nowRepairId==this.loginUser.id){
//当前用户就是处理人,可以进行出厂检验 和通知客户取车
if("05"==this.ticketInfo.ticketsStatus) {
this.content.push({
text: '出厂检验', active: false, code: "out"
})
}
if("07"==this.ticketInfo.ticketsStatus){
//工单状态是待通知客户取车,才能通知
this.content.push({
text: '通知取车', active: false,code:"callCus"
})
}
}
//设置服务顾问默认的姓名联系方式
this.callServiceInfo.name = this.loginUser.nickname
this.callServiceInfo.tel = this.loginUser.mobile
}
if(this.loginUser.roleCodes.includes("weixiu")){
//维修管理员
this.canOpenCus = true
}
if(this.loginUser.roleCodes.includes("general_inspection")){
//维修总检
this.canOpenCus = true
if(this.ticketInfo.nowRepairId==this.loginUser.id && "05"==this.ticketInfo.ticketsStatus){
//当前用户就是处理人,可以进行总检拍照
this.content.push({
text: '总检拍照', active: false,code:"check"
})
}
}
if(this.loginUser.roleCodes.includes("repair_staff")){
//维修工角色,可以提交配件申请
this.content.push({
text: '配件申请', active: false, code: "apply"
})
console.log(this.ticketInfo,"this.ticketInfo")
if ("05" == this.ticketInfo.ticketsStatus && this.ticketInfo.nowRepairId == this.loginUser.id) {
//订单状态处于维修中 ,且自己就是施工人
if ("02" == this.ticketInfo.ticketsWorkStatus) {
//当前正在施工且可以随时上传图片、也可以结束施工
this.content.push({
text: '拍照上传', active: false, code: "working"
})
this.content.push({
text: '阶段完成', active: false, code: "done_half"
})
this.content.push({
text: '项目完成', active: false, code: "other"
})
this.content.push({
text: '移交总检', active: false, code: "done"
})
//查当前维修的项目
this.selectNowRepair()
}
if ("03" == this.ticketInfo.ticketsWorkStatus || "04" == this.ticketInfo.ticketsWorkStatus) {
//当前子状态是已接单和已完成,可以开始施工,也可以直接移交总检
this.content.push({
text: '开始施工', active: false, code: "start"
})
this.content.push({
text: '移交总检', active: false, code: "done"
})
}
}
}
},
/**
* 操作按钮点击事件
*/
trigger(e) {
//默认不是同时客户取车操作
this.ifCallCus = false
console.log(e)
this.content[e.index].active = !e.item.active
this.nowChooseOperate = e.item.code
if("working"==e.item.code || "done_half"==e.item.code || "done"==e.item.code || "other"==e.item.code || "check"==e.item.code || "out"==e.item.code){
//维修过程中拍照上传、阶段完成、移交其他班组、移交总检、出厂检验
this.fileList=[]
this.$refs.popup.open("bottom")
}else if("start" == e.item.code){
//开始施工
this.startWork(this.ticketInfo.id)
}else if("apply" == e.item.code){
//配件申请
uni.navigateTo({
url: '/pages-repair/apply/applyForm?ticketId='+this.ticketId
})
}else if("callCus"==e.item.code){
this.show = true
}
// uni.showModal({
// title: '提示',
// content: `您${this.content[e.index].active ? '选中了' : '取消了'}${e.item.text}${e.item.code}`,
// success: function(res) {
// if (res.confirm) {
// console.log('用户点击确定')
// } else if (res.cancel) {
// console.log('用户点击取消')
// }
// }
// })
},
message(){
this.show = false
// //服务顾问通知客户取车
this.ifCallCus = true
this.$refs.popup.open("bottom")
},
phone(){
uni.makePhoneCall({
phoneNumber: this.ticketInfo.userMobile
});
},
/**
* 维修照片是否授权给客户看管理
*/
sendCusImgManage(itemList){
console.log(itemList)
setJSONData("chooseImg",itemList)
uni.navigateTo({
url: '/pages-order/chooseImg/chooseImg'
})
},
/**
* 点击悬浮操作按钮
*/
fabClick() {
},
/**
* 开始施工
*/
startWork(id){
let paramsObj = {ticketId:id}
//先查当前用户在本工单下有几个维修项目
request({
url: '/admin-api/repair/titem/listProject',
method: 'get',
params:paramsObj
}).then((res) => {
console.log(res)
if (res.code == 200 && res.data.length>0) {
if(res.data.length==1){
//只有1个直接开始施工
this.startWorkRequest(id,"02",res.data[0].id,"02","kssg","开始施工")
}else{
uni.showActionSheet({
itemList: res.data.map(m => m.itemName),
success: ({
tapIndex
}) => {
this.startWorkRequest(id,"02",res.data[tapIndex].id,"02","kssg","开始施工")
}
})
}
}else{
uni.showToast({
title: '操作失败,请联系管理员',
icon: 'none'
})
}
})
},
/**
* 开始施工请求后台
*/
async startWorkRequest(id,ticketsWorkStatus,itemId,itemStatus,recordType,remark){
try {
const result = await saveTicketsRecords(id,ticketsWorkStatus,itemId,itemStatus,recordType,remark,null);
//刷新数据
this.getOrderDetail()
} catch (error) {
console.error(error);
}
},
/**
* 是否开放给用户----配件单
*/
toPartShow(row){
console.log(row.detail.value)
const show = row.detail.value?'1':'0'
request({
url: '/admin-api/repair/tickets/show',
method: 'get',
params:{id:this.ticketId,show:show}
}).then((res)=>{
uni.showToast({
title: '设置成功!',
icon: 'none'
})
})
},
/**
* 查看维修进度记录
*/
getProjItem(){
request({
url: '/admin-api/repair/titem/getProjList',
method: 'get',
params:{ticketId:this.ticketId}
}).then((res)=>{
if(res.code==200){
this.tableData = res.data
}
})
},
/**
* 查看订单详情
*/
getOrderDetail(){
request({
url: '/admin-api/repair/tickets/get',
method: 'get',
params:{id:this.ticketId}
}).then((res)=>{
let resultObj = res.data
resultObj.statusStr = getOrderStatusText(res.data.ticketsStatus)
//注册日期
if (null != resultObj.carInfo.carRegisterDate){
resultObj.carRegisterDate = formatDate(resultObj.carInfo.carRegisterDate)
}else{
resultObj.carRegisterDate = '未知'
}
//年检时间
console.log(resultObj.carInfo)
if (null != resultObj.carInfo.nextInspectionDate){
resultObj.nextInspectionDate = formatDate(resultObj.carInfo.nextInspectionDate)
} else {
resultObj.nextInspectionDate = '未知'
}
//保险时间
if (null != resultObj.carInfo.insuranceExpiryDate) {
resultObj.insuranceExpiryDate = formatDate(resultObj.carInfo.insuranceExpiryDate)
} else {
resultObj.insuranceExpiryDate = '未知'
}
//生日
if (null != resultObj.customerInfo.birthday) {
resultObj.birthday = formatDate(resultObj.customerInfo.birthday)
} else {
resultObj.birthday = '未知'
}
//维修记录格式化时间
if (null != resultObj.records){
resultObj.records.map((item)=>{
item.createTime = formatTimestamp(item.createTime)
})
}
this.$nextTick(()=>{
this.ticketInfo = resultObj
//判断当前角色及工单状态显示操作按钮
this.checkRoleOperate()
})
})
},
/**
* 查询当前工单下的审批单
*/
waresByTicket(){
request({
url: '/admin-api/repair/tw/list',
method: 'get',
params:{ticketId:this.ticketId,status:'01'}
}).then((res)=>{
if (res.code == 200){
this.wares = res.data
}
})
},
/**
* 查当前维修的项目
*/
selectNowRepair(){
request({
url: '/admin-api/dl/repair-records/listByTicketId',
method: 'get',
params:{ticketId:this.ticketInfo.id}
}).then((res)=>{
if(res.code==200){
if(res.data && res.data.hasOwnProperty("repair_item_id")){
this.nowRepair.repairItemId = res.data.repair_item_id
this.nowRepair.itemName = res.data.item_name
}
}else{
uni.showToast({
title: res.msg,
icon: 'none'
})
}
})
},
editPeople(type, proj) {
bus.$off('choosePeople')
bus.$on('choosePeople', (data) => {
console.log('choosePeople', data)
console.log('type', type)
if (type === 'xs') {
proj.salesman = data
} else if (type === 'sg') {
proj.constructor = data
}
console.log('proj', proj)
})
uni.navigateTo({
url: `/pages-order/choosePeople/choosePeople?type=${type}&ticketId=${this.ticketId}&projectId=${proj.projectId}`
// url: `/pages-order/choosePeople/choosePeople?type=${type}&id=${this.ticketId}`
})
},
/**
* 点击配件申请单提醒,查看相关配件
* @param wareId
*/
showReviewList(formData) {
uni.navigateTo({
url: '/pages-order/reviewList/reviewList?formData='+encodeURIComponent(JSON.stringify(formData))
})
}
}
}
</script>
<style lang="less" scoped>
.popup-content {
@include flex;
align-items: center;
justify-content: center;
padding: 15px;
height: auto;
background-color: #fff;
}
.container {
height: 100%;
background-color: #F3F5F7;
.containerBody {
height: 100%;
display: flex;
flex-direction: column;
}
.body {
flex: 1;
height: 0;
overflow: auto;
}
.card {
background: #FFFFFF;
border-radius: 8rpx 8rpx 8rpx 8rpx;
margin: 20rpx 32rpx;
}
.phone {
background: #0174F6;
.phoneHeader {
padding: 20rpx 30rpx;
.title {
font-weight: bold;
font-size: 32rpx;
color: #FFFFFF;
margin-bottom: 10rpx;
}
.desc {
font-weight: 500;
font-size: 24rpx;
color: rgba(255, 255, 255, 0.7);
}
}
.phoneBody {
background: #FFFFFF;
border-radius: 8rpx 8rpx 8rpx 8rpx;
padding: 0 30rpx;
.searchBox {
padding: 40rpx 0;
border-bottom: 1rpx solid #EEEEEE;
}
.btn {
padding: 40rpx 0;
display: flex;
align-items: center;
justify-content: center;
column-gap: 10rpx;
font-weight: 500;
font-size: 32rpx;
color: #0174F6;
.btnIcon {
width: 32rpx;
height: 32rpx;
}
}
}
}
.cardInfo {
.noReviewPart {
padding: 10rpx 36rpx 10rpx 36rpx;
display: flex;
align-items: center;
column-gap: 10rpx;
margin-top: 10rpx;
background: #FFF6E7;
border-radius: 4rpx 4rpx 4rpx 4rpx;
font-weight: 500;
font-size: 28rpx;
color: #E8A321;
.messageText {
flex: 1;
width: 0;
}
}
&.none {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
.cardNoneIcon {
width: 336rpx;
}
.btn {
position: absolute;
bottom: 40rpx;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
column-gap: 10rpx;
font-weight: 500;
font-size: 28rpx;
color: #0174F6;
}
}
}
.projTitle, .userTitle, .carTitle {
padding: 30rpx;
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.dl-ifcus{
font-size: 14px;
float: right;
}
.carCard {
.orderFlag {
display: flex;
align-items: center;
column-gap: 14rpx;
padding: 40rpx 30rpx;
background: #FFFBF3;
border-radius: 8rpx 8rpx 0rpx 0rpx;
border-top: 8rpx solid #E8A321;
&.end {
border-top: 8rpx solid #17DBB1;
background-color: #E3FFF9;
}
.flagBody {
display: flex;
flex-direction: column;
row-gap: 10rpx;
font-weight: bold;
font-size: 32rpx;
color: #333333;
.flagDesc {
font-weight: 500;
font-size: 24rpx;
color: #999999;
}
}
}
.carDetail {
background-size: 100% 184rpx;
padding: 0 30rpx;
.carHeader {
border-radius: 8rpx 8rpx 8rpx 8rpx;
display: flex;
align-items: center;
column-gap: 20rpx;
padding-bottom: 30rpx;
.carImage {
width: 192rpx;
height: 120rpx;
background: #F2F2F7;
border-radius: 8rpx 8rpx 8rpx 8rpx;
}
.carHeaderRight {
display: flex;
flex-direction: column;
row-gap: 20rpx;
font-weight: bold;
font-size: 32rpx;
color: #333333;
.carType {
font-weight: 500;
font-size: 28rpx;
color: #858BA0;
}
}
}
.carBody {
display: flex;
flex-direction: column;
row-gap: 30rpx;
padding-top: 30rpx;
border-top: 1rpx solid #DDDDDD;
}
.carFoot {
}
}
}
.projCard {
padding-bottom: 30rpx;
.projList {
padding: 0 30rpx;
display: flex;
flex-direction: column;
gap: 20rpx;
.tushi-box{
display: flex;
align-items: center;
justify-content: center;
}
.tushi-item{
padding: 0 20rpx;
color: #606266;
}
.projItem {
background: #FFFFFF;
border-radius: 4rpx 4rpx 4rpx 4rpx;
border: 2rpx solid #DDDDDD;
padding: 0 20rpx;
.projTop {
padding: 20rpx 0;
border-bottom: 1rpx solid #DDDDDD;
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 500;
font-size: 28rpx;
color: #333333;
.projAmount {
font-weight: bold;
color: #0174F6;
}
}
.projBody {
padding-bottom: 20rpx;
.projDate {
font-weight: 500;
font-size: 24rpx;
color: #858BA0;
display: flex;
align-items: center;
column-gap: 10rpx;
padding: 20rpx 0;
}
.projDesc {
font-weight: 500;
font-size: 24rpx;
color: #858BA0;
}
.projImg {
width: 100%;
display: grid;
grid-template-columns: repeat(auto-fill, 120rpx);
justify-content: space-between;
gap: 20rpx;
padding: 20rpx 0;
.projImgItem {
width: 120rpx;
height: 120rpx;
background-color: #efefef;
}
}
.projSend {
display: flex;
align-items: center;
font-weight: 500;
font-size: 28rpx;
column-gap: 8rpx;
}
}
}
.projEditItem {
padding: 0 20rpx;
background: #F2F2F7;
border-radius: 4rpx 4rpx 4rpx 4rpx;
.projEditLine1 {
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 500;
font-size: 28rpx;
color: #333333;
padding: 30rpx 0;
.projAmount {
color: #0174F6;
}
}
.projBaseInfo {
display: grid;
grid-template-columns: 1fr 1fr;
font-size: 24rpx;
color: #999999;
gap: 20rpx;
margin-bottom: 20rpx;
}
.projEditFoot {
padding: 30rpx 0;
border-top: 1px solid #DDDDDD;
display: flex;
align-items: center;
column-gap: 10rpx;
.block1, .block2 {
flex: 1;
width: 0;
display: flex;
align-items: center;
justify-content: center;
column-gap: 8rpx;
font-size: 28rpx;
color: #0174F6;
line-height: 28rpx;
.editPeople {
flex: 1;
width: 0;
display: flex;
justify-content: space-between;
align-items: center;
.editForm {
display: flex;
flex-direction: column;
row-gap: 10rpx;
font-size: 28rpx;
color: #333333;
.label {
font-size: 24rpx;
color: #999999;
}
}
}
}
.line {
height: 28rpx;
width: 2rpx;
background-color: #DDDDDD;
}
}
}
}
}
.userCard {
.userContainer {
display: flex;
flex-direction: column;
row-gap: 30rpx;
margin: 0 30rpx;
padding-bottom: 10rpx;
}
}
.infoItem {
display: flex;
flex-direction: column;
.label {
font-weight: 500;
font-size: 28rpx;
color: #858BA0;
}
.value {
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
}
.projFoot, .userFoot, .carFoot {
padding: 30rpx;
font-weight: 500;
font-size: 28rpx;
color: #0174F6;
display: flex;
align-items: center;
justify-content: center;
column-gap: 6rpx;
}
.foot {
padding: 30rpx;
background-color: #fff;
.submit {
margin: 0 auto;
width: 510rpx;
height: 76rpx;
background: #0174F6;
border-radius: 38rpx 38rpx 38rpx 38rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #FFFFFF;
}
}
.formItem {
padding: 40rpx 0;
margin: 0 32rpx;
border-bottom: 1rpx solid #EEEEEE;
}
.formLabel {
font-weight: 500;
font-size: 28rpx;
color: #333333;
padding-bottom: 20rpx;
}
}
</style>