From e71ba481df9e9d377abb3b00143fefa83deb4e41 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 12 Dec 2025 11:07:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(oa):=20=E6=B7=BB=E5=8A=A0=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=8C=83=E5=9B=B4=E6=9F=A5=E8=AF=A2=E5=92=8C=E4=B8=B0?= =?UTF-8?q?=E5=AF=8C=E8=BD=A6=E9=97=B4=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在送货单和工艺卡相关业务对象中添加 startTime 和 endTime 字段,支持日期格式化 - 实现送货单及工艺卡明细的时间范围筛选逻辑 - 新增 CategoryValueVo 类用于封装分类统计数据 - 在车间报表服务中增加发货设备名称分布、制造负责人分布和作业负责人分布统计 - 更新报表视图对象以支持新增的统计字段展示 --- .../ruoyi/oa/domain/bo/OaDeliveryOrderBo.java | 9 +++ .../oa/domain/bo/OaDeliveryOrderDetailBo.java | 9 +++ .../ruoyi/oa/domain/bo/OaProcessCardBo.java | 9 +++ .../oa/domain/bo/OaProcessCardDetailBo.java | 8 +++ .../domain/vo/dashboard/CategoryValueVo.java | 9 +++ .../dashboard/OaWorkshopReportSummaryVo.java | 6 ++ .../OaDeliveryOrderDetailServiceImpl.java | 2 + .../impl/OaDeliveryOrderServiceImpl.java | 2 + .../impl/OaProcessCardDetailServiceImpl.java | 2 + .../impl/OaProcessCardServiceImpl.java | 2 + .../OaWorkshopReportServiceImpl.java | 57 +++++++++++++++++++ 11 files changed, 115 insertions(+) create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/CategoryValueVo.java diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderBo.java index f64e7d6..0e95049 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderBo.java @@ -1,5 +1,6 @@ package com.ruoyi.oa.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import lombok.Data; @@ -10,6 +11,7 @@ import java.util.Date; import java.util.List; import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; /** * 送货单主业务对象 oa_delivery_order @@ -115,4 +117,11 @@ public class OaDeliveryOrderBo extends BaseEntity { //明细 private List detailList; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderDetailBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderDetailBo.java index a0b7a67..da7626b 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderDetailBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaDeliveryOrderDetailBo.java @@ -1,5 +1,6 @@ package com.ruoyi.oa.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import lombok.Data; @@ -10,6 +11,7 @@ import java.util.Date; import java.math.BigDecimal; import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; /** * 送货单明细业务对象 oa_delivery_order_detail @@ -102,5 +104,12 @@ public class OaDeliveryOrderDetailBo extends BaseEntity { */ private String remark; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardBo.java index bc10867..55c4b71 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardBo.java @@ -13,6 +13,7 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; /** * 工艺卡主业务对象 oa_process_card @@ -68,4 +69,12 @@ public class OaProcessCardBo extends BaseEntity { //工艺卡明细 private List oaProcessCardDetailList; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardDetailBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardDetailBo.java index 9a233aa..7f70f2e 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardDetailBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProcessCardDetailBo.java @@ -11,6 +11,7 @@ import java.util.Date; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; /** * 工艺卡明细业务对象 oa_process_card_detail @@ -78,5 +79,12 @@ public class OaProcessCardDetailBo extends BaseEntity { */ private String remark; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/CategoryValueVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/CategoryValueVo.java new file mode 100644 index 0000000..b75f0e5 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/CategoryValueVo.java @@ -0,0 +1,9 @@ +package com.ruoyi.oa.domain.vo.dashboard; + +import lombok.Data; + +@Data +public class CategoryValueVo { + private String name; + private Long value; +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/OaWorkshopReportSummaryVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/OaWorkshopReportSummaryVo.java index 2d5ab79..d065212 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/OaWorkshopReportSummaryVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/dashboard/OaWorkshopReportSummaryVo.java @@ -49,4 +49,10 @@ public class OaWorkshopReportSummaryVo { private List manufacturingLeaders; @ExcelProperty("作业负责人列表") private List operationLeaders; + + // 明细设备名称分布 + private List deliveryEquipmentDistribution; + // 负责人分布 + private List manufacturingLeaderDistribution; + private List operationLeaderDistribution; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderDetailServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderDetailServiceImpl.java index 67bb3f6..f835c15 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderDetailServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderDetailServiceImpl.java @@ -83,6 +83,8 @@ public class OaDeliveryOrderDetailServiceImpl implements IOaDeliveryOrderDetailS lqw.eq(bo.getVolume() != null, OaDeliveryOrderDetail::getVolume, bo.getVolume()); lqw.eq(StringUtils.isNotBlank(bo.getBoxSize()), OaDeliveryOrderDetail::getBoxSize, bo.getBoxSize()); lqw.eq(StringUtils.isNotBlank(bo.getDetailRemark()), OaDeliveryOrderDetail::getDetailRemark, bo.getDetailRemark()); + // 时间范围查询创建时间 + lqw.between(bo.getStartTime() != null && bo.getEndTime() != null, OaDeliveryOrderDetail::getCreateTime, bo.getStartTime(), bo.getEndTime()); // 时间范围查询创建时间 lqw.orderByDesc(OaDeliveryOrderDetail::getCreateTime); return lqw; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderServiceImpl.java index 153affe..6ac6860 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaDeliveryOrderServiceImpl.java @@ -80,6 +80,8 @@ public class OaDeliveryOrderServiceImpl implements IOaDeliveryOrderService { qw.eq(StringUtils.isNotBlank(bo.getDeliveryRemark()), "odo.delivery_remark", bo.getDeliveryRemark()); // 模糊查询(供应商全称) qw.like(StringUtils.isNotBlank(bo.getSupplierFullname()), "odo.supplier_fullname", bo.getSupplierFullname()); + // 时间范围筛选 + qw.between(bo.getStartTime() != null && bo.getEndTime() != null, "odo.create_time", bo.getStartTime(), bo.getEndTime()); // 按创建时间降序排序 qw.orderByDesc("odo.create_time"); //逻辑删除 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardDetailServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardDetailServiceImpl.java index cc180d6..eb14ed4 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardDetailServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardDetailServiceImpl.java @@ -76,6 +76,8 @@ public class OaProcessCardDetailServiceImpl implements IOaProcessCardDetailServi lqw.eq(bo.getProcessEndTime() != null, OaProcessCardDetail::getProcessEndTime, bo.getProcessEndTime()); lqw.eq(StringUtils.isNotBlank(bo.getInspector()), OaProcessCardDetail::getInspector, bo.getInspector()); lqw.eq(StringUtils.isNotBlank(bo.getUnqualifiedContent()), OaProcessCardDetail::getUnqualifiedContent, bo.getUnqualifiedContent()); + // 时间范围筛选 + lqw.between(bo.getStartTime() != null && bo.getEndTime() != null, OaProcessCardDetail::getCreateTime, bo.getStartTime(), bo.getEndTime()); lqw.orderByDesc(OaProcessCardDetail::getCreateTime); return lqw; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardServiceImpl.java index b322885..0c3bf89 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProcessCardServiceImpl.java @@ -70,6 +70,8 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService { qw.eq(bo.getPlannedDeliveryDate() != null, "oc.planned_delivery_date", bo.getPlannedDeliveryDate()); // 模糊查询(设备名称) qw.like(StringUtils.isNotBlank(bo.getEquipmentName()), "oc.equipment_name", bo.getEquipmentName()); + // 时间范围筛选 startTime endTime + qw.between(bo.getStartTime() != null && bo.getEndTime() != null, "oc.create_time", bo.getStartTime(), bo.getEndTime()); // 按创建时间降序排序 qw.orderByDesc("oc.create_time"); // 逻辑删除 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/dashboard/OaWorkshopReportServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/dashboard/OaWorkshopReportServiceImpl.java index fb98f1b..c0ddfa0 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/dashboard/OaWorkshopReportServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/dashboard/OaWorkshopReportServiceImpl.java @@ -7,6 +7,7 @@ import com.ruoyi.oa.domain.OaDeliveryOrderDetail; import com.ruoyi.oa.domain.OaProcessCard; import com.ruoyi.oa.domain.OaProcessCardDetail; import com.ruoyi.oa.domain.vo.dashboard.OaWorkshopReportSummaryVo; +import com.ruoyi.oa.domain.vo.dashboard.CategoryValueVo; import com.ruoyi.oa.mapper.OaDeliveryOrderDetailMapper; import com.ruoyi.oa.mapper.OaDeliveryOrderMapper; import com.ruoyi.oa.mapper.OaProcessCardDetailMapper; @@ -160,6 +161,62 @@ public class OaWorkshopReportServiceImpl implements IOaWorkshopReportService { involvedProjects.addAll(projFromCards); vo.setInvolvedProjectCount(involvedProjects.size()); + // 发货明细设备名称分布 + List equipDist = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(orderIds)) { + LambdaQueryWrapper dWrap2 = Wrappers.lambdaQuery(); + dWrap2.in(OaDeliveryOrderDetail::getOrderId, orderIds).eq(OaDeliveryOrderDetail::getDelFlag, 0); + List detailsAll = deliveryOrderDetailMapper.selectList(dWrap2); + Map equipCount = detailsAll.stream() + .map(OaDeliveryOrderDetail::getEquipmentName) + .filter(Objects::nonNull) + .collect(Collectors.groupingBy(s -> s, Collectors.counting())); + equipCount.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(20) + .forEach(e -> { + CategoryValueVo cv = new CategoryValueVo(); + cv.setName(e.getKey()); + cv.setValue(e.getValue()); + equipDist.add(cv); + }); + } + vo.setDeliveryEquipmentDistribution(equipDist); + + // 4.3 负责人分布(从主表统计) + Map mLeaderCount = cards.stream() + .map(OaProcessCard::getManufacturingLeader) + .filter(Objects::nonNull) + .collect(Collectors.groupingBy(s -> s, Collectors.counting())); + Map oLeaderCount = cards.stream() + .map(OaProcessCard::getOperationLeader) + .filter(Objects::nonNull) + .collect(Collectors.groupingBy(s -> s, Collectors.counting())); + + List mLeaderDist = mLeaderCount.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(20) + .map(e -> { + CategoryValueVo cv = new CategoryValueVo(); + cv.setName(e.getKey()); + cv.setValue(e.getValue()); + return cv; + }) + .collect(Collectors.toList()); + vo.setManufacturingLeaderDistribution(mLeaderDist); + + List oLeaderDist = oLeaderCount.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(20) + .map(e -> { + CategoryValueVo cv = new CategoryValueVo(); + cv.setName(e.getKey()); + cv.setValue(e.getValue()); + return cv; + }) + .collect(Collectors.toList()); + vo.setOperationLeaderDistribution(oLeaderDist); + return vo; } }