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