wupengfei
3 天以前 507131cbff30df768441a2167d1c7396ba5ceea2
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
已修改26个文件
已删除1个文件
已添加11个文件
828 ■■■■■ 文件已修改
apps/bStandardMiniApp/ci/private.wx3669dd12a0915f7d.key 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/ci/private.wxc47d6f255e7d0566.key 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/ci/upload.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/app.config.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/JobDetailContent/JobDetailContent.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/JobDetailContent/components/CurriculumViewItem.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/JobDetailContent/components/curriculumView.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/components/JobDetailContent/components/experienceView.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/constants/router.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/hooks/user.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/pages/mine/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/stores/modules/user.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/login/authorization/authorization.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/addressManange/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/editAddress/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/EnterpriseEmployeeDetail/EnterpriseEmployeeDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/EnterpriseEmployeeDetail/EnterpriseEmployeeDetail.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/EnterpriseEmployeeDetail/InnerPage.vue 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/supplierDetail/InnerPage.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/supplierDetail/supplierDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/subpackages/sercice/supplierDetail/supplierDetail.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/housekeepingMiniApp/src/utils/request/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Sku/sku.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/standardOrder.ts 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/standardOrder.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/types.d.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bStandardMiniApp/ci/private.wx3669dd12a0915f7d.key
ÎļþÒÑɾ³ý
apps/bStandardMiniApp/ci/private.wxc47d6f255e7d0566.key
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAy7wtgTQmuEPpJDRPu2rkSpOyf4OabpFFRbrdBdnhERLswO67
P3DzxFhi9PkReA0nwr6D/UrkmKSCA/Jao7wIv7Md4ZVe3feKYMKGIGpZEBdVzZNG
GplzpCYvkGpC+PO/cvnn+I7G4pMTq//A/XYV4MjlcIuZHbQKQ7Q+lGKv5rd3NsEA
tpH2OmFmHWmSTu5wJuNjK3P44CgCdc+bGMb4ik3zX8VKRpDJ7JCNe0fKv0f1vnhP
0yRZENT4ag3dkMF+H6cztMXiBJxxgz2RI7xWuyEHkJcMf5MGUxHTlFNpbw6K4RxC
+clGv0/qgV//tLmdq4ArfFQqnzTrAQhfHOUYdwIDAQABAoIBAQCAtnYZNpVvvJfC
Y7orsbBg3UbcAIzEZcrZ7uBMHgZu/wHMMgbiYb3fwedi1SgQLF9+TVad437gYK4z
SB2za8wrMEIkjnXMzeMClmKegBGcdOGkavLTQzcn8WgDWN7O4U+GmBPRmIJWCo1X
ENEgUEYqKUGrBMbLWT9S3sDahi6TFxw2TH8nnOXPV5+p23A3t3hygsYyJ1Il/mLQ
g3KCUTN63QB5Xo2ZP11ypC03eoO1pmx57m+f7Sq48AUxnBWZxTfDosmZsnbSDbjj
va9zT5quImy7kn1PfbSgoDpSrSDqPVDwKITu5FUJU+ISlYElHeu7Ux2N3B0O3fvG
ln5qec/hAoGBAPZ2uX41Pycoj7GJpS9AOm3Kl00nHZswKuT461Z/+DSaaQAorDiC
bsDr5l/fNG57kywzKbC1DsJdcV9Fm16wTV6l0Y2dLuIZVeFINRQySK1exiF+yTXJ
BoGHFjtls8j1Q/9PDsc7ok3n+i29qdiNv+odH8HdIrsQHjW2KojADBUbAoGBANOe
N2gQ6qdsQUCf9yxntxmFp137Jwb4IN9ePB8qp06PHYpvqnMvtfb8QJ+NPPbpfuh0
9MkfVzxK5430FqVsHzvJ5pUfgO+Ewi4V2F1hDEtrEFB0MUFrRWOXmGa5nsnbK/HN
mRzsnZyICem8kQ6HHTYPCgTCU6vi6TwNl3GypCvVAoGBAITxn7cTU8B0oaX7gG3P
cHT+ncSRP+gRAGJIXvFmz+TYEaFzTwqgWMuZs8etJ6Qc5lMmOevGjnKLYvcoHdni
salHOpTv33U4g1mk0HTXdtqFz8wLjs+DYw4FZxmdD3Br1EToSSlw4mixpAJ+Vxqn
w4iuMw4okW5kEFearrDbHulXAoGBALP6KfFOAeRmg5Cs/BE+HFGOhGu/wM+ClKKk
iMmRAz4jJeKpWfQhLcdjfqqz+pecupyFa/Lpvs2+fvUSFXiXXnEBJCTL6GLNLED5
v0ybz1MNOZDTYVjcHOW49prXX58Z0mQSkhgxfVK1uIicIVqTu1pQrBqkE3lqwSac
AKNoZYwJAoGACHsuxgMHOZ0fe+IG3x1wIM2EDdvQtJJG5LspfBVczGliCZOwCGLi
HRVxpTzzTYN/XTSNZYjkDL8S9i8R/BL8GHUzBrPDjrwpf1Mny/vIoeW4vlKKcGaf
VcWFjh8LDO85zl1yvcEI1erFT9ZNHCF+qtpCTVuDdMPKozJUAPehkjA=
-----END RSA PRIVATE KEY-----
apps/bStandardMiniApp/ci/upload.js
@@ -27,7 +27,7 @@
  return {
    weapp: {
      appid: config.appid,
      privateKeyPath: `${projectPath}/ci/private.wx3669dd12a0915f7d.key`,
      privateKeyPath: `${projectPath}/ci/private.wxc47d6f255e7d0566.key`,
      robot: robot,
      setting: {
        minify: false,
apps/housekeepingMiniApp/src/app.config.ts
@@ -96,6 +96,8 @@
        'addStandardOrder/addStandardOrder',
        'chooseSupplier/chooseSupplier',
        'chooseEnterpriseEmployee/chooseEnterpriseEmployee',
        'EnterpriseEmployeeDetail/EnterpriseEmployeeDetail',
        'supplierDetail/supplierDetail',
      ],
    },
    {
apps/housekeepingMiniApp/src/components/JobDetailContent/JobDetailContent.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
<template>
  <ContentView style="background-color: transparent" class="job-detail-content">
    <FlexJobTopView
      :avatar="avatar"
      :name="name"
      :age="age"
      :isReal="isReal"
      :gender="gender"
      :personalIdentityContent="personalIdentityContent"
      :educationalBackgroundContent="educationalBackgroundContent"
      :taskCount="taskCount"
      size="small"
      class="job-detail-content-top"
    />
    <div class="job-detail-content-contact-info">
      <div class="job-detail-content-contact-info-item">
        <div class="job-detail-content-contact-info-item-label">手机号:</div>
        <div class="job-detail-content-contact-info-item-text">
          {{ isCollapse ? contactPhoneNumber : '立即联系后可查看' }}
        </div>
      </div>
      <div class="job-detail-content-contact-info-item">
        <div class="job-detail-content-contact-info-item-label">身份证号:</div>
        <div class="job-detail-content-contact-info-item-text">
          {{ isCollapse ? hiddenIDNumberForEnd4(identity) : '立即联系后可查看' }}
        </div>
      </div>
    </div>
  </ContentView>
  <div style="flex: 1; min-height: 0">
    <ProTabs
      v-model="tab"
      name="job-detail-content-tab"
      :showSmile="false"
      class="job-detail-content-tabs"
      isTransparent
      title-gutter="8"
      fullHeight
    >
      <ProTabPane :title="`简历`" pane-key="1">
        <curriculumView
          :userExpectJobs="userExpectJobs"
          :freeTime="freeTime"
          :jobSeekingStatus="jobSeekingStatus"
          :userCredentials="userCredentials"
          :workSeniority="workSeniority"
          :workExperience="workExperience"
          :photos="photos"
          :height="height"
          :weight="weight"
          :shoeSize="shoeSize"
          :videos="videos"
        />
      </ProTabPane>
      <ProTabPane :title="`经历`" pane-key="2">
        <experienceView :taskInfoUsers="taskInfoUsers" />
      </ProTabPane>
    </ProTabs>
  </div>
  <PageFooter>
    <slot name="footer"></slot>
  </PageFooter>
</template>
<script setup lang="ts">
import { FlexJobTopView, ProTabs, ProTabPane } from '@12333/components';
import { hiddenIDNumberForEnd4 } from '@12333/utils';
import curriculumView from './components/curriculumView.vue';
import experienceView from './components/experienceView.vue';
import { EnumUserGender } from '@12333/constants';
defineOptions({
  name: 'JobDetailContent',
});
type Props = {
  isCollapse: boolean;
  avatar?: string;
  name?: string;
  gender?: EnumUserGender;
  age?: number;
  isReal?: boolean;
  personalIdentityContent?: string;
  educationalBackgroundContent?: string;
  taskCount?: number;
  contactPhoneNumber?: string;
  identity?: string;
  userExpectJobs?: API.GetUserResumeQueryResultExpectJob[];
  freeTime?: API.EnumPersonalFreeTime;
  jobSeekingStatus?: API.EnumPersonalJobSeekingStatus;
  userCredentials?: API.GetUserResumeQueryResultCredential[];
  workSeniority?: string;
  workExperience?: string;
  photos?: string[];
  videos?: string[];
  /** èº«é«˜ */
  height?: number;
  /** ä½“重 */
  weight?: number;
  shoeSize?: number;
  taskInfoUsers?: API.GetUserResumeQueryResultExperience[];
};
const tab = ref('1');
const props = withDefaults(defineProps<Props>(), {});
</script>
<style lang="scss">
@import '@/styles/common.scss';
.job-detail-content-top {
  margin-bottom: 20px;
}
.job-detail-content-contact-info {
  padding-left: 130px;
  margin-bottom: 78px;
  .job-detail-content-contact-info-item {
    display: flex;
    align-items: center;
    font-weight: 400;
    font-size: 24px;
    line-height: 28px;
    margin-bottom: 22px;
    &:last-child {
      margin-bottom: 0;
    }
    .job-detail-content-contact-info-item-label {
      color: boleGetCssVar('text-color', 'secondary');
      margin-right: 8px;
    }
    .job-detail-content-contact-info-item-text {
      color: boleGetCssVar('text-color', 'primary');
      flex: 1;
      min-width: 0;
      @include ellipsis;
    }
  }
}
</style>
apps/housekeepingMiniApp/src/components/JobDetailContent/components/CurriculumViewItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
<template>
  <div class="curriculum-list-item">
    <div class="curriculum-list-item-label" :style="{ width: props.labelWidth }">
      {{ props.label }}
    </div>
    <div class="curriculum-list-item-text">
      <slot>{{ props.text }}</slot>
    </div>
  </div>
</template>
<script setup lang="ts">
defineOptions({
  name: 'CurriculumViewItem',
});
type Props = {
  label?: string;
  text?: string;
  labelWidth?: number | string;
};
const props = withDefaults(defineProps<Props>(), {
  labelWidth: 'auto',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
.job-detail-content-tabs {
  .curriculum-list-item {
    display: flex;
    margin-bottom: 14px;
    font-weight: 400;
    font-size: 24px;
    line-height: 36px;
    &:last-child {
      margin-bottom: 0;
    }
    .curriculum-list-item-label {
      color: boleGetCssVar('text-color', 'secondary');
    }
    .curriculum-list-item-text {
      color: boleGetCssVar('text-color', 'primary');
      flex: 1;
      min-width: 0;
      @include ellipsis;
    }
  }
}
</style>
apps/housekeepingMiniApp/src/components/JobDetailContent/components/curriculumView.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,157 @@
<template>
  <ContentScrollView>
    <Cell :show-title="false">
      <!-- <CellChunk title="求职意向">
        <div class="curriculum-list">
          <CurriculumViewItem label="期望岗位:">
            <div class="curriculum-position-list">
              <div
                v-for="userExpectJob in userExpectJobs"
                :key="userExpectJob.expectJobCode"
                class="curriculum-position-list-item"
              >
                {{ userExpectJob.expectJobContent }}
              </div>
            </div>
          </CurriculumViewItem>
          <CurriculumViewItem label="空闲时间:" :text="EnumPersonalFreeTimeText[freeTime]">
          </CurriculumViewItem>
          <CurriculumViewItem
            label="求职状态:"
            :text="EnumPersonalJobSeekingStatusText[jobSeekingStatus]"
          >
          </CurriculumViewItem>
        </div>
      </CellChunk> -->
      <CellChunk title="资格证书" v-if="_userCredentials.length > 0">
        <nut-grid square :column-num="3" :border="false" :gutter="20" class="pro-img-grid">
          <nut-grid-item
            v-for="(item, index) in _userCredentials"
            :key="item"
            class="pro-img-grid-item"
          >
            <div class="pro-img-grid-img-item">
              <PreviewImage :src="item" class="pro-img-grid-img" :urls="_userCredentials" />
            </div>
          </nut-grid-item>
        </nut-grid>
      </CellChunk>
      <CellChunk title="工作经验">
        <CurriculumViewItem label="工作年限:" :text="workSeniority"> </CurriculumViewItem>
        <CurriculumViewItem label="工作经验:" :text="workExperience"> </CurriculumViewItem>
      </CellChunk>
      <CellChunk title="详细信息">
        <CurriculumViewItem
          label="身高:"
          :text="height && `${height} cm`"
          :label-width="labelWidth"
        ></CurriculumViewItem>
        <CurriculumViewItem
          label="体重:"
          :text="weight && `${weight} kg`"
          :label-width="labelWidth"
        ></CurriculumViewItem>
        <CurriculumViewItem
          label="鞋码:"
          :text="shoeSize && `${shoeSize} ç `"
          :label-width="labelWidth"
        ></CurriculumViewItem>
        <CurriculumViewItem label="个人照片:">
          <nut-grid
            square
            :column-num="2"
            :border="false"
            :gutter="20"
            v-if="_photos.length > 0"
            class="pro-img-grid"
          >
            <nut-grid-item v-for="(item, index) in _photos" :key="item" class="pro-img-grid-item">
              <div class="pro-img-grid-img-item">
                <PreviewImage :src="item" class="pro-img-grid-img" :urls="_photos" />
              </div>
            </nut-grid-item>
          </nut-grid>
        </CurriculumViewItem>
        <CurriculumViewItem label="个人视频:">
          <nut-grid
            square
            :column-num="2"
            :border="false"
            :gutter="20"
            v-if="_photos.length > 0"
            class="pro-img-grid"
          >
            <nut-grid-item v-for="(item, index) in _videos" :key="item" class="pro-img-grid-item">
              <div class="pro-img-grid-img-item">
                <video class="pro-img-grid-img" :src="item" />
              </div>
            </nut-grid-item>
          </nut-grid>
        </CurriculumViewItem>
      </CellChunk>
    </Cell>
  </ContentScrollView>
</template>
<script setup lang="ts">
import CurriculumViewItem from './CurriculumViewItem.vue';
import { PreviewImage, Cell, CellChunk } from '@12333/components';
import Taro from '@tarojs/taro';
import { EnumPersonalFreeTimeText, EnumPersonalJobSeekingStatusText } from '@12333/constants';
import { setOSSLink } from '@12333/utils';
import { Video } from '@tarojs/components';
defineOptions({
  name: 'curriculumView',
});
type Props = {
  userExpectJobs?: API.GetUserResumeQueryResultExpectJob[];
  freeTime?: API.EnumPersonalFreeTime;
  jobSeekingStatus?: API.EnumPersonalJobSeekingStatus;
  userCredentials?: API.GetUserResumeQueryResultCredential[];
  workSeniority?: string;
  workExperience?: string;
  photos?: string[];
  videos?: string[];
  /** èº«é«˜ */
  height?: number;
  /** ä½“重 */
  weight?: number;
  shoeSize?: number;
};
const props = withDefaults(defineProps<Props>(), {
  userExpectJobs: () => [],
  userCredentials: () => [],
  photos: () => [],
  videos: () => [],
});
const _userCredentials = computed(() => props.userCredentials.map((x) => setOSSLink(x.img)));
const _photos = computed(() => props.photos.map((x) => setOSSLink(x)));
const _videos = computed(() => props.videos.map((x) => setOSSLink(x)));
const labelWidth = Taro.pxTransform(120);
</script>
<style lang="scss">
@import '@/styles/common.scss';
.job-detail-content-tabs {
  .curriculum-position-list {
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    column-gap: 24px;
    row-gap: 16px;
    .curriculum-position-list-item {
      font-weight: 500;
      font-size: 24px;
      color: boleGetCssVar('color', 'warning');
      line-height: 36px;
    }
  }
}
</style>
apps/housekeepingMiniApp/src/components/JobDetailContent/components/experienceView.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
<template>
  <ContentScrollView>
    <Cell title="岗位经历">
      <nut-steps
        v-if="taskInfoUsers.length > 0"
        direction="vertical"
        progress-dot
        :current="10000003"
        class="job-detail-content-steps"
      >
        <nut-step
          v-for="(taskInfoUser, index) in taskInfoUsers"
          :key="index"
          :title="dayjs(taskInfoUser.hireTime).format('YYYY.MM.DD')"
        >
          <template #content>
            <p>在{{ taskInfoUser.enterpriseName }}:</p>
            <p>做过{{ taskInfoUser.name }}</p>
          </template>
        </nut-step>
      </nut-steps>
      <NoData v-else />
    </Cell>
  </ContentScrollView>
</template>
<script setup lang="ts">
import NoData from '../../NoData/NoData.vue';
import dayjs from 'dayjs';
import { Cell } from '@12333/components';
defineOptions({
  name: 'experienceView',
});
type Props = {
  taskInfoUsers?: API.GetUserResumeQueryResultExperience[];
};
const props = withDefaults(defineProps<Props>(), {
  taskInfoUsers: () => [],
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
.job-detail-content-tabs {
  .job-detail-content-steps {
    .nut-step-main {
      margin-bottom: 40px;
    }
    .nut-step:last-child {
      .nut-step-main {
        margin-bottom: 0;
      }
    }
  }
}
</style>
apps/housekeepingMiniApp/src/constants/router.ts
@@ -37,6 +37,8 @@
  addStandardOrder = '/subpackages/sercice/addStandardOrder/addStandardOrder',
  chooseSupplier = '/subpackages/sercice/chooseSupplier/chooseSupplier',
  chooseEnterpriseEmployee = '/subpackages/sercice/chooseEnterpriseEmployee/chooseEnterpriseEmployee',
  EnterpriseEmployeeDetail = '/subpackages/sercice/EnterpriseEmployeeDetail/EnterpriseEmployeeDetail',
  supplierDetail = '/subpackages/sercice/supplierDetail/supplierDetail',
  extraPage = '/subpackages/extraPage/extraPage/extraPage',
}
apps/housekeepingMiniApp/src/hooks/user.ts
@@ -20,7 +20,7 @@
  });
  const displayName = computed(() =>
    userDetail.value.enterpriseIsReal ? userDetail.value.enterpriseName : userDetail.value.name
    userDetail.value?.enterpriseIsReal ? userDetail.value?.enterpriseName : userDetail.value?.name
  );
  return {
apps/housekeepingMiniApp/src/pages/mine/index.vue
@@ -76,7 +76,7 @@
        <ListItem :icon="IconCollect" title="收藏夹" @click="goMineCollectTask"></ListItem>
        <ListItem
          :icon="IconRecruit"
          v-if="!userDetail.enterpriseIsReal"
          v-if="!userDetail?.enterpriseIsReal"
          title="升级企业版"
          @click="goCompanyInfo"
        ></ListItem>
apps/housekeepingMiniApp/src/stores/modules/user.ts
@@ -107,8 +107,8 @@
            accessToken: wxMiniAppUserLoginRes.accessToken,
          });
          res.accessToken = bindRes.accessToken;
          this.loginSuccess(res);
        }
        this.loginSuccess(res);
        return res;
      } catch (error) {
        console.log('error3: ', error);
@@ -213,6 +213,7 @@
    },
    setUserInfoAction(info: API.LoginCommandCallback) {
      console.log('info: ', info);
      this.userInfo = {
        ...this.userInfo,
        ...info,
apps/housekeepingMiniApp/src/subpackages/login/authorization/authorization.vue
@@ -116,7 +116,9 @@
        type: AppLocalConfig.userType,
        enterpriseType: AppLocalConfig.enterpriseType,
      };
      wxMiniAppUserLoginRes.value = await authServices.wxmpLogin(params);
      wxMiniAppUserLoginRes.value = await authServices.wxmpLogin(params, {
        getResponse: true,
      });
      if (wxMiniAppUserLoginRes.value?.isBindPhoneNumber) {
        isAccount.value = true;
      }
apps/housekeepingMiniApp/src/subpackages/mine/addressManange/InnerPage.vue
@@ -35,7 +35,7 @@
const dataOptions = reactive({
  id: 'id',
  addressDetail: 'addressDetail',
  fullAddress: 'addressName',
  addressName: 'name',
  phone: 'contactPhoneNumber',
  defaultAddress: 'isDefault',
apps/housekeepingMiniApp/src/subpackages/mine/editAddress/InnerPage.vue
@@ -1,7 +1,7 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules" label-position="top">
      <nut-form-item label="姓名:" class="bole-form-item" prop="name" required>
      <nut-form-item label="姓名:" class="bole-form-item" prop="name">
        <nut-input v-model="form.name" placeholder="请输入姓名"> </nut-input>
      </nut-form-item>
      <nut-form-item label="手机号:" class="bole-form-item" prop="contactPhoneNumber" required>
@@ -73,7 +73,7 @@
});
const rules = reactive<FormRules>({
  name: [{ required: true, message: '请输入姓名' }],
  // name: [{ required: true, message: '请输入姓名' }],
  contactPhoneNumber: [
    { required: true, message: '请输入手机号' },
    { validator: FormValidator.validatorPhoneNumber, message: '请输入正确的手机号' },
apps/housekeepingMiniApp/src/subpackages/mine/mineReserveService/InnerPage.vue
@@ -75,7 +75,7 @@
// onMounted(() => {
//   standardOrderServices.checkPayStandardOrder({
//     id: 'ca8c17a1-6c44-446e-2e88-08de443f2678',
//     id: 'ac33ec5d-5972-45e0-63a5-08de46a118d9',
//   });
// });
apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/InnerPage.vue
@@ -4,7 +4,7 @@
      <nut-form-item label="头像:" class="bole-form-item" prop="avatar">
        <Uploader v-model:file-list="form.avatar" :maximum="1" class="bole-uploader"> </Uploader>
      </nut-form-item>
      <nut-form-item label="姓名:" class="bole-form-item" prop="name" required>
      <nut-form-item label="姓名:" class="bole-form-item" prop="name">
        <nut-input
          v-model.trim="form.name"
          placeholder="请输入姓名"
@@ -47,7 +47,7 @@
});
const rules = reactive<FormRules>({
  name: [{ required: true, message: '请输入姓名' }],
  // name: [{ required: true, message: '请输入姓名' }],
  contactPhoneNumber: [
    { required: true, message: '请输入手机号' },
    { validator: FormValidator.validatorPhoneNumber, message: '请输入正确的手机号' },
apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue
@@ -3,7 +3,7 @@
    <List>
      <ListItem
        title="公司信息"
        v-if="userDetail.enterpriseIsReal"
        v-if="userDetail?.enterpriseIsReal"
        @click="goCompanyInfo"
      ></ListItem>
      <ListItem title="个人信息" v-else @click="goPersonalInfo"></ListItem>
apps/housekeepingMiniApp/src/subpackages/sercice/EnterpriseEmployeeDetail/EnterpriseEmployeeDetail.config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/housekeepingMiniApp/src/subpackages/sercice/EnterpriseEmployeeDetail/EnterpriseEmployeeDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="enterpriseEmployeeDetail-page-wrapper" title="服务人员详情">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'EnterpriseEmployeeDetail',
});
</script>
apps/housekeepingMiniApp/src/subpackages/sercice/EnterpriseEmployeeDetail/InnerPage.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
<template>
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
    <JobDetailContent
      :avatar="userResumeInfo.avatar"
      :name="userResumeInfo.name"
      :age="userResumeInfo.age"
      :isReal="userResumeInfo.isReal"
      :gender="userResumeInfo.gender"
      :personalIdentityContent="userResumeInfo.personalIdentityContent"
      :educationalBackgroundContent="userResumeInfo.educationalBackgroundContent"
      :taskCount="userResumeInfo.taskCount"
      :contactPhoneNumber="userResumeInfo.contactPhoneNumber"
      :identity="userResumeInfo.identity"
      :isCollapse="isCollapse"
      :userExpectJobs="userResumeInfo.userExpectJobs"
      :freeTime="userResumeInfo.freeTime"
      :jobSeekingStatus="userResumeInfo.jobSeekingStatus"
      :userCredentials="userResumeInfo.userCredentials"
      :workSeniority="userResumeInfo.workSeniority"
      :workExperience="userResumeInfo.workExperience"
      :photos="userResumeInfo.photos"
      :height="userResumeInfo.height"
      :weight="userResumeInfo.weight"
      :shoeSize="userResumeInfo.shoeSize"
      :videos="userResumeInfo.videos"
      :taskInfoUsers="userResumeInfo.taskInfoUsers"
    >
      <template #footer>
        <PageFooterAction
          :icon="IconShare"
          text="分享"
          :isFlex="false"
          openType="share"
        ></PageFooterAction>
        <!-- <PageFooterAction
            :icon="userResumeInfo.isCollected ? IconAttentionActive : IconAttention"
            text="收藏"
            :isFlex="false"
            @click="handleAttention"
          ></PageFooterAction> -->
        <PageFooterBtn type="primary" @click="handleContact">立即联系</PageFooterBtn>
      </template>
    </JobDetailContent>
  </LoadingLayout>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
import { useToggle } from 'senin-mini/hooks';
import { Message } from '@12333/utils';
import { useUserResume } from '@12333/hooks';
import { useAccessLogin } from '@/hooks';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import IconShare from '@/assets/flexJob/icon-share.png';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const enterpriseEmployeeId = router.params?.id ?? '';
const userId = router.params?.userId ?? '';
const { isLoading, isError, userResumeInfo, refetch } = useUserResume({
  userId: userId,
});
const { isCollapse, toggle } = useToggle();
const handleContact = useAccessLogin(async () => {
  try {
    if (!isCollapse.value) {
      await userResumeServices.contactUserResume({ id: userId });
      toggle();
    } else {
      Taro.makePhoneCall({
        phoneNumber: userResumeInfo.value.contactPhoneNumber,
      });
    }
  } catch (error) {}
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/housekeepingMiniApp/src/subpackages/sercice/addStandardOrder/InnerPage.vue
@@ -75,6 +75,19 @@
          ></ChooseInputWithSuppliers>
        </nut-form-item>
        <nut-form-item
          label="支付通道:"
          class="bole-form-item"
          prop="payAccess"
          label-width="90px"
          required
        >
          <ChooseInputWithPicker
            v-model="form.payAccess"
            placeholder="请选择支付通道"
            :value-enum="EnumUserBankCardAccessTextFormStandard"
          />
        </nut-form-item>
        <nut-form-item
          label="备注:"
          class="bole-form-item alignTop"
          prop="remark"
@@ -118,6 +131,7 @@
  List,
  ListItem,
  ChooseInputWithDatePicker,
  ChooseInputWithPicker,
} from '@12333/components';
import Taro from '@tarojs/taro';
import { RouterPath } from '@/constants';
@@ -125,7 +139,7 @@
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 { EnumUserBankCardAccess, EnumUserBankCardAccessTextFormStandard } from '@12333/constants';
import { Message } from '@12333/utils';
defineOptions({
@@ -147,6 +161,7 @@
  enterpriseEmployeeId: '',
  enterpriseEmployeeName: '',
  remark: '',
  payAccess: EnumUserBankCardAccess.WeChatPay,
});
const nowDate = dayjs().toDate();
@@ -169,6 +184,7 @@
  beginTime: [{ required: true, message: '请选择服务开始时间' }],
  endTime: [{ required: true, message: '请选择服务结束时间' }],
  enterpriseEmployeeId: [{ required: true, message: '请选择服务机构' }],
  payAccess: [{ required: true, message: '请选择支付通道' }],
});
const { isLoading, isError, detail, refetch } = useStandardServiceDetail({
@@ -293,11 +309,13 @@
        paySign: res.paySign,
      });
      Message.success('支付成功');
      Taro.redirectTo({
        url: `${RouterPath.mineOrderDetail}?id=${orderId}`,
      });
    }
  } catch (error) {}
  } catch (error) {
  } finally {
    Taro.redirectTo({
      url: `${RouterPath.mineOrderDetail}?id=${orderId}`,
    });
  }
}
</script>
apps/housekeepingMiniApp/src/subpackages/sercice/chooseEnterpriseEmployee/InnerPage.vue
@@ -16,7 +16,9 @@
        :workExperience="item.workExperience"
      >
        <template #actions>
          <nut-button type="primary" plain>查看详情</nut-button>
          <nut-button type="primary" plain @click="goEnterpriseEmployeeDetail(item)"
            >查看详情</nut-button
          >
          <nut-button type="primary" @click="handleChoose(item)">选择</nut-button>
        </template>
      </ChooseServerCard>
@@ -70,4 +72,10 @@
  } as SelectEnterpriseEmployeeEvent);
  goBack(2);
}
function goEnterpriseEmployeeDetail(item: API.GetStandardServiceServersQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.EnterpriseEmployeeDetail}?id=${item.id}&userId=${item.userId}`,
  });
}
</script>
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/InnerPage.vue
@@ -12,7 +12,7 @@
        :serviceCount="item.serviceCount"
      >
        <template #actions>
          <nut-button type="primary" plain>查看详情</nut-button>
          <nut-button type="primary" plain @click="goSupplierDetail(item)">查看详情</nut-button>
          <nut-button type="primary" @click="goEnterpriseEmployee(item)">选择</nut-button>
        </template>
      </ChooseSupplierCard>
@@ -69,4 +69,10 @@
    },
  });
}
function goSupplierDetail(item: API.GetStandardServiceSupplierEnterprisesQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.supplierDetail}?id=${item.id}`,
  });
}
</script>
apps/housekeepingMiniApp/src/subpackages/sercice/chooseSupplier/chooseSupplier.vue
@@ -1,5 +1,5 @@
<template>
  <PageLayoutWithBg class="addStandardOrder-page-wrapper" title="选择服务机构">
  <PageLayoutWithBg class="chooseSupplier-page-wrapper" title="选择服务机构">
    <InnerPage />
  </PageLayoutWithBg>
</template>
apps/housekeepingMiniApp/src/subpackages/sercice/serciceDetail/serciceDetail.vue
@@ -137,7 +137,7 @@
    ];
    skuState.goods = {
      skuId: SkuUtils.DefaultSkuSpecId,
      price: toThousand(res.specs[0].price),
      price: res.specs[0].price,
      imagePath: setOSSLink(res.files[0]),
      name: res.name,
    };
@@ -166,7 +166,7 @@
  });
});
async function handleAttention() {
const handleAttention = useAccessLogin(async () => {
  try {
    let params: API.CollectionStandardServiceCommand = {
      ids: [id],
@@ -177,7 +177,7 @@
      refetch({ type: 'inactive' });
    }
  } catch (error) {}
}
});
</script>
<style lang="scss">
apps/housekeepingMiniApp/src/subpackages/sercice/supplierDetail/InnerPage.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
<template>
  <div></div>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
// import CompanyDesc from '../components/CompanyDesc.vue';
// import CompanyTaskList from '../components/CompanyTaskList.vue';
// import CompanyInfo from '../components/CompanyInfo.vue';
import { ProTabs, ProTabPane } from '@12333/components';
// import { useEnterpriseDetail } from '@12333/hooks';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const enterpriseId = router.params?.id ?? '';
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/housekeepingMiniApp/src/subpackages/sercice/supplierDetail/supplierDetail.config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/housekeepingMiniApp/src/subpackages/sercice/supplierDetail/supplierDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="supplierDetail-page-wrapper" title="服务机构详情">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'supplierDetail',
});
</script>
apps/housekeepingMiniApp/src/utils/request/index.ts
@@ -47,9 +47,9 @@
  REDIRECT = 9,
}
// ä¸ŽåŽç«¯çº¦å®šçš„响应数据格式
interface ResponseStructure {
export interface ResponseStructure<TData = any> {
  success: boolean;
  data: any;
  data: TData;
  /**
   * http状态吗
   */
package.json
@@ -29,6 +29,10 @@
    "UnderTakeClient:staging:build": "pnpm run -C apps/underTakeMiniApp build:weapp:staging:upload",
    "Housekeeping:build": "pnpm run -C apps/housekeepingMiniApp build:weapp:upload",
    "Housekeeping:staging:build": "pnpm run -C apps/housekeepingMiniApp build:weapp:staging:upload",
    "CStandard:build": "pnpm run -C apps/cStandardMiniApp build:weapp:upload",
    "CStandard:staging:build": "pnpm run -C apps/cStandardMiniApp build:weapp:staging:upload",
    "BStandard:build": "pnpm run -C apps/bStandardMiniApp build:weapp:upload",
    "BStandard:staging:build": "pnpm run -C apps/bStandardMiniApp build:weapp:staging:upload",
    "build:all": "pnpm run -r --parallel build:weapp:upload"
  },
  "browserslist": [
packages/components/src/Sku/sku.ts
@@ -12,7 +12,7 @@
export type Goods = {
  imagePath: string;
  price: string;
  price: number;
  skuId: string;
  name: string;
};
packages/constants/apiEnum.ts
@@ -265,6 +265,8 @@
export enum EnumEnterpriseWalletTransactionType {
  /**充值 */
  Recharge = 10,
  /**收入 */
  Income = 11,
  /**转账 */
  Transfer = 20,
}
packages/hooks/standardOrder.ts
@@ -19,13 +19,13 @@
export function useStandardServiceDetail({ id, onSuccess }: UseStandardServiceDetailOptions) {
  const { data, refetch, isLoading, isError } = useQuery({
    queryKey: ['standardServiceServices/getStandardService', id],
    queryKey: ['standardServiceServices/getOpenStandardService', id],
    queryFn: async () => {
      let params: API.APIgetStandardServiceParams = {
        id: unref(id),
      };
      return await standardServiceServices.getStandardService(params, {
      return await standardServiceServices.getOpenStandardService(params, {
        showLoading: false,
      });
    },
@@ -36,11 +36,12 @@
  });
  const minPrice = computed(() => {
    if (!data.value?.specs?.length) {
      return 0;
    } else {
      return Math.min(...data.value.specs.map((x) => x.price));
    }
    // if (!data.value?.specs?.length) {
    //   return 0;
    // } else {
    //   return Math.min(...data.value.specs.map((x) => x.price));
    // }
    return data.value?.minSpecPrice ?? 0;
  });
  return {
packages/services/apiV2/index.ts
@@ -9,13 +9,13 @@
import * as task from './task';
import * as enterpriseWallet from './enterpriseWallet';
import * as ocrUtils from './ocrUtils';
import * as standardOrder from './standardOrder';
import * as electronSign from './electronSign';
import * as resource from './resource';
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';
@@ -40,13 +40,13 @@
  task,
  enterpriseWallet,
  ocrUtils,
  standardOrder,
  electronSign,
  resource,
  logRecords,
  dictionary,
  taskCheckReceive,
  taskUser,
  standardOrder,
  standardService,
  userResume,
  auth,
packages/services/apiV2/standardOrder.ts
@@ -98,6 +98,24 @@
  });
}
/** æŸ¥è¯¢æ ‡å‡†è®¢å•结算详情 GET /api/flexjob/standardOrder/getStandardOrderSettlement */
export async function getStandardOrderSettlement(
  // å åŠ ç”Ÿæˆçš„Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetStandardOrderSettlementParams,
  options?: API.RequestConfig
) {
  return request<API.GetStandardOrderSettlementQueryResult>(
    '/api/flexjob/standardOrder/getStandardOrderSettlement',
    {
      method: 'GET',
      params: {
        ...params,
      },
      ...(options || {}),
    }
  );
}
/** æŸ¥è¯¢æ ‡å‡†è®¢å•详情 GET /api/flexjob/standardOrder/getSureStandardOrder */
export async function getSureStandardOrder(
  // å åŠ ç”Ÿæˆçš„Param类型 (非body参数swagger默认没有生成对象)
packages/services/apiV2/typings.d.ts
@@ -408,6 +408,11 @@
    scene?: EnumGetStandardOrdersQueryScene;
  }
  interface APIgetStandardOrderSettlementParams {
    /** è®¢å•Id */
    id?: string;
  }
  interface APIgetStandardServiceParams {
    /** Id */
    id?: string;
@@ -1222,6 +1227,8 @@
  enum EnumEnterpriseWalletTransactionType {
    /**充值 */
    Recharge = 10,
    /**收入 */
    Income = 11,
    /**转账 */
    Transfer = 20,
  }
@@ -3447,6 +3454,24 @@
    timestamp?: number;
  }
  interface FriendlyResultGetStandardOrderSettlementQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
    /** çŠ¶æ€ç  */
    code?: number;
    /** é”™è¯¯ç  */
    errorCode?: string;
    data?: GetStandardOrderSettlementQueryResult;
    /** æ‰§è¡ŒæˆåŠŸ */
    success?: boolean;
    /** é”™è¯¯ä¿¡æ¯ */
    msg?: any;
    /** é™„加数据 */
    extras?: any;
    /** æ—¶é—´æˆ³ */
    timestamp?: number;
  }
  interface FriendlyResultGetStandardOrdersQueryResult {
    /** è·Ÿè¸ªId */
    traceId?: string;
@@ -8228,6 +8253,38 @@
    contactPhoneNumber?: string;
  }
  interface GetStandardOrderSettlementQueryResult {
    /** è®¢å•Id */
    id?: string;
    /** ä»˜æ¬¾äººè´¦æˆ· */
    payerAccount?: string;
    /** ä»˜æ¬¾äººåç§° */
    payerName?: string;
    /** ä»˜æ¬¾äººå¼€æˆ·è¡Œ */
    payerBank?: string;
    /** ä»˜æ¬¾äººæ”¯è¡Œ */
    payerBankBranch?: string;
    /** æ”¶æ¬¾äººå§“名 */
    receiveName?: string;
    /** æ”¶æ¬¾è´¦æˆ· */
    receiveAccount?: string;
    /** æ”¶æ¬¾äººå¼€æˆ·è¡Œ */
    receiveBank?: string;
    /** æ”¶æ¬¾äººæ”¯è¡Œ */
    receiveBankBranch?: string;
    /** å¸ç§ */
    currency?: string;
    /** å¸ç§ */
    currencyName?: string;
    settlementStatus?: EnumStandardOrderSettlementStatus;
    /** ç»“ç®—æ—¶é—´ */
    settlementTime?: string;
    /** ç»“算金额 */
    settlementAmount?: number;
    /** ç”µå­æ”¶æ®ä¸‹è½½é“¾æŽ¥ */
    ereceiptDownloadOssUrl?: string;
  }
  interface GetStandardOrdersQuery {
    scene?: EnumGetStandardOrdersQueryScene;
    /** å…³é”®å­—(订单号/服务名) */
@@ -8245,6 +8302,7 @@
    partAEnterpriseOrderStatus?: EnumGetStandardOrdersQueryPartAEnterpriseOrderStatus;
    supplierEnterpriseOrderStatus?: EnumGetStandardOrdersQuerySupplierEnterpriseOrderStatus;
    settlementStatus?: EnumStandardOrderSettlementStatus;
    taskCheckReceiveStatus?: EnumTaskCheckReceiveStatus;
    pageModel?: PagedListQueryPageModel;
  }
@@ -8418,6 +8476,8 @@
    id?: string;
    /** å¤´åƒ */
    avatar?: string;
    /** ç”¨æˆ·ID */
    userId?: string;
    /** å§“名 */
    name?: string;
    gender?: EnumUserGender;
packages/services/types.d.ts
@@ -1,4 +1,22 @@
declare module '@/utils/request' {
    export const request: IRequest;
    export interface ResponseStructure<TData = any> {
        success: boolean;
        data: TData;
        /**
         * http状态吗
         */
        code?: number;
        /**
         * é”™è¯¯ç 
         */
        errorCode?: string;
        /**
         * é”™è¯¯ä¿¡æ¯
         */
        msg?: string;
        showType?: ErrorShowType;
        traceId?: string;
    }
}