feat(oa): 添加时间范围查询和丰富车间统计功能
- 在送货单和工艺卡相关业务对象中添加 startTime 和 endTime 字段,支持日期格式化 - 实现送货单及工艺卡明细的时间范围筛选逻辑 - 新增 CategoryValueVo 类用于封装分类统计数据 - 在车间报表服务中增加发货设备名称分布、制造负责人分布和作业负责人分布统计 - 更新报表视图对象以支持新增的统计字段展示
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.oa.domain.bo;
|
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.AddGroup;
|
||||||
import com.ruoyi.common.core.validate.EditGroup;
|
import com.ruoyi.common.core.validate.EditGroup;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -10,6 +11,7 @@ import java.util.Date;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.ruoyi.common.core.domain.BaseEntity;
|
import com.ruoyi.common.core.domain.BaseEntity;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 送货单主业务对象 oa_delivery_order
|
* 送货单主业务对象 oa_delivery_order
|
||||||
@@ -115,4 +117,11 @@ public class OaDeliveryOrderBo extends BaseEntity {
|
|||||||
//明细
|
//明细
|
||||||
private List<OaDeliveryOrderDetailBo> detailList;
|
private List<OaDeliveryOrderDetailBo> 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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.oa.domain.bo;
|
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.AddGroup;
|
||||||
import com.ruoyi.common.core.validate.EditGroup;
|
import com.ruoyi.common.core.validate.EditGroup;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -10,6 +11,7 @@ import java.util.Date;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import com.ruoyi.common.core.domain.BaseEntity;
|
import com.ruoyi.common.core.domain.BaseEntity;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 送货单明细业务对象 oa_delivery_order_detail
|
* 送货单明细业务对象 oa_delivery_order_detail
|
||||||
@@ -102,5 +104,12 @@ public class OaDeliveryOrderDetailBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
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;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.ruoyi.common.core.domain.BaseEntity;
|
import com.ruoyi.common.core.domain.BaseEntity;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 工艺卡主业务对象 oa_process_card
|
* 工艺卡主业务对象 oa_process_card
|
||||||
@@ -68,4 +69,12 @@ public class OaProcessCardBo extends BaseEntity {
|
|||||||
//工艺卡明细
|
//工艺卡明细
|
||||||
private List<OaProcessCardDetailBo> oaProcessCardDetailList;
|
private List<OaProcessCardDetailBo> 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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import java.util.Date;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.ruoyi.common.core.domain.BaseEntity;
|
import com.ruoyi.common.core.domain.BaseEntity;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 工艺卡明细业务对象 oa_process_card_detail
|
* 工艺卡明细业务对象 oa_process_card_detail
|
||||||
@@ -78,5 +79,12 @@ public class OaProcessCardDetailBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
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;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.ruoyi.oa.domain.vo.dashboard;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CategoryValueVo {
|
||||||
|
private String name;
|
||||||
|
private Long value;
|
||||||
|
}
|
||||||
@@ -49,4 +49,10 @@ public class OaWorkshopReportSummaryVo {
|
|||||||
private List<String> manufacturingLeaders;
|
private List<String> manufacturingLeaders;
|
||||||
@ExcelProperty("作业负责人列表")
|
@ExcelProperty("作业负责人列表")
|
||||||
private List<String> operationLeaders;
|
private List<String> operationLeaders;
|
||||||
|
|
||||||
|
// 明细设备名称分布
|
||||||
|
private List<CategoryValueVo> deliveryEquipmentDistribution;
|
||||||
|
// 负责人分布
|
||||||
|
private List<CategoryValueVo> manufacturingLeaderDistribution;
|
||||||
|
private List<CategoryValueVo> operationLeaderDistribution;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ public class OaDeliveryOrderDetailServiceImpl implements IOaDeliveryOrderDetailS
|
|||||||
lqw.eq(bo.getVolume() != null, OaDeliveryOrderDetail::getVolume, bo.getVolume());
|
lqw.eq(bo.getVolume() != null, OaDeliveryOrderDetail::getVolume, bo.getVolume());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getBoxSize()), OaDeliveryOrderDetail::getBoxSize, bo.getBoxSize());
|
lqw.eq(StringUtils.isNotBlank(bo.getBoxSize()), OaDeliveryOrderDetail::getBoxSize, bo.getBoxSize());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getDetailRemark()), OaDeliveryOrderDetail::getDetailRemark, bo.getDetailRemark());
|
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);
|
lqw.orderByDesc(OaDeliveryOrderDetail::getCreateTime);
|
||||||
return lqw;
|
return lqw;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ public class OaDeliveryOrderServiceImpl implements IOaDeliveryOrderService {
|
|||||||
qw.eq(StringUtils.isNotBlank(bo.getDeliveryRemark()), "odo.delivery_remark", bo.getDeliveryRemark());
|
qw.eq(StringUtils.isNotBlank(bo.getDeliveryRemark()), "odo.delivery_remark", bo.getDeliveryRemark());
|
||||||
// 模糊查询(供应商全称)
|
// 模糊查询(供应商全称)
|
||||||
qw.like(StringUtils.isNotBlank(bo.getSupplierFullname()), "odo.supplier_fullname", bo.getSupplierFullname());
|
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");
|
qw.orderByDesc("odo.create_time");
|
||||||
//逻辑删除
|
//逻辑删除
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ public class OaProcessCardDetailServiceImpl implements IOaProcessCardDetailServi
|
|||||||
lqw.eq(bo.getProcessEndTime() != null, OaProcessCardDetail::getProcessEndTime, bo.getProcessEndTime());
|
lqw.eq(bo.getProcessEndTime() != null, OaProcessCardDetail::getProcessEndTime, bo.getProcessEndTime());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getInspector()), OaProcessCardDetail::getInspector, bo.getInspector());
|
lqw.eq(StringUtils.isNotBlank(bo.getInspector()), OaProcessCardDetail::getInspector, bo.getInspector());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getUnqualifiedContent()), OaProcessCardDetail::getUnqualifiedContent, bo.getUnqualifiedContent());
|
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);
|
lqw.orderByDesc(OaProcessCardDetail::getCreateTime);
|
||||||
return lqw;
|
return lqw;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService {
|
|||||||
qw.eq(bo.getPlannedDeliveryDate() != null, "oc.planned_delivery_date", bo.getPlannedDeliveryDate());
|
qw.eq(bo.getPlannedDeliveryDate() != null, "oc.planned_delivery_date", bo.getPlannedDeliveryDate());
|
||||||
// 模糊查询(设备名称)
|
// 模糊查询(设备名称)
|
||||||
qw.like(StringUtils.isNotBlank(bo.getEquipmentName()), "oc.equipment_name", bo.getEquipmentName());
|
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");
|
qw.orderByDesc("oc.create_time");
|
||||||
// 逻辑删除
|
// 逻辑删除
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.ruoyi.oa.domain.OaDeliveryOrderDetail;
|
|||||||
import com.ruoyi.oa.domain.OaProcessCard;
|
import com.ruoyi.oa.domain.OaProcessCard;
|
||||||
import com.ruoyi.oa.domain.OaProcessCardDetail;
|
import com.ruoyi.oa.domain.OaProcessCardDetail;
|
||||||
import com.ruoyi.oa.domain.vo.dashboard.OaWorkshopReportSummaryVo;
|
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.OaDeliveryOrderDetailMapper;
|
||||||
import com.ruoyi.oa.mapper.OaDeliveryOrderMapper;
|
import com.ruoyi.oa.mapper.OaDeliveryOrderMapper;
|
||||||
import com.ruoyi.oa.mapper.OaProcessCardDetailMapper;
|
import com.ruoyi.oa.mapper.OaProcessCardDetailMapper;
|
||||||
@@ -160,6 +161,62 @@ public class OaWorkshopReportServiceImpl implements IOaWorkshopReportService {
|
|||||||
involvedProjects.addAll(projFromCards);
|
involvedProjects.addAll(projFromCards);
|
||||||
vo.setInvolvedProjectCount(involvedProjects.size());
|
vo.setInvolvedProjectCount(involvedProjects.size());
|
||||||
|
|
||||||
|
// 发货明细设备名称分布
|
||||||
|
List<CategoryValueVo> equipDist = new ArrayList<>();
|
||||||
|
if (CollectionUtils.isNotEmpty(orderIds)) {
|
||||||
|
LambdaQueryWrapper<OaDeliveryOrderDetail> dWrap2 = Wrappers.lambdaQuery();
|
||||||
|
dWrap2.in(OaDeliveryOrderDetail::getOrderId, orderIds).eq(OaDeliveryOrderDetail::getDelFlag, 0);
|
||||||
|
List<OaDeliveryOrderDetail> detailsAll = deliveryOrderDetailMapper.selectList(dWrap2);
|
||||||
|
Map<String, Long> equipCount = detailsAll.stream()
|
||||||
|
.map(OaDeliveryOrderDetail::getEquipmentName)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
|
||||||
|
equipCount.entrySet().stream()
|
||||||
|
.sorted(Map.Entry.<String, Long>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<String, Long> mLeaderCount = cards.stream()
|
||||||
|
.map(OaProcessCard::getManufacturingLeader)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
|
||||||
|
Map<String, Long> oLeaderCount = cards.stream()
|
||||||
|
.map(OaProcessCard::getOperationLeader)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
|
||||||
|
|
||||||
|
List<CategoryValueVo> mLeaderDist = mLeaderCount.entrySet().stream()
|
||||||
|
.sorted(Map.Entry.<String, Long>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<CategoryValueVo> oLeaderDist = oLeaderCount.entrySet().stream()
|
||||||
|
.sorted(Map.Entry.<String, Long>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;
|
return vo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user