tangjie 2026-07-13 15:31:49 +08:00
parent 72396972a5
commit 994b24a8c3
6 changed files with 219 additions and 62 deletions

View File

@ -375,7 +375,9 @@ function CertModal({
<Form.Item name="reviewDate" label="复核日期"> <Form.Item name="reviewDate" label="复核日期">
<DatePicker style={{ width: "100%" }} /> <DatePicker style={{ width: "100%" }} />
</Form.Item> </Form.Item>
<AttachmentUpload name="certAttachmentUrl" label="证书附件" maxCount={10} accept="image/*,.pdf" /> <AttachmentUpload name="certAttachmentUrl" label="证书附件" maxCount={10} accept="image/*,.pdf"
extra={'请上传证书附件支持10个以内的图片和PDF格式'}
/>
</Form> </Form>
</Modal> </Modal>

View File

@ -710,6 +710,7 @@ function StaffFormModal({
<AttachmentUpload <AttachmentUpload
name="proofMaterialUrl" name="proofMaterialUrl"
label="申报专业能力证明材料" label="申报专业能力证明材料"
extra={'最多上传5个文件'}
maxCount={5} maxCount={5}
/> />
</Col> </Col>

View File

@ -369,21 +369,21 @@ function CertFormModal({
label="证书名称" label="证书名称"
rules={[{ required: true, message: "请输入证书名称" }]} rules={[{ required: true, message: "请输入证书名称" }]}
> >
<Input placeholder="请输入证书名称" /> <Input placeholder="请输入证书名称" maxLength={50} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="certNo" name="certNo"
label="证明编号" label="证明编号"
rules={[{ required: true, message: "请输入证明编号" }]} rules={[{ required: true, message: "请输入证明编号" }]}
> >
<Input placeholder="请输入证明编号" /> <Input placeholder="请输入证明编号" maxLength={30} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="issueOrg" name="issueOrg"
label="发证机关" label="发证机关"
rules={[{ required: true, message: "请输入发证机关" }]} rules={[{ required: true, message: "请输入发证机关" }]}
> >
<Input placeholder="请输入发证机关" /> <Input placeholder="请输入发证机关" maxLength={50} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="issueDate" name="issueDate"
@ -403,9 +403,9 @@ function CertFormModal({
<RangePicker style={{ width: "100%" }} /> <RangePicker style={{ width: "100%" }} />
</Form.Item> </Form.Item>
<Form.Item name="remark" label="备注"> <Form.Item name="remark" label="备注">
<TextArea rows={3} placeholder="请输入备注" /> <TextArea rows={3} placeholder="请输入备注" maxLength={200} showCount />
</Form.Item> </Form.Item>
<AttachmentUpload name="certImageUrl" accept="image/*" label="证书图片" maxCount={3} /> <AttachmentUpload name="certImageUrl" accept="image/*" label="证书图片" maxCount={3} extra="最多上传3张图片" />
</Form> </Form>
</Modal> </Modal>
); );

View File

@ -297,6 +297,7 @@ function AddModal({ open, staffOptions, requestAdd, onCancel, onSuccess }) {
<AttachmentUpload <AttachmentUpload
name="reportFileUrl" name="reportFileUrl"
label="离职通知报告" label="离职通知报告"
extra={'最多上传1个PDF文件'}
maxCount={1} maxCount={1}
accept=".pdf" accept=".pdf"
/> />

View File

@ -81,13 +81,33 @@ export default function BasicInfoStep({ form, disabled }) {
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="legalPersonPhone" label="法人代表及电话"> <Form.Item
<Input placeholder="姓名 / 电话" maxLength={32} /> name="legalPersonPhone"
label="法人代表电话"
rules={[
{
pattern: /^(1\d{10}|0\d{2,3}-?\d{7,8})$/,
message: "请输入正确的手机号或座机号",
},
]}
>
<Input placeholder="请输入法人代表电话" maxLength={11} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="contactPhone" label="联系人及电话"> <Form.Item
<Input placeholder="姓名 / 电话" maxLength={32} /> name="contactPhone"
label="联系人电话"
rules={[
{
pattern: /^(1\d{10}|0\d{2,3}-?\d{7,8})$/,
message: "请输入正确的手机号或座机号",
},
]}
>
<Input placeholder="请输入联系人电话" maxLength={11} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
@ -169,6 +189,7 @@ export default function BasicInfoStep({ form, disabled }) {
name="attachmentUrl" name="attachmentUrl"
label="上传附件" label="上传附件"
disabled={disabled} disabled={disabled}
extra={'最多上传12个PDF、DOC、DOCX格式文件'}
maxCount={12} maxCount={12}
accept=".pdf,.doc,.docx" accept=".pdf,.doc,.docx"
/> />

View File

@ -1,7 +1,21 @@
import { import {
Button, DatePicker, Descriptions, Form, Input, InputNumber, message, Modal, Row, Col, Select, Space, Tag, Table, Button,
DatePicker,
Descriptions,
Form,
Input,
InputNumber,
message,
Modal,
Row,
Col,
Select,
Space,
Tag,
Table,
} from "antd"; } from "antd";
import TableAction from "@cqsjjb/jjb-react-admin-component/TableAction"; import TableAction from "@cqsjjb/jjb-react-admin-component/TableAction";
import { tools } from "@cqsjjb/jjb-common-lib";
import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout";
@ -13,11 +27,13 @@ import {
CHONGQING_DISTRICTS, CHONGQING_DISTRICTS,
ENTERPRISE_SCALE_OPTIONS, ENTERPRISE_SCALE_OPTIONS,
ORG_ACCOUNT_STATE_OPTIONS, ORG_ACCOUNT_STATE_OPTIONS,
ENTERPRISE_STATUS_OPTIONS ENTERPRISE_STATUS_OPTIONS,
} from "~/enumerate/enterpriseOptions"; } from "~/enumerate/enterpriseOptions";
import { NS_ORG_INFO } from "~/enumerate/namespace"; import { NS_ORG_INFO } from "~/enumerate/namespace";
import { safeListRequest, safeRequest } from "~/utils"; import { safeListRequest, safeRequest } from "~/utils";
const { router } = tools;
function OrgAccountPage(props) { function OrgAccountPage(props) {
const [searchForm] = Form.useForm(); const [searchForm] = Form.useForm();
const [editForm] = Form.useForm(); const [editForm] = Form.useForm();
@ -31,14 +47,23 @@ function OrgAccountPage(props) {
const [total, setTotal] = useState(0); const [total, setTotal] = useState(0);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const getData = async () => { const getData = async () => {
setLoading(true); setLoading(true);
try { try {
const raw = searchForm.getFieldsValue(); const raw = searchForm.getFieldsValue();
const params = { const params = {
...raw, ...raw,
state: raw.state !== "" && raw.state !== undefined ? Number(raw.state) : undefined, current: router.query.current || 1,
...(Array.isArray(raw.openTimeRange) && raw.openTimeRange[0] && raw.openTimeRange[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"), createTimeStart: raw.openTimeRange[0].format("YYYY-MM-DD"),
createTimeEnd: raw.openTimeRange[1].format("YYYY-MM-DD"), createTimeEnd: raw.openTimeRange[1].format("YYYY-MM-DD"),
@ -46,17 +71,19 @@ function OrgAccountPage(props) {
: {}), : {}),
}; };
delete params.openTimeRange; delete params.openTimeRange;
Object.keys(params).forEach((k) => { if (params[k] === undefined) delete params[k]; }); Object.keys(params).forEach((k) => {
if (params[k] === undefined) delete params[k];
});
const res = await safeListRequest(props.orgAccountList)(params); const res = await safeListRequest(props.orgAccountList)(params);
setDataSource(res?.data || []); setDataSource(res?.data || []);
setTotal(res?.totalCount || 0); setTotal(res?.total || 0);
} finally { } finally {
setLoading(false); setLoading(false);
} }
}; };
useEffect(() => { useEffect(() => {
getData(); getData(1, 10);
}, []); }, []);
const loadDetail = async (id) => { const loadDetail = async (id) => {
@ -86,17 +113,21 @@ function OrgAccountPage(props) {
const enabled = isOrgAccountEnabled(record); const enabled = isOrgAccountEnabled(record);
Modal.confirm({ Modal.confirm({
title: "确认操作", title: "确认操作",
content: enabled ? `确认禁用「${record.unitName}」账号?` : `确认启用「${record.unitName}」账号?`, content: enabled
? `确认禁用「${record.unitName}」账号?`
: `确认启用「${record.unitName}」账号?`,
okText: "确认", okText: "确认",
cancelText: "取消", cancelText: "取消",
onOk: async () => { onOk: async () => {
const nextState = enabled ? 1 : 0; const nextState = enabled ? 1 : 0;
const res = await props.orgAccountUpdateState({ id: record.id, state: nextState }); const res = await props.orgAccountUpdateState({
id: record.id,
state: nextState,
});
if (res?.success !== false) { if (res?.success !== false) {
message.success("操作成功"); message.success("操作成功");
await getData(); await getData();
} }
}, },
}); });
}; };
@ -112,7 +143,9 @@ function OrgAccountPage(props) {
<strong>{record.unitName}</strong> <strong>{record.unitName}</strong>
的密码重置为初始密码 的密码重置为初始密码
</p> </p>
<p style={{ color: "rgba(0,0,0,0.45)", fontSize: 12 }}>初始密码a123456</p> <p style={{ color: "rgba(0,0,0,0.45)", fontSize: 12 }}>
初始密码a123456
</p>
</div> </div>
), ),
okText: "确认重置", okText: "确认重置",
@ -122,7 +155,6 @@ function OrgAccountPage(props) {
if (res?.success !== false) { if (res?.success !== false) {
message.success("密码已重置"); message.success("密码已重置");
} }
}, },
}); });
}; };
@ -137,7 +169,9 @@ function OrgAccountPage(props) {
<strong>{record.unitName}</strong> <strong>{record.unitName}</strong>
的账号 的账号
</p> </p>
<p style={{ color: "rgba(0,0,0,0.45)", fontSize: 12 }}>此操作不可恢复请谨慎操作</p> <p style={{ color: "rgba(0,0,0,0.45)", fontSize: 12 }}>
此操作不可恢复请谨慎操作
</p>
</div> </div>
), ),
okText: "确认删除", okText: "确认删除",
@ -149,7 +183,6 @@ function OrgAccountPage(props) {
message.success("删除成功"); message.success("删除成功");
await getData(); await getData();
} }
}, },
}); });
}; };
@ -169,7 +202,6 @@ function OrgAccountPage(props) {
editForm.resetFields(); editForm.resetFields();
await getData(); await getData();
} }
}; };
const columns = [ const columns = [
@ -191,11 +223,32 @@ function OrgAccountPage(props) {
fixed: "right", fixed: "right",
render: (_, record) => ( render: (_, record) => (
<TableAction> <TableAction>
<Button type="link" size="small" onClick={() => openView(record.id)}>查看</Button> <Button type="link" size="small" onClick={() => openView(record.id)}>
<Button type="link" size="small" onClick={() => openEdit(record.id)}>编辑</Button> 查看
<Button type="link" size="small" onClick={() => onResetPassword(record)}>重置密码</Button> </Button>
<Button type="link" size="small" danger onClick={() => onDelete(record)}>删除</Button> <Button type="link" size="small" onClick={() => openEdit(record.id)}>
<Button type="link" size="small" onClick={() => onToggleStatus(record)}> 编辑
</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) ? "禁用" : "启用"} {isOrgAccountEnabled(record) ? "禁用" : "启用"}
</Button> </Button>
</TableAction> </TableAction>
@ -208,9 +261,7 @@ function OrgAccountPage(props) {
title={ title={
<div> <div>
<span>评价机构账号管理</span> <span>评价机构账号管理</span>
<div className="pageLayout-extra"> <div className="pageLayout-extra">监管端维护评价机构开户账号</div>
监管端维护评价机构开户账号
</div>
</div> </div>
} }
> >
@ -220,31 +271,62 @@ function OrgAccountPage(props) {
loading={loading} loading={loading}
formLine={[ formLine={[
<Form.Item key="unitName" name="unitName"> <Form.Item key="unitName" name="unitName">
<ControlWrapper.Input label="机构名称" placeholder="关键字搜索" allowClear /> <ControlWrapper.Input
label="机构名称"
placeholder="关键字搜索"
allowClear
/>
</Form.Item>, </Form.Item>,
<Form.Item key="districtName" name="districtName"> <Form.Item key="districtName" name="districtName">
<ControlWrapper.Select label="属地" placeholder="请选择属地" allowClear> <ControlWrapper.Select
label="属地"
placeholder="请选择属地"
allowClear
>
{CHONGQING_DISTRICTS.map((opt) => ( {CHONGQING_DISTRICTS.map((opt) => (
<Select.Option key={opt.value} value={opt.value}>{opt.label}</Select.Option> <Select.Option key={opt.value} value={opt.value}>
{opt.label}
</Select.Option>
))} ))}
</ControlWrapper.Select> </ControlWrapper.Select>
</Form.Item>, </Form.Item>,
<Form.Item key="state" name="state"> <Form.Item key="state" name="state">
<ControlWrapper.Select label="状态" placeholder="请选择状态" allowClear> <ControlWrapper.Select
label="状态"
placeholder="请选择状态"
allowClear
>
{ORG_ACCOUNT_STATE_OPTIONS.map((opt) => ( {ORG_ACCOUNT_STATE_OPTIONS.map((opt) => (
<Select.Option key={opt.value} value={opt.value}>{opt.label}</Select.Option> <Select.Option key={opt.value} value={opt.value}>
{opt.label}
</Select.Option>
))} ))}
</ControlWrapper.Select> </ControlWrapper.Select>
</Form.Item>, </Form.Item>,
<Form.Item key="openTimeRange" name="openTimeRange"> <Form.Item key="openTimeRange" name="openTimeRange">
<ControlWrapper.DatePicker.RangePicker label="开户时间" allowClear /> <ControlWrapper.DatePicker.RangePicker
label="开户时间"
allowClear
/>
</Form.Item>, </Form.Item>,
]} ]}
onReset={() => { onReset={(values) => {
searchForm.resetFields(); searchForm.resetFields();
router.query = {
...values,
current: 1,
pageSize: 10,
};
getData(); getData();
}} }}
onFinish={() => getData()} onFinish={(values) => {
router.query = {
...values,
current: 1,
pageSize: 10,
};
getData()
}}
/> />
<Table <Table
rowKey="id" rowKey="id"
@ -257,9 +339,10 @@ function OrgAccountPage(props) {
showSizeChanger: true, showSizeChanger: true,
showQuickJumper: true, showQuickJumper: true,
showTotal: (t) => `${t}`, showTotal: (t) => `${t}`,
current: 1, current: router.query.current || 1,
pageSize: 10, pageSize: router.query.pageSize || 10,
onChange: (page, pageSize) => { onChange: (page, pageSize) => {
router.query = { ...router.query, current: page, pageSize };
getData(); getData();
}, },
}} }}
@ -273,22 +356,49 @@ function OrgAccountPage(props) {
loading={detailLoading} loading={detailLoading}
cancelText="关闭" cancelText="关闭"
okButtonProps={{ style: { display: "none" } }} okButtonProps={{ style: { display: "none" } }}
onCancel={() => { setViewOpen(false); setDetail(null); }} onCancel={() => {
setViewOpen(false);
setDetail(null);
}}
> >
{detail && ( {detail && (
<Descriptions bordered column={2} size="small"> <Descriptions bordered column={2} size="small">
<Descriptions.Item label="机构名称">{detail.unitName}</Descriptions.Item> <Descriptions.Item label="机构名称">
<Descriptions.Item label="统一社会信用代码">{detail.creditCode}</Descriptions.Item> {detail.unitName}
<Descriptions.Item label="属地">{detail.districtName}</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="安全生产监管行业类别">{detail.safetyIndustryCategoryName}</Descriptions.Item> <Descriptions.Item label="统一社会信用代码">
<Descriptions.Item label="经营地址" span={2}>{detail.businessAddress}</Descriptions.Item> {detail.creditCode}
<Descriptions.Item label="企业状态">{detail.enterpriseStatusName}</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="经度/纬度">{detail.longitude}, {detail.latitude}</Descriptions.Item> <Descriptions.Item label="属地">
<Descriptions.Item label="主要负责人">{detail.principalName}</Descriptions.Item> {detail.districtName}
<Descriptions.Item label="主要负责人电话">{detail.principalPhone}</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="法定代表人">{detail.legalRepresentative}</Descriptions.Item> <Descriptions.Item label="安全生产监管行业类别">
<Descriptions.Item label="法人电话">{detail.legalRepresentativePhone}</Descriptions.Item> {detail.safetyIndustryCategoryName}
<Descriptions.Item label="企业规模" span={2}>{detail.enterpriseScaleName}</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label="经营地址" span={2}>
{detail.businessAddress}
</Descriptions.Item>
<Descriptions.Item label="企业状态">
{detail.enterpriseStatusName}
</Descriptions.Item>
<Descriptions.Item label="经度/纬度">
{detail.longitude}, {detail.latitude}
</Descriptions.Item>
<Descriptions.Item label="主要负责人">
{detail.principalName}
</Descriptions.Item>
<Descriptions.Item label="主要负责人电话">
{detail.principalPhone}
</Descriptions.Item>
<Descriptions.Item label="法定代表人">
{detail.legalRepresentative}
</Descriptions.Item>
<Descriptions.Item label="法人电话">
{detail.legalRepresentativePhone}
</Descriptions.Item>
<Descriptions.Item label="企业规模" span={2}>
{detail.enterpriseScaleName}
</Descriptions.Item>
</Descriptions> </Descriptions>
)} )}
</Modal> </Modal>
@ -311,22 +421,36 @@ function OrgAccountPage(props) {
<Form form={editForm} layout="vertical"> <Form form={editForm} layout="vertical">
<Row gutter={16}> <Row gutter={16}>
<Col span={12}> <Col span={12}>
<Form.Item name="unitName" label="机构名称" rules={[{ required: true, message: "请输入机构名称" }]}> <Form.Item
name="unitName"
label="机构名称"
rules={[{ required: true, message: "请输入机构名称" }]}
>
<Input /> <Input />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="creditCode" label="统一社会信用代码" rules={[{ required: true, message: "请输入信用代码" }]}> <Form.Item
name="creditCode"
label="统一社会信用代码"
rules={[{ required: true, message: "请输入信用代码" }]}
>
<Input /> <Input />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="districtName" label="属地"> <Form.Item name="districtName" label="属地">
<Select options={CHONGQING_DISTRICTS} placeholder="请选择属地" /> <Select
options={CHONGQING_DISTRICTS}
placeholder="请选择属地"
/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="safetyIndustryCategoryName" label="安全生产监管行业类别"> <Form.Item
name="safetyIndustryCategoryName"
label="安全生产监管行业类别"
>
<Input /> <Input />
</Form.Item> </Form.Item>
</Col> </Col>
@ -372,7 +496,12 @@ function OrgAccountPage(props) {
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="enterpriseScaleName" label="企业规模"> <Form.Item name="enterpriseScaleName" label="企业规模">
<Select options={ENTERPRISE_SCALE_OPTIONS.map((o) => ({ label: o.label, value: o.label }))} /> <Select
options={ENTERPRISE_SCALE_OPTIONS.map((o) => ({
label: o.label,
value: o.label,
}))}
/>
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
@ -382,4 +511,7 @@ function OrgAccountPage(props) {
); );
} }
export default Connect([NS_ORG_INFO], true)(AntdTableFuncControl(OrgAccountPage)); export default Connect(
[NS_ORG_INFO],
true,
)(AntdTableFuncControl(OrgAccountPage));