张涛 il y a 1 an
Parent
révision
b113d45cb6

+ 1
- 1
.env Voir le fichier

1
-VITE_SERVER_BASE=/api
1
+VITE_SERVER_BASE=/api/admin
2
 # VITE_LOGIN_URL=http://localhost:3009/admin/
2
 # VITE_LOGIN_URL=http://localhost:3009/admin/

+ 1
- 0
package.json Voir le fichier

19
     "classnames": "^2.3.2",
19
     "classnames": "^2.3.2",
20
     "echarts": "^5.4.0",
20
     "echarts": "^5.4.0",
21
     "i18next": "^23.9.0",
21
     "i18next": "^23.9.0",
22
+    "i18next-browser-languagedetector": "^7.2.0",
22
     "md5": "^2.3.0",
23
     "md5": "^2.3.0",
23
     "moment": "^2.29.4",
24
     "moment": "^2.29.4",
24
     "react": "18.2.0",
25
     "react": "18.2.0",

+ 62
- 43
src/components/Upload/UploadFile.jsx Voir le fichier

1
-import React, { useState } from 'react';
2
-import { LoadingOutlined, PlusOutlined, CloudUploadOutlined } from '@ant-design/icons';
3
-import { Button } from "antd";
4
-import { useTranslation } from 'react-i18next';
5
-import Upload from './Upload';
1
+import React, { useState } from "react";
2
+import {
3
+  LoadingOutlined,
4
+  PlusOutlined,
5
+  CloudUploadOutlined,
6
+} from "@ant-design/icons";
7
+import { Button, Image } from "antd";
8
+import { useTranslation } from "react-i18next";
9
+import Upload from "./Upload";
6
 import "./style.less";
10
 import "./style.less";
7
 
11
 
8
 export default (props) => {
12
 export default (props) => {
10
   const { t } = useTranslation();
14
   const { t } = useTranslation();
11
 
15
 
12
   const [loading, setLoading] = useState(false);
16
   const [loading, setLoading] = useState(false);
13
-  const [name, setName] = useState();
14
-
15
-  function beforeUpload (file) {
17
+  // const [name, setName] = useState();
16
 
18
 
19
+  function beforeUpload(file) {
17
     // const isImage = file.type === 'image/jpeg' || file.type === 'image/png'||file.type==='image/gif';
20
     // const isImage = file.type === 'image/jpeg' || file.type === 'image/png'||file.type==='image/gif';
18
     // if (!isImage) {
21
     // if (!isImage) {
19
     //   message.error('请上传 JPG , PNG或GIF 图片!');
22
     //   message.error('请上传 JPG , PNG或GIF 图片!');
28
   }
31
   }
29
 
32
 
30
   const UploadButton = (props) => (
33
   const UploadButton = (props) => (
31
-    <div style={{ textAlign: 'center', width: '260px' }}>
32
-      {props.loading ? <LoadingOutlined /> : <CloudUploadOutlined style={{ fontSize: '30px', color: '#1890ff' }} />}
33
-      <div style={{ marginTop: 8, fontSize: '16px', color: '#1890ff', fontWeight: 600 }}>{t('authentication.uploadText')}</div>
34
+    <div style={{ textAlign: "center", width: "260px" }}>
35
+      {props.loading ? (
36
+        <LoadingOutlined />
37
+      ) : (
38
+        <CloudUploadOutlined style={{ fontSize: "30px", color: "#1890ff" }} />
39
+      )}
40
+      <div
41
+        style={{
42
+          marginTop: 8,
43
+          fontSize: "16px",
44
+          color: "#1890ff",
45
+          fontWeight: 600,
46
+        }}
47
+      >
48
+        {t("authentication.uploadText")}
49
+      </div>
34
     </div>
50
     </div>
35
   );
51
   );
36
 
52
 
37
-  const handleChange = info => {
38
-    if (info.file.status === 'uploading') {
53
+  const handleChange = (info) => {
54
+    console.log(info);
55
+    if (info.file.status === "uploading") {
39
       setLoading(true);
56
       setLoading(true);
40
       return;
57
       return;
41
     }
58
     }
42
-    if (info.file.status === 'error') {
59
+    if (info.file.status === "error") {
43
       setLoading(false);
60
       setLoading(false);
44
       return;
61
       return;
45
     }
62
     }
46
 
63
 
47
-    if (info.file.status === 'done') {
64
+    if (info.file.status === "done") {
48
       setLoading(false);
65
       setLoading(false);
49
       const { url, fileType } = info.file.response;
66
       const { url, fileType } = info.file.response;
50
       onChange(url);
67
       onChange(url);
51
-      setName(info.file.name);
68
+      // setName(info.file.name);
52
     }
69
     }
53
   };
70
   };
54
 
71
 
72
+  console.log(value);
55
   return (
73
   return (
56
     <>
74
     <>
57
-
58
       {/* <div style={{ marginTop: '40px', fontSize: '16px' }}>{t('authentication.uploadTitle1')}</div> */}
75
       {/* <div style={{ marginTop: '40px', fontSize: '16px' }}>{t('authentication.uploadTitle1')}</div> */}
59
-      <div style={{ display: 'flex', alignItem: 'stretch' }}>
76
+      <div style={{ display: "flex", alignItem: "stretch" }}>
60
         <div className="authentication-right-upload-box">
77
         <div className="authentication-right-upload-box">
61
           <Upload
78
           <Upload
62
             // accept=".pdf"
79
             // accept=".pdf"
65
             onChange={handleChange}
82
             onChange={handleChange}
66
             beforeUpload={beforeUpload}
83
             beforeUpload={beforeUpload}
67
           >
84
           >
68
-            {
69
-              value ? <div style={{ fontSize: '18px' }}>{name}</div> : <UploadButton loading={loading} />
70
-            }
71
-          </Upload >
85
+            {value ? (
86
+              <img src={value} alt="avatar" />
87
+            ) : (
88
+              <UploadButton loading={loading}/>
89
+            )}
90
+          </Upload>
72
         </div>
91
         </div>
73
         <div style={{ flex: 1.2 }}>
92
         <div style={{ flex: 1.2 }}>
74
-          <div style={{ padding: '0 15px', color: '#bfbfbf' }}>{t('authentication.uploadPromptText1')}</div>
75
-          <div style={{ padding: '0 15px', color: '#bfbfbf' }}>{t('authentication.uploadPromptText2')}</div>
76
-          <div style={{ padding: '0 15px', color: '#bfbfbf' }}>{t('authentication.uploadPromptText3')}</div>
77
-          {
78
-            text1 && (
79
-              <div style={{ padding: '0 15px', fontWeight: 600 }}>{text1}</div>
80
-            )
81
-          }
82
-          {
83
-            text2 && (
84
-              <div style={{ padding: '0 15px', color: '#bfbfbf' }}>{text2}</div>
85
-            )
86
-          }
87
-          {
88
-            text3 && (
89
-              <div style={{ padding: '0 15px', fontWeight: 600 }}>{text3}</div>
90
-            )
91
-          }
92
-          <Button type="link">{t('authentication.uploadBtnText')}</Button>
93
+          <div style={{ padding: "0 15px", color: "#bfbfbf" }}>
94
+            {t("authentication.uploadPromptText1")}
95
+          </div>
96
+          <div style={{ padding: "0 15px", color: "#bfbfbf" }}>
97
+            {t("authentication.uploadPromptText2")}
98
+          </div>
99
+          <div style={{ padding: "0 15px", color: "#bfbfbf" }}>
100
+            {t("authentication.uploadPromptText3")}
101
+          </div>
102
+          {text1 && (
103
+            <div style={{ padding: "0 15px", fontWeight: 600 }}>{text1}</div>
104
+          )}
105
+          {text2 && (
106
+            <div style={{ padding: "0 15px", color: "#bfbfbf" }}>{text2}</div>
107
+          )}
108
+          {text3 && (
109
+            <div style={{ padding: "0 15px", fontWeight: 600 }}>{text3}</div>
110
+          )}
111
+          <Button type="link">{t("authentication.uploadBtnText")}</Button>
93
         </div>
112
         </div>
94
       </div>
113
       </div>
95
     </>
114
     </>
96
-  )
97
-}
115
+  );
116
+};

+ 6
- 2
src/components/Upload/UploadImage.jsx Voir le fichier

28
   const [loading, setLoading] = useState(false);
28
   const [loading, setLoading] = useState(false);
29
 
29
 
30
   const handleChange = info => {
30
   const handleChange = info => {
31
+    console.log(info)
32
+
31
     if (info.file.status === 'uploading') {
33
     if (info.file.status === 'uploading') {
32
       setLoading(true);
34
       setLoading(true);
33
       return;
35
       return;
38
     }
40
     }
39
 
41
 
40
     if (info.file.status === 'done') {
42
     if (info.file.status === 'done') {
41
-      setLoading(false);
42
       const { url, fileType } = info.file.response;
43
       const { url, fileType } = info.file.response;
43
       onChange(url);
44
       onChange(url);
45
+      setLoading(false);
46
+    
44
     }
47
     }
45
   };
48
   };
46
 
49
 
47
   const previewUrl = getRealPath ? getRealPath(value) : value;
50
   const previewUrl = getRealPath ? getRealPath(value) : value;
48
 
51
 
52
+  console.log("value->>>>>>>",value)
49
   return (
53
   return (
50
     <Upload
54
     <Upload
51
       listType="picture-card"
55
       listType="picture-card"
54
       beforeUpload={beforeUpload}
58
       beforeUpload={beforeUpload}
55
       onChange={handleChange}
59
       onChange={handleChange}
56
     >
60
     >
57
-      {value ? <img src={previewUrl} alt="avatar" style={{ width: '100%', height: '100%' }} /> : <UploadButton loading={loading} />}
61
+      {value ? <img src={value} alt="avatar" style={{ width: '100%', height: '100%' }} /> : <UploadButton loading={loading} />}
58
     </Upload>
62
     </Upload>
59
   );
63
   );
60
 }
64
 }

+ 1
- 1
src/components/Upload/request.js Voir le fichier

6
   formData.append("fileType", fileType);
6
   formData.append("fileType", fileType);
7
 
7
 
8
   console.log('formData', formData);
8
   console.log('formData', formData);
9
-  return request(`/admin/upload`, {
9
+  return request(`/upload`, {
10
     method: 'post',
10
     method: 'post',
11
     data: formData,
11
     data: formData,
12
     headers: {
12
     headers: {

+ 29
- 25
src/locale/config.js Voir le fichier

1
-import i18n from 'i18next';
2
-import { initReactI18next } from 'react-i18next';
3
-import translation_en from './en.json';
4
-import translation_zh from './zh.json';
5
-import translation_zht from './zht.json';
1
+import i18n from "i18next";
2
+import { initReactI18next } from "react-i18next";
3
+import translation_en from "./en.json";
4
+import translation_zh from "./zh.json";
5
+import translation_zht from "./zht.json";
6
+import I18nextBrowserLanguageDetector from "i18next-browser-languagedetector";
6
 
7
 
7
 const resources = {
8
 const resources = {
8
-    en: {
9
-        translation: translation_en,
10
-    },
11
-    zh: {
12
-        translation: translation_zh,
13
-    },
14
-    zht: {
15
-        translation: translation_zht,
16
-    },
9
+  en: {
10
+    translation: translation_en,
11
+  },
12
+  zh: {
13
+    translation: translation_zh,
14
+  },
15
+  zht: {
16
+    translation: translation_zht,
17
+  },
17
 };
18
 };
18
 
19
 
19
 let defaultLang = navigator.language;
20
 let defaultLang = navigator.language;
20
-if (defaultLang.indexOf('zh') == 0) {
21
-    if (defaultLang == 'zh-CN' || defaultLang == 'zh') {
22
-        defaultLang = 'zh';
23
-    } else {
24
-        defaultLang = 'zht';
25
-    }
21
+if (defaultLang.indexOf("zh") == 0) {
22
+  if (defaultLang == "zh-CN" || defaultLang == "zh") {
23
+    defaultLang = "zh";
24
+  } else {
25
+    defaultLang = "zht";
26
+  }
26
 } else {
27
 } else {
27
-    defaultLang = 'en';
28
+  defaultLang = "en";
28
 }
29
 }
29
 
30
 
30
-i18n.use(initReactI18next).init({
31
+i18n
32
+  .use(initReactI18next)
33
+  .use(I18nextBrowserLanguageDetector)
34
+  .init({
31
     resources,
35
     resources,
32
     // 默认语言  zh/en/zht  中文/英文/繁体
36
     // 默认语言  zh/en/zht  中文/英文/繁体
33
-    lng: defaultLang,
37
+    // lng: defaultLang,
34
     interpolation: {
38
     interpolation: {
35
-        escapeValue: false,
39
+      escapeValue: false,
36
     },
40
     },
37
-});
41
+  });
38
 
42
 
39
 export default i18n;
43
 export default i18n;

+ 6
- 5
src/locale/zh.json Voir le fichier

33
     "enterpriseTypeRadio2": "公众股份有限公司",
33
     "enterpriseTypeRadio2": "公众股份有限公司",
34
     "enterpriseTypeRadio3": "有股本的公共无限公司",
34
     "enterpriseTypeRadio3": "有股本的公共无限公司",
35
     "enterpriseTypeRadio4": "有股本的私人无限公司",
35
     "enterpriseTypeRadio4": "有股本的私人无限公司",
36
-    "formRightSelect1": "中国香港(地区)",
36
+    "formRightSelect1": "中国大陆",
37
     "formRightSelectPlaceholder1": "州/State/Province/Region",
37
     "formRightSelectPlaceholder1": "州/State/Province/Region",
38
     "formRightSelectPlaceholderII1": "国家/地区",
38
     "formRightSelectPlaceholderII1": "国家/地区",
39
     "formRightInputPlaceholder2": "市/City",
39
     "formRightInputPlaceholder2": "市/City",
60
     "foundationInfoNextBtn": "下一步",
60
     "foundationInfoNextBtn": "下一步",
61
 
61
 
62
     "subTitleRight2": "您的身份为",
62
     "subTitleRight2": "您的身份为",
63
-    "directorInfoRadioValue1": "企业董事",
64
-    "directorInfoSubTitle3": "请用手机扫描二维码拍摄上传",
63
+    "directorInfoRadioValue1": "企业法代",
65
     "directorInfoRadioText1": "您本人为该企业的负责人,能够代表企业行驶职权",
64
     "directorInfoRadioText1": "您本人为该企业的负责人,能够代表企业行驶职权",
66
     "directorInfoRadioValue2": "被授权人",
65
     "directorInfoRadioValue2": "被授权人",
67
     "directorInfoRadioText2": "您本人被企业授权,能够代表企业处理事务",
66
     "directorInfoRadioText2": "您本人被企业授权,能够代表企业处理事务",
69
     "directorInfoLabel2": "证件类型",
68
     "directorInfoLabel2": "证件类型",
70
     "directorInfoSelectValue1": "中国大陆",
69
     "directorInfoSelectValue1": "中国大陆",
71
     "directorInfoRadioValue": "身份证",
70
     "directorInfoRadioValue": "身份证",
72
-    "directorInfoTitle": "请用手机扫描二维码拍摄上传",
71
+    "directorInfoTitle": "上传身份证正反面",
73
     "directorInfoContent1": "1.请用手机扫描二维码,或用手机打开分享链接,拍照上传证件照片",
72
     "directorInfoContent1": "1.请用手机扫描二维码,或用手机打开分享链接,拍照上传证件照片",
74
     "directorInfoContent2": "2.拍照上传图片保持清晰可见、完整,照片需要包含证件四角,无反光",
73
     "directorInfoContent2": "2.拍照上传图片保持清晰可见、完整,照片需要包含证件四角,无反光",
75
     "directorInfoContent3": "3.如需修改上传图片,请重新扫描上传或重新打开分享链接",
74
     "directorInfoContent3": "3.如需修改上传图片,请重新扫描上传或重新打开分享链接",
88
     "everyoneInfoTitle": "填写企业受益所有人信息",
87
     "everyoneInfoTitle": "填写企业受益所有人信息",
89
     "everyoneInfoContent1": "根据所适用法律规定,我们需要向贵公司收集受益所有人信息。",
88
     "everyoneInfoContent1": "根据所适用法律规定,我们需要向贵公司收集受益所有人信息。",
90
     "everyoneInfoContent2": "受益所有人:实际管控、管理公司并享有公司最终收益的自然人。具体是指,直接或间接通过股权、授权或其他形式法律安排拥有公司25%以上股权、投票权的自然人。",
89
     "everyoneInfoContent2": "受益所有人:实际管控、管理公司并享有公司最终收益的自然人。具体是指,直接或间接通过股权、授权或其他形式法律安排拥有公司25%以上股权、投票权的自然人。",
91
-    "everyoneInfoInputLabel1": "董事【刘凡】是否为受益所有人?",
90
+    "everyoneInfoInputLabel1": "企业董事 {{beneficiaryName}} 是否为受益所有人?",
91
+    "everyoneInfoInputLabelAuthorized": "被授权人{{beneficiaryName}}是否为受益所有人?",
92
     "everyoneInfoInputLabel2": "贵公司是否还有其他的受益所有人?",
92
     "everyoneInfoInputLabel2": "贵公司是否还有其他的受益所有人?",
93
     "everyoneInfoInputLabel3": "董事【刘凡】的持股比例为?",
93
     "everyoneInfoInputLabel3": "董事【刘凡】的持股比例为?",
94
     "everyoneInfoPlaceholder": "请输入持股比例",
94
     "everyoneInfoPlaceholder": "请输入持股比例",
115
     "FaceRecognitionBtn1": "进行人脸识别",
115
     "FaceRecognitionBtn1": "进行人脸识别",
116
     "FaceRecognitionBtn2": "寻求帮助",
116
     "FaceRecognitionBtn2": "寻求帮助",
117
     "FaceRecognitionTag1": "待识别",
117
     "FaceRecognitionTag1": "待识别",
118
+    "FaceRecognitionTag2": "已识别",
118
 
119
 
119
     "FaceRecognitionModalTitle": "人脸识别",
120
     "FaceRecognitionModalTitle": "人脸识别",
120
     "FaceRecognitionModalContent1": "请用手机扫描以下二维码,或用手机打开分享链接,按页面提示完成人脸识别认证,认证完成后,您的信息将被自动提交。",
121
     "FaceRecognitionModalContent1": "请用手机扫描以下二维码,或用手机打开分享链接,按页面提示完成人脸识别认证,认证完成后,您的信息将被自动提交。",

+ 96
- 34
src/pages/authentication/components/Authentication.jsx Voir le fichier

1
-import React from "react";
2
-import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select, Image } from "antd";
3
-import { useTranslation } from 'react-i18next';
1
+import React, { useEffect } from "react";
2
+import {
3
+  Divider,
4
+  Card,
5
+  Steps,
6
+  Button,
7
+  Radio,
8
+  Form,
9
+  Input,
10
+  Row,
11
+  Col,
12
+  Select,
13
+  Image,
14
+} from "antd";
15
+import { useTranslation } from "react-i18next";
4
 import useBool from "@/utils/hooks/useBool";
16
 import useBool from "@/utils/hooks/useBool";
5
-import { postTaCompanyRealName } from "@/services/taCompanyRealName";
17
+import {
18
+  getTaCompanyRealNameTenantId,
19
+  postTaCompanyRealName,
20
+  putTaCompanyRealName,
21
+} from "@/services/taCompanyRealName";
22
+import { ProForm, ProFormRadio } from "@ant-design/pro-components";
6
 
23
 
7
 export default (props) => {
24
 export default (props) => {
8
-
9
   const { index, setIndex } = props;
25
   const { index, setIndex } = props;
10
   const { t } = useTranslation();
26
   const { t } = useTranslation();
11
   const [form] = Form.useForm();
27
   const [form] = Form.useForm();
12
 
28
 
13
   const onFinish = (values) => {
29
   const onFinish = (values) => {
14
-    postTaCompanyRealName(values).then((res) => {
15
-      setIndex(index + 1);
16
-    });
30
+    const id = values.realCompanyId;
31
+    if (id) {
32
+      putTaCompanyRealName(id, values).then(() => {
33
+        setIndex(index + 1);
34
+      });
35
+    } else {
36
+      postTaCompanyRealName(values).then((res) => {
37
+        setIndex(index + 1);
38
+      });
39
+    }
17
   };
40
   };
18
 
41
 
42
+  useEffect(() => {
43
+    form.resetFields();
44
+    getTaCompanyRealNameTenantId()
45
+      .then((res) => {
46
+        form.setFieldsValue(res);
47
+      })
48
+      .catch((err) => {});
49
+  }, []);
50
+  const isListedCompany = [
51
+    {
52
+      label: t("authentication.AuthenticationYes"),
53
+      value: "1",
54
+    },
55
+    {
56
+      label: t("authentication.AuthenticationNo"),
57
+      value: "0",
58
+    },
59
+  ];
19
   return (
60
   return (
20
     <>
61
     <>
21
-      <div style={{ fontSize: '24px', fontWeight: '400', width: '900px' }}>{t('authentication.AuthenticationTitle')}</div>
22
-      <Card bordered={false} style={{ width: '900px', paddingLeft: '36px' }}>
23
-        <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.AuthenticationContent1')}</div>
62
+      <div style={{ fontSize: "24px", fontWeight: "400", width: "900px" }}>
63
+        {t("authentication.AuthenticationTitle")}
64
+      </div>
65
+      <Card bordered={false} style={{ width: "900px", paddingLeft: "36px" }}>
66
+        <div style={{ fontSize: "16px", fontWeight: "600" }}>
67
+          {t("authentication.AuthenticationContent1")}
68
+        </div>
24
         <Form
69
         <Form
25
           form={form}
70
           form={form}
26
           size="large"
71
           size="large"
27
           layout="vertical"
72
           layout="vertical"
28
           onFinish={onFinish}
73
           onFinish={onFinish}
29
-          style={{ marginTop: '4em' }}
74
+          style={{ marginTop: "4em" }}
30
           wrapperCol={{ span: 14 }}
75
           wrapperCol={{ span: 14 }}
31
         >
76
         >
32
-          <Form.Item label={t('authentication.AuthenticationLabel1')} name="registrationLocation">
33
-            <Select placeholder={t('authentication.AuthenticationPlaceholder3')}>
77
+          <Form.Item hidden name="realCompanyId"></Form.Item>
78
+          <Form.Item
79
+            label={t("authentication.AuthenticationLabel1")}
80
+            name="registrationLocation"
81
+          >
82
+            <Select
83
+              placeholder={t("authentication.AuthenticationPlaceholder3")}
84
+            >
34
               <Select.Option value="中国大陆">中国大陆</Select.Option>
85
               <Select.Option value="中国大陆">中国大陆</Select.Option>
35
             </Select>
86
             </Select>
36
           </Form.Item>
87
           </Form.Item>
37
-          <Form.Item label={t('authentication.AuthenticationLabel2')} name="companyNameCn">
38
-            <Input placeholder={t('authentication.AuthenticationPlaceholder1')} />
88
+          <Form.Item
89
+            label={t("authentication.AuthenticationLabel2")}
90
+            name="companyNameCn"
91
+          >
92
+            <Input
93
+              placeholder={t("authentication.AuthenticationPlaceholder1")}
94
+            />
39
           </Form.Item>
95
           </Form.Item>
40
-          <div style={{ fontSize: '11px', color: '#bfbfbf', marginTop: '-20px' }}>{t('authentication.AuthenticationTip')}</div>
41
-          <Form.Item label={t('authentication.AuthenticationLabel3')} name="companyNameEn">
42
-            <Input placeholder={t('authentication.AuthenticationPlaceholder2')} />
96
+          <div
97
+            style={{ fontSize: "11px", color: "#bfbfbf", marginTop: "-20px" }}
98
+          >
99
+            {t("authentication.AuthenticationTip")}
100
+          </div>
101
+          <Form.Item
102
+            label={t("authentication.AuthenticationLabel3")}
103
+            name="companyNameEn"
104
+          >
105
+            <Input
106
+              placeholder={t("authentication.AuthenticationPlaceholder2")}
107
+            />
43
           </Form.Item>
108
           </Form.Item>
44
-          <Form.Item label={t('authentication.AuthenticationLabel4')} name="isListedCompany">
45
-            <div style={{ marginTop: '-24px' }}>
46
-              <Radio.Group>
47
-                <Radio value={1}>{t('authentication.AuthenticationYes')}</Radio>
48
-                <Radio value={0}>{t('authentication.AuthenticationNo')}</Radio>
49
-              </Radio.Group>
50
-            </div>
109
+          <Form.Item
110
+            label={t("authentication.AuthenticationLabel4")}
111
+            name="isListedCompany"
112
+          >
113
+            <Radio.Group options={isListedCompany} />
51
           </Form.Item>
114
           </Form.Item>
52
-          <Form.Item style={{ marginTop: '24px' }}>
53
-            <Button
54
-              type="primary"
55
-              size="large"
56
-              htmlType="submit"
57
-            >{t('authentication.AuthenticationBtn')}</Button>
115
+
116
+          <Form.Item style={{ marginTop: "24px" }}>
117
+            <Button type="primary" size="large" htmlType="submit">
118
+              {t("authentication.AuthenticationBtn")}
119
+            </Button>
58
           </Form.Item>
120
           </Form.Item>
59
         </Form>
121
         </Form>
60
       </Card>
122
       </Card>
61
     </>
123
     </>
62
-  )
63
-}
124
+  );
125
+};

+ 137
- 0
src/pages/authentication/components/ConpanyDirectorAuthPerson.jsx Voir le fichier

1
+import { UploadImage } from "@/components/Upload";
2
+import { Button, Form, Input, Radio, Select } from "antd";
3
+import React from "react";
4
+import { useTranslation } from "react-i18next";
5
+export default (props) => {
6
+  const { title, identity } = props;
7
+  const { t } = useTranslation();
8
+  const directorRule = {
9
+      [`${identity}-directorCountry`]: [{ require: true, message: "请选择国家" }],
10
+      [`${identity}-directorIdType`]: [{ require: true, message: "请选择证件类型" }],
11
+      [`${identity}-directorIdFront`]: [{ require: true, message: "请上传证件正面" }],
12
+      [`${identity}-directorIdBack`]: [{ require: true, message: "请上传证件反面" }],
13
+      [`${identity}-directorNameCn`]: [{ require: true, message: "请输入中文名" }],
14
+      [`${identity}-directorIdNo`]: [{ require: true, message: "请输入证件证件号码" }],
15
+  };
16
+
17
+  return (
18
+    <>
19
+      <div
20
+        style={{
21
+          fontSize: "16px",
22
+          fontWeight: "600",
23
+          marginBottom: "36px",
24
+        }}
25
+      >
26
+        {title}
27
+      </div>
28
+      <Form.Item name={`${identity}-companyLegalId`} hidden/>
29
+      {/* <Form.Item name={`${identity}-companyBeneficiaryId`} hidden/> */}
30
+      <Form.Item
31
+        label={t("authentication.directorInfoLabel1")}
32
+        wrapperCol={{ span: 17 }}
33
+        name={`${identity}-directorCountry`}
34
+        rules={directorRule[`${identity}-directorCountry`]}
35
+      >
36
+        <Select placeholder={t("authentication.directorInfoPlaceholder1")}>
37
+          <Select.Option value={t("authentication.directorInfoSelectValue1")}>
38
+            {t("authentication.directorInfoSelectValue1")}
39
+          </Select.Option>
40
+        </Select>
41
+      </Form.Item>
42
+      <Form.Item
43
+        label={t("authentication.directorInfoLabel2")}
44
+        name={`${identity}-directorIdType`}
45
+        rules={directorRule[`${identity}-directorIdType`]}
46
+        initialValue="1"
47
+      >
48
+        <Radio.Group>
49
+          <Radio style={{ fontSize: "16px" }} value="1">
50
+            {t("authentication.directorInfoRadioValue")}
51
+          </Radio>
52
+        </Radio.Group>
53
+      </Form.Item>
54
+      {/* 请用手机扫描二维码拍摄上传 */}
55
+      <div
56
+        style={{
57
+          fontSize: "16px",
58
+          fontWeight: "600",
59
+          marginBottom: "12px",
60
+        }}
61
+      >
62
+        {t("authentication.directorInfoTitle")}
63
+      </div>
64
+      <Form.Item>
65
+        <div style={{ color: "#bfbfbf" }}>
66
+          {t("authentication.directorInfoContent1")}
67
+        </div>
68
+        <div style={{ color: "#bfbfbf" }}>
69
+          {t("authentication.directorInfoContent2")}
70
+        </div>
71
+        <div style={{ color: "#bfbfbf" }}>
72
+          {t("authentication.directorInfoContent3")}
73
+        </div>
74
+        <div style={{ color: "red" }}>
75
+          {t("authentication.directorInfoContent4")}
76
+        </div>
77
+        <Button type="link" style={{ padding: "4px 0" }}>
78
+          {t("authentication.uploadBtnText")}
79
+        </Button>
80
+      </Form.Item>
81
+      <Form.Item
82
+        name={`${identity}-directorIdFront`}
83
+        label={t("authentication.directorInfoSubTitle1")}
84
+        rules={directorRule[`${identity}-directorIdFront`]}
85
+
86
+      >
87
+        <UploadImage />
88
+        {/* 
89
+            <div className="image_box">
90
+              <div className="directorInfo-img-right-text">
91
+                {t("authentication.directorInfoIDCardRightText")}
92
+              </div>
93
+            </div> */}
94
+      </Form.Item>
95
+      <Form.Item
96
+        name={`${identity}-directorIdBack`}
97
+        label={t("authentication.directorInfoSubTitle2")}
98
+        rules={directorRule[`${identity}-directorIdBack`]}
99
+
100
+      >
101
+        <UploadImage />
102
+        {/* <div style={{ marginTop: "24px", fontSize: "16px" }}>
103
+              {t("authentication.directorInfoSubTitle2")}
104
+            </div> */}
105
+        {/* <div className="image_box"> */}
106
+        {/* <div className="directorInfo-img-right-text">
107
+                {t("authentication.directorInfoIDCardRightText")}
108
+              </div> */}
109
+        {/* </div> */}
110
+      </Form.Item>
111
+
112
+      <Form.Item
113
+        label={t("authentication.directorInfoLabel3")}
114
+        wrapperCol={{ span: 17 }}
115
+        name={`${identity}-directorNameCn`}
116
+        rules={directorRule[`${identity}-directorNameCn`]}
117
+
118
+      >
119
+        <Input
120
+          placeholder={t("authentication.directorInfoInputPlaceholder2")}
121
+        />
122
+      </Form.Item>
123
+      <Form.Item
124
+        label={t("authentication.directorInfoLabel4")}
125
+        wrapperCol={{ span: 17 }}
126
+        name={`${identity}-directorIdNo`}
127
+        rules={directorRule[`${identity}-directorIdNo`]}
128
+
129
+      >
130
+        <Input
131
+          placeholder={t("authentication.directorInfoInputPlaceholder3")}
132
+          size="large"
133
+        />
134
+      </Form.Item>
135
+    </>
136
+  );
137
+};

+ 158
- 0
src/pages/authentication/components/ConpanyDirectorAuthPersonBeneficiary.jsx Voir le fichier

1
+import { UploadImage } from "@/components/Upload";
2
+import { Button, Form, Input,  InputNumber,  Radio, Select } from "antd";
3
+import React from "react";
4
+import { useTranslation } from "react-i18next";
5
+export default (props) => {
6
+  const { title, identity, key } = props;
7
+  console.log(props);
8
+  const { t } = useTranslation();
9
+  const directorRule = {
10
+    [`${identity}-directorCountry`]: [{ require: true, message: "请选择国家" }],
11
+    [`${identity}-directorIdType`]: [
12
+      { require: true, message: "请选择证件类型" },
13
+    ],
14
+    [`${identity}-directorIdFront`]: [
15
+      { require: true, message: "请上传证件正面" },
16
+    ],
17
+    [`${identity}-directorIdBack`]: [
18
+      { require: true, message: "请上传证件反面" },
19
+    ],
20
+    [`${identity}-directorNameCn`]: [
21
+      { require: true, message: "请输入中文名" },
22
+    ],
23
+    [`${identity}-directorIdNo`]: [
24
+      { require: true, message: "请输入证件证件号码" },
25
+    ],
26
+  };
27
+
28
+  return (
29
+    <>
30
+      <div
31
+        style={{
32
+          fontSize: "16px",
33
+          fontWeight: "600",
34
+          marginBottom: "36px",
35
+        }}
36
+      >
37
+        {title}
38
+      </div>
39
+      <Form.Item name={`${identity}-companyLegalId`} />
40
+      <Form.Item name={`${identity}-companyBeneficiaryItemId`} />
41
+      <Form.Item
42
+        // label={t("authentication.directorInfoLabel1")}
43
+        label="受益所有人国籍"
44
+        wrapperCol={{ span: 17 }}
45
+        name={`${identity}-directorCountry`}
46
+        rules={directorRule[`${identity}-directorCountry`]}
47
+      >
48
+        <Select placeholder={t("authentication.directorInfoPlaceholder1")}>
49
+          <Select.Option value={t("authentication.directorInfoSelectValue1")}>
50
+            {t("authentication.directorInfoSelectValue1")}
51
+          </Select.Option>
52
+        </Select>
53
+      </Form.Item>
54
+      <Form.Item
55
+        label={t("authentication.directorInfoLabel2")}
56
+        name={`${identity}-directorIdType`}
57
+        rules={directorRule[`${identity}-directorIdType`]}
58
+        initialValue="1"
59
+      >
60
+        <Radio.Group>
61
+          <Radio style={{ fontSize: "16px" }} value="1">
62
+            {t("authentication.directorInfoRadioValue")}
63
+          </Radio>
64
+        </Radio.Group>
65
+      </Form.Item>
66
+      {/* 请用手机扫描二维码拍摄上传 */}
67
+      <div
68
+        style={{
69
+          fontSize: "16px",
70
+          fontWeight: "600",
71
+          marginBottom: "12px",
72
+        }}
73
+      >
74
+        {t("authentication.directorInfoTitle")}
75
+      </div>
76
+      <Form.Item>
77
+        <div style={{ color: "#bfbfbf" }}>
78
+          {t("authentication.directorInfoContent1")}
79
+        </div>
80
+        <div style={{ color: "#bfbfbf" }}>
81
+          {t("authentication.directorInfoContent2")}
82
+        </div>
83
+        <div style={{ color: "#bfbfbf" }}>
84
+          {t("authentication.directorInfoContent3")}
85
+        </div>
86
+        <div style={{ color: "red" }}>
87
+          {t("authentication.directorInfoContent4")}
88
+        </div>
89
+        <Button type="link" style={{ padding: "4px 0" }}>
90
+          {t("authentication.uploadBtnText")}
91
+        </Button>
92
+      </Form.Item>
93
+      <Form.Item
94
+        name={`${identity}-directorIdFront`}
95
+        label={t("authentication.directorInfoSubTitle1")}
96
+        rules={directorRule[`${identity}-directorIdFront`]}
97
+      >
98
+        <UploadImage />
99
+        {/* 
100
+            <div className="image_box">
101
+              <div className="directorInfo-img-right-text">
102
+                {t("authentication.directorInfoIDCardRightText")}
103
+              </div>
104
+            </div> */}
105
+      </Form.Item>
106
+      <Form.Item
107
+        name={`${identity}-directorIdBack`}
108
+        label={t("authentication.directorInfoSubTitle2")}
109
+        rules={directorRule[`${identity}-directorIdBack`]}
110
+      >
111
+        <UploadImage />
112
+        {/* <div style={{ marginTop: "24px", fontSize: "16px" }}>
113
+              {t("authentication.directorInfoSubTitle2")}
114
+            </div> */}
115
+        {/* <div className="image_box"> */}
116
+        {/* <div className="directorInfo-img-right-text">
117
+                {t("authentication.directorInfoIDCardRightText")}
118
+              </div> */}
119
+        {/* </div> */}
120
+      </Form.Item>
121
+
122
+      <Form.Item
123
+        label={t("authentication.directorInfoLabel3")}
124
+        wrapperCol={{ span: 17 }}
125
+        name={`${identity}-directorNameCn`}
126
+        rules={directorRule[`${identity}-directorNameCn`]}
127
+      >
128
+        <Input
129
+          placeholder={t("authentication.directorInfoInputPlaceholder2")}
130
+        />
131
+      </Form.Item>
132
+      <Form.Item
133
+        label={t("authentication.directorInfoLabel4")}
134
+        wrapperCol={{ span: 17 }}
135
+        name={`${identity}-directorIdNo`}
136
+        rules={directorRule[`${identity}-directorIdNo`]}
137
+      >
138
+        <Input
139
+          placeholder={t("authentication.directorInfoInputPlaceholder3")}
140
+          size="large"
141
+        />
142
+      </Form.Item>
143
+      <Form.Item
144
+        label="持股比例"
145
+        name={`${identity}-shareholdingRatio`}
146
+        wrapperCol={{ span: 18 }}
147
+      >
148
+        <InputNumber
149
+          placeholder=">=25"
150
+          style={{ width: '100%' }}
151
+          formatter={(value) => `${value}%`}
152
+          min={25}
153
+        />
154
+      </Form.Item>
155
+    </>
156
+  );
157
+};
158
+ 

+ 182
- 83
src/pages/authentication/components/DirectorInfo.jsx Voir le fichier

1
-import React from "react";
2
-import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select, Image } from "antd";
3
-import { useTranslation } from 'react-i18next';
4
-import { postTaCompanyLegalInfo } from "@/services/taCompanyLegalInfo";
1
+import React, { useEffect, useState } from "react";
2
+import {
3
+  Divider,
4
+  Card,
5
+  Steps,
6
+  Button,
7
+  Radio,
8
+  Form,
9
+  Input,
10
+  Row,
11
+  Col,
12
+  Select,
13
+  Image,
14
+} from "antd";
15
+import { useTranslation } from "react-i18next";
16
+import {
17
+  postTaCompanyLegalInfo,
18
+  getTaCompanyLegalInfoTenantId,
19
+  putTaCompanyLegalInfo,
20
+} from "@/services/taCompanyLegalInfo";
5
 import "../style.less";
21
 import "../style.less";
22
+import { UploadImage } from "@/components/Upload";
23
+import { ProForm } from "@ant-design/pro-components";
24
+import ConpanyDirectorAuthPerson from "./ConpanyDirectorAuthPerson";
6
 
25
 
7
 export default (props) => {
26
 export default (props) => {
8
   const { index, setIndex } = props;
27
   const { index, setIndex } = props;
10
   const [form] = Form.useForm();
29
   const [form] = Form.useForm();
11
 
30
 
12
   const onFinish = (values) => {
31
   const onFinish = (values) => {
13
-    postTaCompanyLegalInfo([values]).then((res) => {
14
-      setIndex(index + 1);
15
-    });
32
+    const authorizedPersonId = "authorizedPerson-companyLegalId";
33
+    const conpanyDirectorId = "conpanyDirector-companyLegalId";
34
+    // 被授权人
35
+    let authorizedPerson = {},
36
+      //企业董事
37
+      conpanyDirector = {};
38
+
39
+    for (const key in values) {
40
+      const prefix = key.split("-")[0];
41
+      const prefix1 = key.split("-")[1];
42
+      if (prefix == "authorizedPerson") {
43
+        authorizedPerson[prefix1] = values[key];
44
+        authorizedPerson["identity"] = "authorizedPerson";
45
+      } else if (prefix == "conpanyDirector") {
46
+        conpanyDirector[prefix1] = values[key];
47
+        conpanyDirector["identity"] = "conpanyDirector";
48
+      }
49
+    }
50
+    const data = [authorizedPerson, conpanyDirector].filter(
51
+      (x) => Object.keys(x).length != 0
52
+    );
53
+    const id = values[authorizedPersonId] || values[conpanyDirectorId];
54
+    if (id) {
55
+      console.log("更新");
56
+      putTaCompanyLegalInfo(id, data).then((res) => {
57
+        setIndex(index + 1);
58
+      });
59
+    } else {
60
+      console.log("新增");
61
+      postTaCompanyLegalInfo(data).then((res) => {
62
+        setIndex(index + 1);
63
+      });
64
+    }
65
+
66
+    console.log(data);
67
+  };
68
+
69
+  const [showList, setShowList] = useState("conpanyDirector");
70
+  const radioChange = (e) => {
71
+    setShowList(e.target.value);
72
+  };
73
+
74
+  const directorRule = {
75
+    identity: [{ require: true, message: "请选择身份" }],
16
   };
76
   };
17
 
77
 
78
+  useEffect(() => {
79
+    form.resetFields();
80
+    getTaCompanyLegalInfoTenantId()
81
+      .then((res) => {
82
+        if (res) {
83
+          const select =
84
+            res.length == 2 ? "authorizedPerson" : "conpanyDirector";
85
+          setShowList(select);
86
+          const data = (res || [])
87
+            .map((x) => {
88
+              const dataObj = {};
89
+              if (x.identity == "authorizedPerson") {
90
+                for (const key in x) {
91
+                  dataObj[`authorizedPerson-${key}`] = x[key];
92
+                }
93
+              } else if (x.identity == "conpanyDirector") {
94
+                for (const key in x) {
95
+                  dataObj[`conpanyDirector-${key}`] = x[key];
96
+                }
97
+              }
98
+              return dataObj;
99
+            })
100
+            .reduce((acc, item) => ({ ...acc, ...item }));
101
+
102
+          form.setFieldsValue({
103
+            ...data,
104
+            identity: select,
105
+          });
106
+        }
107
+      })
108
+      .catch((err) => {});
109
+  }, []);
110
+
18
   return (
111
   return (
19
     <>
112
     <>
20
-      <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.stepsTitle2')}</div>
21
-      <Form
22
-        form={form}
23
-        layout="vertical"
24
-        onFinish={onFinish}
25
-        size="large"
26
-      >
27
-        <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
113
+      <div style={{ fontSize: "24px", fontWeight: "400" }}>
114
+        {t("authentication.stepsTitle2")}
115
+      </div>
116
+      <Form form={form} layout="vertical" onFinish={onFinish} size="large">
117
+        <Card bordered={false} style={{ width: "900px", marginBottom: "24px" }}>
28
           {/* 您的身份为 */}
118
           {/* 您的身份为 */}
29
-          <div style={{ fontSize: '16px', fontWeight: '600', marginBottom: '12px' }}>{t('authentication.subTitleRight2')}</div>
30
-          <Form.Item name="identity">
31
-            <Radio.Group>
32
-              <div style={{ marginBottom: '24px' }}>
33
-                <Radio style={{ fontSize: '16px' }} value="conpanyDirector">{t('authentication.directorInfoRadioValue1')}</Radio>
34
-                <div style={{ paddingTop: '6px', color: '#bfbfbf' }}>{t('authentication.directorInfoRadioText1')}</div>
119
+          <div
120
+            style={{
121
+              fontSize: "16px",
122
+              fontWeight: "600",
123
+              marginBottom: "12px",
124
+            }}
125
+          >
126
+            {t("authentication.subTitleRight2")}
127
+          </div>
128
+
129
+          <Form.Item
130
+            name="identity"
131
+            rules={directorRule.identity}
132
+            initialValue={showList}
133
+          >
134
+            <Radio.Group onChange={radioChange}>
135
+              <div style={{ marginBottom: "24px" }}>
136
+                <Radio style={{ fontSize: "16px" }} value="conpanyDirector">
137
+                  {t("authentication.directorInfoRadioValue1")}
138
+                </Radio>
139
+                {/* <div style={{ paddingTop: "6px", color: "#bfbfbf" }}>
140
+                  {t("authentication.directorInfoRadioText1")}
141
+                </div> */}
35
               </div>
142
               </div>
36
-              <div style={{ marginBottom: '24px' }}>
37
-                <Radio style={{ fontSize: '16px' }} value="authorizedPerson">{t('authentication.directorInfoRadioValue2')}</Radio>
38
-                <div style={{ paddingTop: '6px', color: '#bfbfbf' }}>{t('authentication.directorInfoRadioText2')}</div>
143
+              <div style={{ marginBottom: "24px" }}>
144
+                <Radio style={{ fontSize: "16px" }} value="authorizedPerson">
145
+                  {t("authentication.directorInfoRadioValue2")}
146
+                </Radio>
147
+                {/* <div style={{ paddingTop: "6px", color: "#bfbfbf" }}>
148
+                  {t("authentication.directorInfoRadioText2")}
149
+                </div> */}
39
               </div>
150
               </div>
40
             </Radio.Group>
151
             </Radio.Group>
41
           </Form.Item>
152
           </Form.Item>
42
-          {/* 企业董事 */}
43
-          <div style={{ fontSize: '16px', fontWeight: '600', marginBottom: '36px' }}>{t('authentication.directorInfoRadioValue1')}</div>
44
-          <Form.Item label={t('authentication.directorInfoLabel1')} wrapperCol={{ span: 17 }} name="directorCountry">
45
-            <Select placeholder={t('authentication.directorInfoPlaceholder1')}>
46
-              <Select.Option value={t('authentication.directorInfoSelectValue1')}>
47
-                {t('authentication.directorInfoSelectValue1')}</Select.Option>
48
-            </Select>
49
-          </Form.Item>
50
-          <Form.Item label={t('authentication.directorInfoLabel2')} name="directorIdType">
51
-            <Radio.Group>
52
-              <Radio style={{ fontSize: '16px' }} value="1">
53
-                {t('authentication.directorInfoRadioValue')}
54
-              </Radio>
55
-            </Radio.Group>
56
-          </Form.Item>
57
-          {/* 请用手机扫描二维码拍摄上传 */}
58
-          <div style={{ fontSize: '16px', fontWeight: '600', marginBottom: '12px' }}>{t('authentication.directorInfoSubTitle3')}</div>
59
-          <Form.Item>
60
-            <div style={{ color: '#bfbfbf' }}>{t('authentication.directorInfoContent1')}</div>
61
-            <div style={{ color: '#bfbfbf' }}>{t('authentication.directorInfoContent2')}</div>
62
-            <div style={{ color: '#bfbfbf' }}>{t('authentication.directorInfoContent3')}</div>
63
-            <div style={{ color: 'red' }}>{t('authentication.directorInfoContent4')}</div>
64
-            <Button type="link" style={{ padding: '4px 0' }}>{t('authentication.uploadBtnText')}</Button>
65
-          </Form.Item>
66
-          <Form.Item name="directorIdFront">
67
-            <div className="directorInfo-img-box">
68
-              <div style={{ fontSize: '16px' }}>{t('authentication.directorInfoSubTitle1')}</div>
69
-              <div>
70
-                <Image width={100} height={100} preview={false} src="./img/empty.png" />
71
-                <div className="directorInfo-img-right-text">{t('authentication.directorInfoIDCardRightText')}</div>
72
-              </div>
73
-              <div style={{ marginTop: '24px', fontSize: '16px' }}>{t('authentication.directorInfoSubTitle2')}</div>
74
-              <div>
75
-                <Image width={100} height={100} preview={false} src="./img/empty.png" />
76
-                <div className="directorInfo-img-right-text">{t('authentication.directorInfoIDCardRightText')}</div>
77
-              </div>
78
-            </div>
79
-          </Form.Item>
80
-          <Form.Item label={t('authentication.directorInfoLabel3')} wrapperCol={{ span: 17 }} name="directorNameCn">
81
-            <Input placeholder={t('authentication.directorInfoInputPlaceholder2')} />
82
-            {/* <Input.Group>
83
-              <Row>
84
-                <Col span={8}>
85
-                  <Input placeholder={t('authentication.directorInfoInputPlaceholder1')} size="large" />
86
-                </Col>
87
-                <Col span={8} style={{ marginLeft: '36px' }}>
88
-                  <Input placeholder={t('authentication.directorInfoInputPlaceholder2')} size="large" />
89
-                </Col>
90
-              </Row>
91
-            </Input.Group> */}
92
-          </Form.Item>
93
-          <Form.Item label={t('authentication.directorInfoLabel4')} wrapperCol={{ span: 17 }} name="directorIdNo">
94
-            <Input placeholder={t('authentication.directorInfoInputPlaceholder3')} size="large" />
153
+
154
+          <Form.Item noStyle shouldUpdate>
155
+            {({ getFieldValue }) => {
156
+              const identity = getFieldValue("identity");
157
+              return (
158
+                <>
159
+                  {identity == "authorizedPerson" ? (
160
+                    <ConpanyDirectorAuthPerson
161
+                      title={t("authentication.directorInfoRadioValue2")}
162
+                      identity="authorizedPerson"
163
+                    />
164
+                  ) : null}
165
+
166
+                  {
167
+                    <ConpanyDirectorAuthPerson
168
+                      title={t("authentication.directorInfoRadioValue1")}
169
+                      identity="conpanyDirector"
170
+                    />
171
+                  }
172
+                </>
173
+              );
174
+            }}
95
           </Form.Item>
175
           </Form.Item>
96
-          {/* 其他董事 */}
97
-          <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.directorInfoOtherDirectors')}</div>
98
-          <Button type="primary" htmlType="submit" style={{ width: '6vw' }}>{t('authentication.foundationInfoNextBtn')}</Button>
99
-        </Card>
176
+          {/* 被授权人 */}
177
+          {/* {showList == "authorizedPerson" && (
178
+            <ConpanyDirectorAuthPerson
179
+              title={t("authentication.directorInfoRadioValue2")}
180
+              identity="authorizedPerson"
181
+            />
182
+          )}
100
 
183
 
184
+          <ConpanyDirectorAuthPerson
185
+            title={t("authentication.directorInfoRadioValue1")}
186
+            identity="conpanyDirector"
187
+          /> */}
188
+
189
+          <Button
190
+            size="large"
191
+            style={{ width: "6vw", marginRight: "40px" }}
192
+            onClick={() => setIndex(index - 1)}
193
+          >
194
+            上一步
195
+          </Button>
196
+          <Button type="primary" htmlType="submit" style={{ width: "6vw" }}>
197
+            {t("authentication.foundationInfoNextBtn")}
198
+          </Button>
199
+        </Card>
101
       </Form>
200
       </Form>
102
     </>
201
     </>
103
-  )
104
-}
202
+  );
203
+};

+ 241
- 48
src/pages/authentication/components/EveryoneInfo.jsx Voir le fichier

1
-import React, { useState } from "react";
2
-import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select, Checkbox } from "antd";
1
+import React, { useEffect, useState } from "react";
2
+import { Card, Button, Radio, Form, Select } from "antd";
3
 import UploadFile from "@/components/Upload/UploadFile";
3
 import UploadFile from "@/components/Upload/UploadFile";
4
-import { useTranslation } from 'react-i18next';
5
-import { postTaCompanyBeneficiaryInfo } from "@/services/taCompanyBeneficiaryInfo";
4
+import { useTranslation } from "react-i18next";
5
+import {
6
+  getTaCompanyBeneficiaryInfoTenantId,
7
+  postTaCompanyBeneficiaryInfo,
8
+  putTaCompanyBeneficiaryInfo,
9
+} from "@/services/taCompanyBeneficiaryInfo";
6
 import "../style.less";
10
 import "../style.less";
11
+import { getTaCompanyLegalInfoTenantId } from "@/services/taCompanyLegalInfo";
12
+import RadioTitle from "./RadioTitle";
13
+import { ProForm } from "@ant-design/pro-components";
14
+import ConpanyDirectorAuthPersonBeneficiary from "./ConpanyDirectorAuthPersonBeneficiary";
7
 
15
 
8
 export default (props) => {
16
 export default (props) => {
9
   const { index, setIndex } = props;
17
   const { index, setIndex } = props;
10
   const { t } = useTranslation();
18
   const { t } = useTranslation();
11
   const [form] = Form.useForm();
19
   const [form] = Form.useForm();
12
 
20
 
13
-  const [ratio, setRatio] = useState("0");
21
+  // const [ratio, setRatio] = useState("0");
14
   const onFinish = (values) => {
22
   const onFinish = (values) => {
15
-    console.log('----------->');
16
-    postTaCompanyBeneficiaryInfo([values]).then((res) => {
17
-      setIndex(index + 1);
18
-    });
23
+    console.log("----------->", values);
24
+    const authorizedPersonId = "authorizedPerson-beneficiaryId";
25
+    // 被授权人
26
+    let authorizedPerson = {},
27
+      //企业董事
28
+      conpanyDirector = {};
29
+    // 其他受益人
30
+    const otherBeneficiary = [];
31
+
32
+    for (const key in values) {
33
+      const prefix = key.split("-")[0];
34
+      const prefix1 = key.split("-")[1];
35
+      if (prefix == "authorizedPerson") {
36
+        authorizedPerson[prefix1] = values[key];
37
+        authorizedPerson["identity"] = "authorizedPerson";
38
+      } else if (prefix == "conpanyDirector") {
39
+        conpanyDirector[prefix1] = values[key];
40
+        conpanyDirector["identity"] = "conpanyDirector";
41
+      } else if (parseInt(prefix) == prefix) {
42
+        if (!otherBeneficiary[prefix - 1]) {
43
+          otherBeneficiary[prefix - 1] = {};
44
+        }
45
+        otherBeneficiary[parseInt(prefix) - 1][prefix1] = values[key];
46
+      }
47
+    }
48
+    // const data = [, otherBeneficiary];
49
+    const data = {
50
+      beneficiaryInfoList: [authorizedPerson, conpanyDirector],
51
+      beneficiaryItemList: otherBeneficiary,
52
+    };
53
+    console.log(data);
54
+
55
+    putTaCompanyBeneficiaryInfo(values[authorizedPersonId], data).then(
56
+      (res) => {
57
+        setIndex(index + 1);
58
+      }
59
+    );
19
   };
60
   };
20
   const onBack = () => {
61
   const onBack = () => {
21
     setIndex(index - 1);
62
     setIndex(index - 1);
22
   };
63
   };
23
-  const onChange = (e) => {
24
-    setRatio(e.target.value);
25
-  }
64
+  // const onChange = (e) => {
65
+  //   setRatio(e.target.value);
66
+  // };
67
+  const [otherBeneficiaryNum, setOtherBeneficiaryNum] = useState(1);
68
+
69
+  useEffect(() => {
70
+    form.resetFields();
71
+    getTaCompanyBeneficiaryInfoTenantId()
72
+      .then((res) => {
73
+        if (res) {
74
+          const BeneficiaryNum = res[1]?.length||0;
75
+
76
+          setOtherBeneficiaryNum(BeneficiaryNum||1)
77
+          const isOtherBeneficiary = BeneficiaryNum > 0 ? "1" : "0";
78
+
79
+          const data = (res[0] || [])
80
+            .map((x) => {
81
+              const dataObj = {};
82
+              if (x.identity == "authorizedPerson") {
83
+                for (const key in x) {
84
+                  dataObj[`authorizedPerson-${key}`] = x[key];
85
+                }
86
+              } else if (x.identity == "conpanyDirector") {
87
+                for (const key in x) {
88
+                  dataObj[`conpanyDirector-${key}`] = x[key];
89
+                }
90
+              }
91
+              return dataObj;
92
+            })
93
+            .reduce((acc, item) => ({ ...acc, ...item }));
94
+
95
+          const data1 = [];
96
+          res[1].map((x, index) => {
97
+            //
98
+            for (const key in x) {
99
+              data1[`${index + 1}-${key}`] = x[key];
100
+            }
101
+          });
102
+          console.log(data1);
103
+          // console.log(data);
104
+          form.setFieldsValue({
105
+            ...data,
106
+            otherBeneficiaryNum: BeneficiaryNum||1,
107
+            isOtherBeneficiary: isOtherBeneficiary,
108
+            ...data1,
109
+          });
110
+        }
111
+      })
112
+      .catch((err) => {});
113
+  }, []);
26
 
114
 
27
   return (
115
   return (
28
     <>
116
     <>
29
-      <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.everyoneInfoTitle')}</div>
30
-      <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
31
-        <div style={{ fontSize: '16px', marginBottom: '24px' }}>{t('authentication.everyoneInfoContent1')}</div>
32
-        <div style={{ fontSize: '16px', fontWeight: '600' }}>{t('authentication.everyoneInfoContent2')}</div>
33
-        <Form
117
+      <div style={{ fontSize: "24px", fontWeight: "400" }}>
118
+        {t("authentication.everyoneInfoTitle")}
119
+      </div>
120
+      <Card bordered={false} style={{ width: "900px", marginBottom: "24px" }}>
121
+        <div style={{ fontSize: "16px", marginBottom: "24px" }}>
122
+          {t("authentication.everyoneInfoContent1")}
123
+        </div>
124
+        <div style={{ fontSize: "16px", fontWeight: "600" }}>
125
+          {t("authentication.everyoneInfoContent2")}
126
+        </div>
127
+        <ProForm
34
           form={form}
128
           form={form}
35
           layout="vertical"
129
           layout="vertical"
36
           onFinish={onFinish}
130
           onFinish={onFinish}
37
           size="large"
131
           size="large"
38
-          style={{ marginTop: '4em' }}
132
+          style={{ marginTop: "4em" }}
133
+          submitter={false}
39
         >
134
         >
40
-          <Form.Item label={t('authentication.everyoneInfoInputLabel1')} name="beneficiaryName">
41
-            <Radio.Group onChange={onChange} value={ratio}>
42
-              <Radio style={{ fontSize: '16px' }} value="1">{t('authentication.everyoneInfoInputRadioValue1')}</Radio>
43
-              <Radio style={{ fontSize: '16px' }} value="0">{t('authentication.everyoneInfoInputRadioValue2')}</Radio>
44
-            </Radio.Group>
135
+          <Form.Item noStyle shouldUpdate>
136
+            {({ getFieldValue }) => {
137
+              const authorizedPerson = getFieldValue(
138
+                "authorizedPerson-beneficiaryName"
139
+              );
140
+              const conpanyDirector = getFieldValue(
141
+                "conpanyDirector-beneficiaryName"
142
+              );
143
+              return (
144
+                <>
145
+                  {authorizedPerson ? (
146
+                    <RadioTitle identity="authorizedPerson" />
147
+                  ) : null}
148
+                  {conpanyDirector ? (
149
+                    <RadioTitle identity="conpanyDirector" />
150
+                  ) : null}
151
+                </>
152
+              );
153
+            }}
45
           </Form.Item>
154
           </Form.Item>
46
-          {
47
-            ratio == "1" && (
48
-              <Form.Item label={t('authentication.everyoneInfoInputLabel3')} name="shareholdingRatio" wrapperCol={{ span: 18 }}>
49
-                <Input placeholder={t('authentication.everyoneInfoPlaceholder')} suffix="%" />
50
-              </Form.Item>
51
-            )
52
-          }
53
-          <Form.Item label={t('authentication.everyoneInfoUploadTitle')} style={{ marginTop: '40px', marginBottom: '36px' }} name="equityStructureChart">
155
+
156
+          {/* {ratio == "1" && (
157
+            <Form.Item
158
+              label={t("authentication.everyoneInfoInputLabel3")}
159
+              name="shareholdingRatio"
160
+              wrapperCol={{ span: 18 }}
161
+            >
162
+              <Input
163
+                placeholder={t("authentication.everyoneInfoPlaceholder")}
164
+                suffix="%"
165
+              />
166
+            </Form.Item>
167
+          )} */}
168
+          {/* <Form.Item
169
+            label={t("authentication.everyoneInfoUploadTitle")}
170
+            name="equityStructureChart"
171
+            style={{ marginTop: "40px", marginBottom: "36px" }}
172
+          >
54
             <UploadFile />
173
             <UploadFile />
55
-          </Form.Item>
56
-          {/* <Form.Item label={t('authentication.everyoneInfoInputLabel2')} name="">
174
+          </Form.Item> */}
175
+
176
+          <Form.Item
177
+            label={t("authentication.everyoneInfoInputLabel2")}
178
+            name="isOtherBeneficiary"
179
+            initialValue="0"
180
+          >
57
             <Radio.Group>
181
             <Radio.Group>
58
-              <Radio style={{ fontSize: '16px' }} value="1">{t('authentication.everyoneInfoInputRadioValue1')}</Radio>
59
-              <Radio style={{ fontSize: '16px' }} value="2">{t('authentication.everyoneInfoInputRadioValue2')}</Radio>
182
+              <Radio style={{ fontSize: "16px" }} value="1">
183
+                {t("authentication.everyoneInfoInputRadioValue1")}
184
+              </Radio>
185
+              <Radio style={{ fontSize: "16px" }} value="0">
186
+                {t("authentication.everyoneInfoInputRadioValue2")}
187
+              </Radio>
60
             </Radio.Group>
188
             </Radio.Group>
61
           </Form.Item>
189
           </Form.Item>
62
-          <div style={{ marginBottom: '36px', color: '#ffac00', marginTop: '-24px' }}>{t('authentication.everyoneInfoRadioTip')}</div> */}
190
+
191
+          <Form.Item noStyle shouldUpdate>
192
+            {({ getFieldValue }) => {
193
+              const isOtherBeneficiary = getFieldValue("isOtherBeneficiary");
194
+              // const arrOtherBeneficiaryNum = [];
195
+              // arrOtherBeneficiaryNum.push();
196
+
197
+              return (
198
+                isOtherBeneficiary == 1 && (
199
+                  <>
200
+                    <Form.Item
201
+                      name="otherBeneficiaryNum"
202
+                      label="贵公司其他受益所有人的数量为?"
203
+                      // initialValue={otherBeneficiaryNum || 1}
204
+                    >
205
+                      <Select
206
+                        options={[
207
+                          { value: 1, label: 1 },
208
+                          { value: 2, label: 2 },
209
+                          { value: 3, label: 3 },
210
+                          { value: 4, label: 4 },
211
+                        ]}
212
+                        onChange={setOtherBeneficiaryNum}
213
+                      />
214
+                    </Form.Item>
215
+                    {[...Array(otherBeneficiaryNum)].map((x, index) => {
216
+                      console.log(index);
217
+                      return (
218
+                        <ConpanyDirectorAuthPersonBeneficiary
219
+                          key={index + 1}
220
+                          identity={index + 1}
221
+                          title={`填写第 【${index + 1}】 个受益所有人信息`}
222
+                        />
223
+                      );
224
+                    })}
225
+                  </>
226
+                )
227
+              );
228
+            }}
229
+          </Form.Item>
230
+
231
+          <div
232
+            style={{
233
+              marginBottom: "36px",
234
+              color: "#ffac00",
235
+              marginTop: "-24px",
236
+            }}
237
+          >
238
+            {t("authentication.everyoneInfoRadioTip")}
239
+          </div>
63
 
240
 
64
           {/* 这个是 我已阅读并同意 的东西,涛哥你看适当放开 */}
241
           {/* 这个是 我已阅读并同意 的东西,涛哥你看适当放开 */}
65
-          {/* <Form.Item name="check" rules={[{ required: true, message: '请阅读并勾选协议' }]}>
242
+          {/* <Form.Item
243
+            name="check"
244
+            rules={[{ required: true, message: "请阅读并勾选协议" }]}
245
+          >
66
             <Checkbox>
246
             <Checkbox>
67
-              {t('authentication.everyoneInfoAgreement')}
68
-              <a>{t('authentication.everyoneInfoAgreementTitle1')}</a>
69
-              {t('authentication.everyoneInfoAgreementEnd')}
70
-              <a>{t('authentication.everyoneInfoAgreementTitle2')}</a>
247
+              {t("authentication.everyoneInfoAgreement")}
248
+              <a>{t("authentication.everyoneInfoAgreementTitle1")}</a>
249
+              {t("authentication.everyoneInfoAgreementEnd")}
250
+              <a>{t("authentication.everyoneInfoAgreementTitle2")}</a>
71
             </Checkbox>
251
             </Checkbox>
72
           </Form.Item> */}
252
           </Form.Item> */}
73
-          <Form.Item style={{ marginTop: '24px' }}>
74
-            <Button size="large" style={{ width: '6vw', marginRight: '2vw' }} onClick={onBack}>{t('authentication.everyoneInfoBack')}</Button>
75
-            <Button size="large" type="primary" htmlType="submit" style={{ width: '6vw' }}>{t('authentication.everyoneInfoSubmit')}</Button>
76
-          </Form.Item>
77
-        </Form>
78
 
253
 
254
+          <Form.Item style={{ marginTop: "24px" }}>
255
+            <Button
256
+              size="large"
257
+              style={{ width: "6vw", marginRight: "2vw" }}
258
+              onClick={onBack}
259
+            >
260
+              {t("authentication.everyoneInfoBack")}
261
+            </Button>
262
+            <Button
263
+              size="large"
264
+              type="primary"
265
+              htmlType="submit"
266
+              style={{ width: "6vw" }}
267
+            >
268
+              {t("authentication.everyoneInfoSubmit")}
269
+            </Button>
270
+          </Form.Item>
271
+        </ProForm>
79
       </Card>
272
       </Card>
80
     </>
273
     </>
81
-  )
82
-}
274
+  );
275
+};

+ 56
- 0
src/pages/authentication/components/FaceAuthenticationList.jsx Voir le fichier

1
+import { Button, Tag } from "antd";
2
+import { color } from "echarts";
3
+import React from "react";
4
+import { useTranslation } from "react-i18next";
5
+export default (props) => {
6
+  const { onOpen, item } = props;
7
+  const { t } = useTranslation();
8
+  return (
9
+    <>
10
+      <div
11
+        style={{
12
+          fontSize: "12px",
13
+          fontWeight: "600",
14
+          marginBottom: "12px",
15
+          color: "#031520",
16
+        }}
17
+      >
18
+        {
19
+          item.identity == "conpanyDirector"
20
+            ? "企业董事"
21
+            : item.identity == "authorizedPerson"
22
+            ? "被授权人"
23
+            : "其他受益人"
24
+          // t("authentication.FaceRecognitionSubTitle")
25
+        }
26
+      </div>
27
+      <div className="face-recognition-box">
28
+        <div style={{ flex: 0.3 }}>
29
+          <div style={{ fontSize: "12px", paddingBottom: "8px" }}>
30
+            {t("authentication.FaceRecognitionName")}
31
+          </div>
32
+          <div style={{ fontSize: "12px", fontWeight: "600" }}>
33
+            {item?.directorNameCn}
34
+          </div>
35
+        </div>
36
+        <div style={{ flex: 0.4 }}>
37
+          <div style={{ fontSize: "12px", paddingBottom: "8px" }}>
38
+            {t("authentication.FaceRecognitionState")}
39
+          </div>
40
+          <div>
41
+            <Tag color="orange">
42
+              {item?.certificationStatus == 0
43
+                ? t("authentication.FaceRecognitionTag1")
44
+                : t("authentication.FaceRecognitionTag2")}
45
+            </Tag>
46
+          </div>
47
+        </div>
48
+        <div style={{ flex: 0.3 }}>
49
+          <Button type="primary" onClick={() => onOpen(item)}>
50
+            {t("authentication.FaceRecognitionBtn1")}
51
+          </Button>
52
+        </div>
53
+      </div>
54
+    </>
55
+  );
56
+};

+ 54
- 28
src/pages/authentication/components/FaceRecognition.jsx Voir le fichier

1
-import React, { useState } from "react";
2
-import { Tag, Card, Steps, Button, Radio, Form, Input, Row, Col, Select, Image } from "antd";
3
-import { useTranslation } from 'react-i18next';
1
+import React, { useEffect, useState } from "react";
2
+import {
3
+  Tag,
4
+  Card,
5
+  Steps,
6
+  Button,
7
+  Radio,
8
+  Form,
9
+  Input,
10
+  Row,
11
+  Col,
12
+  Select,
13
+  Image,
14
+} from "antd";
15
+import { useTranslation } from "react-i18next";
4
 import FaceRecognitionModal from "./FaceRecognitionModal";
16
 import FaceRecognitionModal from "./FaceRecognitionModal";
5
 import "../style.less";
17
 import "../style.less";
18
+import { getTaCompanyLegalItemAllCompany } from "@/services/taCompanyLegalItem";
19
+import FaceAuthenticationList from "./FaceAuthenticationList";
6
 
20
 
7
 export default (props) => {
21
 export default (props) => {
8
   const { t } = useTranslation();
22
   const { t } = useTranslation();
9
-  const [open, setOpen] = useState(false)
23
+  const [open, setOpen] = useState(false);
24
+  const [itemIdentify, setItemIdentify] = useState(false);
10
 
25
 
11
-  const onOpen = () => {
12
-    setOpen(true)
13
-  }
26
+  const onOpen = (item) => {
27
+    setItemIdentify(item)
28
+    setOpen(true);
29
+  };
30
+  const [list, setList] = useState([]);
31
+
32
+  useEffect(() => {
33
+    getTaCompanyLegalItemAllCompany()
34
+      .then((res) => {
35
+        setList(res);
36
+      })
37
+      .catch((err) => {});
38
+  }, []);
14
 
39
 
15
   return (
40
   return (
16
     <>
41
     <>
17
-      <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.FaceRecognitionTitle')}</div>
18
-      <Card bordered={false} style={{ width: '900px', paddingBottom: '3vw' }}>
19
-        <div style={{ fontSize: '16px', marginBottom: '24px' }}>{t('authentication.FaceRecognitionContent1')}</div>
20
-        <div style={{ fontSize: '16px', fontWeight: 'bold', marginBottom: '12px' }}>{t('authentication.FaceRecognitionSubTitle')}</div>
21
-        <div className="face-recognition-box">
22
-          <div style={{ flex: 0.3 }}>
23
-            <div style={{ fontSize: '16px' }}>{t('authentication.FaceRecognitionName')}</div>
24
-            <div style={{ fontSize: '16px', fontWeight: 'bold' }}>XXX</div>
25
-          </div>
26
-          <div style={{ flex: 0.4 }}>
27
-            <div style={{ fontSize: '16px' }}>{t('authentication.FaceRecognitionState')}</div>
28
-            <div><Tag color="orange">{t('authentication.FaceRecognitionTag1')}</Tag></div>
29
-          </div>
30
-          <div style={{ flex: 0.3 }}>
31
-            <Button type="primary" onClick={onOpen}>{t('authentication.FaceRecognitionBtn1')}</Button>
32
-          </div>
42
+      <div style={{ fontSize: "24px", fontWeight: "400" }}>
43
+        {t("authentication.FaceRecognitionTitle")}
44
+      </div>
45
+      <Card bordered={false} style={{ width: "900px", paddingBottom: "3vw" }}>
46
+        <div style={{ fontSize: "16px", marginBottom: "24px" }}>
47
+          {t("authentication.FaceRecognitionContent1")}
48
+        </div>
49
+        {(list || []).map((x, index) => {
50
+          return (
51
+            <FaceAuthenticationList key={index} item={x} onOpen={onOpen} />
52
+          );
53
+        })}
54
+        <div
55
+          style={{ fontSize: "16px", marginTop: "12px", marginBottom: "40px" }}
56
+        >
57
+          {t("authentication.FaceRecognitionContent2")}
33
         </div>
58
         </div>
34
-        <div style={{ fontSize: '16px', marginTop: '12px', marginBottom: '40px' }}>{t('authentication.FaceRecognitionContent2')}</div>
35
-        <Button size="large" style={{ width: '6vw' }}>{t('authentication.FaceRecognitionBtn2')}</Button>
59
+        <Button size="large" style={{ width: "6vw" }}>
60
+          {t("authentication.FaceRecognitionBtn2")}
61
+        </Button>
36
       </Card>
62
       </Card>
37
-      <FaceRecognitionModal open={open} setOpen={setOpen} />
63
+      <FaceRecognitionModal  itemIdentify={itemIdentify}open={open} setOpen={setOpen} />
38
     </>
64
     </>
39
-  )
40
-}
65
+  );
66
+};

+ 28
- 11
src/pages/authentication/components/FaceRecognitionModal.jsx Voir le fichier

1
 import React from "react";
1
 import React from "react";
2
 import { Modal, Statistic, Button } from "antd";
2
 import { Modal, Statistic, Button } from "antd";
3
-import { LinkOutlined } from '@ant-design/icons'
4
-import { useTranslation } from 'react-i18next';
3
+import { LinkOutlined } from "@ant-design/icons";
4
+import { useTranslation } from "react-i18next";
5
 const { Countdown } = Statistic;
5
 const { Countdown } = Statistic;
6
 
6
 
7
 export default (props) => {
7
 export default (props) => {
8
-  const { open, setOpen } = props;
8
+  const { open, setOpen, itemIdentify } = props;
9
   const { t } = useTranslation();
9
   const { t } = useTranslation();
10
+
11
+  const name =
12
+    (itemIdentify.identity == "authorizedPerson"
13
+      ? "被授权人"
14
+      : itemIdentify.identity == "conpanyDirector"
15
+      ? "企业董事"
16
+      : "其他受益人") + itemIdentify.directorNameCn;
17
+
10
   return (
18
   return (
11
     <Modal
19
     <Modal
12
       title={
20
       title={
13
         <div style={{ textAlign: "center", fontWeight: "bold" }}>
21
         <div style={{ textAlign: "center", fontWeight: "bold" }}>
14
-          {t('authentication.FaceRecognitionModalTitle')}
22
+          {t("authentication.FaceRecognitionModalTitle")}
15
         </div>
23
         </div>
16
       }
24
       }
17
       open={open}
25
       open={open}
19
       onCancel={() => setOpen(false)}
27
       onCancel={() => setOpen(false)}
20
       footer={null}
28
       footer={null}
21
     >
29
     >
22
-      <div style={{ fontSize: "15px", marginBottom: "12px" }}>{t('authentication.FaceRecognitionModalContent1')}</div>
30
+      <div style={{ fontSize: "15px", marginBottom: "12px" }}>
31
+        {t("authentication.FaceRecognitionModalContent1")}
32
+      </div>
23
       <div style={{ fontSize: "14px" }}>
33
       <div style={{ fontSize: "14px" }}>
24
-        {t('authentication.FaceRecognitionModalTip1')}
34
+        {t("authentication.FaceRecognitionModalTip1")}
25
         <Countdown
35
         <Countdown
26
           value={Date.now() + 1800 * 1000}
36
           value={Date.now() + 1800 * 1000}
27
           format="mm:ss"
37
           format="mm:ss"
28
           style={{ display: "inline-block" }}
38
           style={{ display: "inline-block" }}
29
         />
39
         />
30
-        {t('authentication.FaceRecognitionModalTip2')}
40
+        {t("authentication.FaceRecognitionModalTip2")}
41
+      </div>
42
+      <div style={{ fontSize: "16px", margin: "24px 0", textAlign: "center" }}>
43
+        {
44
+          name // t('authentication.FaceRecognitionDirector')
45
+        }
31
       </div>
46
       </div>
32
-      <div style={{ fontSize: "16px", margin: "24px 0", textAlign: "center" }}>{t('authentication.FaceRecognitionDirector')}XX</div>
33
       <div style={{ display: "flex", justifyContent: "center" }}>
47
       <div style={{ display: "flex", justifyContent: "center" }}>
34
-        <Button type="primary"><LinkOutlined />{t('authentication.FaceRecognitionBtn')}</Button>
48
+        <Button type="primary">
49
+          <LinkOutlined />
50
+          {t("authentication.FaceRecognitionBtn")}
51
+        </Button>
35
       </div>
52
       </div>
36
     </Modal>
53
     </Modal>
37
-  )
38
-}
54
+  );
55
+};

+ 306
- 68
src/pages/authentication/components/FoundationInfo.jsx Voir le fichier

1
-import React from "react";
2
-import { Divider, Card, Steps, Button, Radio, Form, Input, Row, Col, Select } from "antd";
1
+import React, { useEffect } from "react";
2
+import {
3
+  Divider,
4
+  Card,
5
+  Steps,
6
+  Button,
7
+  Radio,
8
+  Form,
9
+  Input,
10
+  Row,
11
+  Col,
12
+  Select,
13
+} from "antd";
3
 import UploadFile from "@/components/Upload/UploadFile";
14
 import UploadFile from "@/components/Upload/UploadFile";
4
-import { useTranslation } from 'react-i18next';
5
-import { postTaCompanyInfo } from "@/services/taCompanyInfo";
15
+import { useTranslation } from "react-i18next";
16
+import {
17
+  getTaCompanyInfo,
18
+  getTaCompanyInfoTenantId,
19
+  postTaCompanyInfo,
20
+  putTaCompanyInfo,
21
+} from "@/services/taCompanyInfo";
6
 import "../style.less";
22
 import "../style.less";
7
 
23
 
8
 export default (props) => {
24
 export default (props) => {
11
   const { t } = useTranslation();
27
   const { t } = useTranslation();
12
 
28
 
13
   const onFinish = (values) => {
29
   const onFinish = (values) => {
14
-    console.log('values', [values]);
15
-    postTaCompanyInfo([values]).then((res) => {
16
-      setIndex(index + 1);
17
-    });
30
+    const id = values.companyId;
31
+    if (id) {
32
+      getTaCompanyInfoTenantId()
33
+        .then((res) => {
34
+          setIndex(index + 1);
35
+        })
36
+        .catch((err) => {});
37
+    } else {
38
+      postTaCompanyInfo(values).then((res) => {
39
+        setIndex(index + 1);
40
+      });
41
+    }
18
   };
42
   };
19
 
43
 
44
+  useEffect(() => {
45
+    form.resetFields();
46
+
47
+    getTaCompanyInfoTenantId()
48
+      .then((res) => {
49
+        form.setFieldsValue(res);
50
+      })
51
+      .catch((err) => {});
52
+  }, []);
53
+
54
+  const validateMessages = {
55
+    required: "请填写${label}",
56
+    types: {
57
+      certificateIncorporation: "${label} 不是有效的公司注册证书",
58
+      companyBusinessRegistration: "${label} 不是有效的公司商业登记证",
59
+      nnc1Nar1: "${label} 不是有效的NNC1/最新NAR1",
60
+      otherAnnex: "${label} 不是有效的其他证件",
61
+      companyType: "${label} 不是有效的企业类型",
62
+      businessRegistrationNum: "${label} 不是有效的商业登记号",
63
+      registerCountry: "${label} 不是有效的注册-国家",
64
+      registerProvinceRegion: "${label} 不是有效的注册-省/地区",
65
+      registerCity: "${label} 不是有效的注册-市",
66
+      registerSpecificAddress: "${label} 不是有效的注册-具体地址",
67
+      registerPostalCode: "${label} 不是有效的注册-邮政编码",
68
+
69
+      realityCountry: "${label} 不是有效的实际经营-国家",
70
+      realityProvinceRegion: "${label} 不是有效的实际经营-省/地区",
71
+      realityCity: "${label} 不是有效的实际经营-市",
72
+      realitySpecificAddress: "${label} 不是有效的实际经营-具体地址",
73
+      realityPostalCode: "${label} 不是有效的实际经营-邮政编码",
74
+      numEmployees: "${label} 不是有效的雇员人数",
75
+      businessPremisesType: "${label} 不是有效的经营场所类型",
76
+    },
77
+  };
78
+  const formRule = {
79
+    certificateIncorporation: [{ required: true }],
80
+    companyBusinessRegistration: [{ required: true }],
81
+    nnc1Nar1: [{ required: true }],
82
+    otherAnnex: [{ required: true }],
83
+    companyType: [{ required: true }],
84
+    businessRegistrationNum: [{ required: true }],
85
+    registerCountry: [{ required: true }],
86
+    registerProvinceRegion: [{ required: true }],
87
+    registerCity: [{ required: true }],
88
+    registerSpecificAddress: [{ required: true }],
89
+    registerPostalCode: [{ required: true }],
90
+
91
+    realityCountry: [{ required: true }],
92
+    realityProvinceRegion: [{ required: true }],
93
+    realityCity: [{ required: true }],
94
+    realitySpecificAddress: [{ required: true }],
95
+    realityPostalCode: [{ required: true }],
96
+    numEmployees: [{ required: true }],
97
+    businessPremisesType: [{ required: true }],
98
+  };
20
   return (
99
   return (
21
     <>
100
     <>
22
-      <div style={{ fontSize: '24px', fontWeight: '400' }}>{t('authentication.titleRight')}</div>
101
+      <div style={{ fontSize: "24px", fontWeight: "400" }}>
102
+        {t("authentication.titleRight")}
103
+      </div>
23
       {/* <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
104
       {/* <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
24
         <div style={{ color: 'red', fontWeight: '600' }}>{t('authentication.rightTopSubTitle')}</div>
105
         <div style={{ color: 'red', fontWeight: '600' }}>{t('authentication.rightTopSubTitle')}</div>
25
         <div style={{ color: '#bfbfbf' }}>{t('authentication.rightTopText')}</div>
106
         <div style={{ color: '#bfbfbf' }}>{t('authentication.rightTopText')}</div>
29
         layout="vertical"
110
         layout="vertical"
30
         onFinish={onFinish}
111
         onFinish={onFinish}
31
         size="large"
112
         size="large"
113
+        validateMessages={validateMessages}
32
       >
114
       >
33
-        <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
34
-          <div style={{ fontSize: '16px', fontWeight: '600', marginBottom: '40px' }}>{t('authentication.subTitleRight')}</div>
35
-          <Form.Item name="certificateIncorporation" label={t('authentication.uploadTitle1')}>
115
+        <Form.Item hidden name="companyId"></Form.Item>
116
+
117
+        <Card bordered={false} style={{ width: "900px", marginBottom: "24px" }}>
118
+          <div
119
+            style={{
120
+              fontSize: "16px",
121
+              fontWeight: "600",
122
+              marginBottom: "40px",
123
+            }}
124
+          >
125
+            {t("authentication.subTitleRight")}
126
+          </div>
127
+          <Form.Item
128
+            name="certificateIncorporation"
129
+            label={t("authentication.uploadTitle1")}
130
+            rules={formRule.certificateIncorporation}
131
+          >
36
             <UploadFile />
132
             <UploadFile />
37
           </Form.Item>
133
           </Form.Item>
38
-          <Form.Item name="companyBusinessRegistration" label={t('authentication.uploadTitle2')}>
39
-            <UploadFile text1={t('authentication.uploadPromptTextII4')} />
134
+          <Form.Item
135
+            name="companyBusinessRegistration"
136
+            label={t("authentication.uploadTitle2")}
137
+            rules={formRule.companyBusinessRegistration}
138
+          >
139
+            <UploadFile text1={t("authentication.uploadPromptTextII4")} />
40
           </Form.Item>
140
           </Form.Item>
41
-          <Form.Item name="nnc1Nar1" label={t('authentication.uploadTitle3')}>
42
-            <UploadFile text2={t('authentication.uploadPromptTextIII4')} text3={t('authentication.uploadPromptTextII5')} />
141
+          <Form.Item
142
+            name="nnc1Nar1"
143
+            label={t("authentication.uploadTitle3")}
144
+            rules={formRule.nnc1Nar1}
145
+          >
146
+            <UploadFile
147
+              text2={t("authentication.uploadPromptTextIII4")}
148
+              text3={t("authentication.uploadPromptTextII5")}
149
+            />
43
           </Form.Item>
150
           </Form.Item>
44
-          <Form.Item name="otherAnnex" label={t('authentication.uploadTitle4')}>
151
+          <Form.Item
152
+            name="otherAnnex"
153
+            label={t("authentication.uploadTitle4")}
154
+            rules={formRule.otherAnnex}
155
+          >
45
             <UploadFile />
156
             <UploadFile />
46
           </Form.Item>
157
           </Form.Item>
47
         </Card>
158
         </Card>
48
-        <Card bordered={false} style={{ width: '900px', marginBottom: '24px' }}>
49
-          <Form.Item label={t('authentication.formRightLabel1')} wrapperCol={{ span: 18 }} name="companyType">
159
+        <Card bordered={false} style={{ width: "900px", marginBottom: "24px" }}>
160
+          <Form.Item
161
+            label={t("authentication.formRightLabel1")}
162
+            wrapperCol={{ span: 18 }}
163
+            name="companyType"
164
+            initialValue={1}
165
+            rules={formRule.companyType}
166
+          >
50
             <Radio.Group>
167
             <Radio.Group>
51
               <Radio
168
               <Radio
52
-                style={{ fontSize: '16px', fontWeight: '600', paddingBottom: '12px' }}
169
+                style={{
170
+                  fontSize: "16px",
171
+                  fontWeight: "600",
172
+                  paddingBottom: "12px",
173
+                }}
53
                 value="1"
174
                 value="1"
54
-              >{t('authentication.enterpriseTypeRadio1')}</Radio>
175
+              >
176
+                {t("authentication.enterpriseTypeRadio1")}
177
+              </Radio>
55
               <Radio
178
               <Radio
56
-                style={{ fontSize: '16px', fontWeight: '600', paddingBottom: '12px' }}
179
+                style={{
180
+                  fontSize: "16px",
181
+                  fontWeight: "600",
182
+                  paddingBottom: "12px",
183
+                }}
57
                 value="2"
184
                 value="2"
58
-              >{t('authentication.enterpriseTypeRadio2')}</Radio>
185
+              >
186
+                {t("authentication.enterpriseTypeRadio2")}
187
+              </Radio>
59
               <Radio
188
               <Radio
60
-                style={{ fontSize: '16px', fontWeight: '600', paddingBottom: '12px' }}
189
+                style={{
190
+                  fontSize: "16px",
191
+                  fontWeight: "600",
192
+                  paddingBottom: "12px",
193
+                }}
61
                 value="3"
194
                 value="3"
62
-              >{t('authentication.enterpriseTypeRadio3')}</Radio>
63
-              <Radio
64
-                style={{ fontSize: '16px', fontWeight: '600' }}
65
-                value="4"
66
-              >{t('authentication.enterpriseTypeRadio4')}</Radio>
195
+              >
196
+                {t("authentication.enterpriseTypeRadio3")}
197
+              </Radio>
198
+              <Radio style={{ fontSize: "16px", fontWeight: "600" }} value="4">
199
+                {t("authentication.enterpriseTypeRadio4")}
200
+              </Radio>
67
             </Radio.Group>
201
             </Radio.Group>
68
           </Form.Item>
202
           </Form.Item>
69
-          <Form.Item label={t('authentication.formRightLabel2')} wrapperCol={{ span: 18 }} name="businessRegistrationNum">
70
-            <Input placeholder={t('authentication.formRightPlaceholder')} />
203
+          <Form.Item
204
+            label={t("authentication.formRightLabel2")}
205
+            wrapperCol={{ span: 18 }}
206
+            name="businessRegistrationNum"
207
+            rules={formRule.businessRegistrationNum}
208
+          >
209
+            <Input placeholder={t("authentication.formRightPlaceholder")} />
71
             {/* <Input.Group>
210
             {/* <Input.Group>
72
               <Row>
211
               <Row>
73
                 <Col span={8}>
212
                 <Col span={8}>
78
             </Input.Group> */}
217
             </Input.Group> */}
79
           </Form.Item>
218
           </Form.Item>
80
 
219
 
81
-
82
-          <Form.Item label={t('authentication.formRightLabel3')} wrapperCol={{ span: 18 }} name="registerCountry">
83
-            <Select placeholder={t('authentication.formRightPlaceholder2')}>
84
-              <Select.Option value={t('authentication.formRightSelect1')}>{t('authentication.formRightSelect1')}</Select.Option>
220
+          <Form.Item
221
+            label={t("authentication.formRightLabel3")}
222
+            wrapperCol={{ span: 18 }}
223
+            name="registerCountry"
224
+            rules={formRule.registerCountry}
225
+          >
226
+            <Select placeholder={t("authentication.formRightPlaceholder2")}>
227
+              <Select.Option value={t("authentication.formRightSelect1")}>
228
+                {t("authentication.formRightSelect1")}
229
+              </Select.Option>
85
             </Select>
230
             </Select>
86
           </Form.Item>
231
           </Form.Item>
87
 
232
 
88
-          <Form.Item wrapperCol={{ span: 18 }} name="registerProvinceRegion">
89
-            <Select placeholder={t('authentication.formRightSelectPlaceholder1')}>
233
+          <Form.Item
234
+            wrapperCol={{ span: 18 }}
235
+            name="registerProvinceRegion"
236
+            rules={formRule.registerProvinceRegion}
237
+          >
238
+            <Select
239
+              placeholder={t("authentication.formRightSelectPlaceholder1")}
240
+            >
90
               <Select.Option value="北京">北京</Select.Option>
241
               <Select.Option value="北京">北京</Select.Option>
91
             </Select>
242
             </Select>
92
           </Form.Item>
243
           </Form.Item>
93
-          <Form.Item wrapperCol={{ span: 18 }} name="registerCity">
94
-            <Input placeholder={t('authentication.formRightInputPlaceholder2')} />
244
+          <Form.Item
245
+            wrapperCol={{ span: 18 }}
246
+            name="registerCity"
247
+            rules={formRule.registerCity}
248
+          >
249
+            <Input
250
+              placeholder={t("authentication.formRightInputPlaceholder2")}
251
+            />
95
           </Form.Item>
252
           </Form.Item>
96
-          <Form.Item wrapperCol={{ span: 18 }} name="registerSpecificAddress">
97
-            <Input placeholder={t('authentication.formRightInputPlaceholder3')} />
253
+          <Form.Item
254
+            wrapperCol={{ span: 18 }}
255
+            name="registerSpecificAddress"
256
+            rules={formRule.registerSpecificAddress}
257
+          >
258
+            <Input
259
+              placeholder={t("authentication.formRightInputPlaceholder3")}
260
+            />
98
           </Form.Item>
261
           </Form.Item>
99
-          <Form.Item wrapperCol={{ span: 18 }} name="registerPostalCode">
100
-            <Input placeholder={t('authentication.formRightInputPlaceholder4')} />
262
+          <Form.Item
263
+            wrapperCol={{ span: 18 }}
264
+            name="registerPostalCode"
265
+            rules={formRule.registerPostalCode}
266
+          >
267
+            <Input
268
+              placeholder={t("authentication.formRightInputPlaceholder4")}
269
+            />
101
           </Form.Item>
270
           </Form.Item>
102
           {/* 实际经营地址 */}
271
           {/* 实际经营地址 */}
103
-          <Form.Item label={t('authentication.formRightLabel4')} wrapperCol={{ span: 18 }} name="realityCountry">
104
-            <Select placeholder={t('authentication.formRightSelectPlaceholder1')}>
105
-              <Select.Option value="中国香港(地区)">中国香港(地区)</Select.Option>
272
+          <Form.Item
273
+            label={t("authentication.formRightLabel4")}
274
+            wrapperCol={{ span: 18 }}
275
+            name="realityCountry"
276
+            rules={formRule.realityCountry}
277
+          >
278
+            <Select
279
+              placeholder={t("authentication.formRightSelectPlaceholder1")}
280
+            >
281
+              <Select.Option value="中国香港(地区)">
282
+                中国香港(地区)
283
+              </Select.Option>
106
             </Select>
284
             </Select>
107
           </Form.Item>
285
           </Form.Item>
108
 
286
 
109
-          <Form.Item wrapperCol={{ span: 18 }} name="realityProvinceRegion">
110
-            <Select placeholder={t('authentication.formRightSelectPlaceholder1')}>
287
+          <Form.Item
288
+            wrapperCol={{ span: 18 }}
289
+            name="realityProvinceRegion"
290
+            rules={formRule.realityProvinceRegion}
291
+          >
292
+            <Select
293
+              placeholder={t("authentication.formRightSelectPlaceholder1")}
294
+            >
111
               <Select.Option value="北京">北京</Select.Option>
295
               <Select.Option value="北京">北京</Select.Option>
112
             </Select>
296
             </Select>
113
           </Form.Item>
297
           </Form.Item>
114
-          <Form.Item wrapperCol={{ span: 18 }} name="realityCity">
115
-            <Input placeholder={t('authentication.formRightInputPlaceholder2')} />
298
+          <Form.Item
299
+            wrapperCol={{ span: 18 }}
300
+            name="realityCity"
301
+            rules={formRule.realityCity}
302
+          >
303
+            <Input
304
+              placeholder={t("authentication.formRightInputPlaceholder2")}
305
+            />
116
           </Form.Item>
306
           </Form.Item>
117
-          <Form.Item wrapperCol={{ span: 18 }} name="realitySpecificAddress">
118
-            <Input placeholder={t('authentication.formRightInputPlaceholder3')} />
307
+          <Form.Item
308
+            wrapperCol={{ span: 18 }}
309
+            name="realitySpecificAddress"
310
+            rules={formRule.realitySpecificAddress}
311
+          >
312
+            <Input
313
+              placeholder={t("authentication.formRightInputPlaceholder3")}
314
+            />
119
           </Form.Item>
315
           </Form.Item>
120
-          <Form.Item wrapperCol={{ span: 18 }} name="realityPostalCode">
121
-            <Input placeholder={t('authentication.formRightInputPlaceholder4')} />
316
+          <Form.Item
317
+            wrapperCol={{ span: 18 }}
318
+            name="realityPostalCode"
319
+            rules={formRule.realityPostalCode}
320
+          >
321
+            <Input
322
+              placeholder={t("authentication.formRightInputPlaceholder4")}
323
+            />
122
           </Form.Item>
324
           </Form.Item>
123
 
325
 
124
-          <Form.Item label={t('authentication.formRightLabel5')} wrapperCol={{ span: 18 }} name="numEmployees">
125
-            <Select placeholder={t('authentication.formRightInputPlaceholder5')}>
126
-              <Select.Option value="1" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputNumber1')}</Select.Option>
127
-              <Select.Option value="2" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputNumber2')}</Select.Option>
128
-              <Select.Option value="3" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputNumber3')}</Select.Option>
326
+          <Form.Item
327
+            label={t("authentication.formRightLabel5")}
328
+            wrapperCol={{ span: 18 }}
329
+            name="numEmployees"
330
+            rules={formRule.numEmployees}
331
+          >
332
+            <Select
333
+              placeholder={t("authentication.formRightInputPlaceholder5")}
334
+            >
335
+              <Select.Option value="1" style={{ backgroundColor: "#FFF" }}>
336
+                {t("authentication.formRightInputNumber1")}
337
+              </Select.Option>
338
+              <Select.Option value="2" style={{ backgroundColor: "#FFF" }}>
339
+                {t("authentication.formRightInputNumber2")}
340
+              </Select.Option>
341
+              <Select.Option value="3" style={{ backgroundColor: "#FFF" }}>
342
+                {t("authentication.formRightInputNumber3")}
343
+              </Select.Option>
129
             </Select>
344
             </Select>
130
           </Form.Item>
345
           </Form.Item>
131
-          <Form.Item label={t('authentication.formRightLabel6')} wrapperCol={{ span: 18 }} name="businessPremisesType">
132
-            <Select placeholder={t('authentication.formRightInputPlaceholder6')}>
133
-              <Select.Option value="1" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputPlace1')}</Select.Option>
134
-              <Select.Option value="2" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputPlace2')}</Select.Option>
135
-              <Select.Option value="3" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputPlace3')}</Select.Option>
136
-              <Select.Option value="4" style={{ backgroundColor: '#FFF' }}>{t('authentication.formRightInputPlace4')}</Select.Option>
346
+          <Form.Item
347
+            label={t("authentication.formRightLabel6")}
348
+            wrapperCol={{ span: 18 }}
349
+            name="businessPremisesType"
350
+            rules={formRule.businessPremisesType}
351
+          >
352
+            <Select
353
+              placeholder={t("authentication.formRightInputPlaceholder6")}
354
+            >
355
+              <Select.Option value="1" style={{ backgroundColor: "#FFF" }}>
356
+                {t("authentication.formRightInputPlace1")}
357
+              </Select.Option>
358
+              <Select.Option value="2" style={{ backgroundColor: "#FFF" }}>
359
+                {t("authentication.formRightInputPlace2")}
360
+              </Select.Option>
361
+              <Select.Option value="3" style={{ backgroundColor: "#FFF" }}>
362
+                {t("authentication.formRightInputPlace3")}
363
+              </Select.Option>
364
+              <Select.Option value="4" style={{ backgroundColor: "#FFF" }}>
365
+                {t("authentication.formRightInputPlace4")}
366
+              </Select.Option>
137
             </Select>
367
             </Select>
138
           </Form.Item>
368
           </Form.Item>
139
-          <Button type="primary" size="large" style={{ width: '6vw' }} htmlType="submit">{t('authentication.foundationInfoNextBtn')}</Button>
369
+     
370
+          <Button
371
+            type="primary"
372
+            size="large"
373
+            style={{ width: "6vw" }}
374
+            htmlType="submit"
375
+          >
376
+            {t("authentication.foundationInfoNextBtn")}
377
+          </Button>
140
         </Card>
378
         </Card>
141
       </Form>
379
       </Form>
142
     </>
380
     </>
143
-  )
144
-}
381
+  );
382
+};

+ 85
- 0
src/pages/authentication/components/RadioTitle.jsx Voir le fichier

1
+import { ProForm } from "@ant-design/pro-components";
2
+import { Form, Input, InputNumber, Radio } from "antd";
3
+import React, { useState } from "react";
4
+import { useTranslation } from "react-i18next";
5
+export default (props) => {
6
+  const { t } = useTranslation();
7
+  const { identity } = props;
8
+  const [ratio, setRatio] = useState("0");
9
+
10
+  const onChange = (e) => {
11
+    setRatio(e.target.value);
12
+  };
13
+  console.log(identity)
14
+  return (
15
+    <>
16
+      <Form.Item name={`${identity}-companyLegalId`} hidden />
17
+      <Form.Item name={`${identity}-realCompanyId`} hidden />
18
+      <Form.Item name={`${identity}-beneficiaryId`} hidden />
19
+      {/* <Form.Item
20
+        name={`${identity}-beneficiaryName`}
21
+        label={`${identity}-beneficiaryName`}
22
+      /> */}
23
+      <Form.Item noStyle shouldUpdate>
24
+        {({ getFieldValue }) => {
25
+          const beneficiaryName = getFieldValue(`${identity}-beneficiaryName`);
26
+          const identity2 = getFieldValue(`${identity}-identity`);
27
+          const lable = `${
28
+            identity2 == "authorizedPerson" ? "被授权人" : "企业董事"
29
+          }【${beneficiaryName}】是否为受益所有人?`;
30
+
31
+          return (
32
+            <Form.Item
33
+              label={lable}
34
+              name={`${identity}-isBeneficiary`}
35
+              initialValue={ratio}
36
+            >
37
+              <Radio.Group onChange={onChange}>
38
+                <Radio style={{ fontSize: "16px" }} value="1">
39
+                  {t("authentication.everyoneInfoInputRadioValue1")}
40
+                </Radio>
41
+                <Radio style={{ fontSize: "16px" }} value="0">
42
+                  {t("authentication.everyoneInfoInputRadioValue2")}
43
+                </Radio>
44
+              </Radio.Group>
45
+            </Form.Item>
46
+          );
47
+        }}
48
+      </Form.Item>
49
+
50
+      <Form.Item noStyle shouldUpdate>
51
+        {({ getFieldValue }) => {
52
+          const beneficiaryName = getFieldValue(`${identity}-beneficiaryName`);
53
+          // const lable =
54
+          //   identity == "conpanyDirector"
55
+          //     ? `被授权人【${beneficiaryName}】的持股比例为?`
56
+          //     : `企业董事 【${beneficiaryName}】 的持股比例为?`;
57
+              const lable = `${
58
+                identity == "authorizedPerson" ? "被授权人" : "企业董事"
59
+              }【${beneficiaryName}】的持股比例为`;
60
+          const isBeneficiary = getFieldValue(`${identity}-isBeneficiary`);
61
+          return (
62
+            isBeneficiary == 1 && (
63
+              <Form.Item
64
+                label={lable}
65
+                name={`${identity}-shareholdingRatio`}
66
+                wrapperCol={{ span: 18 }}
67
+              >
68
+                {/* <Input
69
+                  placeholder={t("authentication.everyoneInfoPlaceholder")}
70
+                  suffix="%"
71
+                /> */}
72
+                <InputNumber
73
+                  placeholder=">=25"
74
+                  style={{ width: "100%" }}
75
+                  formatter={(value) => `${value}%`}
76
+                  min={25}
77
+                />
78
+              </Form.Item>
79
+            )
80
+          );
81
+        }}
82
+      </Form.Item>
83
+    </>
84
+  );
85
+};

+ 1
- 1
src/pages/authentication/index.jsx Voir le fichier

11
 
11
 
12
 export default (props) => {
12
 export default (props) => {
13
   const { t } = useTranslation();
13
   const { t } = useTranslation();
14
-  const [index, setIndex] = useState(0);
14
+  const [index, setIndex] = useState(3);
15
   return (
15
   return (
16
     <Page>
16
     <Page>
17
       <div className="authentication-box">
17
       <div className="authentication-box">

+ 25
- 6
src/pages/authentication/style.less Voir le fichier

3
   align-items: stretch;
3
   align-items: stretch;
4
   height: 100%;
4
   height: 100%;
5
   padding: 0 80px;
5
   padding: 0 80px;
6
+
6
   .authentication-left {
7
   .authentication-left {
7
     flex: 0.5;
8
     flex: 0.5;
8
     margin-right: 36px;
9
     margin-right: 36px;
9
   }
10
   }
11
+
10
   .authentication-right-upload-box {
12
   .authentication-right-upload-box {
11
     width: 200px;
13
     width: 200px;
12
     height: 120px;
14
     height: 120px;
17
     border: 1px dashed #1890ff;
19
     border: 1px dashed #1890ff;
18
     display: 1;
20
     display: 1;
19
     flex: 0.8;
21
     flex: 0.8;
22
+
23
+    img {
24
+      width: 100%;
25
+      height: 110px;
26
+    }
20
   }
27
   }
28
+
21
   .directorInfo-img-right-text {
29
   .directorInfo-img-right-text {
22
     font-size: 16px;
30
     font-size: 16px;
23
     padding-left: 1em;
31
     padding-left: 1em;
24
     display: inline-block;
32
     display: inline-block;
25
   }
33
   }
26
-  .directorInfo-img-box {
27
-    padding: 24px;
28
-    width: 600px;
29
-    background-color: rgba(191, 191, 191, 0.1);
34
+
35
+  // .directorInfo-img-box {
36
+  //   padding: 24px;
37
+  //   width: 600px;
38
+  //   background-color: rgba(191, 191, 191, 0.1);
39
+  .image_box {
40
+    display: flex;
41
+    align-items: center;
42
+
43
+    .ant-upload-picture-card-wrapper {
44
+      width: auto
45
+    }
30
   }
46
   }
47
+
48
+  // }
31
   .face-recognition-box {
49
   .face-recognition-box {
32
     display: flex;
50
     display: flex;
33
     align-items: center;
51
     align-items: center;
34
-    background-color: rgba(191, 191, 191, 0.1);
52
+    background-color: #fafcfc;
53
+    // background-color: rgba(191, 191, 191, 0.1);
35
     padding: 24px;
54
     padding: 24px;
36
   }
55
   }
37
-}
56
+}

+ 0
- 1
src/routes/Router.jsx Voir le fichier

5
 
5
 
6
 export default (props) => {
6
 export default (props) => {
7
   const { routes } = useModel("user");
7
   const { routes } = useModel("user");
8
-  console.log(routes)
9
   const router = React.useMemo(() => {
8
   const router = React.useMemo(() => {
10
     if (!routes || routes.length < 1) {
9
     if (!routes || routes.length < 1) {
11
       return createHashRouter(defaultRoutes);
10
       return createHashRouter(defaultRoutes);

+ 7
- 7
src/services/login.js Voir le fichier

4
  * 修改密码
4
  * 修改密码
5
  */
5
  */
6
 export const changePassword = (data) =>
6
 export const changePassword = (data) =>
7
-  request(`/admin/change-password`, { data, method: "put" });
7
+  request(`/change-password`, { data, method: "put" });
8
 
8
 
9
 /*
9
 /*
10
  * 修改手机号
10
  * 修改手机号
11
  */
11
  */
12
 export const changePhone = (data) =>
12
 export const changePhone = (data) =>
13
-  request(`/admin/change-phone`, { data, method: "put" });
13
+  request(`/change-phone`, { data, method: "put" });
14
 
14
 
15
 /*
15
 /*
16
  * 修改邮箱
16
  * 修改邮箱
17
  */
17
  */
18
 export const changeEmail = (data) =>
18
 export const changeEmail = (data) =>
19
-  request(`/admin/change-email`, { data, method: "put" });
19
+  request(`/change-email`, { data, method: "put" });
20
 
20
 
21
 /*
21
 /*
22
  * 后台登录
22
  * 后台登录
23
  */
23
  */
24
 export const login = (data) =>
24
 export const login = (data) =>
25
-  request("/admin/login", { data, method: "post" });
25
+  request("/login", { data, method: "post" });
26
 
26
 
27
 /*
27
 /*
28
 * 后台注册
28
 * 后台注册
29
 */
29
 */
30
 export const register = (data) =>
30
 export const register = (data) =>
31
-  request("/admin/register", { data, method: "post" });
31
+  request("/register", { data, method: "post" });
32
 
32
 
33
 /*
33
 /*
34
 * 登出
34
 * 登出
35
 */
35
 */
36
 export const logout = (data) =>
36
 export const logout = (data) =>
37
-  request("/admin/logout", { data, method: "post" });
37
+  request("/logout", { data, method: "post" });
38
 
38
 
39
 
39
 
40
 /*
40
 /*
46
 /**
46
 /**
47
  * 获取当前用户信息
47
  * 获取当前用户信息
48
  */
48
  */
49
-export const currentUser = (params) => request("/admin/current", { params })
49
+export const currentUser = (params) => request("/current", { params })

+ 11
- 2
src/services/taCompanyBeneficiaryInfo.js Voir le fichier

8
 /*
8
 /*
9
  * 新增数据
9
  * 新增数据
10
  */
10
  */
11
-export const postTaCompanyBeneficiaryInfo = (data) => request('/admin/taCompanyBeneficiaryInfo', { data, method: 'post' });
11
+export const postTaCompanyBeneficiaryInfo = (data) => request('/taCompanyBeneficiaryInfo', { data, method: 'post' });
12
 
12
 
13
 /*
13
 /*
14
  * 更新数据
14
  * 更新数据
23
 /*
23
 /*
24
  * 通过ID查询单条数据
24
  * 通过ID查询单条数据
25
  */
25
  */
26
-export const getTaCompanyBeneficiaryInfoId = (id) => request(`/taCompanyBeneficiaryInfo/${id}`);
26
+export const getTaCompanyBeneficiaryInfoId = (id) => request(`/taCompanyBeneficiaryInfo/${id}`);
27
+
28
+
29
+
30
+
31
+
32
+/*
33
+ * 通过TenantId查询单条数 据
34
+ */
35
+export const getTaCompanyBeneficiaryInfoTenantId = () => request(`/taCompanyBeneficiaryInfo/tenant`);

+ 9
- 2
src/services/taCompanyInfo.js Voir le fichier

8
 /*
8
 /*
9
  * 新增数据
9
  * 新增数据
10
  */
10
  */
11
-export const postTaCompanyInfo = (data) => request('/admin/taCompanyInfo', { data, method: 'post' });
11
+export const postTaCompanyInfo = (data) => request('/taCompanyInfo', { data, method: 'post' });
12
 
12
 
13
 /*
13
 /*
14
  * 更新数据
14
  * 更新数据
23
 /*
23
 /*
24
  * 通过ID查询单条数据
24
  * 通过ID查询单条数据
25
  */
25
  */
26
-export const getTaCompanyInfoId = (id) => request(`/taCompanyInfo/${id}`);
26
+export const getTaCompanyInfoId = (id) => request(`/taCompanyInfo/${id}`);
27
+
28
+
29
+
30
+/*
31
+ * 通过TenantId查询单条数 据
32
+ */
33
+export const getTaCompanyInfoTenantId = () => request(`/taCompanyInfo/tenant`);

+ 10
- 2
src/services/taCompanyLegalInfo.js Voir le fichier

8
 /*
8
 /*
9
  * 新增数据
9
  * 新增数据
10
  */
10
  */
11
-export const postTaCompanyLegalInfo = (data) => request('/admin/taCompanyLegalInfo', { data, method: 'post' });
11
+export const postTaCompanyLegalInfo = (data) => request('/taCompanyLegalInfo', { data, method: 'post' });
12
 
12
 
13
 /*
13
 /*
14
  * 更新数据
14
  * 更新数据
23
 /*
23
 /*
24
  * 通过ID查询单条数据
24
  * 通过ID查询单条数据
25
  */
25
  */
26
-export const getTaCompanyLegalInfoId = (id) => request(`/taCompanyLegalInfo/${id}`);
26
+export const getTaCompanyLegalInfoId = (id) => request(`/taCompanyLegalInfo/${id}`);
27
+
28
+
29
+
30
+
31
+/*
32
+ * 通过TenantId查询单条数 据
33
+ */
34
+export const getTaCompanyLegalInfoTenantId = () => request(`/taCompanyLegalInfo/tenant`);

+ 41
- 0
src/services/taCompanyLegalItem.js Voir le fichier

1
+import request from "@/utils/request";
2
+
3
+/*
4
+ * 分页查询
5
+ */
6
+export const getTaCompanyLegalItem = (params) => request(`/taCompanyLegalItem`, { params });
7
+
8
+/*
9
+ * 新增数据
10
+ */
11
+export const postTaCompanyLegalItem = (data) => request('/taCompanyLegalItem', { data, method: 'post' });
12
+
13
+/*
14
+ * 更新数据
15
+ */
16
+export const putTaCompanyLegalItem = (id, data) => request(`/taCompanyLegalItem/${id}`, { data, method: 'put' });
17
+
18
+/*
19
+ * 通过主键删除数据
20
+ */
21
+export const deleteTaCompanyLegalItem = (id) => request(`/taCompanyLegalItem/${id}`, { method: 'delete' });
22
+
23
+/*
24
+ * 通过ID查询单条数据
25
+ */
26
+export const getTaCompanyLegalItemId = (id) => request(`/taCompanyLegalItem/${id}`);
27
+
28
+
29
+
30
+/**
31
+ * 查询 所有的受益人
32
+ */
33
+
34
+/*
35
+ * 通过ID查询单条数据
36
+ */
37
+export const getTaCompanyLegalItemAllCompany = () => request(`/taCompanyLegalItem/allCompany`);
38
+
39
+
40
+
41
+

+ 9
- 2
src/services/taCompanyRealName.js Voir le fichier

8
 /*
8
 /*
9
  * 新增数据
9
  * 新增数据
10
  */
10
  */
11
-export const postTaCompanyRealName = (data) => request('/admin/taCompanyRealName', { data, method: 'post' });
11
+export const postTaCompanyRealName = (data) => request('/taCompanyRealName', { data, method: 'post' });
12
 
12
 
13
 /*
13
 /*
14
  * 更新数据
14
  * 更新数据
23
 /*
23
 /*
24
  * 通过ID查询单条数据
24
  * 通过ID查询单条数据
25
  */
25
  */
26
-export const getTaCompanyRealNameId = (id) => request(`/taCompanyRealName/${id}`);
26
+export const getTaCompanyRealNameId = (id) => request(`/taCompanyRealName/${id}`);
27
+
28
+
29
+
30
+/*
31
+ * 通过TenantId查询单条数 据
32
+ */
33
+export const getTaCompanyRealNameTenantId = () => request(`/taCompanyRealName/tenant`);

+ 0
- 1
src/utils/request.js Voir le fichier

36
         "Content-Type": "application/json;charset=utf-8",
36
         "Content-Type": "application/json;charset=utf-8",
37
         ...headers,
37
         ...headers,
38
         Authorization: token,
38
         Authorization: token,
39
-        // "x-client-type": "pc.admin",
40
       },
39
       },
41
       responseType: download ? "blob" : responseType,
40
       responseType: download ? "blob" : responseType,
42
     };
41
     };

+ 157
- 49
yarn.lock Voir le fichier

262
   resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.3.tgz"
262
   resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.3.tgz"
263
   integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==
263
   integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==
264
 
264
 
265
-"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.10", "@babel/core@^7.19.6":
265
+"@babel/core@^7.12.10", "@babel/core@^7.19.6":
266
   version "7.22.1"
266
   version "7.22.1"
267
   resolved "https://registry.npmmirror.com/@babel/core/-/core-7.22.1.tgz"
267
   resolved "https://registry.npmmirror.com/@babel/core/-/core-7.22.1.tgz"
268
   integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==
268
   integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==
509
   dependencies:
509
   dependencies:
510
     tslib "^2.0.0"
510
     tslib "^2.0.0"
511
 
511
 
512
-"@dnd-kit/core@^6.0.7", "@dnd-kit/core@^6.0.8":
512
+"@dnd-kit/core@^6.0.8":
513
   version "6.0.8"
513
   version "6.0.8"
514
   resolved "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.0.8.tgz"
514
   resolved "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.0.8.tgz"
515
   integrity sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==
515
   integrity sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==
543
   resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz"
543
   resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz"
544
   integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
544
   integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
545
 
545
 
546
+"@esbuild/android-arm@0.15.18":
547
+  version "0.15.18"
548
+  resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80"
549
+  integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==
550
+
551
+"@esbuild/linux-loong64@0.15.18":
552
+  version "0.15.18"
553
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239"
554
+  integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==
555
+
546
 "@formatjs/ecma402-abstract@1.18.2":
556
 "@formatjs/ecma402-abstract@1.18.2":
547
   version "1.18.2"
557
   version "1.18.2"
548
   resolved "https://registry.npmmirror.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz"
558
   resolved "https://registry.npmmirror.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz"
644
   resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz"
654
   resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz"
645
   integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
655
   integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
646
 
656
 
647
-"@jridgewell/sourcemap-codec@^1.4.10":
648
-  version "1.4.15"
649
-  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
650
-  integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
651
-
652
 "@jridgewell/sourcemap-codec@1.4.14":
657
 "@jridgewell/sourcemap-codec@1.4.14":
653
   version "1.4.14"
658
   version "1.4.14"
654
   resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
659
   resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
655
   integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
660
   integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
656
 
661
 
662
+"@jridgewell/sourcemap-codec@^1.4.10":
663
+  version "1.4.15"
664
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
665
+  integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
666
+
657
 "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
667
 "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
658
   version "0.3.18"
668
   version "0.3.18"
659
   resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz"
669
   resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz"
738
     "@uppy/utils" "^4.1.2"
748
     "@uppy/utils" "^4.1.2"
739
     namespace-emitter "^2.0.1"
749
     namespace-emitter "^2.0.1"
740
 
750
 
741
-"@uppy/core@^2.0.3", "@uppy/core@^2.1.1", "@uppy/core@^2.1.4", "@uppy/core@^2.3.3":
751
+"@uppy/core@^2.1.1":
742
   version "2.3.4"
752
   version "2.3.4"
743
   resolved "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz"
753
   resolved "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz"
744
   integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==
754
   integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==
764
   dependencies:
774
   dependencies:
765
     lodash.throttle "^4.1.1"
775
     lodash.throttle "^4.1.1"
766
 
776
 
767
-"@uppy/xhr-upload@^2.0.3", "@uppy/xhr-upload@^2.0.7":
777
+"@uppy/xhr-upload@^2.0.3":
768
   version "2.1.3"
778
   version "2.1.3"
769
   resolved "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz"
779
   resolved "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz"
770
   integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
780
   integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
786
     magic-string "^0.26.7"
796
     magic-string "^0.26.7"
787
     react-refresh "^0.14.0"
797
     react-refresh "^0.14.0"
788
 
798
 
789
-"@wangeditor/basic-modules@^1.1.7", "@wangeditor/basic-modules@1.x":
799
+"@wangeditor/basic-modules@^1.1.7":
790
   version "1.1.7"
800
   version "1.1.7"
791
   resolved "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz"
801
   resolved "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz"
792
   integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==
802
   integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==
800
   dependencies:
810
   dependencies:
801
     prismjs "^1.23.0"
811
     prismjs "^1.23.0"
802
 
812
 
803
-"@wangeditor/core@^1.1.19", "@wangeditor/core@>=1.1.0", "@wangeditor/core@1.x":
813
+"@wangeditor/core@^1.1.19":
804
   version "1.1.19"
814
   version "1.1.19"
805
   resolved "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz"
815
   resolved "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz"
806
   integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==
816
   integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==
817
   resolved "https://registry.npmmirror.com/@wangeditor/editor-for-react/-/editor-for-react-1.0.6.tgz"
827
   resolved "https://registry.npmmirror.com/@wangeditor/editor-for-react/-/editor-for-react-1.0.6.tgz"
818
   integrity sha512-KJNSfgMr5Blzae3oyaiz20flMKHZHnvsz4bCYQKDCUs/qkvC+xNTnwedlCmhGP187oPWPEypCIYI8Zg6sz0psQ==
828
   integrity sha512-KJNSfgMr5Blzae3oyaiz20flMKHZHnvsz4bCYQKDCUs/qkvC+xNTnwedlCmhGP187oPWPEypCIYI8Zg6sz0psQ==
819
 
829
 
820
-"@wangeditor/editor@^5.1.23", "@wangeditor/editor@>=5.1.0":
830
+"@wangeditor/editor@^5.1.23":
821
   version "5.1.23"
831
   version "5.1.23"
822
   resolved "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz"
832
   resolved "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz"
823
   integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==
833
   integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==
890
   dependencies:
900
   dependencies:
891
     color-convert "^2.0.1"
901
     color-convert "^2.0.1"
892
 
902
 
893
-antd@^4.23.4, antd@>=4.23.0:
903
+antd@^4.23.4:
894
   version "4.24.10"
904
   version "4.24.10"
895
   resolved "https://registry.npmmirror.com/antd/-/antd-4.24.10.tgz"
905
   resolved "https://registry.npmmirror.com/antd/-/antd-4.24.10.tgz"
896
   integrity sha512-GihdwTGFW0dUaWjcvSIfejFcT63HjEp2EbYd+ojEXayldhey230KrHDJ+C53rkrkzLvymrPBfSxlLxJzyFIZsg==
906
   integrity sha512-GihdwTGFW0dUaWjcvSIfejFcT63HjEp2EbYd+ojEXayldhey230KrHDJ+C53rkrkzLvymrPBfSxlLxJzyFIZsg==
963
     form-data "^4.0.0"
973
     form-data "^4.0.0"
964
     proxy-from-env "^1.1.0"
974
     proxy-from-env "^1.1.0"
965
 
975
 
966
-browserslist@^4.21.3, "browserslist@>= 4.21.0":
976
+browserslist@^4.21.3:
967
   version "4.21.7"
977
   version "4.21.7"
968
   resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.7.tgz"
978
   resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.7.tgz"
969
   integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==
979
   integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==
1000
   resolved "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz"
1010
   resolved "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz"
1001
   integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
1011
   integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
1002
 
1012
 
1003
-classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@2.x:
1013
+classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2:
1004
   version "2.3.2"
1014
   version "2.3.2"
1005
   resolved "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz"
1015
   resolved "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz"
1006
   integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
1016
   integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
1019
   dependencies:
1029
   dependencies:
1020
     color-name "~1.1.4"
1030
     color-name "~1.1.4"
1021
 
1031
 
1022
-color-name@~1.1.4:
1023
-  version "1.1.4"
1024
-  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
1025
-  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1026
-
1027
 color-name@1.1.3:
1032
 color-name@1.1.3:
1028
   version "1.1.3"
1033
   version "1.1.3"
1029
   resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz"
1034
   resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz"
1030
   integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
1035
   integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
1031
 
1036
 
1037
+color-name@~1.1.4:
1038
+  version "1.1.4"
1039
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
1040
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1041
+
1032
 combined-stream@^1.0.8:
1042
 combined-stream@^1.0.8:
1033
   version "1.0.8"
1043
   version "1.0.8"
1034
   resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz"
1044
   resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz"
1075
   resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz"
1085
   resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz"
1076
   integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
1086
   integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
1077
 
1087
 
1078
-d@^1.0.1, d@1:
1088
+d@1, d@^1.0.1:
1079
   version "1.0.1"
1089
   version "1.0.1"
1080
   resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz"
1090
   resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz"
1081
   integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
1091
   integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
1090
   dependencies:
1100
   dependencies:
1091
     "@babel/runtime" "^7.21.0"
1101
     "@babel/runtime" "^7.21.0"
1092
 
1102
 
1093
-dayjs@^1.11.4, dayjs@1.x:
1103
+dayjs@1.x, dayjs@^1.11.4:
1094
   version "1.11.7"
1104
   version "1.11.7"
1095
   resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz"
1105
   resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz"
1096
   integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==
1106
   integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==
1188
     d "^1.0.1"
1198
     d "^1.0.1"
1189
     ext "^1.1.2"
1199
     ext "^1.1.2"
1190
 
1200
 
1201
+esbuild-android-64@0.15.18:
1202
+  version "0.15.18"
1203
+  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5"
1204
+  integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==
1205
+
1206
+esbuild-android-arm64@0.15.18:
1207
+  version "0.15.18"
1208
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04"
1209
+  integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==
1210
+
1211
+esbuild-darwin-64@0.15.18:
1212
+  version "0.15.18"
1213
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410"
1214
+  integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==
1215
+
1216
+esbuild-darwin-arm64@0.15.18:
1217
+  version "0.15.18"
1218
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz#b6dfc7799115a2917f35970bfbc93ae50256b337"
1219
+  integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==
1220
+
1221
+esbuild-freebsd-64@0.15.18:
1222
+  version "0.15.18"
1223
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2"
1224
+  integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==
1225
+
1226
+esbuild-freebsd-arm64@0.15.18:
1227
+  version "0.15.18"
1228
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635"
1229
+  integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==
1230
+
1231
+esbuild-linux-32@0.15.18:
1232
+  version "0.15.18"
1233
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce"
1234
+  integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==
1235
+
1236
+esbuild-linux-64@0.15.18:
1237
+  version "0.15.18"
1238
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c"
1239
+  integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==
1240
+
1241
+esbuild-linux-arm64@0.15.18:
1242
+  version "0.15.18"
1243
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d"
1244
+  integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==
1245
+
1246
+esbuild-linux-arm@0.15.18:
1247
+  version "0.15.18"
1248
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc"
1249
+  integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==
1250
+
1251
+esbuild-linux-mips64le@0.15.18:
1252
+  version "0.15.18"
1253
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb"
1254
+  integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==
1255
+
1256
+esbuild-linux-ppc64le@0.15.18:
1257
+  version "0.15.18"
1258
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507"
1259
+  integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==
1260
+
1261
+esbuild-linux-riscv64@0.15.18:
1262
+  version "0.15.18"
1263
+  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6"
1264
+  integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==
1265
+
1266
+esbuild-linux-s390x@0.15.18:
1267
+  version "0.15.18"
1268
+  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb"
1269
+  integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==
1270
+
1271
+esbuild-netbsd-64@0.15.18:
1272
+  version "0.15.18"
1273
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998"
1274
+  integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==
1275
+
1276
+esbuild-openbsd-64@0.15.18:
1277
+  version "0.15.18"
1278
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8"
1279
+  integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==
1280
+
1281
+esbuild-sunos-64@0.15.18:
1282
+  version "0.15.18"
1283
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971"
1284
+  integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==
1285
+
1286
+esbuild-windows-32@0.15.18:
1287
+  version "0.15.18"
1288
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3"
1289
+  integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==
1290
+
1191
 esbuild-windows-64@0.15.18:
1291
 esbuild-windows-64@0.15.18:
1192
   version "0.15.18"
1292
   version "0.15.18"
1193
   resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz"
1293
   resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz"
1194
   integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==
1294
   integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==
1195
 
1295
 
1296
+esbuild-windows-arm64@0.15.18:
1297
+  version "0.15.18"
1298
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7"
1299
+  integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==
1300
+
1196
 esbuild@^0.15.9:
1301
 esbuild@^0.15.9:
1197
   version "0.15.18"
1302
   version "0.15.18"
1198
   resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.15.18.tgz"
1303
   resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.15.18.tgz"
1265
     combined-stream "^1.0.8"
1370
     combined-stream "^1.0.8"
1266
     mime-types "^2.1.12"
1371
     mime-types "^2.1.12"
1267
 
1372
 
1373
+fsevents@~2.3.2:
1374
+  version "2.3.3"
1375
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
1376
+  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
1377
+
1268
 function-bind@^1.1.1:
1378
 function-bind@^1.1.1:
1269
   version "1.1.1"
1379
   version "1.1.1"
1270
   resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz"
1380
   resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz"
1321
   resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz"
1431
   resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz"
1322
   integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
1432
   integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
1323
 
1433
 
1434
+i18next-browser-languagedetector@^7.2.0:
1435
+  version "7.2.0"
1436
+  resolved "https://registry.npmmirror.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz#de0321cba6881be37d82e20e4d6f05aa75f6e37f"
1437
+  integrity sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==
1438
+  dependencies:
1439
+    "@babel/runtime" "^7.23.2"
1440
+
1324
 i18next@^20.4.0:
1441
 i18next@^20.4.0:
1325
   version "20.6.1"
1442
   version "20.6.1"
1326
   resolved "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz"
1443
   resolved "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz"
1328
   dependencies:
1445
   dependencies:
1329
     "@babel/runtime" "^7.12.0"
1446
     "@babel/runtime" "^7.12.0"
1330
 
1447
 
1331
-i18next@^23.9.0, "i18next@>= 23.2.3":
1448
+i18next@^23.9.0:
1332
   version "23.9.0"
1449
   version "23.9.0"
1333
   resolved "https://registry.npmmirror.com/i18next/-/i18next-23.9.0.tgz"
1450
   resolved "https://registry.npmmirror.com/i18next/-/i18next-23.9.0.tgz"
1334
   integrity sha512-f3MUciKqwzNV//mHG6EtdSlC65+nqH/3zK8sOSWqNV6FVu2tmHhF/rFOp9UF8S4m1odojtuipKaKJrP0Loh60g==
1451
   integrity sha512-f3MUciKqwzNV//mHG6EtdSlC65+nqH/3zK8sOSWqNV6FVu2tmHhF/rFOp9UF8S4m1odojtuipKaKJrP0Loh60g==
1364
   dependencies:
1481
   dependencies:
1365
     "@formatjs/intl-unified-numberformat" "^3.2.0"
1482
     "@formatjs/intl-unified-numberformat" "^3.2.0"
1366
 
1483
 
1367
-intl-messageformat@^7.8.4:
1368
-  version "7.8.4"
1369
-  resolved "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-7.8.4.tgz"
1370
-  integrity sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA==
1371
-  dependencies:
1372
-    intl-format-cache "^4.2.21"
1373
-    intl-messageformat-parser "^3.6.4"
1374
-
1375
 intl-messageformat@10.5.11:
1484
 intl-messageformat@10.5.11:
1376
   version "10.5.11"
1485
   version "10.5.11"
1377
   resolved "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-10.5.11.tgz"
1486
   resolved "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-10.5.11.tgz"
1382
     "@formatjs/icu-messageformat-parser" "2.7.6"
1491
     "@formatjs/icu-messageformat-parser" "2.7.6"
1383
     tslib "^2.4.0"
1492
     tslib "^2.4.0"
1384
 
1493
 
1494
+intl-messageformat@^7.8.4:
1495
+  version "7.8.4"
1496
+  resolved "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-7.8.4.tgz"
1497
+  integrity sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA==
1498
+  dependencies:
1499
+    intl-format-cache "^4.2.21"
1500
+    intl-messageformat-parser "^3.6.4"
1501
+
1385
 invariant@^2.2.2:
1502
 invariant@^2.2.2:
1386
   version "2.2.4"
1503
   version "2.2.4"
1387
   resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz"
1504
   resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz"
1443
   resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz"
1560
   resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz"
1444
   integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
1561
   integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
1445
 
1562
 
1446
-less@*, less@^4.1.3:
1563
+less@^4.1.3:
1447
   version "4.1.3"
1564
   version "4.1.3"
1448
   resolved "https://registry.npmmirror.com/less/-/less-4.1.3.tgz"
1565
   resolved "https://registry.npmmirror.com/less/-/less-4.1.3.tgz"
1449
   integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==
1566
   integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==
1584
   resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz"
1701
   resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz"
1585
   integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
1702
   integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
1586
 
1703
 
1587
-ms@^2.1.1, ms@2.1.2:
1704
+ms@2.1.2, ms@^2.1.1:
1588
   version "2.1.2"
1705
   version "2.1.2"
1589
   resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
1706
   resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
1590
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1707
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1626
   resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz"
1743
   resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz"
1627
   integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
1744
   integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
1628
 
1745
 
1629
-object-assign@^4.1.1, object-assign@4.x:
1746
+object-assign@4.x, object-assign@^4.1.1:
1630
   version "4.1.1"
1747
   version "4.1.1"
1631
   resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz"
1748
   resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz"
1632
   integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
1749
   integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
1800
     rc-trigger "^5.3.1"
1917
     rc-trigger "^5.3.1"
1801
     rc-util "^5.17.0"
1918
     rc-util "^5.17.0"
1802
 
1919
 
1803
-rc-field-form@^1.22.0:
1804
-  version "1.32.0"
1805
-  resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.32.0.tgz"
1806
-  integrity sha512-vr5pA0/gWiBZf0HKdevQJcWSsAac10Z8Nj1Brs3OOCnExk7l+u8GtsW+4cRSqJLug5fxV11dOGXpxf7+aHT/2A==
1807
-  dependencies:
1808
-    "@babel/runtime" "^7.18.0"
1809
-    async-validator "^4.1.0"
1810
-    rc-util "^5.32.2"
1811
-
1812
 rc-field-form@~1.27.0:
1920
 rc-field-form@~1.27.0:
1813
   version "1.27.4"
1921
   version "1.27.4"
1814
   resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.27.4.tgz"
1922
   resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.27.4.tgz"
2109
     react-lifecycles-compat "^3.0.4"
2217
     react-lifecycles-compat "^3.0.4"
2110
     shallowequal "^1.1.0"
2218
     shallowequal "^1.1.0"
2111
 
2219
 
2112
-rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.23.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.4.0, rc-util@^5.6.1, rc-util@^5.8.0, rc-util@^5.9.4:
2220
+rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.23.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.31.1, rc-util@^5.4.0, rc-util@^5.6.1, rc-util@^5.8.0, rc-util@^5.9.4:
2113
   version "5.32.3"
2221
   version "5.32.3"
2114
   resolved "https://registry.npmmirror.com/rc-util/-/rc-util-5.32.3.tgz"
2222
   resolved "https://registry.npmmirror.com/rc-util/-/rc-util-5.32.3.tgz"
2115
   integrity sha512-+Pv1nOiTtmp6kpz8yZ/DToMrZHz4DIUi1/EhpIsGQhhF12jANx3rb+gsp0YUWWtxUDf6U1Eyhe0EN+mBlCJXoA==
2223
   integrity sha512-+Pv1nOiTtmp6kpz8yZ/DToMrZHz4DIUi1/EhpIsGQhhF12jANx3rb+gsp0YUWWtxUDf6U1Eyhe0EN+mBlCJXoA==
2127
     rc-resize-observer "^1.0.0"
2235
     rc-resize-observer "^1.0.0"
2128
     rc-util "^5.15.0"
2236
     rc-util "^5.15.0"
2129
 
2237
 
2130
-react-dom@*, react-dom@>=16.0.0, react-dom@>=16.11.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0, react-dom@>=17.0.0, react-dom@>=17.0.2, react-dom@18.2.0:
2238
+react-dom@18.2.0:
2131
   version "18.2.0"
2239
   version "18.2.0"
2132
   resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz"
2240
   resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz"
2133
   integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
2241
   integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
2232
     loose-envify "^1.4.0"
2340
     loose-envify "^1.4.0"
2233
     prop-types "^15.6.2"
2341
     prop-types "^15.6.2"
2234
 
2342
 
2235
-react@*, "react@^16.11.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || 17 || 18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0", react@>=16.0.0, react@>=16.11.0, react@>=16.12.0, react@>=16.3.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@>=17.0.0, react@>=17.0.2, react@18.2.0:
2343
+react@18.2.0:
2236
   version "18.2.0"
2344
   version "18.2.0"
2237
   resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz"
2345
   resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz"
2238
   integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
2346
   integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
2318
   dependencies:
2426
   dependencies:
2319
     is-plain-object "^5.0.0"
2427
     is-plain-object "^5.0.0"
2320
 
2428
 
2321
-slate@^0.72.0, slate@>=0.65.3:
2429
+slate@^0.72.0:
2322
   version "0.72.8"
2430
   version "0.72.8"
2323
   resolved "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz"
2431
   resolved "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz"
2324
   integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
2432
   integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
2408
   resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz"
2516
   resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz"
2409
   integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
2517
   integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
2410
 
2518
 
2411
-tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0, tslib@2.3.0:
2519
+tslib@2.3.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0:
2412
   version "2.3.0"
2520
   version "2.3.0"
2413
   resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz"
2521
   resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz"
2414
   integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
2522
   integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
2464
     param-case "^3.0.4"
2572
     param-case "^3.0.4"
2465
     pascal-case "^3.1.2"
2573
     pascal-case "^3.1.2"
2466
 
2574
 
2467
-vite@^3.0.0, "vite@>= 2.0.0-beta.5":
2575
+vite@^3.0.0:
2468
   version "3.2.7"
2576
   version "3.2.7"
2469
   resolved "https://registry.npmmirror.com/vite/-/vite-3.2.7.tgz"
2577
   resolved "https://registry.npmmirror.com/vite/-/vite-3.2.7.tgz"
2470
   integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==
2578
   integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==