Merge remote-tracking branch 'origin/main'

This commit is contained in:
lSun 2026-02-06 11:10:34 +08:00
commit 9ce8d6ac89
16 changed files with 446 additions and 16 deletions

View File

@ -1,5 +1,6 @@
package com.bonus.bmw.homePage.controller; package com.bonus.bmw.homePage.controller;
import com.bonus.bmw.homePage.entity.SevenNotAttWorkerBean;
import com.bonus.bmw.homePage.entity.WorkerMsgDetailBean; import com.bonus.bmw.homePage.entity.WorkerMsgDetailBean;
import com.bonus.bmw.homePage.service.HomeSubPageService; import com.bonus.bmw.homePage.service.HomeSubPageService;
import com.bonus.common.core.table.PageTableRequest; import com.bonus.common.core.table.PageTableRequest;
@ -107,4 +108,12 @@ public class HomeSubPageController {
return service.getWorkerMsgDetail(bean); return service.getWorkerMsgDetail(bean);
} }
@Log(title = "首页-七天未打卡详情页面", businessType = BusinessType.SELECT)
@PostMapping("getSevenNotAttWorker")
// @RequiresPermissions("sys:collectReturn:query")
public PageTableResponse getSevenNotAttWorker(PageTableRequest request){
return service.getSevenNotAttWorker(request);
}
} }

View File

@ -90,4 +90,10 @@ public interface HomePageDao {
void insertProRankCache(List<ProMsgBean> rankList); void insertProRankCache(List<ProMsgBean> rankList);
List<ProMsgBean> getProRankCache(ProMsgBean o); List<ProMsgBean> getProRankCache(ProMsgBean o);
/**
* 七天未打卡
* @return
*/
int getSevenDayNotAttWorker(@Param("subComId") String subComId);
} }

View File

@ -1,9 +1,6 @@
package com.bonus.bmw.homePage.dao; package com.bonus.bmw.homePage.dao;
import com.bonus.bmw.homePage.entity.BuildProBean; import com.bonus.bmw.homePage.entity.*;
import com.bonus.bmw.homePage.entity.CertificateReadBean;
import com.bonus.bmw.homePage.entity.CollectBean;
import com.bonus.bmw.homePage.entity.WorkerMsgDetailBean;
import com.bonus.bmw.person.entity.ContractBean; import com.bonus.bmw.person.entity.ContractBean;
import com.bonus.bmw.person.entity.MapBean; import com.bonus.bmw.person.entity.MapBean;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -44,4 +41,11 @@ public interface HomeSubPageDao {
* @return * @return
*/ */
List<CollectBean> selectCollect(CollectBean bean); List<CollectBean> selectCollect(CollectBean bean);
/**
* 七天未打卡
* @param params
* @return
*/
List<SevenNotAttWorkerBean> getSevenNotAttWorker(@Param("params") Map<String, Object> params);
} }

View File

@ -172,4 +172,6 @@ public class HomePageBean {
private String proGeneralName; private String proGeneralName;
@Excel(name = "专业工程数量") @Excel(name = "专业工程数量")
private String proNum; private String proNum;
//七天未打卡
private int sevenDayNotAttWorker;
} }

View File

@ -0,0 +1,82 @@
package com.bonus.bmw.homePage.entity;
import com.bonus.bmw.getplan.entity.InfDayPlanFillContentBean;
import com.bonus.bmw.person.entity.ContractBean;
import com.bonus.bmw.team.entity.LightStatusBean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
/**
* 在建 bean
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class SevenNotAttWorkerBean {
/**
* 工程id
*/
private Integer proId;
/**
* 工程名
*/
private String proName;
/**
* 分包单位id
*/
private Integer subId;
/**
* 分包单位名称
*/
private String subName;
/**
* 班组id
*/
private Integer teamId;
/**
* 班组name
*/
private String teamName;
/**
* 人员姓名
*/
private String name;
/**
* 身份证
*/
private String idNumber;
/**
* 岗位id
*/
private String postId;
/**
* 岗位
*/
private String postName;
/**
* 入场时间
*/
private String einTime;
/**
* 最新打卡时间
*/
private String lastClockDay;
}

View File

@ -47,11 +47,14 @@ public class HomePageServiceImpl implements HomePageService {
@Override @Override
public HomePageBean getDataOverview(HomePageBean o) { public HomePageBean getDataOverview(HomePageBean o) {
List<HomePageBean> list = dao.getHomeCacheData(o); List<HomePageBean> list = dao.getHomeCacheData(o);
//七天未打卡 20260205
HomePageBean homePageBean = new HomePageBean(); HomePageBean homePageBean = new HomePageBean();
if (list.size() > 0) { int num = dao.getSevenDayNotAttWorker(o.getSubComId());
if (!list.isEmpty()) {
homePageBean.setUpdateTime(list.get(0).getUpdateTime()); homePageBean.setUpdateTime(list.get(0).getUpdateTime());
if (list.size() == 1) { if (list.size() == 1) {
homePageBean = list.get(0); homePageBean = list.get(0);
homePageBean.setSevenDayNotAttWorker(num);
} else { } else {
//总工程数 //总工程数
Integer proGeneralNum = dao.getProGeneralNum(o); Integer proGeneralNum = dao.getProGeneralNum(o);
@ -98,6 +101,7 @@ public class HomePageServiceImpl implements HomePageService {
homePageBean.setMediumRiskNum(mediumRiskNum); homePageBean.setMediumRiskNum(mediumRiskNum);
homePageBean.setLowRiskNum(lowRiskNum); homePageBean.setLowRiskNum(lowRiskNum);
homePageBean.setPlanAttNum(planAttNum); homePageBean.setPlanAttNum(planAttNum);
homePageBean.setSevenDayNotAttWorker(num);
} }
} }
return homePageBean; return homePageBean;

View File

@ -1,5 +1,6 @@
package com.bonus.bmw.homePage.service; package com.bonus.bmw.homePage.service;
import com.bonus.bmw.homePage.entity.SevenNotAttWorkerBean;
import com.bonus.bmw.homePage.entity.WorkerMsgDetailBean; import com.bonus.bmw.homePage.entity.WorkerMsgDetailBean;
import com.bonus.common.core.table.PageTableRequest; import com.bonus.common.core.table.PageTableRequest;
import com.bonus.common.core.table.PageTableResponse; import com.bonus.common.core.table.PageTableResponse;
@ -17,4 +18,6 @@ public interface HomeSubPageService {
PageTableResponse getDayPlanMsg(PageTableRequest request); PageTableResponse getDayPlanMsg(PageTableRequest request);
WorkerMsgDetailBean getWorkerMsgDetail(WorkerMsgDetailBean bean); WorkerMsgDetailBean getWorkerMsgDetail(WorkerMsgDetailBean bean);
PageTableResponse getSevenNotAttWorker(PageTableRequest request);
} }

View File

@ -4,10 +4,7 @@ import cn.hutool.core.date.DateUtil;
import com.bonus.bmw.getplan.entity.InfDayPlanFillContentBean; import com.bonus.bmw.getplan.entity.InfDayPlanFillContentBean;
import com.bonus.bmw.getplan.service.GetPlanInnerService; import com.bonus.bmw.getplan.service.GetPlanInnerService;
import com.bonus.bmw.homePage.dao.HomeSubPageDao; import com.bonus.bmw.homePage.dao.HomeSubPageDao;
import com.bonus.bmw.homePage.entity.BuildProBean; import com.bonus.bmw.homePage.entity.*;
import com.bonus.bmw.homePage.entity.CertificateReadBean;
import com.bonus.bmw.homePage.entity.CollectBean;
import com.bonus.bmw.homePage.entity.WorkerMsgDetailBean;
import com.bonus.bmw.person.entity.ContractBean; import com.bonus.bmw.person.entity.ContractBean;
import com.bonus.bmw.person.entity.MapBean; import com.bonus.bmw.person.entity.MapBean;
import com.bonus.bmw.planData.entity.InDayPlanPersonBean; import com.bonus.bmw.planData.entity.InDayPlanPersonBean;
@ -341,6 +338,47 @@ public class HomeSubPageServiceImpl implements HomeSubPageService {
return o; return o;
} }
@Override
public PageTableResponse getSevenNotAttWorker(PageTableRequest request) {
try{
Map<String, Object> params = request.getParams();
// String proName = (String) params.get("proName");
List<SevenNotAttWorkerBean> list = dao.getSevenNotAttWorker(params);
return new PageTableHandler(new PageTableHandler.CountHandler() {
@Override
public int count(PageTableRequest request1) {
return list.size();
}
}, new PageTableHandler.ListHandler() {
@Override
public List<SevenNotAttWorkerBean> list(PageTableRequest request1) {
List<SevenNotAttWorkerBean> beanList;
Integer offset = request.getOffset();
Integer limit = request.getLimit();
if ((offset + limit) < list.size()) {
beanList = list.subList(offset, offset + limit);
} else {
beanList = list.subList(offset, list.size());
}
return beanList;
}
}).handle(request);
}catch (Exception e){
log.error(e.getMessage(),e);
return new PageTableHandler(new PageTableHandler.CountHandler() {
@Override
public int count(PageTableRequest request1) {
return 0;
}
}, new PageTableHandler.ListHandler() {
@Override
public List<SevenNotAttWorkerBean> list(PageTableRequest request1) {
return null;
}
}).handle(request);
}
}
public List<PlanWorkerBean> collectPlan(Map<String, Object> params, List<PlanWorkerBean> list){ public List<PlanWorkerBean> collectPlan(Map<String, Object> params, List<PlanWorkerBean> list){
if (StringUtils.isNotEmpty((String) params.get("userId"))) { if (StringUtils.isNotEmpty((String) params.get("userId"))) {
List<CollectBean> listCollect = Optional.ofNullable(dao.selectCollect( List<CollectBean> listCollect = Optional.ofNullable(dao.selectCollect(

View File

@ -623,4 +623,31 @@
</if> </if>
</where> </where>
</select> </select>
</mapper>
<select id="getSevenDayNotAttWorker" resultType="int">
SELECT
COUNT(DISTINCT w.id_number) AS not_clocked_in_7_days_count
FROM
(
-- 步骤1筛选出至少7天前已入场的人员
SELECT DISTINCT
id_number
FROM
bm_worker_ein_history a
LEFT JOIN bm_project bp ON bp.id = a.project_id
WHERE
ein_time &lt;= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND exit_time IS NULL
AND exit_status = - 1
<if test="subComId != null and subComId != '' ">
AND bp.project_general_id = #{subComId}
</if>
) w
LEFT JOIN (
-- 步骤2找出近7天内有打卡的人员
SELECT DISTINCT ID_NUMBER FROM fc_face_contrast WHERE CURRENT_DAY >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURRENT_DAY &lt;= CURDATE()) c ON w.id_number = c.ID_NUMBER
WHERE
c.ID_NUMBER IS NULL;
-- 近7天内无打卡记录
</select>
</mapper>

View File

@ -479,4 +479,34 @@
and is_active = 1 and is_active = 1
</select> </select>
</mapper> <select id="getSevenNotAttWorker" resultType="com.bonus.bmw.homePage.entity.SevenNotAttWorkerBean">
SELECT
w.id_number,bw.name,bp.`name` as proName,bs.sub_name,bst.team_name,w.ein_time,
MAX(fc.CURRENT_DAY) AS last_clock_day
FROM (
SELECT DISTINCT id_number,project_id,sub_id,team_id,ein_time
FROM bm_worker_ein_history
WHERE ein_time &lt;= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
AND exit_time IS NULL
AND exit_status = - 1
) w
LEFT JOIN fc_face_contrast fc
ON w.id_number = fc.ID_NUMBER
LEFT JOIN bm_project bp ON bp.id = w.project_id
LEFT JOIN bm_subcontractor bs ON bs.id = w.sub_id
LEFT JOIN bm_sub_team bst ON bst.id = w.TEAM_ID
LEFT JOIN bm_worker bw ON bw.id_number = w.id_number
<where >
<if test="params.subComId != null and params.subComId != '' ">
AND bp.project_general_id = #{params.subComId}
</if>
<if test="params.proName != null and params.proName != '' ">
AND bp.name = #{params.proName}
</if>
</where>
GROUP BY w.id_number
HAVING
(MAX(fc.CURRENT_DAY) IS NULL
OR MAX(fc.CURRENT_DAY) &lt; DATE_SUB(CURDATE(), INTERVAL 7 DAY))
</select>
</mapper>

View File

@ -304,7 +304,7 @@ html {
background-size: 100%; background-size: 100%;
background-position: 10%; background-position: 10%;
} }
#planPerNum>div:nth-child(1){ #sevenDayNotAtt>div:nth-child(1){
width: 35%; width: 35%;
height: 100%; height: 100%;
background-image: url("../../../img/work/indexScreen/planPerNum.png"); background-image: url("../../../img/work/indexScreen/planPerNum.png");
@ -765,4 +765,4 @@ html {
font-size: 15px; font-size: 15px;
text-align: center; text-align: center;
margin-top: 5%; margin-top: 5%;
} }

View File

@ -65,4 +65,4 @@ function isWeakPassword(password) {
}else{ }else{
return false; return false;
} }
} }

View File

@ -0,0 +1,126 @@
let addLoadingMsg;
var example = null;
var pers = null;
var layer;
var form;
var subComId = localStorage.getItem('subComIds');
layui.use(['layer', 'form'], function () {
layer = layui.layer;
form = layui.form;
init();
pers = checkPermission();
$("#searchBt").click(function () {
example.ajax.reload();
});
$("#resetBt").click(function () {
$("#proName").val("");
form.render();
example.ajax.reload();
});
});
//数据加载
function init() {
example =
$('#dt-table').DataTable({
"sort": false,
"searching": false,
"processing": true, //加载数据时显示进度状态
"serverSide": true,
//表头固定
"fixedHeader": true,
"scrollX": "500px",
"scrollY": "650px",
"scrollCollapse": true,
"language": {
"url": ctxPath + "/js/plugin/datatables/Chinese.lang"
},
"ajax": {
"url": ctxPath + "/homeSubPage/getSevenNotAttWorker",
"type": "post",
"data": function (d) {
d.proName = $("#proName").val();
d.subComId = subComId;
},
"error": function (xhr, textStatus, errorThrown) {
var msg = xhr.responseText;
console.log(msg);
var response = JSON.parse(msg);
var code = response.code;
var message = response.message;
if (code == 400) {
layer.msg(message);
} else if (code == 401) {
localStorage.removeItem("smz-token");
layer.msg("token过期请先登录", {shift: -1, time: 1000}, function () {
location.href = ctxPath + '/login.html';
});
} else if (code == 403) {
console.log("未授权:" + message);
layer.msg('未授权');
} else if (code == 500) {
console.log('系统错误:' + message);
}
}
},
"drawCallback": function() {
// alert( '表格重绘了' );
var thisDataTable = $('#dt-table').DataTable();
$(".pagination").append("<li>" +
"<a class='paginate_button' style='padding:4px;' href='#' tabindex='0'>到 <input style='margin:0px;width:40px;' id='changePage'> 页</a>" +
"<a class='paginate_button' style='margin-bottom:1px' href='#' tabindex='0' id='dataTable-btn'>确认</a></li>");
//点击按钮跳转指定页数
$('#dataTable-btn').click(function (e) {
if ($("#changePage").val() && $("#changePage").val() > 0) {
var redirectpage = $("#changePage").val() - 1;
} else {
var redirectpage = 0;
}
thisDataTable.page(redirectpage).draw( 'page' );
});
//敲击回车键跳转指定页数
$("#changePage").keypress(function (e) {
if(event.keyCode==13){
if ($("#changePage").val() && $("#changePage").val() > 0) {
var redirectpage = $("#changePage").val() - 1;
} else {
var redirectpage = 0;
}
thisDataTable.page(redirectpage).draw( 'page' );
}
});
},
"dom": "<'dt-toolbar'r>t<'dt-toolbar-footer'<'col-sm-4 col-xs-4 hidden-xs'i><'col-xs-8 col-sm-8' p v>>",
"columns": [
{
width: '4%',
data: function (row, type, set, meta) {
var c = meta.settings._iDisplayStart + meta.row + 1;
return c;
}
},
{"data": "name", "defaultContent": "",},
{"data": "idNumber", "defaultContent": "",},
{"data": "proName", "defaultContent": "",},
{"data": "subName", "defaultContent": "",},
{"data": "teamName", "defaultContent": "",},
{"data": "einTime", "defaultContent": "",},
{"data": "lastClockDay", "defaultContent": "",},
],
"order": [[0, "desc"], [1, "asc"]] //在栏目列上显示排序功能
});
}
//导出
function exportData() {
var proGeneralName = $("#proGeneralName").val();
window.location.href = ctxPath + "/homePage/exportData?token=" + token
+ "&proGeneralName=" + proGeneralName
}
//刷新页面
function reloading() {
var index = parent.layer.getFrameIndex(window.name); //先得到当前 iframe层的索引
parent.layer.close(index); //再执行关闭
window.parent.location.reload();
}

View File

@ -194,6 +194,7 @@ function dataOverview(subCompanyId) {
$('#mediumRisk').text(data.data.mediumRiskNum); $('#mediumRisk').text(data.data.mediumRiskNum);
$('#lowRisk').text(data.data.lowRiskNum); $('#lowRisk').text(data.data.lowRiskNum);
$('#planNum').text(data.data.planPersonNum); $('#planNum').text(data.data.planPersonNum);
$('#sevenDayNotAttNum').text(data.data.sevenDayNotAttWorker)
$('#refreshTime').text(data.data.updateTime == null ? '数据更新时间:--' : '数据更新时间:' + data.data.updateTime); $('#refreshTime').text(data.data.updateTime == null ? '数据更新时间:--' : '数据更新时间:' + data.data.updateTime);
closeLayer(); closeLayer();
if (flag) { if (flag) {
@ -786,6 +787,21 @@ function planPerClick(type, value) {
}); });
} }
//七天未打卡人数
function sevenDayNotAttClick() {
var height = '99%';
var width = '75%';
var index = layer.open({
title: ['七天未打卡详情', 'color:#3B70A1;background-color:#E8ECEB;font-size:20px'],
type: 2,
content: 'child/SevenDayNotAtt.html',
area: [width, height],
scrollbar: false, // 暂时屏蔽浏览器滚动条
maxmin: false
});
}
//电压ECharts //电压ECharts
function proInformationLevelECharts(listRank) { function proInformationLevelECharts(listRank) {
//先销毁 //先销毁
@ -1921,4 +1937,4 @@ function divisionOperation(a, b) {
return (a / b * 100).toFixed(2); return (a / b * 100).toFixed(2);
} }
} }

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>七天未打卡</title>
<link rel="stylesheet" type="text/css" media="screen" href="../../../../css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" media="screen" href="../../../../css/dataTables.bootstrap.min.css">
<link rel="stylesheet" type="text/css" media="screen" href="../../../../layui/css/layui.css">
<link rel="stylesheet" type="text/css" media="screen" href="../../../../css/work/ProjectManage/proManager.css">
<style>
.layui-form input[type=checkbox], .layui-form input[type=radio], .layui-form select {
display: none !important ;
}
</style>
</head>
<body>
<div>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<header style="height: 100%">
<div align="left">
<table style="width: 100%">
<tr>
<td>
<form class="form-inline layui-form" onsubmit="return false">
<div class="form-group">
<div class="layui-inline" >
<div class="layui-input-inline" style="display: flex;align-items: center;">
<input type="text" id="proName" name="proName" placeholder="输入工程名称" class="layui-input">
</div>
</div>
<button id="searchBt" class="layui-btn layui-btn-sm">
查询
</button>
<button id="resetBt" class="layui-btn layui-btn-sm">
重置
</button>
</div>
</form>
</td>
</tr>
</table>
</div>
</header>
<div>
<div class="widget-body no-padding">
<table id="dt-table" class="table table-striped table-bordered table-hover" style="width:100%">
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>身份证</th>
<th>工程名</th>
<th>分包名字</th>
<th>班组名字</th>
<th>入场时间</th>
<th>最后打卡时间</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>
<script type="text/javascript" src="../../../../js/libs/jquery-3.6.0.js"></script>
<script type="text/javascript" src="../../../../js/jq.js"></script>
<script type="text/javascript" src="../../../../js/plugin/datatables/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="../../../../js/plugin/datatables/dataTables.bootstrap.min.js"></script>
<script type="text/javascript" src="../../../../js/my/permission.js"></script>
<script type="text/javascript" src="../../../../layui/layui.js"></script>
<script type="text/javascript" src="../../../../js/publicJs.js"></script>
<script type="text/javascript" src="../../../../js/select.js" ></script>
<script type="text/javascript" src="../../../../js/dict.js"></script>
<script type="text/javascript" src="../../../../js/work/indexScreen/child/SevenDayNotAtt.js"></script>

View File

@ -81,6 +81,11 @@
<div id="attPersonNum">--</div> <div id="attPersonNum">--</div>
<div>今日打卡</div> <div>今日打卡</div>
</div> </div>
<div id="sevenDayNotAtt" onclick="sevenDayNotAttClick('sevenDayNotAtt')">
<div></div>
<div id="sevenDayNotAttNum">--</div>
<div>七天未打卡人数</div>
</div>
<!-- <div id="planPerNum" onclick="planPerClick('planPerNum', 1)"> <!-- <div id="planPerNum" onclick="planPerClick('planPerNum', 1)">
<div></div> <div></div>
<div id="planPersonNum">&#45;&#45;</div> <div id="planPersonNum">&#45;&#45;</div>
@ -351,4 +356,4 @@
<script type="text/javascript" src="../../../js/select.js"></script> <script type="text/javascript" src="../../../js/select.js"></script>
<script type="text/javascript" src="../../../js/libs/echarts.js"></script> <script type="text/javascript" src="../../../js/libs/echarts.js"></script>
<script type="text/javascript" src="../../../js/work/indexScreen/indexScreen.js" <script type="text/javascript" src="../../../js/work/indexScreen/indexScreen.js"
defer="defer"></script> defer="defer"></script>