From 7149aeb4d6e58c318825aa4b759753c95f06de33 Mon Sep 17 00:00:00 2001 From: yunkexin <760754045@qq.com> Date: Mon, 13 Oct 2025 08:42:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E3=80=81=E5=A4=A7=E5=B1=8F=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/Header.js | 2 +- src/layout/Sider.js | 3 +- src/routes/GroupHome.js | 683 +++++++++++++++++++++++++--------------- 3 files changed, 439 insertions(+), 249 deletions(-) diff --git a/src/layout/Header.js b/src/layout/Header.js index 75232eb..509a2c9 100644 --- a/src/layout/Header.js +++ b/src/layout/Header.js @@ -554,7 +554,7 @@ function Header(props) { {!props.matchLogin ? (
{/* */} - + {/* */} {/* {window.location.host == "121.41.2.71:8001" ? : ""} */} diff --git a/src/layout/Sider.js b/src/layout/Sider.js index 6f9f022..a2ce73d 100644 --- a/src/layout/Sider.js +++ b/src/layout/Sider.js @@ -266,6 +266,7 @@ const Sider = (props) => { 首页 + {localStorage.getItem("webOrgId") == '00300000-0000-0000-0000-000000000000'? {/* { /> */} 可视化大屏 - + :null} ( - - - this.showEditModal( - record.SOURCE_DATA_ID, - record.SOURCE_FORMCODE, - record.ID, - record.NOTICE_TITLE - ) - } - > - {record.NOTICE_TITLE} - - - ), - }, - { - title: "开始时间", - dataIndex: "TASK_STARTDT", - key: "TASK_STARTDT", - }, - { - title: "结束时间", - dataIndex: "TASK_ENDDT", - key: "TASK_ENDDT", - }, - { - title: "预警状态", - dataIndex: "NOTICE_TYPE", - key: "NOTICE_TYPE", - render: (text, record) => this.ShowState(record), - }, - ]; - this.getTeam(); - //定时器功能,暂时不开启 - this.timerID = setInterval( - () => this.getBaseInfoData(1, this.state.tableKey, 5), - 120000 - ); - this.showModalSign(); - this.getBaseInfoData(1, 1, 5); - this.setMessageData(); - this.state.scoreNoneColumns = [ - { + this.setState({ + columns: [ + { + width: "450px", + title: "任务名称", + dataIndex: "NOTICE_TITLE", + key: "NOTICE_TITLE", + render: (text, record) => ( + + + this.showEditModal( + record.SOURCE_DATA_ID, + record.SOURCE_FORMCODE, + record.ID, + record.NOTICE_TITLE + ) + } + > + {record.NOTICE_TITLE} + + + ), + }, + { + title: "开始时间", + dataIndex: "TASK_STARTDT", + key: "TASK_STARTDT", + }, + { + title: "结束时间", + dataIndex: "TASK_ENDDT", + key: "TASK_ENDDT", + }, + { + title: "预警状态", + dataIndex: "NOTICE_TYPE", + key: "NOTICE_TYPE", + render: (text, record) => this.ShowState(record), + }, + ], + scoreNoneColumns: [{ width: "80px", title: "生产单元", dataIndex: "Nav_ProductionUnit.NAME", @@ -339,149 +337,279 @@ class GroupHome extends React.Component { })} ), + }], + scoreColumns: [ + { + width: "80px", + title: "生产单元", + dataIndex: "Nav_ProductionUnit.NAME", + key: "Nav_ProductionUnit.NAME", + }, + { + width: "80px", + title: "一级要素", + dataIndex: "Nav_Primary.NAME", + key: "Nav_Primary.NAME", + }, + { + width: "80px", + title: "二级要素", + dataIndex: "Nav_Second.NAME", + key: "Nav_Second.NAME", + }, + { + width: "80px", + title: "三级要素", + dataIndex: "Nav_Three.NAME", + key: "Nav_Three.NAME", + }, + { + width: "50px", + title: "考评项目", + dataIndex: "EVALUATION_ITEM", + key: "EVALUATION_ITEM", + render: (text, record) => ( + + { + this.props.app.enums?.PEEvaluationItemEnum.enums[ + record.EVALUATION_ITEM + ] + } + + ), + }, + { + // width: "500px", + title: "考评内容", + dataIndex: "CONTENTS", + key: "CONTENTS", + }, + { + width: "100px", + title: "评分办法", + dataIndex: "DESCRIPTION", + key: "DESCRIPTION", + }, + { + width: "50px", + title: "标准分", + dataIndex: "STANDARDIZED_SCORE", + key: "STANDARDIZED_SCORE", + }, + { + width: "50px", + title: "实得分", + dataIndex: "RESULT_SCORE", + key: "RESULT_SCORE", + }, + { + width: "200px", + title: "不符合说明", + dataIndex: "NON_CONFORMANCE", + key: "NON_CONFORMANCE", + }, + , + { + width: "80px", + title: "评价结论", + dataIndex: "EVALUATION_RESULT", + key: "EVALUATION_RESULT", + render: (text, record) => ( + + { + this.props.app.enums?.PEEvaluationResultEnum.enums[ + record.EVALUATION_RESULT + ] + } + + ), + }, + { + width: "100px", + title: "评价方法", + dataIndex: "Nav_EvaluationMethod", + key: "Nav_EvaluationMethod", + render: (text, record) => ( + + {record.Nav_EvaluationMethod && + record.Nav_EvaluationMethod?.map((item, i) => { + return ( + + + + ); + })} + + ), + }, + ], + scoreTotalColumns: [ + { + title: "生产单元", + dataIndex: "Nav_ProductionUnit.NAME", + key: "Nav_ProductionUnit.NAME", + }, + { + title: "标准化得分", + dataIndex: "NON_STANDARDIZED_SCORE", + key: "NON_STANDARDIZED_SCORE", + }, + { + title: "操作", + dataIndex: "", + key: "", + render: (text, record) => ( + + { + + {" "} + + + + } + + ), + }, + ] + }) + this.getTeam(); + this.getHomeTitle() + //定时器功能,暂时不开启 + this.timerID = setInterval( + () => { + if (this._isMounted) { + this.getBaseInfoData(1, this.state.tableKey, 5) + } }, - ]; - this.state.scoreColumns = [ - { - width: "80px", - title: "生产单元", - dataIndex: "Nav_ProductionUnit.NAME", - key: "Nav_ProductionUnit.NAME", - }, - { - width: "80px", - title: "一级要素", - dataIndex: "Nav_Primary.NAME", - key: "Nav_Primary.NAME", - }, - { - width: "80px", - title: "二级要素", - dataIndex: "Nav_Second.NAME", - key: "Nav_Second.NAME", - }, - { - width: "80px", - title: "三级要素", - dataIndex: "Nav_Three.NAME", - key: "Nav_Three.NAME", - }, - { - width: "50px", - title: "考评项目", - dataIndex: "EVALUATION_ITEM", - key: "EVALUATION_ITEM", - render: (text, record) => ( - - { - this.props.app.enums?.PEEvaluationItemEnum.enums[ - record.EVALUATION_ITEM - ] - } - - ), - }, - { - // width: "500px", - title: "考评内容", - dataIndex: "CONTENTS", - key: "CONTENTS", - }, - { - width: "100px", - title: "评分办法", - dataIndex: "DESCRIPTION", - key: "DESCRIPTION", - }, - { - width: "50px", - title: "标准分", - dataIndex: "STANDARDIZED_SCORE", - key: "STANDARDIZED_SCORE", - }, - { - width: "50px", - title: "实得分", - dataIndex: "RESULT_SCORE", - key: "RESULT_SCORE", - }, - { - width: "200px", - title: "不符合说明", - dataIndex: "NON_CONFORMANCE", - key: "NON_CONFORMANCE", - }, - , - { - width: "80px", - title: "评价结论", - dataIndex: "EVALUATION_RESULT", - key: "EVALUATION_RESULT", - render: (text, record) => ( - - { - this.props.app.enums?.PEEvaluationResultEnum.enums[ - record.EVALUATION_RESULT - ] - } - - ), - }, - { - width: "100px", - title: "评价方法", - dataIndex: "Nav_EvaluationMethod", - key: "Nav_EvaluationMethod", - render: (text, record) => ( - - {record.Nav_EvaluationMethod && - record.Nav_EvaluationMethod?.map((item, i) => { - return ( - - - - ); - })} - - ), - }, - ]; - this.state.scoreTotalColumns = [ - { - title: "生产单元", - dataIndex: "Nav_ProductionUnit.NAME", - key: "Nav_ProductionUnit.NAME", - }, - { - title: "标准化得分", - dataIndex: "NON_STANDARDIZED_SCORE", - key: "NON_STANDARDIZED_SCORE", - }, - { - title: "操作", - dataIndex: "", - key: "", - render: (text, record) => ( - - { - - {" "} - - - - } - - ), - }, - ]; + 120000 + ); + this.showModalSign(); + this.getBaseInfoData(1, 1, 5); + this.setMessageData(); + this.getNoticeData() } + componentWillUnmount() { - this.timerID && clearTimeout(this.timerID); + this._isMounted = false; // 组件卸载时设为false + if (this.timerID) { + clearInterval(this.timerID); + this.timerID = null; + } } + getNoticeData = () => { + const { currentNoticePage, noticePageSize, activeNoticeTab, mineType } = this.state; + const orgId = storage("lacal").getItem("webOrgId")?.val; + // 构建请求参数(按标签筛选:全部/集团/公司) + let json = initFilter(orgId, mineType); + extendRule(json, "pageNum", 1, currentNoticePage); + extendRule(json, "pageSize", 1, noticePageSize); + if (activeNoticeTab === "group") { + extendRule(json, "sourceType", 1, 1); // 1=集团发布 + } else if (activeNoticeTab === "company") { + extendRule(json, "sourceType", 1, 2); // 2=公司发布 + } + this.setState({ + noticeData: [ + { + id: "1", + title: "为表彰先进,树立榜样,激励广大员工积极进取,集团决定开展2023年度优秀员工评选工作...", + source: "集团发布", + date: "08-30", + readStatus: "未读", // 可选:未读/已读 + isImportant: true // 是否重要提醒 + }, + { + id: "2", + title: "根据国家法定节假日安排,结合公司实际情况,现将2023年国庆节放假安排通知如下...", + source: "公司发布", + date: "08-28", + readStatus: "已读", + isImportant: false + }, + { + id: "3", + title: "根据国家法定节假日安排,结合公司实际情况,现将2023年国庆节放假安排通知如下...", + source: "公司发布", + date: "08-28", + readStatus: "已读", + isImportant: false + }, + { + id: "4", + title: "根据国家法定节假日安排,结合公司实际情况,现将2023年国庆节放假安排通知如下...", + source: "公司发布", + date: "08-28", + readStatus: "已读", + isImportant: false + }, + { + id: "5", + title: "根据国家法定节假日安排,结合公司实际情况,现将2023年国庆节放假安排通知如下...", + source: "公司发布", + date: "08-28", + readStatus: "已读", + isImportant: false + }, + { + id: "6", + title: "根据国家法定节假日安排,结合公司实际情况,现将2023年国庆节放假安排通知如下...", + source: "公司发布", + date: "08-28", + readStatus: "已读", + isImportant: false + } + // 更多公告... + ], + totalNoticeCount: 10 // 公告总数 + }) + + // this.props.dispatch({ + // type: "app/getDataByPost", + // url: "PF/Notice/GetNoticeList", // 假设的公告列表接口,需替换为实际接口 + // payload: json, + // onlyData: false, + // onComplete: (data) => { + // if (data && data.IsSuccessful) { + // this.setState({ + // noticeData: data.Data.list, // 公告列表 + // totalNoticeCount: data.Data.total, // 公告总数 + // }); + // } + // }, + // }); + }; + // 公告页码切换 + changeNoticePage = (page) => { + const { totalNoticeCount, noticePageSize } = this.state; + // 边界判断:页码不能小于1,不能大于总页数 + if (page < 1 || page > Math.ceil(totalNoticeCount / noticePageSize)) return; + this.setState({ currentNoticePage: page }, () => { + this.getNoticeData(); // 切换页码后重新请求数据 + }); + }; + + // 公告标签切换(全部/集团发布/公司发布) + switchNoticeTab = (tabType) => { + this.setState({ + activeNoticeTab: tabType, + currentNoticePage: 1, // 切换标签时重置为第1页 + }, () => { + this.getNoticeData(); // 切换标签后重新请求数据 + }); + }; + + // 查看更多公告(跳转至公告详情页或展开全部) + viewMoreNotice = () => { + // 逻辑1:跳转至独立公告页面(推荐) + this.props.history.push({ pathname: "/noticeList", state: { tab: this.state.activeNoticeTab } }); + // 逻辑2:在当前页展开全部公告(备选) + // this.setState({ noticePageSize: this.state.totalNoticeCount }); + }; + showModalSign = () => { var userId = storage("lacal").getItem("userid")?.val; //登录后有存储登录信息 @@ -494,53 +622,38 @@ class GroupHome extends React.Component { url: "FM/User/UserSign", //验证是否有签名照 onComplete: (ret) => { //返回查询结果ret - if (ret) { + if (this._isMounted && ret) { //判断是否有记录 openNotification("topRight"); } }, }); }; + getHomeTitle = () => { + var orgId = storage("lacal").getItem("webOrgId")?.val; //登录后有存储登录信息 + let json = initFilter(orgId); + this.props.dispatch({ + type: "app/getDataByPost", + payload: json, + url: "PF/HomeTitle/OrderPaged", + onComplete: (ret) => { + if (this._isMounted && ret) { + this.setState({ + safetySloganOne: ret[0].TITLE, + // safetySloganOne: "1.安全方针:以人为本、关注健康、依法治企、安全发展。 2.安全理念:一切风险皆可控,一切事故皆可防!3.安全方针:以人为本、关注健康、依法治企、安全发展。4.安全方针:以人为本、关注健康、依法治企、安全发展。5.安全方针:以人为本、关注健康、依法治企、安全发展。 6.安全理念:一切风险皆可控,一切事故皆可防!7.安全方针:以人为本、关注健康、依法治企、安全发展。8.安全方针:以人为本、关注健康、依法治企、安全发展。", + animationDuration: ret[0].SECOND, + sliderColor: ret[0].COCOR, + sliderSize: ret[0].FONTSIZE + + }); + } + }, + }); + } getTeam = () => { var userId = storage("lacal").getItem("userid")?.val; //登录后有存储登录信息 var orgId = storage("lacal").getItem("webOrgId")?.val; //登录后有存储登录信息 - // 龙岩稀土 - if (orgId == "8f1cf418-8bf3-ea3f-7a6d-fc5d61247008") { - this.setState({ - safetySloganOne: "安全方针:以人为本、关注健康、依法治企、安全发展。", - }); - } - // 都昌金鼎 - else if (orgId == "8b3c41aa-51b1-7ce9-1879-248a038c1b5c") { - this.setState({ - safetySloganOne: "安全方针:安全第一,预防为主,科学管理,持续改进。", - mineType: localStorage.getItem("currentMineType") - }); - } - //洛阳豫璐 - else if (orgId == "d9871ba8-0eec-9e4a-bb87-7d5a540d8913") { - this.setState({ - safetySloganOne: "安全方针:科技、安全、环保、效益。", - }); - } - //博柏 - else if (orgId == "3efd5276-632b-e379-9ff3-7a7546591fca") { - this.setState({ - safetySloganOne: "安全方针:安全第一、综合治理、控制风险、科学发展", - mineType: localStorage.getItem("currentMineType") - }); - } - //行洛坑 - else { - this.setState({ - safetySloganOne: "安全方针:安全第一、综合治理、控制风险、科学发展", - mineType: localStorage.getItem("currentMineType") - }); - } - this.setState({ - safetySloganTwo: "安全理念:一切风险皆可控,一切事故皆可防!", - }); let json = initFilter(orgId); extendRule(json, "ID", 1, userId); extendInclude(json, "Nav_Department"); @@ -549,7 +662,7 @@ class GroupHome extends React.Component { payload: json, url: "FM/User/Get", onComplete: (ret) => { - if (ret && ret.Nav_Department) { + if (this._isMounted && ret && ret.Nav_Department) { this.setState({ departmentName: ret.Nav_Department.NAME, deparmentType: ret.Nav_Department.DEPARTMENT_TYPE, @@ -733,7 +846,7 @@ class GroupHome extends React.Component { payload: json, onlyData: false, onComplete: (re) => { - if (re && re.IsSuccessful && re.Data.newData) { + if (this._isMounted && re && re.IsSuccessful && re.Data.newData) { this.state.tableData[0].total = re.Data.todoCount; this.state.tableData[1].total = re.Data.timeOverCount; this.state.tableData[2].total = re.Data.doneCount; @@ -1389,9 +1502,9 @@ class GroupHome extends React.Component { ? "尾矿库" : this.state.mineType == 10 ? "选矿厂" - :this.state.mineType == 31 - ? "职能口": this.state.mineType == 32?"非金属" - : "露天矿"; + : this.state.mineType == 31 + ? "职能口" : this.state.mineType == 32 ? "非金属" + : "露天矿"; if (formCode == "BI054_HOMEDETAIL") { titleTemp += "安全检查次数统计(近12月)"; } else if (formCode == "BI055_HOMEDETAIL") { @@ -1450,6 +1563,9 @@ class GroupHome extends React.Component { className: styles.slideHeight, fade: true, }; + // 在render方法中添加动态样式计算 + const { safetySloganOne, animationDuration, sliderColor, sliderSize } = this.state; + const rowSelection = { onChange: (selectedRowKeys, selectedRows) => { this.state.taskSelects = selectedRows; @@ -1608,11 +1724,16 @@ class GroupHome extends React.Component {
-
+

- {this.state.safetySloganOne} -                    - {this.state.safetySloganTwo} + {safetySloganOne || '暂无公告'}

@@ -1997,7 +2118,75 @@ class GroupHome extends React.Component { /> ) : null}
- {/* */} + {/* 公告栏 */} + + {/*
+ +
+
+
+ 公告栏 + {this.state.noticeData.some(item => item.isImportant) && ( + 包含{this.state.noticeData.filter(item => item.isImportant).length}个重要提醒 + )} +
+
+ + + +
+ +
+ + + +
+ +
+
+
*/} From 5168e4a806e62b5a23e86cdb6bce646cf18f7011 Mon Sep 17 00:00:00 2001 From: yunkexin <760754045@qq.com> Date: Mon, 13 Oct 2025 13:32:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/GroupHome.js | 12 ++++++++++-- src/routes/Home.js | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/routes/GroupHome.js b/src/routes/GroupHome.js index fc23085..d577d68 100644 --- a/src/routes/GroupHome.js +++ b/src/routes/GroupHome.js @@ -638,10 +638,18 @@ class GroupHome extends React.Component { url: "PF/HomeTitle/OrderPaged", onComplete: (ret) => { if (this._isMounted && ret) { + const safetySlogan = ret[0].TITLE; + // 计算文本长度(中文按1个字符,英文/数字按0.5个字符计算) + const charCount = safetySlogan.replace(/[a-zA-Z0-9]/g, 'aa').length; + + // 设置基础速率:每4个字符需要1秒 + const baseSpeed = 4; + // 计算动画时间(最低5秒,最高60秒) + const duration = Math.max(5, Math.min(60, charCount / baseSpeed)); this.setState({ - safetySloganOne: ret[0].TITLE, + safetySloganOne: safetySlogan, // safetySloganOne: "1.安全方针:以人为本、关注健康、依法治企、安全发展。 2.安全理念:一切风险皆可控,一切事故皆可防!3.安全方针:以人为本、关注健康、依法治企、安全发展。4.安全方针:以人为本、关注健康、依法治企、安全发展。5.安全方针:以人为本、关注健康、依法治企、安全发展。 6.安全理念:一切风险皆可控,一切事故皆可防!7.安全方针:以人为本、关注健康、依法治企、安全发展。8.安全方针:以人为本、关注健康、依法治企、安全发展。", - animationDuration: ret[0].SECOND, + animationDuration: duration, sliderColor: ret[0].COCOR, sliderSize: ret[0].FONTSIZE diff --git a/src/routes/Home.js b/src/routes/Home.js index c6989ec..a5c0c73 100644 --- a/src/routes/Home.js +++ b/src/routes/Home.js @@ -522,10 +522,18 @@ class Home extends React.Component { url: "PF/HomeTitle/OrderPaged", onComplete: (ret) => { if (this._isMounted&&ret) { + const safetySlogan = ret[0].TITLE; + // 计算文本长度(中文按1个字符,英文/数字按0.5个字符计算) + const charCount = safetySlogan.replace(/[a-zA-Z0-9]/g, 'aa').length; + + // 设置基础速率:每4个字符需要1秒 + const baseSpeed = 4; + // 计算动画时间(最低5秒,最高60秒) + const duration = Math.max(5, Math.min(60, charCount / baseSpeed)); this.setState({ - safetySloganOne: ret[0].TITLE, + safetySloganOne: safetySlogan, // safetySloganOne: "1.安全方针:以人为本、关注健康、依法治企、安全发展。 2.安全理念:一切风险皆可控,一切事故皆可防!3.安全方针:以人为本、关注健康、依法治企、安全发展。4.安全方针:以人为本、关注健康、依法治企、安全发展。5.安全方针:以人为本、关注健康、依法治企、安全发展。 6.安全理念:一切风险皆可控,一切事故皆可防!7.安全方针:以人为本、关注健康、依法治企、安全发展。8.安全方针:以人为本、关注健康、依法治企、安全发展。", - animationDuration: ret[0].SECOND, + animationDuration: duration, sliderColor: ret[0].COCOR, sliderSize: ret[0].FONTSIZE