lipenghui 3 долоо хоног өмнө
parent
commit
235877333d

+ 36 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java

@@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableMap;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -244,4 +245,39 @@ public class DateUtils {
         double hoursDiff = duration.toHours() + (duration.toMinutes() % 60) / 60.0;
         return new BigDecimal(hoursDiff).setScale(1, RoundingMode.HALF_UP);
     }
+    public static List<String> getLastSevenDays() {
+        List<String> dates = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        // 获取今天的日期
+        LocalDate today = LocalDate.now();
+
+        // 生成近七天的日期
+        for (int i = 0; i < 7; i++) {
+            LocalDate date = today.minusDays(i);
+            dates.add(date.format(formatter));
+        }
+
+        return dates;
+    }
+
+    /**
+     * 获取指定日期的开始时间
+     * @param dateStr 日期字符串,格式为yyyy-MM-dd
+     * @return 当天的开始时间LocalDateTime (00:00:00)
+     */
+    public static LocalDateTime getStartOfDay(String dateStr) {
+        LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE);
+        return date.atStartOfDay();
+    }
+
+    /**
+     * 获取指定日期的结束时间
+     * @param dateStr 日期字符串,格式为yyyy-MM-dd
+     * @return 当天的结束时间LocalDateTime (23:59:59.999999999)
+     */
+    public static LocalDateTime getEndOfDay(String dateStr) {
+        LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE);
+        return date.atTime(LocalTime.MAX);
+    }
 }

+ 47 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoutbound/IotOutboundController.java

@@ -22,7 +22,11 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -90,4 +94,45 @@ public class IotOutboundController {
                         BeanUtils.toBean(list, IotOutboundRespVO.class));
     }
 
-}
+    @GetMapping("/materials/top")
+    @Operation(summary = "出库处理")
+    @PreAuthorize("@ss.hasPermission('pms:iot-outbound:query')")
+    public CommonResult<List<Map<String, Object>>> getIotOutboundMaterialTop() {
+        LocalDate today = LocalDate.now();
+        // 计算七天前的日期
+        LocalDate sevenDaysAgo = today.minusDays(7);
+        // 构建起始日期的LocalDateTime(当天的开始时间:00:00:00)
+        LocalDateTime startDateTime = sevenDaysAgo.atStartOfDay();
+        // 构建结束日期的LocalDateTime(今天的结束时间:23:59:59.999999999)
+        LocalDateTime endDateTime = today.atTime(LocalTime.MAX);
+        IotOutboundPageReqVO iotOutboundPageReqVO = new IotOutboundPageReqVO();
+        LocalDateTime[] createTime = new LocalDateTime[]{startDateTime, endDateTime};
+        iotOutboundPageReqVO.setCreateTime(createTime);
+        iotOutboundPageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        PageResult<IotOutboundDO> pageResult = iotOutboundService.getIotOutboundPage(iotOutboundPageReqVO);
+        List<IotOutboundDO> list = pageResult.getList();
+        List<IotOutboundDO> collect = list.stream().filter(e ->Objects.nonNull(e.getMaterialName())).collect(Collectors.toList());
+
+
+        // 按name字段分组并计数
+        Map<String, Long> countByName = collect.stream()
+                .collect(Collectors.groupingBy(IotOutboundDO::getMaterialName, Collectors.counting()));
+
+        // 转换为Entry列表并按计数排序
+        List<Map.Entry<String, Long>> sortedEntries = new ArrayList<>(countByName.entrySet());
+        sortedEntries.sort(Map.Entry.<String, Long>comparingByValue().reversed());
+
+        // 获取前五个
+        List<Map.Entry<String, Long>> topFive = sortedEntries.stream()
+                .limit(5)
+                .collect(Collectors.toList());
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, Long> stringLongEntry : topFive) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("name", stringLongEntry.getKey());
+            map.put("value", stringLongEntry.getValue());
+            result.add(map);
+        }
+        return success(result);
+    }
+}

+ 140 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.DeviceHistoryParam;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.inspect.order.vo.IotInspectOrderPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.DeviceVO;
@@ -29,6 +30,7 @@ import cn.iocoder.yudao.module.pms.dal.mysql.failure.IotFailureReportMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderDetailMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotsapstock.IotSapStockMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
 import cn.iocoder.yudao.module.pms.service.DeviceServiceImpl;
@@ -57,14 +59,17 @@ import org.springframework.web.client.RestTemplate;
 import javax.annotation.Resource;
 import javax.annotation.security.PermitAll;
 import javax.validation.Valid;
+import java.io.Serializable;
 import java.sql.Timestamp;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.getLastYearMonthRanges;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
 
 @Tag(name = "统计接口")
 @RestController
@@ -103,6 +108,8 @@ public class IotStaticController {
     private IotInspectOrderDetailMapper iotInspectOrderDetailMapper;
     @Autowired
     private DeptService deptService;
+    @Autowired
+    private IotOpeationFillMapper iotOpeationFillMapper;
 
     @GetMapping("/main/day")
     public CommonResult<Map<String, Object>> getMaintainDay() {
@@ -521,4 +528,136 @@ public class IotStaticController {
         });
         return success(ImmutableMap.of("todo", todo.get(),"finished", finished.get()));
     }
+
+    @GetMapping("/rh/order")
+    @PermitAll
+    public CommonResult<Map<String, Object>> getOrderNumberStat() {
+        List<String> lastSevenDays = DateUtils.getLastSevenDays();
+        String first = lastSevenDays.get(0);
+        String last = lastSevenDays.get(lastSevenDays.size() - 1);
+        LocalDateTime startOfDay = getStartOfDay(first);
+        LocalDateTime endOfDay = getEndOfDay(last);
+        LocalDateTime[] createTime = new LocalDateTime[]{endOfDay, startOfDay};
+
+        IotOpeationFillPageReqVO iotOpeationFillPageReqVO = new IotOpeationFillPageReqVO();
+        iotOpeationFillPageReqVO.setCreateTime(createTime);
+        List<Map<String, Object>> fills = iotOpeationFillMapper.selectListByCreateTime(iotOpeationFillPageReqVO).stream().map(e -> {
+            Map<String, Object> abc = new HashMap<>();
+            abc.put("id", e.getId());
+            abc.put("createTime", e.getCreateTime());
+            return abc;
+        }).collect(Collectors.toList());
+        Map<String, Long> fillMap = countRecordsByDate(fills, 7);
+        LinkedList<Object> xAxis = new LinkedList<>();
+        LinkedList<Object> fillData = new LinkedList<>();
+        fillMap.forEach( (k,v)->{
+            xAxis.add(k);
+            fillData.add(v);
+        });
+
+        IotMaintainPageReqVO iotMaintainPageReqVO = new IotMaintainPageReqVO();
+        iotMaintainPageReqVO.setCreateTime(createTime);
+        List<Map<String, Object>> maintains = iotMaintainMapper.selectListByCreateTime(iotMaintainPageReqVO).stream().map(e -> {
+            Map<String, Object> abc = new HashMap<>();
+            abc.put("id", e.getId());
+            abc.put("createTime", e.getCreateTime());
+            return abc;
+        }).collect(Collectors.toList());
+        Map<String, Long> maintainMap = countRecordsByDate(maintains, 7);
+        LinkedList<Object> maintainData = new LinkedList<>();
+        maintainMap.forEach( (k,v)->{
+            maintainData.add(v);
+        });
+
+        IotMainWorkOrderPageReqVO iotMainWorkOrderPageReqVO = new IotMainWorkOrderPageReqVO();
+        iotMainWorkOrderPageReqVO.setCreateTime(createTime);
+        List<Map<String, Object>> works = iotMainWorkOrderMapper.selectListByCreateTime(iotMainWorkOrderPageReqVO).stream().map(e -> {
+            Map<String, Object> abc = new HashMap<>();
+            abc.put("id", e.getId());
+            abc.put("createTime", e.getCreateTime());
+            return abc;
+        }).collect(Collectors.toList());
+        Map<String, Long> workMap = countRecordsByDate(works, 7);
+        LinkedList<Object> workData = new LinkedList<>();
+        workMap.forEach( (k,v)->{
+            workData.add(v);
+        });
+
+
+        IotInspectOrderPageReqVO iotInspectOrderPageReqVO = new IotInspectOrderPageReqVO();
+        iotInspectOrderPageReqVO.setCreateTime(createTime);
+        List<Map<String, Object>> inspects = iotInspectOrderMapper.selectListByCreateTime(iotInspectOrderPageReqVO).stream().map(e -> {
+            Map<String, Object> abc = new HashMap<>();
+            abc.put("id", e.getId());
+            abc.put("createTime", e.getCreateTime());
+            return abc;
+        }).collect(Collectors.toList());
+        Map<String, Long> inspectMap = countRecordsByDate(inspects, 7);
+        LinkedList<Object> inspectData = new LinkedList<>();
+        inspectMap.forEach( (k,v)->{
+            inspectData.add(v);
+        });
+
+        ImmutableMap<String, Serializable> maintainResult = ImmutableMap.of("name", "维修工单", "data", maintainData);
+        ImmutableMap<String, Serializable> workResult = ImmutableMap.of("name", "保养工单", "data", workData);
+        ImmutableMap<String, Serializable> inspectResult = ImmutableMap.of("name", "巡检工单", "data", inspectData);
+        ImmutableMap<String, Serializable> fillResult = ImmutableMap.of("name", "运行记录", "data", fillData);
+        return success(ImmutableMap.of("xAxis", xAxis, "series", ImmutableList.of(maintainResult, workResult,inspectResult, fillResult)));
+//        for (String lastSevenDay : lastSevenDays) {
+//            // 转换为LocalDateTime
+//            LocalDateTime startOfDay = getStartOfDay(lastSevenDay);
+//            LocalDateTime endOfDay = getEndOfDay(lastSevenDay);
+//            IotMaintainPageReqVO iotMaintainPageReqVO = new IotMaintainPageReqVO();
+//            LocalDateTime[] createTime = new LocalDateTime[]{startOfDay, endOfDay};
+//            iotMaintainPageReqVO.setCreateTime(createTime);
+//            Long maintainCount = iotMaintainMapper.selectCountByTimeAndStatus(iotMaintainPageReqVO);
+//            maintain.add(maintainCount);
+//            IotMainWorkOrderPageReqVO iotMainWorkOrderPageReqVO = new IotMainWorkOrderPageReqVO();
+//            iotMainWorkOrderPageReqVO.setCreateTime(createTime);
+//            Long workOrderCount = iotMainWorkOrderMapper.selectCountByTimeAndStatus(iotMainWorkOrderPageReqVO);
+//            workorder.add(workOrderCount);
+//            IotInspectOrderPageReqVO iotInspectOrderPageReqVO = new IotInspectOrderPageReqVO();
+//            iotInspectOrderPageReqVO.setCreateTime(createTime);
+//            Long inspectCount = iotInspectOrderMapper.selectCountByTimeAndStatus(iotInspectOrderPageReqVO);
+//            inspect.add(inspectCount);
+//        }
+
+    }
+
+    public static Map<String, Long> countRecordsByDate(List<Map<String, Object>> records, int days) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate today = LocalDate.now();
+
+        // 生成近七天的日期列表
+        Map<String, Long> dateMap = new HashMap<>();
+        for (int i = 0; i < days; i++) {
+            LocalDate date = today.minusDays(i);
+            dateMap.put(date.format(formatter), 0L);
+        }
+
+        // 统计每天的记录数量
+        Map<String, Long> countMap = records.stream()
+                .collect(Collectors.groupingBy(
+                        record -> {
+                            try {
+                                // 提取日期部分
+                                return String.valueOf(record.get("createTime")).substring(0, 10);
+                            } catch (Exception e) {
+                                System.err.println("日期格式错误: " + record.get("createTime"));
+                                return "invalid_date";
+                            }
+                        },
+                        Collectors.counting()
+                ));
+
+        // 合并两个映射,确保所有日期都存在
+        dateMap.forEach((date, count) -> {
+            if (countMap.containsKey(date)) {
+                dateMap.put(date, countMap.get(date));
+            }
+        });
+
+        return dateMap;
+    }
 }
+

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotopeationfill/IotOpeationFillDO.java

@@ -107,4 +107,4 @@ public class IotOpeationFillDO extends BaseDO {
     private Long orderId;
     private String mobile;
 
-}
+}

+ 6 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java

@@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.Iot
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
@@ -23,6 +24,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Mapper;
@@ -53,6 +55,9 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
                 .betweenIfPresent(IotOpeationFillDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(IotOpeationFillDO::getId));
     }
+
+    @TenantIgnore
+    List<IotOpeationFillOrderDO> selectListByCreateTime(IotOpeationFillPageReqVO reqVO);
     @TenantIgnore
     List<IotOpeationFillDO> getFillDevices();
     @TenantIgnore
@@ -126,4 +131,4 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     IPage<IotDeviceCountData> deviceCountList(IPage<IotOpeationFillPageReqVO> page, @Param("deptId") Long deptId,
                                               @Param("createTime")LocalDateTime[] createTime,@Param("isFill") Integer isFill,@Param("orderName") String orderName);
 
-}
+}

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintain/IotMaintainMapper.java

@@ -3,9 +3,11 @@ package cn.iocoder.yudao.module.pms.dal.mysql.maintain;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -77,4 +79,8 @@ public interface IotMaintainMapper extends BaseMapperX<IotMaintainDO> {
                 .in(IotMaintainDO::getDeviceId, deviceIds));
     }
     IPage<OrderVo> selectNotice(IPage<OrderVo> page, @Param("reqVO")OrderVo reqVO);
+    default List<IotMaintainDO> selectListByCreateTime(IotMaintainPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotMaintainDO>()
+                .betweenIfPresent(IotMaintainDO::getCreateTime, reqVO.getCreateTime()));
+    }
 }

+ 8 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -272,6 +272,13 @@
         ORDER BY a.create_time DESC
     </select>
 
+    <select id="selectListByCreateTime" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO"
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO">
+        SELECT a.id, a.create_time
+        FROM rq_iot_opeation_fill_order a
+        WHERE a.create_time BETWEEN #{createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler} AND #{createTime[1],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+    </select>
+
     <select id="rhList"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         SELECT au.id, au.name, au.parent_id
@@ -707,4 +714,4 @@
         </if>) a
     </select>
 
-</mapper>
+</mapper>