lanan-repair-app/pages-order/orderDetail/orderDetail.vue

2473 lines
70 KiB
Vue
Raw Normal View History

2024-10-09 13:34:36 +08:00
<template>
2025-08-13 17:30:12 +08:00
<view class="container">
<view class="containerBody">
<VNavigationBar background-color="#fff" title="工单详情" title-color="#333"></VNavigationBar>
<view class="body" v-if="null!=ticketInfo">
<view class="orderInfo">
<view class="orderTypeInfo">
<text class="label">维修类别</text>
<text class="value" style="font-size: 35rpx">{{ ticketInfo.repairTypeText }}</text>
</view>
<view class="orderStateInfo">
<text>当前工单状态</text>
<text
v-if="ticketInfo.statusStr=='待维修' || ticketInfo.statusStr=='已作废'">{{ ticketInfo.statusStr }}</text>
<text v-else-if="ticketInfo.statusStr=='维修中'"
style="color: #E8A321">{{ ticketInfo.statusStr }}</text>
<text v-else style="color: #2979FF;">{{ ticketInfo.statusStr }}</text>
</view>
<view class="orderDateInfo">
<text class="label">车辆进厂时间</text>
<text class="value">{{ ticketInfo.inTime }}</text>
</view>
<view class="orderDateInfo">
<text class="label">预计竣工时间</text>
<text class="value">{{ ticketInfo.outTime }}</text>
</view>
<view class="orderDateInfo" v-if="ticketInfo.realOverDate">
<text class="label">实际竣工时间</text>
<text class="value">{{ ticketInfo.realOverDate }}</text>
</view>
</view>
<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="aspectFit"></image>
<view class="carHeaderRight">
<text class="carNumber">{{ ticketInfo.carNo }}</text>
2025-09-30 09:37:26 +08:00
<text class="carType">{{ ticketInfo.carBrandName+" " }} <span
2025-08-13 17:30:12 +08:00
v-if="ticketInfo.carInfo && ticketInfo.carInfo.carModel"> -
2025-09-30 09:37:26 +08:00
{{ticketInfo.carInfo.carModel}}</span></text>
2025-08-13 17:30:12 +08:00
</view>
</view>
<view class="line"></view>
<view class="carBody">
<view style="display: flex;flex-direction: column;">
2025-09-30 09:37:26 +08:00
<view v-if="checkPermi(['repair:user:look'])">
<view class="infoItem">
<view class="label">车主</view>
<view class="value">{{ ticketInfo.userName }}</view>
</view>
<view class="infoItem">
<text class="label">联系方式</text>
<text class="value">{{ ticketInfo.userMobile }}</text>
</view>
<view class="infoItem">
<text class="label">客户来源</text>
<text class="value">{{ ticketInfo.customerInfo.dataFromText }}</text>
</view>
<view class="infoItem">
<text class="label">性别</text>
<text class="value">{{ ticketInfo.customerInfo.sex === '1' ? '女' : '男' }}</text>
</view>
<view class="infoItem" v-if="ticketInfo.handleName">
<text class="label">经办人</text>
<text class="value">{{ ticketInfo.handleName }}</text>
</view>
<view class="infoItem" v-if="ticketInfo.handleMobile">
<text class="label">经办人电话</text>
<text class="value">{{ ticketInfo.handleMobile }}</text>
</view>
<view class="infoItem">
<text class="label">业务来源</text>
<text class="value">{{ ticketInfo.busiFrom }}</text>
</view>
<view class="line"></view>
2025-08-13 17:30:12 +08:00
</view>
2025-09-30 09:37:26 +08:00
2025-08-13 17:30:12 +08:00
<view class="infoItem">
<view class="label">车架号</view>
<view class="value">{{ ticketInfo.carVin }}</view>
</view>
<view class="infoItem">
<view class="label">发动机号</view>
<view class="value">{{ ticketInfo.carInfo.engineNumber }}</view>
</view>
<view class="infoItem">
<view class="label">车辆注册日期</view>
2025-09-30 09:37:26 +08:00
<view class="value">{{ formatDate(ticketInfo.carInfo.carRegisterDate) }}</view>
2025-08-13 17:30:12 +08:00
</view>
<view class="infoItem">
<view class="label">车龄()</view>
<view class="value">{{ ticketInfo.carInfo.carYear }}</view>
</view>
<view class="infoItem">
2025-09-30 09:37:26 +08:00
<view class="label">当前表显里程</view>
<view class="value">{{ ticketInfo.carInfo.mileageTraveled}}</view>
2025-08-13 17:30:12 +08:00
</view>
<view class="infoItem">
2025-09-30 09:37:26 +08:00
<view class="label">下次年检时间</view>
<view class="value">{{ formatDate(ticketInfo.carInfo.nextInspectionDate)}}</view>
2025-08-13 17:30:12 +08:00
</view>
<view class="infoItem">
2025-09-30 09:37:26 +08:00
<view class="label">保险到期时间</view>
<view class="value">{{ formatDate(ticketInfo.carInfo.insuranceExpiryDate)}}</view>
</view>
<!-- <view class="infoItem">
2025-08-13 17:30:12 +08:00
<view class="label">承保险种</view>
<view class="value">{{ ticketInfo.insuranceType}}</view>
</view>
<view class="infoItem">
<view class="label">上年保费</view>
<view class="value">{{ ticketInfo.jiaoqiang}} {{ ticketInfo.shangye}}</view>
2025-09-30 09:37:26 +08:00
</view> -->
<view class="infoItem">
<view class="label">下次保养里程</view>
<view class="value">{{ ticketInfo.carInfo.nextMaintenanceMileage}}</view>
2025-08-13 17:30:12 +08:00
</view>
<view class="infoItem">
<view class="label">最近保养日期</view>
<view class="value">{{ ticketInfo.maintenanceDate}}</view>
</view>
<view class="infoItem">
<view class="label">最近保养公里数</view>
<view class="value">{{ ticketInfo.maintenanceMileage}}</view>
</view>
2025-09-30 09:37:26 +08:00
<view class="infoItem" style="display: block;">
<view class="label">档案资料</view>
<view class="value">
<view class="projList">
<view class="projImg" v-if="carImgList.length>0">
<image v-for="(img, imgIndex) in carImgList"
@click="prviewImage(carImgList,imgIndex)" :key="imgIndex"
:src="img.image" class="projImgItem"></image>
</view>
</view>
</view>
</view>
<view class="infoItem" v-if="checkPermi(['tickets:car:edit'])">
<view class="label" style="color: rgb(41, 121, 255);" @click="showCarPopup">点击编辑车辆信息
</view>
2025-08-13 17:30:12 +08:00
</view>
</view>
2025-09-30 09:37:26 +08:00
2025-08-13 17:30:12 +08:00
</view>
</view>
</view>
<!-- 维修工时项目-编辑 -->
<view
v-if="(loginUser.roleCodes.includes('weixiu') || loginUser.roleCodes.includes('service_advisor')||loginUser.roleCodes.includes('general_inspection')) && isDetail == '0'">
<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,index) in ticketInfo.projects" :key="item.id" class="projEditItem">
<view class="del-proj-box" @click="delProj(item.id,index)"><uni-icons type="trash"
size="25" style="color: #0174F6"></uni-icons></view>
<view class="projEditLine1">
<text>{{ item.itemName }}</text>
<text v-if="canSeeMoney" class="projAmount">{{ item.itemMoney }}</text>
</view>
<view class="projBaseInfo">
<view v-if="canSeeMoney">售价<input class="edit-proj-input"
@input="onKeyInput('sj',item)" type="decimal" placeholder="请输入售价"
v-model="item.itemPrice" /></view>
<view>数量<input class="edit-proj-input" @input="onKeyInput('sl',item)"
type="number" placeholder="请输入数量" v-model="item.itemCount" /></view>
<!-- <view>单位{{ item.itemUnit}}</view>-->
<view v-if="canSeeMoney">折扣<input class="edit-proj-input"
@input="onKeyInput('zk',item)" 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 class="projEditFoot">
<view class="block1">
<template>
<view class="editPeople">
<view class="editForm">
<text class="label">服务顾问</text>
<text>{{item.saleName || ""}}
</text>
</view>
<image src="/static/icons/edit.png"
style="width: 28rpx;height: 28rpx"
@click="editPeople('xs', item)"></image>
</view>
</template>
<template>
<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 src="/static/icons/edit.png"
style="width: 28rpx;height: 28rpx"
@click="editPeople('sg', item)"></image>
</view>
</template>
<template>
<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>
<!-- 维修工时项目-只读 -->
<view v-else>
<view class="card projDateCard" v-if="ticketInfo.projectList && ticketInfo.projectList.length > 0">
<view class="projTitle">维修工时项目</view>
<view class="projTabs">
<view @click="chooseProjTab(index)" v-for="(item, index) in ticketInfo.projectList"
:key="item.groupId" class="projTabItem" :class="{ active: index === activeProjTabKey }">
{{ item.groupName }}
<view v-if="index === activeProjTabKey" class="activeLine"></view>
</view>
</view>
<view class="projTabsBottomLine"></view>
<view class="workPerson">
<text>服务顾问{{ticketInfo.projectList[activeProjTabKey].servicer}}</text>
<text>施工人员{{ticketInfo.projectList[activeProjTabKey].worker}}</text>
</view>
<view class="projList">
<view class="projItem"
v-for="(item, index) in ticketInfo.projectList[activeProjTabKey].wares.slice(0, 5)"
:key="item.id">
<text class="projSeq">{{ index + 1 }}</text>
<text class="projName">{{ item.itemName }}</text>
</view>
<view v-if="ticketInfo.projectList[activeProjTabKey].showAll" class="projItem"
v-for="(item, index) in ticketInfo.projectList[activeProjTabKey].wares.slice(5, ticketInfo.projectList[activeProjTabKey].wares.length)"
:key="item.id">
<text class="projSeq">{{ 6 + index }}</text>
<text class="projName">{{ item.itemName }}</text>
</view>
</view>
<view v-if="ticketInfo.projectList[activeProjTabKey].wares.length > 5" class="action"
@click="() => $set(ticketInfo.projectList[activeProjTabKey], 'showAll', !ticketInfo.projectList[activeProjTabKey].showAll)">
<text>{{ ticketInfo.projectList[activeProjTabKey].showAll ? '收起' : '展开' }}</text>
<uni-icons :type="ticketInfo.projectList[activeProjTabKey].showAll ? 'top' : 'bottom'"
color="#0174f6"></uni-icons>
</view>
</view>
</view>
<!-- 更换配件清单-编辑 -->
<!-- <view v-if="loginUser.roleCodes.includes('repair_warehouse') && isDetail == '0'">-->
<!-- <view v-if="ticketInfo.waresGroupList && ticketInfo.waresGroupList.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">-->
<!-- <uni-collapse ref="collapse" >-->
<!-- <uni-collapse-item v-for="(groupItem,groupIndex) in ticketInfo.waresGroupList" :key="groupItem.groupId" :title="groupItem.groupName+'('+groupItem.nums+'类配件,合计:'+groupItem.totalAmount+'元)'" >-->
<!-- <view class="content">-->
<!-- <template>-->
<!-- <view v-for="(item,index) in groupItem.wares" :key="item.id" class="projEditItem">-->
<!-- <view >-->
<!-- <view class="projEditLine1">-->
<!-- <text>{{ item.itemName }}</text>-->
<!-- <text class="projAmount"><text v-if="canSeeMoney">{{ item.itemMoney }}</text><uni-icons @click="delWares(item,groupIndex,index)" type="trash" size="25" style="color: #0174F6"></uni-icons></text>-->
<!-- </view>-->
<!-- <view class="projBaseInfo" >-->
<!-- <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>单位<input style="padding: 0 10rpx" type="text" v-model="item.unitText" disabled /></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">金额{{ item.itemMoney || "" }}</view>-->
<!-- </view>-->
<!-- </view>-->
<!-- </view>-->
<!-- </template>-->
<!-- </view>-->
<!-- </uni-collapse-item>-->
<!-- </uni-collapse>-->
<!-- </view>-->
<!-- </view>-->
<!-- </view>-->
<!-- 更换配件清单 -->
<view class="card partCard" v-if="ticketInfo.waresGroupList && ticketInfo.waresGroupList.length > 0">
<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="projTabs">
<view @click="choosePartTab(index)" v-for="(item, index) in ticketInfo.waresGroupList"
:key="item.groupId" class="projTabItem" :class="{ active: index === activePartTabKey }">
{{ item.groupName }}
<view v-if="index === activePartTabKey" class="activeLine"></view>
</view>
</view>
<view class="projTabsBottomLine" style="margin-bottom: 0"></view>
<view v-if="loginUser.roleCodes.includes('repair_warehouse') && isDetail == '0'">
<!-- 编辑状态-->
<template>
<view v-for="(item,index) in ticketInfo.waresGroupList[activePartTabKey].wares"
:key="item.id" class="projEditItem">
<view>
<view class="projEditLine1">
<text>{{ item.itemName }}</text>
<text class="projAmount"><text
v-if="canSeeMoney">{{ item.itemMoney }}</text><uni-icons
@click="delWares(item,groupIndex,index)" type="trash" size="25"
style="color: #0174F6"></uni-icons></text>
</view>
<view class="projBaseInfo">
<view v-if="canSeeMoney">售价<input @input="onKeyInput('sj',item)"
style="background: #F2F2F7;padding: 0 10rpx" type="decimal"
placeholder="请输入售价" v-model="item.itemPrice" /></view>
<view>数量<input @input="onKeyInput('sl',item)"
style="background: #F2F2F7;padding: 0 10rpx" type="number"
placeholder="请输入数量" v-model="item.itemCount" /></view>
<view>单位<input style="padding: 0 10rpx" type="text" v-model="item.unitText"
disabled /></view>
<view v-if="canSeeMoney">折扣<input @input="onKeyInput('zk',item)"
style="background: #F2F2F7;padding: 0 10rpx" type="decimal"
placeholder="请输入折扣0-1" v-model="item.itemDiscount" /></view>
<view v-if="canSeeMoney">金额{{ item.itemMoney || "" }}</view>
</view>
</view>
</view>
</template>
</view>
<view v-else>
<!-- 只读状态-->
<view class="projList">
<view class="projItem"
v-for="(item, index) in ticketInfo.waresGroupList[activePartTabKey].wares.slice(0, 5)"
:key="item.id">
<text class="projSeq">{{ index + 1 }}</text>
<text class="projName">{{ item.itemName }}</text>
<text style="color: #636C8C;font-size: 32rpx;">x{{ item.itemCount || "0" }}</text>
</view>
<view v-if="ticketInfo.waresGroupList[activePartTabKey].showAll" class="projItem"
v-for="(item, index) in ticketInfo.waresGroupList[activePartTabKey].wares.slice(5, ticketInfo.waresGroupList[activePartTabKey].wares.length)"
:key="item.id">
<text class="projSeq">{{ 6 + index }}</text>
<text class="projName">{{ item.itemName }}</text>
<text style="color: #636C8C;font-size: 32rpx;">x{{ item.itemCount || "0" }}</text>
</view>
</view>
<view v-if="ticketInfo.waresGroupList[activePartTabKey].wares.length > 5" class="action"
@click="() => $set(ticketInfo.waresGroupList[activePartTabKey], 'showAll', !ticketInfo.waresGroupList[activePartTabKey].showAll)">
<text>{{ ticketInfo.waresGroupList[activePartTabKey].showAll ? '收起' : '展开' }}</text>
<uni-icons :type="ticketInfo.waresGroupList[activePartTabKey].showAll ? 'top' : 'bottom'"
color="#0174f6"></uni-icons>
</view>
</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" style="color: #B7BDC6">待维修 </view>
<view class="tushi-item" style="color: #E8A321">维修中 </view>
<view class="tushi-item" style="color: #2979FF;">已完成</view>
</view>
<uni-steps :canOpenCus="canOpenCus" :options="list2" active-color="#007AFF" :active="active"
:doingActive="doingActive" direction="column" @prviewImage="prviewImage"
@sendCusImgManage="sendCusImgManage" />
</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>
</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" v-if="item.itemList && item.itemList.length>0">
<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/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' && null!=ticketInfo" 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>
2025-09-30 09:37:26 +08:00
<uni-popup ref="carPopup" type="center" border-radius="10px 10px 10px 10px" background-color="#fff">
<view class="car-popup-out">
<uni-forms ref="baseForm" :modelValue="carFormData">
<uni-forms-item label="下次年检日期" required>
<picker mode="date" :value="carFormData.nextInspectionDate" :start="startDate" :end="endDate"
@change="bindnextInspectionDateChange">
<view class="uni-input">
{{ carFormData.nextInspectionDate ? carFormData.nextInspectionDate : '选择日期' }}
</view>
</picker>
</uni-forms-item>
<uni-forms-item label="下次保养里程" required>
<uni-easyinput v-model="carFormData.nextMaintenanceMileage" placeholder="请输入" />
</uni-forms-item>
<uni-forms-item label="保险到期时间" required>
<picker mode="date" :value="carFormData.insuranceExpiryDate" :start="startDate" :end="endDate"
@change="bindInsuranceExpiryDateChange">
<view class="uni-input">
{{ carFormData.insuranceExpiryDate ? carFormData.insuranceExpiryDate : '选择日期' }}
</view>
</picker>
</uni-forms-item>
</uni-forms>
<button @click="submitCarForm">确定</button>
</view>
</uni-popup>
2025-08-13 17:30:12 +08:00
<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>
2024-10-09 13:34:36 +08:00
</template>
<script>
2025-08-13 17:30:12 +08:00
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 {
getToken,
getUserInfo,
setJSONData,
getJSONData,
setStorageWithExpiry,
getStorageWithExpiry
} from '@/utils/auth'
2025-09-30 09:37:26 +08:00
import config from '@/config';
import {
fixScreen
} from '@/utils/fixScreen.js';
2025-08-13 17:30:12 +08:00
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: "",
},
2025-09-30 09:37:26 +08:00
// 补充车辆信息
carFormData: {
nextInspectionDate: undefined,
insuranceExpiryDate: undefined,
nextMaintenanceMileage: undefined,
mileageTraveled: undefined,
},
2025-08-13 17:30:12 +08:00
//是否可以授权给客户看
canOpenCus: false,
//是否可以看见钱
canSeeMoney: false,
2025-09-30 09:37:26 +08:00
listStyles: {
// 是否显示边框
border: false,
// 是否显示分隔线
dividline: false,
// 线条样式
borderStyle: {
width: 1,
color: 'blue',
radius: 2
}
},
2025-08-13 17:30:12 +08:00
//当前选择的操作:working-维修期间|done_half-阶段完成|done-全部完成递交下一维修班组选人维修
nowChooseOperate: "",
carInfo: {},
userInfo: {},
loginUser: {},
selectedProj: [],
submitData: [],
//是否是通知客户取车操作,默认都不是
ifCallCus: false,
//维修项目进度记录表
// tableData:[],
active: -1,
doingActive: -1,
//维修项目进度记录表
list2: [],
//通知客户取车联系人对象
callServiceInfo: {
name: "",
tel: ""
},
//删除的项目id、配件id
delProjId: [],
activeProjTabKey: 0,
activePartTabKey: 0,
processList: [{}, {}],
2025-09-30 09:37:26 +08:00
carImgList: [],
cararchivesPhotos: []
2025-08-13 17:30:12 +08:00
};
},
watch: {
// ticketInfo: {
// handler(newVal, oldVal) {
// console.log(newVal, "有变化");
// setJSONData("projects",newVal.projects)
// },
// // 开启深度监听
// deep: true
// }
},
onLoad(data) {
if (!getToken()) {
uni.reLaunch({
url: '/pages/login/login'
})
} else {
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
}
this.refreshData(false)
}
},
2025-09-30 09:37:26 +08:00
onShow() {
// 调用修复方法
fixScreen();
},
computed: {
startDate() {
return this.getDate('start');
},
endDate() {
return this.getDate('end');
}
},
2025-08-13 17:30:12 +08:00
methods: {
2025-09-30 09:37:26 +08:00
formatDate,
2025-08-13 17:30:12 +08:00
chooseProjTab(index) {
this.activeProjTabKey = index
},
choosePartTab(index) {
this.activePartTabKey = index
},
/**
* 刷新数据通用方法
*/
async refreshData(cache) {
uni.showLoading({
title: '加载中'
});
//获取订单详情
await this.getOrderDetail(cache)
//查维修进度记录
await this.getProjItem()
//获取当前订单是否有审批的配件
await this.waresByTicket()
uni.hideLoading();
},
/**
* 删除项目
*/
delProj(id, index) {
this.delProjId.push(id)
//从列表中移除
this.$nextTick(() => {
this.ticketInfo.projects.splice(index, 1)
})
},
/**
* 删除配件
*/
delWares(item, groupIndex, itemIndex) {
this.delProjId.push(item.id)
//从列表中移除
this.$nextTick(() => {
this.ticketInfo.waresGroupList[groupIndex].wares.splice(itemIndex, 1)
if (this.ticketInfo.waresGroupList[groupIndex].wares.length == 0) {
this.ticketInfo.waresGroupList.splice(groupIndex, 1)
} else {
//重新计算总价格数量
let groupItem = this.ticketInfo.waresGroupList[groupIndex]
groupItem.nums = groupItem.nums - 1
groupItem.totalAmount = groupItem.totalAmount - item.itemMoney
this.ticketInfo.waresGroupList[groupIndex] = groupItem
}
})
},
2025-09-30 09:37:26 +08:00
/**
* 打开编辑车辆弹窗
*/
showCarPopup() {
this.carFormData = this.ticketInfo.carInfo
if (this.carFormData.insuranceExpiryDate) {
this.carFormData.insuranceExpiryDate = formatDate(this.carFormData.insuranceExpiryDate)
}
if (this.carFormData.nextInspectionDate) {
this.carFormData.nextInspectionDate = formatDate(this.carFormData.nextInspectionDate)
}
this.$refs.carPopup.open()
},
/**
* @param {Object} type获取时间
*/
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === 'start') {
year = year - 10;
} else if (type === 'end') {
year = year + 10;
}
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
/**
* 修改下次年检时间
* @param {Object} e
*/
bindnextInspectionDateChange(e) {
console.log('e', e);
this.carFormData.nextInspectionDate = e.detail.value
},
bindInsuranceExpiryDateChange(e) {
this.carFormData.insuranceExpiryDate = e.detail.value
},
submitCarForm() {
// 如果 nextInspectionDate 有值,并且格式是 yyyy-MM-dd就补上时分秒
if (this.carFormData.nextInspectionDate) {
this.carFormData.nextInspectionDate = new Date(this.carFormData.nextInspectionDate).getTime()
}
// 如果 nextInspectionDate 有值,并且格式是 yyyy-MM-dd就补上时分秒
if (this.carFormData.insuranceExpiryDate) {
this.carFormData.insuranceExpiryDate = new Date(this.carFormData.insuranceExpiryDate).getTime()
}
request({
url: `/admin-api/base/carMain/update`,
method: 'PUT',
data: this.carFormData
})
this.$refs.carPopup.close()
},
2025-08-13 17:30:12 +08:00
/**
* 监听输入框
*/
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
}
})
// setJSONData("projects",this.ticketInfo.projects)
console.log(item, "item")
},
/**
* 预览图片
*/
prviewImage(imgList, index) {
let urls = []
imgList.forEach(i => {
2025-09-30 09:37:26 +08:00
if (!i.image.includes("http")) {
urls.push(this.imgUrlPrex + i.image)
} else {
urls.push(i.image)
}
2025-08-13 17:30:12 +08:00
})
uni.previewImage({
urls: urls,
current: index
});
},
submit() {
let canSubmit = true
let itemList = []
//校验所有项目、配件是否填写了价格、数量、折扣,并且是否合理
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
}
//不校验项目金额、折扣、数量必填但是为null的设置为0
if (!item.itemPrice) {
item.itemPrice = 0
}
if (!item.itemCount) {
item.itemCount = 0
}
if (!item.itemDiscount) {
item.itemDiscount = 1
}
item.itemMoney = item.itemPrice * item.itemCount * item.itemDiscount
let itemObj = {
id: item.id,
ticketId: item.ticketId,
itemPrice: item.itemPrice,
itemCount: item.itemCount,
itemDiscount: item.itemDiscount,
itemMoney: item.itemMoney,
}
itemList.push(itemObj)
})
}
//修改配件的信息
if (this.ticketInfo.waresGroupList && this.ticketInfo.waresGroupList.length > 0) {
this.ticketInfo.waresGroupList.map((groupItem) => {
groupItem.wares.map((item) => {
//不校验项目金额、折扣、数量必填但是为null的设置为0
if (!item.itemPrice) {
item.itemPrice = 0
}
if (!item.itemCount) {
item.itemCount = 0
}
if (!item.itemDiscount) {
item.itemDiscount = 1
}
item.itemMoney = item.itemPrice * item.itemCount * item.itemDiscount
let itemObj = {
id: item.id,
ticketId: item.ticketId,
itemPrice: item.itemPrice,
itemCount: item.itemCount,
itemDiscount: item.itemDiscount,
itemMoney: item.itemMoney,
}
itemList.push(itemObj)
})
})
}
if (canSubmit) {
//更新工单配件价格
request({
url: '/admin-api/repair/titem/updateRepairItem',
method: 'PUT',
data: {
"itemList": itemList,
"delProjIdList": this.delProjId,
"ticketId": this.ticketId
}
}).then((res) => {
if (res.code == 200) {
uni.showToast({
title: '操作成功!',
icon: 'none'
})
setTimeout(() => {
//判断角色
if (this.loginUser.roleCodes.includes('repair_warehouse')) {
//仓管
uni.navigateTo({
url: '/pages-warehouse/home/home'
})
} else {
//其他
uni.navigateTo({
url: '/pages-home/home/home'
})
}
}, 700)
} else {
uni.showToast({
title: '操作失败,请联系管理员',
icon: 'none'
})
}
})
}
},
afterRead(file) {
2025-09-30 09:37:26 +08:00
console.log('文件', file);
2025-08-13 17:30:12 +08:00
uni.showLoading({
title: '正在上传中...',
mask: true
});
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
})
if (i == file.tempFilePaths.length - 1) {
uni.hideLoading()
}
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 new Promise((resolve, reject) => {
uni.showModal({
title: '提示', // 对话框标题
content: '是否移交总检?', // 对话框内容
confirmText: '是', // 确认按钮文本
cancelText: '否', // 取消按钮文本
success: (res) => {
if (res.confirm) {
// 用户点击了确定按钮
resolve(saveTicketsRecords(this.ticketInfo.id, '03', this
.nowRepair.repairItemId, "03", "sgwczj",
"维修完成移交总检", fileStr, "02", ""))
this.nowChooseOperate = 'done'
} else if (res.cancel) {
// 用户点击了取消按钮
resolve(saveTicketsRecords(this.ticketInfo.id, '03', this
.nowRepair.repairItemId, "03", "sgwczj",
"维修完成移交下一班组维修", fileStr, "", ""))
}
},
fail: (err) => {
console.error('我是是否移交总检的弹窗,我报错了', err);
}
});
})
// 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) => {})
} else if ("over" == this.nowChooseOperate) {
// 交车必须上传图片
if (this.fileList == 0) {
uni.showToast({
title: '请上传车辆图片!',
icon: 'none'
})
return
}
//服务顾问交车
let dataObj = {
id: this.ticketInfo.id,
remark: "交车",
image: fileStr
}
request({
url: '/admin-api/repair/tickets/overOrder',
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 || "over" == this.nowChooseOperate) {
//移交总检需要返回| 总检拍照后需要返回 | 服务顾问交车后返回
setTimeout(() => {
uni.navigateBack()
}, 500)
} else if ("other" == this.nowChooseOperate) {
//移交下一班组维修,需要指派下一个维修人
setTimeout(() => {
uni.navigateTo({
url: '/pages-order/choosePeople/choosePeople?id=' + this.ticketInfo
.id + '&itemId=' + this.nowRepair.repairItemId + '&ifDetail=true'
})
}, 500)
} else {
//停留当前页面,刷新数据
this.refreshData(false)
}
} catch (error) {
console.error(error);
}
},
/**
* 判断工单状态和角色控制显示什么操作按钮
*/
checkRoleOperate() {
this.content = []
if (this.loginUser.roleCodes.includes("service_advisor")) {
//服务顾问
this.canOpenCus = true
if (this.isDetail == '1') {
this.content.push({
text: '编辑工单',
active: false,
code: "edit"
})
}
//服务顾问可以进行出厂检验 和通知客户取车
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"
})
}
if (("01" == this.ticketInfo.ticketsStatus || "06" == this.ticketInfo.ticketsStatus || "02" == this
.ticketInfo.ticketsStatus) && "0" == this.ticketInfo.isHandover) {
//工单状态是未结算、已结算或者挂账,交车状态是未交车的,均可以交车
this.content.push({
text: '交车',
active: false,
code: "over"
})
}
//设置服务顾问默认的姓名联系方式
this.callServiceInfo.name = this.loginUser.nickname
this.callServiceInfo.tel = this.loginUser.mobile
}
if (this.loginUser.roleCodes.includes("weixiu")) {
//维修管理员
this.canOpenCus = true
if (this.isDetail == '1') {
this.content.push({
text: '编辑工单',
active: false,
code: "edit"
})
}
}
if (this.loginUser.roleCodes.includes("general_inspection")) {
//维修总检
this.canOpenCus = true
if (this.isDetail == '1') {
this.content.push({
text: '编辑工单',
active: false,
code: "edit"
})
}
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")) {
//维修工角色,可以提交配件申请
2025-09-30 09:37:26 +08:00
const has02 = this.ticketInfo.items.some(item => item.itemType === '02');
console.log('has02', has02);
2025-08-13 17:30:12 +08:00
this.content.push({
2025-09-30 09:37:26 +08:00
// text: '配件申请',
text: !has02 ? '是否申请配件' : '是否增加配件',
2025-08-13 17:30:12 +08:00
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 || "over" == 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
} else if ("edit" == e.item.code) {
//编辑工单
uni.navigateTo({
url: '/pages-order/addOrder/editOrder?ticketId=' + this.ticketId
})
}
// 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() {
let that = this
uni.makePhoneCall({
phoneNumber: that.ticketInfo.userMobile,
success: function(res) {
console.log('拨号成功', res);
//服务顾问电话通知客户取车
let dataObj = {
id: that.ticketInfo.id,
name: that.ticketInfo.userName
}
request({
url: '/admin-api/repair/tickets/noticeCus',
method: 'POST',
data: dataObj
}).then((res) => {
setTimeout(() => {
uni.navigateBack()
}, 500)
})
},
fail: function(err) {
if (err.errMsg.includes('cancel')) {
console.log('用户取消拨号');
} else {
console.log('拨号失败', err);
}
}
});
},
/**
* 维修照片是否授权给客户看管理
*/
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.refreshData(false)
} 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.list2 = []
//当前在修的项目
let endIndex = -1
for (let i = 0; i < res.data.length; i++) {
let thisObj = res.data[i]
thisObj.title = thisObj.itemName
if (thisObj.itemStatus == '03') {
//这个项目已处理完毕,
endIndex = i
thisObj.desc = formatTimestamp(thisObj.updateTime)
} else if (thisObj.itemStatus == '02') {
//正在处理中
this.doingActive = i
}
this.list2.push(thisObj)
}
this.active = endIndex
console.log(this.list2, "thisObj.itemStatus=='02'")
}
})
},
/**
* 查看订单详情
*/
getOrderDetail(cache) {
request({
url: '/admin-api/repair/tickets/get',
method: 'get',
params: {
id: this.ticketId,
ifApp: true
}
}).then((res) => {
let resultObj = res.data
resultObj.statusStr = getOrderStatusText(res.data.ticketsStatus, res.data.isHandover)
2025-09-30 09:37:26 +08:00
2025-08-13 17:30:12 +08:00
//注册日期
if (null != resultObj.carInfo.carRegisterDate) {
resultObj.carRegisterDate = formatDate(resultObj.carInfo.carRegisterDate)
} else {
resultObj.carRegisterDate = '未知'
}
//进厂日期
if (null != resultObj.inTime) {
resultObj.inTime = formatDate(resultObj.inTime)
} else {
resultObj.inTime = '未知'
}
//最近保养日期
if (null != resultObj.maintenanceDate) {
resultObj.maintenanceDate = formatDate(resultObj.maintenanceDate)
} else {
resultObj.maintenanceDate = '未知'
}
//最近保养公里数
if (!resultObj.maintenanceMileage) {
resultObj.maintenanceMileage = '未知'
}
//预计竣工日期
if (null != resultObj.outTime) {
resultObj.outTime = formatDate(resultObj.outTime)
} else {
resultObj.outTime = '未知'
}
//年检时间
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)
})
}
if (cache) {
//从缓存中获取项目的信息替换掉
let projects = getJSONData("projects")
let projectMap = new Map();
if (projects) {
//转key value形式
projects.map((item) => {
projectMap.set(item.id, item)
})
resultObj.projects = resultObj.projects.map((item) => {
if (projectMap.has(item.id)) {
console.log(projectMap.get(item.id))
let localObj = projectMap.get(item.id)
item.itemPrice = localObj.itemPrice
item.itemCount = localObj.itemCount
item.itemDiscount = localObj.itemDiscount
item.itemMoney = localObj.itemMoney
}
return item
})
}
}
let newProArray = []
if (this.delProjId.length > 0) {
//有删除的项目,需要比对删掉
resultObj.projects.map((item) => {
if (this.delProjId.indexOf(item.id) == -1) {
newProArray.push(item)
}
})
resultObj.projects = newProArray
// //新的配件分组list
// let newWaresGroupList = []
// //有删除的配件,需要比对删掉
// resultObj.waresGroupList.map((groupItem)=>{
// let newWaresList = []
// groupItem.wares.map((item)=>{
// if(this.delProjId.indexOf(item.id)==-1){
// newWaresList.push(item)
// }
// })
// if(newWaresList.length>0){
// groupItem.wares = newWaresList
// newWaresGroupList.push(groupItem)
// }
// })
// resultObj.projects =newWaresGroupList
}
if (resultObj.carInfo.carLicenseImg) {
resultObj.carInfo.carLicenseImg.split(",").map((item) => {
2025-09-30 09:37:26 +08:00
let url = item.includes("http") ? item : this.imgUrlPrex + item;
2025-08-13 17:30:12 +08:00
this.carImgList.push({
2025-09-30 09:37:26 +08:00
image: url
});
});
}
if (resultObj.carInfo.archivesPhoto) {
resultObj.carInfo.archivesPhoto.split(",").map((item) => {
this.cararchivesPhotos.push({
url: this.$baseImageUrl + item
2025-08-13 17:30:12 +08:00
})
})
}
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) {
//需要选施工人员,记录缓存
setJSONData("projects", this.ticketInfo.projects)
bus.$off('choosePeople')
bus.$on('choosePeople', (data) => {
console.log('choosePeople', data)
//需要将缓存中的值取出来
this.refreshData(true)
})
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))
})
2025-09-30 09:37:26 +08:00
},
2025-08-13 17:30:12 +08:00
}
}
2024-10-13 23:24:23 +08:00
</script>
<style lang="less" scoped>
2025-08-13 17:30:12 +08:00
.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;
position: relative;
background-size: 100% 600rpx;
background: linear-gradient(180deg, #CEE5FF 0%, rgba(206, 229, 255, 0) 100%) no-repeat;
}
.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: 28rpx;
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 {
overflow: hidden;
.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: 36rpx;
color: #333333;
}
.dl-ifcus {
font-size: 14px;
float: right;
}
.carCard {
.orderFlag {
display: flex;
align-items: center;
column-gap: 14rpx;
padding: 20rpx 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: 28rpx;
color: #999999;
}
}
}
.carDetail {
background-size: 100% 184rpx;
padding: 30rpx 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: 36rpx;
color: #333333;
.carType {
font-weight: 500;
font-size: 32rpx;
color: #858BA0;
}
}
}
.line {
height: 1rpx;
background-color: #ddd;
}
.carBody {
display: flex;
flex-direction: column;
row-gap: 30rpx;
padding-top: 30rpx;
}
.carFoot {}
}
}
.projCard {
padding-bottom: 30rpx;
.projList {
padding: 0 20rpx;
display: flex;
flex-direction: column;
//gap: 20rpx;
.tushi-box {
font-weight: 500;
font-size: 32rpx;
line-height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
}
.tushi-item {
padding: 0 20rpx;
color: #606266;
}
.projItem {
background: #FFFFFF;
border-radius: 8rpx 8rpx 8rpx 8rpx;
border: 1rpx solid #DDDDDD;
padding: 0 20rpx;
margin-bottom: 10rpx;
.projTop {
padding: 20rpx 0;
border-bottom: 1rpx solid #eee;
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 500;
font-size: 32rpx;
color: #333333;
.projAmount {
font-weight: bold;
color: #0174F6;
}
}
.projBody {
padding-bottom: 20rpx;
.projDate {
font-weight: 500;
font-size: 30rpx;
color: #636C8C;
display: flex;
align-items: center;
column-gap: 10rpx;
padding: 20rpx 0;
}
.projDesc {
font-weight: 500;
font-size: 30rpx;
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 {
margin-bottom: 17rpx;
padding: 0 20rpx;
background: #F2F2F7;
border-radius: 4rpx 4rpx 4rpx 4rpx;
position: relative;
.del-proj-box {
position: absolute;
top: -10px;
right: -10px;
}
.del-wares-box {
position: absolute;
top: 0;
right: 0;
}
.projEditLine1 {
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 500;
font-size: 28rpx;
color: #333333;
padding: 15rpx 0;
.projAmount {
color: #0174F6;
}
}
.projBaseInfo {
display: grid;
grid-template-columns: 1fr 1fr;
font-size: 28rpx;
color: #999999;
gap: 20rpx;
margin-bottom: 20rpx;
}
.projEditFoot {
padding: 10rpx 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: 28rpx;
color: #999999;
}
}
}
}
.line {
height: 28rpx;
width: 2rpx;
background-color: #DDDDDD;
}
}
}
}
}
.projEditItem {
//margin-bottom: 25rpx;
padding: 0 20rpx 10rpx 20rpx;
border-bottom: 1rpx solid #F2F2F7;
//background: #F2F2F7;
border-radius: 4rpx 4rpx 4rpx 4rpx;
position: relative;
.del-proj-box {
position: absolute;
top: -10px;
right: -10px;
}
.del-wares-box {
position: absolute;
top: 0;
right: 0;
}
.projEditLine1 {
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 500;
font-size: 28rpx;
color: #333333;
padding: 15rpx 0;
.projAmount {
color: #0174F6;
}
}
.projBaseInfo {
display: grid;
grid-template-columns: 1fr 1fr;
font-size: 28rpx;
color: #999999;
gap: 20rpx;
margin-bottom: 20rpx;
}
.projEditFoot {
padding: 10rpx 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: 28rpx;
color: #999999;
}
}
}
}
.line {
height: 28rpx;
width: 2rpx;
background-color: #DDDDDD;
}
}
}
.projDateCard,
.partCard {
line-height: 1;
.projTabs {
display: flex;
overflow: scroll;
.projTabItem {
padding: 10rpx 20rpx 30rpx;
flex-shrink: 0;
font-weight: 500;
font-size: 32rpx;
color: #636C8C;
&.active {
font-weight: bold;
color: #0174F6;
position: relative;
}
.activeLine {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 36rpx;
height: 8rpx;
background: #0174F6;
border-radius: 4rpx 4rpx 4rpx 4rpx;
}
}
}
.projTabsBottomLine {
width: 686rpx;
height: 1rpx;
background-color: #eee;
margin-bottom: 20rpx;
}
.workPerson {
width: 646rpx;
margin: 0 auto;
padding: 30rpx 20rpx;
background: #F3F5F7;
border-radius: 6rpx 6rpx 6rpx 6rpx;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
font-weight: 500;
font-size: 30rpx;
color: #636C8C;
}
.projList {
padding: 0 20rpx;
.projItem {
padding: 40rpx 0;
font-weight: 500;
font-size: 32rpx;
line-height: 40rpx;
color: #333333;
border-bottom: 1rpx solid #EEEEEE;
display: flex;
column-gap: 10rpx;
}
.projSeq {
width: 40rpx;
height: 40rpx;
background: #0174F6;
border-radius: 50%;
display: inline-block;
text-align: center;
line-height: 40rpx;
font-weight: 500;
font-size: 16px;
color: #FFFFFF;
}
.projName {
flex: 1;
width: 0;
word-break: break-all;
}
.projItem:last-child {
border-bottom: none;
}
}
.action {
font-weight: 500;
font-size: 30rpx;
color: #0174F6;
text-align: center;
padding-bottom: 30rpx;
}
}
.userCard {
.userContainer {
display: flex;
flex-direction: column;
row-gap: 30rpx;
margin: 0 30rpx;
padding-bottom: 10rpx;
}
}
.infoItem {
padding: 20rpx 0;
display: flex;
justify-content: space-between;
font-weight: 500;
font-size: 32rpx;
line-height: 1;
.label {
color: #636C8C;
}
.value {
color: #333333;
}
}
.projFoot,
.userFoot,
.carFoot {
padding: 20rpx;
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;
}
.edit-proj-input {
background: white;
width: 90%;
padding: 3rpx 5rpx;
border-radius: 5px;
}
}
.orderInfo {
padding: 0 32rpx;
margin: 40rpx 0;
line-height: 1;
display: flex;
flex-direction: column;
.orderTypeInfo {
padding: 10rpx 0;
font-weight: bold;
font-size: 40rpx;
color: #333333;
}
.orderStateInfo {
padding: 10rpx 0;
font-weight: 500;
font-size: 32rpx;
color: #666666;
}
.orderDateInfo {
padding: 10rpx 0;
font-weight: 500;
font-size: 32rpx;
color: #0174F6;
}
}
.processCard {
line-height: 1;
.tushi-box {
display: flex;
align-items: center;
column-gap: 40rpx;
justify-content: center;
padding-bottom: 30rpx;
font-weight: 500;
font-size: 32rpx;
line-height: 40rpx;
}
.processList {
padding: 0 20rpx;
}
.processItem {
display: flex;
column-gap: 14rpx;
margin-bottom: 20rpx;
display: flex;
align-items: stretch;
.left {
padding-bottom: 24rpx;
display: flex;
flex-direction: column;
row-gap: 8rpx;
.processSeq {
width: 32rpx;
height: 32rpx;
background: #0174F6;
border-radius: 18rpx 18rpx 18rpx 18rpx;
font-weight: 500;
font-size: 28rpx;
color: #FFFFFF;
line-height: 32rpx;
text-align: center;
}
.line {
flex: 1;
height: 0;
width: 2rpx;
background-color: #0174f6;
margin: 0 auto;
}
}
.right {
padding-bottom: 20rpx;
border-bottom: 1rpx solid #eee;
display: flex;
flex-direction: column;
row-gap: 20rpx;
.processName {
font-weight: 500;
font-size: 32rpx;
color: #333333;
}
.processDate {
font-weight: 500;
font-size: 28rpx;
color: #858BA0;
}
.processImgList {
display: flex;
gap: 10rpx;
}
.processImgItem {
width: 120rpx;
height: 120rpx;
background-color: #eee;
}
.processSendUser {
display: flex;
column-gap: 10rpx;
font-weight: 500;
font-size: 32rpx;
color: #0174F6;
}
}
}
}
.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;
}
}
2025-09-30 09:37:26 +08:00
.car-popup-out {
padding: 30rpx 40rpx;
}
2025-08-13 17:30:12 +08:00
</style>