| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480 |
- import DictionariesBehavior from "../../../../core/behavior/dictionaries.behavior";
- import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
- import { handleWeChatPayment } from "../../../../utils/util";
- import { getAddressListMethod, purchaseOfflineTreatmentMethod } from "../../request";
- import tickleBehavior, {
- getTickleContext,
- } from "../../../../core/behavior/tickle.behavior";
- // module/order/pages/confirme-order/confirme-order.ts
- Page({
- behaviors: [PageContainerBehavior, DictionariesBehavior, tickleBehavior],
- properties: {},
- data: {
- totalGoodsCount: 0,
- goodsList: [] as Array<{
- category: string;
- goods: Array<{
- id: string;
- name: string;
- description?: string;
- image: string;
- price: number;
- quantity: number;
- checked: boolean;
- }>;
- }>,
- selectAll: true,
- selectedCount: 0,
- totalPrice: 0,
- remark: '',
- remarkLength: 0,
- showDetail: false,
- isPaymentLoading: false, // 支付加载状态
- name: "",
- phone: "",
- address: "",
- isDefault: '',
- provinceName: '',
- cityName: '',
- areaName: '',
- },
- onLoad(options: any) {
- if (options.isDefault) {
- this.setData({
- isDefault: options.isDefault,
- });
- }
- this.load('');
- },
- onShow() {
- //先接收用户选择的地址,如果接收到用户选择的地址就用用户选择的,如果没有则使用默认地址
- const selectedAddress = wx.getStorageSync('selectedAddress');
- if (selectedAddress && this.data.isDefault === '1') {
- this.setData({
- showDetail: false,
- name: selectedAddress.liaison || "",
- phone: selectedAddress.phone || "",
- address: `${selectedAddress.provinceName || ""}${selectedAddress.cityName || ""}${selectedAddress.areaName || ""}${selectedAddress.detailAddress || ""}`,
- provinceName: selectedAddress.provinceName || "",
- cityName: selectedAddress.cityName || "",
- areaName: selectedAddress.areaName || "",
- });
- } else {
- this.getDefaultAddress();
- }
- },
- onHide() {
- wx.removeStorageSync('selectedAddress');
- },
- observers: {
- 'goodsList': function () {
- this.calculateSummary();
- }
- },
- // 获取用户的默认地址
- async getDefaultAddress() {
- wx.showLoading({ title: "加载中" });
- try {
- // 获取所有的地址列表
- const res = await getAddressListMethod("", "");
- if (res && res.length > 0) {
- res.forEach((item: any) => {
- item.fullAddress = `${item.provinceName} ${item.cityName} ${item.areaName} ${item.detailAddress}`;
- item.tag = item.tagList[0] || "";
- });
- // 过滤出默认地址
- const defaultAddress = res.find((item: any) => item.isDefault === "Y");
- if (defaultAddress) {
- // 有默认地址,直接渲染在页面上
- this.setData({
- showDetail: false,
- name: defaultAddress.liaison || "",
- phone: defaultAddress.phone || "",
- address: `${defaultAddress.provinceName || ""}${defaultAddress.cityName || ""}${defaultAddress.areaName || ""}${defaultAddress.detailAddress || ""}`,
- addressList: res, // 保存所有地址列表,用于修改地址时使用
- provinceName: defaultAddress.provinceName || "",
- cityName: defaultAddress.cityName || "",
- areaName: defaultAddress.areaName || "",
- });
- } else {
- // 没有默认地址,显示"请选择配送地址"
- this.setData({
- showDetail: true,
- name: "",
- phone: "",
- address: "",
- addressList: res, // 保存所有地址列表,用于修改地址时使用
- });
- }
- } else {
- // 没有地址数据
- this.setData({
- showDetail: true,
- name: "",
- phone: "",
- address: "",
- addressList: [],
- });
- }
- } catch (error: any) {
- getTickleContext.call(this).showWarnMessage(error.errMsg);
- // 出错时也显示"请选择配送地址"
- this.setData({
- showDetail: true,
- name: "",
- phone: "",
- address: "",
- addressList: [],
- });
- }
- wx.hideLoading();
- },
- // 切换收货地址
- changeAddress() {
- wx.navigateTo({
- url:
- "/module/article/pages/manage-address/manage-address?type=confirmeOrder",
- });
- },
- // 订单详情
- async load(_id: string) {
- wx.showLoading({ title: "加载中" });
- try {
- // 使用存储的selectedGoods数据渲染商品列表
- const selectedGoods = wx.getStorageSync('selectedGoods') || [];
- const totalPrice = wx.getStorageSync('totalPrice') || 0;
- if (selectedGoods && selectedGoods.length > 0) {
- // 使用存储的数据渲染商品列表
- const goodsList = selectedGoods;
- let totalGoodsCount = 0;
- goodsList.forEach((category: any) => {
- if (category.goods && Array.isArray(category.goods)) {
- totalGoodsCount += category.goods.length;
- }
- });
- this.setData({
- goodsList,
- totalGoodsCount,
- totalPrice: parseFloat(totalPrice.toString()),
- });
- this.calculateSummary();
- } else {
- // 如果没有存储数据,提示用户
- wx.showToast({
- title: "暂无商品数据",
- icon: "none",
- });
- }
- } catch (error: any) {
- wx.showToast({
- title: error.errMsg || "加载失败",
- icon: "none",
- });
- }
- wx.hideLoading();
- },
- // 立即支付
- async onPayment() {
- if (this.data.isPaymentLoading) {
- return;
- }
- this.setData({ isPaymentLoading: true });
- try {
- // 调用支付接口
- const items = this.data.goodsList.map((item: any) => {
- return item.goods.map((goods: any) => {
- return {
- id: goods.id,
- quantity: goods.quantity,
- };
- });
- }).flat();
- const healthAnalysisReportId = wx.getStorageSync('healthAnalysisReportId');
- const params = {
- healthAnalysisReportId: healthAnalysisReportId,
- items,
- remark: this.data.remark || '',
- liaison: this.data.name || '',
- phone: this.data.phone || '',
- detailAddress: this.data.address || '',
- provinceName: this.data.provinceName || '',
- cityName: this.data.cityName || '',
- areaName: this.data.areaName || '',
- };
- if (!healthAnalysisReportId) {
- wx.showToast({
- title: "健康评估报告ID不能为空",
- icon: "none",
- });
- this.setData({ isPaymentLoading: false });
- return;
- }
- const payResult: any = await purchaseOfflineTreatmentMethod(params);
- if (payResult) {
- const paymentParams = payResult;
- handleWeChatPayment(paymentParams, (_res: any) => {
- // 支付成功,跳转到成功页面
- wx.redirectTo({
- url: "/module/article/pages/success-page/success-page?title=订单支付成功",
- });
- }, (error: any) => {
- this.setData({ isPaymentLoading: false });
- if (error?.errMsg === 'requestPayment:fail cancel') {
- // 支付取消跳到支付订单页面
- wx.navigateBack({ delta: 1 });
- }
- // wx.showToast({
- // title: error?.errMsg || error?.message || "支付失败,请重试",
- // icon: "none",
- // });
- });
- } else {
- wx.showToast({
- title: "支付失败",
- icon: "none",
- });
- }
- } catch (error: any) {
- wx.showToast({
- title: error.errMsg,
- icon: "none",
- });
- } finally {
- this.setData({ isPaymentLoading: false });
- }
- },
- // 商品复选框变化
- onGoodsCheckChange(e: any) {
- const { categoryIndex, goodsIndex } = e.currentTarget.dataset;
- const checked = e.detail.checked;
- const goodsList = this.data.goodsList;
- const goods = goodsList[categoryIndex].goods[goodsIndex];
- goods.checked = checked;
- // 如果勾选且数量为0,设置为1
- if (checked && goods.quantity === 0) {
- goods.quantity = 1;
- }
- // 单价为0的商品,如果勾选,确保数量为1
- if (checked && goods.price === 0 && goods.quantity !== 1) {
- goods.quantity = 1;
- }
- this.setData({ goodsList });
- this.calculateSummary();
- },
- // 数量变化(加减按钮)
- onQuantityChange(e: any) {
- const { categoryIndex, goodsIndex, type } = e.currentTarget.dataset;
- const goodsList = this.data.goodsList;
- const goods = goodsList[categoryIndex].goods[goodsIndex];
- // 单价为0的商品数量最多只能是1
- if (goods.price === 0) {
- if (type === "plus") {
- // 如果数量已经是1或更多,不能再加
- if (goods.quantity >= 1) {
- return;
- }
- // 如果数量为0,增加到1
- goods.quantity = 1;
- goods.checked = true;
- this.setData({ goodsList });
- this.calculateSummary();
- } else if (type === "minus") {
- // 点击减号,数量为1时弹出确认对话框
- if (goods.quantity === 1) {
- wx.showModal({
- title: '提示',
- content: '您想要删除该商品吗?',
- success: (res) => {
- if (res.confirm) {
- // 用户确认删除
- this.removeGoods(categoryIndex, goodsIndex);
- }
- // 用户取消,不做任何操作,保持数量为1
- }
- });
- } else if (goods.quantity === 0) {
- // 已经是0,不能再减
- return;
- } else {
- // 其他情况(理论上不应该出现),确保数量不超过1
- goods.quantity = Math.min(1, goods.quantity - 1);
- this.setData({ goodsList });
- this.calculateSummary();
- }
- }
- } else {
- // 非0价格商品的正常逻辑
- if (type === "plus") {
- const newQuantity = goods.quantity + 1;
- goods.quantity = newQuantity;
- if (!goods.checked) {
- goods.checked = true;
- }
- this.setData({ goodsList });
- this.calculateSummary();
- } else if (type === "minus") {
- // 点击减号
- if (goods.quantity === 1) {
- // 数量为1时,点击减号会变为0,弹出确认对话框
- wx.showModal({
- title: '提示',
- content: '您想要删除该商品吗?',
- success: (res) => {
- if (res.confirm) {
- // 用户确认删除
- this.removeGoods(categoryIndex, goodsIndex);
- }
- // 用户取消,不做任何操作,保持数量为1
- }
- });
- } else {
- // 数量大于1,正常减少
- const newQuantity = goods.quantity - 1;
- goods.quantity = newQuantity;
- this.setData({ goodsList });
- this.calculateSummary();
- }
- }
- }
- },
- // 删除商品
- removeGoods(categoryIndex: number, goodsIndex: number) {
- const goodsList = JSON.parse(JSON.stringify(this.data.goodsList)); // 深拷贝
- const category = goodsList[categoryIndex];
- // 从该分类中删除商品
- category.goods.splice(goodsIndex, 1);
- // 如果该分类没有商品了,删除该分类
- if (category.goods.length === 0) {
- goodsList.splice(categoryIndex, 1);
- }
- this.setData({ goodsList });
- this.calculateSummary();
- },
- // 数量输入
- onQuantityInput(e: any) {
- const { categoryIndex, goodsIndex } = e.currentTarget.dataset;
- const value = parseInt(e.detail.value) || 0;
- const goodsList = this.data.goodsList;
- const goods = goodsList[categoryIndex].goods[goodsIndex];
- // 单价为0的商品数量最多只能是1
- if (goods.price === 0) {
- if (value > 1) {
- goods.quantity = 1;
- } else if (value < 0) {
- goods.quantity = 0;
- goods.checked = false;
- } else {
- goods.quantity = value;
- // 如果数量为0,取消勾选
- if (value === 0) {
- goods.checked = false;
- } else if (value > 0 && !goods.checked) {
- goods.checked = true;
- }
- }
- } else {
- goods.quantity = Math.max(0, value);
- }
- this.setData({ goodsList });
- },
- // 数量输入失焦
- onQuantityBlur(e: any) {
- const { categoryIndex, goodsIndex } = e.currentTarget.dataset;
- const goodsList = this.data.goodsList;
- const goods = goodsList[categoryIndex].goods[goodsIndex];
- // 单价为0的商品数量最多只能是1
- if (goods.price === 0) {
- if (goods.quantity > 1) {
- goods.quantity = 1;
- } else if (goods.quantity === 0) {
- // 数量为0,取消勾选
- goods.checked = false;
- } else if (goods.quantity > 0 && goods.quantity <= 1) {
- // 数量在0-1之间,如果已勾选但数量小于1,设置为1
- if (goods.checked && goods.quantity < 1) {
- goods.quantity = 1;
- } else if (!goods.checked && goods.quantity > 0) {
- // 如果数量大于0但未勾选,自动勾选
- goods.checked = true;
- }
- }
- } else {
- // 非0价格商品的逻辑
- if (goods.quantity === 0) {
- goods.checked = false;
- } else if (!goods.checked) {
- // 如果数量大于0且未勾选,自动勾选
- goods.checked = true;
- }
- }
- this.setData({ goodsList });
- this.calculateSummary();
- },
- // 计算汇总信息
- calculateSummary() {
- const goodsList = this.data.goodsList;
- let selectedCount = 0;
- let totalGoodsCount = 0; // 所有选中商品的总数量
- let totalPrice = 0;
- let allChecked = true;
- goodsList.forEach((category: any) => {
- category.goods.forEach((goods: any) => {
- if (goods.checked && goods.quantity > 0) {
- selectedCount++; // 已选件数 = 选中的商品种类数
- totalGoodsCount += goods.quantity; // 累加所有选中商品的数量
- totalPrice += goods.price * goods.quantity;
- }
- if (!goods.checked || goods.quantity === 0) {
- allChecked = false;
- }
- });
- });
- this.setData({
- selectedCount,
- totalPrice: parseFloat(totalPrice.toFixed(2)),
- selectAll: allChecked,
- totalGoodsCount: totalGoodsCount
- });
- },
- // 备注输入处理
- onRemarkInput(e: any) {
- const value = e.detail.value;
- const length = value.length;
- // 限制最大长度为200
- if (length > 200) {
- return;
- }
- this.setData({
- remark: value,
- remarkLength: length
- });
- },
- });
|