Browse Source

feat(质检): 添加商品和款式价格信息展示功能

- 在质检页面和处理结果页面添加商品和款式价格信息的展示
- 修改品牌商品数量增加逻辑,每次加一都重新选择品牌款式
- 优化样式显示,将px单位转换为rpx以适应不同屏幕
master
前端-胡立永 1 week ago
parent
commit
1a10e696d7
2 changed files with 194 additions and 152 deletions
  1. +163
    -118
      pages/manager/inspect-result.vue
  2. +31
    -34
      pages/manager/inspect.vue

+ 163
- 118
pages/manager/inspect-result.vue View File

@ -19,6 +19,7 @@
<view class="goods-name-section">
<text class="goods-name">{{ getGoodsName(item.shopId) }}</text>
<text class="goods-brand">{{ getBrandStyleInfo(item) }}</text>
<text class="goods-style-price" v-if="getStylePriceInfo(item)">{{ getStylePriceInfo(item) }}</text>
</view>
<text class="row-count">x{{ item.count }}</text>
</view>
@ -264,6 +265,12 @@ export default {
styleId: item.styleId || '',
uniqueKey: uniqueKey,
qualityLevel: item.qualityLevel || '', //
//
styleMinPrice: item.styleMinPrice || 0,
styleMaxPrice: item.styleMaxPrice || 0,
//
productMinPrice: item.productMinPrice || 0,
productMaxPrice: item.productMaxPrice || 0,
originalItem: item, //
items: item.commonOrderList ? [...item.commonOrderList] : [{
testingInstructions: '',
@ -331,19 +338,19 @@ export default {
}
}
//
for (const group of this.unqualifiedGroups) {
if (!group.total || group.total === '' || parseFloat(group.total) <= 0) {
uni.showToast({ title: '请填写不合格产品金额', icon: 'none' })
return
}
}
//
for (const item of this.unrecyclableList) {
if (!item.total || item.total === '' || parseFloat(item.total) <= 0) {
uni.showToast({ title: '请填写不可回收产品金额', icon: 'none' })
return
}
}
// for (const group of this.unqualifiedGroups) {
// if (!group.total || group.total === '' || parseFloat(group.total) <= 0) {
// uni.showToast({ title: '', icon: 'none' })
// return
// }
// }
// //
// for (const item of this.unrecyclableList) {
// if (!item.total || item.total === '' || parseFloat(item.total) <= 0) {
// uni.showToast({ title: '', icon: 'none' })
// return
// }
// }
//
// 1.
@ -687,6 +694,34 @@ export default {
}
},
getStylePriceInfo(item) {
//
if (item.styleMinPrice && item.styleMaxPrice) {
const minPrice = parseFloat(item.styleMinPrice)
const maxPrice = parseFloat(item.styleMaxPrice)
if (minPrice === maxPrice) {
return `款式价格:¥${minPrice}`
} else {
return `款式价格:¥${minPrice}-${maxPrice}`
}
}
//
if (item.productMinPrice && item.productMaxPrice) {
const minPrice = parseFloat(item.productMinPrice)
const maxPrice = parseFloat(item.productMaxPrice)
if (minPrice === maxPrice) {
return `商品价格:¥${minPrice}`
} else {
return `商品价格:¥${minPrice}-${maxPrice}`
}
}
return ''
},
selectQualityLevel(level) {
//
this.currentQualityLevel = level
@ -807,46 +842,46 @@ export default {
display: flex;
flex-direction: column;
background: none;
padding-bottom: 120px;
padding-bottom: 240rpx;
}
.result-card {
background: #fff;
border-radius: 24px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
margin: 0 24px 24px 24px;
padding: 24px 24px 0 24px;
border-radius: 48rpx;
box-shadow: 0 8rpx 48rpx rgba(0, 0, 0, 0.06);
margin: 0 24rpx 24rpx 24rpx;
padding: 48rpx 48rpx 0 48rpx;
}
.card-title {
font-size: 16px;
font-size: 32rpx;
font-weight: bold;
color: #222;
margin-bottom: 18px;
margin-bottom: 36rpx;
}
.card-title-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 18px;
margin-bottom: 36rpx;
}
.status-tag {
background: #fff7e6;
color: #ffb400;
font-size: 12px;
border-radius: 12px;
padding: 2px 26rpx;
font-size: 24rpx;
border-radius: 24rpx;
padding: 4rpx 26rpx;
font-weight: 400;
height: 22px;
height: 44rpx;
display: flex;
align-items: center;
}
.result-row,
.result-group {
margin-bottom: 18px;
margin-bottom: 36rpx;
}
.row-main {
@ -859,18 +894,26 @@ export default {
margin-right: 8px;
.goods-name {
font-size: 26rpx;
font-size: 32rpx;
font-weight: bold;
color: #222;
line-height: 1.2;
color: #333;
line-height: 1.3;
}
.goods-brand {
font-size: 22rpx;
color: #999;
font-size: 26rpx;
color: #666;
font-weight: normal;
line-height: 1.2;
margin-top: 2px;
line-height: 1.3;
margin-top: 4rpx;
}
.goods-style-price {
font-size: 26rpx;
color: #ff6b35;
font-weight: 600;
line-height: 1.3;
margin-top: 4rpx;
}
}
@ -898,26 +941,26 @@ export default {
.price-input-row {
display: flex;
align-items: center;
margin-top: 12px;
margin-bottom: 8px;
margin-top: 24rpx;
margin-bottom: 16rpx;
.price-label {
font-size: 26rpx;
color: #888;
min-width: 80px;
min-width: 160rpx;
flex-shrink: 0;
}
.price-input {
flex: 1;
height: 40px;
border-radius: 12px;
height: 80rpx;
border-radius: 24rpx;
background: #f6f6f6;
border: none;
font-size: 16px;
font-size: 32rpx;
color: #222;
padding: 0 16px;
margin-left: 12px;
padding: 0 32rpx;
margin-left: 24rpx;
font-weight: bold;
}
}
@ -927,37 +970,41 @@ export default {
.row-reason {
display: flex;
align-items: center;
margin-top: 8px;
margin-top: 16rpx;
.reason-label {
font-size: 13px;
font-size: 26rpx;
color: #bbb;
min-width: 80px;
min-width: 160rpx;
max-width: 240rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.reason-input {
flex: 1;
height: 36px;
border-radius: 12px;
height: 72rpx;
border-radius: 24rpx;
background: #f6f6f6;
border: none;
font-size: 26rpx;
color: #222;
padding-left: 12px;
margin-left: 8px;
padding-left: 24rpx;
margin-left: 16rpx;
}
.reason-select {
flex: 1;
display: flex;
align-items: center;
height: 36px;
border-radius: 12px;
height: 72rpx;
border-radius: 24rpx;
background: #f6f6f6;
font-size: 26rpx;
color: #bbb;
padding-left: 12px;
margin-left: 8px;
padding-left: 24rpx;
margin-left: 16rpx;
justify-content: flex-end;
}
@ -974,32 +1021,30 @@ export default {
.info-card {
background: #fff;
border-radius: 24px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
margin: 0 24px 24px 24px;
padding: 24px 24px 0 24px;
border-radius: 48rpx;
box-shadow: 0 8rpx 48rpx rgba(0, 0, 0, 0.06);
}
.info-row {
display: flex;
align-items: center;
margin-bottom: 16px;
margin-bottom: 32rpx;
.info-label {
font-size: 13px;
font-size: 26rpx;
color: #bbb;
min-width: 80px;
min-width: 160rpx;
}
.info-value {
font-size: 13px;
font-size: 26rpx;
color: #222;
margin-left: 8px;
margin-left: 16rpx;
}
.copy-btn {
color: #ffb400;
margin-left: 8px;
margin-left: 16rpx;
}
}
@ -1010,34 +1055,34 @@ export default {
bottom: 0;
background: #fff;
display: flex;
gap: 16px;
padding: 12px 16px 24px 16px;
gap: 32rpx;
padding: 24rpx 32rpx 48rpx 32rpx;
z-index: 101;
.btn-outline {
flex: 1;
height: 40px;
border-radius: 16px;
border: 1px solid #ffe09a;
height: 80rpx;
border-radius: 32rpx;
border: 2rpx solid #ffe09a;
color: #ffb400;
background: #fff0d2;
font-size: 15px;
font-size: 30rpx;
font-weight: 500;
box-shadow: none;
padding: 0 18px;
padding: 0 36rpx;
}
.btn-main {
flex: 1;
height: 40px;
border-radius: 16px;
height: 80rpx;
border-radius: 32rpx;
background: linear-gradient(90deg, #ffd01e 0%, #ffac04 100%);
color: #fff;
border: none;
font-size: 15px;
font-size: 30rpx;
font-weight: 500;
box-shadow: none;
padding: 0 18px;
padding: 0 36rpx;
}
}
@ -1051,7 +1096,7 @@ export default {
.reason-popup {
background: #fff;
border-radius: 24px 24px 0 0;
border-radius: 48rpx 48rpx 0 0;
padding: 0;
height: 75vh;
position: relative;
@ -1061,54 +1106,54 @@ export default {
display: flex;
align-items: center;
justify-content: center;
height: 60px;
border-bottom: 1px solid #f0f0f0;
height: 120rpx;
border-bottom: 2rpx solid #f0f0f0;
position: relative;
.popup-close {
position: absolute;
left: 20px;
left: 40rpx;
color: #666;
font-size: 16px;
font-size: 32rpx;
}
.popup-title {
font-size: 18px;
font-size: 36rpx;
font-weight: 600;
color: #222;
}
}
.popup-content {
height: calc(75vh - 60px - 82px);
height: calc(75vh - 120rpx - 164rpx);
overflow-y: auto;
}
.popup-section {
padding: 0 20px 24px 20px;
padding: 0 40rpx 48rpx 40rpx;
&:first-child {
padding-top: 24px;
padding-top: 48rpx;
}
.section-label {
font-size: 16px;
font-size: 32rpx;
color: #222;
margin-bottom: 16px;
margin-bottom: 32rpx;
display: block;
font-weight: 500;
}
.level-options {
display: flex;
gap: 12px;
margin-bottom: 16px;
gap: 24rpx;
margin-bottom: 32rpx;
.level-option {
width: 40px;
height: 40px;
border-radius: 8px;
border: 2px solid #ddd;
width: 80rpx;
height: 80rpx;
border-radius: 16rpx;
border: 4rpx solid #ddd;
display: flex;
align-items: center;
justify-content: center;
@ -1127,7 +1172,7 @@ export default {
}
.level-text {
font-size: 16px;
font-size: 32rpx;
color: #666;
font-weight: 500;
}
@ -1136,11 +1181,11 @@ export default {
.custom-reason-input {
width: 100%;
min-height: 80px;
padding: 12px;
border: 1px solid #e0e0e0;
border-radius: 8px;
font-size: 14px;
min-height: 160rpx;
padding: 24rpx;
border: 2rpx solid #e0e0e0;
border-radius: 16rpx;
font-size: 28rpx;
color: #222;
background: #fff;
resize: none;
@ -1160,12 +1205,12 @@ export default {
display: flex;
flex-wrap: wrap;
gap: 20rpx;
margin-bottom: 32px;
margin-bottom: 64rpx;
.img-item {
width: 150rpx;
height: 150rpx;
border-radius: 12px;
border-radius: 24rpx;
background: #f8f8f8;
position: relative;
@ -1178,8 +1223,8 @@ export default {
.img-del {
position: absolute;
top: -6px;
right: -6px;
top: -12rpx;
right: -12rpx;
width: 48rpx;
height: 48rpx;
background: rgba(0, 0, 0, 0.6);
@ -1187,7 +1232,7 @@ export default {
border-radius: 50%;
text-align: center;
line-height: 48rpx;
font-size: 16px;
font-size: 32rpx;
font-weight: bold;
}
@ -1196,7 +1241,7 @@ export default {
align-items: center;
justify-content: center;
background: #f8f8f8;
border: 2px dashed #ddd;
border: 4rpx dashed #ddd;
color: #bbb;
}
}
@ -1205,19 +1250,19 @@ export default {
.reason-row {
display: flex;
align-items: center;
padding: 16px 0;
border-bottom: 1px solid #f0f0f0;
padding: 32rpx 0;
border-bottom: 2rpx solid #f0f0f0;
&:last-child {
border-bottom: none;
}
.checkbox {
width: 20px;
height: 20px;
border-radius: 4px;
border: 2px solid #ddd;
margin-right: 12px;
width: 40rpx;
height: 40rpx;
border-radius: 8rpx;
border: 4rpx solid #ddd;
margin-right: 24rpx;
background: #fff;
position: relative;
@ -1232,14 +1277,14 @@ export default {
left: 50%;
transform: translate(-50%, -50%);
color: #fff;
font-size: 12px;
font-size: 24rpx;
font-weight: bold;
}
}
}
.reason-text {
font-size: 16px;
font-size: 32rpx;
color: #222;
line-height: 1.4;
}
@ -1248,20 +1293,20 @@ export default {
.popup-save-btn {
position: fixed;
bottom: 34px;
left: 20px;
right: 20px;
height: 48px;
border-radius: 24px;
bottom: 68rpx;
left: 40rpx;
right: 40rpx;
height: 96rpx;
border-radius: 48rpx;
background: linear-gradient(90deg, #ffd01e 0%, #ffac04 100%);
color: #fff;
font-size: 18px;
font-size: 36rpx;
font-weight: 600;
border: none;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(255, 172, 4, 0.3);
box-shadow: 0 8rpx 24rpx rgba(255, 172, 4, 0.3);
}
}
</style>

+ 31
- 34
pages/manager/inspect.vue View File

@ -377,6 +377,9 @@ export default {
brandImage: brandInfo.logo,
styleImage: styleInfo.image,
uniqueKey: uniqueKey,
//
styleMinPrice: styleInfo.minPrice || 0,
styleMaxPrice: styleInfo.maxPrice || styleInfo.minPrice || 0,
commonOrderList: [{
testingInstructions: '',
testingImages: '',
@ -387,8 +390,16 @@ export default {
}
})
} else {
//
processedList.push(inspectItem)
//
const productId = this.getProductIdFromShopId(inspectItem.shopId)
const productInfo = this.findProductInfoById(productId)
const enhancedInspectItem = {
...inspectItem,
//
productMinPrice: productInfo ? productInfo.price || 0 : 0,
productMaxPrice: productInfo ? productInfo.maxPrice || productInfo.price || 0 : 0
}
processedList.push(enhancedInspectItem)
}
})
@ -459,6 +470,19 @@ export default {
return shopId
},
// ID
findProductInfoById(productId) {
//
for (const categoryId in this.allProducts) {
const categoryProducts = this.allProducts[categoryId]
const product = categoryProducts.find(p => p.id == productId)
if (product) {
return product
}
}
return null
},
validateInspectData() {
if (!this.inspectResult.list || this.inspectResult.list.length === 0) {
return {
@ -577,30 +601,13 @@ export default {
}
}
// 0
if (item.isPin === 'Y' && (this.getItemTotalQuantity(item) === 0) && delta > 0) {
//
if (item.isPin === 'Y' && delta > 0) {
this.pendingBrandIndex = index
this.$refs.brandSelector.open(item.id)
return
}
//
if (item.isPin === 'Y' && this.getItemTotalQuantity(item) > 0 && delta > 0) {
//
if (item.brandStyleQuantities && Object.keys(item.brandStyleQuantities).length === 1) {
const uniqueKey = Object.keys(item.brandStyleQuantities)[0]
const currentQty = item.brandStyleQuantities[uniqueKey] || 0
this.$set(item.brandStyleQuantities, uniqueKey, currentQty + delta)
this.updateInspectResultFromBrandStyle(item)
return
} else {
//
this.pendingBrandIndex = index
this.$refs.brandSelector.open(item.id)
return
}
}
//
if (item.isPin !== 'Y') {
let newQuantity = (item.quantity || 0) + delta
@ -653,22 +660,12 @@ export default {
this.$set(item, 'brandStyleQuantities', {})
}
//
const brandPrefix = `${data.brandInfo.id}_`
Object.keys(item.brandStyleQuantities).forEach(key => {
if (key.startsWith(brandPrefix)) {
delete item.brandStyleQuantities[key]
if (item.styleCache && item.styleCache[key]) {
delete item.styleCache[key]
}
}
})
//
//
data.selectedStyles.forEach(style => {
if (style.quantity > 0) {
const uniqueKey = `${data.brandInfo.id}_${style.id}`
this.$set(item.brandStyleQuantities, uniqueKey, style.quantity)
const existingQty = item.brandStyleQuantities[uniqueKey] || 0
this.$set(item.brandStyleQuantities, uniqueKey, existingQty + style.quantity)
//
if (!item.styleCache) {


Loading…
Cancel
Save