package com.engine.salary.remote.attend.service.impl; import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSONObject; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.kq.cmd.report.GetKQReportCmd; import com.engine.salary.mapper.datacollection.AttendQuoteFieldMapper; import com.engine.salary.remote.attend.cmd.GetSearchListCmd; import com.engine.salary.remote.attend.entity.Attend4Salary; import com.engine.salary.remote.attend.service.RemoteAttend4SalaryService; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.valid.ValidUtil; import com.google.common.base.Joiner; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.general.BaseBean; import weaver.general.Util; import weaver.hrm.User; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; import static com.engine.salary.sys.constant.SalarySysConstant.ATTENDANCE_SERIAL_COLLECTION_BTN; @Slf4j public class RemoteAttend4SalaryServiceImpl extends Service implements RemoteAttend4SalaryService { private final Boolean isLog = "true".equals(new BaseBean().getPropValue("hrmSalary", "log")); private AttendQuoteFieldMapper getAttendQuoteFieldMapper() { return MapperProxyFactory.getProxy(AttendQuoteFieldMapper.class); } private SalarySysConfService getSalarySysConfService(User user) { return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } //是否采集考勤班次数据 boolean isCollectAttendanceSerial = "1".equals(getSalarySysConfService(user).getValueByCode(ATTENDANCE_SERIAL_COLLECTION_BTN)); @Override public List> getColumns() { //是否采集考勤班次数据 String attendanceSerial = ""; if (isCollectAttendanceSerial) { List attendanceSerials = getAttendQuoteFieldMapper().getAttendanceSerials(); attendanceSerial = Joiner.on(",").join((Iterable) attendanceSerials); } Map paramsMap = new HashMap(); paramsMap.put("typeselect", "3"); paramsMap.put("viewScope", "0"); paramsMap.put("isNoAccount", "1"); paramsMap.put("attendanceSerial", attendanceSerial); paramsMap.put("isFromMyAttendance", "1"); Map temp = new HashMap(); temp.put("data", JSONObject.toJSONString(paramsMap)); temp.put("reportType", "month"); List datas = (List) commandExecutor.execute(new GetKQReportCmd(temp, user)).get("columns"); if (isLog) { log.info("同步考勤字段,{}", JSONUtils.toJSONString(datas)); } List> columns = new ArrayList<>(); datas.stream().filter(column -> Objects.nonNull(column.get("dataIndex"))).forEach(column -> { String dataIndex = column.get("dataIndex").toString(); //请假 if (dataIndex.equals("leave") && column.get("children") != null) { List list = (List) column.get("children"); if (CollectionUtils.isNotEmpty(list)) { list.stream() .filter(leave -> leave.get("dataIndex") != null && StringUtils.isNotBlank(leave.get("dataIndex").toString())) .forEach(leave -> { Map map = Maps.newHashMapWithExpectedSize(2); map.put("code", leave.get("dataIndex").toString()); map.put("name", Util.null2String(column.get("title")) + "-" + leave.get("title") + "(" + leave.get("unit").toString() + ")"); columns.add(map); }); } } //出勤班次 else if (dataIndex.equals("attendanceSerial") && column.get("children") != null) { List list = (List) column.get("children"); if (CollectionUtils.isNotEmpty(list)) { list.stream() .filter(leave -> leave.get("dataIndex") != null && StringUtils.isNotBlank(leave.get("dataIndex").toString())) .forEach(leave -> { Map map = Maps.newHashMapWithExpectedSize(2); map.put("code", "attendanceSerial_" + leave.get("dataIndex").toString()); String unit = "".equals(leave.get("unit").toString()) ? "" : "(" + leave.get("unit").toString() + ")"; map.put("name", Util.null2String(column.get("title")) + "-" + leave.get("title") + unit); columns.add(map); }); } } //加班 else if (dataIndex.equals("overtime") && column.get("children") != null) { List list = (List) column.get("children"); if (CollectionUtils.isNotEmpty(list)) { for (int i = 0; i < list.size(); i++) { Map overtimeMap = list.get(i); if (overtimeMap.get("dataIndex") != null && StringUtils.isNotBlank(overtimeMap.get("dataIndex").toString()) && overtimeMap.get("children") == null) { Map map = Maps.newHashMapWithExpectedSize(2); map.put("code", overtimeMap.get("dataIndex").toString()); map.put("name", Util.null2String(column.get("title")) + "-" + overtimeMap.get("title") + "(" + overtimeMap.get("unit").toString() + ")"); columns.add(map); } if (overtimeMap.get("dataIndex") != null && StringUtils.isNotBlank(overtimeMap.get("dataIndex").toString()) && overtimeMap.get("children") != null) { List overtimes = (List) overtimeMap.get("children"); if (CollectionUtils.isNotEmpty(overtimes)) { overtimes.stream().filter(leave -> leave.get("dataIndex") != null && StringUtils.isNotBlank(leave.get("dataIndex").toString())) .forEach(leave -> { Map map = Maps.newHashMapWithExpectedSize(2); map.put("code", leave.get("dataIndex").toString()); map.put("name", Util.null2String(column.get("title")) + "-" + Util.null2String(overtimeMap.get("title")) + "-" + leave.get("title") + "(" + leave.get("unit").toString() + ")"); columns.add(map); }); } } } } } //普通考勤 else { if (column.get("unit") != null && StringUtils.isNotBlank(column.get("unit").toString())) { Map map = Maps.newHashMapWithExpectedSize(2); map.put("code", dataIndex); map.put("name", column.get("title") + "(" + column.get("unit").toString() + ")"); columns.add(map); } } }); //假期余额字段 columns.addAll(getBalanceOfLeaveColumns()); return columns; } @Override public List> getDatas(Attend4Salary attend4Salary) { List> list = new ArrayList<>(); try { ValidUtil.doValidator(attend4Salary); Map paramsMap = new HashMap(); paramsMap.put("pageIndex", 1); paramsMap.put("pageSize", 500); paramsMap.put("typeselect", "6"); paramsMap.put("fromDate", SalaryDateUtil.getFormatLocalDate(attend4Salary.getBeginDate())); paramsMap.put("toDate", SalaryDateUtil.getFormatLocalDate(attend4Salary.getEndDate())); paramsMap.put("viewScope", "3"); List resourceIds = attend4Salary.getOnlyEmpIds().stream().map(String::valueOf).collect(Collectors.toList()); paramsMap.put("resourceId", String.join(",", resourceIds)); paramsMap.put("isNoAccount", "1"); //班次 paramsMap.put("attendanceSerial", isCollectAttendanceSerial ? attend4Salary.getAttendanceSerial() : ""); paramsMap.put("isFromMyAttendance", "1"); Map temp = new HashMap(); temp.put("data", JSONObject.toJSONString(paramsMap)); temp.put("reportType", "month"); log.info("salaryAttend开始获取的考勤数据,参数{}", temp); list = (List>) commandExecutor.execute(new GetKQReportCmd(temp, user)).get("datas"); if (isLog) { log.info("salaryAttend获取的考勤数据,{}", JSONUtils.toJSONString(list)); } } catch (Exception e) { log.error("salaryAttend获取考勤数据失败", e); } try { //假期余额信息 List> balanceOfLeaveDatas = getBalanceOfLeaveDatas(attend4Salary); Map> balanceMap = SalaryEntityUtil.convert2Map(balanceOfLeaveDatas, m -> m.get("id")); //给有考勤的赋值 List attendEmpIds = list.stream().map(attend -> { String resourceId = attend.get("resourceId"); Map map = balanceMap.getOrDefault(resourceId, new HashMap<>()); for (String key : map.keySet()) { attend.put("balanceOfLeave_" + key, map.get(key)); } return resourceId; }).collect(Collectors.toList()); //没有考勤,但有假期余额的人赋值 List> balanceOfLeaveList = balanceMap.keySet().stream() .filter(k -> !attendEmpIds.contains(k)) .map(k -> { Map result = new HashMap<>(); result.put("resourceId", k); Map map = balanceMap.get(k); for (String key : map.keySet()) { result.put("balanceOfLeave_" + key, map.get(key)); } return result; }) .collect(Collectors.toList()); list.addAll(balanceOfLeaveList); } catch (Exception e) { log.error("salaryAttend获取假期数据失败", e); } return list; } @Override public List> getBalanceOfLeaveColumns() { Map paramsMap = new HashMap(); paramsMap.put("dateScope", "6"); paramsMap.put("selectedYear", LocalDate.now().getYear()); paramsMap.put("dataScope", "3"); paramsMap.put("resourceId", 92); paramsMap.put("status", "9"); paramsMap.put("isNoAccount", true); List> columns = (List>) commandExecutor.execute(new GetSearchListCmd(paramsMap, user)).get("columns"); List> balanceOfLeaveColumns = columns.stream() .filter(column -> NumberUtils.isCreatable(column.get("key"))) .map(column -> { Map map = Maps.newHashMapWithExpectedSize(2); map.put("code", "balanceOfLeave_" + column.get("key")); map.put("name", "假期余额-" + column.get("title")); return map; }).collect(Collectors.toList()); return balanceOfLeaveColumns; } @Override public List> getBalanceOfLeaveDatas(Attend4Salary attend4Salary) { Map paramsMap = new HashMap(); paramsMap.put("currentPage", "1"); paramsMap.put("pageSize", "500"); paramsMap.put("selectedYear", SalaryDateUtil.date2Year(attend4Salary.getBeginDate())); paramsMap.put("dataScope", "3"); paramsMap.put("resourceId", attend4Salary.getOnlyEmpIds().stream().map(String::valueOf).collect(Collectors.joining(","))); paramsMap.put("status", "9"); paramsMap.put("isNoAccount", true); return (List>) commandExecutor.execute(new GetSearchListCmd(paramsMap, user)).get("datas"); } }