caiyunyi/pages/ownWater/waterSettlement.vue
ylj20011123 35e40eb558 update
2026-02-28 18:25:12 +08:00

607 lines
22 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="settlementContainer">
<!-- 头部导航 -->
<view class="navBar" :style="{ paddingTop: menu.top + 'px', height: menu.height + 8 + 'px' }">
<view class="navContent" :style="{ height: menu.height + 'px' }">
<view class="backBtn" @click="handleBack">
<image class="backIcon" src="/static/images/home/backArrowblack.svg" />
</view>
<view class="navTitle">确认订单</view>
<view class="placeholder"></view>
</view>
</view>
<scroll-view class="contentArea" scroll-y>
<!-- 地址部分 -->
<view class="addressCard card">
<view class="userInfo">
<text class="userName">{{ userData.MEMBERSHIP_NAME || '收货人' }}</text>
<text class="userPhone">{{ userData.MEMBERSHIP_MOBILEPHONE || '' }}</text>
</view>
<view class="addressDetail">
<text class="addrText">{{ currentAddress || '请选择收货地址' }}</text>
<view class="editBtn" @click="handleEditAddress">
<text>修改</text>
<uni-icons type="right" size="14" color="#1890FF"></uni-icons>
</view>
</view>
<image class="addressLine" src="/static/images/newShopDetail/address.png" mode="aspectFill" />
</view>
<!-- 选择站点 -->
<view class="shopListBox card">
<view class="cardHeader">配送站点</view>
<picker @change="handleShopChange" :value="selectedShopIndex" :range="userData.ShopList"
range-key="SERVERPART_NAME">
<view class="shopPickerContent">
<view class="shopInfo">
<uni-icons type="shop" size="20" color="#4BCB7E"></uni-icons>
<text class="shopName">{{ (selectedShopIndex !== -1 && userData.ShopList &&
userData.ShopList[selectedShopIndex]) ?
userData.ShopList[selectedShopIndex].SERVERPART_NAME : '请选择配送站点' }}</text>
</view>
<uni-icons type="right" size="16" color="#999"></uni-icons>
</view>
</picker>
</view>
<!-- 商品列表 -->
<view class="productCard card">
<view class="cardHeader">商品明细</view>
<view class="productList">
<view class="productItem" v-for="(item, index) in displayList" :key="index">
<view class="itemMain">
<image class="productImg"
:src="item.IMAGE_PATH || 'https://eshangtech.com/ShopICO/no-picture.png'"
mode="aspectFill" />
<view class="itemInfo">
<view class="itemTitle">{{ item.COMMODITY_NAME }}</view>
<view class="itemPriceRow">
<view class="price">
<text class="symbol">¥</text>
<text class="val">{{ item.COMMODITY_MEMBERPRICE }}</text>
<text class="unit">/{{ item.COMMODITY_UNIT }}</text>
</view>
<view class="count">x{{ item.count }}</view>
</view>
</view>
</view>
<view style="height: 10rpx;"></view>
<!-- 单品备注 -->
<view class="itemRemark">
<input class="remarkInput" v-model="item.SALEDETAIL_DESC" placeholder="在此输入单品要求..." />
</view>
</view>
</view>
<!-- 折叠按钮控制 -->
<view class="expandBox" v-if="shopList.length > 5">
<view class="expandBtn" @click="isExpand = !isExpand">
<text>{{ isExpand ? '收起更多' : '点击展开' }}</text>
<uni-icons :type="isExpand ? 'arrowup' : 'arrowdown'" size="14" color="#1890FF"></uni-icons>
</view>
<view class="totalKindTip">
共计 {{ totalUnits }} 件商品
</view>
</view>
</view>
<!-- 订单备注 -->
<view class="remarkCard card">
<view class="cardHeader">订单备注</view>
<textarea class="orderRemark" v-model="orderRemark" placeholder="请输入您的其他需求 (选填)" />
</view>
<view class="bottomPlaceholder"></view>
</scroll-view>
<!-- 底部结算栏 -->
<view class="footerBar">
<view class="priceTotal">
<text class="label">合计</text>
<text class="symbol">¥</text>
<text class="totalVal">{{ totalPrice }}</text>
</view>
<view class="submitBtn" @click="handleSubmit">立即下单</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
menu: {},
userData: {},
currentAddress: '',
shopList: [],
orderRemark: '',
isExpand: false,
selectedShopIndex: 0
};
},
computed: {
displayList() {
if (this.isExpand || this.shopList.length <= 5) {
return this.shopList;
}
return this.shopList.slice(0, 5);
},
totalUnits() {
return this.shopList.reduce((acc, cur) => acc + (cur.count || 0), 0);
},
totalPrice() {
let total = 0;
this.shopList.forEach(item => {
total += parseFloat(item.COMMODITY_MEMBERPRICE) * item.count;
});
return total.toFixed(2);
}
},
onLoad(options) {
this.menu = uni.getMenuButtonBoundingClientRect();
// 尝试从缓存中获取用户信息
try {
const user = uni.getStorageSync('userData');
if (user) {
this.userData = user;
}
} catch (e) { }
// 接收从购物车传来的数据
if (options.data) {
try {
const params = JSON.parse(decodeURIComponent(options.data));
if (params.shopList) this.shopList = params.shopList;
if (params.address) this.currentAddress = params.address;
} catch (e) {
console.error('解析订单数据失败', e);
}
}
console.log('this.shopListthis.shopList', this.shopList);
},
methods: {
handleBack() {
uni.navigateBack();
},
handleEditAddress() {
// 占位逻辑
uni.showToast({ title: '修改地址功能已预留', icon: 'none' });
},
handleShopChange(e) {
this.selectedShopIndex = e.detail.value;
},
handleSubmit() {
let _this = this
if (_this.selectedShopIndex === -1) {
uni.showToast({
title: '请选择配送站点',
icon: 'none'
})
return
}
uni.showModal({
title: '确认下单',
content: `总金额:¥${_this.totalPrice}\n确定要提交订单吗`,
success: async (res) => {
if (res.confirm) {
console.log('dadas', _this.shopList);
// SUPPLIER_ID 这个的赋值 规则 若商品列表里面的 SUPPLIER_ID 是单个的话 那么就赋值单个进入 如果是多个的话 就变成0了
let SUPPLIER_IDList = []
// 商品信息
let t_saleorderdetail = []
_this.shopList.forEach(item => {
t_saleorderdetail.push({
COMMODITY_ID: item.COMMODITY_ID, // 商品内码
ORDER_COUNT: item.count, // 下单数量
COMMODITY_NAME: item.COMMODITY_NAME, // 商品名称
COMMODITY_CODE: item.COMMODITY_CODE, // 商品编号
COMMODITY_BARCODE: item.COMMODITY_BARCODE, // 商品条码
COMMODITY_UNIT: item.COMMODITY_UNIT, // 商品单位
COMMODITY_RULE: item.COMMODITY_RULE, // 商品规格
AVERAGE_PRICE: item.COMMODITY_MEMBERPRICE, // 商品单价
ORDER_AMOUNT: item.COMMODITY_MEMBERPRICE * item.count, // 下单金额
DISCOUNT_AMOUNT: "", // 优惠金额
SALEDETAIL_DESC: item.SALEDETAIL_DESC, // 商品备注
SUPPLIER_ID: item.SUPPLIER_ID // 供应商内码
})
if (SUPPLIER_IDList && SUPPLIER_IDList.length > 0) {
if (SUPPLIER_IDList.indexOf(item.SUPPLIER_ID) === -1) {
SUPPLIER_IDList.push(item.SUPPLIER_ID)
}
} else {
SUPPLIER_IDList.push(item.SUPPLIER_ID)
}
})
// 订单信息相关
let purchaseModel = {
PURCHASE_PERSON: _this.userData.MEMBERSHIP_NAME, // 采购人
PURCHASE_PERSONTEL: _this.userData.MEMBERSHIP_MOBILEPHONE,//联系电话
STAFF_ID: _this.userData.MEMBERSHIP_ID,// 采购人ID
PURCHASE_DATE: _this.$utils.cutDate(new Date(), 'YYYY-MM-DD hh:mm:ss'), // 采购时间
PURCHASE_AMOUNT: _this.totalPrice,//采购金额
SUPPLIER_ID: SUPPLIER_IDList && SUPPLIER_IDList.length > 1 ? 0 : SUPPLIER_IDList[0],//供应商内码
SUPPLIER_NAME: "",//供应商名称
SELLER_ID: 11,//商户内码
PURCHASE_DESC: _this.orderRemark,//采购说明
WAREHOUSE_ID: "289",// 配送单位内码
WAREHOUSE_NAME: "自有品牌水",// 配送单位名称
DELIVERY_ADDRESS: _this.currentAddress, // 收货地址
SUPPLIER_ID: _this.userData.ShopList && _this.userData.ShopList[_this.selectedShopIndex] ? _this.userData.ShopList[_this.selectedShopIndex].SERVERPARTSHOP_ID : ""// 用户选择的站点
}
let req = {
WareHouse_Type: 1,
purchaseModel: purchaseModel,
t_saleorderdetail: t_saleorderdetail
}
console.log('req', req);
const data = await _this.$api.$samemberPost(
"/EShangApiMain/WeChatMall/ScanOrder",
req
);
if (data.Result_Code === 100) {
uni.showToast({ title: '订单提交成功', icon: 'success' });
// 这是订单创建之后 对缓存进行处理的内容
// 1. 获取全量购物车数据
let cart = uni.getStorageSync("waterShopCar") || [];
// 2. 这里的 shopList 是当前结算页展示的勾选商品,我们需要从购物车中剔除
const orderedIds = _this.shopList.map(item => item.COMMODITY_ID);
const newCart = cart.filter(item => !orderedIds.includes(item.COMMODITY_ID));
// 3. 更新缓存,触发首页和购物车页 onShow 时的自动同步
uni.setStorageSync("waterShopCar", newCart);
// 4. 下单成功后跳转至订单列表页
setTimeout(() => {
uni.redirectTo({
url: '/pages/ownWater/waterOrderList'
});
}, 1500);
} else {
uni.showToast({ title: data.Result_Desc, icon: 'none' });
}
}
}
});
}
}
};
</script>
<style lang="less" scoped>
.settlementContainer {
width: 100%;
min-height: 100vh;
background-color: #f2f4f5;
display: flex;
flex-direction: column;
.navBar {
background: #fff;
width: 100%;
position: sticky;
top: 0;
z-index: 100;
border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
.navContent {
display: flex;
align-items: center;
padding: 0 30rpx;
.backBtn {
width: 60rpx;
display: flex;
align-items: center;
.backIcon {
width: 40rpx;
height: 40rpx;
}
}
.navTitle {
flex: 1;
text-align: center;
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.placeholder {
width: 60rpx;
}
}
}
.shopListBox {
.shopPickerContent {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10rpx 0;
.shopInfo {
display: flex;
align-items: center;
.shopName {
font-size: 28rpx;
color: #333;
margin-left: 12rpx;
font-weight: 500;
}
}
}
}
.contentArea {
flex: 1;
padding: 20rpx;
box-sizing: border-box;
.card {
background: #fff;
border-radius: 16rpx;
padding: 24rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
.cardHeader {
font-size: 30rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
padding-bottom: 10rpx;
border-bottom: 1rpx solid #f5f5f5;
}
}
.addressCard {
position: relative;
padding-bottom: 30rpx;
.userInfo {
margin-bottom: 10rpx;
.userName {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-right: 20rpx;
}
.userPhone {
font-size: 28rpx;
color: #666;
}
}
.addressDetail {
display: flex;
justify-content: space-between;
align-items: flex-start;
.addrText {
flex: 1;
font-size: 26rpx;
color: #333;
line-height: 38rpx;
}
.editBtn {
display: flex;
align-items: center;
margin-left: 20rpx;
color: #1890ff;
font-size: 26rpx;
font-weight: 500;
}
}
.addressLine {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 6rpx;
}
}
.productCard {
.productList {
.productItem {
margin-bottom: 30rpx;
&:last-child {
margin-bottom: 0;
}
.itemMain {
display: flex;
.productImg {
width: 140rpx;
height: 140rpx;
border-radius: 12rpx;
background-color: #f9f9f9;
}
.itemInfo {
flex: 1;
margin-left: 20rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
.itemTitle {
font-size: 28rpx;
color: #333;
line-height: 40rpx;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.itemPriceRow {
display: flex;
justify-content: space-between;
align-items: flex-end;
.price {
color: #ff4d4f;
.symbol {
font-size: 24rpx;
}
.val {
font-size: 34rpx;
font-weight: bold;
}
.unit {
font-size: 24rpx;
color: #999;
margin-left: 4rpx;
}
}
.count {
font-size: 26rpx;
color: #999;
}
}
}
}
.itemRemark {
margin-top: 30rpx;
background: #f7f8f9;
padding: 12rpx 20rpx;
border-radius: 8rpx;
.remarkInput {
font-size: 24rpx;
color: #666;
}
}
}
}
.expandBox {
border-top: 1rpx solid #f5f5f5;
padding: 24rpx 0 0rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
background: #fff;
.expandBtn {
display: flex !important;
align-items: center !important;
justify-content: center !important;
font-size: 26rpx;
color: #1890ff;
margin-bottom: 8rpx;
padding: 10rpx 30rpx;
text {
margin-right: 4rpx;
}
}
.totalKindTip {
font-size: 24rpx;
color: #999;
text-align: center;
}
}
}
}
.remarkCard {
.orderRemark {
width: 100%;
min-height: 200rpx;
background: #f7f8f9;
padding: 20rpx;
box-sizing: border-box;
border-radius: 12rpx;
font-size: 26rpx;
color: #333;
}
}
.bottomPlaceholder {
height: 200rpx;
}
}
.footerBar {
z-index: 999;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 160rpx;
background: #fff;
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx 40rpx 0;
padding-bottom: env(safe-area-inset-bottom);
box-sizing: border-box;
box-shadow: 0 -2rpx 20rpx rgba(0, 0, 0, 0.05);
.priceTotal {
.label {
font-size: 28rpx;
color: #666;
}
.symbol {
font-size: 28rpx;
color: #ff4d4f;
font-weight: bold;
}
.totalVal {
font-size: 44rpx;
color: #ff4d4f;
font-weight: bold;
}
}
.submitBtn {
height: 72rpx;
line-height: 72rpx;
padding: 0 40rpx;
background: #4BCB7E;
color: #fff;
border-radius: 36rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
font-weight: bold;
box-shadow: 0 4rpx 10rpx rgba(75, 203, 126, 0.2);
}
}
</style>