flying-monkey/pages/workOrder/workOrder.vue

469 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="content">
<statusNav returnColor="#c2c2c2" navBarTitle="处理工单"></statusNav>
<container-subgroup-two>
<view slot="content" style="margin: -20rpx -25rpx 0rpx;">
<view class="work-order-schedule">
<view class="li">
<view class="icon on icon-after">1</view>
<view class="text">签到执行</view>
</view>
<view class="li">
<view class="icon icon-after">2</view>
<view class="text">填写维保单</view>
</view>
<view class="li">
<view class="icon">3</view>
<view class="text">结算审核</view>
</view>
</view>
<view class="work-order-from">
<view class="li">
<view class="title flexs">工单编号</view>
<input type="text" disabled class="input" :value="targetObj.workOrderNo" />
</view>
<view class="li">
<view class="title flexs">项目编号</view>
<input type="text" disabled class="input" :value="targetObj.projectNo" />
</view>
<view class="li">
<view class="title flexs">项目名称</view>
<input type="text" disabled class="input input-black" :value="targetObj.projectName" />
</view>
<view class="li">
<view class="title flexs">产品类型</view>
<!-- <input type="text" disabled class="input" v-model="targetObj.productType" placeholder="请填写产品类型" :style="{color: targetObj.productType!='' ? '#000' : ''}" /> -->
<picker class="input input-black" mode="selector" :value="productIndex" :range="productTypeList" :range-key="'name'" @change="changePicker(0,$event)">
<view>{{productTypeList[productIndex].name}}</view>
</picker>
</view>
<view class="li">
<view class="title flexs">安装位置:</view>
<input type="text" class="input" v-model="targetObj.installLocation" placeholder="请填写安装位置(例:详细地址+某某栋11楼会议室)" :style="{color: targetObj.installLocation!='' ? '#000' : ''}" />
</view>
<view class="li">
<view class="title flexs">维保类型:</view>
<!-- <input type="text" disabled class="input" v-model="targetObj.faultType" placeholder="请填写维保类型(例:供电不足)" :style="{color: targetObj.faultType!='' ? '#000' : ''}" /> -->
<picker class="input input-black" mode="selector" :value="faultIndex" :range="faultTypeList" :range-key="'name'" @change="changePicker(1,$event)">
<view>{{faultTypeList[faultIndex].name}}</view>
</picker>
</view>
<view class="li">
<view class="title flexs">紧急程度:</view>
<input type="text" disabled class="input" placeholder="" :value="targetObj.urgentDegree" />
</view>
<view class="li">
<view class="title flexs"> 维保说明:</view>
<textarea class="input line-h36" v-model="targetObj.faultExplain" style="height: 110rpx;" placeholder="请输入维保说明" :style="{color: targetObj.faultExplain!='' ? '#000' : ''}" />
</view>
<view class="li">
<view class="title flexs">维保图片:</view>
<view class="input">
<view v-for="(item,index) in targetObj.faultImgList" :key="index" v-if="targetObj.faultImgList.length!=0">
<image class="img" :src="item" mode="aspectFill" ></image>
</view>
<view v-if="targetObj.faultImgList.length!=2" @tap="chooseImg" class="img disjcac" style="background-color: #DDDDDD;">
<image src="/static/iocn/jia.png" style="width: 80rpx;height: 80rpx;position: relative!important;" lazy-load></image>
</view>
</view>
</view>
</view>
<view class="work-order-from">
<view class="li">
<view class="title flexs">报 单 人:</view>
<input type="text" style="margin-left: 14rpx;" disabled class="input" placeholder="" :value="targetObj.reporter" />
</view>
<view class="li">
<view class="title flexs">报单时间:</view>
<input type="text" disabled disabled class="input" placeholder="" :value="targetObj.declarationTime" />
</view>
<view class="li">
<view class="title flexs">服务方式:</view>
<!-- <input type="text" disabled v-model="targetObj.serviceMode" class="input input-black" placeholder="请填写服务方式(例:上门服务)" :style="{color: targetObj.serviceMode!='' ? '#000' : ''}" /> -->
<picker class="input input-black" mode="selector" :value="serviceModeIndex" :range="serviceModeList" :range-key="'name'" @change="changePicker(2,$event)">
<view>{{serviceModeList[serviceModeIndex].name}}</view>
</picker>
</view>
<view class="li">
<view class="title flexs">定位地址:</view>
<input type="text" disabled class="input" :value="targetObj.address" />
</view>
</view>
<button class="submit-button" @click="goWorkOrderThree()" type="default"></button>
</view>
</container-subgroup-two>
</view>
</template>
<script>
import containerSubgroupTwo from '@/components/containers/container-subgroup-two.vue';
import statusNav from '@/components/status-nav.vue';
import footTabOne from "@/components/foot-tabs/foot-tab-one.vue"
import {handleWorkOrderGet,handleWorkOrderSubmit,getProductType,getFaultType,getServiceMode,uploadImg} from '@/jsFile/public-api.js';
var QQMapWX = require('@/jsFile/map/qqmap-wx-jssdk.min.js');
var qqmapsdk = new QQMapWX({
key: 'QNHBZ-55RKF-OMFJJ-NPU7O-EPSDH-ACBAA'
});
// 解决H5跨域
const jsonp = function(url, data) {
return new Promise((resolve, reject) => {
// 1.初始化url
let dataString = url.indexOf('?') === -1 ? '?' : '&'
let callbackName = `jsonpCB_${ Date.now() }`;
url += `${ dataString }callback=${ callbackName }`
if(data) {
// 2.有请求参数依次添加到url
for(let k in data) {
url += `&${ k }=${ data[k] }`
}
}
let scriptNode = document.createElement('script');
scriptNode.src = url;
// 3. callback
window[callbackName] = (result) => {
result ? resolve(result) : reject('没有返回数据');
delete window[callbackName];
document.body.removeChild(scriptNode);
}
// 4. 异常情况
scriptNode.addEventListener('error', () => {
reject('接口返回数据失败');
delete window[callbackName];
document.body.removeChild(scriptNode);
}, false)
// 5. 开始请求
document.body.appendChild(scriptNode)
})
}
export default {
components: {
footTabOne,
statusNav,
containerSubgroupTwo
},
data() {
return {
targetObj:{
workOrderNo:'GD20211203-001',// 工单编号
projectNo:'GD20211203-001', // 项目编号
projectName:'湖南省林业科学院11楼会议室P2.5', // 项目名称
productType:'一拳超人', // 产品类型
installLocation:'手臂', // 安装位置
faultType:'脱节', // 维保类型
urgentDegree:'紧急', // 紧急程度
faultExplain:'摔了一跤', // 维保说明
faultImgList:[], // 维保图片
reporter:'林某', // 报单人
declarationTime:'2022/3/31 12:01:00', //报单时间
serviceMode: '手把手' ,// 服务方式
address:'四川省成都市成华区' ,// 定位地址
startTime:'' ,// 开始时间
endTime:'', // 结束时间
maintenanceTime:'',// 维保用时
waitingTime:'',// 等待时长
maintainer:'陈志远',//主维保人
ifParts:false,//是否更换配件
workDescribe:'',// 工作描述
maintenanceImgList:[],//维保图片
faultReason:'',//维保原因
maintenancePersonnel:''//维保人员
},
productTypeList:[
{id:1,name:'产品1'},{id:2,name:'产品2'},
],//产品类型
productIndex:0,//产品类型下标
faultTypeList:[
{id:1,name:'产品1'},{id:2,name:'产品2'},
],//维保类型
faultIndex:0,//维保类型下标
serviceModeList:[
{id:1,name:'上门服务'},{id:2,name:'线上服务'},
],//服务方式
serviceModeIndex:0,//服务方式下标
flag:true,
temporaryImg:[]//暂存图片id
}
},
onShow() {
uni.removeStorageSync('partsList');
uni.removeStorageSync('targetObj');
},
onLoad(op) {
if(op.id!=undefined) {
this.orderId = op.id;
this.handleWorkOrderGet(this.orderId);
}
this.getProductType();
this.getFaultType();
this.getAddressH5();
},
methods: {
// 定位地址
getAddress() {
},
getAddressH5(){
uni.getLocation({
type: 'gcj02',//wgs84 gcj02
altitude: true,
geocode: true,
success: (res)=> {
let str = `output=jsonp&key=QNHBZ-55RKF-OMFJJ-NPU7O-EPSDH-ACBAA&location=${res.latitude},${res.longitude}`
jsonp('https://apis.map.qq.com/ws/geocoder/v1/?'+str,{}).then(res=>{
console.log(res,'H5');
this.targetObj.address = `${res.result.address_component.province}${res.result.address_component.city}${res.result.address_component.district}${res.result.address_component.street || ''}(${res.result.address_component.street_number || ''})`
})
}
});
},
// 改变产品类型、维保类型、服务方式
changePicker(index,e) {
switch (index){
case 0:
// 产品类型
this.productIndex = e.detail.value;
this.targetObj.productType = this.productTypeList[this.productIndex].name;
break;
case 1:
// 维保类型
this.faultIndex = e.detail.value;
this.targetObj.faultType = this.faultTypeList[this.faultIndex].name;
break;
case 2:
// 服务方式
this.serviceModeIndex = e.detail.value;
this.targetObj.serviceMode = this.serviceModeList[this.serviceModeIndex].name;
break;
}
},
// 获取产品类型
getProductType() {
getProductType().then(res=>{
if(res.code) {
this.productTypeList = res.data;
if(this.productTypeList.length) {
// this.productIndex = this.productTypeList.findIndex(item=>{return item.name==this.targetObj.productType});
// 筛选默认选中项
this.productTypeList.forEach((item,index)=>{
if(item.name==this.targetObj.productType) {
this.productIndex = index;
}
})
}
}
})
},
// 获取维保类型
getFaultType() {
getFaultType().then(res=>{
if(res.code) {
this.faultTypeList = res.data;
if(this.faultTypeList.length) {
// this.faultIndex = this.faultTypeList.findIndex(item=>{return item.name==this.targetObj.faultType});
// 筛选默认选中项
this.faultTypeList.forEach((item,index)=>{
if(item.name==this.targetObj.faultType) {
this.faultIndex = index;
}
})
}
}
})
},
// 获取服务方式
getServiceMode() {
getServiceMode().then(res=>{
if(res.code) {
this.serviceModeList = res.data;
if(this.serviceModeList.length) {
// this.serviceModeIndex = this.serviceModeList.findIndex(item=>{return item.name==this.targetObj.serviceMode});
// 筛选默认选中项
this.serviceModeList.forEach((item,index)=>{
if(item.name==this.targetObj.serviceMode) {
this.serviceModeIndex = index;
}
})
}
}
})
},
// 查看信息签到执行
handleWorkOrderGet(id){
let params = {
order_id:id,
steps:1
}
handleWorkOrderGet(params).then(res=>{
if(res.code) {
let dataObj = res.data;
this.targetObj.workOrderNo = dataObj.order_number;//工单编号
this.targetObj.projectNo = dataObj.project_number;//项目编号
this.targetObj.projectName = dataObj.project_name;//项目名称
this.targetObj.productType = dataObj.product_type;//产品类型
this.targetObj.installLocation = dataObj.installation_location;//安装位置
this.targetObj.faultType = dataObj.fault_type;//维保类型
this.targetObj.faultExplain = dataObj.failure_description;//维保说明
this.targetObj.urgentDegree = dataObj.emergency_level_view;//紧急程度
this.targetObj.reporter = dataObj.order_contact;//报单人
this.targetObj.declarationTime = dataObj.order_times;//报单时间
this.targetObj.serviceMode = dataObj.service_method_view;//服务方式
// this.targetObj.address = dataObj.order_times;//定位地址
// 调用查询产品类型事件
this.getProductType();
// 调用查询故障类型事件
this.getFaultType();
}
})
},
// 上传图片
chooseImg(){
uni.chooseImage({
count:1,
sourceType:['album','camera'],
success: (res) => {
let imgsrc = res.tempFilePaths[0];
// 获取上传图片id
uploadImg({path:imgsrc}).then(res=>{
if(res.code) {
this.temporaryImg.push(res.data.id);
this.targetObj.faultImgList.push(imgsrc);
}
})
}
})
},
// 签到事件
goWorkOrderThree() {
if(this.checkEmpty()){
if(this.flag) {
this.flag = false;
this.targetObj.startTime = this.$toolAll.tools.returnCurrentTime('-',0);
uni.setStorageSync('targetObj',this.targetObj);
let params = {
steps:1,
order_id:this.orderId || 14,//工单id
start_address:'四川省成都市成华区',//开工地址
product_type:this.productTypeList[this.productIndex].id,//产品类型
installation_location:this.targetObj.installLocation,//安装位置
fault_type:this.faultTypeList[this.faultIndex].id,//维保类型
failure_description:this.targetObj.faultExplain,//维保说明
fault_picture:this.temporaryImg.join(','),//维保图片
service_method:this.serviceModeList[this.serviceModeIndex].id//服务方式
}
handleWorkOrderSubmit(params).then(res=>{
if(res.code) {
uni.navigateTo({
url: `/pages/workOrder/workorderTwo?id=${this.orderId}`
})
}
this.flag = true;
})
}
}
},
// 判空
checkEmpty(){
let result = false;
if(!this.targetObj.productType) {
this.$toolAll.tools.showToast('请填写产品类型');
} else if(!this.targetObj.installLocation) {
this.$toolAll.tools.showToast('请填写安装位置');
} else if(!this.targetObj.faultType) {
this.$toolAll.tools.showToast('请填写维保类型');
} else if(!this.targetObj.faultExplain) {
this.$toolAll.tools.showToast('请填写维保说明');
} else if(this.targetObj.faultImgList.length==0) {
this.$toolAll.tools.showToast('请添加维保图片');
} else if(!this.targetObj.serviceMode) {
this.$toolAll.tools.showToast('请填写服务方式');
} else {
result = true;
}
return result;
}
}
}
</script>
<style>
.submit-button {
margin-top: 60rpx;
}
.work-order-schedule {
display: flex;
padding: 22rpx 29rpx;
margin-top: 10rpx;
background-color: #FFFFFF;
justify-content: space-between;
}
.work-order-schedule .icon {
width: 38rpx;
height: 38rpx;
color: #FFFFFF;
margin: auto;
position: relative;
font-size: 24rpx;
margin-bottom: 10rpx;
text-align: center;
line-height: 38rpx;
background-color: #999999;
border-radius: 50%;
}
.work-order-schedule .on {
background-color: #5391F3
}
.work-order-schedule .text {
font-size: 24rpx;
color: #333333;
}
.work-order-schedule .icon-after::after {
content: "";
width: 265rpx;
height: 2rpx;
background-color: #999999;
position: absolute;
top: 19rpx;
left: 38rpx;
}
.work-order-from {
margin-top: 10rpx;
background-color: #FFFFFF;
}
.work-order-from .li {
display: flex;
padding: 20rpx 40rpx;
border-bottom: 2rpx solid #ececec;
}
.work-order-from .li .title {
font-size: 26rpx;
/* width: 150rpx; */
}
.work-order-from .li .input {
font-size: 24rpx;
color: #8b8b8b;
flex: 1;
padding-left: 15rpx;
display: flex;
}
.work-order-from .li .input .img {
width: 169rpx;
height: 127rpx;
margin-right: 10rpx;
}
.work-order-from .li .input-black {
color: #292929;
}
</style>