zhengyiming
昨天 25f0924ac4dcce46cb14856b88ced3b0b6289cab
fix: 甲方小程序
已修改6个文件
已添加3个文件
207 ■■■■ 文件已修改
apps/housekeepingMiniApp/src/app.config.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/constants/router.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/addStandardOrder.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/addStandardOrder.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Sku/Sku.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Sku/sku.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/app.config.ts
@@ -91,7 +91,7 @@
    },
    {
      root: 'subpackages/sercice',
      pages: ['serciceDetail/serciceDetail'],
      pages: ['serciceDetail/serciceDetail', 'addStandardOrder/addStandardOrder'],
    },
    {
      root: 'subpackages/user',
apps/housekeepingMiniApp/src/constants/router.ts
@@ -34,6 +34,7 @@
  mineReserveServiceConfirm = '/subpackages/mine/mineReserveServiceConfirm/mineReserveServiceConfirm',
  serciceDetail = '/subpackages/sercice/serciceDetail/serciceDetail',
  addStandardOrder = '/subpackages/sercice/addStandardOrder/addStandardOrder',
  extraPage = '/subpackages/extraPage/extraPage/extraPage',
}
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
<template>
  <!-- <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> -->
  <ContentScrollView hasPaddingTop>
    <MineServiceDetailView />
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" class="business-card-btn" @click="goCancel"
      >取消服务</PageFooterBtn
    >
    <PageFooterBtn type="primary" class="business-card-btn" @click="goConfirm"
      >服务确认</PageFooterBtn
    >
  </PageFooter>
  <!-- </LoadingLayout> -->
</template>
<script setup lang="ts">
import MineServiceDetailView from '../../components/MineServiceDetailView.vue';
import Taro from '@tarojs/taro';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import { RouterPath } from '@/constants';
defineOptions({
  name: 'InnerPage',
});
const route = Taro.useRouter();
const id = route.params?.id as string;
function goCancel() {
  Taro.navigateTo({
    url: `${RouterPath.mineReserveServiceCancel}?id=${id}`,
  });
}
function goConfirm() {
  Taro.navigateTo({
    url: `${RouterPath.mineReserveServiceConfirm}?id=${id}`,
  });
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/addStandardOrder.config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/addStandardOrder.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
  <PageLayout class="addStandardOrder-page-wrapper" title="预约下单" has-border>
    <InnerPage />
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'addStandardOrder',
});
</script>
apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.config.ts
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue
@@ -3,19 +3,19 @@
    <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
      <ContentScrollView style="background-color: transparent"> serciceDetail </ContentScrollView>
      <PageFooter>
        <!-- <PageFooterAction
            :icon="IconShare"
            text="分享"
            :isFlex="false"
            openType="share"
          ></PageFooterAction>
          <PageFooterAction
            :icon="userResumeInfo.isCollected ? IconAttentionActive : IconAttention"
            text="收藏"
            :isFlex="false"
            @click="handleAttention"
          ></PageFooterAction> -->
        <PageFooterBtn type="primary" @click="skuState.visible = true">预约下单</PageFooterBtn>
        <PageFooterAction
          :icon="detail.isCollection ? IconAttentionActive : IconAttention"
          text="收藏"
          :isFlex="false"
          @click="handleAttention"
        ></PageFooterAction>
        <PageFooterAction
          :icon="IconShare"
          text="分享"
          :isFlex="false"
          :open-type="'contact'"
        ></PageFooterAction>
        <PageFooterBtn type="primary" @click="openSkuDialog()">预约下单</PageFooterBtn>
        <PageFooterBtn type="primary" @click="pay">预约下单</PageFooterBtn>
      </PageFooter>
      <Sku
@@ -34,7 +34,11 @@
import Taro from '@tarojs/taro';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
import { toThousand, setOSSLink } from '@12333/utils';
import { Sku, Goods, SkuItem } from '@12333/components';
import { Sku, Goods, SkuItem, SkuUtils } from '@12333/components';
import { useAccessLogin } from '@/hooks';
import IconShare from '@/assets/flexJob/icon-share.png';
import IconAttention from '@/assets/flexJob/icon-attention-lg.png';
import IconAttentionActive from '@/assets/flexJob/icon-attention-lg-active.png';
defineOptions({
  name: 'serciceDetail',
@@ -48,7 +52,7 @@
  onSuccess(res) {
    skuState.sku = [
      {
        id: '1',
        id: SkuUtils.DefaultSkuSpecId,
        name: '规格',
        list: res.specs.map((item, index) => ({
          id: item.id,
@@ -59,7 +63,7 @@
      },
    ];
    skuState.goods = {
      skuId: '1',
      skuId: SkuUtils.DefaultSkuSpecId,
      price: toThousand(res.specs[0].price),
      imagePath: setOSSLink(res.files[0]),
      name: res.name,
@@ -74,22 +78,46 @@
});
// åº•部操作按钮触发
const clickBtnOperate = (op) => {
  console.log('点击了操作按钮', op);
const clickBtnOperate = (op: { type: string; value: number }) => {
  addStandardOrder(op.value);
};
async function addStandardOrder() {
const openSkuDialog = useAccessLogin(() => {
  skuState.visible = true;
});
function goAddStandardOrder(specNumber: number) {
  Taro.navigateTo({
    url: `${RouterPath.addStandardOrder}?specNumber=${specNumber}`,
  });
}
async function addStandardOrder(specNumber: number) {
  try {
    const spec = SkuUtils.getCurrentActiveSpec(skuState.sku);
    let params: API.AddStandardOrderCommand = {
      serviceId: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
      serviceName: 'string',
      specId: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
      specName: 'string',
      specPrice: 0,
      specNumber: 0,
      serviceId: detail.value.id,
      serviceName: detail.value.name,
      serviceCode: detail.value.code,
      specId: spec.id,
      specName: spec.name,
      specPrice: detail.value.specs.find((x) => x.id === spec.id)?.price ?? 0,
      specNumber: specNumber,
      addressId: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
      beginTime: '2025-12-24T06:44:24.840Z',
      endTime: '2025-12-24T06:44:24.840Z',
      name: detail.value.name,
      contactPhoneNumber: 'string',
      provinceCode: 'string',
      provinceContent: 'string',
      cityCode: 'string',
      cityContent: 'string',
      areaCode: 'string',
      areaContent: 'string',
      addressName: 'string',
      addressDetail: 'string',
      longitude: 0,
      latitude: 0,
      beginTime: '2025-12-24T08:25:08.372Z',
      endTime: '2025-12-24T08:25:08.372Z',
      supplierEnterpriseId: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
      enterpriseEmployeeIds: ['3fa85f64-5717-4562-b3fc-2c963f66afa6'],
      remark: 'string',
@@ -116,6 +144,8 @@
    }
  } catch (error) {}
}
function handleAttention() {}
</script>
<style lang="scss">
packages/components/src/Sku/Sku.vue
@@ -9,15 +9,20 @@
    <template #sku-header-price>
      <div class="pro-sku-header">
        <div class="pro-sku-header-title">{{ goods.name }}</div>
        <nut-price :price="goods.price" />
        <div class="pro-sku-header-spec">{{ currentSpecName }}</div>
        <nut-price :price="goods.price" size="large" />
      </div>
    </template>
    <template #sku-header-extra>
      <div></div>
    </template>
  </nut-sku>
</template>
<script setup lang="ts">
import { toThousand } from '@12333/utils';
import { Goods, SkuItem } from './sku';
import { Goods, SkuItem, SkuUtils } from './sku';
import { computed } from 'vue';
defineOptions({
  name: 'Sku',
@@ -44,6 +49,14 @@
    price: toThousand(sku.price),
  };
};
const currentSpecName = computed(() => {
  const spec = SkuUtils.getCurrentActiveSpec(props.sku);
  if (spec) {
    return spec.name ?? '';
  }
  return '';
});
</script>
<style lang="scss">
@@ -53,6 +66,23 @@
  .pro-sku-header {
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    .pro-sku-header-title {
      color: boleGetCssVar('text-color', 'primary');
    }
    .pro-sku-header-spec {
      color: boleGetCssVar('text-color', 'secondary');
      font-size: 26px;
    }
  }
  .nut-sku-content {
    width: 100%;
    box-sizing: border-box;
  }
}
</style>
packages/components/src/Sku/sku.ts
@@ -15,3 +15,25 @@
  skuId: string;
  name: string;
};
export class SkuUtils {
  static DefaultSkuSpecId = 'spec';
  static getCurrentSku(skuList: SkuItem[], goods: Goods) {
    const sku = skuList.find((item) => item.id === goods.skuId);
    return sku;
  }
  static getCurrentSpecSkuItem(skuList: SkuItem[]) {
    const sku = skuList.find((item) => item.id === this.DefaultSkuSpecId);
    return sku;
  }
  static getCurrentActiveSpec(skuList: SkuItem[]) {
    const sku = this.getCurrentSpecSkuItem(skuList);
    if (sku) {
      return sku.list.find((item) => item.active);
    }
    return null;
  }
}