diff --git a/src/pages-service/tickets/components/ProductDetail.vue b/src/pages-service/tickets/components/ProductDetail.vue index 6f6a3be..c5e9944 100644 --- a/src/pages-service/tickets/components/ProductDetail.vue +++ b/src/pages-service/tickets/components/ProductDetail.vue @@ -1,28 +1,40 @@ diff --git a/src/pages-service/tickets/data.js b/src/pages-service/tickets/data.js index 57d613a..d6bc919 100644 --- a/src/pages-service/tickets/data.js +++ b/src/pages-service/tickets/data.js @@ -80,6 +80,8 @@ const createProduct = ({ excluded, detail, purchaseNotice, + useRule = '请按预约日期和场次使用;实名商品需携带下单时填写的有效证件,具体核验方式以出票凭证及现场指引为准。', + refundRule = '未使用且符合商品退改规则时可申请退款;已使用、已过有效期或超过退改时间的权益不可退款,审核结果以订单页面为准。', reservation, entitlements, status = 'on_sale', @@ -102,6 +104,8 @@ const createProduct = ({ excluded: [...excluded], detail, purchaseNotice, + useRule, + refundRule, images: [PLACEHOLDER_IMAGE], reservation: createReservation(reservation), entitlements: entitlements.map((entitlement) => ({ ...entitlement })), @@ -142,7 +146,7 @@ export const PRODUCTS = [ }), createProduct({ id: 'classic', name: '小七孔经典畅游套餐', shortTitle: '门票 + 观光车 + 鸳鸯湖游船(成人套餐)', category: '组合套餐', description: '门票 + 观光车 + 鸳鸯湖游船,一次购买,两类凭证独立履约。', salePrice: 188, marketPrice: 210, stock: 480, sold: 184, - highlights: ['官方', '实名预约', '整包退', '双凭证'], included: ['成人门票 1 张、观光车票 1 张、鸳鸯湖游船 1 次。'], excluded: ['不含景区保险、餐饮及套餐外个人消费。'], detail: '一个订单包含两类凭证:第三方票务凭证包含景区门票和观光车票;自营权益码包含鸳鸯湖游船,由工作人员扫码核销。', purchaseNotice: '套餐统一选择使用日期和入园时段。全部权益未使用可整单全额退;任一权益使用后整单不可退,不支持拆项退款。', + highlights: ['官方', '实名预约', '整包退', '双凭证'], included: ['成人门票 1 张、观光车票 1 张、鸳鸯湖游船 1 次。'], excluded: ['不含景区保险、餐饮及套餐外个人消费。'], detail: '一个订单包含两类凭证:第三方票务凭证包含景区门票和观光车票;自营权益码包含鸳鸯湖游船,由工作人员扫码核销。', purchaseNotice: '套餐统一选择使用日期和入园时段。全部权益未使用可整单全额退;任一权益使用后整单不可退,不支持拆项退款。', refundRule: '套餐内全部权益均未使用时支持整单全额退款;任一权益使用后整单不可退款,不支持拆项退款。', reservation: { advanceDays: 30 }, entitlements: [ticketEntitlement('classic-ticket', '小七孔成人门票', 'third_party', 120), ticketEntitlement('classic-shuttle', '观光车票', 'third_party', 40), ticketEntitlement('classic-boat', '鸳鸯湖游船', 'self', 28, '次')], }), createProduct({ diff --git a/src/pages-service/tickets/index.vue b/src/pages-service/tickets/index.vue index e63852a..7240d02 100644 --- a/src/pages-service/tickets/index.vue +++ b/src/pages-service/tickets/index.vue @@ -1,7 +1,6 @@ diff --git a/src/pages-service/tickets/view-contract.test.mjs b/src/pages-service/tickets/view-contract.test.mjs index a9788ac..fd02aa2 100644 --- a/src/pages-service/tickets/view-contract.test.mjs +++ b/src/pages-service/tickets/view-contract.test.mjs @@ -6,6 +6,7 @@ const ticketRoot = new URL("./", import.meta.url); const readTicketFile = (path) => readFile(new URL(path, ticketRoot), "utf8"); const pageNames = [ + "product-detail", "booking", "travelers", "orders", @@ -62,6 +63,31 @@ test("storefront synchronizes the left category from right-column scrolling", as assert.match(source, /TopNavBar/); }); +test("product detail is an independent prototype-aligned page", async () => { + const indexPage = await readTicketFile("index.vue"); + const detailPage = await readTicketFile("product-detail.vue"); + const component = await readTicketFile("components/ProductDetail.vue"); + const data = await readTicketFile("data.js"); + + assert.match(indexPage, /uni\.navigateTo\(\{\s*url: `\/pages-service\/tickets\/product-detail\?productId=\$\{productId\}`/); + assert.doesNotMatch(indexPage, /detailProduct| { const component = await readTicketFile("components/BookingFlow.vue"); const page = await readTicketFile("booking.vue"); diff --git a/src/pages.json b/src/pages.json index a52ed7a..fcbb562 100644 --- a/src/pages.json +++ b/src/pages.json @@ -149,6 +149,12 @@ "navigationStyle": "custom" } }, + { + "path": "tickets/product-detail", + "style": { + "navigationStyle": "custom" + } + }, { "path": "tickets/booking", "style": {