diff --git a/router.md b/router.md
index f7adda2..9aadeca 100644
--- a/router.md
+++ b/router.md
@@ -68,3 +68,5 @@
`/emergencyRescue/container/enterprise/planAndDrill/emergencyPlan/list`
- 预案与演练/应急演练管理
`/emergencyRescue/container/enterprise/planAndDrill/emergencyExercise/list`
+- 应急救援/值班管理/值班日志
+ `/emergencyRescue/container/enterprise/emergencyRescue/duty/dutyLog/list`
diff --git a/src/api/dutyLog/index.js b/src/api/dutyLog/index.js
new file mode 100644
index 0000000..2cc73fd
--- /dev/null
+++ b/src/api/dutyLog/index.js
@@ -0,0 +1,26 @@
+import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
+
+export const dutyLogList = declareRequest(
+ "dutyLogLoading",
+ "Post > @/emergencyRescue/dutyLog/list",
+);
+export const dutyLogAdd = declareRequest(
+ "dutyLogLoading",
+ "Post > @/emergencyRescue/dutyLog/save",
+);
+export const dutyLogUpdate = declareRequest(
+ "dutyLogLoading",
+ "Put > @/emergencyRescue/dutyLog/edit",
+);
+export const dutyLogInfo = declareRequest(
+ "dutyLogLoading",
+ "Get > /emergencyRescue/dutyLog/{id}",
+);
+export const dutyLogDelete = declareRequest(
+ "dutyLogLoading",
+ "Delete > @/emergencyRescue/dutyLog/{id}",
+);
+export const dutyLogDeleteBatch = declareRequest(
+ "dutyLogLoading",
+ "Delete > @/emergencyRescue/dutyLog/ids?ids={ids}",
+);
diff --git a/src/enumerate/namespace/index.js b/src/enumerate/namespace/index.js
index baa46d3..c1b014d 100644
--- a/src/enumerate/namespace/index.js
+++ b/src/enumerate/namespace/index.js
@@ -26,3 +26,4 @@ export const NS_EMERGENCY_RESCUE_TEAM = defineNamespace("emergencyRescueTeam");
export const NS_ENTERPRISE_PLAN = defineNamespace("enterprisePlan");
export const NS_EMERGENCY_PLAN = defineNamespace("emergencyPlan");
export const NS_EMERGENCY_EXERCISE = defineNamespace("emergencyExercise");
+export const NS_DUTY_LOG = defineNamespace("dutyLog");
diff --git a/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/Add/index.js b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/Add/index.js
new file mode 100644
index 0000000..6a3296d
--- /dev/null
+++ b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/Add/index.js
@@ -0,0 +1,96 @@
+import { Connect } from "@cqsjjb/jjb-dva-runtime";
+import { message } from "antd";
+import { useEffect, useState } from "react";
+import FormBuilder from "zy-react-library/components/FormBuilder";
+import Page from "zy-react-library/components/Page";
+import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
+import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
+import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
+import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
+import { NS_DUTY_LOG } from "~/enumerate/namespace";
+
+function Add(props) {
+ const [userInfo, setUserInfo] = useState({});
+
+ const query = useGetUrlQuery();
+ const { getUserInfo } = useGetUserInfo();
+
+ const [form] = FormBuilder.useForm();
+
+ const getData = async () => {
+ if (!query.id)
+ return;
+
+ const { data } = await props["dutyLogInfo"]({ id: query.id });
+ form.setFieldsValue({
+ ...data,
+ time: [data.startTime, data.endTime],
+ });
+ };
+
+ useEffect(() => {
+ getData();
+ (async () => {
+ const userInfo = await getUserInfo();
+ setUserInfo(userInfo);
+ })();
+ }, []);
+
+ const onSubmit = async (values) => {
+ const { success } = await props[query.id ? "dutyLogUpdate" : "dutyLogAdd"]({
+ ...values,
+ startTime: values.time[0],
+ endTime: values.time[1],
+ id: query.id,
+ });
+ if (success) {
+ message.success(query.id ? "编辑成功" : "新增成功");
+ props.history.goBack();
+ }
+ };
+
+ return (
+
+ {
+ form.setFieldValue("dutyPersonnelName", label);
+ }}
+ />
+ ),
+ },
+ { name: "dutyPersonnelName", label: "值班人员名称", onlyForLabel: true },
+ {
+ name: "reliefPersonnel",
+ label: "接班人员",
+ render: (
+ {
+ form.setFieldValue("reliefPersonnelName", label);
+ }}
+ />
+ ),
+ },
+ { name: "reliefPersonnelName", label: "接班人员名称", onlyForLabel: true },
+ ]}
+ form={form}
+ onFinish={onSubmit}
+ />
+
+ );
+}
+
+export default Connect([NS_DUTY_LOG], true)(Add);
diff --git a/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/List/index.js b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/List/index.js
new file mode 100644
index 0000000..a351cb1
--- /dev/null
+++ b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/List/index.js
@@ -0,0 +1,142 @@
+import { Connect } from "@cqsjjb/jjb-dva-runtime";
+import { Button, message, Modal, Space } from "antd";
+import { useState } from "react";
+import AddIcon from "zy-react-library/components/Icon/AddIcon";
+import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon";
+import Page from "zy-react-library/components/Page";
+import Search from "zy-react-library/components/Search";
+import Table from "zy-react-library/components/Table";
+import useTable from "zy-react-library/hooks/useTable";
+import { NS_DUTY_LOG } from "~/enumerate/namespace";
+
+function List(props) {
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+
+ const [form] = Search.useForm();
+
+ const { tableProps, getData } = useTable(props["dutyLogList"], {
+ form,
+ });
+
+ const onDelete = (record) => {
+ Modal.confirm({
+ title: "删除确认",
+ content: `确定要删除【${record.unitName}】吗`,
+ onOk: async () => {
+ const { success } = await props["dutyLogDelete"]({ id: record.id });
+ if (success) {
+ message.success("删除成功");
+ getData();
+ }
+ },
+ });
+ };
+
+ const onDeleteBatch = () => {
+ if (selectedRowKeys.length === 0) {
+ message.warning("请选择要删除的记录");
+ return;
+ }
+ Modal.confirm({
+ title: "删除确认",
+ content: "确认要删除吗?",
+ onOk: async () => {
+ const { success } = await props["dutyLogDeleteBatch"]({ ids: selectedRowKeys });
+ if (success) {
+ message.success("删除成功");
+ getData();
+ }
+ },
+ });
+ };
+
+ return (
+
+
+ {
+ setSelectedRowKeys(selectedRowKeys);
+ },
+ }}
+ toolBarRender={() => (
+
+ )}
+ onClick={() => {
+ props.history.push("./add");
+ }}
+ >
+ 新增
+
+ )}
+ onClick={onDeleteBatch}
+ >
+ 批量删除
+
+
+ )}
+ columns={[
+ { title: "单位名称", dataIndex: "unitName" },
+ { title: "开始时间", dataIndex: "startTime" },
+ { title: "结束时间", dataIndex: "endTime" },
+ { title: "值班人员", dataIndex: "dutyPersonnelName" },
+ { title: "接班人员", dataIndex: "reliefPersonnelName" },
+ { title: "值班记录", dataIndex: "dutyRecord" },
+ { title: "处理情况", dataIndex: "handlingSituation" },
+ { title: "交接事宜", dataIndex: "handoverMatters" },
+ {
+ title: "操作",
+ width: 150,
+ fixed: "right",
+ render: (_, record) => (
+
+
+
+
+
+ ),
+ },
+ ]}
+ {...tableProps}
+ />
+
+ );
+}
+
+export default Connect([NS_DUTY_LOG], true)(List);
diff --git a/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/View/index.js b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/View/index.js
new file mode 100644
index 0000000..e59e1af
--- /dev/null
+++ b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/View/index.js
@@ -0,0 +1,42 @@
+import { Connect } from "@cqsjjb/jjb-dva-runtime";
+import { Descriptions } from "antd";
+import { useEffect, useState } from "react";
+import Page from "zy-react-library/components/Page";
+import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
+import { NS_DUTY_LOG } from "~/enumerate/namespace";
+
+function View(props) {
+ const [info, setInfo] = useState({});
+
+ const query = useGetUrlQuery();
+
+ const getData = async () => {
+ const { data } = await props["dutyLogInfo"]({ id: query.id });
+ setInfo(data);
+ };
+
+ useEffect(() => {
+ getData();
+ }, []);
+
+ return (
+
+
+
+ );
+}
+
+export default Connect([NS_DUTY_LOG], true)(View);
diff --git a/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/index.js b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/index.js
new file mode 100644
index 0000000..8b636a5
--- /dev/null
+++ b/src/pages/Container/Enterprise/EmergencyRescue/Duty/DutyLog/index.js
@@ -0,0 +1,5 @@
+function DutyLog(props) {
+ return props.children;
+}
+
+export default DutyLog;
diff --git a/src/pages/Container/Enterprise/EmergencyRescue/Duty/index.js b/src/pages/Container/Enterprise/EmergencyRescue/Duty/index.js
new file mode 100644
index 0000000..978a87d
--- /dev/null
+++ b/src/pages/Container/Enterprise/EmergencyRescue/Duty/index.js
@@ -0,0 +1,5 @@
+function Duty(props) {
+ return props.children;
+}
+
+export default Duty;
diff --git a/src/pages/Container/Enterprise/EmergencyRescue/index.js b/src/pages/Container/Enterprise/EmergencyRescue/index.js
new file mode 100644
index 0000000..9e94ab9
--- /dev/null
+++ b/src/pages/Container/Enterprise/EmergencyRescue/index.js
@@ -0,0 +1,5 @@
+function EmergencyRescue(props) {
+ return props.children;
+}
+
+export default EmergencyRescue;