From f94468cc4f52ca3a68817592e4ff92f815c835c7 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 26 十二月 2025 14:48:21 +0800
Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp

---
 apps/housekeepingMiniApp/project.private.config.json                                                         |   32 +
 apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue                           |   13 +
 apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue                                |   71 +++++
 apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.vue       |   13 +
 apps/housekeepingMiniApp/src/components/Card/ChooseServerCard.vue                                            |   66 +++++
 apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue                      |   72 ++++++
 apps/housekeepingMiniApp/src/components/Card/ChooseSupplierCard.vue                                          |  175 ++++++++++++++
 apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.config.ts                     |    3 
 apps/housekeepingMiniApp/src/components/Input/ChooseInputWithSuppliers.vue                                   |   53 ++++
 apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue                              |   93 +++++--
 packages/components/src/index.ts                                                                             |    1 
 packages/services/apiV2/typings.d.ts                                                                         |   20 +
 apps/housekeepingMiniApp/src/subpackages/sercice/utils/index.ts                                              |    5 
 apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue                               |   34 +-
 apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.config.ts |    3 
 apps/housekeepingMiniApp/src/app.config.ts                                                                   |    7 
 apps/housekeepingMiniApp/src/constants/router.ts                                                             |    2 
 17 files changed, 609 insertions(+), 54 deletions(-)

diff --git a/apps/housekeepingMiniApp/project.private.config.json b/apps/housekeepingMiniApp/project.private.config.json
index ed955db..8629da5 100644
--- a/apps/housekeepingMiniApp/project.private.config.json
+++ b/apps/housekeepingMiniApp/project.private.config.json
@@ -23,29 +23,43 @@
         "miniprogram": {
             "list": [
                 {
-                    "name": "閫夋嫨鍦板潃",
-                    "pathName": "subpackages/mine/addressManange/addressManange",
-                    "query": "type=select",
+                    "name": "棰勭害涓嬪崟",
+                    "pathName": "subpackages/sercice/addStandardOrder/addStandardOrder",
+                    "query": "specNumber=1&specId=ccdc16fb-d842-4e66-bdf5-08de43546a8c&id=e4df3802-1e9b-4b21-4ef6-08de43551f52",
                     "scene": null,
                     "launchMode": "default"
                 },
                 {
-                    "name": "棰勭害涓嬪崟",
-                    "pathName": "subpackages/sercice/addStandardOrder/addStandardOrder",
-                    "query": "specNumber=1&specId=72ec3beb-90dc-473b-d214-08de429af188&id=53208c5d-a823-40d3-e79e-08de429af17b",
+                    "name": "閫夋嫨鏈嶅姟浜哄憳",
+                    "pathName": "subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee",
+                    "query": "id=cc8c3ad3-522a-4b5e-c1ca-08de41c6b930",
                     "launchMode": "default",
                     "scene": null
                 },
                 {
-                    "name": "鏂板鍦板潃",
-                    "pathName": "subpackages/mine/editAddress/editAddress",
-                    "query": "id=53208c5d-a823-40d3-e79e-08de429af17b",
+                    "name": "閫夋嫨鏈嶅姟鏈烘瀯",
+                    "pathName": "subpackages/sercice/chooseSupplier/chooseSupplier",
+                    "query": "id=e4df3802-1e9b-4b21-4ef6-08de43551f52",
                     "launchMode": "default",
                     "scene": null
                 },
                 {
                     "name": "鏈嶅姟璇︽儏",
                     "pathName": "subpackages/sercice/serciceDetail/serciceDetail",
+                    "query": "id=e4df3802-1e9b-4b21-4ef6-08de43551f52",
+                    "launchMode": "default",
+                    "scene": null
+                },
+                {
+                    "name": "閫夋嫨鍦板潃",
+                    "pathName": "subpackages/mine/addressManange/addressManange",
+                    "query": "type=select",
+                    "launchMode": "default",
+                    "scene": null
+                },
+                {
+                    "name": "鏂板鍦板潃",
+                    "pathName": "subpackages/mine/editAddress/editAddress",
                     "query": "id=53208c5d-a823-40d3-e79e-08de429af17b",
                     "launchMode": "default",
                     "scene": null
diff --git a/apps/housekeepingMiniApp/src/app.config.ts b/apps/housekeepingMiniApp/src/app.config.ts
index 3bfac94..8d628ee 100644
--- a/apps/housekeepingMiniApp/src/app.config.ts
+++ b/apps/housekeepingMiniApp/src/app.config.ts
@@ -91,7 +91,12 @@
     },
     {
       root: 'subpackages/sercice',
-      pages: ['serciceDetail/serciceDetail', 'addStandardOrder/addStandardOrder'],
+      pages: [
+        'serciceDetail/serciceDetail',
+        'addStandardOrder/addStandardOrder',
+        'chooseSupplier/chooseSupplier',
+        'chooseEnterpriseEmployee/chooseEnterpriseEmployee',
+      ],
     },
     {
       root: 'subpackages/user',
diff --git a/apps/housekeepingMiniApp/src/components/Card/ChooseServerCard.vue b/apps/housekeepingMiniApp/src/components/Card/ChooseServerCard.vue
new file mode 100644
index 0000000..6053309
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/components/Card/ChooseServerCard.vue
@@ -0,0 +1,66 @@
+<template>
+  <ChooseSupplierCard :avatar="avatar" :name="name">
+    <template #name-right>
+      <div class="flexJob-card-top-info-gender">
+        <img
+          v-if="gender === EnumUserGender.Male"
+          :src="IconMale"
+          class="flexJob-card-top-info-gender-icon"
+        />
+        <img v-else :src="IconFemale" class="flexJob-card-top-info-gender-icon" />
+      </div>
+      <div class="flexJob-card-top-info-auth" :class="{ 'is-real-name': isReal }">
+        {{ isReal ? '宸插疄鍚�' : '鏈疄鍚�' }}
+      </div>
+    </template>
+    <template #infoDetail>
+      {{ infoDetail }}
+    </template>
+    <template #desc>
+      {{ workExperience }}
+    </template>
+    <template #actions>
+      <slot name="actions"> </slot>
+    </template>
+  </ChooseSupplierCard>
+</template>
+
+<script setup lang="ts">
+import { EnumUserGender } from '@12333/constants';
+import ChooseSupplierCard from './ChooseSupplierCard.vue';
+import IconMale from '@/assets/mine/icon-male.png';
+import IconFemale from '@/assets/mine/icon-female.png';
+
+defineOptions({
+  name: 'ChooseServerCard',
+});
+
+type Props = {
+  avatar?: string;
+  name?: string;
+  gender?: EnumUserGender;
+  age?: number;
+  isReal?: boolean;
+  personalIdentityContent?: string;
+  educationalBackgroundContent?: string;
+  taskCount?: number;
+  workExperience?: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+
+const infoDetail = computed(() =>
+  [
+    props.age > 0 ? `${props.age}宀乣 : '',
+    props.personalIdentityContent,
+    props.educationalBackgroundContent,
+    props.taskCount > 0 ? `涓婂矖${props.taskCount ?? 0}娆 : '',
+  ]
+    .filter(Boolean)
+    .join('|')
+);
+</script>
+
+<style lang="scss" scoped>
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/housekeepingMiniApp/src/components/Card/ChooseSupplierCard.vue b/apps/housekeepingMiniApp/src/components/Card/ChooseSupplierCard.vue
new file mode 100644
index 0000000..b6ed4fd
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/components/Card/ChooseSupplierCard.vue
@@ -0,0 +1,175 @@
+<template>
+  <div class="choose-supplier-card-wrapper">
+    <div class="choose-supplier-card-top-wrapper">
+      <Avatar :src="setOSSLink(avatar)" :size="60" class="choose-supplier-card-top-avatar" />
+      <div class="choose-supplier-card-top-info">
+        <div class="flexJob-card-top-info-item">
+          <div class="flexJob-card-top-info-item-w">
+            <div class="flexJob-card-top-info-name">{{ name }}</div>
+            <slot name="name-right"></slot>
+          </div>
+        </div>
+        <div class="flexJob-card-top-info-detail">
+          <slot name="infoDetail"> 鏈嶅姟浜哄憳 {{ serverCount }} | 鏈嶅姟浜烘 {{ serviceCount }} </slot>
+        </div>
+        <div class="flexJob-card-top-info-detail-desc">
+          <slot name="desc">{{ mainBusiness }}</slot>
+        </div>
+      </div>
+    </div>
+    <div class="choose-supplier-card-footer">
+      <div class="flexJob-card-footer-left-wrapper"></div>
+      <div class="flexJob-card-footer-right">
+        <slot name="actions"> </slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { setOSSLink } from '@12333/utils';
+import { Avatar } from '@12333/components';
+
+defineOptions({
+  name: 'ChooseSupplierCard',
+});
+
+type Props = {
+  avatar?: string;
+  name?: string;
+  mainBusiness?: string;
+  serverCount?: number;
+  serviceCount?: number;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.choose-supplier-card-wrapper {
+  padding: 32px 24px 20px;
+  margin-bottom: 24px;
+  background-color: #fff;
+  border-radius: 12px;
+
+  &:last-child {
+    margin-bottom: 0;
+  }
+
+  .choose-supplier-card-top-wrapper {
+    display: flex;
+    align-items: center;
+
+    .choose-supplier-card-top-avatar {
+      margin-right: 30px;
+    }
+  }
+
+  .choose-supplier-card-footer {
+    display: flex;
+    align-items: center;
+    border-top: #d9d9d9 1px solid;
+    padding-top: 24px;
+    margin-top: 18px;
+
+    .flexJob-card-footer-left-wrapper {
+      flex: 1;
+      min-width: 0;
+    }
+
+    .flexJob-card-footer-right {
+      --nut-button-default-font-size: 24px;
+      --nut-button-default-height: 52px;
+      --nut-button-default-line-height: 49px;
+
+      .nut-button {
+        min-width: 144rpx;
+
+        &.nut-button--plain {
+          border-width: 1px;
+        }
+
+        &.nut-button {
+          margin-left: 10px;
+        }
+      }
+    }
+  }
+
+  .choose-supplier-card-top-info {
+    display: flex;
+    flex-direction: column;
+    flex: 1;
+    min-width: 0;
+
+    .flexJob-card-top-info-item-w {
+      display: flex;
+      align-items: center;
+      flex: 1;
+      min-width: 0;
+    }
+
+    .flexJob-card-top-info-item {
+      display: flex;
+      align-items: center;
+
+      .flexJob-card-top-info-item-right {
+        font-size: 28px;
+        line-height: 34px;
+        color: boleGetCssVar('text-color', 'secondary');
+      }
+
+      .flexJob-card-top-info-name {
+        font-size: 34px;
+        line-height: 34px;
+        font-weight: bold;
+        color: boleGetCssVar('text-color', 'primary');
+        @include ellipsis;
+      }
+
+      .flexJob-card-top-info-gender {
+        display: inline-flex;
+        align-items: center;
+        height: 34px;
+        margin: 0 10px;
+        flex-shrink: 0;
+
+        .flexJob-card-top-info-gender-icon {
+          width: 24px;
+          height: 24px;
+        }
+      }
+
+      .flexJob-card-top-info-auth {
+        font-size: 28px;
+        line-height: 34px;
+        flex-shrink: 0;
+
+        &.is-real-name {
+          color: #2a9e1b;
+        }
+      }
+    }
+
+    .flexJob-card-top-info-detail {
+      font-size: 24px;
+      font-weight: 400;
+      line-height: 28px;
+      margin-top: 12px;
+      color: boleGetCssVar('text-color', 'regular');
+      @include ellipsis;
+    }
+
+    .flexJob-card-top-info-detail-desc {
+      font-size: 24px;
+      font-weight: 400;
+      line-height: 28px;
+      margin-top: 12px;
+      color: boleGetCssVar('text-color', 'secondary');
+      @include ellipsis;
+    }
+  }
+}
+</style>
diff --git a/apps/housekeepingMiniApp/src/components/Input/ChooseInputWithSuppliers.vue b/apps/housekeepingMiniApp/src/components/Input/ChooseInputWithSuppliers.vue
new file mode 100644
index 0000000..c52c6e4
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/components/Input/ChooseInputWithSuppliers.vue
@@ -0,0 +1,53 @@
+<template>
+  <ChooseInput :modelValue="enterpriseEmployeeName" @click="handleOpen()"></ChooseInput>
+</template>
+
+<script setup lang="ts">
+import { RouterPath } from '@/constants';
+import { SelectEnterpriseEmployeeEvent } from '@/subpackages/sercice/utils';
+import { ChooseInput } from '@12333/components';
+import { Message } from '@12333/utils';
+import Taro from '@tarojs/taro';
+import dayjs from 'dayjs';
+
+defineOptions({
+  name: 'ChooseInputWithSuppliers',
+});
+
+type Props = {
+  serviceId: string;
+  beginTime?: string;
+  endTime?: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+
+const supplierEnterpriseId = defineModel<string>('supplierEnterpriseId');
+const enterpriseEmployeeId = defineModel<string>('enterpriseEmployeeId');
+const enterpriseEmployeeName = defineModel<string>('enterpriseEmployeeName');
+
+const emit = defineEmits<{
+  (e: 'update:modelValue', val: string | number): void;
+  (e: 'change'): void;
+}>();
+encodeURIComponent;
+function handleOpen() {
+  if (!props.beginTime || !props.endTime) {
+    Message.warning('璇峰厛閫夋嫨鏈嶅姟鏃堕棿');
+    return;
+  }
+  Taro.navigateTo({
+    url: `${RouterPath.chooseSupplier}?id=${props.serviceId}&beginTime=${dayjs(
+      props.beginTime
+    ).format('YYYY-MM-DDTHH:mm')}&endTime=${dayjs(props.endTime).format('YYYY-MM-DDTHH:mm')}`,
+    events: {
+      onSelectEnterpriseEmployee: function (data: SelectEnterpriseEmployeeEvent) {
+        console.log('EditRichContent onChange', data);
+        supplierEnterpriseId.value = data.supplierEnterpriseId;
+        enterpriseEmployeeId.value = data.enterpriseEmployeeId;
+        enterpriseEmployeeName.value = data.enterpriseEmployeeName;
+      },
+    },
+  });
+}
+</script>
diff --git a/apps/housekeepingMiniApp/src/constants/router.ts b/apps/housekeepingMiniApp/src/constants/router.ts
index d4652ee..cf7e7fc 100644
--- a/apps/housekeepingMiniApp/src/constants/router.ts
+++ b/apps/housekeepingMiniApp/src/constants/router.ts
@@ -35,6 +35,8 @@
 
   serciceDetail = '/subpackages/sercice/serciceDetail/serciceDetail',
   addStandardOrder = '/subpackages/sercice/addStandardOrder/addStandardOrder',
+  chooseSupplier = '/subpackages/sercice/chooseSupplier/chooseSupplier',
+  chooseEnterpriseEmployee = '/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee',
 
   extraPage = '/subpackages/extraPage/extraPage/extraPage',
 }
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue b/apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue
index 00f705e..36b49ed 100644
--- a/apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue
@@ -1,6 +1,6 @@
 <template>
   <ProTabs
-    v-model="queryState.status"
+    v-model="queryState.appointmentStatus"
     name="home-tab"
     :showPaneContent="false"
     class="home-tabs"
@@ -26,18 +26,15 @@
   <InfiniteLoading
     scrollViewClassName="common-infinite-scroll-list home-list"
     v-bind="infiniteLoadingProps"
-    :key="queryState.status"
+    :key="queryState.appointmentStatus"
   >
     <template #renderItem="{ item }">
       <ReserveServiceCard
-        :name="item.name"
+        :serviceName="item.serviceName"
         :begin-time="item.beginTime"
         :end-time="item.endTime"
-        :billing-method="item.billingMethod"
-        :benefits="item.benefits"
-        :service-fee="item.serviceFee"
-        :settlement-cycle="item.settlementCycle"
-        :address-name="item.addressName"
+        :addressDetail="item.addressDetail"
+        :appointmentStatus="item.appointmentStatus"
         @click="goSerciceDetail(item)"
       >
       </ReserveServiceCard>
@@ -49,8 +46,13 @@
 import { ProTabs, ProTabPane, ReserveServiceCard } from '@12333/components';
 import { useUserStore } from '@/stores/modules/user';
 import { useInfiniteLoading } from '@12333/hooks';
-import { EnumPagedListOrder, GetPersonalApplyTaskInfosQueryStatus } from '@12333/constants';
-import * as taskServices from '@12333/services/apiV2/task';
+import {
+  EnumGetStandardOrdersQueryScene,
+  EnumPagedListOrder,
+  EnumStandardOrderAppointmentStatus,
+  GetPersonalApplyTaskInfosQueryStatus,
+} from '@12333/constants';
+import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
 import Taro from '@tarojs/taro';
 
 defineOptions({
@@ -58,22 +60,28 @@
 });
 
 const queryState = reactive({
-  status: 0 as any as GetPersonalApplyTaskInfosQueryStatus,
+  scene: EnumGetStandardOrdersQueryScene.PartAEnterpriseOrder,
+  appointmentStatus: 0 as any as EnumStandardOrderAppointmentStatus,
 });
 
 const userStore = useUserStore();
 
 const { infiniteLoadingProps } = useInfiniteLoading(
   ({ pageParam }) => {
-    let params: API.GetTaskInfosQuery = {
+    let params: API.GetStandardOrdersQuery = {
       pageModel: {
         rows: 20,
         page: pageParam,
         orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
       },
+      scene: queryState.scene,
     };
 
-    return taskServices.getOpenTaskInfos(params, {
+    if (!!Number(queryState.appointmentStatus)) {
+      params.appointmentStatus = queryState.appointmentStatus;
+    }
+
+    return standardOrderServices.getStandardOrders(params, {
       showLoading: false,
     });
   },
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue b/apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue
index a5c9ec9..d19c8d7 100644
--- a/apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue
@@ -60,17 +60,18 @@
         <nut-form-item
           label="鏈嶅姟鏈烘瀯:"
           class="bole-form-item"
-          prop="supplierEnterpriseId"
+          prop="enterpriseEmployeeId"
           label-width="90px"
         >
-          <ChooseInputWithDatePicker
-            v-model="form.endTime"
-            :minDate="endMinTime"
-            :maxDate="endMaxTime"
+          <ChooseInputWithSuppliers
+            v-model:supplierEnterpriseId="form.supplierEnterpriseId"
             placeholder="璇烽�夋嫨"
-            type="datetime"
-            format="YYYY-MM-DD HH:mm:ss"
-          ></ChooseInputWithDatePicker>
+            :serviceId="id"
+            :beginTime="form.beginTime"
+            :endTime="form.endTime"
+            v-model:enterpriseEmployeeId="form.enterpriseEmployeeId"
+            v-model:enterpriseEmployeeName="form.enterpriseEmployeeName"
+          ></ChooseInputWithSuppliers>
         </nut-form-item>
         <nut-form-item
           label="澶囨敞:"
@@ -89,6 +90,10 @@
       </nut-form>
     </ContentScrollView>
     <PageFooter>
+      <div class="addStandardOrder-price-wrapper">
+        <div class="addStandardOrder-price-text">鏀粯锛�</div>
+        <nut-price :price="totlePrice" size="large" />
+      </div>
       <PageFooterBtn type="primary" class="business-card-btn" @click="goConfirm"
         >绔嬪嵆涓嬪崟</PageFooterBtn
       >
@@ -119,6 +124,8 @@
 import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
 import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
 import dayjs from 'dayjs';
+import { EnumUserBankCardAccess } from '@12333/constants';
+import { Message } from '@12333/utils';
 
 defineOptions({
   name: 'InnerPage',
@@ -136,6 +143,7 @@
   endTime: '',
   supplierEnterpriseId: '',
   enterpriseEmployeeId: '',
+  enterpriseEmployeeName: '',
   remark: '',
 });
 
@@ -158,6 +166,7 @@
 const rules = reactive<FormRules>({
   beginTime: [{ required: true, message: '璇烽�夋嫨鏈嶅姟寮�濮嬫椂闂�' }],
   endTime: [{ required: true, message: '璇烽�夋嫨鏈嶅姟缁撴潫鏃堕棿' }],
+  enterpriseEmployeeId: [{ required: true, message: '璇烽�夋嫨鏈嶅姟鏈烘瀯' }],
 });
 
 const { isLoading, isError, detail, refetch } = useStandardServiceDetail({
@@ -216,12 +225,16 @@
   form.addressId = nowExistAdd.id;
 };
 
+const totlePrice = computed(() => {
+  return (spec.value?.price ?? 0) * specNumber;
+});
+
 const formRef = ref<any>(null);
 function goConfirm() {
   if (!formRef.value) return;
   formRef.value.validate().then(({ valid, errors }: any) => {
     if (valid) {
-      // addStandardOrder();
+      addStandardOrder();
     }
   });
 }
@@ -236,44 +249,51 @@
       specName: spec.value.name,
       specPrice: spec.value.price ?? 0,
       specNumber: specNumber,
-      addressId: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
+      addressId: form.addressId,
       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',
-      payAccess: 1,
+      contactPhoneNumber: selectedAddress.value.contactPhoneNumber,
+      provinceCode: selectedAddress.value.provinceCode,
+      provinceContent: selectedAddress.value.provinceContent,
+      cityCode: selectedAddress.value.cityCode,
+      cityContent: selectedAddress.value.cityContent,
+      areaCode: selectedAddress.value.areaCode,
+      areaContent: selectedAddress.value.areaContent,
+      addressName: selectedAddress.value.addressName,
+      addressDetail: selectedAddress.value.addressDetail,
+      longitude: selectedAddress.value.longitude,
+      latitude: selectedAddress.value.latitude,
+      beginTime: dayjs(form.beginTime).format('YYYY-MM-DD HH:mm'),
+      endTime: dayjs(form.endTime).format('YYYY-MM-DD HH:mm'),
+      supplierEnterpriseId: form.supplierEnterpriseId,
+      enterpriseEmployeeIds: [form.enterpriseEmployeeId],
+      remark: form.remark,
+      payAccess: EnumUserBankCardAccess.WeChatPay,
     };
     let res = await standardOrderServices.addStandardOrder(params);
+    if (res) {
+      pay(res);
+    }
   } catch (error) {}
 }
 
-async function pay() {
+async function pay(orderId: string) {
   try {
     let params: API.PayStandardOrderCommand = {
-      id: '9e919af2-3d33-4eac-f6dc-08de429676b3',
+      id: orderId,
     };
     let res = await standardOrderServices.payStandardOrder(params);
     if (res) {
-      Taro.requestPayment({
+      await Taro.requestPayment({
         timeStamp: res.timestamp,
         nonceStr: res.nonceStr,
         package: res.package,
         signType: res.signType as any,
         paySign: res.paySign,
       });
+      Message.success('鏀粯鎴愬姛');
+      Taro.redirectTo({
+        url: `${RouterPath.mineOrderDetail}?id=${orderId}`,
+      });
     }
   } catch (error) {}
 }
@@ -293,5 +313,18 @@
       }
     }
   }
+
+  .addStandardOrder-price-wrapper {
+    display: flex;
+    flex: 2;
+    min-width: 0;
+    align-items: center;
+    padding-left: 28px;
+
+    .addStandardOrder-price-text {
+      font-size: 32px;
+      color: boleGetCssVar('text-color', 'primary');
+    }
+  }
 }
 </style>
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue
new file mode 100644
index 0000000..4bcedfd
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue
@@ -0,0 +1,72 @@
+<template>
+  <InfiniteLoading
+    scrollViewClassName="common-page-infinite-scroll-list"
+    v-bind="infiniteLoadingProps"
+  >
+    <template #renderItem="{ item }">
+      <ChooseServerCard
+        :avatar="item.avatar"
+        :name="item.name"
+        :gender="item.gender"
+        :age="item.age"
+        :isReal="item.isReal"
+        :personalIdentityContent="item.personalIdentityContent"
+        :educationalBackgroundContent="item.educationalBackgroundContent"
+        :taskCount="item.taskCount"
+        :workExperience="item.workExperience"
+      >
+        <template #actions>
+          <nut-button type="primary" plain>鏌ョ湅璇︽儏</nut-button>
+          <nut-button type="primary" @click="handleChoose(item)">閫夋嫨</nut-button>
+        </template>
+      </ChooseServerCard>
+    </template>
+  </InfiniteLoading>
+</template>
+
+<script setup lang="ts">
+import Taro from '@tarojs/taro';
+import * as standardServiceServices from '@12333/services/apiV2/standardService';
+import { useInfiniteLoading } from '@12333/hooks';
+import { EnumPagedListOrder } from '@12333/constants';
+import { useEvent, useEventChannel } from 'senin-mini/hooks';
+import { SelectEnterpriseEmployeeEvent } from '../utils';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const route = Taro.useRouter();
+const id = route.params?.id ?? '';
+
+const eventChannel = useEventChannel();
+
+const { infiniteLoadingProps } = useInfiniteLoading(
+  ({ pageParam }) => {
+    let params: API.GetStandardServiceServersQuery = {
+      pageModel: {
+        rows: 20,
+        page: pageParam,
+        // orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
+      },
+      supplierEnterpriseId: id,
+    };
+
+    return standardServiceServices.getStandardServiceServers(params, {
+      showLoading: false,
+    });
+  },
+  {
+    queryKey: ['standardServiceServices/getStandardServiceServers', id],
+  }
+);
+
+function handleChoose(item: API.GetStandardServiceServersQueryResultItem) {
+  eventChannel.emit('onSelectEnterpriseEmployee', {
+    enterpriseEmployeeId: item.id,
+    supplierEnterpriseId: id,
+    enterpriseEmployeeName: item.name,
+  } as SelectEnterpriseEmployeeEvent);
+  Taro.navigateBack({ delta: 2 });
+}
+</script>
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.config.ts b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.vue b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.vue
new file mode 100644
index 0000000..37ebe22
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.vue
@@ -0,0 +1,13 @@
+<template>
+  <PageLayoutWithBg class="addStandardOrder-page-wrapper" title="閫夋嫨鏈嶅姟浜哄憳">
+    <InnerPage />
+  </PageLayoutWithBg>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'chooseEnterpriseEmployee',
+});
+</script>
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue
new file mode 100644
index 0000000..8634453
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue
@@ -0,0 +1,71 @@
+<template>
+  <InfiniteLoading
+    scrollViewClassName="common-page-infinite-scroll-list"
+    v-bind="infiniteLoadingProps"
+  >
+    <template #renderItem="{ item }">
+      <ChooseSupplierCard
+        :avatar="item.avatar"
+        :name="item.enterpriseName"
+        :mainBusiness="item.mainBusiness"
+        :serverCount="item.serverCount"
+        :serviceCount="item.serviceCount"
+      >
+        <template #actions>
+          <nut-button type="primary" plain>鏌ョ湅璇︽儏</nut-button>
+          <nut-button type="primary" @click="goEnterpriseEmployee(item)">閫夋嫨</nut-button>
+        </template>
+      </ChooseSupplierCard>
+    </template>
+  </InfiniteLoading>
+</template>
+
+<script setup lang="ts">
+import Taro from '@tarojs/taro';
+import * as standardServiceServices from '@12333/services/apiV2/standardService';
+import { useInfiniteLoading } from '@12333/hooks';
+import { EnumPagedListOrder } from '@12333/constants';
+import { useEvent, useEventChannel } from 'senin-mini/hooks';
+import { SelectEnterpriseEmployeeEvent } from '../utils';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const route = Taro.useRouter();
+const id = route.params?.id ?? '';
+
+const eventChannel = useEventChannel();
+
+const { infiniteLoadingProps } = useInfiniteLoading(
+  ({ pageParam }) => {
+    let params: API.GetStandardServiceSupplierEnterprisesQuery = {
+      pageModel: {
+        rows: 20,
+        page: pageParam,
+        // orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
+      },
+      serviceId: id,
+    };
+
+    return standardServiceServices.getStandardServiceSupplierEnterprises(params, {
+      showLoading: false,
+    });
+  },
+  {
+    queryKey: ['standardServiceServices/getStandardServiceSupplierEnterprises', id],
+  }
+);
+
+function goEnterpriseEmployee(item: API.GetStandardServiceSupplierEnterprisesQueryResultItem) {
+  Taro.navigateTo({
+    url: `${RouterPath.chooseEnterpriseEmployee}?id=${item.id}`,
+    events: {
+      onSelectEnterpriseEmployee: function (data: SelectEnterpriseEmployeeEvent) {
+        console.log('SelectEnterpriseEmployeeEvent2: ', data);
+        eventChannel.emit('onSelectEnterpriseEmployee', data);
+      },
+    },
+  });
+}
+</script>
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.config.ts b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue
new file mode 100644
index 0000000..d77734f
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue
@@ -0,0 +1,13 @@
+<template>
+  <PageLayoutWithBg class="addStandardOrder-page-wrapper" title="閫夋嫨鏈嶅姟鏈烘瀯">
+    <InnerPage />
+  </PageLayoutWithBg>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'chooseSupplier',
+});
+</script>
diff --git a/apps/housekeepingMiniApp/src/subpackages/sercice/utils/index.ts b/apps/housekeepingMiniApp/src/subpackages/sercice/utils/index.ts
new file mode 100644
index 0000000..f48e83a
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/sercice/utils/index.ts
@@ -0,0 +1,5 @@
+export type SelectEnterpriseEmployeeEvent = {
+  supplierEnterpriseId: string;
+  enterpriseEmployeeId: string;
+  enterpriseEmployeeName: string;
+};
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index 6a1091c..2523804 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -59,3 +59,4 @@
 export { default as ProCategory } from './Category/Category.vue';
 export { default as ServiceDetailAddressCard } from './Card/ServiceDetailAddressCard.vue';
 export { default as ServiceDetailGoodCard } from './Card/ServiceDetailGoodCard.vue';
+export { default as ChooseInput } from './Input/ChooseInput.vue';
diff --git a/packages/services/apiV2/typings.d.ts b/packages/services/apiV2/typings.d.ts
index 64a26d8..62cea36 100644
--- a/packages/services/apiV2/typings.d.ts
+++ b/packages/services/apiV2/typings.d.ts
@@ -5742,8 +5742,26 @@
     name?: string;
     /** 鑱旂郴鐢佃瘽 */
     contactPhoneNumber?: string;
-    /** 鐪佸競鍖�+璇︾粏鍦板潃+闂ㄧ墝鍙� */
+    /** 鐪佷唤缂栧彿 */
+    provinceCode?: string;
+    /** 鐪佷唤 */
+    provinceContent?: string;
+    /** 鍩庡競缂栧彿 */
+    cityCode?: string;
+    /** 鍩庡競 */
+    cityContent?: string;
+    /** 鍖虹紪鍙� */
+    areaCode?: string;
+    /** 鍖� */
+    areaContent?: string;
+    /** 璇︾粏鍦板潃 */
+    addressName?: string;
+    /** 闂ㄧ墝鍙� */
     addressDetail?: string;
+    /** 缁忓害 */
+    longitude?: number;
+    /** 绾害 */
+    latitude?: number;
     /** 鏄惁榛樿 */
     isDefault?: boolean;
   }

--
Gitblit v1.10.0