shish 2 月之前
父節點
當前提交
6530dab7bd

+ 9 - 0
ghsApp/src/admin/home/components/OrderItem.vue

@@ -100,6 +100,7 @@
             <button
               open-type="share"
               :data-order-id="item.id"
+              :data-share-type="shareBtnType"
               @click.stop="shareOrder(item)"
               class="admin-button-com bule"
             >分享</button>
@@ -261,6 +262,9 @@ import { cancelDeliveryOrder } from '@/api/express/delivery';
 import { createCallExpressOrder, cancelCallExpressOrder,getOrderFee } from '@/api/shop/shop-express';
 export default {
   name: 'OrderItem',
+  options: {
+    virtualHost: true
+  },
   components: {},
   props: {
     item: {
@@ -269,6 +273,11 @@ export default {
     moreOrderRemind:{
       type: Boolean,
       default: true
+    },
+    /** 小程序分享按钮标记:merge 合并页单条分享传 single */
+    shareBtnType: {
+      type: String,
+      default: ''
     }
   },
   data() {

+ 39 - 36
ghsApp/src/admin/home/order.vue

@@ -110,13 +110,13 @@ import AppSearchModule from '@/components/module/app-search';
 import DropShopSelect from '@/components/module/shopSelect';
 import OrderItem from './components/OrderItem';
 import DateSelect from '@/components/module/dateSelect';
-import { IMGHOST } from '@/config';
 import {
-  buildOrderShareTitle,
+  buildMpShareMessage,
+  buildSingleSharePayload,
   canShareSingleOrder,
-  getShareOrderIdFromEvent,
   getSingleOrderSharePath,
-  shareOrderToWxMiniProgram
+  resolveMpShareMessage,
+  shareSingleOrderOnApp
 } from '@/utils/orderShare';
 import { getList } from '@/api/member';
 export default {
@@ -195,7 +195,9 @@ export default {
       currentTitle: '',
       searchList: [],
       showSearch: false,
-      customId: 0
+      customId: 0,
+      pendingSharePayload: null,
+      singleShareOrderId: 0
     };
   },
   onPullDownRefresh() {
@@ -236,30 +238,34 @@ export default {
   },
   onShareAppMessage(res) {
     this.fromDetail.status = 1;
-    const sharePayload = this.resolveSharePayload(res);
-    return {
-      title: sharePayload.title,
-      desc: '',
-      imageUrl: IMGHOST + '/custom/order_share.jpg',
-      path: sharePayload.path
-    };
+    const mpMessage = resolveMpShareMessage({
+      pendingSharePayload: this.pendingSharePayload,
+      res: res,
+      fallbackOrderId: this.singleShareOrderId,
+      getSingleShareByOrderId: (orderId) => {
+        const item = this.findListOrderById(orderId);
+        if (!item) {
+          return null;
+        }
+        const payload = buildSingleSharePayload(item);
+        return payload ? { title: payload.title, path: payload.path } : null;
+      }
+    });
+    if (mpMessage) {
+      return mpMessage;
+    }
+    const info = this.currentInfo || {};
+    return buildMpShareMessage({
+      title: this.currentTitle || '订单',
+      path: getSingleOrderSharePath(info) || 'pagesOrder/showOrder'
+    });
   },
   methods: {
-    resolveShareOrderInfo(res) {
-      const orderId = getShareOrderIdFromEvent(res);
-      if (orderId && this.list.data && this.list.data.length > 0) {
-        const item = this.list.data.find((it) => it.id === orderId);
-        if (item) {
-          return item;
-        }
+    findListOrderById(orderId) {
+      if (!orderId || !this.list.data || !this.list.data.length) {
+        return null;
       }
-      return this.currentInfo || {};
-    },
-    resolveSharePayload(res) {
-      const info = this.resolveShareOrderInfo(res);
-      const path = getSingleOrderSharePath(info) || 'pagesOrder/showOrder';
-      const title = canShareSingleOrder(info) ? buildOrderShareTitle(info) : (this.currentTitle || '订单');
-      return { title, path };
+      return this.list.data.find((it) => it.id === orderId) || null;
     },
     directFh(info) {
       let that = this;
@@ -273,22 +279,19 @@ export default {
       });
     },
     shareOrder(info) {
-      if (!canShareSingleOrder(info)) {
+      const payload = buildSingleSharePayload(info);
+      if (!payload) {
+        this.pendingSharePayload = null;
         this.$msg('暂无可分享订单');
         return false;
       }
-      const path = getSingleOrderSharePath(info);
-      const title = buildOrderShareTitle(info);
+      this.pendingSharePayload = payload;
+      this.singleShareOrderId = info.id || 0;
       this.currentInfo = info;
       this.fromDetail.status = 1;
-      this.currentTitle = title;
+      this.currentTitle = payload.title;
       // #ifdef APP-PLUS
-      shareOrderToWxMiniProgram({
-        dictInfo: this.dictInfo,
-        appKey: 'ghs',
-        path: path,
-        title: title
-      });
+      shareSingleOrderOnApp({ dictInfo: this.dictInfo, info: info });
       // #endif
     },
     //这个有多处要同步修改,关键词:fh_express_pop

+ 48 - 54
ghsApp/src/admin/order/mergeOrder.vue

@@ -4,10 +4,10 @@
       <block v-if="!$util.isEmpty(list.data)">
         <div class="list" v-for="(item, index) in list.data" :key="index">
           <div v-if="!$util.isEmpty(item.orderInfo)">
-            <OrderItem :item="item.orderInfo" @printOrder="printOrder" @shareOrder="shareSingleOrder"></OrderItem>
+            <OrderItem share-btn-type="single" :item="item.orderInfo" @printOrder="printOrder" @shareOrder="shareSingleOrder"></OrderItem>
           </div>
           <div v-else>
-            <OrderItem :ref="`orderRef${item.id}`" :item="item" @printOrder="printOrder" @directFh="directFh" @fillNoFh="fillNoFh" @shareOrder="shareSingleOrder" :moreOrderRemind="false"></OrderItem>
+            <OrderItem share-btn-type="single" :ref="`orderRef${item.id}`" :item="item" @printOrder="printOrder" @directFh="directFh" @fillNoFh="fillNoFh" @shareOrder="shareSingleOrder" :moreOrderRemind="false"></OrderItem>
           </div>
         </div>
       </block>
@@ -19,7 +19,7 @@
     <view class="bottom-bar-view" v-if="!$util.isEmpty(ids)">
       <view class="bar-content">
         <!-- #ifdef MP-WEIXIN -->
-        <button class="admin-button-com big blue" open-type="share" @click="shareAllOrder()">全部分享</button>
+        <button class="admin-button-com big blue" open-type="share" data-share-type="merge" @click="shareAllOrder()">全部分享</button>
         <!-- #endif -->
         <!-- #ifdef APP-PLUS -->
         <button class="admin-button-com big blue" @click="shareAllOrder()">全部分享</button>
@@ -58,16 +58,15 @@ import { mapGetters } from "vuex";
 import orderMixin from "@/mixins/order";
 import OrderItem from "../home/components/OrderItem"
 import { getMergeOrderList,cloudPrintOrder,mergePrintFn,allFhAction,orderFh} from "@/api/order";
-import { IMGHOST } from "@/config";
 import {
   buildMergeShareTitle,
-  buildOrderShareTitle,
+  buildSingleSharePayload,
   canShareSingleOrder,
-  getMergeHdSharePath,
   getMergeSharePath,
-  getShareOrderIdFromEvent,
-  getSingleOrderSharePath,
-  shareOrderToWxMiniProgram
+  resolveMpShareMessage,
+  shareMergeAllOnApp,
+  shareSingleOrderOnApp,
+  buildMpShareMessage
 } from "@/utils/orderShare";
 export default {
   name: "mergeOrder",
@@ -90,6 +89,7 @@ export default {
       shareTitle: '订单列表',
       shareMode: 'merge',
       singleShareOrderId: 0,
+      pendingSharePayload: null,
     }
   },
   onPullDownRefresh() {
@@ -119,31 +119,20 @@ export default {
 
   },
   onShareAppMessage(res) {
-    let orderId = this.singleShareOrderId || 0
-    const datasetOrderId = getShareOrderIdFromEvent(res)
-    if (datasetOrderId) {
-      orderId = datasetOrderId
-      this.shareMode = 'single'
-    }
-    if (this.shareMode === 'single') {
-      const singleShare = this.getSingleOrderShareConfig(orderId)
-      if (singleShare) {
-        return {
-          title: singleShare.title,
-          desc: '',
-          imageUrl: IMGHOST + '/custom/order_share.jpg',
-          path: singleShare.path
-        }
-      }
-    }
-    const path = getMergeSharePath(this.shareInfo)
-    const title = this.shareTitle || buildMergeShareTitle(this.shareInfo, this.list.data) || '订单列表'
-    return {
-      title: title,
-      desc: '',
-      imageUrl: IMGHOST + '/custom/order_share.jpg',
-      path: path || 'pagesOrder/showMergeOrder'
-    }
+    const mpMessage = resolveMpShareMessage({
+      pendingSharePayload: this.pendingSharePayload,
+      res: res,
+      fallbackOrderId: this.singleShareOrderId,
+      getSingleShareByOrderId: (orderId) => this.getSingleOrderShareConfig(orderId),
+      getMergeShare: () => ({
+        title: this.shareTitle || buildMergeShareTitle(this.shareInfo, this.list.data) || '订单列表',
+        path: getMergeSharePath(this.shareInfo) || 'pagesOrder/showMergeOrder'
+      })
+    })
+    return mpMessage || buildMpShareMessage({
+      title: '订单列表',
+      path: 'pagesOrder/showMergeOrder'
+    })
   },
   methods: {
     findOrderById(orderId) {
@@ -166,51 +155,56 @@ export default {
       if (!info) {
         return null
       }
-      const path = getSingleOrderSharePath(info)
-      if (!path) {
+      const payload = buildSingleSharePayload(info)
+      if (!payload) {
         return null
       }
-      return {
-        title: buildOrderShareTitle(info),
-        path: path
-      }
+      return { title: payload.title, path: payload.path }
     },
     shareSingleOrder(info) {
       if (!canShareSingleOrder(info)) {
+        this.pendingSharePayload = null
         this.$msg('暂无可分享订单')
         return false
       }
       this.shareMode = 'single'
       this.singleShareOrderId = info.id || 0
-      const singleShare = this.getSingleOrderShareConfig(this.singleShareOrderId)
-      if (!singleShare) {
+      const payload = buildSingleSharePayload(info)
+      if (!payload) {
+        this.pendingSharePayload = null
         this.$msg('暂无可分享订单')
         return false
       }
+      this.pendingSharePayload = payload
       // #ifdef APP-PLUS
-      shareOrderToWxMiniProgram({
-        dictInfo: this.getDictionariesInfo,
-        appKey: 'ghs',
-        path: singleShare.path,
-        title: singleShare.title
-      })
+      shareSingleOrderOnApp({ dictInfo: this.getDictionariesInfo, info: info })
       // #endif
     },
     shareAllOrder(){
       this.shareMode = 'merge'
-      const path = getMergeHdSharePath(this.shareInfo)
-      if (!path) {
+      this.singleShareOrderId = 0
+      const mpPath = getMergeSharePath(this.shareInfo)
+      if (!mpPath) {
+        this.pendingSharePayload = null
         this.$msg('暂无可分享订单')
         return false
       }
       this.shareTitle = buildMergeShareTitle(this.shareInfo, this.list.data)
+      this.pendingSharePayload = {
+        type: 'merge',
+        title: this.shareTitle,
+        path: mpPath
+      }
       // #ifdef APP-PLUS
-      shareOrderToWxMiniProgram({
+      const appPayload = shareMergeAllOnApp({
         dictInfo: this.getDictionariesInfo,
-        appKey: 'hd',
-        path: path,
-        title: this.shareTitle
+        shareInfo: this.shareInfo,
+        listData: this.list.data
       })
+      if (!appPayload) {
+        this.$msg('暂无可分享订单')
+        return false
+      }
       // #endif
     },
     //这个有多处要同步修改,关键词:fh_express_pop

+ 109 - 5
ghsApp/src/utils/orderShare.js

@@ -1,5 +1,15 @@
 import { IMGHOST } from '@/config'
 
+/** 分享封面图(小程序 / App 共用) */
+export const ORDER_SHARE_IMAGE = IMGHOST + '/custom/order_share.jpg'
+
+/**
+ * 订单分享双端约定:
+ * - 微信小程序:按钮 open-type="share",点击时写入 pendingSharePayload,onShareAppMessage 优先读取
+ * - App:按钮仅 @click,调用 shareOrderToWxMiniProgram 分享微信小程序卡片
+ * 单条订单走 ghs 小程序 pagesOrder/showOrder;合并单小程序走 showMergeOrder,App 全部分享走 hd 小程序
+ */
+
 /** 采购单 salt */
 export function getCgSalt(info) {
   if (!info) {
@@ -97,7 +107,7 @@ export function shareOrderToWxMiniProgram({ dictInfo, appKey, path, title }) {
     type: 5,
     title: title || '订单',
     summary: '暂无',
-    imageUrl: IMGHOST + '/custom/order_share.jpg',
+    imageUrl: ORDER_SHARE_IMAGE,
     miniProgram: {
       id: miniOriginalId,
       path: path,
@@ -107,10 +117,104 @@ export function shareOrderToWxMiniProgram({ dictInfo, appKey, path, title }) {
   })
 }
 
-/** 从分享按钮 dataset 解析订单 id(小程序) */
-export function getShareOrderIdFromEvent(res) {
+/** 从分享按钮 dataset 解析(小程序) */
+export function getShareMetaFromEvent(res) {
+  const meta = { shareType: '', orderId: 0 }
   if (res && res.from === 'button' && res.target && res.target.dataset) {
-    return Number(res.target.dataset.orderId) || 0
+    const ds = res.target.dataset
+    meta.shareType = ds.shareType || ''
+    meta.orderId = Number(ds.orderId) || 0
+  }
+  return meta
+}
+
+/** @deprecated 使用 getShareMetaFromEvent */
+export function getShareOrderIdFromEvent(res) {
+  return getShareMetaFromEvent(res).orderId
+}
+
+/** 小程序 onShareAppMessage 返回结构 */
+export function buildMpShareMessage({ title, path }) {
+  return {
+    title: title || '订单',
+    desc: '',
+    imageUrl: ORDER_SHARE_IMAGE,
+    path: path || 'pagesOrder/showOrder'
+  }
+}
+
+/** 单条分享 payload:小程序 pending + App 共用 */
+export function buildSingleSharePayload(info) {
+  const path = getSingleOrderSharePath(info)
+  if (!path) {
+    return null
+  }
+  return {
+    type: 'single',
+    title: buildOrderShareTitle(info),
+    path: path
+  }
+}
+
+/** App:单条订单分享到 ghs 小程序 */
+export function shareSingleOrderOnApp({ dictInfo, info }) {
+  const payload = buildSingleSharePayload(info)
+  if (!payload) {
+    return null
+  }
+  shareOrderToWxMiniProgram({
+    dictInfo: dictInfo,
+    appKey: 'ghs',
+    path: payload.path,
+    title: payload.title
+  })
+  return payload
+}
+
+/** App:合并订单全部分享到 hd 小程序 */
+export function shareMergeAllOnApp({ dictInfo, shareInfo, listData }) {
+  const path = getMergeHdSharePath(shareInfo)
+  if (!path) {
+    return null
+  }
+  const title = buildMergeShareTitle(shareInfo, listData)
+  shareOrderToWxMiniProgram({
+    dictInfo: dictInfo,
+    appKey: 'hd',
+    path: path,
+    title: title
+  })
+  return { type: 'merge', title: title, path: path }
+}
+
+/**
+ * 合并页 / 列表页:小程序 onShareAppMessage 解析
+ * @param {Object} ctx
+ * @param {Object|null} ctx.pendingSharePayload 点击时写入
+ * @param {Object} ctx.res onShareAppMessage 参数
+ * @param {Function} ctx.getSingleShareByOrderId (orderId) => { title, path } | null
+ * @param {number} ctx.fallbackOrderId 点击时记录的单号
+ * @param {Function} [ctx.getMergeShare] 返回合并分享 { title, path },仅合并页传入
+ */
+export function resolveMpShareMessage(ctx) {
+  const pending = ctx.pendingSharePayload
+  if (pending && pending.path) {
+    return buildMpShareMessage(pending)
+  }
+  const { shareType, orderId: datasetOrderId } = getShareMetaFromEvent(ctx.res)
+  const orderId = datasetOrderId || ctx.fallbackOrderId || 0
+  const isSingleShare = shareType === 'single' || (orderId > 0 && shareType !== 'merge')
+  if (isSingleShare && ctx.getSingleShareByOrderId) {
+    const singleShare = ctx.getSingleShareByOrderId(orderId)
+    if (singleShare) {
+      return buildMpShareMessage(singleShare)
+    }
+  }
+  if (shareType === 'merge' && ctx.getMergeShare) {
+    const mergeShare = ctx.getMergeShare()
+    if (mergeShare) {
+      return buildMpShareMessage(mergeShare)
+    }
   }
-  return 0
+  return null
 }