1d472eb06970c85b0edfb58871956bc2c8d69916..47047d626ea8fab28c04e6534fe6ffa3dc61de69
5 小时以前 wupengfei
feat: init
47047d 对比 | 目录
5 小时以前 wupengfei
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
d71166 对比 | 目录
5 小时以前 wupengfei
fix: 越过微信审核
0fabf3 对比 | 目录
5 小时以前 zhengyiming
fix: 甲方小程序
3b53f8 对比 | 目录
5 小时以前 zhengyiming
fix: 甲方小程序
6f0dd9 对比 | 目录
5 小时以前 zhengyiming
fix: 甲方小程序
0b13d5 对比 | 目录
5 小时以前 zhengyiming
fix: 甲方小程序
78bc3b 对比 | 目录
5 小时以前 zhengyiming
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
8ea39b 对比 | 目录
5 小时以前 zhengyiming
fix: 甲方小程序
021711 对比 | 目录
6 小时以前 wupengfei
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
f94468 对比 | 目录
6 小时以前 wupengfei
feat: init
fd8b2c 对比 | 目录
7 小时以前 zhengyiming
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
89ec68 对比 | 目录
7 小时以前 zhengyiming
fix: 甲方小程序
c3055e 对比 | 目录
10 小时以前 wupengfei
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
a151ae 对比 | 目录
10 小时以前 wupengfei
feat: init
ce489f 对比 | 目录
11 小时以前 zhengyiming
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
28ac7f 对比 | 目录
11 小时以前 zhengyiming
fix: 甲方小程序
1f2956 对比 | 目录
11 小时以前 wupengfei
feat: init
e213f4 对比 | 目录
已修改32个文件
已添加11个文件
2146 ■■■■ 文件已修改
apps/bStandardMiniApp/src/subpackages/appointmentManage/appointmentManage/InnerPage.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/src/subpackages/appointmentManage/appointmentManageDetail/InnerPage.vue 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/src/subpackages/orderManage/orderManage/InnerPage.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/src/subpackages/orderManage/orderManageDetail/InnerPage.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/mine/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/stores/modules/system.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/wallet/mineWallet/InnerPage.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/project.private.config.json 85 ●●●●● 补丁 | 查看 | 原始文档 | 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 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/constants/router.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/pages/mine/index.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/styles/index.scss 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineOrderDetail/InnerPage.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineOrderManage/InnerPage.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveServiceCancel/InnerPage.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveServiceDetail/InnerPage.vue 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue 73 ●●●●● 补丁 | 查看 | 原始文档 | 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 72 ●●●●● 补丁 | 查看 | 原始文档 | 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 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/MineServiceDetailView.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/ReserveServiceCard.vue 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/TaskPrice.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/List/List.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/List/ListItem.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/standardOrder.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/standardOrder.ts 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/standardOrder.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/taskUser.ts 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/user.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/src/subpackages/appointmentManage/appointmentManage/InnerPage.vue
@@ -1,6 +1,6 @@
<template>
  <ProTabs
    v-model="queryState.status"
    v-model="queryState.appointmentStatus"
    name="home-tab"
    :showPaneContent="false"
    class="home-tabs"
@@ -11,35 +11,40 @@
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane
      :title="`待确认`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitHire"
      :pane-key="EnumStandardOrderAppointmentStatus.WaitSure"
    ></ProTabPane>
    <ProTabPane
      :title="`待服务`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitSignContract"
      :pane-key="EnumStandardOrderAppointmentStatus.WaitServe"
    ></ProTabPane>
    <ProTabPane
      :title="`已完成`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.HireRefuse"
      :pane-key="EnumStandardOrderAppointmentStatus.Completed"
    ></ProTabPane>
    <ProTabPane :title="`已取消`" :pane-key="40"></ProTabPane>
    <ProTabPane
      :title="`已取消`"
      :pane-key="EnumStandardOrderAppointmentStatus.Cancelled"
    ></ProTabPane>
  </ProTabs>
  <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"
        :serviceFee="item.serviceFee"
        :end-time="item.endTime"
        :billing-method="item.billingMethod"
        :benefits="item.benefits"
        :service-fee="item.serviceFee"
        :settlement-cycle="item.settlementCycle"
        :address-name="item.addressName"
        :supplierEnterpriseName="item.supplierEnterpriseName"
        :address-detail="item.addressDetail"
        :appointmentStatus="item.appointmentStatus"
        @click="goDetail(item)"
      >
        <template #serviceCustome>
          {{ `服务人员:${item.serverNames}` }}
        </template>
      </ReserveServiceCard>
    </template>
  </InfiniteLoading>
@@ -47,40 +52,15 @@
<script setup lang="ts">
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 { useGetStandardOrders } from '@12333/hooks';
import { EnumStandardOrderAppointmentStatus } from '@12333/constants';
import Taro from '@tarojs/taro';
defineOptions({
  name: 'InnerPage',
});
const queryState = reactive({
  status: 0 as any as GetPersonalApplyTaskInfosQueryStatus,
});
const userStore = useUserStore();
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetTaskInfosQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
        orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
      },
    };
    return taskServices.getOpenTaskInfos(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['taskServices/getOpenTaskInfos', queryState],
  }
);
const { queryState, infiniteLoadingProps } = useGetStandardOrders();
function goDetail(item: any) {
  Taro.navigateTo({
apps/bStandardMiniApp/src/subpackages/appointmentManage/appointmentManageDetail/InnerPage.vue
@@ -1,13 +1,36 @@
<template>
  <!-- <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> -->
  <ContentScrollView hasPaddingTop>
    <MineServiceDetailView />
    <MineServiceDetailView
      :contactName="detail?.name"
      :contactPhoneNumber="detail?.contactPhoneNumber"
      :addressDetail="detail?.addressDetail"
      :serviceName="detail?.serviceName"
      :price="detail?.specPrice"
      :specName="detail?.specName"
      :specNumber="detail?.specNumber"
      :imgUrl="detail?.serviceFile"
      statusText="预约状态"
      :beginTime="detail?.beginTime"
      :endTime="detail?.endTime"
      :supplierEnterpriseName="detail?.supplierEnterpriseName"
      :remark="detail?.remark"
    >
      <template #status>
        {{ EnumStandardOrderAppointmentStatusText[detail?.appointmentStatus] }}
      </template>
    </MineServiceDetailView>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" class="business-card-btn" @click="goCancel"
  <PageFooter
    v-if="
      detail?.appointmentStatus === EnumStandardOrderAppointmentStatus.WaitSure &&
      detail?.payStatus !== EnumStandardOrderPayStatus.Completed
    "
  >
    <PageFooterBtn class="business-card-btn" @click="cancelStandardOrderAppointment"
      >取消预约</PageFooterBtn
    >
    <PageFooterBtn type="primary" class="business-card-btn" @click="goConfirm"
    <PageFooterBtn type="primary" class="business-card-btn" @click="handleSubmit"
      >确认预约</PageFooterBtn
    >
  </PageFooter>
@@ -17,8 +40,15 @@
<script setup lang="ts">
import { MineServiceDetailView } from '@12333/components';
import Taro from '@tarojs/taro';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import { RouterPath } from '@/constants';
import {
  EnumStandardOrderPayStatus,
  EnumStandardOrderAppointmentStatus,
  EnumStandardOrderAppointmentStatusText,
} from '@12333/constants';
import { useStandardOrder } from '@12333/hooks';
import { Message } from '@12333/utils';
import { goBack } from '@/utils';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
defineOptions({
  name: 'InnerPage',
@@ -27,9 +57,36 @@
const route = Taro.useRouter();
const id = route.params?.id as string;
function goCancel() {}
const { detail } = useStandardOrder({
  id: id,
});
function goConfirm() {}
async function cancelStandardOrderAppointment() {
  try {
    await Message.confirm({ message: '确认要取消预约吗?' });
    let params: API.CancelStandardOrderAppointmentCommand = {
      id: id,
    };
    let res = await standardOrderServices.cancelStandardOrderAppointment(params);
    if (res) {
      Message.success('操作成功');
      goBack();
    }
  } catch (error) {}
}
async function handleSubmit() {
  try {
    let params: API.SureStandardOrderAppointmentCommand = {
      id: id,
    };
    let res = await standardOrderServices.sureStandardOrderAppointment(params);
    if (res) {
      Message.success('操作成功');
      goBack();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/bStandardMiniApp/src/subpackages/orderManage/orderManage/InnerPage.vue
@@ -1,6 +1,6 @@
<template>
  <ProTabs
    v-model="queryState.status"
    v-model="queryState.supplierEnterpriseOrderStatus"
    name="home-tab"
    :showPaneContent="false"
    class="home-tabs"
@@ -10,35 +10,39 @@
  >
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane
      :title="`待支付`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitHire"
    ></ProTabPane>
    <ProTabPane
      :title="`已支付`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitSignContract"
      :title="`待收款`"
      :pane-key="EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus.Wait"
    ></ProTabPane>
    <ProTabPane
      :title="`已完成`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.HireRefuse"
      :pane-key="EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus.Completed"
    ></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
    v-bind="infiniteLoadingProps"
    :key="queryState.status"
    :key="queryState.supplierEnterpriseOrderStatus"
  >
    <template #renderItem="{ item }">
      <ReserveServiceCard
        :name="item.name"
        :serviceName="item.serviceName"
        :begin-time="item.beginTime"
        :serviceFee="item.serviceFee"
        :end-time="item.endTime"
        :billing-method="item.billingMethod"
        :benefits="item.benefits"
        :service-fee="item.serviceFee"
        :settlement-cycle="item.settlementCycle"
        :address-name="item.addressName"
        :supplierEnterpriseName="item.supplierEnterpriseName"
        :address-detail="item.addressDetail"
        @click="goOrderDetail(item)"
      >
        <template #status>
          {{
            EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatusText[
              item.supplierEnterpriseOrderStatus
            ]
          }}
        </template>
        <template #serviceCustome>
          {{ `服务人员:${item.serverNames}` }}
        </template>
      </ReserveServiceCard>
    </template>
  </InfiniteLoading>
@@ -46,40 +50,18 @@
<script setup lang="ts">
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 { useGetStandardOrders } from '@12333/hooks';
import {
  EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus,
  EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatusText,
} from '@12333/constants';
import Taro from '@tarojs/taro';
defineOptions({
  name: 'InnerPage',
});
const queryState = reactive({
  status: 0 as any as GetPersonalApplyTaskInfosQueryStatus,
});
const userStore = useUserStore();
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetTaskInfosQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
        orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
      },
    };
    return taskServices.getOpenTaskInfos(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['taskServices/getOpenTaskInfos', queryState],
  }
);
const { queryState, infiniteLoadingProps } = useGetStandardOrders();
function goOrderDetail(item: any) {
  Taro.navigateTo({
apps/bStandardMiniApp/src/subpackages/orderManage/orderManageDetail/InnerPage.vue
@@ -1,23 +1,38 @@
<template>
  <!-- <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> -->
  <ContentScrollView hasPaddingTop>
    <MineServiceDetailView />
    <MineServiceDetailView
      :contactName="detail?.name"
      :contactPhoneNumber="detail?.contactPhoneNumber"
      :addressDetail="detail?.addressDetail"
      :serviceName="detail?.serviceName"
      :price="detail?.specPrice"
      :specName="detail?.specName"
      :specNumber="detail?.specNumber"
      :imgUrl="detail?.serviceFile"
      statusText="订单状态"
      :beginTime="detail?.beginTime"
      :endTime="detail?.endTime"
      :supplierEnterpriseName="detail?.supplierEnterpriseName"
      :remark="detail?.remark"
    >
      <template #status>
        {{
          EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatusText[
            detail?.supplierEnterpriseOrderStatus
          ]
        }}
      </template>
    </MineServiceDetailView>
  </ContentScrollView>
  <PageFooter class="order-settle-bar">
    <div class="order-settle-price-wrapper">
      <div class="order-settle-price-label">支付:</div>
      <nut-price :price="155" size="large" />
    </div>
    <PageFooterBtn type="primary" class="business-card-btn">立即下单</PageFooterBtn>
  </PageFooter>
  <!-- </LoadingLayout> -->
</template>
<script setup lang="ts">
import { MineServiceDetailView } from '@12333/components';
import Taro from '@tarojs/taro';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import { useCheckReceiveTaskUserSubmit } from '@12333/hooks';
import { EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatusText } from '@12333/constants';
import { useStandardOrder } from '@12333/hooks';
defineOptions({
  name: 'InnerPage',
@@ -25,6 +40,10 @@
const route = Taro.useRouter();
const id = route.params?.id as string;
const { detail } = useStandardOrder({
  id: id,
});
</script>
<style lang="scss">
apps/cMiniApp/src/pages/mine/index.vue
@@ -34,8 +34,9 @@
                      class="user-info-unCertified-btn"
                      @click.stop="goAuthentication"
                      v-if="
                        userDetail?.realStatus === EnumPersonalUserRealStatus.UnReal ||
                        userDetail?.realStatus === EnumPersonalUserRealStatus.Fail
                        (userDetail?.realStatus === EnumPersonalUserRealStatus.UnReal ||
                          userDetail?.realStatus === EnumPersonalUserRealStatus.Fail) &&
                        !hideTemplate
                      "
                    >
                      ç«‹å³è®¤è¯
@@ -178,6 +179,7 @@
const systemStore = useSystemStore();
const { goLoginFn } = useGoLogin();
const bgHeight = computed(() => 133 + systemStore.navHeight);
const hideTemplate = computed(() => systemStore.isWeappCheck);
useQuery({
  queryKey: ['updateUserInfo'],
apps/cMiniApp/src/stores/modules/system.ts
@@ -1,6 +1,7 @@
import Taro from '@tarojs/taro';
import { defineStore } from 'pinia';
import { store } from '@/stores';
import * as settingsServices from '@12333/services/apiV2/settings';
export interface Options {
  path: string;
@@ -17,6 +18,7 @@
  redirectPath: string;
  isTabSwitch: boolean;
  isFirstEnter: boolean;
  isWeappCheck: boolean;
}
export const useSystemStore = defineStore({
@@ -51,9 +53,18 @@
    menuButtonTop: 0,
    isFirstEnter: true,
    isWeappCheck: true,
  }),
  actions: {
    async getAppConfig() {
      try {
        let res = await settingsServices.getWxmpSettings({});
        this.isWeappCheck = res.wxmpAuditInProcess;
      } catch (error) {}
    },
    init(options: Options) {
      this.options = options; // æ”¾ä¸€ä¸‹é¡µé¢ç›¸å…³çš„æ•°æ®ä¾‹å¦‚scene等 é¡µé¢é«˜åº¦ä¹‹ç±»çš„不存!
    },
apps/cMiniApp/src/subpackages/wallet/mineWallet/InnerPage.vue
@@ -5,20 +5,23 @@
  </div> -->
  <List>
    <ListItem title="收入明细" @click="goIncomeDetail"> </ListItem>
    <ListItem title="银行卡" @click="goBankBind">
      <template #extra>
        <div class="bind-bank-card">
          {{ isBindBank ? '已绑定' : '未绑定、立即绑定' }}
        </div>
      </template>
    </ListItem>
    <ListItem title="支付宝" @click="goBankAlipay">
      <template #extra>
        <div class="bind-bank-card">
          {{ isBindAlipay ? '已绑定' : '未绑定、立即绑定' }}
        </div>
      </template>
    </ListItem>
    <template v-if="!hideTemplate">
      <ListItem title="银行卡" @click="goBankBind">
        <template #extra>
          <div class="bind-bank-card">
            {{ isBindBank ? '已绑定' : '未绑定、立即绑定' }}
          </div>
        </template>
      </ListItem>
      <ListItem title="支付宝" @click="goBankAlipay">
        <template #extra>
          <div class="bind-bank-card">
            {{ isBindAlipay ? '已绑定' : '未绑定、立即绑定' }}
          </div>
        </template>
      </ListItem>
    </template>
    <ListItem title="微信">
      <template #extra>
        <div class="bind-bank-card">
@@ -30,6 +33,7 @@
</template>
<script setup lang="ts">
import { useSystemStore } from '@/stores/modules/system';
import { List, ListItem, WithdrawMoneyCard } from '@12333/components';
import { EnumUserBankCardAccess } from '@12333/constants';
import Taro from '@tarojs/taro';
@@ -38,8 +42,12 @@
  name: 'InnerPage',
});
const systemStore = useSystemStore();
const { userDetail, isBindBank, isBindAlipay, isBindWechat } = useUser();
const hideTemplate = computed(() => systemStore.isWeappCheck);
function goIncomeDetail() {
  Taro.navigateTo({
    url: `${RouterPath.incomeDetail}`,
apps/housekeepingMiniApp/project.private.config.json
@@ -23,16 +23,65 @@
        "miniprogram": {
            "list": [
                {
                    "name": "选择地址",
                    "pathName": "subpackages/mine/addressManange/addressManange",
                    "query": "type=select",
                    "name": "订单详情",
                    "pathName": "subpackages/mine/mineOrderDetail/mineOrderDetail",
                    "query": "id=d16809d3-e6b9-4b5f-2e87-08de443f2678",
                    "scene": null,
                    "launchMode": "default"
                },
                {
                    "name": "取消原因",
                    "pathName": "subpackages/mine/mineReserveServiceCancel/mineReserveServiceCancel",
                    "query": "id=d16809d3-e6b9-4b5f-2e87-08de443f2678",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "我的预约详情",
                    "pathName": "subpackages/mine/mineReserveServiceDetail/mineReserveServiceDetail",
                    "query": "id=d16809d3-e6b9-4b5f-2e87-08de443f2678",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "预约详情",
                    "pathName": "subpackages/mine/mineReserveServiceDetail/mineReserveServiceDetail",
                    "query": "id=ca8c17a1-6c44-446e-2e88-08de443f2678",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "预约下单",
                    "pathName": "subpackages/sercice/addStandardOrder/addStandardOrder",
                    "query": "specNumber=1&specId=72ec3beb-90dc-473b-d214-08de429af188&id=53208c5d-a823-40d3-e79e-08de429af17b",
                    "query": "specNumber=1&specId=ccdc16fb-d842-4e66-bdf5-08de43546a8c&id=e4df3802-1e9b-4b21-4ef6-08de43551f52",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "选择服务人员",
                    "pathName": "subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee",
                    "query": "id=cc8c3ad3-522a-4b5e-c1ca-08de41c6b930",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "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
                },
@@ -44,13 +93,6 @@
                    "scene": null
                },
                {
                    "name": "服务详情",
                    "pathName": "subpackages/sercice/serciceDetail/serciceDetail",
                    "query": "id=53208c5d-a823-40d3-e79e-08de429af17b",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "服务确认",
                    "pathName": "subpackages/mine/mineReserveServiceConfirm/mineReserveServiceConfirm",
                    "query": "id=undefined",
@@ -58,27 +100,6 @@
                    "scene": null
                },
                {
                    "name": "取消原因",
                    "pathName": "subpackages/mine/mineReserveServiceCancel/mineReserveServiceCancel",
                    "query": "id=undefined",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "预约详情",
                    "pathName": "subpackages/mine/mineReserveServiceDetail/mineReserveServiceDetail",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "订单详情",
                    "pathName": "subpackages/mine/mineOrderDetail/mineOrderDetail",
                    "query": "id=123",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "地址管理",
                    "pathName": "subpackages/mine/addressManange/addressManange",
                    "query": "",
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,55 @@
<template>
  <ChooseInput :modelValue="supplierEnterpriseName" @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 supplierEnterpriseName = defineModel<string>('supplierEnterpriseName');
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;
        supplierEnterpriseName.value = data.supplierEnterpriseName;
      },
    },
  });
}
</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/pages/mine/index.vue
@@ -27,7 +27,7 @@
      <List class="mine-list-wrapper mine-order-list">
        <div class="mine-order-list-title">
          <div class="mine-order-list-title-text">我的预约</div>
          <div class="mine-order-list-title-arrow-wrapper" @click="goMineReserveService">
          <div class="mine-order-list-title-arrow-wrapper" @click="goMineReserveService()">
            <div class="mine-order-list-title-sub-text">全部预约</div>
            <img :src="IconArrow" class="mine-order-list-title-icon" />
          </div>
@@ -37,7 +37,7 @@
            class="mine-order-list-item"
            top="8"
            :dot="false"
            @click="goMineReserveService"
            @click="goMineReserveService(EnumStandardOrderAppointmentStatus.WaitSure)"
          >
            <img :src="IconOrderSign" class="mine-order-list-icon" />
            <div class="mine-order-list-text">待确认</div>
@@ -46,7 +46,7 @@
            class="mine-order-list-item"
            top="8"
            :dot="false"
            @click="goMineReserveService"
            @click="goMineReserveService(EnumStandardOrderAppointmentStatus.WaitServe)"
          >
            <img :src="IconOrderHire" class="mine-order-list-icon" />
            <div class="mine-order-list-text">待服务</div>
@@ -55,7 +55,7 @@
            class="mine-order-list-item"
            top="8"
            :dot="false"
            @click="goMineReserveService"
            @click="goMineReserveService(EnumStandardOrderAppointmentStatus.Completed)"
          >
            <img :src="IconOrderHire" class="mine-order-list-icon" />
            <div class="mine-order-list-text">已完成</div>
@@ -64,7 +64,7 @@
            class="mine-order-list-item"
            top="8"
            :dot="false"
            @click="goMineReserveService"
            @click="goMineReserveService(EnumStandardOrderAppointmentStatus.Cancelled)"
          >
            <img :src="IconOrderCancel" class="mine-order-list-icon" />
            <div class="mine-order-list-text">已取消</div>
@@ -105,6 +105,7 @@
import { useSystemStore } from '@/stores/modules/system';
import PageLayoutWithBg from '@/components/Layout/PageLayoutWithBg.vue';
import { useQuery } from '@tanstack/vue-query';
import { EnumStandardOrderAppointmentStatus } from '@12333/constants';
const { userDetail, updateUserInfo, displayName } = useUser();
const isLogin = useIsLogin();
@@ -154,8 +155,8 @@
  goPage(RouterPath.mineCollectTask);
}
function goMineReserveService() {
  goPage(RouterPath.mineReserveService);
function goMineReserveService(status: EnumStandardOrderAppointmentStatus = 0 as any) {
  goPage(`${RouterPath.mineReserveService}?status=${status}`);
}
function goMineOrderManage() {
apps/housekeepingMiniApp/src/styles/index.scss
@@ -77,6 +77,11 @@
  padding-top: 16px;
}
.common-infinite-scroll-list-no-padding {
  @include listScrollViewWithNoPadding;
  padding-top: 16px;
}
.id-imgUrl-wrapper {
  display: flex;
  gap: 40px;
apps/housekeepingMiniApp/src/subpackages/mine/mineOrderDetail/InnerPage.vue
@@ -1,23 +1,67 @@
<template>
  <!-- <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> -->
  <ContentScrollView hasPaddingTop>
    <MineServiceDetailView />
  </ContentScrollView>
  <PageFooter class="order-settle-bar">
    <div class="order-settle-price-wrapper">
      <div class="order-settle-price-label">支付:</div>
      <nut-price :price="155" size="large" />
    </div>
    <PageFooterBtn type="primary" class="business-card-btn">立即下单</PageFooterBtn>
  </PageFooter>
  <!-- </LoadingLayout> -->
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
    <InfiniteLoading
      commonMode
      :refetch="refetch"
      :isLoading="isLoading"
      :isError="isError"
      :showMoreText="false"
      scrollViewClassName="common-page-infinite-scroll-list"
    >
      <MineServiceDetailView
        :contactName="detail?.name"
        :contactPhoneNumber="detail?.contactPhoneNumber"
        :addressDetail="detail?.addressDetail"
        :serviceName="detail?.serviceName"
        :price="detail?.specPrice"
        :specName="detail?.specName"
        :specNumber="detail?.specNumber"
        :imgUrl="detail?.serviceFile"
        statusText="订单状态"
        :beginTime="detail?.beginTime"
        :endTime="detail?.endTime"
        :supplierEnterpriseName="detail?.supplierEnterpriseName"
        :remark="detail?.remark"
        :serverContactPhoneNumbers="detail?.serverContactPhoneNumbers"
      >
        <template #status>
          {{
            EnumGetStandardOrdersQueryPartAEnterpriseOrderStatusText[
              detail?.partAEnterpriseOrderStatus
            ]
          }}
        </template>
      </MineServiceDetailView>
    </InfiniteLoading>
    <PageFooter
      class="order-settle-bar"
      v-if="
        detail?.partAEnterpriseOrderStatus ===
        EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Wait
      "
    >
      <div class="order-settle-price-wrapper">
        <div class="order-settle-price-label">支付:</div>
        <nut-price :price="detail.payAmount" size="large" />
      </div>
      <PageFooterBtn type="primary" class="business-card-btn" @click="payStandardOrder"
        >立即下单</PageFooterBtn
      >
    </PageFooter>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { MineServiceDetailView } from '@12333/components';
import Taro from '@tarojs/taro';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import { useCheckReceiveTaskUserSubmit } from '@12333/hooks';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
import { useStandardOrder } from '@12333/hooks';
import {
  EnumGetStandardOrdersQueryPartAEnterpriseOrderStatusText,
  EnumGetStandardOrdersQueryScene,
  EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus,
} from '@12333/constants';
import { Message } from '@12333/utils';
defineOptions({
  name: 'InnerPage',
@@ -25,6 +69,36 @@
const route = Taro.useRouter();
const id = route.params?.id as string;
const { detail, isLoading, isError, refetch } = useStandardOrder({
  id,
  scene: EnumGetStandardOrdersQueryScene.PartAEnterpriseOrder,
  refetchInterval: 3000,
});
Taro.useDidShow(() => {
  refetch();
});
async function payStandardOrder() {
  try {
    let params: API.PayStandardOrderCommand = {
      id: id,
    };
    let res = await standardOrderServices.payStandardOrder(params);
    if (res) {
      await Taro.requestPayment({
        timeStamp: res.timestamp,
        nonceStr: res.nonceStr,
        package: res.package,
        signType: res.signType as any,
        paySign: res.paySign,
      });
      Message.success('支付成功');
      refetch();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/housekeepingMiniApp/src/subpackages/mine/mineOrderManage/InnerPage.vue
@@ -1,6 +1,6 @@
<template>
  <ProTabs
    v-model="queryState.status"
    v-model="queryState.partAEnterpriseOrderStatus"
    name="home-tab"
    :showPaneContent="false"
    class="home-tabs"
@@ -11,34 +11,39 @@
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane
      :title="`待支付`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitHire"
      :pane-key="EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Wait"
    ></ProTabPane>
    <ProTabPane
      :title="`已支付`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitSignContract"
      :pane-key="EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Pay"
    ></ProTabPane>
    <ProTabPane
      :title="`已完成`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.HireRefuse"
      :pane-key="EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Completed"
    ></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
    v-bind="infiniteLoadingProps"
    :key="queryState.status"
    :key="queryState.partAEnterpriseOrderStatus"
  >
    <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"
        :supplierEnterpriseName="item.supplierEnterpriseName"
        :payAmount="item.payAmount"
        @click="goMineOrderDetail(item)"
      >
        <template #status>
          {{
            EnumGetStandardOrdersQueryPartAEnterpriseOrderStatusText[
              item.partAEnterpriseOrderStatus
            ]
          }}
        </template>
      </ReserveServiceCard>
    </template>
  </InfiniteLoading>
@@ -48,8 +53,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 {
  EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus,
  EnumGetStandardOrdersQueryScene,
  EnumPagedListOrder,
  EnumGetStandardOrdersQueryPartAEnterpriseOrderStatusText,
} from '@12333/constants';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
import Taro from '@tarojs/taro';
defineOptions({
@@ -57,27 +67,33 @@
});
const queryState = reactive({
  status: 0 as any as GetPersonalApplyTaskInfosQueryStatus,
  partAEnterpriseOrderStatus: 0 as any as EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus,
  scene: EnumGetStandardOrdersQueryScene.PartAEnterpriseOrder,
});
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.partAEnterpriseOrderStatus)) {
      params.partAEnterpriseOrderStatus = queryState.partAEnterpriseOrderStatus;
    }
    return standardOrderServices.getStandardOrders(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['taskServices/getOpenTaskInfos', queryState],
    queryKey: ['standardOrderServices/getStandardOrders', queryState],
  }
);
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"
@@ -11,33 +11,35 @@
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane
      :title="`待确认`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitHire"
      :pane-key="EnumStandardOrderAppointmentStatus.WaitSure"
    ></ProTabPane>
    <ProTabPane
      :title="`待服务`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.WaitSignContract"
      :pane-key="EnumStandardOrderAppointmentStatus.WaitServe"
    ></ProTabPane>
    <ProTabPane
      :title="`已完成`"
      :pane-key="GetPersonalApplyTaskInfosQueryStatus.HireRefuse"
      :pane-key="EnumStandardOrderAppointmentStatus.Completed"
    ></ProTabPane>
    <ProTabPane :title="`已取消`" :pane-key="40"></ProTabPane>
    <ProTabPane
      :title="`已取消`"
      :pane-key="EnumStandardOrderAppointmentStatus.Cancelled"
    ></ProTabPane>
  </ProTabs>
  <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"
        :supplierEnterpriseName="item.supplierEnterpriseName"
        :payAmount="item.payAmount"
        @click="goSerciceDetail(item)"
      >
      </ReserveServiceCard>
@@ -49,42 +51,61 @@
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,
} from '@12333/constants';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
import Taro from '@tarojs/taro';
defineOptions({
  name: 'InnerPage',
});
const route = Taro.useRouter();
const status = route.params?.status as any as EnumStandardOrderAppointmentStatus;
const queryState = reactive({
  status: 0 as any as GetPersonalApplyTaskInfosQueryStatus,
  scene: EnumGetStandardOrdersQueryScene.PartAEnterpriseOrder,
  appointmentStatus: status ? Number(status) : 0,
});
const userStore = useUserStore();
// onMounted(() => {
//   standardOrderServices.checkPayStandardOrder({
//     id: 'ca8c17a1-6c44-446e-2e88-08de443f2678',
//   });
// });
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,
    });
  },
  {
    queryKey: ['taskServices/getOpenTaskInfos', queryState],
    queryKey: ['standardOrderServices/getStandardOrders', queryState],
  }
);
function goSerciceDetail(item: any) {
  Taro.navigateTo({
    url: `${RouterPath.serciceDetail}?id=${item.id}`,
    url: `${RouterPath.mineReserveServiceDetail}?id=${item.id}`,
  });
}
</script>
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveServiceCancel/InnerPage.vue
@@ -13,8 +13,10 @@
<script setup lang="ts">
import Taro from '@tarojs/taro';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { Message } from '@12333/utils';
import { goBack } from '@/utils';
defineOptions({
  name: 'InnerPage',
@@ -43,6 +45,18 @@
async function confirm() {
  try {
    let params: API.CancelStandardOrderAppointmentCommand = {
      id: id,
      appointmentCancelReason: form.reason,
    };
    let res = await standardOrderServices.cancelStandardOrderAppointment(params);
    if (res) {
      Message.success('操作成功', {
        onClosed() {
          goBack();
        },
      });
    }
  } catch (error) {}
}
</script>
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveServiceDetail/InnerPage.vue
@@ -1,17 +1,57 @@
<template>
  <!-- <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> -->
  <ContentScrollView hasPaddingTop>
    <MineServiceDetailView />
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" class="business-card-btn" @click="goCancel"
      >取消服务</PageFooterBtn
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
    <InfiniteLoading
      commonMode
      :refetch="refetch"
      :isLoading="isLoading"
      :isError="isError"
      :showMoreText="false"
      scrollViewClassName="common-page-infinite-scroll-list"
    >
    <PageFooterBtn type="primary" class="business-card-btn" @click="goConfirm"
      >服务确认</PageFooterBtn
    >
  </PageFooter>
  <!-- </LoadingLayout> -->
      <MineServiceDetailView
        :contactName="detail?.name"
        :contactPhoneNumber="detail?.contactPhoneNumber"
        :addressDetail="detail?.addressDetail"
        :serviceName="detail?.serviceName"
        :price="detail?.specPrice"
        :specName="detail?.specName"
        :specNumber="detail?.specNumber"
        :imgUrl="detail?.serviceFile"
        statusText="预约状态"
        :beginTime="detail?.beginTime"
        :endTime="detail?.endTime"
        :supplierEnterpriseName="detail?.supplierEnterpriseName"
        :remark="detail?.remark"
        :serverContactPhoneNumbers="detail?.serverContactPhoneNumbers"
        :showServerContactPhoneNumbers="
          detail.appointmentStatus === EnumStandardOrderAppointmentStatus.WaitServe
        "
      >
        <template #status>
          {{ EnumStandardOrderAppointmentStatusText[detail?.appointmentStatus] }}
        </template>
      </MineServiceDetailView>
    </InfiniteLoading>
    <PageFooter>
      <PageFooterBtn
        type="primary"
        class="business-card-btn"
        v-if="detail.appointmentStatus === EnumStandardOrderAppointmentStatus.WaitSure"
        @click="goCancel"
        >取消服务</PageFooterBtn
      >
      <PageFooterBtn
        type="primary"
        class="business-card-btn"
        v-if="
          detail.taskCheckReceiveStatus == EnumTaskCheckReceiveStatus.Completed &&
          detail.appointmentStatus === EnumStandardOrderAppointmentStatus.WaitServe
        "
        @click="goConfirm"
        >服务确认</PageFooterBtn
      >
    </PageFooter>
  </LoadingLayout>
</template>
<script setup lang="ts">
@@ -19,6 +59,13 @@
import Taro from '@tarojs/taro';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import { RouterPath } from '@/constants';
import { useStandardOrder } from '@12333/hooks';
import {
  EnumStandardOrderAppointmentStatusText,
  EnumStandardOrderAppointmentStatus,
  EnumTaskCheckReceiveStatus,
  EnumGetStandardOrdersQueryScene,
} from '@12333/constants';
defineOptions({
  name: 'InnerPage',
@@ -27,6 +74,15 @@
const route = Taro.useRouter();
const id = route.params?.id as string;
const { detail, isLoading, isError, refetch } = useStandardOrder({
  id,
  scene: EnumGetStandardOrdersQueryScene.PartAEnterpriseOrder,
});
Taro.useDidShow(() => {
  refetch();
});
function goCancel() {
  Taro.navigateTo({
    url: `${RouterPath.mineReserveServiceCancel}?id=${id}`,
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue
@@ -58,6 +58,23 @@
          ></ChooseInputWithDatePicker>
        </nut-form-item>
        <nut-form-item
          label="服务机构:"
          class="bole-form-item"
          prop="enterpriseEmployeeId"
          label-width="90px"
        >
          <ChooseInputWithSuppliers
            v-model:supplierEnterpriseId="form.supplierEnterpriseId"
            placeholder="请选择"
            :serviceId="id"
            :beginTime="form.beginTime"
            :endTime="form.endTime"
            v-model:enterpriseEmployeeId="form.enterpriseEmployeeId"
            v-model:enterpriseEmployeeName="form.enterpriseEmployeeName"
            v-model:supplierEnterpriseName="form.supplierEnterpriseName"
          ></ChooseInputWithSuppliers>
        </nut-form-item>
        <nut-form-item
          label="备注:"
          class="bole-form-item alignTop"
          prop="remark"
@@ -73,7 +90,11 @@
        </nut-form-item>
      </nut-form>
    </ContentScrollView>
    <PageFooter>
    <PageFooter class="order-settle-bar">
      <div class="order-settle-price-wrapper">
        <div class="order-settle-price-label">支付:</div>
        <nut-price :price="totlePrice" size="large" />
      </div>
      <PageFooterBtn type="primary" class="business-card-btn" @click="goConfirm"
        >立即下单</PageFooterBtn
      >
@@ -104,6 +125,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',
@@ -120,7 +143,9 @@
  beginTime: '',
  endTime: '',
  supplierEnterpriseId: '',
  enterpriseEmployeeIds: [] as string[],
  supplierEnterpriseName: '',
  enterpriseEmployeeId: '',
  enterpriseEmployeeName: '',
  remark: '',
});
@@ -143,6 +168,7 @@
const rules = reactive<FormRules>({
  beginTime: [{ required: true, message: '请选择服务开始时间' }],
  endTime: [{ required: true, message: '请选择服务结束时间' }],
  enterpriseEmployeeId: [{ required: true, message: '请选择服务机构' }],
});
const { isLoading, isError, detail, refetch } = useStandardServiceDetail({
@@ -201,12 +227,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();
    }
  });
}
@@ -221,44 +251,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) {
      payStandardOrder(res);
    }
  } catch (error) {}
}
async function pay() {
async function payStandardOrder(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) {}
}
@@ -271,6 +308,26 @@
  .addStandardOrder-form {
    .nut-cell-group__wrap {
      box-shadow: none;
      .input-text,
      .h5-textarea {
        text-align: right !important;
      }
    }
  }
  .order-settle-bar {
    .order-settle-price-wrapper {
      height: 100%;
      flex: 1;
      min-width: 0;
      display: flex;
      align-items: center;
      margin-left: 28px;
      .order-settle-price-label {
        color: boleGetCssVar('text-color', 'primary');
      }
    }
  }
}
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
<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';
import { goBack } 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);
  goBack(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,72 @@
<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);
        data.supplierEnterpriseName = item.enterpriseName;
        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,6 @@
export type SelectEnterpriseEmployeeEvent = {
  supplierEnterpriseId: string;
  supplierEnterpriseName?: string;
  enterpriseEmployeeId: string;
  enterpriseEmployeeName: string;
};
packages/components/src/Card/MineServiceDetailView.vue
@@ -13,27 +13,34 @@
      :imgUrl="imgUrl"
    />
    <List>
      <ListItem title="订单状态" :showArrow="false">
    <List extraFlex>
      <ListItem :title="statusText" :showArrow="false">
        <template #extra>
          <div class="mine-service-detail-view-list-item">{{ '订单状态' }}</div>
          <div class="mine-service-detail-view-list-item">
            <slot name="status"> </slot>
          </div>
        </template>
      </ListItem>
      <ListItem title="服务时间" :showArrow="false">
        <template #extra>
          <div class="mine-service-detail-view-list-item">
            {{ '2025-12-12 12:00-14:00' }}
            {{ format(beginTime, 'YYYY-MM-DD HH:mm') }}-{{ format(endTime, 'HH:mm') }}
          </div>
        </template>
      </ListItem>
      <ListItem title="服务机构" :showArrow="false">
        <template #extra>
          <div class="mine-service-detail-view-list-item">{{ 'xxxxx公司' }}</div>
          <div class="mine-service-detail-view-list-item">{{ supplierEnterpriseName }}</div>
        </template>
      </ListItem>
      <ListItem title="联系电话" :showArrow="false" v-if="showServerContactPhoneNumbers">
        <template #extra>
          <div class="mine-service-detail-view-list-item">{{ serverContactPhoneNumbers }}</div>
        </template>
      </ListItem>
      <ListItem title="备注" :showArrow="false">
        <template #extra>
          <div class="mine-service-detail-view-list-item">{{ '我是备注信息' }}</div>
          <div class="mine-service-detail-view-list-item">{{ remark }}</div>
        </template>
      </ListItem>
    </List>
@@ -45,6 +52,7 @@
import ListItem from '../List/ListItem.vue';
import ServiceDetailAddressCard from './ServiceDetailAddressCard.vue';
import ServiceDetailGoodCard from './ServiceDetailGoodCard.vue';
import { format } from '@12333/utils';
defineOptions({
  name: 'MineServiceDetailView',
@@ -61,9 +69,19 @@
  specName?: string;
  specNumber?: number;
  imgUrl?: string;
  beginTime?: string;
  endTime?: string;
  supplierEnterpriseName?: string;
  remark?: string;
  serverContactPhoneNumbers?: string;
  showServerContactPhoneNumbers?: boolean;
  statusText?: string;
};
const props = withDefaults(defineProps<Props>(), {});
const props = withDefaults(defineProps<Props>(), {
  showServerContactPhoneNumbers: false,
});
</script>
<style lang="scss">
@@ -82,6 +100,10 @@
    font-size: 28px;
    color: boleGetCssVar('text-color', 'secondary');
    line-height: 40px;
    flex: 1;
    min-width: 0;
    text-align: right;
    margin-left: 20px;
  }
}
</style>
packages/components/src/Card/ReserveServiceCard.vue
@@ -1,44 +1,52 @@
<template>
  <div class="reserve-service-card-wrapper" :class="{ 'un-read': unRead }">
    <div class="reserve-service-card-title-wrapper">
      <div class="reserve-service-card-title">{{ name }}</div>
      <div class="reserve-service-card-title">{{ serviceName }}</div>
      <slot name="title-right">
        <TaskPrice
          v-if="releaseStatus !== EnumTaskReleaseStatus.Stopped"
          :value="toThousand(serviceFee ?? 0)"
          :unit="BillingMethodEnumUnit[billingMethod]"
          :billingMethod="billingMethod"
        />
        <TaskPrice :value="toThousand(payAmount ?? 0)" unit="元" />
      </slot>
    </div>
    <div class="reserve-service-card-item-list">
      <div class="reserve-service-card-item">
        æœåŠ¡æ—¶é—´ï¼š{{ dayjs(beginTime).format('YYYYå¹´MM月D日') }} 13:00-15:00
        <div class="reserve-service-card-item-label">服务时间:</div>
        <div class="reserve-service-card-item-content">
          {{
            `${dayjs(beginTime).format('YYYYå¹´MM月D日 HH:mm:ss')} - ${dayjs(endTime).format(
              'YYYYå¹´MM月D日 HH:mm:ss'
            )}`
          }}
        </div>
      </div>
      <div class="reserve-service-card-item">服务地址:{{ addressName }}</div>
      <div class="reserve-service-card-item">
        <div class="reserve-service-card-item-label">服务地址:</div>
        <div class="reserve-service-card-item-content">
          {{ addressDetail }}
        </div>
      </div>
    </div>
    <div class="reserve-service-card-footer">
      <div class="reserve-service-card-left">
        <div class="reserve-service-card-footer-address">服务机构:我是机构名称</div>
        <div class="reserve-service-card-footer-address">
          <slot name="serviceCustome"> æœåŠ¡æœºæž„ï¼š{{ supplierEnterpriseName }} </slot>
        </div>
      </div>
      <div class="reserve-service-card-status">待确认</div>
      <div class="reserve-service-card-status">
        <slot name="status">
          {{ EnumStandardOrderAppointmentStatusText[appointmentStatus] }}
        </slot>
      </div>
    </div>
  </div>
</template>
<script setup lang="ts">
import {
  EnumBillingMethod,
  EnumSettlementCycle,
  EnumTaskCheckReceiveStatus,
  EnumTaskRecommendStatus,
  EnumTaskReleaseStatus,
  EnumTaskSettlementStatus,
  EnumTaskStatus,
  EnumUserGender,
  BillingMethodEnumUnit,
  EnumTaskUserHireStatus,
  EnumStandardOrderAppointmentStatus,
  EnumEnterpriseCooperationServiceFeeCollectType,
  EnumStandardOrderSettlementStatus,
  EnumStandardOrderPayStatus,
  EnumStandardOrderAppointmentStatusText,
} from '@12333/constants';
import dayjs from 'dayjs';
import { toThousand } from '@12333/utils';
@@ -51,51 +59,61 @@
type Props = {
  /** Id */
  id?: string;
  /** ä»»åŠ¡åç§° */
  name: string;
  /** ä»»åŠ¡å•å· */
  /** è®¢å•号 */
  code?: string;
  billingMethod?: EnumBillingMethod;
  /** æœåŠ¡å */
  serviceName?: string;
  /** æœåŠ¡å•å· */
  serviceCode?: string;
  /** æœåŠ¡å›¾ç‰‡ */
  serviceFile?: string;
  /** çœå¸‚区+详细地址+门牌号 */
  addressDetail?: string;
  /** æœåŠ¡èµ·å§‹æ—¶é—´ */
  beginTime?: string;
  /** æœåŠ¡æˆªæ­¢æ—¶é—´ */
  endTime?: string;
  /** ä¸‹å•用户Id */
  createdUserId?: string;
  /** ä¸‹å•用户 */
  createdUserName?: string;
  /** è”系电话 */
  createdUserContactPhoneNumber?: string;
  /** ä¸‹å•æ—¶é—´ */
  createdTime?: string;
  appointmentStatus?: EnumStandardOrderAppointmentStatus;
  /** ç”²æ–¹ä¼ä¸šId */
  partyAEnterpriseId?: string;
  /** ç”²æ–¹ä¼ä¸š */
  partyAEnterpriseName?: string;
  /** ä¾›åº”商Id */
  supplierEnterpriseId?: string;
  /** ä¾›åº”商 */
  supplierEnterpriseName?: string;
  /** æœåŠ¡äººå‘˜ */
  serverNames?: string;
  /** æœåŠ¡äººå‘˜è”ç³»ç”µè¯ */
  serverContactPhoneNumbers?: string;
  payStatus?: EnumStandardOrderPayStatus;
  /** æ”¯ä»˜å®Œæˆæ—¶é—´ */
  payCompletedTime?: string;
  /** å®žä»˜é‡‘额 */
  payAmount?: number;
  /** å®žæ”¶é‡‘额 */
  receiveAmount?: number;
  serviceFeeCollectType?: EnumEnterpriseCooperationServiceFeeCollectType;
  /** æœåŠ¡è´¹ */
  serviceFee?: number;
  settlementCycle?: EnumSettlementCycle;
  /** ç¦åˆ© */
  benefits?: API.GetTaskInfoQueryResultBenefit[];
  genderLimit?: EnumUserGender;
  /** èµ„格证书类型 */
  credentialLimits?: API.GetTaskInfoQueryResultCredentialLimit[];
  /** ä»»åŠ¡åœ°ç‚¹æ‰€å±žçœä»½ç¼–å· */
  provinceCode?: string;
  /** ä»»åŠ¡åœ°ç‚¹æ‰€å±žçœä»½ */
  provinceContent?: string;
  /** ä»»åŠ¡åœ°ç‚¹æ‰€å±žåŸŽå¸‚ç¼–å· */
  cityCode?: string;
  /** ä»»åŠ¡åœ°ç‚¹æ‰€å±žåŸŽå¸‚ */
  cityContent?: string;
  /** ä»»åŠ¡åœ°ç‚¹åç§° */
  addressName?: string;
  /** ä»»åŠ¡åœ°ç‚¹è¯¦ç»†åœ°å€ */
  addressDetail?: string;
  /** ç»åº¦ */
  longitude?: number;
  /** çº¬åº¦ */
  latitude?: number;
  /** æŠ¥åäººæ•° */
  userCount?: number;
  status?: EnumTaskStatus;
  /** ä»»åŠ¡å¼€å§‹æ—¶é—´ */
  beginTime?: string;
  /** ä»»åŠ¡ç»“æŸæ—¶é—´ */
  endTime?: string;
  releaseStatus?: EnumTaskReleaseStatus;
  checkReceiveStatus?: EnumTaskCheckReceiveStatus;
  settlementStatus?: EnumTaskSettlementStatus;
  recommendStatus?: EnumTaskRecommendStatus;
  /** åˆ›å»ºæ—¶é—´ */
  createdTime?: string;
  hireStatus?: EnumTaskUserHireStatus;
  settlementStatus?: EnumStandardOrderSettlementStatus;
  /** ç»“算单号 */
  settlementCode?: string;
  /** ç»“ç®—æ—¶é—´ */
  settlementTime?: string;
  /** ç»“算金额 */
  settlementAmount?: number;
  unRead?: boolean;
  showActions?: boolean;
};
const props = withDefaults(defineProps<Props>(), {
@@ -164,6 +182,13 @@
      color: boleGetCssVar('text-color', 'regular');
      line-height: 36px;
      margin-bottom: 6px;
      display: flex;
      align-items: flex-start;
      .reserve-service-card-item-content {
        flex: 1;
        min-width: 0;
      }
      &:last-child {
        margin-bottom: 0;
packages/components/src/Card/TaskPrice.vue
@@ -1,6 +1,9 @@
<template>
  <div class="task-price">
    <div class="task-price-decimal" v-if="billingMethod !== EnumBillingMethod.Face">
    <div
      class="task-price-decimal"
      v-if="!!billingMethod || billingMethod !== EnumBillingMethod.Face"
    >
      {{ value }}
    </div>
    <div class="task-price-unit">{{ unit }}</div>
packages/components/src/List/List.vue
@@ -1,5 +1,5 @@
<template>
  <div class="pro-list">
  <div class="pro-list" :class="{ extraFlex }">
    <slot />
  </div>
</template>
@@ -8,6 +8,14 @@
defineOptions({
  name: 'List',
});
type Props = {
  extraFlex?: boolean;
};
const props = withDefaults(defineProps<Props>(), {
  extraFlex: false,
});
</script>
<style lang="scss">
packages/components/src/List/ListItem.vue
@@ -61,4 +61,18 @@
    }
  }
}
.extraFlex {
  .pro-list-item {
    .pro-list-item-inner {
      height: auto;
      align-items: flex-start;
      padding: 30px 0;
      .pro-list-item-title {
        flex: initial;
      }
    }
  }
}
</style>
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/constants/apiEnum.ts
@@ -303,14 +303,30 @@
  Pass = 30,
}
/** æŸ¥è¯¢æ ‡å‡†è®¢å•分页列表-甲方订单状态 */
export enum EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus {
  /**待支付 */
  Wait = 10,
  /**已支付 */
  Pay = 20,
  /**已完成 */
  Completed = 30,
}
/** æŸ¥è¯¢æ ‡å‡†è®¢å•分页列表-限制场景 */
export enum EnumGetStandardOrdersQueryScene {
  /**预约订单 */
  Appointment = 10,
  /**支付订单 */
  Pay = 20,
  /**结算订单 */
  Settlement = 30,
  /**甲方企业订单管理 */
  PartAEnterpriseOrder = 10,
  /**人资企业订单管理 */
  SupplierEnterpriseOrder = 100,
}
/** æŸ¥è¯¢æ ‡å‡†è®¢å•分页列表-甲方订单状态 */
export enum EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus {
  /**待收款 */
  Wait = 10,
  /**已完成 */
  Completed = 30,
}
/** æŠ•保供应商账号 */
packages/constants/index.ts
@@ -15,3 +15,4 @@
export * from './apiEnum';
export * from './enterpriseEmployee';
export * from './enterpriseWallet';
export * from './standardOrder';
packages/constants/standardOrder.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
import {
  EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus,
  EnumGetStandardOrdersQueryScene,
  EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus,
  EnumStandardOrderAppointmentStatus,
  EnumStandardOrderPayStatus,
  EnumStandardOrderSettlementStatus,
  EnumStandardServiceReleaseStatus,
  EnumUserBankCardAccess,
} from './apiEnum';
export const EnumStandardServiceReleaseStatusText = {
  [EnumStandardServiceReleaseStatus.InProcess]: '发布中',
  [EnumStandardServiceReleaseStatus.Stopped]: '已停止',
};
export const EnumStandardOrderAppointmentStatusText = {
  [EnumStandardOrderAppointmentStatus.WaitSure]: '待确认',
  [EnumStandardOrderAppointmentStatus.WaitServe]: '待服务',
  [EnumStandardOrderAppointmentStatus.Completed]: '已完成',
  [EnumStandardOrderAppointmentStatus.Cancelled]: '已取消',
};
export const EnumStandardOrderPayStatusText = {
  [EnumStandardOrderPayStatus.Wait]: '待支付',
  [EnumStandardOrderPayStatus.Completed]: '已支付',
  [EnumStandardOrderPayStatus.Cancelled]: '已取消',
};
export const EnumStandardOrderSettlementStatusText = {
  [EnumStandardOrderSettlementStatus.Wait]: '待结算',
  [EnumStandardOrderSettlementStatus.Completed]: '已完成',
};
export const EnumGetStandardOrdersQuerySceneText = {
  [EnumGetStandardOrdersQueryScene.PartAEnterpriseOrder]: '甲方企业订单管理',
  [EnumGetStandardOrdersQueryScene.SupplierEnterpriseOrder]: '人资企业订单管理',
};
export const EnumGetStandardOrdersQueryPartAEnterpriseOrderStatusText = {
  [EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Wait]: '待支付',
  [EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Pay]: '已支付',
  [EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus.Completed]: '已完成',
};
export const EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatusText = {
  [EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus.Wait]: '待收款',
  [EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus.Completed]: '已完成',
};
export const EnumUserBankCardAccessText = {
  [EnumUserBankCardAccess.WeChatPay]: '微信支付',
  [EnumUserBankCardAccess.Bank]: '银行支付',
};
packages/hooks/standardOrder.ts
@@ -1,7 +1,16 @@
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import * as standardServiceServices from '@12333/services/apiV2/standardService';
import { computed, MaybeRef, unref } from 'vue';
import * as standardOrderServices from '@12333/services/apiV2/standardOrder';
import { computed, MaybeRef, reactive, unref } from 'vue';
import { groupBy } from 'lodash';
import { useInfiniteLoading } from '@12333/hooks';
import {
  EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus,
  EnumGetStandardOrdersQueryScene,
  EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus,
  EnumStandardOrderAppointmentStatus,
  EnumStandardOrderPayStatus,
} from '@12333/constants';
type UseStandardServiceDetailOptions = {
  id: MaybeRef<string>;
@@ -95,3 +104,88 @@
    standardServiceListForCategoryMap,
  };
}
export function useGetStandardOrders() {
  const queryState = reactive({
    appointmentStatus: 0 as any as EnumStandardOrderAppointmentStatus,
    payStatus: 0 as any as EnumStandardOrderPayStatus,
    partAEnterpriseOrderStatus: 0 as any as EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus,
    supplierEnterpriseOrderStatus:
      0 as any as EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus,
  });
  const { infiniteLoadingProps } = useInfiniteLoading(
    ({ pageParam }) => {
      let params: API.GetStandardOrdersQuery = {
        pageModel: {
          rows: 20,
          page: pageParam,
        },
      };
      if (queryState.appointmentStatus) {
        params.appointmentStatus = queryState.appointmentStatus;
      }
      if (queryState.payStatus) {
        params.payStatus = queryState.payStatus;
      }
      if (queryState.partAEnterpriseOrderStatus) {
        params.partAEnterpriseOrderStatus = queryState.partAEnterpriseOrderStatus;
      }
      if (queryState.supplierEnterpriseOrderStatus) {
        params.supplierEnterpriseOrderStatus = queryState.supplierEnterpriseOrderStatus;
      }
      return standardOrderServices.getStandardOrders(params, {
        showLoading: false,
      });
    },
    {
      queryKey: ['standardOrderServices/getStandardOrders', queryState],
    }
  );
  return {
    queryState,
    infiniteLoadingProps,
  };
}
type UseStandardOrderOptions = {
  id: MaybeRef<string>;
  scene?: EnumGetStandardOrdersQueryScene;
  onSuccess?: (data: API.GetStandardOrderQueryResult) => any;
  refetchInterval?: MaybeRef<number | false>;
};
export function useStandardOrder({
  id,
  scene,
  onSuccess,
  refetchInterval = false,
}: UseStandardOrderOptions) {
  const {
    isLoading,
    isError,
    data: detail,
    refetch,
  } = useQuery({
    queryKey: ['standardOrderServices/getStandardOrder', id, scene],
    queryFn: async () => {
      const params: API.APIgetStandardOrderParams = {
        id: unref(id),
        scene: scene,
      };
      return await standardOrderServices.getStandardOrder(params, {
        showLoading: false,
      });
    },
    placeholderData: () => ({} as API.GetStandardOrderQueryResult),
    onSuccess(data) {
      onSuccess?.(data);
    },
    refetchInterval: unref(refetchInterval),
  });
  return { detail, isLoading, isError, refetch };
}
packages/services/apiV2/index.ts
@@ -14,11 +14,11 @@
import * as logRecords from './logRecords';
import * as dictionary from './dictionary';
import * as taskCheckReceive from './taskCheckReceive';
import * as taskUser from './taskUser';
import * as standardOrder from './standardOrder';
import * as standardService from './standardService';
import * as userResume from './userResume';
import * as auth from './auth';
import * as taskUser from './taskUser';
import * as enterpriseInsuranceProduct from './enterpriseInsuranceProduct';
import * as eventUtils from './eventUtils';
import * as enterpriseCooperationWallet from './enterpriseCooperationWallet';
@@ -45,11 +45,11 @@
  logRecords,
  dictionary,
  taskCheckReceive,
  taskUser,
  standardOrder,
  standardService,
  userResume,
  auth,
  taskUser,
  enterpriseInsuranceProduct,
  eventUtils,
  enterpriseCooperationWallet,
packages/services/apiV2/standardOrder.ts
@@ -98,6 +98,24 @@
  });
}
/** æŸ¥è¯¢æ ‡å‡†è®¢å•详情 GET /api/flexjob/standardOrder/getSureStandardOrder */
export async function getSureStandardOrder(
  // å åŠ ç”Ÿæˆçš„Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetSureStandardOrderParams,
  options?: API.RequestConfig
) {
  return request<API.GetSureStandardOrderQueryResult>(
    '/api/flexjob/standardOrder/getSureStandardOrder',
    {
      method: 'GET',
      params: {
        ...params,
      },
      ...(options || {}),
    }
  );
}
/** æ ‡å‡†è®¢å•支付 POST /api/flexjob/standardOrder/payStandardOrder */
export async function payStandardOrder(
  body: API.PayStandardOrderCommand,
@@ -113,6 +131,21 @@
  });
}
/** ç»“算标准订单 PUT /api/flexjob/standardOrder/settlementStandardOrder */
export async function settlementStandardOrder(
  body: API.SettlementStandardOrderCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/flexjob/standardOrder/settlementStandardOrder', {
    method: 'PUT',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** æ ‡å‡†è®¢å•服务确认 POST /api/flexjob/standardOrder/sureStandardOrder */
export async function sureStandardOrder(
  body: API.SureStandardOrderCommand,
packages/services/apiV2/taskUser.ts
@@ -14,6 +14,21 @@
  });
}
/** æ‰¹é‡ä»»åŠ¡å®‰æŽ’ POST /api/flexjob/taskUser/batchSetTaskUserArrange */
export async function batchSetTaskUserArrange(
  body: API.BatchSetTaskUserArrangeCommand,
  options?: API.RequestConfig
) {
  return request<number>('/api/flexjob/taskUser/batchSetTaskUserArrange', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** æ¸…空已停止的任务收藏 DELETE /api/flexjob/taskUser/clearTaskCollect */
export async function clearTaskCollect(
  body: API.ClearTaskCollectCommand,
@@ -41,6 +56,42 @@
  });
}
/** æŸ¥è¯¢ä»»åŠ¡å®‰æŽ’çµå·¥è¯¦æƒ… GET /api/flexjob/taskUser/getArrangeTaskEnterpriseEmployee */
export async function getArrangeTaskEnterpriseEmployee(
  // å åŠ ç”Ÿæˆçš„Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetArrangeTaskEnterpriseEmployeeParams,
  options?: API.RequestConfig
) {
  return request<API.GetArrangeTaskEnterpriseEmployeeQueryResult>(
    '/api/flexjob/taskUser/getArrangeTaskEnterpriseEmployee',
    {
      method: 'GET',
      params: {
        ...params,
      },
      ...(options || {}),
    }
  );
}
/** æŸ¥è¯¢ä»»åŠ¡å®‰æŽ’çµå·¥åˆ—è¡¨ POST /api/flexjob/taskUser/getArrangeTaskEnterpriseEmployees */
export async function getArrangeTaskEnterpriseEmployees(
  body: API.GetArrangeTaskEnterpriseEmployeesQuery,
  options?: API.RequestConfig
) {
  return request<API.GetArrangeTaskEnterpriseEmployeesQueryResult>(
    '/api/flexjob/taskUser/getArrangeTaskEnterpriseEmployees',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json-patch+json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** B端查询人员安排分页列表信息 POST /api/flexjob/taskUser/getArrangeTaskUsers */
export async function getArrangeTaskUsers(
  body: API.GetArrangeTaskUsersQuery,
@@ -104,6 +155,21 @@
  });
}
/** æŸ¥è¯¢å¾…安排任务分页列表 POST /api/flexjob/taskUser/getWaitArrangeTasks */
export async function getWaitArrangeTasks(
  body: API.GetWaitArrangeTasksQuery,
  options?: API.RequestConfig
) {
  return request<API.GetWaitArrangeTasksQueryResult>('/api/flexjob/taskUser/getWaitArrangeTasks', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** ä»»åŠ¡å®‰æŽ’ PUT /api/flexjob/taskUser/setTaskUserArrange */
export async function setTaskUserArrange(
  body: API.SetTaskUserArrangeCommand,
packages/services/apiV2/typings.d.ts
@@ -104,6 +104,11 @@
    maxDeep?: number;
  }
  interface APIgetArrangeTaskEnterpriseEmployeeParams {
    /** çµå·¥Id */
    id?: string;
  }
  interface APIgetCheckReceiveTaskUserSubmitParams {
    /** æäº¤Id(用于B端客户端) */
    submitId?: string;
@@ -399,6 +404,8 @@
  interface APIgetStandardOrderParams {
    /** è®¢å•Id */
    id?: string;
    /** é™åˆ¶åœºæ™¯ï¼ˆä¸ä¼ åˆ™ä¸é™åˆ¶ï¼‰ */
    scene?: EnumGetStandardOrdersQueryScene;
  }
  interface APIgetStandardServiceParams {
@@ -411,6 +418,11 @@
    request?: GetSupplierEnterpriseSelectQuery;
  }
  interface APIgetSureStandardOrderParams {
    /** è®¢å•Id */
    id?: string;
  }
  interface APIgetTaskEnterpriseParams {
    /** ä¼ä¸šId */
    id?: string;
@@ -610,6 +622,14 @@
    errorMessages?: string;
  }
  interface BatchSetTaskUserArrangeCommand {
    /** ä»»åŠ¡Id */
    taskInfoIds?: string[];
    /** çµå·¥Id */
    enterpriseEmployeeId?: string;
    arrangeStatus?: EnumTaskUserArrangeStatus;
  }
  interface BindWxmpUserInfoCommand {
    /** è®¿é—®ä»¤ç‰Œ */
    accessToken: string;
@@ -1236,13 +1256,27 @@
    Pass = 30,
  }
  enum EnumGetStandardOrdersQueryScene {
    /**预约订单 */
    Appointment = 10,
    /**支付订单 */
  enum EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus {
    /**待支付 */
    Wait = 10,
    /**已支付 */
    Pay = 20,
    /**结算订单 */
    Settlement = 30,
    /**已完成 */
    Completed = 30,
  }
  enum EnumGetStandardOrdersQueryScene {
    /**甲方企业订单管理 */
    PartAEnterpriseOrder = 10,
    /**人资企业订单管理 */
    SupplierEnterpriseOrder = 100,
  }
  enum EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus {
    /**待收款 */
    Wait = 10,
    /**已完成 */
    Completed = 30,
  }
  enum EnumInsuranceSupplierAccess {
@@ -2189,6 +2223,42 @@
    timestamp?: number;
  }
  interface FriendlyResultGetArrangeTaskEnterpriseEmployeeQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
    /** çŠ¶æ€ç  */
    code?: number;
    /** é”™è¯¯ç  */
    errorCode?: string;
    data?: GetArrangeTaskEnterpriseEmployeeQueryResult;
    /** æ‰§è¡ŒæˆåŠŸ */
    success?: boolean;
    /** é”™è¯¯ä¿¡æ¯ */
    msg?: any;
    /** é™„加数据 */
    extras?: any;
    /** æ—¶é—´æˆ³ */
    timestamp?: number;
  }
  interface FriendlyResultGetArrangeTaskEnterpriseEmployeesQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
    /** çŠ¶æ€ç  */
    code?: number;
    /** é”™è¯¯ç  */
    errorCode?: string;
    data?: GetArrangeTaskEnterpriseEmployeesQueryResult;
    /** æ‰§è¡ŒæˆåŠŸ */
    success?: boolean;
    /** é”™è¯¯ä¿¡æ¯ */
    msg?: any;
    /** é™„加数据 */
    extras?: any;
    /** æ—¶é—´æˆ³ */
    timestamp?: number;
  }
  interface FriendlyResultGetArrangeTaskUsersQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
@@ -3485,6 +3555,24 @@
    timestamp?: number;
  }
  interface FriendlyResultGetSureStandardOrderQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
    /** çŠ¶æ€ç  */
    code?: number;
    /** é”™è¯¯ç  */
    errorCode?: string;
    data?: GetSureStandardOrderQueryResult;
    /** æ‰§è¡ŒæˆåŠŸ */
    success?: boolean;
    /** é”™è¯¯ä¿¡æ¯ */
    msg?: any;
    /** é™„加数据 */
    extras?: any;
    /** æ—¶é—´æˆ³ */
    timestamp?: number;
  }
  interface FriendlyResultGetTaskEnterpriseQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
@@ -3773,6 +3861,24 @@
    timestamp?: number;
  }
  interface FriendlyResultGetWaitArrangeTasksQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
    /** çŠ¶æ€ç  */
    code?: number;
    /** é”™è¯¯ç  */
    errorCode?: string;
    data?: GetWaitArrangeTasksQueryResult;
    /** æ‰§è¡ŒæˆåŠŸ */
    success?: boolean;
    /** é”™è¯¯ä¿¡æ¯ */
    msg?: any;
    /** é™„加数据 */
    extras?: any;
    /** æ—¶é—´æˆ³ */
    timestamp?: number;
  }
  interface FriendlyResultGetWxmpSettingsQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
@@ -4682,6 +4788,66 @@
    quickQuery?: string;
  }
  interface GetArrangeTaskEnterpriseEmployeeQueryResult {
    /** çµå·¥Id */
    id?: string;
    /** å¤´åƒ */
    avatar?: string;
    /** å§“名 */
    name?: string;
    /** èº«ä»½è¯å· */
    identity?: string;
    /** æ‰‹æœºå· */
    contactPhoneNumber?: string;
    gender?: EnumUserGender;
    /** å¹´é¾„ */
    age?: number;
    /** æ˜¯å¦å®žå */
    isReal?: boolean;
    realMethod?: EnumUserRealMethod;
    /** ç”µå­åˆåŒ */
    contractUrl?: string;
    /** åè®®èµ·å§‹æ—¶é—´ */
    contractBegin?: string;
    /** åè®®ç»ˆæ­¢æ—¶é—´ */
    contractEnd?: string;
    /** å·²å®‰æŽ’任务 */
    taskInfos?: GetWaitArrangeTasksQueryResultItem[];
  }
  interface GetArrangeTaskEnterpriseEmployeesQuery {
    /** å…³é”®å­—(姓名、身份证号、手机号) */
    keywords?: string;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetArrangeTaskEnterpriseEmployeesQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** æ•°æ® */
    data?: GetArrangeTaskEnterpriseEmployeesQueryResultItem[];
  }
  interface GetArrangeTaskEnterpriseEmployeesQueryResultItem {
    /** Id */
    id?: string;
    /** å¤´åƒ */
    avatar?: string;
    /** å§“名 */
    name?: string;
    /** èº«ä»½è¯å· */
    identity?: string;
    /** æ‰‹æœºå· */
    contactPhoneNumber?: string;
    gender?: EnumUserGender;
    /** å¹´é¾„ */
    age?: number;
    /** æ˜¯å¦å®žå */
    isReal?: boolean;
    realMethod?: EnumUserRealMethod;
    /** å·²å®‰æŽ’ */
    arrangeTaskCount?: number;
  }
  interface GetArrangeTaskUsersQuery {
    /** ä»»åŠ¡Id */
    id?: string;
@@ -5584,8 +5750,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;
  }
@@ -7957,6 +8141,18 @@
    serviceId?: string;
    /** æœåŠ¡å */
    serviceName?: string;
    /** æœåŠ¡å•å· */
    serviceCode?: string;
    /** æœåŠ¡å›¾ç‰‡ */
    serviceFile?: string;
    /** ä¸‹å•用户Id */
    createdUserId?: string;
    /** ä¸‹å•用户 */
    createdUserName?: string;
    /** è”系电话 */
    createdUserContactPhoneNumber?: string;
    /** ä¸‹å•æ—¶é—´ */
    createdTime?: string;
    /** ç”²æ–¹ä¼ä¸šId */
    partyAEnterpriseId?: string;
    /** ç”²æ–¹ä¼ä¸š */
@@ -7975,20 +8171,6 @@
    name?: string;
    /** è”系电话 */
    contactPhoneNumber?: string;
    /** çœä»½ç¼–号 */
    provinceCode?: string;
    /** çœä»½ */
    provinceContent?: string;
    /** åŸŽå¸‚编号 */
    cityCode?: string;
    /** åŸŽå¸‚ */
    cityContent?: string;
    /** åŒºç¼–号 */
    areaCode?: string;
    /** åŒº */
    areaContent?: string;
    /** è¯¦ç»†åœ°å€ */
    addressName?: string;
    /** é—¨ç‰Œå· */
    addressDetail?: string;
    /** ç»åº¦ */
@@ -8003,12 +8185,12 @@
    supplierEnterpriseId?: string;
    /** ä¾›åº”商 */
    supplierEnterpriseName?: string;
    /** æœåŠ¡äººå‘˜Id */
    serverId?: string;
    /** æœåŠ¡äººå‘˜å§“å */
    serverName?: string;
    /** æœåŠ¡äººå‘˜ */
    serverNames?: string;
    /** æœåŠ¡äººå‘˜è”ç³»ç”µè¯ */
    serverContactPhoneNumber?: string;
    serverContactPhoneNumbers?: string;
    /** æœåŠ¡äººå‘˜ */
    servers?: GetStandardOrderQueryResultServer[];
    /** å¤‡æ³¨ */
    remark?: string;
    payAccess?: EnumUserBankCardAccess;
@@ -8022,6 +8204,8 @@
    payAmount?: number;
    /** æ”¯ä»˜æ—¶é—´ */
    payTime?: string;
    /** æ”¯ä»˜å®Œæˆæ—¶é—´ */
    payCompletedTime?: string;
    settlementStatus?: EnumStandardOrderSettlementStatus;
    serviceFeeCollectType?: EnumEnterpriseCooperationServiceFeeCollectType;
    /** æœåŠ¡è´¹ */
@@ -8030,6 +8214,18 @@
    receiveAmount?: number;
    /** ç»“算金额 */
    settlementAmount?: number;
    taskCheckReceiveStatus?: EnumTaskCheckReceiveStatus;
    partAEnterpriseOrderStatus?: EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus;
    supplierEnterpriseOrderStatus?: EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus;
  }
  interface GetStandardOrderQueryResultServer {
    /** Id */
    id?: string;
    /** å§“名 */
    name?: string;
    /** è”系电话 */
    contactPhoneNumber?: string;
  }
  interface GetStandardOrdersQuery {
@@ -8046,6 +8242,8 @@
    payTimeEnd?: string;
    appointmentStatus?: EnumStandardOrderAppointmentStatus;
    payStatus?: EnumStandardOrderPayStatus;
    partAEnterpriseOrderStatus?: EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus;
    supplierEnterpriseOrderStatus?: EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus;
    settlementStatus?: EnumStandardOrderSettlementStatus;
    pageModel?: PagedListQueryPageModel;
  }
@@ -8065,6 +8263,14 @@
    serviceName?: string;
    /** æœåŠ¡å•å· */
    serviceCode?: string;
    /** æœåŠ¡å›¾ç‰‡ */
    serviceFile?: string;
    /** çœå¸‚区+详细地址+门牌号 */
    addressDetail?: string;
    /** æœåŠ¡èµ·å§‹æ—¶é—´ */
    beginTime?: string;
    /** æœåŠ¡æˆªæ­¢æ—¶é—´ */
    endTime?: string;
    /** ä¸‹å•用户Id */
    createdUserId?: string;
    /** ä¸‹å•用户 */
@@ -8082,8 +8288,10 @@
    supplierEnterpriseId?: string;
    /** ä¾›åº”商 */
    supplierEnterpriseName?: string;
    /** ä¾›åº”商联系电话 */
    supplierContactPhoneNumber?: string;
    /** æœåŠ¡äººå‘˜ */
    serverNames?: string;
    /** æœåŠ¡äººå‘˜è”ç³»ç”µè¯ */
    serverContactPhoneNumbers?: string;
    payStatus?: EnumStandardOrderPayStatus;
    /** æ”¯ä»˜å®Œæˆæ—¶é—´ */
    payCompletedTime?: string;
@@ -8091,6 +8299,7 @@
    payAmount?: number;
    /** å®žæ”¶é‡‘额 */
    receiveAmount?: number;
    serviceFeeCollectType?: EnumEnterpriseCooperationServiceFeeCollectType;
    /** æœåŠ¡è´¹ */
    serviceFee?: number;
    settlementStatus?: EnumStandardOrderSettlementStatus;
@@ -8100,6 +8309,8 @@
    settlementTime?: string;
    /** ç»“算金额 */
    settlementAmount?: number;
    partAEnterpriseOrderStatus?: EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus;
    supplierEnterpriseOrderStatus?: EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus;
  }
  interface GetStandardServiceCommentsQuery {
@@ -8357,6 +8568,17 @@
    signStatus?: EnumEnterpriseCooperationSignStatus;
  }
  interface GetSureStandardOrderQueryResult {
    /** è®¢å•Id */
    id?: string;
    /** éªŒæ”¶å®Œæˆæ—¶é—´ */
    checkReceiveTime?: string;
    /** é™„ä»¶ */
    files?: string[];
    /** å¤‡æ³¨ */
    remark?: string;
  }
  interface GetTaskEnterpriseQueryResult {
    /** ä¼ä¸šå…¨ç§° */
    enterpriseName?: string;
@@ -9119,11 +9341,44 @@
    pageModel?: PagedListQueryPageModel;
  }
  interface GetWaitArrangeTasksQuery {
    /** çµå·¥Id */
    enterpriseEmployeeId?: string;
    /** å…³é”®å­—(任务名、任务单号) */
    keywords?: string;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetWaitArrangeTasksQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** æ•°æ® */
    data?: GetWaitArrangeTasksQueryResultItem[];
  }
  interface GetWaitArrangeTasksQueryResultItem {
    /** Id */
    id?: string;
    /** ä»»åŠ¡åç§° */
    name?: string;
    /** ä»»åŠ¡å•å· */
    code?: string;
    /** å‘单客户Id */
    enterpriseId?: string;
    /** å‘单客户 */
    enterpriseName?: string;
    /** ä»»åŠ¡å¼€å§‹æ—¶é—´ */
    beginTime?: string;
    /** ä»»åŠ¡ç»“æŸæ—¶é—´ */
    endTime?: string;
  }
  type GetWxmpSettingsQuery = Record<string, any>;
  interface GetWxmpSettingsQueryResult {
    /** éšè—æ”¯ä»˜å® */
    hiddenAlipay?: boolean;
    /** å¾®ä¿¡å®¡æ ¸ä¸­ */
    wxmpAuditInProcess?: boolean;
  }
  interface HistoryQueryResult {
@@ -9965,6 +10220,22 @@
    id?: string;
  }
  interface SaveOperationUserCommand {
    /** å§“名 */
    name?: string;
    /** ç”¨æˆ·å */
    userName: string;
    /** æ‰‹æœºå· */
    phoneNumber?: string;
    /** å¯†ç  */
    password?: string;
    status?: EnumUserStatus;
    /** å¤‡æ³¨ */
    remark?: string;
    /** Id */
    id?: string;
  }
  interface SavePartyAEnterpriseCommand {
    /** Id */
    id?: string;
@@ -10502,6 +10773,11 @@
    Refunded = 20,
  }
  interface SettlementStandardOrderCommand {
    /** è®¢å•Id */
    id?: string;
  }
  interface SetUserInfoRolesCommand {
    /** ç”¨æˆ·Id */
    userInfoId?: string;
@@ -10610,10 +10886,8 @@
  interface SureStandardOrderCommand {
    /** è®¢å•Id */
    id?: string;
    /** è¯„分 */
    commentStar?: number;
    /** è¯„ä»· */
    commentContent?: string;
    /** é¢„约订单完成备注 */
    appointmentCompletedRemark?: string;
  }
  interface SureTaskSettlementCommand {
packages/services/apiV2/user.ts
@@ -251,6 +251,21 @@
  });
}
/** ä¿å­˜è¿è¥ç«¯ç”¨æˆ· POST /api/user/user/saveOperationUser */
export async function saveOperationUser(
  body: API.SaveOperationUserCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/user/saveOperationUser', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** ä¿å­˜ç”¨æˆ·é“¶è¡Œå¡ä¿¡æ¯ POST /api/user/user/savePersonalUserBankCard */
export async function savePersonalUserBankCard(
  body: API.SavePersonalUserBankCardCommand,