package com.engine.aisin.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.engine.aisin.entity.AccessCustomPo; import com.engine.aisin.entity.KqStatisticsItemVo; import com.engine.aisin.entity.KqStatisticsVo; import com.engine.aisin.entity.ResourceParam; import com.engine.aisin.service.AccessCustomService; import com.engine.common.service.HrmCommonService; import com.engine.common.service.impl.HrmCommonServiceImpl; import com.engine.core.impl.Service; import com.engine.kq.biz.KQWorkTime; import com.engine.kq.entity.WorkTimeEntity; import com.engine.kq.util.KQDurationCalculatorUtil; import com.engine.kq.wfset.util.KQSignUtil; import com.weaver.general.BaseBean; import com.weaver.general.Util; import lombok.SneakyThrows; import org.apache.commons.lang.StringUtils; import weaver.conn.RecordSet; import weaver.hrm.company.DepartmentComInfo; import weaver.hrm.resource.ResourceComInfo; import java.util.*; import java.util.stream.Collectors; /** * @Author liang.cheng * @Date 2024/11/15 3:17 PM * @Description: TODO * @Version 1.0 */ public class AccessCustomServiceImpl extends Service implements AccessCustomService { @SneakyThrows @Override public boolean customAccess(String userId) { boolean result; RecordSet rs = new RecordSet(); ResourceComInfo rc = new ResourceComInfo(); HrmCommonService hrmCommonService = new HrmCommonServiceImpl(); //1.根据userId获取人员相关信息 String subCompanyId = rc.getSubCompanyID(userId); //2.判断该人员是否在需要控制权限的分部 List accessSub = new ArrayList<>(); rs.executeQuery("select xykzdfb,qxxz,fb,bm,ry,js from uf_txlxsldzqxkzgt where xykzdfb = ?",subCompanyId); while (rs.next()) { accessSub.add(AccessCustomPo.builder() .checks(Arrays.asList(Util.null2String(rs.getString("qxxz")).split(","))) .subCompanyIds(Arrays.asList(Util.null2String(rs.getString("fb")).split(","))) .departmentIds(Arrays.asList(Util.null2String(rs.getString("bm")).split(","))) .userIds(Arrays.asList(Util.null2String(rs.getString("ry")).split(","))) .roleIds(Arrays.asList(Util.null2String(rs.getString("js")).split(","))) .build()); } if (accessSub.size() == 0) { return true; } //3.若存在,判断是否在可查看权限范围 result = false; String departmentId = rc.getDepartmentID(userId); String roleIds = hrmCommonService.getRoleIds(Integer.parseInt(userId)); for (AccessCustomPo item : accessSub) { List checks = item.getChecks(); for (String e : checks) { switch (e) { case "0": List subCompanyIds = item.getSubCompanyIds(); boolean sub = subCompanyIds.stream() .anyMatch(element -> element.equals(subCompanyId)); if (sub) { return true; } break; case "1": List departmentIds = item.getDepartmentIds(); boolean dept = departmentIds.stream() .anyMatch(element -> element.equals(departmentId)); if (dept) { return true; } break; case "2": List userIds = item.getUserIds(); boolean user = userIds.stream() .anyMatch(element -> element.equals(departmentId)); if (user) { return true; } break; case "3": List roleIdsT = item.getRoleIds(); boolean role = roleIdsT.stream() .anyMatch(roleIds::contains); if (role) { return true; } break; default: break; } } } return result; } @Override public KqStatisticsVo getKqAccess(Map params) { //班次 String value = weaver.general.Util.null2String(params.get("value")); //日期 String kqDate = weaver.general.Util.null2String(params.get("date")); BaseBean bb = new BaseBean(); String matrixtableName = bb.getPropValue("aisinsecond", "matrixtableName"); String subcompanyid = bb.getPropValue("aisinsecond", "subcompanyid"); int departmentid = Integer.parseInt(bb.getPropValue("aisinsecond", "departmentid")); RecordSet rs = new RecordSet(); //1.建模表获取班次信息 uf_atbpbcstbdzgx List dayList = new ArrayList<>(); List nightList = new ArrayList<>(); rs.executeQuery("select bcnx,xtbcid from uf_atbpbcstbdzgx"); while (rs.next()) { int bcnx = Util.getIntValue(rs.getString("bcnx")); String xtbcid = Util.null2String(rs.getString("xtbcid")); if (bcnx == 0) { dayList = Arrays.asList(xtbcid.split(",")); }else { nightList = Arrays.asList(xtbcid.split(",")); } } //2.判断人员id是否属于总经理室,若是则查看该分部下所有人员,否则根据矩阵信息获取需要统计的出勤人数 //3.根据日期和人员id 获取对应班次id //4.根据班次value条件筛选是否属于白班或夜班 List resources = new ArrayList<>(); //先把自己加入出勤统计人数 KQWorkTime kqWorkTime = new KQWorkTime(); int uid = user.getUID(); bb.writeLog("getKqAccess当前登录人员id => "+uid); resources.add(ResourceParam.builder().userId(String.valueOf(uid)).build()); int userDepartment = user.getUserDepartment(); if (departmentid == userDepartment) { rs.executeQuery("select id from hrmresource where subcompanyid1 = ? and status < 4",subcompanyid); while (rs.next()) { String userId = Util.null2String(rs.getString("id")); if (!String.valueOf(uid).equals(userId)) { resources.add(ResourceParam.builder().userId(userId).build()); } } }else { DepartmentComInfo dept = new DepartmentComInfo(); List allDept = new ArrayList(); rs.executeQuery("select rsbm from "+matrixtableName+" where (kc like '%"+uid+"%' or " + "bz like '%"+uid+"%' or fbc like '%"+uid+"%')"); while (rs.next()) { String rsbm = Util.null2String(rs.getString("rsbm")); allDept.add(rsbm); } bb.writeLog("getKqAccess当前人员矩阵维护部门 =>"+allDept.toString()); List allDeptCopy = new ArrayList<>(allDept); allDeptCopy.forEach(e -> { ArrayList childDept = new ArrayList(); dept.getAllChildDeptByDepId(childDept,e); allDept.addAll(childDept); }); bb.writeLog("getKqAccess当前人员所控部门 =>"+allDept.toString()); if(allDept.size() != 0) { String join = CollectionUtil.join(allDept, ","); rs.executeQuery("select id from hrmresource where status < 4 and departmentid in ("+join+")"); while (rs.next()) { String userId = Util.null2String(rs.getString("id")); if (!String.valueOf(uid).equals(userId)) { resources.add(ResourceParam.builder().userId(userId).build()); } } } } List filterResources = new ArrayList<>(); List finalDayList = dayList; List finalNightList = nightList; List userIds = resources.stream() .map(ResourceParam::getUserId) .collect(Collectors.toList()); String join = CollectionUtil.join(userIds, ","); //考勤日期存在打卡数据的人员 List signIds = new ArrayList<>(); rs.executeQuery("select DISTINCT userid from HrmScheduleSign where signDate = '"+kqDate+"' and userid in ("+join+")"); while (rs.next()) { signIds.add(Util.null2String(rs.getString("userid"))); } Map serialMap = getSerialId(kqDate); resources.forEach(item -> { //耗时较长 采用新方法 //WorkTimeEntity workTime = kqWorkTime.getWorkTime(item.getUserId(), kqDate); //String serialId = workTime.getSerialId(); String serialId = serialMap.get(item.getUserId()); item.setSign(signIds.contains(item.getUserId())); if ("0".equals(value)) { if (finalDayList.contains(serialId)) { filterResources.add(item); } }else if ("1".equals(value)) { if (finalNightList.contains(serialId)) { filterResources.add(item); } }else { //班次类型为全部 if (StringUtils.isNotBlank(serialId)) { filterResources.add(item); } } }); bb.writeLog("getKqAccess 应出勤人数 =>"+filterResources.size()+filterResources.toString()); // filterResources.forEach(e -> { // //工作时段是否存在打卡数据 ()加载速率慢 2min 400多人时 // List signInfos = new ArrayList<>(); // Map todayLineMap = KQDurationCalculatorUtil.getWorkButton(e.getUserId(), kqDate,false); // if(todayLineMap.get("signTime") != null){ // List> todaySignTime = (List>)todayLineMap.get("signTime"); // if(todaySignTime != null && !todaySignTime.isEmpty()){ // KQSignUtil.getTodaySignInfo(todaySignTime,signInfos,e.getUserId(), kqDate,true); // } // } // bb.writeLog("getKqAccess 打卡数据是否存在 =>"+signInfos.toString()); // e.setSign(signInfos.size() > 0); // }); int realPersons = (int) filterResources.stream() .filter(ResourceParam::isSign) .count(); int leavePersons = filterResources.size() - realPersons; //5.构建返回数据 List kqStatisticsItemVoList = new ArrayList<>(); kqStatisticsItemVoList.add(KqStatisticsItemVo.builder() .name("未出勤人数") .id("leavePersons") .title("未出勤人数") .type("ABSENT") .value(leavePersons) .build()); kqStatisticsItemVoList.add(KqStatisticsItemVo.builder() .name("实际出勤人数") .id("realPersons") .title("实际出勤人数") .type("REALPERSONS") .value(realPersons) .build()); return KqStatisticsVo.builder() .name("应出勤(人)") .id("workPersons") .title("出勤统计") .value(filterResources.size()) .items(kqStatisticsItemVoList) .build(); } private Map getSerialId(String kqDate) { RecordSet rs = new RecordSet(); Map result = new HashMap<>(); rs.executeQuery("select distinct resourceid ,serialid from kq_shiftschedule where kqdate = '"+kqDate+"' and isdelete = 0"); while (rs.next()){ String resourceid = Util.null2String(rs.getString("resourceid")); String serialid = Util.null2String(rs.getString("serialid")); result.put(resourceid,serialid); } return result; } }