You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-develop/src/com/engine/aisin/service/impl/AccessCustomServiceImpl.java

304 lines
12 KiB
Java

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<AccessCustomPo> 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<String> checks = item.getChecks();
for (String e : checks) {
switch (e) {
case "0":
List<String> subCompanyIds = item.getSubCompanyIds();
boolean sub = subCompanyIds.stream()
.anyMatch(element -> element.equals(subCompanyId));
if (sub) {
return true;
}
break;
case "1":
List<String> departmentIds = item.getDepartmentIds();
boolean dept = departmentIds.stream()
.anyMatch(element -> element.equals(departmentId));
if (dept) {
return true;
}
break;
case "2":
List<String> userIds = item.getUserIds();
boolean user = userIds.stream()
.anyMatch(element -> element.equals(departmentId));
if (user) {
return true;
}
break;
case "3":
List<String> roleIdsT = item.getRoleIds();
boolean role = roleIdsT.stream()
.anyMatch(roleIds::contains);
if (role) {
return true;
}
break;
default:
break;
}
}
}
return result;
}
@Override
public KqStatisticsVo getKqAccess(Map<String,Object> 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<String> dayList = new ArrayList<>();
List<String> 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<ResourceParam> 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<String> 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<String> 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<ResourceParam> filterResources = new ArrayList<>();
List<String> finalDayList = dayList;
List<String> finalNightList = nightList;
List<String> userIds = resources.stream()
.map(ResourceParam::getUserId)
.collect(Collectors.toList());
String join = CollectionUtil.join(userIds, ",");
//考勤日期存在打卡数据的人员
List<String> 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<String, String> 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<Object> signInfos = new ArrayList<>();
// Map<String, Object> todayLineMap = KQDurationCalculatorUtil.getWorkButton(e.getUserId(), kqDate,false);
// if(todayLineMap.get("signTime") != null){
// List<Map<String, String>> todaySignTime = (List<Map<String, String>>)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<KqStatisticsItemVo> 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<String,String> getSerialId(String kqDate) {
RecordSet rs = new RecordSet();
Map<String,String> 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;
}
}