flying-monkey/pagesA/workOrder/workOrder.vue

505 lines
18 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 disac">
<view class="title flexs">工单编号</view>
<input type="text" disabled class="input" :value="targetObj.workOrderNo" />
</view>
<view class="li disac">
<view class="title flexs">项目编号</view>
<input type="text" disabled class="input" :value="targetObj.projectNo" />
</view>
<view class="li disac">
<view class="title flexs">项目名称</view>
<input type="text" disabled class="input input-black" :value="targetObj.projectName" />
</view>
<view class="li disac">
<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 disac">
<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 disac">
<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 disac">
<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 disac">
<view class="title flexs">报 单 人:</view>
<input type="text" style="margin-left: 14rpx;" disabled class="input" placeholder="" :value="targetObj.reporter" />
</view>
<view class="li disac">
<view class="title flexs">报单时间:</view>
<input type="text" disabled disabled class="input" placeholder="" :value="targetObj.declarationTime" />
</view>
<view class="li disac">
<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 disac" @tap="getAddress">
<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:'不显示'}
],//产品类型
productIndex:0,//产品类型下标
faultTypeList:[
{id:2,name:'参数错误'}
],//维保类型
faultIndex:0,//维保类型下标
serviceModeList:[
{id:1,name:'上门服务'}
],//服务方式
serviceModeIndex:0,//服务方式下标
flag:true,
temporaryImg:[],//暂存图片id
addressFlag:true
}
},
onShow() {
uni.removeStorageSync('partsList');
uni.removeStorageSync('targetObj');
},
onLoad(op) {
if(op.id!=undefined) {
this.orderId = op.id;
this.handleWorkOrderGet(this.orderId);
}
// 更新定位地址
this.getAddress();
},
methods: {
// app获取经纬度和详细地址
getAddress(){
// this.$toolAll.tools.showToast('正在获取定位...')
// #ifdef APP-PLUS
if(this.addressFlag) {
this.addressFlag = false;
uni.getLocation({
type: 'gcj02',
geocode:true,
success: (res)=> {
// this.$toolAll.tools.showToast('定位成功');
// console.log(res,'app');
this.targetObj.address = `${res.address.province}${res.address.city}${res.address.district}${res.address.street || ''}${res.address.streetNum || ''}${res.address.poiName || ''}`
setTimeout(()=>{
this.addressFlag = true;
},2000)
}
});
} else {
this.$toolAll.tools.showToast('请勿重复获取定位...')
}
// #endif
// #ifdef MP-WEIXIN
this.getAddressWx();
// #endif
// #ifdef H5
this.getAddressH5();
// #endif
},
// 微信获取经纬度和详细地址
getAddressWx(){
if(this.addressFlag) {
this.addressFlag = false;
uni.getLocation({
type: 'gcj02',
geocode:true,
success: (res)=> {
// console.log(res,'地址信息');
qqmapsdk.reverseGeocoder({
location: {latitude: res.latitude, longitude: res.longitude},
success:(res)=> {
console.log(res,'WX');
// this.$toolAll.tools.showToast('定位成功');
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 || ''})`
setTimeout(()=>{
this.addressFlag = true;
},2000)
},
fail(err) {
console.log(err)
}
})
}
});
} else {
this.$toolAll.tools.showToast('请勿重复获取定位...')
}
},
getAddressH5(){
if(this.addressFlag) {
this.addressFlag = false;
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.$toolAll.tools.showToast('定位成功');
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 || ''})`
setTimeout(()=>{
this.addressFlag = true;
},2000)
})
}
});
} else {
this.$toolAll.tools.showToast('请勿重复获取定位...')
}
},
// 改变产品类型、维保类型、服务方式
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;
}
},
// 查看信息签到执行
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.installLocation = dataObj.installation_location;//安装位置
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;//报单时间
// 产品类型
if(dataObj.form.product_type.length) {
this.productTypeList = [];
dataObj.form.product_type.forEach((item,index)=>{
this.productTypeList.push(item);
if(item.id==dataObj.product_type) {
this.productIndex = index;
this.targetObj.productType = item.name;//产品类型
}
})
}
// 维保类型
if(dataObj.form.fault_type.length) {
this.faultTypeList = [];
dataObj.form.fault_type.forEach((item,index)=>{
this.faultTypeList.push(item);
if(item.id==dataObj.fault_type) {
this.faultIndex = index;
this.targetObj.faultType = item.name;//维保类型
}
})
}
// 服务方式
if(dataObj.form.service_method.length) {
this.serviceModeList = [];
dataObj.form.service_method.forEach((item,index)=>{
this.serviceModeList.push(item);
if(item.id==dataObj.service_method) {
this.serviceModeIndex = index;
this.targetObj.serviceMode = item.name;//服务方式
}
})
}
}
})
},
// 上传图片
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);
}
})
},fail:(err)=> {
this.$toolAll.tools.checkQx(err.code);
}
})
},
// 签到事件
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,//工单id
start_address:this.targetObj.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//服务方式
}
console.log(params,'签到数据')
handleWorkOrderSubmit(params).then(res=>{
console.log(res,'签到状态')
if(res.code) {
uni.navigateTo({
url: `/pagesA/workOrder/workorderTwo?id=${this.orderId}`
})
}
this.flag = true;
})
}
}
},
// 判空
checkEmpty(){
let result = false;
if(!this.targetObj.installLocation) {
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 {
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>