wupengfei
8 小时以前 f94468cc4f52ca3a68817592e4ff92f815c835c7
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
已修改7个文件
已添加10个文件
663 ■■■■■ 文件已修改
apps/housekeepingMiniApp/project.private.config.json 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/app.config.ts 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/Card/ChooseServerCard.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/Card/ChooseSupplierCard.vue 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/Input/ChooseInputWithSuppliers.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/constants/router.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/utils/index.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
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',
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>
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>
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>
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',
}
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,
    });
  },
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>
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>
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee.config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
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>
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>
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
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>
apps/housekeepingMiniApp/src/subpackages/sercice/utils/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
export type SelectEnterpriseEmployeeEvent = {
  supplierEnterpriseId: string;
  enterpriseEmployeeId: string;
  enterpriseEmployeeName: string;
};
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';
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;
  }