| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- import DictionariesBehavior from "../../../../core/behavior/dictionaries.behavior";
- import PageContainerBehavior from "../../../../core/behavior/page-container.behavior";
- import { handleWeChatPayment } from "../../../../utils/util";
- import {
- getTickleContext,
- } from "../../../../core/behavior/tickle.behavior";
- import { getOrderDetailMethod, orderPayMethod, applyAfterSaleMethod } from "../../request";
- // module/order/pages/select-goods/other-detail.ts
- Page({
- behaviors: [PageContainerBehavior, DictionariesBehavior],
- data: {
- title: "",
- id: "",
- totalGoodsCount: 0,
- goodsList: [] as Array<{
- category: string;
- goods: Array<{
- id: string;
- name: string;
- description?: string;
- image: string;
- price: number;
- quantity: number;
- status?: string;
- statusClass?: string;
- }>;
- }>,
- // 三个分类的商品列表
- sellTypeFirstItems: [] as Array<any>, // 实体商品(快递类型在上,线下取货类型在下)
- sellTypeSecondItems: [] as Array<any>, // 线下服务
- sellTypeThirdItems: [] as Array<any>, // 线上权益
- selectAll: true,
- selectedCount: 0,
- totalPrice: 0,
- orderDetail: {},
- remarkLength: 0,
- showDetail: false,
- isPaymentLoading: false,
- orderStatus: "", // 订单状态:pending, paid, closed, completed
- // 售后半屏弹窗(组件 after-sale-type-popup)
- afterSalePopupVisible: false,
- refundReasonPopupVisible: false,
- refundConfirmPopupVisible: false,
- refundProofPopupVisible: false,
- refundSubmitSuccessPopupVisible: false,
- selectedAfterSaleType: "",
- selectedRefundReason: "",
- refundStatus: "",
- refundMaxAmount: 0,
- refundAmount: 0,
- refundDesc: "",
- refundProofImages: [] as string[],
- afterSaleSiteOption: {
- name: "",
- price: 0,
- meta1: "",
- meta2: "",
- image: "",
- patientConditioningProgramId: "",
- patientConditioningRecordId: "",
- sellType: "",
- },
- },
- onLoad(options: any) {
- const remark = (this.data.orderDetail as any)?.remark || '';
- this.setData({
- remarkLength: remark.length
- });
- if (options.id) {
- this.setData({ id: options.id });
- }
- if (options.status) {
- this.statusType(options.status);
- }
- },
- onShow() {
- if (this.data.id) {
- this.load(this.data.id);
- }
- },
- observers: {},
- statusType(status: any) {
- const code = status == null ? "" : String(status);
- switch (code) {
- case "0":
- this.setData({ orderStatus: "pending", title: "待付款" });
- break;
- case "6":
- this.setData({ orderStatus: "received", title: "已付款" });
- break;
- case "2":
- this.setData({ orderStatus: "closed", title: "交易关闭" });
- break;
- case "345":
- this.setData({ orderStatus: "completed", title: "交易成功" });
- break;
- default:
- this.setData({ orderStatus: "", title: "" });
- break;
- }
- },
- // 查看物流详情
- goLogistics(e: any) {
- const { id } = e.currentTarget.dataset.goods;
- const { liaison, phone, provinceName, cityName, areaName, detailAddress } = this.data.orderDetail;
- let address = `${provinceName}${cityName ? `${cityName}` : ""
- }${areaName ? `${areaName}` : ""}${detailAddress ? `${detailAddress}` : ""
- }`;
- const goods = JSON.stringify({ ...e.currentTarget.dataset.goods, liaison, phone, address });
- if (id) {
- wx.navigateTo({
- url: `/module/order/pages/logistics-detail/logistics-detail?id=${id}&goods=${goods}`,
- });
- } else {
- wx.showToast({
- title: "无参数id",
- icon: "none",
- })
- }
- },
- // 订单详情
- async load(id: string) {
- wx.showLoading({ title: "加载中" });
- try {
- const res = await getOrderDetailMethod(id);
- if (res && res.data) {
- this.setData({ orderDetail: res.data });
- if (
- !res.data.liaison ||
- !res.data.phone ||
- !res.data.provinceName ||
- !res.data.cityName ||
- !res.data.areaName ||
- !res.data.detailAddress
- ) {
- this.setData({
- showDetail: true,
- });
- } else {
- this.setData({
- showDetail: false,
- });
- this.setData({
- name: res.data.liaison ? `${res.data.liaison}` : "",
- phone: res.data.phone ? `${res.data.phone}` : "",
- address: `${res.data.provinceName}${res.data.cityName ? `${res.data.cityName}` : ""
- }${res.data.areaName ? `${res.data.areaName}` : ""}${res.data.detailAddress ? `${res.data.detailAddress}` : ""
- }`,
- });
- }
- // 0:待付款
- // 2 交易关闭
- // 6 待收货
- // 345 交易成功
- this.statusType(res.data.orderStatus);
- // 处理三个分类的商品数据
- const processItems = (items: any[]) => {
- if (!items || !Array.isArray(items)) {
- return [];
- }
- return items.map((item: any, index: number) => {
- // 0是一口价 1按穴位/经络次数计费
- const pricingType = item?.conditioningProgramDetail?.pricingType;
- return {
- id: item.id || '', //患者调理方案id
- patientConditioningRecordId: item?.patientConditioningRecordId || '',//调理记录id
- name: item.conditioningProgramName || '',
- description: (() => {
- const convertDose = item?.conditioningProgramDetail?.cpFixedPricingRule?.convertDose
- const dose = convertDose ?? '';
- const unit = item?.conditioningProgramDetail?.cpFixedPricingRule?.convertUnit ?? '次';
- return pricingType === '0' ? `${dose} ${unit}` : `1次`;
- })(),
- sellType: item?.sellType || '', //商品类型 1-实体商品 2-线下服务 3-线上权益
- //start实体商品所用到的字段
- receiptStatus: item?.receiptStatus || '', //收货状态 0-待发货 1-已发货 2-已收货 这个字段用于实体商品的收获状态
- receiptTime: item?.receiptTime || '', //收货时间
- receiptType: item?.receiptType || '', //收货类型 0-快递 1-线下取货
- expressType: item?.expressType || '', //快递类型 0-邮政速递 1-顺丰速运 2-京东快递 3-中通快递 4-圆通速递 5-申通快递 6-韵达快递 7-极兔速递
- expressNo: item?.expressNo || '', //快递单号
- expressTypeName: item?.expressType, //快递公司名称
- // expressTypeIcon: this.getExpressTypeIcon(item?.expressType), //快递公司图标
- //end实体商品所用到的字段
- progress: item?.progress || '', //进度 0-进行中 1-已完成 2-未开始 3-已取消 这个字段用于线下服务商品以及线上权益商品的进度状态
- image: item.conditioningProgramPhoto || '',
- price: item?.unitPrice || 0,
- totalPrice: item?.totalPrice || 0,
- quantity: item?.totalMeasure || 0,
- statusClass: this.getStatusClass(item?.sellType, item?.progress, item?.receiptStatus, item.expressStatus),
- statusText: this.getGoodsStatusText(item?.sellType, item?.progress, item?.receiptStatus, item.expressStatus),
- isCanEvaluate: item?.isCanEvaluate, //是否可以评价 false-否 true-是
- evaluateTime: item?.evaluateTime, //有评价时间就是已评价,是空就是未评价
- isShowAftersaleButton: item?.isShowAftersaleButton || false,
- aftersaleProgressStr: item?.aftersaleProgressStr || '',
- aftersaleProgress: item?.aftersaleProgress,
- }
- });
- };
- // 分别处理三个数组
- let sellTypeFirstItems = processItems(res.data?.sellTypeFirstItems || []);
- const sellTypeSecondItems = processItems(res.data?.sellTypeSecondItems || []);
- const sellTypeThirdItems = processItems(res.data?.sellTypeThirdItems || []);
- // 对实体商品进行排序:快递类型(receiptType === '0')在上,线下取货类型(receiptType === '1')在下
- sellTypeFirstItems = sellTypeFirstItems.sort((a: any, b: any) => {
- const aType = a.receiptType || '';
- const bType = b.receiptType || '';
- if (aType === '0' && bType === '1') {
- return -1;
- }
- if (aType === '1' && bType === '0') {
- return 1;
- }
- return 0;
- });
- this.setData({
- sellTypeFirstItems,
- sellTypeSecondItems,
- sellTypeThirdItems,
- });
- }
- } catch (error: any) {
- wx.showToast({
- title: error.errMsg || "获取订单详情失败",
- icon: "none",
- });
- }
- wx.hideLoading();
- },
- // 去预约
- goAppointment(e: any) {
- const { id } = e.currentTarget.dataset;
- // 去非药物治疗页面
- wx.navigateTo({
- url: `/module/care/pages/offlineTreatment/offlineTreatment?id=${id}`,
- });
- },
- // 立即支付
- async onPayment() {
- if (this.data.isPaymentLoading) {
- return;
- }
- this.setData({ isPaymentLoading: true });
- try {
- // 调用支付接口
- const payResult = await orderPayMethod(this.data.id, (this.data.orderDetail as any)?.remark);
- if (payResult && payResult.data) {
- const paymentParams = payResult.data;
- 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 });
- }
- });
- } else {
- wx.showToast({
- title: payResult.errMsg,
- icon: "none",
- });
- }
- } catch (error: any) {
- wx.showToast({
- title: error.errMsg,
- icon: "none",
- });
- } finally {
- this.setData({ isPaymentLoading: false });
- }
- },
- // 备注输入处理
- onRemarkInput(e: any) {
- const value = e.detail.value;
- const length = value.length;
- // 限制最大长度为200
- if (length > 200) {
- return;
- }
- this.setData({
- 'orderDetail.remark': value,
- remarkLength: length
- });
- },
- preventTap() {
- // 仅用于 catchtap 阻止冒泡,避免触发父级 goAppointment
- },
- onApplyAfterSale(e: any) {
- const { goods } = e.currentTarget.dataset;
- this.setData({
- afterSaleSiteOption: {
- image: goods.image || '',
- name: goods.name,
- price: goods.price,
- totalPrice: goods.totalPrice,
- meta1: goods.description || '',
- meta2: `x${goods.quantity}`,
- patientConditioningProgramId: goods.id || '',
- patientConditioningRecordId: goods.patientConditioningRecordId || '',
- sellType: goods.sellType || '',
- },
- refundMaxAmount: goods.totalPrice || 0,
- refundAmount: goods.totalPrice || 0,
- selectedAfterSaleType: "",
- selectedRefundReason: "",
- refundDesc: "",
- refundProofImages: [],
- afterSalePopupVisible: true,
- });
- },
- // 点击退款状态,跳转到售后详情页
- onAftersaleProgress(e: any) {
- const { goods } = e.currentTarget.dataset;
- wx.navigateTo({
- url: `/module/order/pages/refund-processing/refund-processing?id=${goods.id}&recordId=${goods.patientConditioningRecordId || ''}`,
- });
- },
- onAfterSalePopupClose() {
- this.setData({ afterSalePopupVisible: false });
- },
- onAfterSaleNext(e: WechatMiniprogram.CustomEvent<{ selectedKey: string }>) {
- const key = e.detail?.selectedKey;
- if (!key) {
- wx.showToast({ title: "请选择售后类型", icon: "none" });
- return;
- }
- this.setData({
- selectedAfterSaleType: key,
- afterSalePopupVisible: false,
- refundReasonPopupVisible: true,
- });
- },
- onRefundReasonPopupClose() {
- this.setData({ refundReasonPopupVisible: false });
- },
- onRefundReasonNext(e: WechatMiniprogram.CustomEvent<{ reason: string }>) {
- const reason = e.detail?.reason;
- if (!reason) {
- wx.showToast({ title: "请选择退款原因", icon: "none" });
- return;
- }
- this.setData({
- selectedRefundReason: reason,
- refundReasonPopupVisible: false,
- refundConfirmPopupVisible: true,
- refundAmount: this.data.refundMaxAmount,
- });
- },
- onRefundConfirmClose() {
- this.setData({ refundConfirmPopupVisible: false });
- },
- onChangeRefundStatus(e: WechatMiniprogram.CustomEvent<{ status: string }>) {
- this.setData({ refundStatus: e.detail?.status || "" });
- },
- onOpenRefundReasonAgain() {
- this.setData({ refundReasonPopupVisible: true });
- },
- onRefundAmountConfirm(e: WechatMiniprogram.CustomEvent<{ amount: number }>) {
- const amount = Number(e.detail?.amount || 0);
- this.setData({ refundAmount: amount });
- },
- onOpenRefundProofEditor() {
- this.setData({ refundProofPopupVisible: true });
- },
- onRefundProofPopupClose() {
- this.setData({ refundProofPopupVisible: false });
- },
- onRefundProofConfirm(e: WechatMiniprogram.CustomEvent<{ desc: string; images: string[] }>) {
- this.setData({
- refundDesc: e.detail?.desc || "",
- refundProofImages: e.detail?.images || [],
- refundProofPopupVisible: false,
- });
- },
- async onSubmitRefundApply() {
- if (!this.data.selectedRefundReason) {
- wx.showToast({ title: "请选择退款原因", icon: "none" });
- return;
- }
- if (!this.data.refundProofImages.length && !this.data.refundDesc.trim()) {
- wx.showToast({ title: "请上传凭证或填写描述", icon: "none" });
- return;
- }
- wx.showLoading({ title: "提交中" });
- const { afterSaleSiteOption, selectedAfterSaleType, refundStatus, selectedRefundReason, refundAmount, refundProofImages, refundDesc } = this.data;
- const params = {
- patientConditioningRecordId: (afterSaleSiteOption as any).patientConditioningRecordId,
- patientConditioningProgramId: (afterSaleSiteOption as any).patientConditioningProgramId,
- type: selectedAfterSaleType,
- ...((afterSaleSiteOption as any).sellType === '1' ? { receiptStatus: refundStatus } : {}),
- reason: selectedRefundReason,
- applyAmount: refundAmount,
- voucherImgs: refundProofImages,
- remark: refundDesc,
- };
- console.log(params, "参数111")
- try {
- await applyAfterSaleMethod(params);
- this.setData({ refundConfirmPopupVisible: false });
- wx.navigateTo({
- url: "/module/order/pages/refund-success/refund-success",
- });
- } catch (error: any) {
- wx.showToast({ title: error.errMsg || "提交失败", icon: "none" });
- }
- wx.hideLoading();
- },
- onReview(e: WechatMiniprogram.TouchEvent) {
- console.log(e.currentTarget.dataset);
- const { evaluateTime } = e.currentTarget.dataset.goods;
- if (evaluateTime) {
- // 单商品评价详情
- wx.navigateTo({
- url: `/module/order/pages/goods-evaluateDetail/goods-evaluateDetail?goodsInfo=${encodeURIComponent(JSON.stringify(e.currentTarget.dataset.goods))}`,
- });
- } else {
- // 去单商品评价页面
- wx.navigateTo({
- url: `/module/order/pages/goods-evaluate/goods-evaluate?goodsInfo=${encodeURIComponent(JSON.stringify(e.currentTarget.dataset.goods))}`,
- });
- }
- },
- // 复制订单号
- copyOrderNo(e: any) {
- const orderNo = e.currentTarget.dataset.orderno;
- if (!orderNo) {
- getTickleContext.call(this).showWarnMessage("订单号为空");
- return;
- }
- wx.setClipboardData({
- data: orderNo,
- success: () => {
- wx.showToast({
- title: '已复制',
- icon: 'none'
- });
- }
- });
- },
- // 获取状态类名
- // sellType: 商品类型 1-实体商品 2-线下服务 3-线上权益
- // progress: 进度状态(用于线下服务和线上权益):0-进行中 1-已完成 2-未开始
- // receiptStatus: 收货状态(用于实体商品):0-待发货 1-已发货 2-已收货
- getStatusClass(sellType?: string | number, progress?: string | number, receiptStatus?: string | number, expressStatus?: string): string {
- const type = String(sellType || '');
- // 实体商品 (sellType === 1) 使用 receiptStatus(三种状态)实体商品增加运输中
- if (type === "1") {
- const status = String(receiptStatus || '');
- if (status === "0") {
- return "status-pending"; // 待发货
- } else if (status === "1") {
- return "status-received"; // 已发货
- } else if (status === "2") {
- return "status-completed"; // 已收货
- } else {
- return "status-received"
- }
- }
- // 线下服务 (sellType === 2) 和线上权益 (sellType === 3) 使用 progress(三种状态)
- else if (type === "2" || type === "3") {
- const status = String(progress || '');
- if (status === "0") {
- return "status-pending"; // 进行中
- } else if (status === "1") {
- return "status-completed"; // 已完成
- } else if (status === "2") {
- return "status-closed"; // 未开始
- }
- }
- return "";
- },
- // 获取商品状态文本
- getGoodsStatusText(sellType?: string | number, progress?: string | number, receiptStatus?: string | number, expressStatus?: string): string {
- const type = String(sellType || '');
- // 实体商品 (sellType === 1) 使用 receiptStatus(三种状态)新增expressStatus运输状态
- if (type === "1") {
- const status = String(receiptStatus || '');
- if (expressStatus) {
- return expressStatus
- } else {
- if (status === "0") {
- return "待发货";
- } else if (status === "1") {
- return "已发货";
- } else if (status === "2") {
- return "已收货";
- }
- }
- }
- // 线下服务 (sellType === 2) 和线上权益 (sellType === 3) 使用 progress(三种状态)
- else if (type === "2" || type === "3") {
- const status = String(progress || '');
- if (status === "0") {
- return "进行中";
- } else if (status === "1") {
- return "已完成";
- } else if (status === "2") {
- return "未开始";
- }
- }
- return "";
- },
- // 获取订单状态文本
- getStatusText(status: string | number): string {
- const statusTextMap: Record<string, string> = {
- "0": "待付款",
- "6": "已付款",
- "2": "交易关闭",
- "345": "交易成功",
- };
- return statusTextMap[String(status)] || "";
- },
- // 确认收货
- onConfirmReceipt(e: any) {
- const { patientconditioningrecordid } = e.currentTarget.dataset;
- if (patientconditioningrecordid) {
- const shippedGoods = this.data.sellTypeFirstItems.filter((item: any) => item.receiptStatus === '1');
- if (shippedGoods.length === 0) {
- wx.showToast({
- title: '没有可确认收货的商品',
- icon: 'none'
- });
- return;
- }
- // 去确认收货页面
- wx.navigateTo({
- url: `/module/article/pages/confirm-receiving/confirm-receiving?patientConditioningRecordId=${patientconditioningrecordid as string}&goodsList=${encodeURIComponent(JSON.stringify(shippedGoods))}`,
- fail: (err) => {
- wx.showToast({
- title: err.errMsg || '跳转失败',
- icon: 'none'
- });
- }
- });
- } else {
- wx.showToast({
- title: '调理记录id为空',
- icon: 'none'
- });
- }
- },
- });
|