package com.ruoyi.performance.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto; import com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto; import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper; import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper; import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours; import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay; import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursService; import com.ruoyi.system.mapper.UserMapper; import org.apache.commons.math3.analysis.function.Power; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; /** *

* 日工时管理的产量工时 服务实现类 *

* * @author 江苏鵷雏网络科技有限公司 * @since 2024-05-28 03:48:48 */ @Service public class AuxiliaryOutputWorkingHoursServiceImpl extends ServiceImpl implements AuxiliaryOutputWorkingHoursService { @Resource AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper; @Resource AuxiliaryWorkingHoursDayMapper auxiliaryWorkingHoursDayMapper; @Resource UserMapper userMapper; @Override public IPage selectAuxiliaryOutputWorkingHours(Page page, AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto) { auxiliaryOutputWorkingHoursDto.setWeekDay(weekConvert(StringUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getWeekDay()) ? auxiliaryOutputWorkingHoursDto.getWeekDay() : "")); String dateTime1 = auxiliaryOutputWorkingHoursDto.getDateTime1(); String dateTime2 = auxiliaryOutputWorkingHoursDto.getDateTime2(); AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours(); BeanUtils.copyProperties(auxiliaryOutputWorkingHoursDto, auxiliaryOutputWorkingHours); String week = auxiliaryOutputWorkingHoursDto.getWeek(); auxiliaryOutputWorkingHoursDto.setDateTime(null); auxiliaryOutputWorkingHoursDto.setWeek(null); Map map = new HashMap<>(); List ids = new ArrayList<>(); //判断组长,组员,管理员权限 User user = userMapper.selectById(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getUserId().toString())); List users = userMapper.selectList(new LambdaQueryWrapper().like(User::getName, auxiliaryOutputWorkingHoursDto.getName())); if(CollectionUtils.isNotEmpty(users)) { ids = users.stream().map(User::getId).distinct().collect(Collectors.toList()); } IPage auxiliaryOutputWorkingHoursDtoIPage = null; if (StringUtils.isNotEmpty(dateTime1) && ObjectUtils.isNotEmpty(week)) { String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(","); auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page, QueryWrappers.queryWrappers(auxiliaryOutputWorkingHours) .ge("date_time", dateTime1).le("date_time", dateTime2 + " 23:59:59") .ge("week", weeks[0]).le("week", weeks[1]), ids); for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) { record.setDateTime(record.getDateTime().substring(0,10)); } map.put("body",auxiliaryOutputWorkingHoursDtoIPage ); } else if (StringUtils.isNotEmpty(dateTime1) && ObjectUtils.isEmpty(week)) { auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page, QueryWrappers.queryWrappers(auxiliaryOutputWorkingHours) .ge("date_time", dateTime1).le("date_time", dateTime2 + " 23:59:59"), ids); for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) { record.setDateTime(record.getDateTime().substring(0,10)); } map.put("body",auxiliaryOutputWorkingHoursDtoIPage ); } else if (StringUtils.isEmpty(dateTime1) && ObjectUtils.isNotEmpty(week)) { String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(","); auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page, QueryWrappers.queryWrappers(auxiliaryOutputWorkingHours) .ge("week", weeks[0]).le("week", weeks[1]), ids); for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) { record.setDateTime(record.getDateTime().substring(0,10)); } map.put("body", auxiliaryOutputWorkingHoursDtoIPage); } else { auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page, QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto), ids); for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) { record.setDateTime(record.getDateTime().substring(0,10)); } } return auxiliaryOutputWorkingHoursDtoIPage; } @Override public Map collectWorkingHours(AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto){ // 返回的结果 Map map = new HashMap<>(); // 判断当前人的权限 是否可查看多人 List ids = getCurrentGroupUserIds(StringUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getName()) ? auxiliaryOutputWorkingHoursDto.getName() : ""); String dateTime = auxiliaryOutputWorkingHoursDto.getDateTime(); String startTime = ""; String endTime = ""; if(StringUtils.isNotEmpty(dateTime)) { List list = JSONArray.parseArray(dateTime, String.class); if(list.size() == 1) { list = JSONArray.parseArray(list.get(0), String.class); } startTime = list.get(0)+ " 00:00:00"; endTime = list.get(1)+ " 23:59:59"; } String weekConvert = weekConvert(StringUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getWeekDay()) ? auxiliaryOutputWorkingHoursDto.getWeekDay() : "" ); // 周次转换 // 根据条件获取数据 List auxiliaryOutputWorkingHours = auxiliaryOutputWorkingHoursMapper.selectList(new QueryWrapper() .in(CollectionUtils.isNotEmpty(ids), "check_id", ids) .like(StringUtils.isNotBlank(auxiliaryOutputWorkingHoursDto.getWeekDay()), "week_day", weekConvert) .between(StringUtils.isNotEmpty(dateTime),"date_time", startTime, endTime)); // 1.产量工时汇总 // 根据委托编号、样品编号、工时分组 来进行分组统计 // 加班的工时汇总 BigDecimal overTime = BigDecimal.ZERO; // 过滤出加班的工时 List overFilter = auxiliaryOutputWorkingHours.stream() .filter(item -> Objects.nonNull(item.getOvertimeOrderNo()) && StringUtils.isNotEmpty(item.getOvertimeOrderNo())) .collect(Collectors.toList()); Map> collect = overFilter.stream() .collect(Collectors.groupingBy(item -> item.getOvertimeOrderNo() + "@" + item.getSample() + "@" + item.getManHourGroup())); Iterator>> iterator = collect.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry> entry = iterator.next(); // 同一分组下的只需要算一次 overTime = add(overTime, BigDecimal.valueOf(entry.getValue().get(0).getOvertimeWorkTime())); } // 非加班的工时汇总 BigDecimal workTime = BigDecimal.ZERO; List workFilter = auxiliaryOutputWorkingHours.stream() .filter(item -> Objects.nonNull(item.getOrderNo()) && StringUtils.isNotEmpty(item.getOrderNo())) .collect(Collectors.toList()); Map> collect1 = workFilter.stream() .collect(Collectors.groupingBy(item -> item.getOrderNo() + "@" + item.getSample() + "@" + item.getManHourGroup())); Iterator>> iterator1 = collect1.entrySet().iterator(); while (iterator1.hasNext()) { Map.Entry> entry = iterator1.next(); workTime = add(workTime, BigDecimal.valueOf(entry.getValue().get(0).getOutputWorkTime())); } BigDecimal outPutWorkTime = add(overTime, workTime); // 2.辅助工时汇总 BigDecimal dayWorkTime = BigDecimal.ZERO; List dayList = auxiliaryWorkingHoursDayMapper.selectList(new QueryWrapper() .in(CollectionUtils.isNotEmpty(ids), "name_user", ids) .like(StringUtils.isNotBlank(auxiliaryOutputWorkingHoursDto.getWeekDay()), "week_day", auxiliaryOutputWorkingHoursDto.getWeekDay()) .eq(StringUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getState()), "state", auxiliaryOutputWorkingHoursDto.getState()) .between(StringUtils.isNotEmpty(dateTime),"date_time", startTime, endTime)); for (AuxiliaryWorkingHoursDay a : dayList) { if(ObjectUtils.isNull(a.getReviewerNonproductiveTime())) { dayWorkTime = add(dayWorkTime, BigDecimal.ZERO); }else { dayWorkTime = add(dayWorkTime, BigDecimal.valueOf(a.getReviewerNonproductiveTime())); } } map.put("产量工时汇总", outPutWorkTime); map.put("辅助工时汇总", dayWorkTime); return map; } public BigDecimal add(BigDecimal a, BigDecimal b){ return a.add(b); } // 周次转换 public String weekConvert(String week){ String weekDay = ""; switch (week) { case "1": weekDay = "周一"; break; case "2": weekDay = "周二"; break; case "3": weekDay = "周三"; break; case "4": weekDay = "周四"; break; case "5": weekDay = "周五"; break; case "6": weekDay = "周六"; break; case "0": weekDay = "周日"; break; } return weekDay; } /** * 获取当前用户组织的用户id * @return */ private List getCurrentGroupUserIds(){ return getCurrentGroupUserIds(""); } private List getCurrentGroupUserIds(String name){ List ids = new ArrayList<>(); //判断是组长还是组员还是管理员,根据roleId(7:检验员,8:检验组长) Integer userId = Integer.parseInt(SecurityUtils.getLoginUser().getUser().getUserId().toString()); User user = userMapper.selectById(userId); //管理员(不添加限制条件所有人都可以看) //不是组长 return ids; } //导出 @Override public void exportWorkingHours(HttpServletResponse response) throws IOException { List auxiliaryOutputWorkingHoursDtos = new ArrayList<>(); List auxiliaryWorkingHoursDayDtos = new ArrayList<>(); List ids = getCurrentGroupUserIds(); //查询辅助工时 auxiliaryWorkingHoursDayDtos = auxiliaryWorkingHoursDayMapper.selectDataByUser(ids); //查询统计工时 auxiliaryOutputWorkingHoursDtos = auxiliaryOutputWorkingHoursMapper.selectDataByUser(ids).stream().map(item -> { if(Objects.isNull(item.getOvertimeWorkTime())) { item.setOvertimeWorkTime((double)0); } if(Objects.isNull(item.getOvertimeAmount())) { item.setOvertimeAmount(0); } if(Objects.isNull(item.getWorkTime())) { item.setWorkTime((double)0); } if(Objects.isNull(item.getAmount())) { item.setAmount(0); } return item; }).collect(Collectors.toList()); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("日工时管理导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); try { // 新建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); WriteSheet mainSheet = EasyExcel.writerSheet(0, "辅助工时导出").head(AuxiliaryWorkingHoursDayDto.class).build(); excelWriter.write(auxiliaryWorkingHoursDayDtos, mainSheet); WriteSheet mainSheet1 = EasyExcel.writerSheet(1, "产量工时导出").head(AuxiliaryOutputWorkingHoursDto.class).build(); excelWriter.write(auxiliaryOutputWorkingHoursDtos, mainSheet1); // 关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } }