daShangDao_miniProgram/pkgUser/book-records.vue
2026-06-15 16:37:57 +08:00

692 lines
19 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page-container">
<!-- 顶部导航栏 -->
<!-- <view class="nav-bar">
<view class="nav-left">
<text class="back-icon" @click="navigateBack"></text>
</view>
<view class="nav-title">上书记录</view>
<view class="nav-right">
<text class="more-icon"></text>
</view>
</view> -->
<!-- 账号/店铺切换 -->
<view class="tab-switch">
<view class="tab" :class="{active: activeTab === 'account'}" @click="activeTab = 'account'">
<text>账号</text>
</view>
<view class="tab" :class="{active: activeTab === 'store'}" @click="activeTab = 'store'">
<text>店铺</text>
</view>
</view>
<!-- 日期选择器 -->
<view class="date-picker-bar">
<picker mode="date" :value="dateInput" @change="onDatePickerConfirm">
<view class="date-left">
<text class="date-day">{{displayDate.day}}</text>
<view class="date-info">
<text>{{displayDate.day}} - {{displayDate.month}} - {{displayDate.year}} </text>
<text class="date-arrow"></text>
</view>
</view>
</picker>
<text class="date-total">累计 {{ total }} </text>
</view>
<!-- 加载中提示 -->
<view class="loading-state" v-if="isLoading">
<text>正在加载...</text>
</view>
<!-- 图片网格 -->
<scroll-view
scroll-y
style="height: 100vh"
@scrolltolower="loadMore"
>
<view class="image-grid">
<view class="image-item" v-for="(record, index) in filteredBookRecords" :key="index"
@click="previewImage(record.images)">
<image :src="record.bookPic ? record.bookPic : record.images[0]" mode="aspectFill" class="book-image"></image>
<view class="image-info">
<text class="book-name">{{record.bookName}}</text>
<view class="book-details">
<text class="book-isbn">ISBN: {{record.isbn}}</text>
</view>
<view class="book-details">
<text class="book-condition">品相: {{record.condition}}</text>
<text class="upload-time">{{record.uploadTime}}</text>
</view>
<view class="book-details">
<!-- <text v-if="record.artNo" class="book-artno">货号: {{formatArtNo(record.artNo)}}</text> -->
<!-- <text v-if="record.itemNumber" class="book-item-number">商品ID: {{record.itemNumber}}</text> -->
<text v-if="record.stock !== undefined" class="book-stock">库存: {{record.stock}}</text>
<text class="book-price">{{record.price}}元</text>
</view>
<view class="book-details">
<text class="book-condition">拼多多:</text>
<text class="status-value" :class="record.pddPublishedStatus === 1 ? 'published' : 'unpublished'">
{{record.pddPublishedStatus === 1 ? '已发布' : '未发布'}}
</text>
</view>
<view class="book-details" :class="{'status-success': record.kfzPublishedStatus === 1}">
<text class="book-condition">孔夫子:</text>
<text class="status-value" :class="record.kfzPublishedStatus === 1 ? 'published' : 'unpublished'">
{{record.kfzPublishedStatus === 1 ? '已发布' : '未发布'}}
</text>
</view>
<view class="book-details" :class="{'status-success': record.xyPublishedStatus === 1}">
<text class="book-condition">闲鱼:</text>
<text class="status-value" :class="record.xyPublishedStatus === 1 ? 'published' : 'unpublished'">
{{record.xyPublishedStatus === 1 ? '已发布' : '未发布'}}
</text>
</view>
</view>
</view>
</view>
<view class="loading-more" v-if="isLoading">
<text>加载中...</text>
</view>
<view class="no-more" v-if="!hasMore && filteredBookRecords.length > 0">
<text>没有更多数据了</text>
</view>
</scroll-view>
</view>
</template>
<script>
import * as bookRecords from '@/service/bookRecords.js';
export default {
data() {
return {
bookRecords: [], // 存储上书记录数据
filteredBookRecords: [], // 筛选后的上书记录
activeTab: 'account', // 当前激活的标签
isLoading: true, // 加载状态
totalCount: 0, // 累计数量
show: false,
dateInput: '',
displayDate: {
day: new Date().getDate().toString().padStart(2, '0'),
month: (new Date().getMonth() + 1).toString().padStart(2, '0'),
year: new Date().getFullYear()
},
// 添加分页相关数据
pageNum: 1,
pageSize: 10,
hasMore: true,
total: 0
}
},
onLoad(options) {
// 尝试获取事件通道
try {
const eventChannel = this.getOpenerEventChannel();
if (eventChannel && typeof eventChannel.on === 'function') {
// 如果事件通道可用,监听数据
eventChannel.on('bookRecordsData', (data) => {
console.log('接收到的上书记录数据:', data.records);
if (data && data.records) {
this.processBookRecords(data.records);
} else {
// 如果数据无效,使用备用方案
console.log('接收到的数据无效,使用备用方案');
this.loadBookRecords();
}
});
} else {
// 事件通道不可用,使用备用方案
console.log('事件通道不可用,使用备用方案');
this.loadBookRecords();
}
} catch (error) {
// 发生错误时使用备用方案
console.error('获取事件通道失败:', error);
this.loadBookRecords();
}
// 初始化filteredBookRecords
this.filteredBookRecords = this.bookRecords;
},
// 添加下拉刷新和上拉加载更多方法
onPullDownRefresh() {
this.pageNum = 1;
this.hasMore = true;
this.loadBookRecords().then(() => {
uni.stopPullDownRefresh();
});
},
onReachBottom() {
if (this.hasMore && !this.isLoading) {
this.loadMore();
}
},
methods: {
onDatePickerConfirm(e) {
this.dateInput = e.detail.value;
console.log("获取日期",this.dateInput)
const [year, month, day] = this.dateInput.split('-');
this.displayDate = { day, month, year };
// 重置分页
this.pageNum = 1;
this.hasMore = true;
// 直接请求后端,获取该日期的所有数据
this.loadBookRecords();
},
resetDateFilter() {
this.filteredBookRecords = this.bookRecords;
const now = new Date();
this.displayDate = {
day: now.getDate().toString().padStart(2, '0'),
month: (now.getMonth() + 1).toString().padStart(2, '0'),
year: now.getFullYear()
};
this.dateInput = '';
},
// 返回上一页
navigateBack() {
uni.navigateBack()
},
// 处理上书记录数据
processBookRecords(records) {
try {
console.log('开始处理上书记录数据:', records);
// 检查 records 是否为有效数据
if (!records || !records.rows || !Array.isArray(records.rows)) {
console.error('无效的上书记录数据格式:', records);
throw new Error('无效的数据格式');
}
// 处理从后端接收的数据
this.bookRecords = records.rows.map(item => {
// 确保images是数组格式
let images = [];
if (item.bookPic) {
images.push(item.bookPic);
} else if (item.imageUrl) {
images.push(item.imageUrl);
} else if (item.images && Array.isArray(item.images)) {
images = item.images;
} else {
// 使用默认的imgNull.webp图片
images.push('/static/imgNull.webp');
}
// 格式化上传时间
let uploadTime = item.createTime || item.uploadTime || new Date().toISOString();
if (uploadTime && uploadTime.length > 10) {
uploadTime = uploadTime.substring(0, 10); // 只保留日期部分
}
// 处理品相代码
let conditionText = '未知品相';
if (item.conditionCode) {
switch(item.conditionCode) {
case 'A': conditionText = '一品'; break;
case 'B': conditionText = '二品'; break;
case 'C': conditionText = '三品'; break;
case 'D': conditionText = '四品'; break;
case 'E': conditionText = '五品'; break;
case 'F': conditionText = '六品'; break;
case 'G': conditionText = '六五品'; break;
case 'H': conditionText = '七品'; break;
case 'I': conditionText = '七五品'; break;
case 'J': conditionText = '八品'; break;
case 'K': conditionText = '八五品'; break;
case 'L': conditionText = '九品'; break;
case 'M': conditionText = '九五品'; break;
case 'N': conditionText = '全新'; break;
default: conditionText = item.conditionCode;
}
} else if (item.condition) {
conditionText = item.condition;
} else if (item.qualityText) {
conditionText = item.qualityText;
}
return {
bookName: item.goodsName || item.bookName || item.name || '未知书名',
uploadTime: uploadTime,
images: images,
isbn: item.isbn || '无ISBN',
price: item.price / 100 || 0,
condition: conditionText,
artNo: item.artNo || '',
itemNumber: item.itemNumber || item.productId || '',
productId: item.productId || '',
stock: item.inventory || 0,
id: item.id || '',
remark: item.remark || '',
kfzPublishedStatus: item.kfzPublishedStatus || 0,
pddPublishedStatus: item.pddPublishedStatus || 0,
xyPublishedStatus: item.xyPublishedStatus || 0,
bookPic: item.bookPic || '',
};
});
// 更新总数
this.total = records.total || 0;
// 按uploadTime倒序排序
this.bookRecords.sort((a, b) => {
if (!a.uploadTime) return 1;
if (!b.uploadTime) return -1;
return b.uploadTime.localeCompare(a.uploadTime);
});
this.totalCount = this.bookRecords.length;
this.isLoading = false;
console.log('处理后的上书记录数据:', this.bookRecords);
this.filteredBookRecords = this.bookRecords; // 初始化筛选数据
} catch (error) {
console.error('处理上书记录数据失败:', error);
this.isLoading = false;
uni.showToast({
title: '数据处理失败',
icon: 'none'
});
}
},
// 修改加载上书记录方法
async loadBookRecords() {
try {
this.isLoading = true;
const phoneNumber = uni.getStorageSync('phoneNumber');
if (!phoneNumber) {
uni.showToast({
title: '请先登录',
icon: 'none'
});
return;
}
// 新增:带上日期参数
const date = this.dateInput; // 格式:'2024-06-08'
console.log("时间",date)
const result = await bookRecords.fetchBookRecords(phoneNumber, this.pageNum, this.pageSize, date);
if (result && result.rows) {
const formattedRows = result.rows.map(item => {
let images = [];
if (item.bookPic) {
images.push(item.bookPic);
} else if (item.imageUrl) {
images.push(item.imageUrl);
} else if (item.images && Array.isArray(item.images)) {
images = item.images;
} else {
images.push('/static/imgNull.webp');
}
let uploadTime = item.createTime || item.uploadTime || new Date().toISOString();
if (uploadTime && uploadTime.length > 10) {
uploadTime = uploadTime.substring(0, 10);
}
let conditionText = '未知品相';
if (item.conditionCode) {
switch(item.conditionCode) {
case 'A': conditionText = '一品'; break;
case 'B': conditionText = '二品'; break;
case 'C': conditionText = '三品'; break;
case 'D': conditionText = '四品'; break;
case 'E': conditionText = '五品'; break;
case 'F': conditionText = '六品'; break;
case 'G': conditionText = '六五品'; break;
case 'H': conditionText = '七品'; break;
case 'I': conditionText = '七五品'; break;
case 'J': conditionText = '八品'; break;
case 'K': conditionText = '八五品'; break;
case 'L': conditionText = '九品'; break;
case 'M': conditionText = '九五品'; break;
case 'N': conditionText = '全新'; break;
default: conditionText = item.conditionCode;
}
} else if (item.condition) {
conditionText = item.condition;
} else if (item.qualityText) {
conditionText = item.qualityText;
}
return {
bookName: item.goodsName || item.bookName || item.name || '未知书名',
uploadTime: uploadTime,
images: images,
isbn: item.isbn || '无ISBN',
price: item.price / 100 || 0,
condition: conditionText,
artNo: item.artNo || '',
itemNumber: item.itemNumber || item.productId || '',
productId: item.productId || '',
stock: item.inventory || 0,
id: item.id || '',
remark: item.remark || '',
kfzPublishedStatus: item.kfzPublishedStatus || 0,
pddPublishedStatus: item.pddPublishedStatus || 0,
xyPublishedStatus: item.xyPublishedStatus || 0,
bookPic: item.bookPic || '',
};
});
if (this.pageNum === 1) {
this.bookRecords = formattedRows;
} else {
this.bookRecords = [...this.bookRecords, ...formattedRows];
}
this.filteredBookRecords = this.bookRecords;
this.total = result.total;
this.hasMore = this.bookRecords.length < result.total;
this.gotoPage = this.pageNum;
}
} catch (error) {
console.error('加载上书记录失败:', error);
uni.showToast({
title: '加载失败',
icon: 'none'
});
} finally {
this.isLoading = false;
}
},
// 添加加载更多方法
async loadMore() {
if (!this.hasMore || this.isLoading) return;
this.pageNum++;
await this.loadBookRecords();
},
// 预览图片
previewImage(images) {
// 显示图片预览
uni.previewImage({
urls: images,
longPressActions: {
itemList: ['发送给朋友', '保存图片', '收藏'],
success: function(data) {
console.log('选中了第' + (data.tapIndex + 1) + '个按钮')
},
fail: function(err) {
console.log(err.errMsg)
}
}
})
},
// 格式化货号信息
formatArtNo(artNo) {
if (!artNo) return '';
// 解析货号格式,例如 CM11M-9787538259704A
// C: 表示品类M: 表示品相等级
let result = '';
if (artNo.startsWith('C')) {
result += '书籍/';
}
// 提取品相信息
const conditionMatch = artNo.match(/[A-Z](\d+)([A-Z])/i);
if (conditionMatch && conditionMatch[2]) {
const condition = conditionMatch[2];
switch(condition) {
case 'N': result += '全新/'; break;
case 'A': result += '上好/'; break;
case 'B': result += '中上/'; break;
case 'M': result += '中等/'; break;
case 'L': result += '中下/'; break;
default: result += condition + '/';
}
}
return result + artNo;
},
// 添加生成占位图的方法
generatePlaceholderImage() {
// 创建canvas上下文
const canvas = uni.createCanvasContext('placeholderCanvas');
// 设置背景色
canvas.setFillStyle('#f5f5f5');
canvas.fillRect(0, 0, 300, 400);
// 设置文字样式
canvas.setFillStyle('#999999');
canvas.setFontSize(28);
canvas.setTextAlign('center');
canvas.setTextBaseline('middle');
// 绘制文字
canvas.fillText('暂无图片', 150, 200);
// 将canvas内容转换为图片
return new Promise((resolve) => {
canvas.draw(false, () => {
setTimeout(() => {
uni.canvasToTempFilePath({
canvasId: 'placeholderCanvas',
success: (res) => {
resolve(res.tempFilePath);
},
fail: (err) => {
console.error('生成占位图失败:', err);
resolve('/static/images/default-book.png'); // 失败时使用默认图片
}
});
}, 100);
});
});
}
}
}
</script>
<style>
.page-container {
padding-bottom: 20rpx;
}
/* 导航栏样式 */
.nav-bar {
display: flex;
align-items: center;
padding: 20rpx;
background-color: #fff;
}
.nav-left,
.nav-right {
width: 80rpx;
}
.back-icon,
.more-icon {
font-size: 40rpx;
}
.nav-title {
flex: 1;
text-align: center;
font-size: 32rpx;
font-weight: bold;
}
/* 标签切换样式 */
.tab-switch {
display: flex;
padding: 20rpx;
background-color: #fff;
border-bottom: 1rpx solid #eee;
}
.tab {
flex: 1;
text-align: center;
padding: 16rpx 0;
color: #666;
}
.tab.active {
color: #007AFF;
font-weight: bold;
}
/* 日期选择器样式 */
.date-picker-bar {
display: flex;
align-items: center;
justify-content: space-between;
background: #fff;
padding: 24rpx 20rpx 0 20rpx;
border-bottom: 1rpx solid #eee;
}
.date-left {
display: flex;
align-items: baseline;
cursor: pointer;
}
.date-day {
font-size: 64rpx;
font-weight: bold;
color: #222;
margin-right: 16rpx;
}
.date-info {
display: flex;
flex-direction: column;
font-size: 28rpx;
color: #666;
}
.date-arrow {
font-size: 24rpx;
color: #bbb;
margin-left: 8rpx;
}
.date-total {
font-size: 28rpx;
color: #007AFF;
font-weight: bold;
}
/* 加载状态样式 */
.loading-state {
text-align: center;
padding: 40rpx 0;
color: #999;
}
/* 图片网格样式 */
.image-grid {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 20rpx;
}
.image-item {
width: 48%;
margin-bottom: 20rpx;
margin-right: 2%;
background: #fff;
border-radius: 12rpx;
overflow: hidden;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);
}
.image-item:nth-child(2n) {
margin-right: 0;
}
.book-image {
width: 100%;
height: 300rpx;
object-fit: cover;
}
.image-info {
padding: 16rpx;
}
.book-name {
font-size: 28rpx;
color: #333;
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: bold;
margin-bottom: 8rpx;
}
.book-details {
display: flex;
justify-content: space-between;
margin-top: 6rpx;
}
.book-isbn, .book-price, .book-condition, .upload-time, .book-artno {
font-size: 24rpx;
color: #666;
}
.book-price {
color: #ff6b00;
font-weight: bold;
}
.book-condition {
color: #007AFF;
}
.upload-time {
color: #999;
}
.book-artno, .book-item-number {
color: #999;
font-size: 22rpx;
}
.book-stock {
display: block;
margin-top: 6rpx;
color: #4CAF50;
font-size: 22rpx;
font-weight: bold;
}
/* 空状态样式 */
.empty-state {
text-align: center;
padding: 100rpx 0;
color: #999;
}
.status-value.published {
color: #007aff;
font-size: 24rpx;
}
.status-value.unpublished {
color: #ff4d4f;
font-size: 24rpx;
}
/* 添加新样式 */
.loading-more, .no-more {
text-align: center;
padding: 20rpx 0;
color: #999;
font-size: 24rpx;
}
.no-more {
color: #666;
}
</style>