safety-eval-service-frontend/src/pages/Container/Supervision/BasicInfo/OrgAccount/index.js

386 lines
13 KiB
JavaScript
Raw Normal View History

2026-06-26 17:28:06 +08:00
import {
2026-07-07 16:20:22 +08:00
Button, DatePicker, Descriptions, Form, Input, InputNumber, message, Modal, Row, Col, Select, Space, Tag, Table,
2026-06-26 17:28:06 +08:00
} from "antd";
2026-07-07 16:20:22 +08:00
import TableAction from "@cqsjjb/jjb-react-admin-component/TableAction";
2026-06-26 17:28:06 +08:00
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { useEffect, useState } from "react";
2026-06-29 16:45:58 +08:00
import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout";
2026-07-07 16:20:22 +08:00
import SearchForm from "@cqsjjb/jjb-react-admin-component/SearchForm";
import ControlWrapper from "@cqsjjb/jjb-react-admin-component/ControlWrapper";
2026-07-08 12:59:15 +08:00
import { AntdTableFuncControl } from "@cqsjjb/jjb-common-decorator/antd";
2026-07-07 17:13:33 +08:00
import { isOrgAccountEnabled } from "~/utils/enterpriseInfo/adapter";
2026-06-26 17:28:06 +08:00
import {
CHONGQING_DISTRICTS,
ENTERPRISE_SCALE_OPTIONS,
ORG_ACCOUNT_STATE_OPTIONS,
2026-07-07 16:20:22 +08:00
ENTERPRISE_STATUS_OPTIONS
2026-06-26 17:28:06 +08:00
} from "~/enumerate/enterpriseOptions";
import { NS_ORG_INFO } from "~/enumerate/namespace";
import { safeListRequest, safeRequest } from "~/utils";
function OrgAccountPage(props) {
const [searchForm] = Form.useForm();
const [editForm] = Form.useForm();
const [viewOpen, setViewOpen] = useState(false);
const [editOpen, setEditOpen] = useState(false);
const [currentId, setCurrentId] = useState(null);
const [detail, setDetail] = useState(null);
const [detailLoading, setDetailLoading] = useState(false);
const [editLoading, setEditLoading] = useState(false);
2026-07-07 16:20:22 +08:00
const [dataSource, setDataSource] = useState([]);
const [total, setTotal] = useState(0);
const [loading, setLoading] = useState(false);
2026-06-26 17:28:06 +08:00
2026-07-07 16:20:22 +08:00
const getData = async () => {
setLoading(true);
try {
2026-07-13 11:14:27 +08:00
const raw = searchForm.getFieldsValue();
const params = {
...raw,
state: raw.state !== "" && raw.state !== undefined ? Number(raw.state) : undefined,
...(Array.isArray(raw.openTimeRange) && raw.openTimeRange[0] && raw.openTimeRange[1]
? {
createTimeStart: raw.openTimeRange[0].format("YYYY-MM-DD"),
createTimeEnd: raw.openTimeRange[1].format("YYYY-MM-DD"),
}
: {}),
};
delete params.openTimeRange;
Object.keys(params).forEach((k) => { if (params[k] === undefined) delete params[k]; });
2026-07-07 16:20:22 +08:00
const res = await safeListRequest(props.orgAccountList)(params);
setDataSource(res?.data || []);
2026-07-09 10:58:27 +08:00
setTotal(res?.totalCount || 0);
2026-07-07 16:20:22 +08:00
} finally {
setLoading(false);
}
};
2026-06-26 17:28:06 +08:00
useEffect(() => {
getData();
}, []);
const loadDetail = async (id) => {
setDetailLoading(true);
const res = await safeRequest(props.orgAccountGet, { id });
setDetail(res?.data || null);
setDetailLoading(false);
return res;
};
const openView = async (id) => {
setCurrentId(id);
setViewOpen(true);
await loadDetail(id);
};
const openEdit = async (id) => {
setCurrentId(id);
setEditOpen(true);
const res = await loadDetail(id);
if (res?.data) {
editForm.setFieldsValue(res.data);
}
};
const onToggleStatus = (record) => {
const enabled = isOrgAccountEnabled(record);
Modal.confirm({
title: "确认操作",
2026-07-13 11:14:27 +08:00
content: enabled ? `确认禁用「${record.unitName}」账号?` : `确认启用「${record.unitName}」账号?`,
2026-06-26 17:28:06 +08:00
okText: "确认",
cancelText: "取消",
onOk: async () => {
const nextState = enabled ? 1 : 0;
const res = await props.orgAccountUpdateState({ id: record.id, state: nextState });
if (res?.success !== false) {
message.success("操作成功");
await getData();
}
2026-07-07 17:45:27 +08:00
2026-06-26 17:28:06 +08:00
},
});
};
const onResetPassword = (record) => {
2026-07-07 17:45:27 +08:00
console.log(record);
2026-06-26 17:28:06 +08:00
Modal.confirm({
title: "重置密码",
content: (
<div>
<p>
确认将
2026-07-13 11:14:27 +08:00
<strong>{record.unitName}</strong>
2026-06-26 17:28:06 +08:00
的密码重置为初始密码
</p>
2026-07-08 18:14:50 +08:00
<p style={{ color: "rgba(0,0,0,0.45)", fontSize: 12 }}>初始密码a123456</p>
2026-06-26 17:28:06 +08:00
</div>
),
okText: "确认重置",
cancelText: "取消",
onOk: async () => {
2026-07-07 17:45:27 +08:00
const res = await props.orgAccountResetPassword({ data: record.id });
2026-06-26 17:28:06 +08:00
if (res?.success !== false) {
message.success("密码已重置");
}
2026-07-07 17:45:27 +08:00
2026-06-26 17:28:06 +08:00
},
});
};
const onDelete = (record) => {
Modal.confirm({
title: "确认删除",
content: (
<div>
<p>
确认删除
2026-07-13 11:14:27 +08:00
<strong>{record.unitName}</strong>
2026-06-26 17:28:06 +08:00
的账号
</p>
<p style={{ color: "rgba(0,0,0,0.45)", fontSize: 12 }}>此操作不可恢复请谨慎操作</p>
</div>
),
okText: "确认删除",
okButtonProps: { danger: true },
cancelText: "取消",
onOk: async () => {
2026-07-07 17:45:27 +08:00
const res = await props.orgAccountDelete({ data: record.id });
2026-06-26 17:28:06 +08:00
if (res?.success !== false) {
message.success("删除成功");
await getData();
}
2026-07-07 17:45:27 +08:00
2026-06-26 17:28:06 +08:00
},
});
};
const onEditSubmit = async () => {
const values = await editForm.validateFields();
setEditLoading(true);
const res = await props.orgAccountModify({
...values,
id: currentId,
});
setEditLoading(false);
if (res?.success !== false) {
message.success("保存成功");
setEditOpen(false);
setCurrentId(null);
editForm.resetFields();
await getData();
}
2026-07-07 17:45:27 +08:00
2026-06-26 17:28:06 +08:00
};
2026-07-07 16:20:22 +08:00
const columns = [
2026-07-13 11:14:27 +08:00
{ title: "机构名称", dataIndex: "unitName", ellipsis: true },
{ title: "属地", dataIndex: "districtName", width: 260 },
2026-07-07 16:20:22 +08:00
{
title: "状态",
width: 80,
render: (_, record) => (
<Tag color={isOrgAccountEnabled(record) ? "success" : "error"}>
{isOrgAccountEnabled(record) ? "启用" : "禁用"}
</Tag>
),
},
{ title: "开户时间", dataIndex: "createTime", width: 110 },
{
title: "操作",
2026-07-13 11:14:27 +08:00
width: 200,
2026-07-07 16:20:22 +08:00
fixed: "right",
render: (_, record) => (
<TableAction>
<Button type="link" size="small" onClick={() => openView(record.id)}>查看</Button>
<Button type="link" size="small" onClick={() => openEdit(record.id)}>编辑</Button>
<Button type="link" size="small" onClick={() => onResetPassword(record)}>重置密码</Button>
<Button type="link" size="small" danger onClick={() => onDelete(record)}>删除</Button>
<Button type="link" size="small" onClick={() => onToggleStatus(record)}>
{isOrgAccountEnabled(record) ? "禁用" : "启用"}
</Button>
</TableAction>
),
},
];
2026-06-26 17:28:06 +08:00
return (
2026-06-30 18:30:30 +08:00
<PageLayout
title={
<div>
<span>评价机构账号管理</span>
<div className="pageLayout-extra">
监管端维护评价机构开户账号
</div>
</div>
}
>
2026-07-07 16:20:22 +08:00
<SearchForm
style={{ marginBottom: 24 }}
2026-06-26 17:28:06 +08:00
form={searchForm}
2026-07-07 16:20:22 +08:00
loading={loading}
formLine={[
2026-07-13 11:14:27 +08:00
<Form.Item key="unitName" name="unitName">
2026-07-07 16:20:22 +08:00
<ControlWrapper.Input label="机构名称" placeholder="关键字搜索" allowClear />
</Form.Item>,
2026-07-13 11:14:27 +08:00
<Form.Item key="districtName" name="districtName">
2026-07-07 16:20:22 +08:00
<ControlWrapper.Select label="属地" placeholder="请选择属地" allowClear>
{CHONGQING_DISTRICTS.map((opt) => (
<Select.Option key={opt.value} value={opt.value}>{opt.label}</Select.Option>
))}
</ControlWrapper.Select>
</Form.Item>,
<Form.Item key="state" name="state">
2026-07-13 11:14:27 +08:00
<ControlWrapper.Select label="状态" placeholder="请选择状态" allowClear>
2026-07-07 16:20:22 +08:00
{ORG_ACCOUNT_STATE_OPTIONS.map((opt) => (
<Select.Option key={opt.value} value={opt.value}>{opt.label}</Select.Option>
))}
</ControlWrapper.Select>
</Form.Item>,
<Form.Item key="openTimeRange" name="openTimeRange">
2026-07-13 11:14:27 +08:00
<ControlWrapper.DatePicker.RangePicker label="开户时间" allowClear />
2026-07-07 16:20:22 +08:00
</Form.Item>,
2026-06-26 17:28:06 +08:00
]}
2026-07-07 16:20:22 +08:00
onReset={() => {
searchForm.resetFields();
getData();
}}
onFinish={() => getData()}
2026-06-26 17:28:06 +08:00
/>
<Table
2026-07-07 16:20:22 +08:00
rowKey="id"
columns={columns}
dataSource={dataSource}
scroll={{ y: props.scrollY }}
loading={loading}
pagination={{
total,
showSizeChanger: true,
showQuickJumper: true,
showTotal: (t) => `${t}`,
current: 1,
pageSize: 10,
onChange: (page, pageSize) => {
getData();
2026-06-26 17:28:06 +08:00
},
2026-07-07 16:20:22 +08:00
}}
2026-06-26 17:28:06 +08:00
/>
<Modal
open={viewOpen}
2026-07-06 18:06:49 +08:00
destroyOnHidden
2026-06-26 17:28:06 +08:00
title="机构信息查看"
width={760}
loading={detailLoading}
cancelText="关闭"
okButtonProps={{ style: { display: "none" } }}
2026-07-13 11:14:27 +08:00
onCancel={() => { setViewOpen(false); setDetail(null); }}
2026-06-26 17:28:06 +08:00
>
{detail && (
<Descriptions bordered column={2} size="small">
2026-07-13 11:14:27 +08:00
<Descriptions.Item label="机构名称">{detail.unitName}</Descriptions.Item>
2026-06-26 17:28:06 +08:00
<Descriptions.Item label="统一社会信用代码">{detail.creditCode}</Descriptions.Item>
2026-07-13 11:14:27 +08:00
<Descriptions.Item label="属地">{detail.districtName}</Descriptions.Item>
<Descriptions.Item label="安全生产监管行业类别">{detail.safetyIndustryCategoryName}</Descriptions.Item>
2026-06-26 17:28:06 +08:00
<Descriptions.Item label="经营地址" span={2}>{detail.businessAddress}</Descriptions.Item>
2026-07-13 11:14:27 +08:00
<Descriptions.Item label="企业状态">{detail.enterpriseStatusName}</Descriptions.Item>
2026-06-26 17:28:06 +08:00
<Descriptions.Item label="经度/纬度">{detail.longitude}, {detail.latitude}</Descriptions.Item>
2026-07-13 11:14:27 +08:00
<Descriptions.Item label="主要负责人">{detail.principalName}</Descriptions.Item>
2026-06-26 17:28:06 +08:00
<Descriptions.Item label="主要负责人电话">{detail.principalPhone}</Descriptions.Item>
<Descriptions.Item label="法定代表人">{detail.legalRepresentative}</Descriptions.Item>
2026-07-13 11:14:27 +08:00
<Descriptions.Item label="法人电话">{detail.legalRepresentativePhone}</Descriptions.Item>
<Descriptions.Item label="企业规模" span={2}>{detail.enterpriseScaleName}</Descriptions.Item>
2026-06-26 17:28:06 +08:00
</Descriptions>
)}
</Modal>
<Modal
open={editOpen}
2026-07-06 18:06:49 +08:00
destroyOnHidden
2026-06-26 17:28:06 +08:00
title="编辑机构信息"
width={760}
confirmLoading={editLoading}
okText="保存"
cancelText="取消"
onCancel={() => {
setEditOpen(false);
setCurrentId(null);
editForm.resetFields();
}}
onOk={onEditSubmit}
>
<Form form={editForm} layout="vertical">
<Row gutter={16}>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="unitName" label="机构名称" rules={[{ required: true, message: "请输入机构名称" }]}>
2026-06-26 17:28:06 +08:00
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item name="creditCode" label="统一社会信用代码" rules={[{ required: true, message: "请输入信用代码" }]}>
<Input />
</Form.Item>
</Col>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="districtName" label="属地">
2026-06-26 17:28:06 +08:00
<Select options={CHONGQING_DISTRICTS} placeholder="请选择属地" />
</Form.Item>
</Col>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="safetyIndustryCategoryName" label="安全生产监管行业类别">
2026-06-26 17:28:06 +08:00
<Input />
</Form.Item>
</Col>
<Col span={24}>
<Form.Item name="businessAddress" label="企事业单位经营地址">
<Input />
</Form.Item>
</Col>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="enterpriseStatusName" label="企业状态">
2026-06-26 17:28:06 +08:00
<Select options={ENTERPRISE_STATUS_OPTIONS} />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="longitude" label="经度">
<InputNumber style={{ width: "100%" }} />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="latitude" label="纬度">
<InputNumber style={{ width: "100%" }} />
</Form.Item>
</Col>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="principalName" label="主要负责人">
2026-06-26 17:28:06 +08:00
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item name="principalPhone" label="主要负责人电话">
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item name="legalRepresentative" label="法定代表人">
<Input />
</Form.Item>
</Col>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="legalRepresentativePhone" label="法人电话">
2026-06-26 17:28:06 +08:00
<Input />
</Form.Item>
</Col>
<Col span={12}>
2026-07-13 11:14:27 +08:00
<Form.Item name="enterpriseScaleName" label="企业规模">
2026-06-26 17:28:06 +08:00
<Select options={ENTERPRISE_SCALE_OPTIONS.map((o) => ({ label: o.label, value: o.label }))} />
</Form.Item>
</Col>
</Row>
</Form>
</Modal>
2026-06-29 16:45:58 +08:00
</PageLayout>
2026-06-26 17:28:06 +08:00
);
}
2026-07-13 11:14:27 +08:00
export default Connect([NS_ORG_INFO], true)(AntdTableFuncControl(OrgAccountPage));