<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>