huang
2025-06-12 e206ea8f7dbb655c0d8868996dae8ff1ff5ed11a
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/md/service/impl/TaskingLogServiceImpl.java
@@ -35,6 +35,64 @@
    @Autowired
    KBBTJPDrawingBPMapper kBBTJPDrawingBPMapper;
    @Override
    public List<Map> selectMechanicalReport(int dayCount, Date startDate, Date endDate, String taskType, String operationRecord, String lineType) {
        try {
            // 构建查询条件
            QueryWrapper<TaskingLog> taskingWrapper = new QueryWrapper<>();
            // 添加完工状态过滤
            taskingWrapper.eq("work_state", "完工");
            // 时间范围处理
            if (startDate != null && endDate != null) {
                taskingWrapper.ge("operation_record_time", startDate)
                        .le("operation_record_time", endDate);
            } else if (dayCount > 0) {
                // 如果没有时间范围,使用默认的dayCount
                Calendar cal = Calendar.getInstance();
                cal.setTime(new Date());
                cal.set(Calendar.HOUR_OF_DAY, 0);
                cal.set(Calendar.MINUTE, 0);
                cal.set(Calendar.SECOND, 0);
                cal.set(Calendar.MILLISECOND, 0);
                cal.add(Calendar.DATE, 1 - dayCount);
                Date defaultStartDate = cal.getTime();
                Date defaultEndDate = new Date();
                taskingWrapper.ge("operation_record_time", defaultStartDate)
                        .le("operation_record_time", defaultEndDate);
            }
            // 添加可选条件
            if (taskType != null && !taskType.isEmpty()) {
                taskingWrapper.eq("task_type", taskType);
            }
            if (operationRecord != null && !operationRecord.isEmpty()) {
                taskingWrapper.like("operation_record", operationRecord);
            }
            if (lineType != null && !lineType.isEmpty()) {
                taskingWrapper.apply("operation_record REGEXP '.*[^0-9]" + lineType + "$'");
            }
            // 按时间排序(降序)
            //taskingWrapper.orderByDesc("operation_record_time");
            //(升序)
            taskingWrapper.orderByAsc("operation_record_time");
            // 先按sortOrder排序,再按时间排序
            //taskingWrapper.orderByAsc("sort_order", "operation_record_time");
            // 执行查询
            List<Map<String, Object>> taskingList = baseMapper.selectMaps(taskingWrapper);
            // 直接返回查询结果
            return new ArrayList<>(taskingList);
        } catch (Exception e) {
            log.error("查询异常", e);
            throw e;
        }
    }
    public List<TaskingLog> findTaskingLog(){
        return new ArrayList<TaskingLog>();
    }
@@ -51,29 +109,86 @@
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.DATE, 0-dayCount);
        cal.add(Calendar.DATE, 1-dayCount);
        Date startDate = cal.getTime();
        QueryWrapper<KBBTJPDrawingBP> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("CAST(CreateDate AS DATE) AS CreateDate,isNull(sum(task_quantity),0) as task_quantity_sum")
                .gt("CreateDate",startDate).groupBy("CAST(CreateDate AS DATE)")
                .orderByAsc("CAST(CreateDate AS DATE)");
        queryWrapper.select("CAST(PlanDate AS DATE) AS CreateDate,isNull(sum(task_quantity),0) as task_quantity_sum")
                .gt("PlanDate",startDate).groupBy("CAST(PlanDate AS DATE)")
                .orderByAsc("CAST(PlanDate AS DATE)");
        List<Map> list=kBBTJPDrawingBPMapper.selectMaps((QueryWrapper)queryWrapper);
        List<Map<String, Object>> listTasking1 = baseMapper.selectMaps(new QueryWrapper<TaskingLog>()
                .select("operation_record,operation_mode,DATE_FORMAT(operation_record_time, '%Y-%m-%d') as operation_record_time,count(1) as count")
                .select("task_type, operation_record, operation_mode, DATE_FORMAT(operation_record_time, '%Y-%m-%d') as operation_record_time, count(*) as count")
                .eq("operation_record", "旋转1")
                .eq("operation_mode", "结束")
                .gt("operation_record_time", startDate)
                .groupBy("operation_record", "operation_mode", "DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .groupBy("task_type", "operation_record", "operation_mode", "DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .orderByAsc("DATE_FORMAT(operation_record_time, '%Y-%m-%d')"));
        List<Map<String, Object>> listTasking2 = baseMapper.selectMaps(new QueryWrapper<TaskingLog>()
                .select("operation_record,operation_mode,DATE_FORMAT(operation_record_time, '%Y-%m-%d') as operation_record_time,count(1) as count")
                .select("task_type,operation_record,operation_mode,DATE_FORMAT(operation_record_time, '%Y-%m-%d') as operation_record_time,count(1) as count")
                .eq("operation_record", "旋转2")
                .eq("operation_mode", "结束")
                .gt("operation_record_time", startDate)
                .groupBy("operation_record", "operation_mode", "DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .groupBy("task_type", "operation_record", "operation_mode", "DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .orderByAsc("DATE_FORMAT(operation_record_time, '%Y-%m-%d')"));
        //标准上片记录
        List<Map<String, Object>> loadTaskingList1 = baseMapper.selectMaps(new QueryWrapper<TaskingLog>()
                .select("task_type, operation_record, operation_mode, DATE_FORMAT(operation_record_time, '%Y-%m-%d') as operation_record_time, count(*) as count")
                .eq("task_type", "标准")
                .eq("operation_record", "上片1")
                .eq("operation_mode", "结束")
                .gt("operation_record_time", startDate)
                .groupBy("task_type", "operation_record", "operation_mode", "DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .orderByAsc("DATE_FORMAT(operation_record_time, '%Y-%m-%d')"));
        List<Map<String, Object>> loadTaskingList2 = baseMapper.selectMaps(new QueryWrapper<TaskingLog>()
                .select("task_type, operation_record, operation_mode, DATE_FORMAT(operation_record_time, '%Y-%m-%d') as operation_record_time, count(*) as count")
                .eq("task_type", "标准")
                .eq("operation_record", "上片2")
                .eq("operation_mode", "结束")
                .gt("operation_record_time", startDate)
                .groupBy("task_type", "operation_record", "operation_mode", "DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .orderByAsc("DATE_FORMAT(operation_record_time, '%Y-%m-%d')"));
        // 存储每条线路的数据
        Map<String, Map<String, Integer>> lineDataMap = new HashMap<>();
        lineDataMap.put("line1", new HashMap<>());
        lineDataMap.put("line2", new HashMap<>());
        // 处理第一条线路数据
        // 处理旋转1结束记录
        for (Map<String, Object> map : listTasking1) {
            String date = map.get("operation_record_time").toString();
            int count = Integer.parseInt(map.get("count").toString());
            Map<String, Integer> line1Map = lineDataMap.get("line1");
            line1Map.put(date, line1Map.getOrDefault(date, 0) + count);
        }
        // 处理线路1上片记录
        for (Map<String, Object> map : loadTaskingList1) {
            String date = map.get("operation_record_time").toString();
            int count = Integer.parseInt(map.get("count").toString());
            Map<String, Integer> line1Map = lineDataMap.get("line1");
            line1Map.put(date, line1Map.getOrDefault(date, 0) + count);
        }
        // 处理第二条线路数据
        // 处理旋转2结束记录
        for (Map<String, Object> map : listTasking2) {
            String date = map.get("operation_record_time").toString();
            int count = Integer.parseInt(map.get("count").toString());
            Map<String, Integer> line2Map = lineDataMap.get("line2");
            line2Map.put(date, line2Map.getOrDefault(date, 0) + count);
        }
        // 处理线路2上片记录
        for (Map<String, Object> map : loadTaskingList2) {
            String date = map.get("operation_record_time").toString();
            int count = Integer.parseInt(map.get("count").toString());
            Map<String, Integer> line2Map = lineDataMap.get("line2");
            line2Map.put(date, line2Map.getOrDefault(date, 0) + count);
        }
        //log.info("客户表计划量:{},{},{}",list,listTasking1,listTasking2);
        List<Map> Result=new ArrayList<>();
        for (int i=0;i<dayCount;i++){
@@ -84,28 +199,14 @@
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String dateString = sdf.format(thisdate);
            thisMap.put("date",dateString);
            if (listTasking1.size()>0&&listTasking1.get(0).get("operation_record_time").toString().equals(dateString)){
            // 获取一线数据
            thisMap.put("line1", lineDataMap.get("line1").getOrDefault(dateString, 0));
            // 获取二线数据
            thisMap.put("line2", lineDataMap.get("line2").getOrDefault(dateString, 0));
                thisMap.put("line1",listTasking1.get(0).get("count"));
                listTasking1.remove(0);
            }else{
                thisMap.put("line1",0);
            }
            if (listTasking2.size()>0&&listTasking2.get(0).get("operation_record_time").toString().equals(dateString)){
                thisMap.put("line2",listTasking2.get(0).get("count"));
                listTasking2.remove(0);
            }else{
                thisMap.put("line2",0);
            }
//            if(list.size()>0){
//                log.info("对比:{},{},{}",
//                        list.get(0).get("CreateDate"),
//                        dateString,
//                        list.get(0).get("CreateDate").toString().equals(dateString));
//            }
            if (list.size()>0&&list.get(0).get("CreateDate").toString().equals(dateString)){
            if (list.size()>0 && list.get(0).get("CreateDate").toString().equals(dateString)){
                thisMap.put("plan",list.get(0).get("task_quantity_sum"));
                list.remove(0);
            }else{
@@ -175,4 +276,150 @@
        }
        return 0;
    }
    /**
     * 查询单小时产量
     * @param dayCount 查询天数
     * @return Map 包含每天两条线的平均小时产量
     */
    @Override
    public Map<String, Object> findHourlyOutput(int dayCount) {
        try {
            // 计算开始时间
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            cal.add(Calendar.DATE, -dayCount + 1);
            Date startDate = cal.getTime();
            // 查询一线数据,按天分组统计总产量和工作小时数
            QueryWrapper<TaskingLog> line1Query = new QueryWrapper<>();
            line1Query.select(
                    "DATE_FORMAT(operation_record_time, '%Y-%m-%d') as date",
                    "COUNT(*) as total_count",
                    "COUNT(DISTINCT DATE_FORMAT(operation_record_time, '%H')) as working_hours"
                )
                .eq("operation_record", "旋转1")
                .eq("operation_mode", "结束")
                .ge("operation_record_time", startDate)
                .groupBy("DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .orderByAsc("date");
            List<Map<String, Object>> line1Results = baseMapper.selectMaps(line1Query);
            // 查询二线数据,按天分组统计总产量和工作小时数
            QueryWrapper<TaskingLog> line2Query = new QueryWrapper<>();
            line2Query.select(
                    "DATE_FORMAT(operation_record_time, '%Y-%m-%d') as date",
                    "COUNT(*) as total_count",
                    "COUNT(DISTINCT DATE_FORMAT(operation_record_time, '%H')) as working_hours"
                )
                .eq("operation_record", "旋转2")
                .eq("operation_mode", "结束")
                .ge("operation_record_time", startDate)
                .groupBy("DATE_FORMAT(operation_record_time, '%Y-%m-%d')")
                .orderByAsc("date");
            List<Map<String, Object>> line2Results = baseMapper.selectMaps(line2Query);
            // 合并结果
            Map<String, Object> result = new HashMap<>();
            Map<String, Map<String, Object>> dailyStats = new HashMap<>();
            // 处理一线数据
            for (Map<String, Object> line1Data : line1Results) {
                String date = (String) line1Data.get("date");
                int totalCount = ((Number) line1Data.get("total_count")).intValue();
                int workingHours = ((Number) line1Data.get("working_hours")).intValue();
                Map<String, Object> dailyData = new HashMap<>();
                dailyData.put("date", date);
                dailyData.put("line1Count", totalCount);
                dailyData.put("line1Hours", workingHours);
                dailyData.put("line1HourlyAvg", workingHours > 0 ? totalCount / workingHours : 0);
                dailyStats.put(date, dailyData);
            }
            // 处理二线数据
            for (Map<String, Object> line2Data : line2Results) {
                String date = (String) line2Data.get("date");
                int totalCount = ((Number) line2Data.get("total_count")).intValue();
                int workingHours = ((Number) line2Data.get("working_hours")).intValue();
                Map<String, Object> dailyData = dailyStats.computeIfAbsent(date, k -> {
                    Map<String, Object> newData = new HashMap<>();
                    newData.put("date", date);
                    return newData;
                });
                dailyData.put("line2Count", totalCount);
                dailyData.put("line2Hours", workingHours);
                dailyData.put("line2HourlyAvg", workingHours > 0 ? totalCount / workingHours : 0);
            }
            // 转换为最终的返回格式
            List<Map<String, Object>> finalStats = new ArrayList<>(dailyStats.values());
            // 按日期排序
            finalStats.sort((a, b) -> ((String)a.get("date")).compareTo((String)b.get("date")));
            result.put("dailyStats", finalStats);
            return result;
        } catch (Exception e) {
            log.error("计算单小时产量失败", e);
            throw new RuntimeException("计算单小时产量失败: " + e.getMessage());
        }
    }
    /**
     * 查询库位数据
     * 按库位统计:
     * - 标准工艺:统计上片1和上片2的记录
     * - 定制工艺:统计旋转1和旋转2的记录
     */
    @Override
    public List<Map<String, Object>> selectWareHouse(int dayCount) {
        try {
            // 计算开始时间
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            cal.add(Calendar.DATE, -dayCount + 1);
            Date startDate = cal.getTime();
            // 使用QueryWrapper构建查询
            QueryWrapper<TaskingLog> queryWrapper = new QueryWrapper<>();
            queryWrapper.select(
                    "DATE_FORMAT(operation_record_time, '%Y-%m-%d') as date",
                    "warehouse",
                    "COUNT(*) as count"
                )
                .and(wrapper -> wrapper
                    .and(w -> w
                        .eq("task_type", "标准")
                        .in("operation_record", "上片1", "上片2")
                    )
                    .or(w -> w
                        .eq("task_type", "定制")
                        .in("operation_record", "旋转1", "旋转2")
                    )
                )
                .eq("operation_mode", "结束")
                .ge("operation_record_time", startDate)
                .groupBy("DATE_FORMAT(operation_record_time, '%Y-%m-%d')", "warehouse")
                .orderByAsc("date", "warehouse");
            return baseMapper.selectMaps(queryWrapper);
        } catch (Exception e) {
            log.error("查询库位数据失败", e);
            throw new RuntimeException("查询库位数据失败: " + e.getMessage());
        }
    }
}