From 1b2f1eb44d9f0de6b9238cfe314988a95c87344a Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期四, 02 四月 2026 13:37:15 +0800
Subject: [PATCH] 绩效管理:工时汇总对接MES数据&人员考勤调整

---
 performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java |   90 +++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 83 insertions(+), 7 deletions(-)

diff --git a/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java b/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java
index 2bacdd7..9aef08d 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java
+++ b/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -11,9 +12,16 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.enums.ContractType;
+import com.ruoyi.common.enums.StaffSkillLevelType;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.api.mes.MesApiUtils;
+import com.ruoyi.common.utils.api.mes.model.WorkingHoursRecordSumVO;
+import com.ruoyi.common.utils.api.mes.model.WorkingHoursRecordTotalVO;
+import com.ruoyi.common.utils.excel.EasyExcelUtils;
+import com.ruoyi.common.utils.excel.FullCustomAutoWidthHandler;
+import com.ruoyi.common.utils.excel.HeaderContentRowHeightHandler;
 import com.ruoyi.performance.dto.AuxiliaryAllDto;
-import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
 import com.ruoyi.performance.dto.AuxiliaryOriginalHoursDto;
 import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
 import com.ruoyi.performance.mapper.AuxiliaryCorrectionHoursMapper;
@@ -23,8 +31,10 @@
 import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
 import com.ruoyi.performance.service.AuxiliaryOriginalHoursService;
 import com.ruoyi.system.mapper.UserMapper;
-import org.apache.commons.math3.analysis.function.Power;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.IndexedColors;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -33,11 +43,14 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class AuxiliaryOriginalHoursServiceImpl implements AuxiliaryOriginalHoursService {
 
@@ -55,6 +68,9 @@
 
     @Resource
     AuxiliaryCorrectionHoursMapper auxiliaryCorrectionHoursMapper;
+
+    @Autowired
+    private MesApiUtils mesApiUtils;
 
     @Override
     public IPage<AuxiliaryOriginalHoursDto> selectAuxiliaryOriginalHours(Page page, AuxiliaryOriginalHoursLookDto auxiliaryOriginalHoursLookDto) {
@@ -226,12 +242,23 @@
         DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         String beginDate = previousMonth26th.atStartOfDay().format(outputFormatter);
         String endDate = currentMonth25th.atStartOfDay().format(outputFormatter);
-//        dto.setBeginDate(beginDate + " 00:00:00");
-//        dto.setEndDate(endDate + " 23:59:59");
-        dto.setBeginDate(beginDate);
-        dto.setEndDate(endDate);
+        dto.setBeginDate(beginDate + " 00:00:00");
+        dto.setEndDate(endDate + " 23:59:59");
+        dto.setAssistBeginDate(beginDate);
+        dto.setAssistEndDate(endDate);
 
-
+        //鏌ヨKJNS鍜孼TNS鍩熺殑MES缁╂晥鏁版嵁
+        Map<String, Object> params = new HashMap<>();
+        params.put("year",date.getYear());
+        params.put("month",date.getMonthValue());
+        List<WorkingHoursRecordTotalVO> hoursRecordSumByNS = new ArrayList<>();
+        List<WorkingHoursRecordTotalVO> hoursRecordSumByKJ = new ArrayList<>();
+        try {
+            hoursRecordSumByNS = mesApiUtils.getCheckWorkingHoursRecordSum(ContractType.ZTNS.getValue(), params);
+            hoursRecordSumByKJ = mesApiUtils.getCheckWorkingHoursRecordSum(ContractType.KJNS.getValue(), params);
+        }catch (Exception e){
+            log.error("宸ユ椂姹囨�绘煡璇㈠紓甯革細{}",e.getMessage());
+        }
         // 鏌ヨ浜ч噺宸ユ椂
         List<AuxiliaryAllDto> auxiliaryAllDtos = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryAllByMonth(dto, userIds);
 
@@ -257,11 +284,60 @@
             BigDecimal total = (auxiliaryAllDto.getYieldHour() != null ? auxiliaryAllDto.getYieldHour() : BigDecimal.ZERO)
                     .add(auxiliaryAllDto.getSubsidiaryHour() != null ? auxiliaryAllDto.getSubsidiaryHour() : BigDecimal.ZERO);
             auxiliaryAllDto.setTotalHour(total);
+            if(!hoursRecordSumByNS.isEmpty()){
+                WorkingHoursRecordTotalVO totalVOByNS = hoursRecordSumByNS.stream().filter(f -> StringUtils.equals(f.getChecker(), auxiliaryAllDto.getUserName())).findFirst().orElse(null);
+                if(ObjectUtils.isNotNull(totalVOByNS)){
+                    auxiliaryAllDto.setHandymanWageByNS(totalVOByNS.getHandymanWage());
+                    auxiliaryAllDto.setOnsiteInspWageByNS(totalVOByNS.getOnsiteInspWage());
+                    auxiliaryAllDto.setOperationPerformanceByNS(totalVOByNS.getOperationPerformance());
+                    auxiliaryAllDto.setProductPerformanceByNS(totalVOByNS.getProductPerformance());
+                }
+            }
+            if(!hoursRecordSumByKJ.isEmpty()){
+                WorkingHoursRecordTotalVO totalVOByKJ = hoursRecordSumByKJ.stream().filter(f -> StringUtils.equals(f.getChecker(), auxiliaryAllDto.getUserName())).findFirst().orElse(null);
+                if(ObjectUtils.isNotNull(totalVOByKJ)){
+                    auxiliaryAllDto.setHandymanWageByKJ(totalVOByKJ.getHandymanWage());
+                    auxiliaryAllDto.setOnsiteInspWageByKJ(totalVOByKJ.getOnsiteInspWage());
+                    auxiliaryAllDto.setOperationPerformanceByKJ(totalVOByKJ.getOperationPerformance());
+                    auxiliaryAllDto.setProductPerformanceByKJ(totalVOByKJ.getProductPerformance());
+                }
+            }
         }
 
         return auxiliaryAllDtos;
     }
 
+    @Override
+    public void exportWorkHoursTotal(HttpServletResponse response, AuxiliaryOriginalHoursLookDto dto) {
+        response.reset();
+        try {
+            //1.缁勮鏁版嵁
+            AtomicInteger excelIndex = new AtomicInteger(1);
+            List<AuxiliaryAllDto> auxiliaryAllDtos = selectAuxiliaryAllByMonth(dto);
+            auxiliaryAllDtos.forEach(a->{
+                a.setExcelIndex(excelIndex.getAndIncrement());
+                a.setOperationPerformance(a.getOperationPerformanceByKJ().add(a.getOperationPerformanceByNS()));//宸ュ簭缁╂晥姹囨��
+                a.setOnsiteInspWage(a.getOnsiteInspWageByKJ().add(a.getOnsiteInspWageByNS()));//宸℃缁╂晥姹囨��
+                a.setProductPerformance(a.getProductPerformanceByKJ().add(a.getProductPerformanceByNS()));//鎴愬搧缁╂晥姹囨��
+                a.setHandymanWage(a.getHandymanWageByKJ().add(a.getHandymanWageByNS()));//鏉傚伐宸ヨ祫
+            });
+            //2.瀵煎嚭
+            String fileName = "涓ぉ鑰愪笣璐ㄩ噺閮ㄥ伐鏃舵眹鎬�"+ ExcelTypeEnum.XLSX;
+            fileName =  URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+            response.setContentType("application/vnd.ms-excel");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            EasyExcel.write(response.getOutputStream())
+                    .head(AuxiliaryAllDto.class)
+                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                    .sheet("Sheet 1")
+                    .doWrite(auxiliaryAllDtos);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     private Map<String, AuxiliaryOriginalHoursDto> getData(List<Map<String, Object>> objectMaps, String type) {
         Map<String, AuxiliaryOriginalHoursDto> dtoMap = new HashMap<>();
         for (Map<String, Object> objectMap : objectMaps) {

--
Gitblit v1.9.3