- <template>
- <view class="order-detail-container">
- <!-- 日期信息 -->
- <view class="order-date">
- <view class="order-date-icon">
- <u-icon name="calendar" color="#FFAA48" size="22"></u-icon>
- </view>
- <view class="order-date-text">{{ orderDate }}</view>
- </view>
-
- <!-- 个人准备 -->
- <view class="order-section" v-if="fileList.glove || fileList.ShoeCover">
- <view class="order-section-title">个人准备</view>
- <view class="order-section-content">
- <!-- 手套照片 -->
- <view class="order-image-item" v-if="fileList.glove && fileList.glove.length > 0">
- <view class="order-image-label">手套照片 ({{ fileList.glove.length }}张)</view>
- <view class="order-image-container">
- <image
- class="order-image"
- v-for="(photo, index) in fileList.glove"
- :key="index"
- :src="photo.url"
- mode="aspectFill"
- @click="previewImage(fileList.glove.map(p => p.url), photo.url)">
- </image>
- </view>
- </view>
-
- <!-- 鞋套照片 -->
- <view class="order-image-item" v-if="fileList.ShoeCover && fileList.ShoeCover.length > 0">
- <view class="order-image-label">鞋套照片 ({{ fileList.ShoeCover.length }}张)</view>
- <view class="order-image-container">
- <image
- class="order-image"
- v-for="(photo, index) in fileList.ShoeCover"
- :key="index"
- :src="photo.url"
- mode="aspectFill"
- @click="previewImage(fileList.ShoeCover.map(p => p.url), photo.url)">
- </image>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 宠物状况记录 -->
- <view class="order-section" v-if="petList && petList.length > 0">
- <view class="order-section-title">宠物状况记录</view>
- <view class="order-section-content">
- <view class="pet-record" v-for="(pet, index) in petList" :key="index">
- <view class="pet-name">{{ pet.title }} ({{ getPetPhotoCount(index) }}张)</view>
- <view class="pet-images" v-if="fileList['pet' + index] && fileList['pet' + index].length > 0">
- <view class="pet-image-container" v-for="(photo, photoIndex) in fileList['pet' + index]" :key="photoIndex">
- <image
- class="pet-image"
- :src="photo.url"
- mode="aspectFill"
- @click="previewImage(fileList['pet' + index].map(p => p.url), photo.url)">
- </image>
- </view>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 基础服务记录 -->
- <view class="order-section" v-if="hasBasicServices">
- <view class="order-section-title">基础服务记录</view>
- <view class="order-section-content">
- <!-- 粮碗前后对比 -->
- <view class="service-record" v-if="fileList.foodA || fileList.foodB">
- <view class="service-name">粮碗前后对比</view>
- <view class="service-comparison">
- <view class="service-before-after">
- <view class="service-image-container" v-if="fileList.foodA && fileList.foodA.length > 0">
- <image
- class="service-image"
- :src="fileList.foodA[0].url"
- mode="aspectFill"
- @click="previewImage([fileList.foodA[0].url], fileList.foodA[0].url)">
- </image>
- <view class="service-image-label">前</view>
- </view>
- <view class="service-image-container" v-if="fileList.foodB && fileList.foodB.length > 0">
- <image
- class="service-image"
- :src="fileList.foodB[0].url"
- mode="aspectFill"
- @click="previewImage([fileList.foodB[0].url], fileList.foodB[0].url)">
- </image>
- <view class="service-image-label">后</view>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 水碗前后对比 -->
- <view class="service-record" v-if="fileList.waterA || fileList.waterB">
- <view class="service-name">水碗前后对比</view>
- <view class="service-comparison">
- <view class="service-before-after">
- <view class="service-image-container" v-if="fileList.waterA && fileList.waterA.length > 0">
- <image
- class="service-image"
- :src="fileList.waterA[0].url"
- mode="aspectFill"
- @click="previewImage([fileList.waterA[0].url], fileList.waterA[0].url)">
- </image>
- <view class="service-image-label">前</view>
- </view>
- <view class="service-image-container" v-if="fileList.waterB && fileList.waterB.length > 0">
- <image
- class="service-image"
- :src="fileList.waterB[0].url"
- mode="aspectFill"
- @click="previewImage([fileList.waterB[0].url], fileList.waterB[0].url)">
- </image>
- <view class="service-image-label">后</view>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 猫砂盆、尿垫前后对比 -->
- <view class="service-record" v-if="fileList.urinalA || fileList.urinalB">
- <view class="service-name">猫砂盆、尿垫前后对比</view>
- <view class="service-comparison">
- <view class="service-before-after">
- <view class="service-image-container" v-if="fileList.urinalA && fileList.urinalA.length > 0">
- <image
- class="service-image"
- :src="fileList.urinalA[0].url"
- mode="aspectFill"
- @click="previewImage([fileList.urinalA[0].url], fileList.urinalA[0].url)">
- </image>
- <view class="service-image-label">前</view>
- </view>
- <view class="service-image-container" v-if="fileList.urinalB && fileList.urinalB.length > 0">
- <image
- class="service-image"
- :src="fileList.urinalB[0].url"
- mode="aspectFill"
- @click="previewImage([fileList.urinalB[0].url], fileList.urinalB[0].url)">
- </image>
- <view class="service-image-label">后</view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 定制服务记录 -->
- <view class="order-section" v-if="projectList && projectList.length > 0">
- <view class="order-section-title">定制服务记录</view>
- <view class="order-section-content">
- <view class="custom-service">
- <view class="custom-service-item" v-for="(project, index) in projectList" :key="index">
- <view class="custom-service-name">{{ project.title }} ({{ getProjectPhotoCount(index) }}张)</view>
- <view class="custom-service-images" v-if="fileList['project' + index] && fileList['project' + index].length > 0">
- <image
- class="custom-service-image"
- v-for="(photo, photoIndex) in fileList['project' + index]"
- :key="photoIndex"
- :src="photo.url"
- mode="aspectFill"
- @click="previewImage(fileList['project' + index].map(p => p.url), photo.url)">
- </image>
- </view>
- </view>
- </view>
- </view>
- </view>
-
- <!-- 补充信息 -->
- <view class="order-section" v-if="form.notes">
- <view class="order-section-title">补充信息</view>
- <view class="order-section-content">
- <view class="notes-content">{{ form.notes }}</view>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- import { appletOrderDateFrequencyById } from '@/api/order/order.js'
-
- export default {
- data() {
- return {
- id: null,
- orderDate: '',
- form: {},
- fileList: {},
- petList: [],
- projectList: [],
- isRead: false
- }
- },
- computed: {
- hasBasicServices() {
- return (this.fileList.foodA && this.fileList.foodA.length > 0) ||
- (this.fileList.foodB && this.fileList.foodB.length > 0) ||
- (this.fileList.waterA && this.fileList.waterA.length > 0) ||
- (this.fileList.waterB && this.fileList.waterB.length > 0) ||
- (this.fileList.urinalA && this.fileList.urinalA.length > 0) ||
- (this.fileList.urinalB && this.fileList.urinalB.length > 0);
- }
- },
- onLoad(options) {
- if (options.id) {
- this.id = options.id;
- this.loadOrderDetail();
- }
- },
- methods: {
- loadOrderDetail() {
- appletOrderDateFrequencyById(this.id)
- .then(res => {
- const data = res.data.check;
- const frequency = res.data.frequency;
-
- this.isRead = frequency.status == 2;
-
- // 设置订单日期
- if (frequency.serviceDate) {
- this.orderDate = this.formatDate(frequency.serviceDate);
- }
-
- if(res.code == 200 && data) {
- this.form = data;
-
- // 回显手套照片
- if(data.glovePhoto) {
- this.$set(this.fileList, 'glove', data.glovePhoto.split(',').map(url => ({ url })));
- }
-
- // 回显鞋套照片
- if(data.shoeCoverPhoto) {
- this.$set(this.fileList, 'ShoeCover', data.shoeCoverPhoto.split(',').map(url => ({ url })));
- }
-
- // 回显宠物照片
- if(data.petPhoto) {
- const pets = JSON.parse(data.petPhoto);
- this.petList = pets;
- pets.forEach((pet, index) => {
- if(pet.fileList) {
- this.$set(this.fileList, 'pet' + index, pet.fileList.split(',').map(url => ({ url })));
- }
- });
- }
-
- // 回显项目照片
- if(data.workDogImage) {
- const pList = JSON.parse(data.workDogImage);
- this.projectList = pList;
- pList.forEach((project, index) => {
- if(project.fileList) {
- this.$set(this.fileList, 'project' + index, project.fileList.split(',').map(url => ({ url })));
- }
- });
- }
-
- // 回显粮碗照片
- if(data.grainBowlFront) this.$set(this.fileList, 'foodA', data.grainBowlFront.split(',').map(url => ({ url })));
- if(data.grainBowlAfter) this.$set(this.fileList, 'foodB', data.grainBowlAfter.split(',').map(url => ({ url })));
-
- // 回显水碗照片
- if(data.waterBowlFront) this.$set(this.fileList, 'waterA', data.waterBowlFront.split(',').map(url => ({ url })));
- if(data.waterBowlAfter) this.$set(this.fileList, 'waterB', data.waterBowlAfter.split(',').map(url => ({ url })));
-
- // 回显猫砂盆/尿垫照片
- if(data.basinFront) this.$set(this.fileList, 'urinalA', data.basinFront.split(',').map(url => ({ url })));
- if(data.basinAfter) this.$set(this.fileList, 'urinalB', data.basinAfter.split(',').map(url => ({ url })));
-
- } else {
- // 如果没有数据,从frequency中初始化基础结构
- let projectNameList = [];
-
- frequency.pets.forEach((pet, i) => {
- this.$set(this.fileList, 'pet' + i, []);
-
- pet.orderItemList.forEach((item, index) => {
- this.$set(this.fileList, 'project' + index, []);
- });
- });
-
- frequency.pets.forEach((pet, i) => {
- this.petList.push({
- title: pet.name,
- id: pet.id,
- });
-
- pet.orderItemList.forEach((item, index) => {
- if(!projectNameList.includes(item.productName)){
- projectNameList.push(item.productName);
- this.projectList.push({
- title: item.productName,
- ids: [item.id]
- });
- } else {
- this.projectList[projectNameList.indexOf(item.productName)].ids.push(item.id);
- }
- });
- });
- }
- })
- .catch(err => {
- console.error('加载订单详情失败:', err);
- uni.showToast({
- title: '加载失败',
- icon: 'none'
- });
- });
- },
-
- // 获取宠物照片数量
- getPetPhotoCount(index) {
- const photos = this.fileList['pet' + index];
- return photos ? photos.length : 0;
- },
-
- // 获取项目照片数量
- getProjectPhotoCount(index) {
- const photos = this.fileList['project' + index];
- return photos ? photos.length : 0;
- },
-
- // 格式化日期
- formatDate(dateString) {
- if (!dateString) return '';
- const date = new Date(dateString);
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- return `${year}年${month}月${day}日`;
- },
-
- // 图片预览功能
- previewImage(urls, current) {
- if (!urls || urls.length === 0) return;
-
- uni.previewImage({
- urls: urls,
- current: current || urls[0],
- indicator: 'number',
- loop: true
- });
- }
- }
- }
- </script>
-
- <style lang="scss">
- .order-detail-container {
- padding: 15px;
- background-color: #f5f5f7;
- min-height: 100vh;
- }
-
- .order-date {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 12px 16px;
- background-color: #FFF9EF;
- border-radius: 10px;
- margin-bottom: 15px;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
-
- .order-date-icon {
- margin-right: 12px;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 32px;
- height: 32px;
- background-color: rgba(255, 170, 72, 0.1);
- border-radius: 50%;
- }
-
- .order-date-text {
- color: #A94F20;
- font-size: 16px;
- font-weight: 500;
- letter-spacing: 0.5px;
- }
- }
-
- .order-section {
- background-color: #fff;
- border-radius: 8px;
- margin-bottom: 15px;
- overflow: hidden;
-
- .order-section-title {
- padding: 12px 15px;
- border-bottom: 1px solid #f0f0f0;
- color: #333;
- font-size: 16px;
- font-weight: 500;
- position: relative;
-
- &::before {
- content: '';
- position: absolute;
- left: 0;
- top: 12px;
- height: 16px;
- width: 4px;
- background-color: #ffaa48;
- border-radius: 0 2px 2px 0;
- }
- }
-
- .order-section-content {
- padding: 15px;
- }
- }
-
- .order-image-item {
- margin-bottom: 15px;
-
- .order-image-label {
- color: #666;
- font-size: 14px;
- margin-bottom: 8px;
- }
-
- .order-image-container {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-
- .order-image {
- width: 80px;
- height: 80px;
- border-radius: 4px;
- object-fit: cover;
- }
- }
- }
-
- .pet-record {
- margin-bottom: 20px;
-
- .pet-name {
- color: #333;
- font-size: 15px;
- font-weight: 500;
- margin-bottom: 10px;
- }
-
- .pet-images {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-
- .pet-image-container {
- .pet-image {
- width: 80px;
- height: 80px;
- border-radius: 4px;
- object-fit: cover;
- }
- }
- }
- }
-
- .service-record {
- margin-bottom: 20px;
-
- .service-name {
- color: #333;
- font-size: 15px;
- font-weight: 500;
- margin-bottom: 10px;
- }
-
- .service-comparison {
- .service-before-after {
- display: flex;
- gap: 15px;
-
- .service-image-container {
- position: relative;
-
- .service-image {
- width: 80px;
- height: 80px;
- border-radius: 4px;
- object-fit: cover;
- }
-
- .service-image-label {
- position: absolute;
- bottom: 0;
- left: 0;
- background-color: rgba(0,0,0,0.5);
- color: #fff;
- padding: 2px 8px;
- font-size: 12px;
- border-radius: 0 0 0 4px;
- }
- }
- }
- }
- }
-
- .custom-service {
- .custom-service-item {
- margin-bottom: 15px;
-
- .custom-service-name {
- color: #333;
- font-size: 15px;
- font-weight: 500;
- margin-bottom: 10px;
- }
-
- .custom-service-images {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-
- .custom-service-image {
- width: 80px;
- height: 80px;
- border-radius: 4px;
- object-fit: cover;
- }
- }
- }
- }
-
- .notes-content {
- color: #333;
- font-size: 14px;
- line-height: 1.6;
- padding: 12px 16px;
- background-color: #F5F5F5;
- border-radius: 8px;
- min-height: 120px;
- white-space: pre-wrap;
- word-break: break-word;
- }
- </style>
|