From 42eb8a173c746830a78e200b593c39b626d75579 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 23 十二月 2025 10:49:03 +0800
Subject: [PATCH] fix: 甲方小程序

---
 apps/housekeepingMiniApp/project.private.config.json                              |   18 ++
 apps/housekeepingMiniApp/src/constants/app.ts                                     |    2 
 apps/housekeepingMiniApp/src/pages/mine/index.vue                                 |    8 
 apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/InnerPage.vue          |  102 +++++++++++++++++
 apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.vue         |   17 ++
 apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.vue       |   17 ++
 apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.config.ts |    3 
 apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue                 |   15 ++
 apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/InnerPage.vue           |  152 +++++++++++++++++++++++++
 apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.config.ts   |    3 
 packages/hooks/identify.ts                                                        |   12 -
 apps/housekeepingMiniApp/src/app.config.ts                                        |    2 
 apps/housekeepingMiniApp/src/constants/router.ts                                  |    2 
 13 files changed, 336 insertions(+), 17 deletions(-)

diff --git a/apps/housekeepingMiniApp/project.private.config.json b/apps/housekeepingMiniApp/project.private.config.json
index 411eb40..bcf7e3c 100644
--- a/apps/housekeepingMiniApp/project.private.config.json
+++ b/apps/housekeepingMiniApp/project.private.config.json
@@ -23,13 +23,27 @@
         "miniprogram": {
             "list": [
                 {
-                    "name": "璁剧疆",
-                    "pathName": "subpackages/mine/setting/setting",
+                    "name": "浼佷笟淇℃伅",
+                    "pathName": "subpackages/mine/companyInfo/companyInfo",
                     "query": "",
                     "scene": null,
                     "launchMode": "default"
                 },
                 {
+                    "name": "涓汉淇℃伅",
+                    "pathName": "subpackages/mine/personalInfo/personalInfo",
+                    "query": "",
+                    "launchMode": "default",
+                    "scene": null
+                },
+                {
+                    "name": "璁剧疆",
+                    "pathName": "subpackages/mine/setting/setting",
+                    "query": "",
+                    "launchMode": "default",
+                    "scene": null
+                },
+                {
                     "name": "鏀惰棌",
                     "pathName": "subpackages/mine/mineCollectTask/mineCollectTask",
                     "query": "",
diff --git a/apps/housekeepingMiniApp/src/app.config.ts b/apps/housekeepingMiniApp/src/app.config.ts
index 2abdf2f..d484d36 100644
--- a/apps/housekeepingMiniApp/src/app.config.ts
+++ b/apps/housekeepingMiniApp/src/app.config.ts
@@ -79,6 +79,8 @@
         'mineReserveService/mineReserveService',
         'mineOrderManage/mineOrderManage',
         'setting/setting',
+        'personalInfo/personalInfo',
+        'companyInfo/companyInfo',
       ],
     },
     {
diff --git a/apps/housekeepingMiniApp/src/constants/app.ts b/apps/housekeepingMiniApp/src/constants/app.ts
index 6e317b5..990555e 100644
--- a/apps/housekeepingMiniApp/src/constants/app.ts
+++ b/apps/housekeepingMiniApp/src/constants/app.ts
@@ -1,7 +1,7 @@
 import { EnumUserType, EnumClientType } from '@12333/constants';
 
 export const AppLocalConfig = {
-  userType: EnumUserType.Personal,
+  userType: EnumUserType.Enterprise,
   clientType: EnumClientType.Wxmp,
 };
 
diff --git a/apps/housekeepingMiniApp/src/constants/router.ts b/apps/housekeepingMiniApp/src/constants/router.ts
index 8815c54..8cd6dc9 100644
--- a/apps/housekeepingMiniApp/src/constants/router.ts
+++ b/apps/housekeepingMiniApp/src/constants/router.ts
@@ -24,6 +24,8 @@
   mineReserveService = '/subpackages/mine/mineReserveService/mineReserveService',
   mineOrderManage = '/subpackages/mine/mineOrderManage/mineOrderManage',
   setting = '/subpackages/mine/setting/setting',
+  personalInfo = '/subpackages/mine/personalInfo/personalInfo',
+  companyInfo = '/subpackages/mine/companyInfo/companyInfo',
 
   serciceDetail = '/subpackages/sercice/serciceDetail/serciceDetail',
 
diff --git a/apps/housekeepingMiniApp/src/pages/mine/index.vue b/apps/housekeepingMiniApp/src/pages/mine/index.vue
index 32979ef..fe669fe 100644
--- a/apps/housekeepingMiniApp/src/pages/mine/index.vue
+++ b/apps/housekeepingMiniApp/src/pages/mine/index.vue
@@ -74,12 +74,12 @@
       <List class="mine-list-wrapper mine-setting-list">
         <ListItem :icon="IconCollect" title="璁㈠崟绠$悊" @click="goMineOrderManage"></ListItem>
         <ListItem :icon="IconCollect" title="鏀惰棌澶�" @click="goMineCollectTask"></ListItem>
-        <ListItem :icon="IconAgreement" title="鍗囩骇浼佷笟鐗�" @click="goAuthentication"></ListItem>
+        <ListItem :icon="IconAgreement" title="鍗囩骇浼佷笟鐗�" @click="goCompanyInfo"></ListItem>
         <ListItem :icon="IconSetting" title="璁剧疆" @click="goSetting"></ListItem>
         <!-- <ListItem :icon="IconRecruit" title="鎴戣鎷涗汉/鐢ㄤ汉" @click="goSetting"></ListItem> -->
       </List>
     </ContentScrollView>
-    <CustomerServiceButton />
+    <!-- <CustomerServiceButton /> -->
   </PageLayoutWithBg>
 </template>
 
@@ -154,8 +154,8 @@
   };
 });
 
-function goAuthentication() {
-  goPage(RouterPath.authenticationHome);
+function goCompanyInfo() {
+  goPage(RouterPath.companyInfo);
 }
 
 function goMineCollectTask() {
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/InnerPage.vue b/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/InnerPage.vue
new file mode 100644
index 0000000..96adbd7
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/InnerPage.vue
@@ -0,0 +1,152 @@
+<template>
+  <ContentScrollView :paddingH="false">
+    <nut-form :model-value="form" ref="formRef" :rules="rules">
+      <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 alignTop" prop="licenseUrl" required>
+        <Uploader
+          v-model:file-list="form.licenseUrl"
+          :maximum="1"
+          :limitFileSize="10"
+          class="bole-uploader nopaddingtop"
+          @my-success="handleLicenseUrlChange"
+        >
+        </Uploader>
+      </nut-form-item>
+      <nut-form-item label="浼佷笟鍚嶇О:" class="bole-form-item" prop="enterpriseName" required>
+        <nut-input
+          v-model.trim="form.enterpriseName"
+          class="nut-input-text bole-input-text"
+          placeholder="璇疯緭鍏ユ偍钀ヤ笟鎵х収涓婄殑浼佷笟鍚嶇О"
+          type="text"
+          :max-length="35"
+        />
+      </nut-form-item>
+      <nut-form-item
+        label="缁熶竴绀句細淇$敤浠g爜:"
+        class="bole-form-item"
+        prop="societyCreditCode"
+        required
+      >
+        <nut-input
+          v-model.trim="form.societyCreditCode"
+          class="nut-input-text bole-input-text"
+          placeholder="璇疯緭鍏ユ偍钀ヤ笟鎵х収涓婄殑淇$敤浠g爜"
+          type="text"
+        />
+      </nut-form-item>
+      <nut-form-item label="鎵嬫満鍙�:" class="bole-form-item" prop="contactPhoneNumber" required>
+        <nut-input
+          v-model.trim="form.contactPhoneNumber"
+          placeholder="璇疯緭鍏ユ墜鏈哄彿"
+          type="text"
+          disabled
+        />
+      </nut-form-item>
+    </nut-form>
+  </ContentScrollView>
+  <PageFooter>
+    <PageFooterBtn type="primary" @click="handleConfirm">淇濆瓨</PageFooterBtn>
+  </PageFooter>
+</template>
+
+<script setup lang="ts">
+import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
+import { convertApi2FormUrlOnlyOne, FormValidator, Message } from '@12333/utils';
+import { useUpdateResume } from '@12333/hooks';
+import * as userResumeServices from '@12333/services/apiV2/userResume';
+import Taro from '@tarojs/taro';
+import { useQuery } from '@tanstack/vue-query';
+import { goBack } from '@/utils';
+import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
+import { vatLicense } from '@12333/hooks';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const { updateUserResume } = useUpdateResume();
+
+const { userDetail } = useUser();
+
+const form = reactive({
+  avatar: [] as FileItem[],
+  licenseUrl: [] as FileItem[],
+  enterpriseName: '',
+  societyCreditCode: '',
+  contactPhoneNumber: '',
+});
+
+const { isLoading, isError, refetch } = useQuery({
+  queryKey: ['userResumeServices/getUserResumePersonal'],
+  queryFn: async () => {
+    return await userResumeServices.getUserResumePersonal(
+      {},
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetUserResumePersonalQueryResult),
+  onSuccess(data) {
+    form.avatar = convertApi2FormUrlOnlyOne(data.avatar);
+    form.contactPhoneNumber = data.contactPhoneNumber ?? '';
+  },
+});
+
+const handleLicenseUrlChange = (response: FileItem) => {
+  vatLicense(response, {
+    onSuccess(res) {
+      let tips: string[] = [];
+      res?.enterpriseName ? (form.enterpriseName = res.enterpriseName) : tips.push('鍟嗘埛鍚嶇О');
+      res?.societyCreditCode
+        ? (form.societyCreditCode = res.societyCreditCode)
+        : tips.push('缁熶竴绀句細淇$敤浠g爜');
+      if (tips.length > 0) {
+        Message.error(`鏈兘璇嗗埆鍒版偍涓婁紶鐨勫浘鐗囷紝璇烽噸鏂颁笂浼犳竻鏅扮殑鍥剧墖鎴栨墜鍔ㄨ緭鍏�${tips.join('鍜�')}`);
+      }
+    },
+  });
+};
+
+const rules = reactive<FormRules>({
+  licenseUrl: [
+    { required: true, message: '璇蜂笂浼犺惀涓氭墽鐓�', validator: FormValidator.validatorArray },
+  ],
+  enterpriseName: [{ required: true, message: '璇疯緭鍏ヤ紒涓氬悕绉�' }],
+  societyCreditCode: [
+    { required: true, message: '璇疯緭鍏ユ偍钀ヤ笟鎵х収涓婄殑淇$敤浠g爜' },
+    { message: '璇疯緭鍏ユ纭殑淇$敤浠g爜', validator: FormValidator.validatorSocietyCreditCode },
+  ],
+  contactPhoneNumber: [{ required: true, message: '璇疯緭鍏ユ墜鏈哄彿' }],
+});
+const formRef = ref<any>(null);
+function handleConfirm() {
+  if (!formRef.value) return;
+  formRef.value.validate().then(({ valid, errors }: any) => {
+    if (valid) {
+      confirm();
+    }
+  });
+}
+
+async function confirm() {
+  try {
+    let params: API.SaveUserResumePersonalCommand = {
+      name: form.name,
+      avatar: form.avatar?.[0]?.path ?? '',
+      contactPhoneNumber: form.contactPhoneNumber,
+    };
+    let res = await userResumeServices.saveUserResumePersonal(params);
+    if (res) {
+      Message.success('淇濆瓨鎴愬姛', {
+        onClosed() {
+          goBack();
+          updateUserResume();
+        },
+      });
+    }
+  } catch (error) {}
+}
+</script>
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.config.ts b/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.vue b/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.vue
new file mode 100644
index 0000000..d493460
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/companyInfo/companyInfo.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayout class="companyInfo-page-wrapper" :title="'浼佷笟淇℃伅'" has-border>
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'companyInfo',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/InnerPage.vue b/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/InnerPage.vue
new file mode 100644
index 0000000..d532c9c
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/InnerPage.vue
@@ -0,0 +1,102 @@
+<template>
+  <ContentScrollView :paddingH="false">
+    <nut-form :model-value="form" ref="formRef" :rules="rules">
+      <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-input
+          v-model.trim="form.name"
+          placeholder="璇疯緭鍏ュ鍚�"
+          :disabled="userDetail.isReal"
+        />
+      </nut-form-item>
+      <nut-form-item label="鎵嬫満鍙�:" class="bole-form-item" prop="contactPhoneNumber" required>
+        <nut-input
+          v-model.trim="form.contactPhoneNumber"
+          placeholder="璇疯緭鍏ユ墜鏈哄彿"
+          type="text"
+          disabled
+        />
+      </nut-form-item>
+    </nut-form>
+  </ContentScrollView>
+  <PageFooter>
+    <PageFooterBtn type="primary" @click="handleConfirm">淇濆瓨</PageFooterBtn>
+  </PageFooter>
+</template>
+
+<script setup lang="ts">
+import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
+import { convertApi2FormUrlOnlyOne, Message } from '@12333/utils';
+import { useUpdateResume } from '@12333/hooks';
+import * as userResumeServices from '@12333/services/apiV2/userResume';
+import Taro from '@tarojs/taro';
+import { useQuery } from '@tanstack/vue-query';
+import { goBack } from '@/utils';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const { updateUserResume } = useUpdateResume();
+
+const { userDetail } = useUser();
+
+const form = reactive({
+  avatar: [],
+  name: '',
+  contactPhoneNumber: '',
+});
+
+const { isLoading, isError, refetch } = useQuery({
+  queryKey: ['userResumeServices/getUserResumePersonal'],
+  queryFn: async () => {
+    return await userResumeServices.getUserResumePersonal(
+      {},
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetUserResumePersonalQueryResult),
+  onSuccess(data) {
+    form.avatar = convertApi2FormUrlOnlyOne(data.avatar);
+    form.name = data.name ?? '';
+    form.contactPhoneNumber = data.contactPhoneNumber ?? '';
+  },
+});
+
+const rules = reactive<FormRules>({
+  name: [{ required: true, message: '璇疯緭鍏ュ鍚�' }],
+  contactPhoneNumber: [{ required: true, message: '璇疯緭鍏ユ墜鏈哄彿' }],
+});
+const formRef = ref<any>(null);
+function handleConfirm() {
+  if (!formRef.value) return;
+  formRef.value.validate().then(({ valid, errors }: any) => {
+    if (valid) {
+      confirm();
+    }
+  });
+}
+
+async function confirm() {
+  try {
+    let params: API.SaveUserResumePersonalCommand = {
+      name: form.name,
+      avatar: form.avatar?.[0]?.path ?? '',
+      contactPhoneNumber: form.contactPhoneNumber,
+    };
+    let res = await userResumeServices.saveUserResumePersonal(params);
+    if (res) {
+      Message.success('淇濆瓨鎴愬姛', {
+        onClosed() {
+          goBack();
+          updateUserResume();
+        },
+      });
+    }
+  } catch (error) {}
+}
+</script>
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.config.ts b/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.vue b/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.vue
new file mode 100644
index 0000000..c2d0132
--- /dev/null
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/personalInfo/personalInfo.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayout class="personalInfo-page-wrapper" :title="'涓汉淇℃伅'" has-border>
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'personalInfo',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue b/apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue
index 515af4c..5990613 100644
--- a/apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue
+++ b/apps/housekeepingMiniApp/src/subpackages/mine/setting/setting.vue
@@ -1,7 +1,8 @@
 <template>
   <PageLayout title="璁剧疆" class="setting-page-wrapper" hasBorder>
     <List>
-      <ListItem title="涓汉淇℃伅" @click="goMineUserPolicy"></ListItem>
+      <ListItem title="涓汉淇℃伅" @click="goPersonalInfo"></ListItem>
+      <ListItem title="鍏徃淇℃伅" @click="goCompanyInfo"></ListItem>
       <ListItem title="鍦板潃绠$悊" @click="goMineUserPolicy"></ListItem>
       <ListItem title="闅愮鏀跨瓥" @click="goPrivacyPolicy"></ListItem>
       <ListItem title="閫�鍑虹櫥褰�" @click="handleLoginout"></ListItem>
@@ -39,6 +40,18 @@
   });
 }
 
+function goPersonalInfo() {
+  Taro.navigateTo({
+    url: RouterPath.personalInfo,
+  });
+}
+
+function goCompanyInfo() {
+  Taro.navigateTo({
+    url: RouterPath.companyInfo,
+  });
+}
+
 async function handleLoginout() {
   try {
     await Message.confirm({
diff --git a/packages/hooks/identify.ts b/packages/hooks/identify.ts
index 63b0a62..5db5d8e 100644
--- a/packages/hooks/identify.ts
+++ b/packages/hooks/identify.ts
@@ -1,26 +1,20 @@
 import { EnumOcrAccess } from '@12333/constants';
-import * as accountServices from '@12333/services/api/Account';
 import * as ocrUtilsServices from '@12333/services/apiV2/ocrUtils';
 import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
 import _ from 'lodash';
 
 type VatLicenseOptions = {
-  onSuccess?: (res: API.LicenseOcrModel) => any;
+  onSuccess?: (res: API.BaiduOcrBusinessLicenseResultModel) => any;
 };
 
 export async function vatLicense(response: FileItem, options: VatLicenseOptions = {}) {
   try {
     if (response?.url) {
       const { onSuccess } = options;
-      let res = await accountServices.vatLicense({
+      let res = await ocrUtilsServices.getLicenseOcr({
         url: response.url,
       });
-      onSuccess?.(
-        _.mapValues(res, (x) => {
-          if (x === '鏃�') return '';
-          return x;
-        })
-      );
+      onSuccess?.(res.model);
     }
   } catch (error) {}
 }

--
Gitblit v1.10.0