|
|
<template> |
|
|
<view class="page-css"> |
|
|
<view class="info"> |
|
|
<view class="info_title">基本信息</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">单位名称:</text> |
|
|
<text class="item_right_txt">{{ detailForm.deptName }}</text> |
|
|
</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">巡检内容:</text> |
|
|
<text class="item_right_txt">{{ detailForm.taskContent }}</text> |
|
|
</view> |
|
|
</view> |
|
|
<view class="info"> |
|
|
<view class="info_title">巡检配置</view> |
|
|
<u-form labelPosition="left" ref="sendOrderForm" :model="detailForm" :label-width="200" class="repair_form"> |
|
|
<u-form-item label="巡检内容:" prop="dispatchTime" :border-bottom="false"> |
|
|
|
|
|
<u-input v-model="detailForm.taskContent" :disabled="true" :border="true" |
|
|
class="sp-new-input-diabled" /> |
|
|
</u-form-item> |
|
|
<u-form-item label="任务开始时间:" prop="dispatchTime" :border-bottom="false"> |
|
|
|
|
|
<u-input v-model="detailForm.startTime" :disabled="true" :border="true" |
|
|
class="sp-new-input-diabled" /> |
|
|
</u-form-item> |
|
|
<u-form-item label="预约上门时间:" prop="customerOpinion" :border-bottom="false"> |
|
|
<u-input v-if="reservationDisabled" v-model="reservationTime" type="select" |
|
|
@click="calendarShow = true" :border="true" placeholder="请选择时间" /> |
|
|
<view v-else>{{ detailForm.reservationTime }}</view> |
|
|
</u-form-item> |
|
|
</u-form> |
|
|
</view> |
|
|
<!-- 巡检任务 只查看--> |
|
|
<view class="info" v-if="reservationDisabled"> |
|
|
<view class="info_title">巡检任务</view> |
|
|
<u-collapse :accordion="false"> |
|
|
<u-collapse-item v-for="(item, index) in detailForm.details" :key="index"> |
|
|
<view slot="title"> |
|
|
<text class="collapse-title">实验室楼层:{{ item.floorName }}</text> |
|
|
</view> |
|
|
<view v-for="(v, vindex) in item.details" :key="vindex" class="collapse-room"> |
|
|
<view>房间名称:{{ v.deptName }}</view> |
|
|
<view v-for="(s, sindex) in v.details" :key="sindex" class="n-box"> |
|
|
<u-tag :text="sindex + 1" type="info" class="left-tag" /> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">设备:</text> |
|
|
<text class="item_right_txt"> |
|
|
{{ s.deviceName }} |
|
|
</text> |
|
|
</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">巡检内容:</text> |
|
|
<text class="item_right_txt"> |
|
|
{{ s.checkContent }} |
|
|
</text> |
|
|
</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">工艺要求:</text> |
|
|
<text class="item_right_txt"> |
|
|
{{ s.craft }} |
|
|
</text> |
|
|
</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">巡检周期:</text> |
|
|
<text class="item_right_txt"> |
|
|
{{ periodName(s.period) }} |
|
|
</text> |
|
|
</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">开始时间:</text> |
|
|
<text class="item_right_txt"> |
|
|
{{ s.startTime }} |
|
|
</text> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</u-collapse-item> |
|
|
</u-collapse> |
|
|
</view> |
|
|
<view class="info" |
|
|
v-if="detailForm.repairStatus == 100 || detailForm.repairStatus == 101 || detailForm.repairStatus == 102"> |
|
|
<view class="info_title" v-if="detailForm.repairStatus == 100">维修人员驳回</view> |
|
|
<view class="info_title" v-if="detailForm.repairStatus == 101">主管驳回</view> |
|
|
<view class="info_title" v-if="detailForm.repairStatus == 102">客户驳回</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">驳回原因:</text> |
|
|
<text class="item_right_txt">{{ detailForm.approveRemark }}</text> |
|
|
</view> |
|
|
</view> |
|
|
<!-- 填写内容 --> |
|
|
<view class="info" v-if="!reservationDisabled"> |
|
|
<view class="info_title">巡检任务</view> |
|
|
<view class="info_search"> |
|
|
<u-search placeholder="请输入设备名称" v-model="deviceNameSearch" :clearabled="true" |
|
|
@change="deviceNameSearchFn" :show-action="false"></u-search> |
|
|
</view> |
|
|
<u-collapse :accordion="false" ref="collapseTask" |
|
|
v-if="detailForm.details && detailForm.details.length > 0"> |
|
|
<u-collapse-item v-for="(item, index) in detailForm.details" :key="index"> |
|
|
<view slot="title"> |
|
|
<text class="collapse-title">实验室楼层:{{ item.floorName }}</text> |
|
|
</view> |
|
|
<view v-for="(v, vindex) in item.details" :key="vindex" class="collapse-room"> |
|
|
<view>房间名称:{{ v.deptName }}</view> |
|
|
<view v-for="(s, sindex) in v.details" :key="sindex" class="n-box"> |
|
|
<u-tag :text="sindex + 1" type="info" class="left-tag" /> |
|
|
<!-- <u-tag text="已检" type="success" class="right-tag" /> --> |
|
|
<view class="n-box-title">设备: {{ s.deviceName }}</view> |
|
|
<view class="n-box-title">内容: {{ s.checkContent }}</view> |
|
|
<view class="n-box-info">工艺: {{ s.craft }}</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">状态:</text> |
|
|
<text class="item_right_txt"> |
|
|
<u-radio-group v-model="s.status" :disabled="taskDisabled"> |
|
|
<u-radio name="0">正常</u-radio> |
|
|
<u-radio name="1">异常</u-radio> |
|
|
</u-radio-group> |
|
|
|
|
|
</text> |
|
|
</view> |
|
|
<view class="info_item"> |
|
|
<text class="item_left_txt">现场照片:</text> |
|
|
<text class="item_right_txt" v-if="s.picUrl == ''"> |
|
|
|
|
|
<view class="btn" v-if="!taskDisabled" @click="uploadImg(index, vindex, sindex)"> |
|
|
上传照片</view> |
|
|
<view v-else>无</view> |
|
|
</text> |
|
|
<text class="item_right_txt" v-else> |
|
|
<image @click="uploadImg(index, vindex, sindex)" class="item_right_img" |
|
|
:src="s.picUrl"></image> |
|
|
</text> |
|
|
</view> |
|
|
|
|
|
<view class="info_item" |
|
|
v-if="(dataTypes == 4 && (detailForm.repairStatus == 1 || detailForm.repairStatus == 101)) || (dataTypes == 3 && (detailForm.repairStatus == 2 || detailForm.repairStatus == 102))"> |
|
|
<text class="item_left_txt">价格:</text> |
|
|
<text class="item_right_txt"> |
|
|
<u-input v-model="s.price" type="number" :border="true" :disabled="priceDisabled" |
|
|
:class="priceDisabled ? 'sp-new-input-diabled' : ''" /> |
|
|
</text> |
|
|
</view> |
|
|
<view class="info_item" v-if="dataTypes == 1 && detailForm.repairStatus == 3"> |
|
|
<text class="item_left_txt">是否维修:</text> |
|
|
<text class="item_right_txt"> |
|
|
<u-radio-group v-model="s.isRepair"> |
|
|
<u-radio name="1">是</u-radio> |
|
|
<u-radio name="0">否</u-radio> |
|
|
</u-radio-group> |
|
|
</text> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</u-collapse-item> |
|
|
</u-collapse> |
|
|
<u-empty text="设备为空" mode="list" v-else></u-empty> |
|
|
</view> |
|
|
<view class="info"> |
|
|
<u-form labelPosition="left" ref="sendOrderForm" :model="detailForm" :label-width="120" class="repair_form"> |
|
|
<u-form-item label="签字:" prop="signUrl" :border-bottom="false" :required="true"> |
|
|
<u-input :border="true" v-model="signUrl" :placeholder="'请输入'" |
|
|
:class="taskDisabled ? 'sp-new-input-diabled' : ''" :disabled="taskDisabled" /> |
|
|
<!-- <image v-if="s.qianzi" :src="s.qianzi" style="width: 144px;height: 77rpx;" |
|
|
mode="widthFix" @click="toPop1(index, vindex, sindex)"></image> |
|
|
<view v-else class="btn" @click="toPop1(index, vindex, sindex)">签字</view> --> |
|
|
</u-form-item> |
|
|
<u-form-item label="备注:" prop="remark" :border-bottom="false"> |
|
|
<u-input :border="true" v-model="remark" :placeholder="'请输入'" type="textarea" :height="120" |
|
|
class="taskDisabled?'sp-new-input-diabled':''" :disabled="taskDisabled" /> |
|
|
</u-form-item> |
|
|
</u-form> |
|
|
|
|
|
</view> |
|
|
<!-- 客户巡检任务 确认审批 --> |
|
|
<view class="info" v-if="dataTypes == 1 && detailForm.taskStatus == 3"> |
|
|
<view class="info_title">巡检确认</view> |
|
|
<u-form labelPosition="left" ref="repairInfoForm" :model="approveInfo" :label-width="140" |
|
|
class="repair_form"> |
|
|
<u-form-item label="结果:" prop="reportPeople" :border-bottom="false"> |
|
|
<betone-input-picker :label="''" :pickerData="approveType" :mode="'selector'" :keyName="'text'" |
|
|
@changeSelect="changeApproveResult" v-model="approveInfo.approveText"></betone-input-picker> |
|
|
|
|
|
</u-form-item> |
|
|
<u-form-item label="意见:" prop="reportPeople" :border-bottom="false" |
|
|
v-if="approveInfo.approveText == '未完成'"> |
|
|
<u-input v-model="approveInfo.approveRemark" :border="true" placeholder="请输入" type="textarea" |
|
|
:height="120" /> |
|
|
</u-form-item> |
|
|
</u-form> |
|
|
</view> |
|
|
<!-- 维修负责人 巡检维修方案审批 --> |
|
|
<view class="info" v-if="dataTypes == 3 && (detailForm.repairStatus == 2 || detailForm.repairStatus == 102)"> |
|
|
<view class="info_title">维修方案审批</view> |
|
|
<u-form labelPosition="left" ref="repairInfoForm" :model="repairApproveInfo" :label-width="140" |
|
|
class="repair_form"> |
|
|
<u-form-item label="审批结果:" prop="reportPeople" :border-bottom="false"> |
|
|
<betone-input-picker :label="''" :pickerData="repairApproveType" :mode="'selector'" |
|
|
:keyName="'text'" @changeSelect="changeRepairApproveResult" |
|
|
v-model="repairApproveInfo.approveText"></betone-input-picker> |
|
|
|
|
|
</u-form-item> |
|
|
<u-form-item label="审批意见:" prop="reportPeople" :border-bottom="false" |
|
|
v-if="repairApproveInfo.approveText == '驳回'"> |
|
|
<u-input v-model="repairApproveInfo.approveRemark" :border="true" placeholder="请输入" type="textarea" |
|
|
:height="120" /> |
|
|
</u-form-item> |
|
|
</u-form> |
|
|
</view> |
|
|
|
|
|
|
|
|
<view class="info" v-if="dataTypes == 1 && detailForm.repairStatus == 3"> |
|
|
<view class="info_title">客户确认</view> |
|
|
<u-form labelPosition="left" ref="repairInfoForm" :model="customerApproveInfo" :label-width="140" |
|
|
class="repair_form"> |
|
|
<u-form-item label="审批结果:" prop="reportPeople" :border-bottom="false"> |
|
|
<betone-input-picker :label="''" :pickerData="repairApproveType" :mode="'selector'" |
|
|
:keyName="'text'" @changeSelect="changeCustomerApproveResult" |
|
|
v-model="customerApproveInfo.approveText"></betone-input-picker> |
|
|
|
|
|
</u-form-item> |
|
|
<u-form-item label="审批意见:" prop="reportPeople" :border-bottom="false" |
|
|
v-if="customerApproveInfo.approveText == '驳回'"> |
|
|
<u-input v-model="customerApproveInfo.approveRemark" :border="true" placeholder="请输入" |
|
|
type="textarea" :height="120" /> |
|
|
</u-form-item> |
|
|
</u-form> |
|
|
</view> |
|
|
<!-- 维修人员接收任务单 --> |
|
|
<view class="repair-btn" style="margin-right: 32rpx;width:100%" |
|
|
v-if="dataTypes == 4 && detailForm.taskStatus == 1 && detailsType == 'task'"> |
|
|
<u-button size="medium" @click="endOrderCancel()">取消</u-button> |
|
|
<u-button size="medium" type="primary" @click="receiveQuest()">接单</u-button> |
|
|
</view> |
|
|
|
|
|
<!-- 维修人员提交巡检详情 --> |
|
|
<view class="repair-btn" style="margin-right: 32rpx;width:100%" |
|
|
v-if="dataTypes == 4 && detailForm.taskStatus == 2 && detailsType == 'task'"> |
|
|
<u-button size="medium" @click="endOrderCancel()">取消</u-button> |
|
|
<u-button size="medium" type="primary" @click="submitQuest()">提交</u-button> |
|
|
</view> |
|
|
<!-- 客户 确认巡检任务是否完成提交 --> |
|
|
<view class="repair-btn" style="margin-right: 32rpx;width:100%" |
|
|
v-if="dataTypes == 1 && detailForm.taskStatus == 3 && detailsType == 'task'"> |
|
|
<u-button size="medium" @click="endOrderCancel()">取消</u-button> |
|
|
<u-button size="medium" type="primary" @click="customerQuest()">提交</u-button> |
|
|
</view> |
|
|
|
|
|
<!-- 维修人员 提交维修方案 --> |
|
|
<view class="repair-btn" style="margin-right: 32rpx;width:100%" |
|
|
v-if="dataTypes == 4 && detailForm.repairStatus == 1 && detailsType == 'repair'"> |
|
|
<u-button size="medium" @click="endOrderCancel()">取消</u-button> |
|
|
<u-button size="medium" type="primary" @click="solutionSubmit()">提交方案</u-button> |
|
|
</view> |
|
|
<!-- 维修主管审批 巡检 维修方案 --> |
|
|
<view class="repair-btn" style="margin-right: 32rpx;width:100%" |
|
|
v-if="dataTypes == 3 && detailForm.repairStatus == 2 && detailsType == 'repair'"> |
|
|
<u-button size="medium" @click="endOrderCancel()">取消</u-button> |
|
|
<u-button size="medium" type="primary" @click="repairApproveSubmit()">提交</u-button> |
|
|
</view> |
|
|
<!-- 客户审批 巡检 维修方案 确认是否维修--> |
|
|
<view class="repair-btn" style="margin-right: 32rpx;width:100%" |
|
|
v-if="dataTypes == 1 && detailForm.repairStatus == 3 && detailsType == 'repair'"> |
|
|
<u-button size="medium" @click="endOrderCancel()">取消</u-button> |
|
|
<u-button size="medium" type="primary" @click="customerApproveSubmit()">提交</u-button> |
|
|
</view> |
|
|
|
|
|
<u-calendar v-model="calendarShow" mode="date" @change="calendarChange" :min-date="minDate" |
|
|
:max-date="maxDate"></u-calendar> |
|
|
|
|
|
<betone-loading ref="BetLoading" /> |
|
|
</view> |
|
|
</template> |
|
|
<script> |
|
|
import website from '@/utils/website' |
|
|
import { dateFormat } from '@/utils/util.js' |
|
|
export default { |
|
|
|
|
|
computed: { |
|
|
dataTypes() { |
|
|
return this.$store.state.dataType |
|
|
}, |
|
|
reservationDisabled() { |
|
|
return (this.dataTypes == 4 && this.detailForm.taskStatus == 1) || (this.type == 'view') ? true : false |
|
|
}, |
|
|
taskDisabled() { |
|
|
return (this.dataTypes == 4 && (this.detailForm.taskStatus == 2)) ? false : true |
|
|
}, |
|
|
priceDisabled() { |
|
|
return this.dataTypes == 4 && (this.detailForm.repairStatus == 1 || this.detailForm.repairStatus == 101) ? false : true |
|
|
} |
|
|
}, |
|
|
data() { |
|
|
return { |
|
|
detailForm: {}, |
|
|
orderId: '',//巡检任务id |
|
|
detailsType: '',//详情类型 |
|
|
optionsType: '',//可操作类型 |
|
|
reservationTime: '',//预约上门时间 |
|
|
minDate: null, |
|
|
maxDate: null, |
|
|
calendarShow: false,//预约时间 |
|
|
collapseData: [], |
|
|
signUrl: '',//签字 |
|
|
remark: '',//备注 |
|
|
approveInfo: {//维修负责人审批 |
|
|
approvePerson: '',//审批人 id |
|
|
approveRemark: '',//审批备注 |
|
|
approveResult: null,//1通过 0驳回 |
|
|
approveText: '',//展示内容 |
|
|
approveTime: '',//当前时间 |
|
|
}, |
|
|
approveType: [ |
|
|
{ |
|
|
text: '已完成', |
|
|
value: 1 |
|
|
}, |
|
|
{ |
|
|
text: '未完成', |
|
|
value: 0 |
|
|
}, |
|
|
], |
|
|
repairApproveInfo: { |
|
|
approvePerson: '',//审批人 id |
|
|
approveRemark: '',//审批备注 |
|
|
approveResult: null,//1通过 0驳回 |
|
|
approveText: '',//展示内容 |
|
|
approveTime: '',//当前时间 |
|
|
}, |
|
|
repairApproveType: [ |
|
|
{ |
|
|
text: '通过', |
|
|
value: 1 |
|
|
}, |
|
|
{ |
|
|
text: '驳回', |
|
|
value: 0 |
|
|
}, |
|
|
], |
|
|
|
|
|
customerApproveInfo: { |
|
|
approvePerson: '',//审批人 id |
|
|
approveRemark: '',//审批备注 |
|
|
approveResult: null,//1通过 0驳回 |
|
|
approveText: '',//展示内容 |
|
|
approveTime: '',//当前时间 |
|
|
}, |
|
|
deviceNameSearch: '',//巡检任务 搜索设备名称 |
|
|
deviceList: [],//记录设备总数 |
|
|
} |
|
|
}, |
|
|
onLoad(options) { |
|
|
this.optionsType = options.type |
|
|
this.orderId = options.id |
|
|
this.detailsType = options.details |
|
|
this.getDetails() |
|
|
this.initDate() |
|
|
this.userInfo = uni.getStorageSync("userinfo"); |
|
|
}, |
|
|
methods: { |
|
|
getDetails() { |
|
|
let query = { |
|
|
id: this.orderId |
|
|
} |
|
|
if (this.detailsType == 'task') { |
|
|
this.$u.api.getTaskDetail(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
|
|
|
this.updateData(res.data.details) |
|
|
this.detailForm = res.data |
|
|
this.deviceList = this.detailForm.details |
|
|
this.signUrl = res.data.signUrl |
|
|
this.remark = res.data.remark |
|
|
this.collapseData = JSON.parse(JSON.stringify(res.data.details)) |
|
|
} |
|
|
}) |
|
|
} else { |
|
|
this.$u.api.getRepairDetail(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
|
|
|
this.updateData(res.data.details) |
|
|
this.detailForm = res.data |
|
|
this.deviceList = this.detailForm.details |
|
|
this.signUrl = res.data.signUrl |
|
|
this.remark = res.data.remark |
|
|
this.collapseData = JSON.parse(JSON.stringify(res.data.details)) |
|
|
} |
|
|
}) |
|
|
} |
|
|
|
|
|
}, |
|
|
// 处理数据 更改数据价格为-1的数据 |
|
|
updateData(data) { |
|
|
if (data.length > 0) { |
|
|
for (let i = 0; i < data.length; i++) { |
|
|
data[i].price = data[i].price < 0 ? null : data[i].price |
|
|
if (data[i].details.length > 0) { |
|
|
this.updateData(data[i].details) |
|
|
} |
|
|
} |
|
|
} |
|
|
}, |
|
|
endOrderCancel() { |
|
|
uni.navigateBack({ |
|
|
delta: 1 // 默认值是1,表示回退一个页面 |
|
|
}) |
|
|
}, |
|
|
// 维修人员接收 |
|
|
receiveQuest() { |
|
|
let query = { |
|
|
id: this.detailForm.id |
|
|
} |
|
|
if (this.reservationTime == '') { |
|
|
uni.showToast({ title: "请选择上门时间", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
// // 接收成功之后更新上门时间 |
|
|
this.$u.api.taskServicemanreceive(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
let query_ = { |
|
|
id: this.detailForm.id, |
|
|
reservationTime: this.reservationTime |
|
|
} |
|
|
this.$u.api.taskServicemanUpdateTime(query_).then(res => { |
|
|
uni.showToast({ title: "接单成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
uni.navigateBack({ |
|
|
delta: 1 // 默认值是1,表示回退一个页面 |
|
|
}) |
|
|
}, 500) |
|
|
}) |
|
|
|
|
|
} |
|
|
}) |
|
|
}, |
|
|
uploadImg(index, vindex, sindex) { |
|
|
uni.chooseImage({ |
|
|
count: 1, // 默认9 |
|
|
sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图,默认二者都有 |
|
|
sourceType: ["album", "camera"], // 可以指定来源是相册还是相机,默认二者都有 |
|
|
success: (res) => { |
|
|
this.$refs.BetLoading.show() |
|
|
// 成功选择图片后的回调 |
|
|
const tempFilePaths = res.tempFilePaths; |
|
|
this.uploadFile(tempFilePaths[0], index, vindex, sindex); |
|
|
}, |
|
|
}); |
|
|
}, |
|
|
uploadFile(filePath, index, vindex, sindex) { |
|
|
const token = uni.getStorageSync("token") |
|
|
uni.uploadFile({ |
|
|
url: website.baseUrl + "/blade-resource/oss/endpoint/put-file", // 服务器上传接口 |
|
|
filePath: filePath, |
|
|
name: "file", // 必须填写,后台用来接收文件 |
|
|
header: { |
|
|
'Blade-Auth': 'bearer ' + token, |
|
|
'Authorization': `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`, |
|
|
'blade-requested-with': 'BladeHttpRequest' //自定义请求头 |
|
|
}, |
|
|
formData: {}, |
|
|
success: (res) => { |
|
|
let info = JSON.parse(res.data); |
|
|
console.log("上传成功", info); // 上传成功后的操作 |
|
|
this.detailForm.details[index].details[vindex].details[sindex].picUrl = info.data.link |
|
|
this.itemCollapseChange() |
|
|
this.$refs.BetLoading.hide() |
|
|
}, |
|
|
error: (uploadFileRes) => { |
|
|
this.$refs.BetLoading.hide() |
|
|
}, |
|
|
}); |
|
|
}, |
|
|
// 维修人员提交明细 |
|
|
submitQuest() { |
|
|
let newArr = this.handleData(this.deviceList) |
|
|
let status = newArr.every((item) => { |
|
|
return item.status != null |
|
|
}) |
|
|
|
|
|
if (!status) { |
|
|
uni.showToast({ title: "请选择设备状态", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
if (this.signUrl == '') { |
|
|
uni.showToast({ title: "请填写使用人", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
let queryData = [] |
|
|
newArr.forEach(item => { |
|
|
queryData.push({ |
|
|
id: item.id, |
|
|
status: item.status, |
|
|
// signUrl: item.signUrl, |
|
|
// remark: item.remark, |
|
|
picUrl: item.picUrl, |
|
|
taskId: this.detailForm.id |
|
|
}) |
|
|
}) |
|
|
console.log(11111111, newArr) |
|
|
// this.$u.api.updateDetaile(queryData).then(res => { |
|
|
// if (res.code == 200) { |
|
|
// let signInfo = { |
|
|
// id: this.detailForm.id, |
|
|
// signUrl: this.signUrl, |
|
|
// remark: this.remark |
|
|
// } |
|
|
// this.$u.api.updateSign(signInfo).then(res => { |
|
|
// if (res.code == 200) { |
|
|
// let query = { |
|
|
// id: this.detailForm.id, |
|
|
// } |
|
|
// this.$u.api.taskServicemanSubmit(query).then(res => { |
|
|
// if (res.code == 200) { |
|
|
// uni.showToast({ title: "提交成功", icon: "none" }); |
|
|
// setTimeout(() => { |
|
|
// uni.navigateBack({ |
|
|
// delta: 1 // 默认值是1,表示回退一个页面 |
|
|
// }) |
|
|
// }, 500) |
|
|
// } |
|
|
// }) |
|
|
// } |
|
|
// }) |
|
|
|
|
|
// } |
|
|
// }) |
|
|
}, |
|
|
// 客户确认巡检任务 |
|
|
changeApproveResult(e) { |
|
|
this.approveInfo.approveText = this.approveType[e].text |
|
|
this.approveInfo.approveResult = this.approveType[e].value |
|
|
}, |
|
|
customerQuest() { |
|
|
if (this.approveInfo.approveResult == null) { |
|
|
uni.showToast({ title: "请选择确认结果", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
if (this.approveInfo.approveResult == 0 && this.approveInfo.approveRemark == '') { |
|
|
uni.showToast({ title: "请填写未完成原因", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
if (this.approveInfo.approveResult == 1) { |
|
|
let query = { |
|
|
id: this.detailForm.id |
|
|
} |
|
|
this.$u.api.taskCustomerConfirm(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "确认成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
this.endOrderCancel() |
|
|
}, 500) |
|
|
} |
|
|
}) |
|
|
} else { |
|
|
let query = { |
|
|
id: this.detailForm.id, |
|
|
approvePerson: this.userInfo.user_id, |
|
|
appproveResult: this.approveInfo.approveResult, |
|
|
approveTime: dateFormat("yyyy-MM-dd hh:mm:ss", new Date()),//当前时间 |
|
|
approveRemark: this.approveInfo.approveRemark,//审批备注 |
|
|
} |
|
|
this.$u.api.taskCustomerRefuse(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "确认成功", icon: "none" }); |
|
|
this.submitTaskShow = false |
|
|
// 指派成功 刷新列表 |
|
|
this.getRecordsList() |
|
|
} |
|
|
}) |
|
|
} |
|
|
}, |
|
|
|
|
|
// 提交 |
|
|
solutionSubmit() { |
|
|
let newArr = this.handleData(this.detailForm.details) |
|
|
let price = newArr.every((item) => { |
|
|
return item.price > 0 |
|
|
}) |
|
|
if (!price) { |
|
|
uni.showToast({ title: "请填写正确的维修价格", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
// let queryData = [] |
|
|
let query_ = { |
|
|
task: { id: this.detailForm.id }, |
|
|
detailList: newArr, |
|
|
} |
|
|
this.$u.api.taskSolutionSave(query_).then(res => { |
|
|
if (res.code == 200) { |
|
|
let query = { |
|
|
id: this.detailForm.id, |
|
|
} |
|
|
this.$u.api.taskSolutionSubmit(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "提交成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
uni.navigateBack({ |
|
|
delta: 1 // 默认值是1,表示回退一个页面 |
|
|
}) |
|
|
}, 500) |
|
|
} |
|
|
}) |
|
|
} |
|
|
}) |
|
|
}, |
|
|
|
|
|
// 维修主管审批 |
|
|
changeRepairApproveResult(e) { |
|
|
this.repairApproveInfo.approveText = this.repairApproveType[e].text |
|
|
this.repairApproveInfo.approveResult = this.repairApproveType[e].value |
|
|
}, |
|
|
// 主管审批 |
|
|
repairApproveSubmit() { |
|
|
if (this.repairApproveInfo.approveResult == 1) {//通过 |
|
|
let query = { |
|
|
id: this.detailForm.id |
|
|
} |
|
|
this.$u.api.repairSolutionSupervisor(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "审批成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
uni.navigateBack({ |
|
|
delta: 1 // 默认值是1,表示回退一个页面 |
|
|
}) |
|
|
}, 500) |
|
|
} |
|
|
}) |
|
|
} else {//驳回 |
|
|
let query_ = { |
|
|
id: this.detailForm.id, |
|
|
approvePerson: this.userInfo.user_id, |
|
|
appproveResult: this.repairApproveInfo.approveResult, |
|
|
approveTime: dateFormat("yyyy-MM-dd hh:mm:ss", new Date()),//当前时间 |
|
|
approveRemark: this.repairApproveInfo.approveRemark,//审批备注 |
|
|
} |
|
|
this.$u.api.repairSolutionRefuse(query_).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "审批成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
uni.navigateBack({ |
|
|
delta: 1 // 默认值是1,表示回退一个页面 |
|
|
}) |
|
|
}, 500) |
|
|
} |
|
|
}) |
|
|
} |
|
|
}, |
|
|
// 客户 审批 |
|
|
changeCustomerApproveResult(e) { |
|
|
this.customerApproveInfo.approveText = this.repairApproveType[e].text |
|
|
this.customerApproveInfo.approveResult = this.repairApproveType[e].value |
|
|
}, |
|
|
// 客户 确认维修方案 |
|
|
customerApproveSubmit() { |
|
|
let newArr = this.handleData(this.detailForm.details) |
|
|
let isRepair = newArr.every((item) => { |
|
|
return item.isRepair == -1 |
|
|
}) |
|
|
if (this.customerApproveInfo.approveResult == null) { |
|
|
uni.showToast({ title: "请选择审核结果", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
if (this.customerApproveInfo.approveResult == 1) { |
|
|
if (isRepair) { |
|
|
uni.showToast({ title: "请选择异常设备是否维修", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
|
|
|
if (this.customerApproveInfo.approveResult == 0 && this.customerApproveInfo.approveRemark == '') { |
|
|
uni.showToast({ title: "请填写驳回原因", icon: "none" }); |
|
|
return false |
|
|
} |
|
|
} |
|
|
|
|
|
if (this.customerApproveInfo.approveResult == 1) {//通过 |
|
|
let query = { |
|
|
task: { |
|
|
id: this.detailForm.id |
|
|
}, |
|
|
detailList: newArr |
|
|
} |
|
|
console.log(query) |
|
|
this.$u.api.repairSolutionCustomer(query).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "审核成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
this.endOrderCancel() |
|
|
}, 500) |
|
|
} |
|
|
}) |
|
|
} else {//驳回 |
|
|
let query_ = { |
|
|
id: this.detailForm.id, |
|
|
approvePerson: this.userInfo.user_id, |
|
|
appproveResult: this.customerApproveInfo.approveResult, |
|
|
approveTime: dateFormat("yyyy-MM-dd hh:mm:ss", new Date()),//当前时间 |
|
|
approveRemark: this.customerApproveInfo.approveRemark,//审批备注 |
|
|
} |
|
|
this.$u.api.repairCustomerRefuse(query_).then(res => { |
|
|
if (res.code == 200) { |
|
|
uni.showToast({ title: "驳回成功", icon: "none" }); |
|
|
setTimeout(() => { |
|
|
this.endOrderCancel() |
|
|
}, 500) |
|
|
} |
|
|
}) |
|
|
} |
|
|
|
|
|
}, |
|
|
// 处理提交明细的数据 |
|
|
handleData(arr) { |
|
|
let result = []; |
|
|
arr.forEach(subArray => { |
|
|
|
|
|
if (Array.isArray(subArray.details)) { |
|
|
subArray.details.forEach(item => { |
|
|
|
|
|
if (Array.isArray(item.details)) { |
|
|
item.details.forEach(v => { |
|
|
result = result.concat(v); |
|
|
}) |
|
|
// |
|
|
} else { |
|
|
result.push(item); |
|
|
} |
|
|
}); |
|
|
} |
|
|
}); |
|
|
return result; |
|
|
}, |
|
|
// 巡检周期 |
|
|
periodName(value) { |
|
|
if (value == 1) { |
|
|
return '月' |
|
|
} |
|
|
if (value == 2) { |
|
|
return '季度' |
|
|
} |
|
|
if (value == 3) { |
|
|
return '半年' |
|
|
} |
|
|
}, |
|
|
// 设置最大可选择时间 |
|
|
initDate() { |
|
|
let date = new Date(); |
|
|
let year = date.getFullYear(); |
|
|
let month = date.getMonth() + 1; |
|
|
let day = date.getDate(); |
|
|
if (month < 10) { |
|
|
month = "0" + month; |
|
|
} |
|
|
if (day < 10) { |
|
|
day = "0" + day; |
|
|
} |
|
|
let minyear = year; |
|
|
this.minDate = minyear + "-" + month + "-" + day; |
|
|
//let maxyear = year + 1; |
|
|
this.maxDate = year + 1 + "-" + month + "-" + day; // 最大日期可选到一年后 |
|
|
//this.maxDate = year + '-'+ month +'-' + day; // 最大日期可选到今天 |
|
|
}, |
|
|
calendarChange(e) { |
|
|
this.reservationTime = e.result |
|
|
}, |
|
|
// 更改 手风琴的高度 |
|
|
itemCollapseChange() { |
|
|
this.$nextTick(() => { |
|
|
this.$refs.collapseTask.init() |
|
|
}) |
|
|
}, |
|
|
deviceNameSearchFn(val) { |
|
|
this.detailForm.details = [] |
|
|
let newArr = this.filterByDeviceName(this.deviceList, val) |
|
|
this.detailForm.details = newArr.details |
|
|
this.itemCollapseChange() |
|
|
}, |
|
|
// 过滤 搜索条件 |
|
|
filterByDeviceName(data, targetDeviceName) { |
|
|
// 定义一个递归函数来处理多维数组 |
|
|
|
|
|
const recursiveFilter = (details) => { |
|
|
|
|
|
return details |
|
|
.map(item => { |
|
|
// 过滤 item.details,保持设备名称匹配的项 |
|
|
const filteredDetails = item.details ? item.details.map(subItem => { |
|
|
|
|
|
const matchingDetails = subItem.details |
|
|
? subItem.details.filter(detail => detail.deviceName.includes(targetDeviceName)) |
|
|
: []; |
|
|
console.log('matchingDetails', matchingDetails) |
|
|
return { |
|
|
...subItem, |
|
|
details: matchingDetails.length > 0 ? matchingDetails : undefined, // 只保留有匹配项的 details |
|
|
}; |
|
|
}).filter(subItem => subItem.details) : []; // 仅保留 details 不为空的项 |
|
|
|
|
|
return { |
|
|
...item, |
|
|
details: filteredDetails.length > 0 ? filteredDetails : undefined, // 只保留有匹配项的 details |
|
|
}; |
|
|
}) |
|
|
.filter(item => item.details); // 过滤掉没有匹配 details 的项 |
|
|
}; |
|
|
|
|
|
return { |
|
|
...data, |
|
|
details: recursiveFilter(data) |
|
|
}; |
|
|
} |
|
|
}, |
|
|
|
|
|
} |
|
|
</script> |
|
|
<style lang="scss" scoped> |
|
|
.page-css { |
|
|
width: 100%; |
|
|
padding: 0; |
|
|
padding-top: 26rpx; |
|
|
|
|
|
.info { |
|
|
margin: 0 24rpx 20rpx; |
|
|
border-radius: 20rpx; |
|
|
background-color: rgba(255, 255, 255, 1); |
|
|
padding: 6rpx 0 34rpx; |
|
|
|
|
|
.info_title { |
|
|
line-height: 60rpx; |
|
|
color: rgba(0, 0, 0, 1); |
|
|
font-size: 32rpx; |
|
|
text-align: left; |
|
|
font-family: SourceHanSansSC-bold; |
|
|
margin: 18rpx 0 0rpx 20rpx; |
|
|
font-weight: bold; |
|
|
} |
|
|
.info_search{ |
|
|
padding:0 32rpx |
|
|
} |
|
|
|
|
|
.info_item { |
|
|
padding: 4rpx 20rpx 0; |
|
|
|
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: space-between; |
|
|
|
|
|
.item_left_txt { |
|
|
color: rgba(108, 108, 108, 1); |
|
|
font-size: 28rpx; |
|
|
text-align: left; |
|
|
font-family: SourceHanSansSC-regular; |
|
|
width: 210rpx; |
|
|
margin-right: 20rpx; |
|
|
line-height: 60rpx; |
|
|
} |
|
|
|
|
|
.item_right_txt { |
|
|
max-width: calc(100% - 220rpx); |
|
|
color: rgba(0, 0, 0, 1); |
|
|
font-size: 28rpx; |
|
|
// text-align: left; |
|
|
text-align: justify; |
|
|
font-family: SourceHanSansSC-regular; |
|
|
} |
|
|
|
|
|
.item_right_img { |
|
|
width: 140rpx; |
|
|
height: 140rpx; |
|
|
border-radius: 8rpx; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
.repair-btn { |
|
|
width: 100%; |
|
|
height: 150rpx; |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
/* 水平均匀分布 */ |
|
|
margin-top: 32rpx; |
|
|
padding: 0 32rpx; |
|
|
|
|
|
/deep/.u-btn { |
|
|
width: 48%; |
|
|
} |
|
|
} |
|
|
|
|
|
.repair_form { |
|
|
padding: 0 18rpx; |
|
|
} |
|
|
|
|
|
.collapse-room { |
|
|
margin: 0 32rpx 20rpx; |
|
|
color: rgba(0, 0, 0, 1); |
|
|
} |
|
|
|
|
|
// .collapse-major { |
|
|
// margin: 0 32rpx 20rpx; |
|
|
// color: rgba(0, 0, 0, 1); |
|
|
// margin: 12rpx 24rpx 12rpx; |
|
|
|
|
|
.n-box { |
|
|
border: 1px solid rgba(239, 239, 239, 1); |
|
|
padding: 32rpx 54rpx 0; |
|
|
margin-top: 24rpx; |
|
|
margin-bottom: 24rpx; |
|
|
position: relative; |
|
|
|
|
|
.right-tag { |
|
|
position: absolute; |
|
|
right: 0; |
|
|
top: 0; |
|
|
} |
|
|
|
|
|
.left-tag { |
|
|
position: absolute; |
|
|
left: 0; |
|
|
top: 0; |
|
|
padding-left: 10rpx; |
|
|
padding-right: 10rpx; |
|
|
} |
|
|
|
|
|
.n-box-title { |
|
|
color: rgba(0, 0, 0, 1); |
|
|
font-size: 28rpx; |
|
|
text-align: left; |
|
|
} |
|
|
|
|
|
.n-box-info { |
|
|
line-height: 32rpx; |
|
|
color: rgba(154, 154, 154, 1); |
|
|
font-size: 24rpx; |
|
|
padding-top: 12rpx; |
|
|
padding-bottom: 12rpx; |
|
|
} |
|
|
|
|
|
.info_item { |
|
|
width: 100%; |
|
|
display: flex; |
|
|
flex-direction: row; |
|
|
margin: 24rpx 0 24rpx; |
|
|
|
|
|
.item_left_txt { |
|
|
color: rgba(108, 108, 108, 1); |
|
|
font-size: 28rpx; |
|
|
text-align: left; |
|
|
width: 170rpx; |
|
|
margin-right: 20rpx; |
|
|
line-height: 60rpx; |
|
|
} |
|
|
|
|
|
.item_right_txt { |
|
|
flex: 1; |
|
|
max-width: calc(100% - 220rpx); |
|
|
color: rgba(0, 0, 0, 1); |
|
|
font-size: 28rpx; |
|
|
// text-align: left; |
|
|
text-align: justify; |
|
|
font-family: SourceHanSansSC-regular; |
|
|
|
|
|
/deep/.u-radio-group { |
|
|
flex-wrap: nowrap; |
|
|
padding-right: 48rpx; |
|
|
} |
|
|
|
|
|
.btn { |
|
|
width: 260rpx; |
|
|
height: 60rpx; |
|
|
line-height: 60rpx; |
|
|
border-radius: 8rpx; |
|
|
background-color: rgba(255, 255, 255, 1); |
|
|
color: rgba(58, 98, 215, 1); |
|
|
font-size: 28rpx; |
|
|
text-align: center; |
|
|
border: 2rpx dashed rgba(58, 98, 215, 1); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
/deep/.u-collapse { |
|
|
padding: 0 16rpx; |
|
|
} |
|
|
|
|
|
/deep/.arrow { |
|
|
top: 12rpx; |
|
|
} |
|
|
} |
|
|
</style> |