添加相关方考评模块

master
853931625@qq.com 2026-05-22 08:55:04 +08:00
parent 0f2ab752fa
commit beff89f10c
29 changed files with 258 additions and 75 deletions

View File

@ -1,3 +1,8 @@
const path = require("path");
const pdfjsDistEntry = path.resolve(__dirname, "node_modules/pdfjs-dist/legacy/build/pdf.mjs");
const pdfjsDistPatchLoader = path.resolve(__dirname, "loaders/pdfjs-dist-patch-loader.cjs");
module.exports = {
// 应用后端git地址部署上线需要
javaGit: "<git-url>",
@ -74,5 +79,22 @@ module.exports = {
// 自动注入编译后的文件到public/index.html中
inject: true,
},
resolve: {
alias: {
"~": path.resolve(__dirname, "src"),
"pdfjs-dist": pdfjsDistEntry,
},
},
module: {
rules: [
{
test: /pdf\.mjs$/,
include: [pdfjsDistEntry],
use: [{
loader: pdfjsDistPatchLoader,
}],
},
],
},
},
};

View File

@ -0,0 +1,16 @@
const replacements = [
["__webpack_exports__", "__pdfjs_dist_exports__"],
["__webpack_module_cache__", "__pdfjs_dist_module_cache__"],
["__webpack_modules__", "__pdfjs_dist_modules__"],
["__webpack_require__", "__pdfjs_dist_require__"],
];
module.exports = function pdfjsDistPatchLoader(source) {
let patchedSource = source;
for (const [from, to] of replacements) {
patchedSource = patchedSource.split(from).join(to);
}
return patchedSource;
};

View File

@ -31,7 +31,7 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-pdf": "^10.4.1",
"zy-react-library": "^1.2.35"
"zy-react-library": "^1.3.14"
},
"devDependencies": {
"@antfu/eslint-config": "^5.4.1",

View File

@ -0,0 +1,19 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const evaluationCorpPage = declareRequest(
"evaluationLoading",
`Post > @/xgfManager/evaluation/corpPage`,
);
export const evaluationList = declareRequest(
"evaluationLoading",
`Post > @/xgfManager/evaluation/list`,
);
export const evaluationAdd = declareRequest(
"evaluationLoading",
`Post > @/xgfManager/evaluation/save`,
);
export const projectPageNoPermission = declareRequest(
"evaluationLoading",
`Post > @/xgfManager/project/projectPageNoPermission`,
);

View File

@ -1,7 +1,7 @@
import { Button, Descriptions, Modal } from "antd";
import { useEffect } from "react";
import PreviewImg from "zy-react-library/components/PreviewImg";
import PreviewPdf from "zy-react-library/components/PreviewPdf";
// import PreviewPdf from "zy-react-library/components/PreviewPdf";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useGetFile from "zy-react-library/hooks/useGetFile";
import { getFileSuffix } from "zy-react-library/utils";
@ -31,7 +31,7 @@ const ViewProjectReviewDetailsModal = (props) => {
return (
<>
<div><PreviewImg files={imgFiles} /></div>
<div style={{ marginTop: 20 }}><PreviewPdf files={pdfFiles} urlKey="url" /></div>
{/*<div style={{ marginTop: 20 }}><PreviewPdf files={pdfFiles} urlKey="url" /></div>*/}
</>
);
}
@ -39,7 +39,7 @@ const ViewProjectReviewDetailsModal = (props) => {
return <PreviewImg files={imgFiles} />;
}
if (pdfFiles.length > 0) {
return <PreviewPdf files={pdfFiles} />;
// return <PreviewPdf files={pdfFiles} />;
}
};
useEffect(() => {

View File

@ -1,33 +1,101 @@
import { Button, Descriptions, Modal } from "antd";
import { Button, Descriptions, Modal, Space, message } from "antd";
import PreviewImg from "zy-react-library/components/PreviewImg";
import PreviewPdf from "zy-react-library/components/PreviewPdf";
import { getFileSuffix } from "zy-react-library/utils";
import { getFileName, getFileSuffix, getFileUrl } from "zy-react-library/utils";
const ViewQualificationDetailsModal = (props) => {
const handleDownload = async (file) => {
const baseUrl = getFileUrl();
const fileUrl = file.url || (file.filePath ? `${baseUrl}${file.filePath}` : "");
const fileName = file.fileName || file.name || getFileName(file.filePath || fileUrl);
if (!fileUrl) {
message.error("文件地址不存在");
return;
}
try {
const response = await fetch(fileUrl);
const blob = await response.blob();
const link = document.createElement("a");
const blobUrl = window.URL.createObjectURL(blob);
link.href = blobUrl;
link.download = fileName;
link.style.display = "none";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(blobUrl);
}
catch {
message.error("下载失败");
}
};
const previewFile = () => {
const files = props.data.files || [];
const imgFiles = [];
const pdfFiles = [];
for (let i = 0; i < props.data.files.length; i++) {
if (getFileSuffix(props.data.files[i].fileName) === "pdf") {
pdfFiles.push(props.data.files[i]);
const compressedFiles = [];
for (let i = 0; i < files.length; i++) {
const file = files[i];
const suffix = getFileSuffix(file.fileName || file.name || "").toLowerCase();
if (suffix === "pdf") {
pdfFiles.push(file);
}
else if (suffix === "zip" || suffix === "rar") {
compressedFiles.push(file);
}
else {
imgFiles.push(props.data.files[i]);
imgFiles.push(file);
}
}
const compressedFileNodes = compressedFiles.length > 0 && (
<div style={{ marginTop: imgFiles.length > 0 || pdfFiles.length > 0 ? 20 : 0 }}>
<Space direction="vertical" size="middle">
{compressedFiles.map(file => (
<Space key={file.id || file.filePath || file.url || file.fileName || file.name}>
<span>{file.fileName || file.name || getFileName(file.filePath || file.url || "")}</span>
<Button type="primary" size="small" onClick={() => handleDownload(file)}>
下载
</Button>
</Space>
))}
</Space>
</div>
);
if (imgFiles.length > 0 && pdfFiles.length > 0) {
return (
<>
<div><PreviewImg files={imgFiles} /></div>
<div style={{ marginTop: 20 }}><PreviewPdf files={pdfFiles} urlKey="url" /></div>
{compressedFileNodes}
</>
);
}
if (imgFiles.length > 0) {
return <PreviewImg files={imgFiles} />;
return (
<>
<PreviewImg files={imgFiles} />
{compressedFileNodes}
</>
);
}
if (pdfFiles.length > 0) {
return <PreviewPdf files={pdfFiles} />;
return (
<>
<PreviewPdf files={pdfFiles} />
{compressedFileNodes}
</>
);
}
if (compressedFiles.length > 0) {
return compressedFileNodes;
}
};

View File

@ -11,3 +11,4 @@ export const NS_QUALIFICATION_RECORDS = defineNamespace("qualificationRecords");
export const NS_QUALIFICATION_STATISTICS = defineNamespace("qualificationStatistics");
export const NS_QUALIFICATION_APPLY = defineNamespace("qualificationApply");
export const NS_HIDDEN = defineNamespace("hidden");
export const NS_EVALUATION = defineNamespace("evaluation");

View File

@ -1,7 +1,7 @@
import ListPage from "~/pages/Container/Supervision/EvaluationManage/CompositeManage/List";
function List(props) {
return <ListPage xmsbtn="qud-xgfzhkpgl-xms" yhsbtn="qud-xgfzhkpgl-yhs" dflbbtn="qyd-xgfzhkpgl-dflb" {...props} />;
return <ListPage xmsbtn="qud-xgfzhkpgl-xms" yhsbtn="qud-xgfzhkpgl-yhs" dflbbtn="qud-xgfzhkpgl-dflb" {...props} />;
}
export default List;

View File

@ -0,0 +1,5 @@
function EvaluationManage(props) {
return (<div>{props.children}</div>);
}
export default EvaluationManage;

View File

@ -1,4 +1,4 @@
// import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import Page from "zy-react-library/components/Page";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
@ -7,7 +7,7 @@ function HiddenView() {
return (
<Page headerTitle={query.history === "1" ? "过程记录" : "查看"} contentPadding="0 20px 20px 20px">
{/*<HiddenInfo history={query.history === "1"} />*/}
<HiddenInfo history={query.history === "1"} />
</Page>
);
}

View File

@ -529,7 +529,7 @@ const FileUpload = (props) => {
<Upload
fileType="image"
maxCount={10}
accept=".pdf,.jpg,.jpeg,.png"
accept=".pdf,.jpg,.jpeg,.png,.zip,.rar"
onGetRemoveFile={(file) => {
form.setFieldValue("deleteFiles", [...(form.getFieldValue("deleteFiles") || []), file]);
}}

View File

@ -270,7 +270,8 @@ const StepOneComponent = (props) => {
}, [qualificationsTypeId]);
return (
<FormBuilder
labelCol={{ span: 6 }}
labelCol={{ span: 8 }}
labelWrap
form={form}
span={8}
loading={props.qualificationStatistics.qualificationStatisticsLoading}

View File

@ -305,7 +305,7 @@ function Review(props) {
{ label: "公司名称", children: info.corpInfo?.corpName },
{ label: "企业状态", children: (info.corpInfo?.corpStateName) ? info.corpInfo?.corpStateName : "-" },
{ label: "开户人", children: info.corpInfo?.accountContactName },
{ label: "社会统一信号代码", children: info.corpInfo?.code },
{ label: "统一社会信号代码", children: info.corpInfo?.code },
{ label: "属地", children: (info.corpInfo?.provinceName) ? `${info.corpInfo?.provinceName}/${info.corpInfo?.cityName}/${info.corpInfo?.countryName}` : "-" },
{ label: "所属行业", children: [info.corpInfo?.corpType2Name, info.corpInfo?.corpType3Name, info.corpInfo?.corpType4Name, info.corpInfo?.corpTypeName].filter(Boolean).join("/") },
{ label: "单位经营地址", children: info.corpInfo?.addressBusiness },

View File

@ -14,10 +14,11 @@ import useTable from "zy-react-library/hooks/useTable";
import { getLabelName, getUnmatchedItems } from "zy-react-library/utils";
import { IS_RELATED_ENUM } from "~/enumerate/constant";
import {NS_HIDDEN} from "~/enumerate/namespace";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
function List(props) {
const [form] = Form.useForm();
const query = useGetUrlQuery();
const { tableProps, getData } = useTable(props["ledgerList"], {
form,
usePermission:false,
@ -26,7 +27,9 @@ function List(props) {
hiddenFindTime: formData.hiddenFindTime?.[0],
hiddenFindTimeLe: formData.hiddenFindTime?.[1],
state: formData.state ? [formData.state] : undefined,
hiddenLevels: ["hiddenLevel1001", "hiddenLevel1004", "hiddenLevel1002"],
// hiddenLevels: ["hiddenLevel1001", "hiddenLevel1004", "hiddenLevel1002"],
xgfCorpId: query.corpinfoId,
}),
});

View File

@ -1,6 +1,7 @@
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space,message,Modal } from "antd";
import dayjs from "dayjs";
import Page from "zy-react-library/components/Page";
import Search from "zy-react-library/components/Search";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
@ -8,22 +9,48 @@ import Table from "zy-react-library/components/Table";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
import {NS_EVALUATION, NS_QUALIFICATION_STATISTICS} from "~/enumerate/namespace";
import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender";
import { useState } from "react";
import {useEffect, useState} from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import {evaluationAdd} from "~/api/evaluation";
const validatorScore = (_, value) => {
if (value === undefined || value === null || value === "") {
return Promise.resolve();
}
const score = Number(value);
if (!Number.isInteger(score) || score < 1 || score > 100) {
return Promise.reject(new Error("\u9879\u76ee\u5206\u6570\u53ea\u5141\u8bb8\u8f93\u51651-100\u6b63\u6574\u6570"));
}
return Promise.resolve();
};
const disabledEvaluationMonth = (current) => {
if (!current) {
return false;
}
const minMonth = dayjs().startOf("month").subtract(3, "month");
const maxMonth = dayjs().endOf("month");
return current.isBefore(minMonth, "month") || current.isAfter(maxMonth, "month");
};
function List(props) {
const [form] = Form.useForm();
const [configModalOpen, setConfigModalOpen] = useState(false);
const [currentRecord, setCurrentRecord] = useState(null);
const { tableProps, getData } = useTable(props["inCheckList"], {
const { tableProps, getData } = useTable(props["evaluationCorpPage"], {
form,
transform: (formData) => {
return {
...formData,
startTime: formData.time?.[0],
endTime: formData.time?.[1],
startTime: formData.time?.[0] ? formData.time?.[0] + " 00:00:00" :"",
endTime: formData.time?.[1] ? formData.time?.[1] + " 23:59:59" :"",
};
},
@ -33,7 +60,7 @@ function List(props) {
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeCorpInfoName", label: "相关方名称" },
{ name: "corpinfoName", label: "相关方名称" },
{
name: "time",
label: "时间范围",
@ -46,33 +73,33 @@ function List(props) {
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目数", dataIndex: "projectName",render:(_, record) => (
{ title: "项目数", dataIndex: "projectCount",render:(_, record) => (
<Button
type="link"
// disabled={ !(props.permission(props.xmsbtn && "jgd-xgfzhkpgl-xms"))}
disabled={ !(props.permission(props.xmsbtn || "jgd-xgfzhkpgl-xms"))}
onClick={() => {
props.history.push(`./ProjectList?id=${record.id}`);
props.history.push(`./ProjectList?corpinfoId=${record.corpinfoId}`);
}}
>
{record.projectName}
{record.projectCount}
</Button>
) },
{ title: "已验收/隐患数", dataIndex: "manageDeptName",render:(_, record) => (
<Button
type="link"
// disabled={ !(props.permission(props.yhsbtn && "jgd-xgfzhkpgl-yhs"))}
disabled={ !(props.permission(props.yhsbtn || "jgd-xgfzhkpgl-yhs"))}
onClick={() => {
props.history.push(`./HiddenList?id=${record.id}`);
props.history.push(`./HiddenList?corpinfoId=${record.corpinfoId}`);
}}
>
{record.manageDeptName}
{ `${record.rectifiedHiddenCount}/${record.totalHiddenCount}` }
</Button>
) },
{ title: "处罚金处罚次数", dataIndex: "qualificationsTypeName" },
{ title: "处罚金总额(元)", dataIndex: "companyName" },
{ title: "处罚金处罚次数", dataIndex: "penaltyTimes" },
{ title: "处罚金总额(元)", dataIndex: "totalPenaltyAmount" },
{
title: "已缴纳金额(元)",
dataIndex: "projectStatus",
dataIndex: "paidAmount",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
@ -81,7 +108,7 @@ function List(props) {
width: 150,
render: (_, record) => (
<Space>
{/*{props.permission(props.pfbtn) && (*/}
{props.permission(props.pfbtn) && (
<Button
type="link"
onClick={() => {
@ -91,17 +118,17 @@ function List(props) {
>
评分
</Button>
{/*)}*/}
{/*{props.permission(props.dflbbtn || "jgd-xgfzhkpgl-dflb") && (*/}
)}
{props.permission(props.dflbbtn || "jgd-xgfzhkpgl-dflb") && (
<Button
type="link"
onClick={() => {
props.history.push(`./ScoreList?id=${record.id}`);
props.history.push(`./ScoreList?corpinfoId=${record.corpinfoId}`);
}}
>
得分列表
</Button>
{/*)}*/}
)}
</Space>
),
},
@ -113,9 +140,7 @@ function List(props) {
&& (
<AddModal
currentData={currentRecord}
requestEdit={props["keyProjectAlgorithmItemEdit"]}
requestTypeList={props["algorithmListAll"]}
requestListItemByCamera={props["listItemByCamera"]}
evaluationAdd={props["evaluationAdd"]}
open={configModalOpen}
onCancel={() => {
setConfigModalOpen(false);
@ -131,13 +156,26 @@ function List(props) {
function AddModalComponent(props) {
const [form] = Form.useForm();
useEffect(() => {
console.log(props);
},[])
const splitYearMonth =(dateStr)=> {
const [year, month] = dateStr.split('-');
return { year, month };
}
const onCancel = () => {
form.resetFields();
props.onCancel();
};
const onSubmit = async (values) => {
const res = await props.requestEdit(submitValues);
values.corpinfoId = props.currentData.corpinfoId;
values.corpinfoName = props.currentData.corpinfoName;
const result = splitYearMonth(values.tims)
values.year = result.year;
values.month = result.month;
const res = await props.evaluationAdd(values);
if (res?.success) {
onCancel();
props.getData();
@ -163,22 +201,27 @@ function AddModalComponent(props) {
options={[
{
name: "algorithmTypeIds",
name: "tims",
label: "评分阶段",
render:FORM_ITEM_RENDER_ENUM.DATE_MONTH,
span: 24,
componentProps: {
disabledDate: disabledEvaluationMonth,
},
},
{
name: "score",
label: "项目分数",
render:FORM_ITEM_RENDER_ENUM.NUMBER,
render:FORM_ITEM_RENDER_ENUM.INTEGER,
useConstraints: false,
componentProps:{
max:"100",
min:"1",
step:"1",
max: 100,
min: 1,
precision: 0,
step: 1,
},
rules: [{ validator: validatorScore }],
span: 24,
},
{
@ -196,4 +239,4 @@ function AddModalComponent(props) {
}
const AddModal = AddModalComponent;
export default Connect([NS_QUALIFICATION_STATISTICS], true)(Permission(List));
export default Connect([NS_EVALUATION], true)(Permission(List));

View File

@ -11,17 +11,20 @@ import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_ONELEVEL_STATUS_MAP, PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
import {NS_EVALUATION, NS_QUALIFICATION_STATISTICS} from "~/enumerate/namespace";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
function ProjectList(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
const query = useGetUrlQuery();
const { tableProps, getData } = useTable(props["projectPageNoPermission"], {
form,
usePermission:false,
useStorageQueryCriteria:false,
// params: {
// noneCompleted: props.noneCompleted ? props.noneCompleted : 2,
// },
params: {
eqCorpinfoId: query.corpinfoId,
eqProjectStatus:4,
},
});
@ -54,7 +57,6 @@ function ProjectList(props) {
width: 120,
render: (_, record) => (
<Space>
{/*{props.permission(props.ckbtn || "jgd-xgfzhkpgl-xmlb-info") && (*/}
<Button
type="link"
onClick={() => {
@ -63,8 +65,6 @@ function ProjectList(props) {
>
查看
</Button>
{/*)}*/}
</Space>
),
},
@ -77,4 +77,4 @@ function ProjectList(props) {
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(Permission(ProjectList));
export default Connect([NS_EVALUATION], true)(Permission(ProjectList));

View File

@ -5,18 +5,22 @@ 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_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
import {NS_EVALUATION} from "~/enumerate/namespace";
import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
function ScoreList(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
const query = useGetUrlQuery();
const { tableProps, getData } = useTable(props["evaluationList"], {
form,
usePermission:false,
useStorageQueryCriteria:false,
transform: (formData) => {
return {
...formData,
eqCorpinfoId: query.corpinfoId,
};
},
@ -26,7 +30,7 @@ function ScoreList(props) {
<Search
options={[
{
name: "time",
name: "eqYear",
label: "选择年份",
render: FORM_ITEM_RENDER_ENUM.DATE_YEAR,
},
@ -35,15 +39,16 @@ function ScoreList(props) {
onFinish={getData}
/>
<Table
options={false}
columns={[
{ title: "年份", dataIndex: "corpinfoName" },
{ title: "月份", dataIndex: "projectName"},
{ title: "年份", dataIndex: "year" },
{ title: "月份", dataIndex: "month"},
{ title: "主管部门", dataIndex: "qualificationsTypeName" },
{ title: "评分人员", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "departmentName" },
{ title: "评分人员", dataIndex: "userName" },
{
title: "得分",
dataIndex: "projectStatus",
dataIndex: "score",
}
]}
{...tableProps}
@ -52,4 +57,4 @@ function ScoreList(props) {
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(Permission(ScoreList));
export default Connect([NS_EVALUATION], true)(Permission(ScoreList));

View File

@ -1,4 +1,4 @@
// import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import Page from "zy-react-library/components/Page";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
@ -7,7 +7,7 @@ function HiddenView() {
return (
<Page headerTitle={query.history === "1" ? "过程记录" : "查看"} contentPadding="0 20px 20px 20px">
{/*<HiddenInfo history={query.history === "1"} />*/}
<HiddenInfo history={query.history === "1"} />
</Page>
);
}

View File

@ -142,7 +142,7 @@ function ViewInfo(props) {
{ label: "公司名称", children: corpInfoData.corpName },
{ label: "企业状态", children: (corpInfoData.corpStateName) ? corpInfoData.corpStateName : "-" },
{ label: "开户人", children: corpInfoData.createName },
{ label: "统一社会信代码", children: corpInfoData.code },
{ label: "统一社会信代码", children: corpInfoData.code },
{ label: "属地", children: corpInfoData.cityName },
{
label: "所属行业",