0814 需求变更

master
LiuJiaNan 2026-08-19 15:03:33 +08:00
parent c4b03a723f
commit c5930682ad
11 changed files with 175 additions and 106 deletions

View File

@ -23,3 +23,11 @@ export const evaluationTeamConfigChangeLog = declareRequest(
export const corpInfoList = declareRequest(
`Get > /basicInfo/corpInfo/listAll`,
);
export const setEvaluationTeamConfigOpenFlag = declareRequest(
"evaluationTeamConfigLoading",
`Post > @/hiddenEvaluation/evaluationGlobalConfig/openFlag`,
);
export const getEvaluationTeamConfigOpenFlag = declareRequest(
"evaluationTeamConfigLoading",
`Get > /hiddenEvaluation/evaluationGlobalConfig/openFlag`,
);

View File

@ -1,5 +1,5 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Modal } from "antd";
import { Button, Descriptions, Divider, Modal } from "antd";
import { useEffect, useState } from "react";
import { getLabelName } from "zy-react-library/utils";
import { EVALUATION_IS_COMPLIANT_ENUM } from "~/enumerate/constant";
@ -21,6 +21,15 @@ const ViewEvaluationModal = (props) => {
getData();
}, []);
if (props.inline) {
return (
<>
<Divider orientation="left">考评信息</Divider>
<Detail list={list} />
</>
);
}
return (
<Modal
title="考评详情"
@ -34,23 +43,29 @@ const ViewEvaluationModal = (props) => {
</Button>,
]}
>
<Descriptions
column={2}
bordered
styles={{ label: { width: 150 } }}
items={[
...list.flatMap(item => ([
{ label: "考评人员", children: `${item.evaluationDeptName}-${item.evaluationUserName}` },
{
label: "是否符合",
children: getLabelName({ list: EVALUATION_IS_COMPLIANT_ENUM, status: item.isCompliant }) || "未考评",
},
...(String(item.isCompliant) === "0" ? [{ label: "不符合原因", children: item.nonCompliantReason, span: 2 }] : []),
])),
]}
/>
<Detail list={list} />
</Modal>
);
};
const Detail = ({ list }) => {
return (
<Descriptions
column={2}
bordered
styles={{ label: { width: 150 } }}
items={[
...list.flatMap(item => ([
{ label: "考评人员", children: `${item.evaluationDeptName}-${item.evaluationUserName}` },
{
label: "是否符合",
children: getLabelName({ list: EVALUATION_IS_COMPLIANT_ENUM, status: item.isCompliant }) || "未考评",
},
...(String(item.isCompliant) === "0" ? [{ label: "不符合原因", children: item.nonCompliantReason, span: 2 }] : []),
])),
]}
/>
);
};
export default Connect([NS_HIDDEN_EVALUATION], true)(ViewEvaluationModal);

View File

@ -1,12 +1,7 @@
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import Page from "zy-react-library/components/Page";
import HiddenViewPage from "~/pages/Container/Supervision/HiddenEvaluation/HiddenView";
function HiddenView() {
return (
<Page headerTitle="查看" contentPadding="0 20px 20px 20px">
<HiddenInfo />
</Page>
);
function HiddenView(props) {
return (<HiddenViewPage {...props} />);
}
export default HiddenView;

View File

@ -1,12 +1,7 @@
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import Page from "zy-react-library/components/Page";
import HiddenViewPage from "~/pages/Container/Supervision/PersonnelEvaluation/HiddenView";
function HiddenView() {
return (
<Page headerTitle="查看" contentPadding="0 20px 20px 20px">
<HiddenInfo />
</Page>
);
function HiddenView(props) {
return (<HiddenViewPage {...props} />);
}
export default HiddenView;

View File

@ -1,6 +1,6 @@
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, message, Modal, Space } from "antd";
import { Button, Descriptions, message, Modal, Space, Switch } from "antd";
import { useEffect, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
@ -33,11 +33,35 @@ function List(props) {
const [addModalOpen, setAddModalOpen] = useState(false);
const [viewModalOpen, setViewModalOpen] = useState(false);
const [changeLogModalOpen, setChangeLogModalOpen] = useState(false);
const [isEvaluationClosed, setIsEvaluationClosed] = useState(false);
const { tableProps, getData } = useTable(props["evaluationTeamConfigList"], {
form,
});
const getEvaluationTeamConfigOpenFlag = async () => {
const { data } = await props["getEvaluationTeamConfigOpenFlag"]();
setIsEvaluationClosed(data);
};
useEffect(() => {
getEvaluationTeamConfigOpenFlag();
}, []);
const setEvaluationTeamConfigOpenFlag = (checked) => {
Modal.confirm({
title: "提示",
content: checked ? "是否要关闭考评?打开前考评人员不可操作" : "是否要打开考评?打开后考评人员可操作",
onOk: async () => {
const { success } = await props["setEvaluationTeamConfigOpenFlag"]({ openFlag: +checked });
if (success) {
message.success("操作成功");
getEvaluationTeamConfigOpenFlag();
}
},
});
};
return (
<Page isShowAllAction={false}>
<Search
@ -51,6 +75,17 @@ function List(props) {
<Table
toolBarRender={() => (
<Space>
{props.permission("gfd-kpzpz-set") && (
<div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
<span>是否关闭考评</span>
<Switch
value={isEvaluationClosed}
checkedChildren="是"
unCheckedChildren="否"
onChange={setEvaluationTeamConfigOpenFlag}
/>
</div>
)}
{props.permission("gfd-kpzpz-add") && (
<Button
type="primary"

View File

@ -13,15 +13,15 @@ import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import ViewEvaluationModal from "~/components/ViewEvaluationModal";
import { EVALUATION_IS_COMPLIANT_ENUM, EVALUATION_RESULT_ENUM } from "~/enumerate/constant";
import { NS_HIDDEN_EVALUATION } from "~/enumerate/namespace";
import { NS_EVALUATION_TEAM_CONFIG, NS_HIDDEN_EVALUATION } from "~/enumerate/namespace";
function HiddenList(props) {
const query = useGetUrlQuery();
const [viewEvaluationModalOpen, setViewEvaluationModalOpen] = useState(false);
const [evaluationModalOpen, setEvaluationModalOpen] = useState(false);
const [currentHiddenId, setCurrentHiddenId] = useState("");
const [isEvaluationClosed, setIsEvaluationClosed] = useState(false);
const [form] = Search.useForm();
const { tableProps, getData } = useTable(props["hiddenEvaluationHiddenList"], {
form,
@ -37,6 +37,15 @@ function HiddenList(props) {
}),
});
const getEvaluationTeamConfigOpenFlag = async () => {
const { data } = await props["getEvaluationTeamConfigOpenFlag"]();
setIsEvaluationClosed(data);
};
useEffect(() => {
getEvaluationTeamConfigOpenFlag();
}, []);
return (
<Page headerTitle="分公司考评隐患">
<Search
@ -93,30 +102,21 @@ function HiddenList(props) {
},
{
title: "操作",
width: 230,
width: 150,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./hiddenView?hiddenId=${record.hiddenId}&id=${record.hiddenSnowFlakeId}`);
props.history.push(`./hiddenView?hiddenId=${record.hiddenId}&id=${record.hiddenSnowFlakeId}&corpinfoId=${query.corpinfoId}&evaluationType=${query.evaluationType}`);
}}
>
查看隐患详情
</Button>
<Button
type="link"
onClick={() => {
setViewEvaluationModalOpen(true);
setCurrentHiddenId(record.hiddenId);
}}
>
考评详情
查看
</Button>
{record.currentEvaluationFlag && (
<Button
disabled={record.finalResult === 2 || record.finalResult === 3}
disabled={record.finalResult === 2 || record.finalResult === 3 || isEvaluationClosed}
type="link"
onClick={() => {
setEvaluationModalOpen(true);
@ -132,17 +132,6 @@ function HiddenList(props) {
]}
{...tableProps}
/>
{viewEvaluationModalOpen
&& (
<ViewEvaluationModal
onCancel={() => {
setViewEvaluationModalOpen(false);
setCurrentHiddenId("");
}}
hiddenId={currentHiddenId}
query={query}
/>
)}
{evaluationModalOpen
&& (
<EvaluationModal
@ -263,4 +252,4 @@ const EvaluationModalComponent = (props) => {
};
const EvaluationModal = Connect([NS_HIDDEN_EVALUATION], true)(EvaluationModalComponent);
export default Connect([NS_HIDDEN_EVALUATION], true)(HiddenList);
export default Connect([NS_HIDDEN_EVALUATION, NS_EVALUATION_TEAM_CONFIG], true)(HiddenList);

View File

@ -1,10 +1,19 @@
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";
import ViewEvaluationModal from "~/components/ViewEvaluationModal";
function HiddenView() {
const query = useGetUrlQuery();
return (
<Page headerTitle="查看" contentPadding="0 20px 20px 20px">
<HiddenInfo />
<ViewEvaluationModal
inline
hiddenId={query.hiddenId}
query={query}
/>
</Page>
);
}

View File

@ -1,12 +1,7 @@
import HiddenInfo from "zy-react-library/components/HiddenInfo/gwj";
import Page from "zy-react-library/components/Page";
import HiddenViewPage from "../../PersonnelEvaluation/HiddenView";
function HiddenView() {
return (
<Page headerTitle="查看" contentPadding="0 20px 20px 20px">
<HiddenInfo />
</Page>
);
function HiddenView(props) {
return (<HiddenViewPage {...props} />);
}
export default HiddenView;

View File

@ -11,7 +11,6 @@ import { HIDDEN_SOURCE_ENUM, HIDDEN_STATE_ENUM } from "zy-react-library/enum/hid
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import ViewEvaluationModal from "~/components/ViewEvaluationModal";
import { EVALUATION_RESULT_ENUM } from "~/enumerate/constant";
import { NS_PERSONNEL_EVALUATION } from "~/enumerate/namespace";
@ -81,26 +80,17 @@ function HiddenExchangeList(props) {
},
{
title: "操作",
width: 230,
width: 100,
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./hiddenView?hiddenId=${record.hiddenId}&id=${record.hiddenSnowFlakeId}`);
props.history.push(`./hiddenView?hiddenId=${record.hiddenId}&id=${record.hiddenSnowFlakeId}&corpinfoId=${query.corpinfoId}&evaluationType=${query.evaluationType}`);
}}
>
查看隐患详情
</Button>
<Button
type="link"
onClick={() => {
setViewEvaluationModalOpen(true);
setCurrentHiddenId(record.hiddenId);
}}
>
考评详情
查看
</Button>
</Space>
),
@ -108,17 +98,6 @@ function HiddenExchangeList(props) {
]}
{...tableProps}
/>
{viewEvaluationModalOpen
&& (
<ViewEvaluationModal
onCancel={() => {
setViewEvaluationModalOpen(false);
setCurrentHiddenId("");
}}
hiddenId={currentHiddenId}
complete={true}
/>
)}
</Page>
);
}

View File

@ -1,10 +1,20 @@
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";
import ViewEvaluationModal from "~/components/ViewEvaluationModal";
function HiddenView() {
const query = useGetUrlQuery();
return (
<Page headerTitle="查看" contentPadding="0 20px 20px 20px">
<HiddenInfo />
<ViewEvaluationModal
inline
hiddenId={query.hiddenId}
query={query}
complete
/>
</Page>
);
}

View File

@ -13,11 +13,28 @@ import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { NS_HIDDEN_EVALUATION, NS_PERSONNEL_EVALUATION } from "~/enumerate/namespace";
const getRowKey = record => `${record.userId}-${record.evaluationType}`;
const getUserRowSpan = (dataSource, index) => {
if (!Number.isInteger(index) || !dataSource[index]) {
return 1;
}
const userId = dataSource[index].userId;
if (index > 0 && dataSource[index - 1]?.userId === userId) {
return 0;
}
let rowSpan = 1;
while (index + rowSpan < dataSource.length && dataSource[index + rowSpan].userId === userId) {
rowSpan += 1;
}
return rowSpan;
};
function UserExchangeList(props) {
const query = useGetUrlQuery();
const corpinfoId = props.corpinfoId || query.corpinfoId;
const { loading: downloadBlobLoading, downloadBlob } = useDownloadBlob();
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [selectedUserIds, setSelectedUserIds] = useState([]);
const [form] = Search.useForm();
const { tableProps, getData } = useTable(props["personnelEvaluationUserExchangeList"], {
form,
@ -25,9 +42,27 @@ function UserExchangeList(props) {
corpinfoId,
},
});
const selectedRowKeys = tableProps.dataSource
.filter(item => selectedUserIds.includes(item.userId))
.map(getRowKey);
// 仅合并当前页中连续的同一人员,避免不同人员因显示字段相同而被误合并。
const getUserCellProps = (_, index) => ({
rowSpan: getUserRowSpan(tableProps.dataSource, index),
});
// 同一人员会按考评类型返回多行,选择任意一行时按 userId 同步更新该人员的全部行。
const updateSelectedUserIds = (records, selected) => {
const userIds = new Set(records.map(item => item.userId));
setSelectedUserIds((currentUserIds) => {
if (selected) {
return [...new Set([...currentUserIds, ...userIds])];
}
return currentUserIds.filter(userId => !userIds.has(userId));
});
};
const onBatchExchange = async () => {
if (!selectedRowKeys.length) {
if (!selectedUserIds.length) {
message.warning("请选择需要兑换的人员");
return;
}
@ -35,7 +70,7 @@ function UserExchangeList(props) {
title: "兑换确认",
content: "确定要兑换吗?",
onOk: async () => {
const success = await props["personnelEvaluationExchange"]({ userIdList: selectedRowKeys });
const success = await props["personnelEvaluationExchange"]({ userIdList: selectedUserIds });
if (success) {
message.success("兑换成功");
getData();
@ -53,7 +88,7 @@ function UserExchangeList(props) {
onOk: async () => {
const { data } = await props["personnelEvaluationUserExchangeList"]({ corpinfoId, ...form.getFieldsValue(), pageIndex: 1, pageSize: 9999 });
const success = await props["personnelEvaluationExchange"]({
userIdList: data.map(item => item.userId),
userIdList: [...new Set(data.map(item => item.userId))],
});
if (success) {
message.success("兑换成功");
@ -66,7 +101,7 @@ function UserExchangeList(props) {
});
};
const onExportExcel = async () => {
if (!selectedRowKeys.length) {
if (!selectedUserIds.length) {
message.warning("请选择需要导出的人员");
return;
}
@ -74,7 +109,7 @@ function UserExchangeList(props) {
title: "导出确认",
content: "确定要导出excel吗",
onOk: async () => {
await downloadBlob("/hiddenEvaluation/hiddenEvaluationRecord/exportUserEvalStatisticsPage", { params: { corpinfoId, ids: selectedRowKeys } });
await downloadBlob("/hiddenEvaluation/hiddenEvaluationRecord/exportUserEvalStatisticsPage", { params: { corpinfoId, ids: selectedUserIds } });
message.success("导出成功");
},
onCancel: () => {
@ -104,12 +139,15 @@ function UserExchangeList(props) {
!props.corpinfoId && {
preserveSelectedRowKeys: true,
selectedRowKeys,
onChange: (selectedRowKeys) => {
setSelectedRowKeys(selectedRowKeys);
onSelect: (record, selected) => {
updateSelectedUserIds([record], selected);
},
onSelectAll: (selected, _, changeRows) => {
updateSelectedUserIds(changeRows, selected);
},
}
}
rowKey="userId"
rowKey={getRowKey}
toolBarRender={() => (
props.entrance !== "enterprise" && (
<Space>
@ -141,10 +179,11 @@ function UserExchangeList(props) {
)
)}
columns={[
{ title: "用户名", dataIndex: "userName" },
{ title: "姓名", dataIndex: "name" },
{ title: "部门", dataIndex: "departmentName" },
{ title: "岗位", dataIndex: "postName" },
{ title: "用户名", dataIndex: "userName", onCell: getUserCellProps },
{ title: "姓名", dataIndex: "name", onCell: getUserCellProps },
{ title: "部门", dataIndex: "departmentName", onCell: getUserCellProps },
{ title: "岗位", dataIndex: "postName", onCell: getUserCellProps },
{ title: "隐患考评组类型", dataIndex: "evaluationTypeName" },
{ title: "奖励总得分", dataIndex: "totalScore" },
{ title: "已兑换分数", dataIndex: "exchangedScore" },
{ title: "未兑换奖励数", dataIndex: "notExchangedScore" },