From d042bb3c5679375956c7616e6b1afe681fb82d9b Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期三, 24 十二月 2025 16:12:02 +0800
Subject: [PATCH] fix: 甲方小程序

---
 packages/constants/dic.ts                                                        |    5 +
 packages/hooks/standardOrder.ts                                                  |    6 +
 packages/components/src/index.ts                                                 |    2 
 packages/hooks/dic.ts                                                            |    3 
 packages/components/src/Sku/Sku.vue                                              |   58 ++++++++++++++
 packages/components/src/Sku/sku.ts                                               |   17 ++++
 apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue |   43 ++++++++++
 packages/services/apiV2/typings.d.ts                                             |   42 ++++++++++
 apps/housekeepingMiniApp/src/pages/home/hooks/index.ts                           |    7 +
 apps/housekeepingMiniApp/src/pages/home/index.vue                                |    2 
 packages/constants/apiEnum.ts                                                    |    2 
 11 files changed, 178 insertions(+), 9 deletions(-)

diff --git a/apps/housekeepingMiniApp/src/pages/home/hooks/index.ts b/apps/housekeepingMiniApp/src/pages/home/hooks/index.ts
index deb8b05..7c89e56 100644
--- a/apps/housekeepingMiniApp/src/pages/home/hooks/index.ts
+++ b/apps/housekeepingMiniApp/src/pages/home/hooks/index.ts
@@ -1,6 +1,6 @@
 import { useQuery, useQueryClient } from '@tanstack/vue-query';
 import * as advertisementServices from '@12333/services/apiV2/advertisement';
-import { EnumAdvertisementPage, CategoryCode } from '@12333/constants';
+import { EnumAdvertisementPage, CategoryCode, PositionCodeEnum } from '@12333/constants';
 import { useDictionaryDataSelect } from '@12333/hooks';
 import _ from 'lodash';
 
@@ -28,11 +28,12 @@
 export function usePositionGrid() {
   const { dictionaryDataList: positionList } = useDictionaryDataSelect({
     categoryCode: CategoryCode.Position,
+    field1: PositionCodeEnum.Housekeeping,
   });
 
-  const positionListChunk = computed(() => _.chunk(positionList.value, 8));
+  const positionListChunk = computed(() => _.chunk(positionList.value, 10));
 
-  const positionGrid = computed(() => positionList.value.slice(0, 8));
+  const positionGrid = computed(() => positionList.value.slice(0, 10));
 
   return {
     positionListChunk,
diff --git a/apps/housekeepingMiniApp/src/pages/home/index.vue b/apps/housekeepingMiniApp/src/pages/home/index.vue
index 006890a..d3793bc 100644
--- a/apps/housekeepingMiniApp/src/pages/home/index.vue
+++ b/apps/housekeepingMiniApp/src/pages/home/index.vue
@@ -43,7 +43,7 @@
             :key="index"
             style="height: 160px"
           > -->
-        <nut-grid class="home-gird">
+        <nut-grid class="home-gird" :column-num="5">
           <nut-grid-item v-for="item in positionGrid" :key="item.value" :text="item.label">
             <img :src="setOSSLink(item.data.field2)" class="home-grid-item-icon" />
             <!-- <Dongdong /> -->
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue b/apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue
index fa0f6d3..f41598b 100644
--- a/apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue
@@ -15,9 +15,16 @@
             :isFlex="false"
             @click="handleAttention"
           ></PageFooterAction> -->
-        <PageFooterBtn type="primary" @click="pay">棰勭害涓嬪崟</PageFooterBtn>
+        <PageFooterBtn type="primary" @click="skuState.visible = true">棰勭害涓嬪崟</PageFooterBtn>
         <PageFooterBtn type="primary" @click="pay">棰勭害涓嬪崟</PageFooterBtn>
       </PageFooter>
+      <Sku
+        v-model:visible="skuState.visible"
+        :sku="skuState.sku"
+        v-model:goods="skuState.goods"
+        @clickBtnOperate="clickBtnOperate"
+      >
+      </Sku>
     </LoadingLayout>
   </PageLayoutWithBg>
 </template>
@@ -26,6 +33,8 @@
 import { useStandardServiceDetail } from '@12333/hooks';
 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';
 
 defineOptions({
   name: 'serciceDetail',
@@ -36,8 +45,39 @@
 
 const { isLoading, isError, detail, refetch } = useStandardServiceDetail({
   id,
+  onSuccess(res) {
+    skuState.sku = [
+      {
+        id: '1',
+        name: '瑙勬牸',
+        list: res.specs.map((item, index) => ({
+          id: item.id,
+          name: item.name,
+          active: index === 0,
+          disable: false,
+        })),
+      },
+    ];
+    skuState.goods = {
+      skuId: '1',
+      price: toThousand(res.specs[0].price),
+      imagePath: setOSSLink(res.files[0]),
+      name: res.name,
+    };
+  },
 });
 
+const skuState = reactive({
+  visible: false,
+  sku: [] as SkuItem[],
+  goods: {} as Goods,
+});
+
+// 搴曢儴鎿嶄綔鎸夐挳瑙﹀彂
+const clickBtnOperate = (op) => {
+  console.log('鐐瑰嚮浜嗘搷浣滄寜閽�', op);
+};
+
 async function addStandardOrder() {
   try {
     let params: API.AddStandardOrderCommand = {
@@ -54,7 +94,6 @@
       enterpriseEmployeeIds: ['3fa85f64-5717-4562-b3fc-2c963f66afa6'],
       remark: 'string',
       payAccess: 1,
-      payAmount: 0,
     };
     let res = await standardOrderServices.addStandardOrder(params);
   } catch (error) {}
diff --git a/packages/components/src/Sku/Sku.vue b/packages/components/src/Sku/Sku.vue
new file mode 100644
index 0000000..51d1786
--- /dev/null
+++ b/packages/components/src/Sku/Sku.vue
@@ -0,0 +1,58 @@
+<template>
+  <nut-sku
+    v-model:visible="visible"
+    :sku="sku"
+    :goods="goods"
+    @selectSku="selectSku"
+    class="pro-sku"
+  >
+    <template #sku-header-price>
+      <div class="pro-sku-header">
+        <div class="pro-sku-header-title">{{ goods.name }}</div>
+        <nut-price :price="goods.price" />
+      </div>
+    </template>
+  </nut-sku>
+</template>
+
+<script setup lang="ts">
+import { toThousand } from '@12333/utils';
+import { Goods, SkuItem } from './sku';
+
+defineOptions({
+  name: 'Sku',
+});
+
+type Props = {
+  sku: SkuItem[];
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+
+const visible = defineModel<boolean>('visible');
+const goods = defineModel<Goods>('goods');
+
+const selectSku = (ss) => {
+  const { sku, skuIndex, parentSku, parentIndex } = ss;
+  if (sku.disable) return false;
+  props.sku[parentIndex].list.forEach((s) => {
+    s.active = s.id == sku.id;
+  });
+  goods.value = {
+    ...goods.value,
+    skuId: sku.id,
+    price: toThousand(sku.price),
+  };
+};
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.pro-sku {
+  .pro-sku-header {
+    flex: 1;
+    min-height: 0;
+  }
+}
+</style>
diff --git a/packages/components/src/Sku/sku.ts b/packages/components/src/Sku/sku.ts
new file mode 100644
index 0000000..1b864b7
--- /dev/null
+++ b/packages/components/src/Sku/sku.ts
@@ -0,0 +1,17 @@
+export type SkuItem = {
+  id: string;
+  name: string;
+  list: {
+    active: boolean;
+    disable: boolean;
+    id: string;
+    name: string;
+  }[];
+};
+
+export type Goods = {
+  imagePath: string;
+  price: string;
+  skuId: string;
+  name: string;
+};
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index b72256e..cb7ac69 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -51,3 +51,5 @@
 export { default as Cell } from './Chunk/Cell.vue';
 export { default as CellChunk } from './Chunk/CellChunk.vue';
 export { default as ChunkTitle } from './Chunk/ChunkTitle.vue';
+export { default as Sku } from './Sku/Sku.vue';
+export * from './Sku/sku';
diff --git a/packages/constants/apiEnum.ts b/packages/constants/apiEnum.ts
index cb4bfa6..a8c9942 100644
--- a/packages/constants/apiEnum.ts
+++ b/packages/constants/apiEnum.ts
@@ -823,6 +823,8 @@
 
 /** 鐢ㄦ埛閽卞寘鏀舵敮绫诲瀷 */
 export enum EnumUserWalletTransactionType {
+  /**鏀粯 */
+  Payment = 1,
   /**鏀跺叆 */
   Income = 10,
   /**鎻愮幇 */
diff --git a/packages/constants/dic.ts b/packages/constants/dic.ts
index 41e3e90..c23b5f5 100644
--- a/packages/constants/dic.ts
+++ b/packages/constants/dic.ts
@@ -58,3 +58,8 @@
   /**楂樻俯琛ヨ创 */
   HighTemperatureSubsidies = '50-40',
 }
+
+export enum PositionCodeEnum {
+  /**瀹舵斂 */
+  Housekeeping = '60-600',
+}
diff --git a/packages/hooks/dic.ts b/packages/hooks/dic.ts
index bb28a9f..d6fc03d 100644
--- a/packages/hooks/dic.ts
+++ b/packages/hooks/dic.ts
@@ -57,6 +57,7 @@
   /** 鏌ヨ鎵�鏈� */
   all?: MaybeRef<boolean>;
   maxDeep?: number;
+  field1?: MaybeRef<string>;
 };
 
 export function useDictionaryDataSelect({
@@ -67,6 +68,7 @@
   keywords,
   all,
   maxDeep,
+  field1,
 }: UseDictionaryDataSelectOptions) {
   const params = computed(() => ({
     categoryId: unref(categoryId),
@@ -75,6 +77,7 @@
     keywords: unref(keywords),
     all: unref(all),
     maxDeep: maxDeep,
+    field1: unref(field1),
   }));
   const { data: dictionaryDataList, refetch } = useQuery({
     queryKey: ['dictionaryServices/getDictionaryDataSelect', params],
diff --git a/packages/hooks/standardOrder.ts b/packages/hooks/standardOrder.ts
index b1a1e61..585b716 100644
--- a/packages/hooks/standardOrder.ts
+++ b/packages/hooks/standardOrder.ts
@@ -4,9 +4,10 @@
 
 type UseStandardServiceDetailOptions = {
   id: MaybeRef<string>;
+  onSuccess?: (data: API.GetStandardServiceQueryResult) => any;
 };
 
-export function useStandardServiceDetail({ id }: UseStandardServiceDetailOptions) {
+export function useStandardServiceDetail({ id, onSuccess }: UseStandardServiceDetailOptions) {
   const { data, refetch, isLoading, isError } = useQuery({
     queryKey: ['standardServiceServices/getStandardService', id],
     queryFn: async () => {
@@ -19,6 +20,9 @@
       });
     },
     placeholderData: () => ({} as API.GetStandardServiceQueryResult),
+    onSuccess(data) {
+      onSuccess?.(data);
+    },
   });
 
   return {
diff --git a/packages/services/apiV2/typings.d.ts b/packages/services/apiV2/typings.d.ts
index c0a541b..8815df5 100644
--- a/packages/services/apiV2/typings.d.ts
+++ b/packages/services/apiV2/typings.d.ts
@@ -30,6 +30,8 @@
     serviceId?: string;
     /** 鏈嶅姟鍚� */
     serviceName?: string;
+    /** 鏈嶅姟鍗曞彿 */
+    serviceCode?: string;
     /** 瑙勬牸 */
     specId?: string;
     /** 瑙勬牸鍚嶇О */
@@ -40,6 +42,30 @@
     specNumber?: number;
     /** 鍦板潃Id */
     addressId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 鑱旂郴鐢佃瘽 */
+    contactPhoneNumber?: string;
+    /** 鐪佷唤缂栧彿 */
+    provinceCode?: string;
+    /** 鐪佷唤 */
+    provinceContent?: string;
+    /** 鍩庡競缂栧彿 */
+    cityCode?: string;
+    /** 鍩庡競 */
+    cityContent?: string;
+    /** 鍖虹紪鍙� */
+    areaCode?: string;
+    /** 鍖� */
+    areaContent?: string;
+    /** 璇︾粏鍦板潃 */
+    addressName?: string;
+    /** 闂ㄧ墝鍙� */
+    addressDetail?: string;
+    /** 缁忓害 */
+    longitude?: number;
+    /** 绾害 */
+    latitude?: number;
     /** 鏈嶅姟璧峰鏃堕棿 */
     beginTime?: string;
     /** 鏈嶅姟鎴鏃堕棿 */
@@ -51,8 +77,6 @@
     /** 澶囨敞 */
     remark?: string;
     payAccess?: EnumUserBankCardAccess;
-    /** 瀹炰粯閲戦 */
-    payAmount?: number;
   }
 
   interface AgainSureTaskSettlementOrderRosterCommand {
@@ -149,6 +173,16 @@
     maxDeep?: number;
     /** 鎼哄甫涓嬬骇 */
     withChildren?: boolean;
+    /** 瀛楁1 */
+    field1?: string;
+    /** 瀛楁2 */
+    field2?: string;
+    /** 瀛楁3 */
+    field3?: string;
+    /** 瀛楁4 */
+    field4?: string;
+    /** 瀛楁5 */
+    field5?: string;
   }
 
   interface APIgetEnabledElectronSignSettingsParams {
@@ -1638,6 +1672,8 @@
   }
 
   enum EnumUserWalletTransactionType {
+    /**鏀粯 */
+    Payment = 1,
     /**鏀跺叆 */
     Income = 10,
     /**鎻愮幇 */
@@ -9413,6 +9449,8 @@
     signType?: string;
     /** 绛惧悕锛屽叿浣撹寰俊鏀粯鏂囨。 */
     paySign?: string;
+    /** 鏀粯缁撴潫鏃堕棿 */
+    timeExpire?: string;
   }
 
   interface PersonalUserElectronSignCommand {

--
Gitblit v1.10.0