From 03177e1d421c090185dc3a5f57a9d3704334d94e Mon Sep 17 00:00:00 2001
From: 杨磊 <505174330@qq.com>
Date: 星期五, 25 七月 2025 09:48:19 +0800
Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/OAManage

---
 src/pages/HumanResourceManagement/applicationForSecondment/index.tsx  |  119 +++
 config/routes.ts                                                      |   13 
 src/pages/HumanResourceManagement/dismissalApplication/index.less     |    0 
 src/pages/HumanResourceManagement/nominationForAppointment/index.less |   56 -
 src/pages/HumanResourceManagement/resignationApplication/index.less   |    0 
 src/components/ApplyIndex/components/apply.tsx                        |  153 ++++
 src/pages/HumanResourceManagement/changeRequest/index.less            |    0 
 src/pages/HumanResourceManagement/challengeForCause/index.tsx         |   78 ++
 src/pages/HumanResourceManagement/changeRequest/index.tsx             |  168 +++++
 src/components/ApplyIndex/components/staff.tsx                        |    0 
 src/pages/HumanResourceManagement/nominationForAppointment/index.tsx  |  359 ++--------
 /dev/null                                                             |  113 ---
 src/pages/HumanResourceManagement/retirementManagement/index.tsx      |  253 +++++++
 src/pages/HumanResourceManagement/applicationForSecondment/index.less |    0 
 src/pages/HumanResourceManagement/challengeForCause/index.less        |    0 
 src/pages/HumanResourceManagement/retirementManagement/index.less     |    0 
 src/pages/HumanResourceManagement/dismissalApplication/index.tsx      |   69 ++
 src/pages/HumanResourceManagement/resignationApplication/index.tsx    |   96 +++
 src/components/ApplyIndex/index.tsx                                   |  322 ++++++++++
 src/components/ApplyIndex/index.less                                  |   62 +
 20 files changed, 1,404 insertions(+), 457 deletions(-)

diff --git a/config/routes.ts b/config/routes.ts
index c95ab5a..06c47e3 100644
--- a/config/routes.ts
+++ b/config/routes.ts
@@ -105,17 +105,18 @@
       { path: '/humanResourceManagement/employeeInformation', name: '鍛樺伐淇℃伅', component: './Admin' },
       { path: '/humanResourceManagement/contractManagement', name: '鍚堝悓绠$悊', component: './HumanResourceManagement/contractManagement' },
       { path: '/humanResourceManagement/nominationForAppointment', name: '浠昏亴鎻愬悕', component: './HumanResourceManagement/nominationForAppointment' },
-      { path: '/humanResourceManagement/dismissalApplication', name: '鍏嶈亴鐢宠', component: './Admin' },
+      { path: '/humanResourceManagement/dismissalApplication', name: '鍏嶈亴鐢宠', component: './HumanResourceManagement/dismissalApplication' },
+
       { path: '/humanResourceManagement/transferApplication', name: '璋冨叆鐢宠', component: './Admin' },
       { path: '/humanResourceManagement/transferOutApplication', name: '璋冨嚭鐢宠', component: './Admin' },
-      { path: '/humanResourceManagement/changeRequest', name: '鍙樺姩鐢宠', component: './Admin' },
+      { path: '/humanResourceManagement/changeRequest', name: '鍙樺姩鐢宠', component: './HumanResourceManagement/changeRequest' },
       // { path: '/humanResourceManagement/transferApplication', name: '杞换鐢宠', component: './Admin' }, 
-      { path: '/humanResourceManagement/applicationForSecondment', name: '鎸傝亴鐢宠', component: './Admin' },
-      { path: '/humanResourceManagement/challengeForCause', name: '鍥為伩鐢宠', component: './Admin' },
-      { path: '/humanResourceManagement/resignationApplication', name: '绂昏亴鐢宠', component: './Admin' },
+      { path: '/humanResourceManagement/applicationForSecondment', name: '鎸傝亴鐢宠', component: './HumanResourceManagement/applicationForSecondment' },
+      { path: '/humanResourceManagement/challengeForCause', name: '鍥為伩鐢宠', component: './HumanResourceManagement/challengeForCause' },
+      { path: '/humanResourceManagement/resignationApplication', name: '绂昏亴鐢宠', component: './HumanResourceManagement/resignationApplication' },
       // { path: '/humanResourceManagement/dismissalApplication', name: '杈為��鐢宠', component: './Admin' }, 
       // { path: '/humanResourceManagement/retirementManagement', name: '绂讳紤绠$悊', component: './Admin' }, 
-      { path: '/humanResourceManagement/retirementManagement', name: '閫�浼戠鐞�', component: './Admin' },
+      { path: '/humanResourceManagement/retirementManagement', name: '閫�浼戠鐞�', component: './HumanResourceManagement/retirementManagement' },
       { path: '/humanResourceManagement/compulsoryRetirementApplication', name: '寮哄埗閫�浼戠敵璇�', component: './Admin' },
     ],
   },
diff --git a/src/components/ApplyIndex/components/apply.tsx b/src/components/ApplyIndex/components/apply.tsx
new file mode 100644
index 0000000..d8f2721
--- /dev/null
+++ b/src/components/ApplyIndex/components/apply.tsx
@@ -0,0 +1,153 @@
+import {
+  Button,
+  Col,
+  DatePicker,
+  Divider,
+  Form,
+  Input,
+  Modal,
+  Row,
+  Select,
+} from "antd";
+import React, { useEffect, useState } from "react";
+
+interface ApplyProps {
+  visible: boolean;
+  onCancel?: () => void;
+  setFormData: (data: any) => void;
+  applyType: string;
+  title: string;
+  formItems: any[];
+}
+
+const Apply: React.FC<ApplyProps> = (props) => {
+  const { visible, setFormDat, onCancel, applyType, title, formItems } = props;
+
+  const [staffVisible, setStaffVisible] = useState(false);
+
+  const onFinish = (values: any) => {
+    console.log(values);
+    // setFormDat(values);
+  };
+
+  // 鎵撳紑鍛樺伐鍒楄〃
+  const onStaffVisible = () => {
+    setStaffVisible(true);
+  };
+
+  // 璁剧疆閫変腑鍛樺伐
+  const onSetStaff = (val: any) => {
+    console.log(val);
+  };
+
+  useEffect(() => {
+    if (visible) {
+      setStaffVisible(false);
+    }
+  }, [visible]);
+
+  return (
+    <Modal
+      width={910}
+      title={title + "鐢宠"}
+      open={visible}
+      onCancel={onCancel}
+      footer={null}
+      className="ModelForm"
+    >
+      <Form
+        name="basic"
+        initialValues={{ remember: true }}
+        style={{ paddingTop: 20 }}
+        onFinish={onFinish}
+        autoComplete="off"
+      >
+        <Row>
+          {formItems?.length &&
+            formItems.map((item, index) => {
+              if (item.type === "input") {
+                return (
+                  <Col span={item.width > 300 ? 24 : 12} key={index}>
+                    <Form.Item
+                      labelCol={{ span: item.labelCol }}
+                      label={item.label}
+                      name={item.name}
+                      rules={item.rules}
+                    >
+                      <Input style={{ width: item.width }} />
+                    </Form.Item>
+                  </Col>
+                );
+              } else if (item.type === "select") {
+                return (
+                  <Col span={12} key={index}>
+                    <Form.Item
+                      labelCol={{ span: item.labelCol }}
+                      label={item.label}
+                      name={item.name}
+                      rules={item.rules}
+                    >
+                      <Select
+                        options={item?.options}
+                        style={{ width: item.width }}
+                      />
+                    </Form.Item>
+                  </Col>
+                );
+              } else if (item.type === "textArea") {
+                return (
+                  <Col span={24} key={index}>
+                    <Form.Item
+                      labelCol={{ span: item.labelCol }}
+                      label={item.label}
+                      name={item.name}
+                      rules={item.rules}
+                    >
+                      <Input.TextArea
+                        style={{ width: item.width }}
+                        showCount
+                        maxLength={item?.maxLength || 100}
+                      />
+                    </Form.Item>
+                  </Col>
+                );
+              } else if (item.type === "divider") {
+                return (
+                  <Col span={24} key={index}>
+                    <Divider orientation="left" style={{ marginBottom: 20 }}>
+                      {item.label}
+                    </Divider>
+                  </Col>
+                );
+              } else if (item.type === "date") {
+                return (
+                  <Col span={12} key={index}>
+                    <Form.Item
+                      labelCol={{ span: item.labelCol }}
+                      label={item.label}
+                      name={item.name}
+                      rules={item.rules}
+                    >
+                      <DatePicker style={{ width: item.width }} />
+                    </Form.Item>
+                  </Col>
+                );
+              } else {
+                return null;
+              }
+            })}
+        </Row>
+        <Form.Item label={null}>
+          <div className="functionBtn">
+            <Button type="primary" htmlType="submit">
+              鎻愪氦
+            </Button>
+            <Button onClick={onCancel}>鍏抽棴</Button>
+          </div>
+        </Form.Item>
+      </Form>
+    </Modal>
+  );
+};
+
+export default Apply;
diff --git a/src/pages/HumanResourceManagement/nominationForAppointment/components/staff.tsx b/src/components/ApplyIndex/components/staff.tsx
similarity index 100%
rename from src/pages/HumanResourceManagement/nominationForAppointment/components/staff.tsx
rename to src/components/ApplyIndex/components/staff.tsx
diff --git a/src/components/ApplyIndex/index.less b/src/components/ApplyIndex/index.less
new file mode 100644
index 0000000..2a53ebf
--- /dev/null
+++ b/src/components/ApplyIndex/index.less
@@ -0,0 +1,62 @@
+.ApplyIndex {
+  min-width: 900px;
+
+  .searchTitle {
+    font-size: 16px;
+    font-weight: bold;
+    margin-bottom: 10px;
+    color: #333;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+
+  .searchBox {
+    width: 100%;
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+
+    .searchItem {
+      margin-right: 20px;
+    }
+
+    .searchBtn {
+      flex: 1;
+      display: flex;
+      justify-content: flex-end;
+
+      button {
+        margin-left: 10px;
+      }
+    }
+  }
+
+  .paginationCard {
+    .ant-card-body {
+      padding: 10px !important;
+      display: flex;
+      justify-content: flex-end;
+      align-items: center;
+    }
+  }
+
+}
+
+
+.functionBtn {
+  width: 100%;
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+
+  button {
+    margin: 10px 0 0 10px;
+  }
+}
+
+.ModelForm {
+  .ant-modal-content {
+    padding-bottom: 1px !important;
+  }
+}
\ No newline at end of file
diff --git a/src/components/ApplyIndex/index.tsx b/src/components/ApplyIndex/index.tsx
new file mode 100644
index 0000000..4e3bc9a
--- /dev/null
+++ b/src/components/ApplyIndex/index.tsx
@@ -0,0 +1,322 @@
+import { PageContainer } from "@ant-design/pro-components";
+import {
+  Button,
+  Card,
+  Input,
+  Pagination,
+  Select,
+  Table,
+  TableProps,
+  Tabs,
+} from "antd";
+import React, { useEffect, useRef, useState } from "react";
+import Apply from "./components/apply";
+import "./index.less";
+
+interface ApplyIndexParams {
+  title: string; // 褰撳墠鐢宠琛ㄥ崟鍚嶇О
+  applyType: string; // 褰撳墠鐢宠绫诲瀷 濡傦細绂昏亴銆佸彉鍔ㄣ�佷换鑱�
+  formItems: any[]; // 鑷畾涔夎〃鍗�
+}
+
+const ApplyIndex: React.FC<ApplyIndexParams> = (props) => {
+  const { title, applyType, formItems } = props;
+  const [activeKey, setActiveKey] = useState("wait"); // tabs閫変腑
+  const tableRef = useRef<any>(null); // ref
+
+  // 鐢宠
+  const [visible, setVisible] = useState(false);
+  const [formData, setFormData] = useState<any>({});
+
+  // tableData
+  const [tableData, setTableData] = useState<any>([]);
+
+  // 閮ㄩ棬鏌ヨ鍊�
+  const [departmentValue, setDepartmentValue] = useState<string>();
+  // 鑱屼綅鏌ヨ鍊�
+  const [positionValue, setPositionValue] = useState<string>();
+  // 濮撳悕鏌ヨ鍊�
+  const [userNameValue, setUserNameValue] = useState<string>();
+
+  // checkBox閫変腑鍊�
+  const [checkedRows, setCheckedRows] = useState<React.Key[]>([]);
+
+  // Tab閫夐」鍗℃暟鎹�
+  const TabsItems = [
+    {
+      label: `寰呭鐞嗙殑`,
+      key: `wait`,
+      children: "",
+    },
+    {
+      label: `鎵�鏈夌殑`,
+      key: `all`,
+      children: "",
+    },
+  ];
+
+  // 閮ㄩ棬鍚嶇О鏁版嵁
+  const departmentOptions = [
+    {
+      value: "jack",
+      label: "Jack",
+    },
+    {
+      value: "lucy",
+      label: "Lucy",
+    },
+    {
+      value: "tom",
+      label: "Tom",
+    },
+  ];
+
+  // 鑱屼綅鍚嶇О鏁版嵁
+  const positionOptions = [
+    {
+      value: "jack",
+      label: "Jack",
+    },
+    {
+      value: "lucy",
+      label: "Lucy",
+    },
+    {
+      value: "tom",
+      label: "Tom",
+    },
+  ];
+
+  // 鎵撳紑鐢宠
+  const openApply = () => {
+    setVisible(true);
+  };
+
+  // 鍏抽棴鐢宠
+  const onCancelApply = () => {
+    setVisible(false);
+    setFormData({});
+  };
+
+  const columns: any[] = [
+    {
+      title: "浠昏亴鎻愬悕鍚嶇О",
+      key: "name",
+      dataIndex: "name",
+      align: "center",
+    },
+    {
+      title: "鍛樺伐濮撳悕",
+      key: "employeeName",
+      dataIndex: "employeeName",
+      align: "center",
+    },
+    {
+      title: "浠昏亴鏂瑰紡",
+      key: "applyType",
+      dataIndex: "applyType",
+      align: "center",
+    },
+    {
+      title: "鎵ц鏃堕棿",
+      key: "executeTime",
+      dataIndex: "executeTime",
+      align: "center",
+    },
+    {
+      title: "鐘舵��",
+      key: "state",
+      dataIndex: "state",
+      align: "center",
+    },
+    {
+      title: "鎿嶄綔",
+      dataIndex: "operation",
+      align: "center",
+    },
+  ];
+
+  // Tabs鍒囨崲
+  const onChangeTabs = (key: string) => {
+    setActiveKey(key);
+  };
+
+  // 鑱屼綅鍚嶇О鏌ヨ
+  const onChangeSelectPosition = (value: string) => {
+    setPositionValue(value);
+  };
+
+  // 閮ㄩ棬鍚嶇О鏌ヨ
+  const onChangeSelectDepartment = (value: string) => {
+    setDepartmentValue(value);
+  };
+
+  // 濮撳悕鏌ヨ
+  const changeUserName = (e: any) => {
+    setUserNameValue(e.target.value);
+  };
+
+  // 鑾峰彇浜哄憳鏁版嵁
+  const getPersonalData = async () => {
+    const res = await new Promise((resolve, reject) => {
+      // Simulate an asynchronous operation, such as an API call
+      setTimeout(() => {
+        const success = true;
+        if (success) {
+          // If the operation is successful, resolve the Promise with data
+          const data = [
+            {
+              name: "Nomination 1",
+              employeeName: "John",
+              applyType: "Full-time",
+              executeTime: "2025-07-21",
+              state: "Pending",
+              key: "1",
+            },
+            {
+              name: "Nomination 2",
+              employeeName: "Jane",
+              applyType: "Part-time",
+              executeTime: "2025-07-22",
+              state: "Approved",
+              key: "2",
+            },
+          ];
+          resolve(data);
+        } else {
+          // If the operation fails, reject the Promise with an error
+          reject(new Error("Failed to fetch data"));
+        }
+      }, 1000);
+    });
+    setTableData(res);
+  };
+
+  const rowSelection: TableProps["rowSelection"] = {
+    onChange: (selectedRowKeys: React.Key[], selectedRows: any[]) => {
+      setCheckedRows(selectedRows);
+      console.log(
+        `selectedRowKeys: ${selectedRowKeys}`,
+        "selectedRows: ",
+        selectedRows
+      );
+    },
+  };
+
+  useEffect(() => {
+    if (applyType) {
+      getPersonalData();
+    }
+  }, [applyType]);
+
+  return (
+    <PageContainer className="ApplyIndex">
+      <Tabs
+        defaultActiveKey={activeKey}
+        items={TabsItems}
+        onChange={onChangeTabs}
+      />
+      <div className="searchTitle">{title}鏌ヨ</div>
+      <Card style={{ marginBottom: 20 }}>
+        <div className="searchBox">
+          <div className="searchItem">
+            <span>閮ㄩ棬鍚嶇О锛�</span>
+            <Select
+              style={{ width: 200 }}
+              value={departmentValue}
+              onChange={onChangeSelectDepartment}
+              options={departmentOptions}
+              allowClear
+            />
+          </div>
+          <div className="searchItem">
+            <span>鑱屼綅鍚嶇О锛�</span>
+            <Select
+              style={{ width: 200 }}
+              value={positionValue}
+              onChange={onChangeSelectPosition}
+              options={positionOptions}
+              allowClear
+            />
+          </div>
+          <div className="searchItem">
+            <span>鍛樺伐濮撳悕锛堟垨鎷奸煶棣栧瓧姣嶏級锛�</span>
+            <Input
+              style={{ width: 200 }}
+              value={userNameValue}
+              onChange={changeUserName}
+              allowClear
+            />
+          </div>
+          <div className="searchBtn">
+            <Button
+              type="primary"
+              onClick={() => {
+                tableRef?.current?.reload();
+              }}
+            >
+              鏌ヨ
+            </Button>
+            <Button
+              onClick={() => {
+                tableRef?.current?.reload();
+                setDepartmentValue("");
+                setPositionValue("");
+                setUserNameValue("");
+              }}
+            >
+              閲嶇疆
+            </Button>
+          </div>
+        </div>
+      </Card>
+      <div className="searchTitle">
+        <span>{title}绠$悊</span>
+        <div className="btnClass">
+          {checkedRows.length > 0 && (
+            <Button
+              type="primary"
+              danger
+              onClick={() => {
+                console.log("鎵归噺鍒犻櫎", checkedRows);
+                // 鎵ц鎵归噺鍒犻櫎鎿嶄綔
+              }}
+            >
+              鎵归噺鍒犻櫎
+            </Button>
+          )}
+          <Button style={{ marginLeft: 10 }} type="primary" onClick={openApply}>
+            鐢宠
+          </Button>
+          <Apply
+            visible={visible}
+            setFormData={setFormData}
+            onCancel={onCancelApply}
+            applyType={applyType}
+            title={title}
+            formItems={formItems}
+          />
+        </div>
+      </div>
+      <Card style={{ marginBottom: 5 }}>
+        <Table
+          rowSelection={{ type: "checkbox", ...rowSelection }}
+          columns={columns}
+          dataSource={tableData}
+          pagination={false}
+        />
+      </Card>
+      <Card className="paginationCard">
+        <Pagination
+          total={50}
+          current={1}
+          pageSize={10}
+          size="small"
+          // onChange={handlePageChange}
+        />
+      </Card>
+    </PageContainer>
+  );
+};
+
+export default ApplyIndex;
diff --git a/src/pages/HumanResourceManagement/applicationForSecondment/index.less b/src/pages/HumanResourceManagement/applicationForSecondment/index.less
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/pages/HumanResourceManagement/applicationForSecondment/index.less
diff --git a/src/pages/HumanResourceManagement/applicationForSecondment/index.tsx b/src/pages/HumanResourceManagement/applicationForSecondment/index.tsx
new file mode 100644
index 0000000..e437869
--- /dev/null
+++ b/src/pages/HumanResourceManagement/applicationForSecondment/index.tsx
@@ -0,0 +1,119 @@
+import Apply from "@/components/ApplyIndex";
+import React from "react";
+
+const NominationForAppointment: React.FC = () => {
+  const params = {
+    title: "鎸傝亴",
+    applyType: "applicationForSecondment",
+    formItems: [
+      {
+        label: "鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ悕绉�!" }],
+        type: "input",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ憳宸ュ鍚�!" }],
+        type: "input",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎸傝亴鍗曚綅绫诲瀷",
+        name: "secondmentUnitType",
+        type: "select",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎸傝亴鍗曚綅",
+        name: "secondmentUnit",
+        rules: [{ required: true, message: "璇烽�夋嫨鎸傝亴鍗曚綅!" }],
+        type: "select",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "宀椾綅",
+        name: "post",
+        type: "select",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎸傝亴鑱屼綅",
+        name: "secondmentPosition",
+        rules: [{ required: true, message: "璇烽�夋嫨鎸傝亴鑱屼綅!" }],
+        type: "select",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎸傝亴閮ㄩ棬",
+        name: "secondmentDepartment",
+        rules: [{ required: true, message: "璇疯緭鍏ユ寕鑱岄儴闂�!" }],
+        type: "input",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎸傝亴鑱岀骇",
+        name: "secondmentRank",
+        rules: [{ required: true, message: "璇烽�夋嫨鎸傝亴鑱岀骇!" }],
+        type: "select",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "寮�濮嬫椂闂�",
+        name: "startTime",
+        rules: [{ required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�!" }],
+        type: "date",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "缁撴潫鏃堕棿",
+        name: "endTime",
+        rules: [{ required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿!" }],
+        type: "date",
+        pageType: "applicationForSecondment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍖哄煙",
+        name: "domain",
+        type: "textArea",
+        pageType: "applicationForSecondment",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "鎸傝亴鍘熺敱",
+        name: "reason",
+        type: "textArea",
+        pageType: "applicationForSecondment",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
+  };
+
+  return <Apply {...params} />;
+};
+
+export default NominationForAppointment;
diff --git a/src/pages/HumanResourceManagement/challengeForCause/index.less b/src/pages/HumanResourceManagement/challengeForCause/index.less
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/pages/HumanResourceManagement/challengeForCause/index.less
diff --git a/src/pages/HumanResourceManagement/challengeForCause/index.tsx b/src/pages/HumanResourceManagement/challengeForCause/index.tsx
new file mode 100644
index 0000000..8c85fd1
--- /dev/null
+++ b/src/pages/HumanResourceManagement/challengeForCause/index.tsx
@@ -0,0 +1,78 @@
+import Apply from "@/components/ApplyIndex";
+import React from "react";
+
+const ChallengeForCause: React.FC = () => {
+  const params = {
+    title: "鍥為伩",
+    applyType: "challengeForCause",
+    formItems: [
+      {
+        label: "鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ悕绉�!" }],
+        type: "input",
+        pageType: "challengeForCause",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ憳宸ュ鍚�!" }],
+        type: "input",
+        pageType: "challengeForCause",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "寮�濮嬫椂闂�",
+        name: "startTime",
+        rules: [{ required: true, message: "璇疯緭鍏ュ紑濮嬫椂闂�!" }],
+        type: "date",
+        pageType: "challengeForCause",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "缁撴潫鏃堕棿",
+        name: "endTime",
+        rules: [{ required: true, message: "璇疯緭鍏ョ粨鏉熸椂闂�!" }],
+        type: "date",
+        pageType: "challengeForCause",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鏇夸唬浜哄憳",
+        name: "substitute",
+        rules: [{ required: true, message: "璇疯緭鍏ユ浛浠d汉鍛�!" }],
+        type: "input",
+        pageType: "challengeForCause",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍥為伩鍘熺敱",
+        name: "reason",
+        rules: [{ required: true, message: "璇疯緭鍏ュ洖閬垮師鐢�!" }],
+        type: "textArea",
+        pageType: "challengeForCause",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "鍥為伩鍐呭",
+        name: "avoidContent",
+        rules: [{ required: true, message: "璇疯緭鍏ュ洖閬垮唴瀹�!" }],
+        type: "textArea",
+        pageType: "challengeForCause",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
+  };
+
+  return <Apply {...params} />;
+};
+
+export default ChallengeForCause;
diff --git a/src/pages/HumanResourceManagement/changeRequest/index.less b/src/pages/HumanResourceManagement/changeRequest/index.less
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/pages/HumanResourceManagement/changeRequest/index.less
diff --git a/src/pages/HumanResourceManagement/changeRequest/index.tsx b/src/pages/HumanResourceManagement/changeRequest/index.tsx
new file mode 100644
index 0000000..6c33017
--- /dev/null
+++ b/src/pages/HumanResourceManagement/changeRequest/index.tsx
@@ -0,0 +1,168 @@
+import Apply from "@/components/ApplyIndex";
+import React from "react";
+
+const ChangeRequest: React.FC = () => {
+  const params = {
+    title: "鍙樺姩",
+    applyType: "changeRequest",
+    formItems: [
+      {
+        label: "鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ悕绉�!" }],
+        type: "input",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ憳宸ュ鍚�!" }],
+        type: "input",
+        pageType: "dismissalApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍙樺姩鏃ユ湡",
+        name: "changeTime",
+        rules: [{ required: true, message: "璇烽�夋嫨鍙樺姩鏃ユ湡!" }],
+        type: "date",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨姩绫诲瀷",
+        name: "changeType",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨姩绫诲瀷!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨墠閮ㄩ棬",
+        name: "changeBeforeDepartment",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨墠閮ㄩ棬!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨悗閮ㄩ棬",
+        name: "changeAfterDepartment",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨悗閮ㄩ棬!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨墠鑱屼綅",
+        name: "changeBeforePosition",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨墠鑱屼綅!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨悗鑱屼綅",
+        name: "changeAfterPosition",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨悗鑱屼綅!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨墠鑱岀骇",
+        name: "changeBeforeRank",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨墠鑱岀骇!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨悗鑱岀骇",
+        name: "changeAfterRank",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨悗鑱岀骇!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨墠鍩烘湰宸ヨ祫",
+        name: "changeBeforeMoney",
+        rules: [{ required: true, message: "璇疯緭鍏ヨ皟鍓嶅熀鏈伐璧�!" }],
+        type: "input",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨悗鍩烘湰宸ヨ祫",
+        name: "changeAfterMoney",
+        rules: [{ required: true, message: "璇疯緭鍏ヨ皟鍚庡熀鏈伐璧�!" }],
+        type: "input",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨墠宸ョ",
+        name: "changeBeforeJob",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨墠宸ョ!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨悗宸ョ",
+        name: "changeAfterJob",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨悗宸ョ!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨墠鐘舵��",
+        name: "changeBeforeStatus",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨墠鐘舵��!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨悗鐘舵��",
+        name: "changeAfterStatus",
+        rules: [{ required: true, message: "璇烽�夋嫨璋冨悗鐘舵��!" }],
+        type: "select",
+        pageType: "changeRequest",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璋冨姩鍘熷洜",
+        name: "reason",
+        rules: [{ required: true, message: "璇疯緭鍏ヨ皟鍔ㄥ師鍥�!" }],
+        type: "textArea",
+        pageType: "changeRequest",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
+  };
+
+  return <Apply {...params} />;
+};
+
+export default ChangeRequest;
diff --git a/src/pages/HumanResourceManagement/dismissalApplication/index.less b/src/pages/HumanResourceManagement/dismissalApplication/index.less
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/pages/HumanResourceManagement/dismissalApplication/index.less
diff --git a/src/pages/HumanResourceManagement/dismissalApplication/index.tsx b/src/pages/HumanResourceManagement/dismissalApplication/index.tsx
new file mode 100644
index 0000000..4682eef
--- /dev/null
+++ b/src/pages/HumanResourceManagement/dismissalApplication/index.tsx
@@ -0,0 +1,69 @@
+import Apply from "@/components/ApplyIndex";
+import React from "react";
+
+const DismissalApplication: React.FC = () => {
+  const params = {
+    title: "鍏嶈亴",
+    applyType: "dismissalApplication",
+    formItems: [
+      {
+        label: "鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ悕绉�!" }],
+        type: "input",
+        pageType: "dismissalApplication",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ憳宸ュ鍚�!" }],
+        type: "input",
+        pageType: "dismissalApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�灞為儴闂�",
+        name: "department",
+        rules: [{ required: true, message: "璇烽�夋嫨鎵�灞為儴闂�!" }],
+        type: "select",
+        pageType: "dismissalApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�灞炶亴浣�",
+        name: "position",
+        rules: [{ required: true, message: "璇烽�夋嫨鎵�灞炶亴浣�!" }],
+        type: "select",
+        pageType: "dismissalApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�鍦ㄥ煄甯�",
+        name: "address",
+        rules: [{ required: true, message: "璇烽�夋嫨鎵�鍦ㄥ煄甯�!" }],
+        type: "select",
+        pageType: "dismissalApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍏嶈亴鍘熺敱",
+        name: "reason",
+        rules: [{ required: true, message: "璇疯緭鍏ュ厤鑱屽師鐢�!" }],
+        type: "textArea",
+        pageType: "dismissalApplication",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
+  };
+
+  return <Apply {...params} />;
+};
+
+export default DismissalApplication;
diff --git a/src/pages/HumanResourceManagement/nominationForAppointment/components/apply.tsx b/src/pages/HumanResourceManagement/nominationForAppointment/components/apply.tsx
deleted file mode 100644
index c304ef2..0000000
--- a/src/pages/HumanResourceManagement/nominationForAppointment/components/apply.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import { Button, DatePicker, Form, Input, Modal, Select } from 'antd';
-import React, { useEffect, useState } from 'react';
-import Staff from './staff';
-
-interface ApplyProps {
-  visible: boolean;
-  onCancel?: () => void;
-  setFormData: (data: any) => void;
-}
-
-const Apply: React.FC<ApplyProps> = (props) => {
-  const { visible, setFormDat, onCancel } = props;
-
-  const [staffVisible, setStaffVisible] = useState(false);
-
-  const onFinish = (values: any) => {
-    console.log(values);
-    // setFormDat(values);
-  };
-
-  // 鎵撳紑鍛樺伐鍒楄〃
-  const onStaffVisible = () => {
-    setStaffVisible(true);
-  };
-
-  // 璁剧疆閫変腑鍛樺伐
-  const onSetStaff = (val: any) => {
-    console.log(val);
-  };
-
-  useEffect(() => {
-    if (visible) {
-      setStaffVisible(false);
-    }
-  }, [visible]);
-
-  return (
-    <Modal width={650} title="浠昏亴鎻愬悕鐢宠" open={visible} onCancel={onCancel} footer={null}>
-      <Form
-        name="basic"
-        labelCol={{ span: 6 }}
-        initialValues={{ remember: true }}
-        style={{ paddingTop: 20 }}
-        onFinish={onFinish}
-        autoComplete="off"
-      >
-        <Form.Item
-          label="浠昏亴鎻愬悕鍚嶇О"
-          name="applyName"
-          rules={[{ required: true, message: '璇疯緭鍏ヤ换鑱屾彁鍚嶅悕绉�!' }]}
-        >
-          <Input style={{ width: 250 }} />
-        </Form.Item>
-
-        <Form.Item
-          label="鍛樺伐濮撳悕"
-          name="employeeName"
-          rules={[{ required: true, message: '璇烽�夋嫨鍛樺伐濮撳悕!' }]}
-        >
-          <Input style={{ width: 250 }} onClick={onStaffVisible} />
-          <Staff open={staffVisible} onCancel={() => setStaffVisible(false)} setData={onSetStaff} />
-        </Form.Item>
-
-        <Form.Item
-          label="浠昏亴鏂瑰紡"
-          name="applyType"
-          rules={[{ required: true, message: '璇烽�夋嫨浠昏亴鏂瑰紡!' }]}
-        >
-          <Select style={{ width: 250 }} />
-        </Form.Item>
-
-        <Form.Item
-          label="鎵�灞炶亴浣�"
-          name="position"
-          rules={[{ required: true, message: '璇烽�夋嫨鎵�灞炶亴浣�!' }]}
-        >
-          <Select style={{ width: 250 }} />
-        </Form.Item>
-
-        <Form.Item
-          label="鎵ц鏃堕棿"
-          name="executeTime"
-          rules={[{ required: true, message: '璇烽�夋嫨鎵ц鏃堕棿!' }]}
-        >
-          <DatePicker style={{ width: 250 }} />
-        </Form.Item>
-
-        <Form.Item label="璇︾粏淇℃伅" name="detailInfo">
-          <Input.TextArea maxLength={100} style={{ width: 350 }} />
-        </Form.Item>
-
-        <Form.Item label="鑰冩牳淇℃伅" name="testInfo">
-          <Input.TextArea maxLength={100} style={{ width: 350 }} />
-        </Form.Item>
-
-        <Form.Item label="浠昏亴鍘熺敱" name="reason">
-          <Input.TextArea maxLength={100} style={{ width: 350 }} />
-        </Form.Item>
-
-        <Form.Item label={null} style={{ marginBottom: 5 }}>
-          <div className="functionBtn">
-            <Button type="primary" htmlType="submit">
-              鎻愪氦
-            </Button>
-            <Button onClick={onCancel}>鍏抽棴</Button>
-          </div>
-        </Form.Item>
-      </Form>
-    </Modal>
-  );
-};
-
-export default Apply;
diff --git a/src/pages/HumanResourceManagement/nominationForAppointment/index.less b/src/pages/HumanResourceManagement/nominationForAppointment/index.less
index 6d2cf13..e69de29 100644
--- a/src/pages/HumanResourceManagement/nominationForAppointment/index.less
+++ b/src/pages/HumanResourceManagement/nominationForAppointment/index.less
@@ -1,56 +0,0 @@
-.nominationForAppointmentBox {
-  min-width: 900px;
-
-  .searchTitle {
-    font-size: 16px;
-    font-weight: bold;
-    margin-bottom: 10px;
-    color: #333;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-  }
-
-  .searchBox {
-    width: 100%;
-    display: flex;
-    justify-content: flex-start;
-    align-items: center;
-
-    .searchItem {
-      margin-right: 20px;
-    }
-
-    .searchBtn {
-      flex: 1;
-      display: flex;
-      justify-content: flex-end;
-
-      button {
-        margin-left: 10px;
-      }
-    }
-  }
-
-  .paginationCard {
-    .ant-card-body {
-      padding: 10px !important;
-      display: flex;
-      justify-content: flex-end;
-      align-items: center;
-    }
-  }
-
-}
-
-
-.functionBtn {
-  width: 100%;
-  display: flex;
-  justify-content: flex-end;
-  align-items: center;
-
-  button {
-    margin: 0 10px;
-  }
-}
\ No newline at end of file
diff --git a/src/pages/HumanResourceManagement/nominationForAppointment/index.tsx b/src/pages/HumanResourceManagement/nominationForAppointment/index.tsx
index bf36d47..371f033 100644
--- a/src/pages/HumanResourceManagement/nominationForAppointment/index.tsx
+++ b/src/pages/HumanResourceManagement/nominationForAppointment/index.tsx
@@ -1,289 +1,84 @@
-import { PageContainer } from '@ant-design/pro-components';
-import { Button, Card, Input, Pagination, Select, Table, TableProps, Tabs } from 'antd';
-import React, { useEffect, useRef, useState } from 'react';
-import Apply from './components/apply';
-import './index.less';
+import Apply from "@/components/ApplyIndex";
+import React from "react";
 
 const NominationForAppointment: React.FC = () => {
-  const [activeKey, setActiveKey] = useState('wait'); // tabs閫変腑
-  const tableRef = useRef<any>(null); // ref
-
-  // 鐢宠
-  const [visible, setVisible] = React.useState(false);
-  const [formData, setFormData] = React.useState<any>({});
-
-  // tableData
-  const [tableData, setTableData] = useState([]);
-
-  // 閮ㄩ棬鏌ヨ鍊�
-  const [departmentValue, setDepartmentValue] = useState<string>();
-  // 鑱屼綅鏌ヨ鍊�
-  const [positionValue, setPositionValue] = useState<string>();
-  // 濮撳悕鏌ヨ鍊�
-  const [userNameValue, setUserNameValue] = useState<string>();
-
-  // checkBox閫変腑鍊�
-  const [checkedRows, setCheckedRows] = useState<React.Key[]>([]);
-
-  // Tab閫夐」鍗℃暟鎹�
-  const TabsItems = [
-    {
-      label: `寰呭鐞嗙殑`,
-      key: `wait`,
-      children: '',
-    },
-    {
-      label: `鎵�鏈夌殑`,
-      key: `all`,
-      children: '',
-    },
-  ];
-
-  // 閮ㄩ棬鍚嶇О鏁版嵁
-  const departmentOptions = [
-    {
-      value: 'jack',
-      label: 'Jack',
-    },
-    {
-      value: 'lucy',
-      label: 'Lucy',
-    },
-    {
-      value: 'tom',
-      label: 'Tom',
-    },
-  ];
-
-  // 鑱屼綅鍚嶇О鏁版嵁
-  const positionOptions = [
-    {
-      value: 'jack',
-      label: 'Jack',
-    },
-    {
-      value: 'lucy',
-      label: 'Lucy',
-    },
-    {
-      value: 'tom',
-      label: 'Tom',
-    },
-  ];
-
-  // 鎵撳紑鐢宠
-  const openApply = () => {
-    setVisible(true);
+  const params = {
+    title: "浠昏亴鎻愬悕",
+    applyType: "nominationForAppointment",
+    formItems: [
+      {
+        label: "鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ悕绉�!" }],
+        type: "input",
+        pageType: "nominationForAppointment",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ憳宸ュ鍚�!" }],
+        type: "input",
+        pageType: "dismissalApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "浠昏亴鏂瑰紡",
+        name: "applyType",
+        rules: [{ required: true, message: "璇烽�夋嫨浠昏亴鏂瑰紡!" }],
+        type: "select",
+        pageType: "nominationForAppointment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�灞炶亴浣�",
+        name: "position",
+        rules: [{ required: true, message: "璇烽�夋嫨鎵�灞炶亴浣�!" }],
+        type: "select",
+        pageType: "nominationForAppointment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵ц鏃堕棿",
+        name: "executionTime",
+        rules: [{ required: true, message: "璇烽�夋嫨鎵ц鏃堕棿!" }],
+        type: "date",
+        pageType: "nominationForAppointment",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "璇︾粏淇℃伅",
+        name: "detailInfo",
+        type: "textArea",
+        pageType: "nominationForAppointment",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "鑰冩牳淇℃伅",
+        name: "assessInfo",
+        type: "textArea",
+        pageType: "nominationForAppointment",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "浠昏亴鍘熺敱",
+        name: "reason",
+        type: "textArea",
+        pageType: "nominationForAppointment",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
   };
 
-  // 鍏抽棴鐢宠
-  const onCancelApply = () => {
-    setVisible(false);
-    setFormData({});
-  };
-
-  const columns: any[] = [
-    {
-      title: '浠昏亴鎻愬悕鍚嶇О',
-      key: 'name',
-      dataIndex: 'name',
-      align: 'center',
-    },
-    {
-      title: '鍛樺伐濮撳悕',
-      key: 'employeeName',
-      dataIndex: 'employeeName',
-      align: 'center',
-    },
-    {
-      title: '浠昏亴鏂瑰紡',
-      key: 'applyType',
-      dataIndex: 'applyType',
-      align: 'center',
-    },
-    {
-      title: '鎵ц鏃堕棿',
-      key: 'executeTime',
-      dataIndex: 'executeTime',
-      align: 'center',
-    },
-    {
-      title: '鐘舵��',
-      key: 'state',
-      dataIndex: 'state',
-      align: 'center',
-    },
-    {
-      title: '鎿嶄綔',
-      dataIndex: 'operation',
-      align: 'center',
-    },
-  ];
-
-  // Tabs鍒囨崲
-  const onChangeTabs = (key: string) => {
-    setActiveKey(key);
-  };
-
-  // 鑱屼綅鍚嶇О鏌ヨ
-  const onChangeSelectPosition = (value: string) => {
-    setPositionValue(value);
-  };
-
-  // 閮ㄩ棬鍚嶇О鏌ヨ
-  const onChangeSelectDepartment = (value: string) => {
-    setDepartmentValue(value);
-  };
-
-  // 濮撳悕鏌ヨ
-  const changeUserName = (e: any) => {
-    setUserNameValue(e.target.value);
-  };
-
-  // 鑾峰彇浜哄憳鏁版嵁
-  const getPersonalData = async () => {
-    const res = await new Promise((resolve, reject) => {
-      // Simulate an asynchronous operation, such as an API call
-      setTimeout(() => {
-        const success = true;
-        if (success) {
-          // If the operation is successful, resolve the Promise with data
-          const data = [
-            {
-              name: 'Nomination 1',
-              employeeName: 'John',
-              applyType: 'Full-time',
-              executeTime: '2025-07-21',
-              state: 'Pending',
-              key: '1',
-            },
-            {
-              name: 'Nomination 2',
-              employeeName: 'Jane',
-              applyType: 'Part-time',
-              executeTime: '2025-07-22',
-              state: 'Approved',
-              key: '2',
-            },
-          ];
-          resolve(data);
-        } else {
-          // If the operation fails, reject the Promise with an error
-          reject(new Error('Failed to fetch data'));
-        }
-      }, 1000);
-    });
-    setTableData(res);
-  };
-
-  const rowSelection: TableProps['rowSelection'] = {
-    onChange: (selectedRowKeys: React.Key[], selectedRows: any[]) => {
-      setCheckedRows(selectedRows);
-      console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
-    },
-  };
-
-  useEffect(() => {
-    getPersonalData();
-  }, []);
-
-  return (
-    <PageContainer className="nominationForAppointmentBox">
-      <Tabs defaultActiveKey={activeKey} items={TabsItems} onChange={onChangeTabs} />
-      <div className="searchTitle">浠昏亴鎻愬悕鏌ヨ</div>
-      <Card style={{ marginBottom: 20 }}>
-        <div className="searchBox">
-          <div className="searchItem">
-            <span>閮ㄩ棬鍚嶇О锛�</span>
-            <Select
-              style={{ width: 200 }}
-              value={departmentValue}
-              onChange={onChangeSelectDepartment}
-              options={departmentOptions}
-              allowClear
-            />
-          </div>
-          <div className="searchItem">
-            <span>鑱屼綅鍚嶇О锛�</span>
-            <Select
-              style={{ width: 200 }}
-              value={positionValue}
-              onChange={onChangeSelectPosition}
-              options={positionOptions}
-              allowClear
-            />
-          </div>
-          <div className="searchItem">
-            <span>鍛樺伐濮撳悕锛堟垨鎷奸煶棣栧瓧姣嶏級锛�</span>
-            <Input
-              style={{ width: 200 }}
-              value={userNameValue}
-              onChange={changeUserName}
-              allowClear
-            />
-          </div>
-          <div className="searchBtn">
-            <Button
-              type="primary"
-              onClick={() => {
-                tableRef?.current?.reload();
-              }}
-            >
-              鏌ヨ
-            </Button>
-            <Button
-              onClick={() => {
-                tableRef?.current?.reload();
-                setDepartmentValue('');
-                setPositionValue('');
-                setUserNameValue('');
-              }}
-            >
-              閲嶇疆
-            </Button>
-          </div>
-        </div>
-      </Card>
-      <div className="searchTitle">
-        <span>浠昏亴鎻愬悕绠$悊</span>
-        <div className="btnClass">
-          {checkedRows.length > 0 && (
-            <Button
-              type="primary"
-              danger
-              onClick={() => {
-                console.log('鎵归噺鍒犻櫎', checkedRows);
-                // 鎵ц鎵归噺鍒犻櫎鎿嶄綔
-              }}
-            >
-              鎵归噺鍒犻櫎
-            </Button>
-          )}
-          <Button style={{ marginLeft: 10 }} type="primary" onClick={openApply}>
-            鐢宠
-          </Button>
-          <Apply visible={visible} setFormData={setFormData} onCancel={onCancelApply} />
-        </div>
-      </div>
-      <Card style={{ marginBottom: 5 }}>
-        <Table
-          rowSelection={{ type: 'checkbox', ...rowSelection }}
-          columns={columns}
-          dataSource={tableData}
-          pagination={false}
-        />
-      </Card>
-      <Card className="paginationCard">
-        <Pagination
-          total={50}
-          current={1}
-          pageSize={10}
-          size="small"
-          // onChange={handlePageChange}
-        />
-      </Card>
-    </PageContainer>
-  );
+  return <Apply {...params} />;
 };
 
 export default NominationForAppointment;
diff --git a/src/pages/HumanResourceManagement/resignationApplication/index.less b/src/pages/HumanResourceManagement/resignationApplication/index.less
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/pages/HumanResourceManagement/resignationApplication/index.less
diff --git a/src/pages/HumanResourceManagement/resignationApplication/index.tsx b/src/pages/HumanResourceManagement/resignationApplication/index.tsx
new file mode 100644
index 0000000..2bf415e
--- /dev/null
+++ b/src/pages/HumanResourceManagement/resignationApplication/index.tsx
@@ -0,0 +1,96 @@
+import Apply from "@/components/ApplyIndex";
+import React from "react";
+
+const NominationForAppointment: React.FC = () => {
+  const params = {
+    title: "绂昏亴",
+    applyType: "resignationApplication",
+    formItems: [
+      {
+        label: "鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ悕绉�!" }],
+        type: "input",
+        pageType: "resignationApplication",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        rules: [{ required: true, message: "璇疯緭鍏ュ憳宸ュ鍚�!" }],
+        type: "input",
+        pageType: "resignationApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�灞為儴闂�",
+        name: "department",
+        rules: [{ required: true, message: "璇疯緭鍏ユ墍灞為儴闂�!" }],
+        type: "input",
+        pageType: "resignationApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�灞炶亴浣�",
+        name: "position",
+        rules: [{ required: true, message: "璇疯緭鍏ユ墍灞為儴闂�!" }],
+        type: "input",
+        pageType: "resignationApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵�鍦ㄥ煄甯�",
+        name: "address",
+        rules: [{ required: true, message: "璇疯緭鍏ユ墍鍦ㄥ煄甯�!" }],
+        type: "input",
+        pageType: "resignationApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "绂昏亴绫诲瀷",
+        name: "resignationType",
+        rules: [{ required: true, message: "璇烽�夋嫨绂昏亴绫诲瀷!" }],
+        type: "select",
+        pageType: "resignationApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鐢宠鏃堕棿",
+        name: "resignationTime",
+        rules: [{ required: true, message: "璇疯緭鍏ョ敵璇锋椂闂�!" }],
+        type: "date",
+        pageType: "resignationApplication",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "绂昏亴鍘熷洜",
+        name: "reason",
+        rules: [{ required: true, message: "璇疯緭鍏ョ鑱屽師鍥�!" }],
+        type: "textArea",
+        pageType: "resignationApplication",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "澶囨敞",
+        name: "remarks",
+        rules: [{ required: true, message: "璇疯緭鍏ュ娉�!" }],
+        type: "textArea",
+        pageType: "resignationApplication",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
+  };
+
+  return <Apply {...params} />;
+};
+
+export default NominationForAppointment;
diff --git a/src/pages/HumanResourceManagement/retirementManagement/index.less b/src/pages/HumanResourceManagement/retirementManagement/index.less
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/pages/HumanResourceManagement/retirementManagement/index.less
diff --git a/src/pages/HumanResourceManagement/retirementManagement/index.tsx b/src/pages/HumanResourceManagement/retirementManagement/index.tsx
new file mode 100644
index 0000000..0310518
--- /dev/null
+++ b/src/pages/HumanResourceManagement/retirementManagement/index.tsx
@@ -0,0 +1,253 @@
+import Apply from "@/components/ApplyIndex";
+import React from "react";
+
+const NominationForAppointment: React.FC = () => {
+  const params = {
+    title: "閫�浼�",
+    applyType: "retirementManagement",
+    formItems: [
+      {
+        label: "閫夋嫨鍛樺伐",
+        name: "selectStaff",
+        type: "select",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍩虹淇℃伅",
+        type: "divider",
+        pageType: "retirementManagement",
+      },
+      {
+        label: "鍛樺伐濮撳悕",
+        name: "employeeName",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "閮ㄩ棬鍚嶇О",
+        name: "departmentName",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "韬唤璇佸彿",
+        name: "idCardNumber",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎬у埆",
+        name: "sex",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "绫嶈疮",
+        name: "origin",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "闆囦剑绫诲瀷",
+        name: "employmentType",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鍑虹敓骞存湀",
+        name: "birthDate",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "姘戞棌",
+        name: "nationality",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "濠氬Щ鐘跺喌",
+        name: "maritalStatus",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鏀挎不闈㈣矊",
+        name: "politicalStatus",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "姣曚笟闄㈡牎",
+        name: "graduationSchool",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "涓撲笟",
+        name: "major",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鏂囧寲绋嬪害",
+        name: "culturalDegree",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "宸ョ",
+        name: "workType",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鑱岀О",
+        name: "workTitle",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鎵嬫満",
+        name: "mobile",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鑱旂郴鍦板潃",
+        name: "contactAddress",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鐢靛瓙閭欢",
+        name: "email",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "瀹跺涵浣忓潃",
+        name: "homeAddress",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "鑱旂郴鐢佃瘽",
+        name: "contactPhone",
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "澶囨敞",
+        name: "remarks",
+        type: "textArea",
+        pageType: "retirementManagement",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "閫�浼戝緟閬�",
+        type: "divider",
+        pageType: "retirementManagement",
+      },
+      {
+        label: "鐢宠鍚嶇О",
+        name: "applyName",
+        rules: [{ required: true, message: "璇峰~鍐欑敵璇峰悕绉�!" }],
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "娲ヨ创",
+        name: "allowance",
+        rules: [{ required: true, message: "璇峰~鍐欐触璐�!" }],
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "姣忔湀宸ヨ祫",
+        name: "monthlySalary",
+        rules: [{ required: true, message: "璇峰~鍐欐瘡鏈堝伐璧�!" }],
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "绂忓埄",
+        name: "welfare",
+        rules: [{ required: true, message: "璇峰~鍐欑鍒�!" }],
+        type: "input",
+        pageType: "retirementManagement",
+        labelCol: 6,
+        width: 300,
+      },
+      {
+        label: "閫�浼戝師鍥�",
+        name: "retirementReason",
+        type: "textArea",
+        pageType: "retirementManagement",
+        labelCol: 3,
+        width: 730,
+      },
+      {
+        label: "澶囨敞",
+        name: "retirementRemarks",
+        type: "textArea",
+        pageType: "retirementManagement",
+        labelCol: 3,
+        width: 730,
+      },
+    ],
+  };
+
+  return <Apply {...params} />;
+};
+
+export default NominationForAppointment;

--
Gitblit v1.9.1