import { Button, Checkbox, DatePicker, Descriptions, Form, Input, InputNumber, message, Modal, Row, Col, Select, Space, Tag, Table, } from "antd"; import TableAction from "@cqsjjb/jjb-react-admin-component/TableAction"; import { tools } from "@cqsjjb/jjb-common-lib"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { useEffect, useState } from "react"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import SearchForm from "~/components/SearchForm"; import ControlWrapper from "@cqsjjb/jjb-react-admin-component/ControlWrapper"; import { AntdTableFuncControl } from "@cqsjjb/jjb-common-decorator/antd"; import { QUALIFICATION_INDUSTRY_OPTIONS } from "~/enumerate/enterpriseOptions"; import { isOrgAccountEnabled } from "~/utils/enterpriseInfo/adapter"; import { CHONGQING_DISTRICTS, ORG_ACCOUNT_STATE_OPTIONS, QUALIFICATION_INDUSTRY_OPTIONS_MAP } from "~/enumerate/enterpriseOptions"; import { NS_ORG_INFO } from "~/enumerate/namespace"; import AttachmentUpload from "~/components/AttachmentUpload"; import { safeListRequest, safeRequest } from "~/utils"; import { creditCodeRule, nonNegativeIntegerRule, normalizeUrl, phoneRule, positiveNumberRule, urlRule, } from "~/utils/validators"; const { router } = tools; const CONTACT_SEP = "/"; const mergeContactNamePhone = (name, phone) => { if (!name && !phone) return undefined; return [name, phone].filter(Boolean).join(CONTACT_SEP); }; const splitContactNamePhone = (value) => { if (!value) return { contactName: undefined, contactPhone: undefined }; const idx = String(value).indexOf(CONTACT_SEP); if (idx >= 0) { return { contactName: String(value).slice(0, idx).trim(), contactPhone: String(value).slice(idx + 1).trim(), }; } return { contactName: String(value).trim(), contactPhone: undefined }; }; 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); const [dataSource, setDataSource] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const getData = async () => { setLoading(true); try { const raw = searchForm.getFieldsValue(); const params = { ...raw, current: router.query.current || 1, pageSize: router.query.pageSize || 10, 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]; }); const res = await safeListRequest(props.orgAccountList)(params); setDataSource(res?.data || []); setTotal(res?.total || 0); } finally { setLoading(false); } }; useEffect(() => { getData(1, 10); }, []); 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) { let attachmentUrls = res.data.attachmentUrls; if (typeof attachmentUrls === "string" && attachmentUrls) { try { attachmentUrls = JSON.parse(attachmentUrls); } catch {} } editForm.setFieldsValue({ ...res.data, attachmentUrls, contactNamePhone: mergeContactNamePhone( res.data.contactName, res.data.contactPhone, ), }); } }; const onToggleStatus = (record) => { const enabled = isOrgAccountEnabled(record); Modal.confirm({ title: "确认操作", content: enabled ? `确认禁用「${record.unitName}」账号?` : `确认启用「${record.unitName}」账号?`, 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(); } }, }); }; const onResetPassword = (record) => { console.log(record); Modal.confirm({ title: "重置密码", content: (

确认将 {record.unitName} 的密码重置为初始密码?

初始密码:a123456

), okText: "确认重置", cancelText: "取消", onOk: async () => { const res = await props.orgAccountResetPassword({ data: record.id }); if (res?.success !== false) { message.success("密码已重置"); } }, }); }; const onDelete = (record) => { Modal.confirm({ title: "确认删除", content: (

确认删除 {record.unitName} 的账号?

此操作不可恢复,请谨慎操作。

), okText: "确认删除", okButtonProps: { danger: true }, cancelText: "取消", onOk: async () => { const res = await props.orgAccountDelete({ data: record.id }); if (res?.success !== false) { message.success("删除成功"); await getData(); } }, }); }; const onEditSubmit = async () => { const formValues = await editForm.validateFields(); const split = splitContactNamePhone(formValues.contactNamePhone); const contactName = split.contactName ? split.contactName.replace(/\s+/g, "") : undefined; const contactPhone = split.contactPhone ? split.contactPhone.replace(/\s+/g, "") : undefined; const values = { ...formValues, contactName, contactPhone, contactNamePhone: undefined, attachmentUrls: formValues.attachmentUrls ? JSON.stringify(formValues.attachmentUrls) : undefined, infoDisclosureUrl: formValues.infoDisclosureUrl ? normalizeUrl(formValues.infoDisclosureUrl) : undefined, id: currentId, }; setEditLoading(true); const res = await props.orgAccountModify(values); setEditLoading(false); if (res?.success !== false) { message.success("保存成功"); setEditOpen(false); setCurrentId(null); editForm.resetFields(); await getData(); } }; const columns = [ { title: "单位名称", dataIndex: "unitName", ellipsis: true }, { title: "拟申请的法定安全评价业务范围", dataIndex: "safetyIndustryCategoryCode", ellipsis: true, render: (codes) => (Array.isArray(codes) ? codes : []) .map((code) => QUALIFICATION_INDUSTRY_OPTIONS_MAP[code] || code) .join("、") || "-", }, { title: "办公地址", dataIndex: "businessAddress", ellipsis: true }, { title: "状态", width: 80, render: (_, record) => ( {isOrgAccountEnabled(record) ? "启用" : "禁用"} ), }, { title: "开户时间", dataIndex: "createTime", width: 155 }, { title: "操作", width: 200, fixed: "right", render: (_, record) => ( ), }, ]; return ( 机构账号管理
监管端维护评价机构开户账号。
} > , {CHONGQING_DISTRICTS.map((opt) => ( {opt.label} ))} , {ORG_ACCOUNT_STATE_OPTIONS.map((opt) => ( {opt.label} ))} , , ]} onReset={(values) => { searchForm.resetFields(); router.query = { ...values, current: 1, pageSize: 10, }; getData(); }} onFinish={(values) => { router.query = { ...values, current: 1, pageSize: 10, }; getData(); }} /> `共 ${t} 条`, current: router.query.current || 1, pageSize: router.query.pageSize || 10, onChange: (page, pageSize) => { router.query = { ...router.query, current: page, pageSize }; getData(); }, }} /> { setViewOpen(false); setDetail(null); }} > {detail && ( {detail.unitName} {detail.creditCode} {(() => { let files = []; if (Array.isArray(detail.attachmentUrls)) { files = detail.attachmentUrls; } else if (typeof detail.attachmentUrls === "string" && detail.attachmentUrls) { try { files = JSON.parse(detail.attachmentUrls); } catch {} } if (!files.length) return "-"; return files.map((f, i) => ( {f.name || f.url} )); })()} {detail.registerAddress || "-"} {detail.businessAddress || "-"} {detail.infoDisclosureUrl || "-"} {detail.qualificationCertNo || "-"} {detail.legalRepresentative || "-"} {detail.legalRepresentativePhone || "-"} {detail.fax || "-"} {mergeContactNamePhone(detail.contactName, detail.contactPhone) || "-"} {detail.fixedAssetsTotal ?? "-"} {detail.workplaceArea ?? "-"} {detail.archiveRoomArea ?? "-"} {detail.fulltimeEvaluatorCount ?? "-"} {detail.registeredEngineerCount ?? "-"} {(detail.safetyIndustryCategoryCode || []) .map((code) => QUALIFICATION_INDUSTRY_OPTIONS_MAP[code] || code) .join("、") || "-"} {detail.orgIntro || "-"} )} { setEditOpen(false); setCurrentId(null); editForm.resetFields(); }} onOk={onEditSubmit} >
typeof value === "string" ? value.trim() : value } > typeof value === "string" ? value.trim() : value } > { const { contactName, contactPhone } = splitContactNamePhone(value); if (!contactName) { return Promise.reject(new Error("联系人不能为空")); } if (contactName.length > 50) { return Promise.reject(new Error("联系人不能超过50字")); } if (!contactPhone) { return Promise.reject( new Error("请使用/分隔联系人和电话,并填写电话"), ); } if ( !/^(1[3-9]\d{9}|\d{10,12})$/.test( String(contactPhone).replace(/\s+/g, ""), ) ) { return Promise.reject( new Error("电话格式不正确(手机11位或固话区号+号码)"), ); } if (contactPhone.length > 20) { return Promise.reject(new Error("电话不能超过20字")); } return Promise.resolve(); }, }, ]} extra="请使用/分隔联系人和电话,如:张三/13800138000" > { if (value === undefined || value === null || value === "") { return Promise.resolve(); } if (Number(value) < 0) { return Promise.reject(new Error("固定资产总值应为非负数字")); } return Promise.resolve(); }, }, ]} > {QUALIFICATION_INDUSTRY_OPTIONS.map((opt) => ( {opt.label} ))} ); } export default Connect( [NS_ORG_INFO], true, )(AntdTableFuncControl(OrgAccountPage));