dev_1.0.1
tangjie 2026-07-10 16:08:16 +08:00
parent 68182377e0
commit c94f43e877
6 changed files with 53 additions and 31 deletions

View File

@ -10,7 +10,7 @@ module.exports = {
javaGitBranch: "dev", javaGitBranch: "dev",
// 本地联调 safetyEval-servicecontext-path: /safetyEval默认端口 8095 // 本地联调 safetyEval-servicecontext-path: /safetyEval默认端口 8095
// 可通过环境变量覆盖: SAFETY_EVAL_API_HOST=http://192.168.x.x:8095 // 可通过环境变量覆盖: SAFETY_EVAL_API_HOST=http://192.168.x.x:8095
API_HOST: "https://gbs-gateway.qhdsafety.com", API_HOST: "http://192.168.0.149",
}, },
production: { production: {
// 应用后端分支名称,部署上线需要 // 应用后端分支名称,部署上线需要

View File

@ -204,7 +204,7 @@ function PersonnelInfoPage(props) {
<Table <Table
rowKey="id" rowKey="id"
columns={[ columns={[
{ title: "用户名称", dataIndex: "userName" }, { title: "用户名称", dataIndex: "userName", ellipsis: true },
{ title: "账号", dataIndex: "account" }, { title: "账号", dataIndex: "account" },
{ title: "部门", dataIndex: "deptName" }, { title: "部门", dataIndex: "deptName" },
{ title: "岗位", dataIndex: "postName" }, { title: "岗位", dataIndex: "postName" },
@ -216,7 +216,7 @@ function PersonnelInfoPage(props) {
}, },
{ {
title: "操作", title: "操作",
width: 320, width: 200,
render: (_, record) => ( render: (_, record) => (
<TableAction> <TableAction>
<Button <Button
@ -397,6 +397,7 @@ function StaffFormModal({
...data, ...data,
}; };
if (data.birthDate) setFields.birthDate = dayjs(data.birthDate); if (data.birthDate) setFields.birthDate = dayjs(data.birthDate);
if (data.joinWorkDate) setFields.joinWorkDate = dayjs(data.joinWorkDate);
if (setFields.proofMaterialUrl) { if (setFields.proofMaterialUrl) {
setFields.proofMaterialUrl = JSON.parse(setFields.proofMaterialUrl); setFields.proofMaterialUrl = JSON.parse(setFields.proofMaterialUrl);
@ -442,14 +443,6 @@ function StaffFormModal({
: values.genderCode === 2 : values.genderCode === 2
? "女" ? "女"
: undefined, : undefined,
personTypeCode: values.personTypeName,
personTypeName: values.personTypeName,
professionalLevelCode: values.professionalLevelName,
professionalLevelName: values.professionalLevelName,
educationTypeCode: values.educationTypeName,
educationTypeName: values.educationTypeName,
educationLevelCode: values.educationLevelName,
educationLevelName: values.educationLevelName,
proofMaterialUrl: Array.isArray(values.proofMaterialUrl) proofMaterialUrl: Array.isArray(values.proofMaterialUrl)
? JSON.stringify(values.proofMaterialUrl) ? JSON.stringify(values.proofMaterialUrl)
: undefined, : undefined,
@ -457,6 +450,9 @@ function StaffFormModal({
if (payload.birthDate && typeof payload.birthDate !== "string") { if (payload.birthDate && typeof payload.birthDate !== "string") {
payload.birthDate = payload.birthDate.format("YYYY-MM-DD"); payload.birthDate = payload.birthDate.format("YYYY-MM-DD");
} }
if (payload.joinWorkDate && typeof payload.joinWorkDate !== "string") {
payload.joinWorkDate = payload.joinWorkDate.format("YYYY-MM-DD");
}
if (currentId) payload.id = currentId; if (currentId) payload.id = currentId;
delete payload.proofMaterials; delete payload.proofMaterials;
@ -524,6 +520,11 @@ function StaffFormModal({
<DatePicker style={{ width: "100%" }} /> <DatePicker style={{ width: "100%" }} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}>
<Form.Item name="joinWorkDate" label="参加工作时间" rules={[{ required: true, message: "请选择参加工作时间" }]}>
<DatePicker style={{ width: "100%" }} />
</Form.Item>
</Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
name="account" name="account"
@ -586,12 +587,16 @@ function StaffFormModal({
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="personTypeName" label="人员类型"> <Form.Item name="personTypeCode" label="人员类型">
<Select <Select
placeholder="请选择人员类型" placeholder="请选择人员类型"
options={PERSON_TYPE_OPTIONS} options={PERSON_TYPE_OPTIONS}
onChange={(_val, option) => {
form.setFieldValue("personTypeName", option?.label || undefined);
}}
/> />
</Form.Item> </Form.Item>
<Form.Item name="personTypeName" noStyle />
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="qualScope" label="资质范围"> <Form.Item name="qualScope" label="资质范围">
@ -603,13 +608,17 @@ function StaffFormModal({
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="professionalLevelName" label="职业等级"> <Form.Item name="professionalLevelCode" label="职业等级">
<Select <Select
placeholder="请选择职业等级" placeholder="请选择职业等级"
allowClear allowClear
options={PROFESSIONAL_LEVEL_OPTIONS} options={PROFESSIONAL_LEVEL_OPTIONS}
onChange={(_val, option) => {
form.setFieldValue("professionalLevelName", option?.label || undefined);
}}
/> />
</Form.Item> </Form.Item>
<Form.Item name="professionalLevelName" noStyle />
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item
@ -621,22 +630,33 @@ function StaffFormModal({
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="educationTypeName" label="学历类型"> <Form.Item name="educationTypeCode" label="学历类型">
<Select <Select
placeholder="请选择学历类型" placeholder="请选择学历类型"
allowClear allowClear
options={EDUCATION_TYPE_OPTIONS} options={EDUCATION_TYPE_OPTIONS}
onChange={(_val, option) => {
form.setFieldValue("educationTypeName", option?.label || undefined);
}}
/> />
</Form.Item> </Form.Item>
<Form.Item name="educationTypeName" noStyle />
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item name="educationLevelName" label="学历层次"> <Form.Item name="educationLevelCode" label="学历层次">
<Select <Select
placeholder="请选择学历层次" placeholder="请选择学历层次"
allowClear allowClear
options={EDUCATION_LEVEL_OPTIONS} options={EDUCATION_LEVEL_OPTIONS}
onChange={(val , option) => {
form.setFieldValue(
"educationLevelName",
option?.label || undefined,
);
}}
/> />
</Form.Item> </Form.Item>
<Form.Item name="educationLevelName" noStyle/>
</Col> </Col>
<Col span={12}> <Col span={12}>
<Form.Item <Form.Item

View File

@ -32,8 +32,8 @@ export default function EquipmentStep({
dataSource={equipmentList || []} dataSource={equipmentList || []}
columns={[ columns={[
{ title: "序号", width: 60, render: (_, __, index) => index + 1 }, { title: "序号", width: 60, render: (_, __, index) => index + 1 },
{ title: "装备名称", dataIndex: "deviceName" }, { title: "装备名称", dataIndex: "deviceName", ellipsis: true },
{ title: "规格型号", dataIndex: "deviceModel" }, { title: "规格型号", dataIndex: "deviceModel",ellipsis: true },
{ title: "生产厂家", dataIndex: "manufacturer" }, { title: "生产厂家", dataIndex: "manufacturer" },
{ {
title: "计量检定情况", title: "计量检定情况",

View File

@ -94,8 +94,8 @@ function OrgEquipmentSelectModalInner(props) {
onChange: (page, pageSize) => getData(page, pageSize), onChange: (page, pageSize) => getData(page, pageSize),
}} }}
columns={[ columns={[
{ title: "装备名称", dataIndex: "deviceName" }, { title: "装备名称", dataIndex: "deviceName", ellipsis: true },
{ title: "规格型号", dataIndex: "deviceModel" }, { title: "规格型号", dataIndex: "deviceModel",ellipsis: true },
{ title: "生产厂家", dataIndex: "manufacturer" }, { title: "生产厂家", dataIndex: "manufacturer" },
]} ]}
/> />

View File

@ -94,10 +94,10 @@ function OrgPersonnelSelectModalInner(props) {
}} }}
scroll={ { y: 400 }} scroll={ { y: 400 }}
columns={[ columns={[
{ title: "人员姓名", dataIndex: "userName" }, { title: "人员姓名", dataIndex: "userName", ellipsis: true },
{ title: "类型", dataIndex: "personTypeName" }, { title: "类型", dataIndex: "personTypeName" },
{ title: "职称", dataIndex: "titleName" }, { title: "职称", dataIndex: "titleName", ellipsis: true },
{ {
title: "操作", title: "操作",
width: 80, width: 80,

View File

@ -1,7 +1,7 @@
/** 资质申请前置条件核验(提交前展示,对齐原型) */ /** 资质申请前置条件核验(提交前展示,对齐原型) */
/** 人员相关三项暂不校验(机构库数据不足),恢复时改为 false */ /** 人员相关三项暂不校验(机构库数据不足),恢复时改为 false */
const SKIP_PERSONNEL_VERIFY = true; const SKIP_PERSONNEL_VERIFY = false;
const KEY_POSITIONS = ["负责人", "技术负责人", "质量负责人"]; const KEY_POSITIONS = ["负责人", "技术负责人", "质量负责人"];
@ -45,6 +45,7 @@ export function verifyFilingPrerequisites(detail = {}) {
}); });
const personnel = detail.personnelList || []; const personnel = detail.personnelList || [];
const total = personnel.length; const total = personnel.length;
const regEngineerCount = personnel.filter(isRegisterEngineer).length; const regEngineerCount = personnel.filter(isRegisterEngineer).length;
const midTitleCount = personnel.filter((p) => const midTitleCount = personnel.filter((p) =>
@ -57,27 +58,28 @@ export function verifyFilingPrerequisites(detail = {}) {
items.push({ items.push({
key: "personnelStructure", key: "personnelStructure",
label: "人员数量与结构", label: "人员数量与结构",
desc: "专职技术人员≥25人中级注安师≥30%中级职称≥50%高级职称≥30%", desc: "专职技术人员≥25人",
passed: passed:
SKIP_PERSONNEL_VERIFY || SKIP_PERSONNEL_VERIFY ||
(total >= 25 && total >= 25 ,
ratio(regEngineerCount, total) >= 0.3 &&
ratio(midTitleCount, total) >= 0.5 &&
ratio(seniorTitleCount, total) >= 0.3),
}); });
const twoYearsAgo = new Date();
twoYearsAgo.setFullYear(twoYearsAgo.getFullYear() - 2);
const withExperience = personnel.filter((p) => { const withExperience = personnel.filter((p) => {
const exp = String(p.workExperience || ""); const joinDate = new Date(p.joinWorkDate);
return exp.length >= 4 || /[2-9]\s*年|[二三四五六七八九十]年/.test(exp);
return !isNaN(joinDate.getTime()) && joinDate <= twoYearsAgo;
}).length; }).length;
items.push({ items.push({
key: "personnelExp", key: "personnelExp",
label: "人员资历", label: "人员资历",
desc: "专职技术人员在本行业领域工作二年以上", desc: "专职技术人员在本行业领域工作二年以上",
passed: passed:
SKIP_PERSONNEL_VERIFY || SKIP_PERSONNEL_VERIFY ||
(total >= 25 && ratio(withExperience, total) >= 0.8), (total >= 25 && ratio(withExperience, total) >= 1),
}); });
const keyOk = KEY_POSITIONS.every((pos) => const keyOk = KEY_POSITIONS.every((pos) =>
@ -92,7 +94,7 @@ export function verifyFilingPrerequisites(detail = {}) {
key: "keyPosition", key: "keyPosition",
label: "关键岗位要求", label: "关键岗位要求",
desc: "负责人、技术负责人、质量负责人具有高级职称,工作八年以上", desc: "负责人、技术负责人、质量负责人具有高级职称,工作八年以上",
passed: SKIP_PERSONNEL_VERIFY || keyOk, passed: true || keyOk,
}); });
const mgmtUploaded = const mgmtUploaded =