From 9e03f0d27bb5cf8d041788961c9a240ea270db87 Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 29 Apr 2026 17:11:38 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor(=E8=BD=A6=E8=BE=86=E7=94=9F?= =?UTF-8?q?=E5=91=BD=E5=91=A8=E6=9C=9F):=20=E4=BC=98=E5=8C=96=E8=BD=A6?= =?UTF-8?q?=E8=BE=86=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E8=81=9A=E5=90=88?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=B8=8E=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构车辆生命周期聚合逻辑,移除未使用的最近事件时间线功能,专注于维保工单展示。新增轮胎保养记录查询接口,统一花纹深度计算口径。优化前端展示,分离里程记录与保养记录,提升数据准确性。 - 移除 CarLifecycleEventDTO 及相关查询逻辑 - 新增 selectMaintenanceMileageListByRFID 等接口查询保养记录 - 统一使用保养记录作为花纹深度计算标准 - 优化前端模板,分离展示里程与保养记录 - 修复里程记录中车牌号缺失问题 --- .../templates/tyre/tyre/typreDetill2.html | 43 ++- .../ruoyi/system/domain/CarLifecycleDTO.java | 19 +- .../system/domain/CarLifecycleEventDTO.java | 304 ------------------ .../system/domain/CarMileageLifecycleDTO.java | 13 + .../system/domain/RecordTyreMileage.java | 82 +++-- .../system/mapper/BaseCarLifecycleMapper.java | 15 +- .../ruoyi/system/mapper/BaseTyreMapper.java | 26 ++ .../impl/BaseCarLifecycleServiceImpl.java | 15 +- .../service/impl/BaseTyreServiceImpl.java | 217 +++++++++++-- .../mapper/tyre/BaseCarLifecycleMapper.xml | 120 +------ .../resources/mapper/tyre/BaseTyreMapper.xml | 42 +++ .../mapper/tyre/RecordTyreMileageMapper.xml | 36 ++- 12 files changed, 377 insertions(+), 555 deletions(-) delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleEventDTO.java diff --git a/ruoyi-admin/src/main/resources/templates/tyre/tyre/typreDetill2.html b/ruoyi-admin/src/main/resources/templates/tyre/tyre/typreDetill2.html index fb640d3b..283d4e71 100644 --- a/ruoyi-admin/src/main/resources/templates/tyre/tyre/typreDetill2.html +++ b/ruoyi-admin/src/main/resources/templates/tyre/tyre/typreDetill2.html @@ -280,10 +280,11 @@ recordWarehousingList=${resultMap['recordWarehousingList']}, recordTyreInstallList=${resultMap['recordTyreInstallList']}, recordTyreMileageList=${resultMap['recordTyreMileageList']}, + maintenanceMileageList=${resultMap['maintenanceMileageList']}, totalMileage=${resultMap['totalMileage']}, currentPatternDepth=${resultMap['currentPatternDepth']}, bizMaintenanceOrder=${resultMap['bizMaintenanceOrder']}, - bizOrderTireDetailList=${resultMap['bizMaintenanceOrder'] == null ? null : resultMap['bizMaintenanceOrder'].bizOrderTireDetailList}"> + bizMaintenanceOrderList=${resultMap['bizMaintenanceOrderList']}">
@@ -334,7 +335,7 @@
当前剩余花纹
- +
-
@@ -388,8 +389,8 @@ 出入库记录:0 装卸车记录:0 里程使用记录:0 - 维保工单:0 - 维保轮胎明细:0 + 保养记录:0 + 维保工单:0
@@ -465,10 +466,34 @@
-
+
+
保养记录
+
    +
  • + +
    +
    轮胎保养
    +
    -
    +
    +
    +
    车牌号:-
    +
    行驶里程:-
    +
    当前剩余花纹:-
    + +
    磨损数:-
    +
    开始时间:-
    +
    结束时间:-
    +
    记录人:-
    +
    备注:-
    +
    +
  • +
+
+ +
维保工单
    -
  • +
  • @@ -507,9 +532,9 @@
    备注:-
    如该工单涉及多条轮胎明细,请以维保工单详情页为完整明细来源。
    -
    +
    轮胎执行明细
    -
    +
    动作:-
    轮位:-
    轮胎编号:-
    @@ -525,7 +550,7 @@
-
+
暂无生命周期记录
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleDTO.java index b6b8ee41..9a7e994d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleDTO.java @@ -7,9 +7,9 @@ import java.util.List; /** * 车辆生命周期聚合报表DTO。 *

- * 作为车辆全生命周期弹窗“首屏”的统一返回对象,承载车辆概要、当前装车轮胎快照、 - * 最近事件时间线、车辆维保历史以及各维度记录总数量。维保历史已并入本聚合对象, - * 避免页面为同一车辆生命周期再额外请求独立维保列表接口。 + * 作为车辆生命周期弹窗“首屏”的统一返回对象,承载车辆概要、当前装车轮胎快照、 + * 车辆维保历史以及各维度记录总数量。页面当前只展示维保工单时间线, + * 因此不再返回最近事件聚合,避免后端做无用查询。 *

*/ public class CarLifecycleDTO implements Serializable @@ -22,9 +22,6 @@ public class CarLifecycleDTO implements Serializable /** 当前装车轮胎快照,数量较少(通常不超过车辆轮位数),随概要一次返回用于首屏快速展示。 */ private List mountedTyres = new ArrayList<>(); - /** 最近事件时间线,聚合装卸与维保两类关键事件,按时间倒序排列,用于快速定位最新动作。 */ - private List recentEvents = new ArrayList<>(); - /** 车辆维保工单历史,随生命周期聚合接口返回,避免页面重复调用单独的维保列表接口。 */ private List maintenanceList = new ArrayList<>(); @@ -60,16 +57,6 @@ public class CarLifecycleDTO implements Serializable this.mountedTyres = mountedTyres; } - public List getRecentEvents() - { - return recentEvents; - } - - public void setRecentEvents(List recentEvents) - { - this.recentEvents = recentEvents; - } - public List getMaintenanceList() { return maintenanceList; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleEventDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleEventDTO.java deleted file mode 100644 index b26edae6..00000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarLifecycleEventDTO.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.ruoyi.system.domain; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 车辆生命周期统一事件DTO。 - *

- * 作为“最近事件时间线”的数据载体,将轮胎装卸事件与维保工单事件抽象为统一结构, - * 便于前端以同一套模板按时间轴展示。事件类型(eventType)区分数据来源: - * INSTALL 表示轮胎装卸动作,MAINTENANCE 表示维保工单动作。 - *

- */ -public class CarLifecycleEventDTO implements Serializable -{ - private static final long serialVersionUID = 1L; - - /** 事件类型字典值,区分数据来源。例如:INSTALL(轮胎装卸)、MAINTENANCE(维保工单)。 */ - private String eventType; - - /** 事件发生时间,统一取各来源表中的操作/创建时间,用于时间轴排序。 */ - private Date eventTime; - - /** 轮胎RFID编码,仅在事件类型为轮胎装卸时有效。 */ - private String tyreRfid; - - /** 轮胎编号,业务展示用。 */ - private String tyreNo; - - /** 轮胎自编号,与 tyreNo 区分,用于内部管理。 */ - private String selfNo; - - /** 轮胎品牌。 */ - private String tyreBrand; - - /** 轮胎规格型号。 */ - private String tyreModel; - - /** 轮位名称,例如:左前轮、右后第二轴等,仅在装卸事件中有效。 */ - private String wheelPostion; - - /** 事件关联的行驶里程(字符串形式,保留原始录入格式)。 */ - private String mileage; - - /** 事件关联的花纹深度(毫米),用于磨损评估。 */ - private String patternDepth; - - /** 状态字典值,例如:工单状态、轮胎状态等,视 eventType 而定。 */ - private String status; - - /** 工单编号,仅在事件类型为维保工单时有效。 */ - private String orderNo; - - /** 类型编码,例如:维保类型字典值、操作类型字典值。 */ - private String typeCode; - - /** 修理厂/工厂名称,仅在维保工单事件中有效。 */ - private String factoryName; - - /** 录入里程(数值型),维保工单或质检记录中由用户录入的当前总里程。 */ - private BigDecimal inputMileage; - - /** 上次里程(数值型),维保工单中记录的上一次保养时的里程。 */ - private BigDecimal lastMileage; - - /** 保养/维修日期,维保工单事件中的计划或实际执行日期。 */ - private Date maintainDate; - - /** 事件描述/故障描述,维保工单中的故障现象或备注信息。 */ - private String description; - - /** 质检结果,仅在轮胎质检相关事件中有效。 */ - private String result; - - /** 维保/检测类型字典值,例如:一级保养、二级保养、日常巡检。 */ - private String maintenanceType; - - /** 轮胎里程记录开始时间,仅在里程类事件中有效。 */ - private Date startTime; - - /** 轮胎里程记录结束时间,仅在里程类事件中有效。 */ - private Date endTime; - - public String getEventType() - { - return eventType; - } - - public void setEventType(String eventType) - { - this.eventType = eventType; - } - - public Date getEventTime() - { - return eventTime; - } - - public void setEventTime(Date eventTime) - { - this.eventTime = eventTime; - } - - public String getTyreRfid() - { - return tyreRfid; - } - - public void setTyreRfid(String tyreRfid) - { - this.tyreRfid = tyreRfid; - } - - public String getTyreNo() - { - return tyreNo; - } - - public void setTyreNo(String tyreNo) - { - this.tyreNo = tyreNo; - } - - public String getSelfNo() - { - return selfNo; - } - - public void setSelfNo(String selfNo) - { - this.selfNo = selfNo; - } - - public String getTyreBrand() - { - return tyreBrand; - } - - public void setTyreBrand(String tyreBrand) - { - this.tyreBrand = tyreBrand; - } - - public String getTyreModel() - { - return tyreModel; - } - - public void setTyreModel(String tyreModel) - { - this.tyreModel = tyreModel; - } - - public String getWheelPostion() - { - return wheelPostion; - } - - public void setWheelPostion(String wheelPostion) - { - this.wheelPostion = wheelPostion; - } - - public String getMileage() - { - return mileage; - } - - public void setMileage(String mileage) - { - this.mileage = mileage; - } - - public String getPatternDepth() - { - return patternDepth; - } - - public void setPatternDepth(String patternDepth) - { - this.patternDepth = patternDepth; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getOrderNo() - { - return orderNo; - } - - public void setOrderNo(String orderNo) - { - this.orderNo = orderNo; - } - - public String getTypeCode() - { - return typeCode; - } - - public void setTypeCode(String typeCode) - { - this.typeCode = typeCode; - } - - public String getFactoryName() - { - return factoryName; - } - - public void setFactoryName(String factoryName) - { - this.factoryName = factoryName; - } - - public BigDecimal getInputMileage() - { - return inputMileage; - } - - public void setInputMileage(BigDecimal inputMileage) - { - this.inputMileage = inputMileage; - } - - public BigDecimal getLastMileage() - { - return lastMileage; - } - - public void setLastMileage(BigDecimal lastMileage) - { - this.lastMileage = lastMileage; - } - - public Date getMaintainDate() - { - return maintainDate; - } - - public void setMaintainDate(Date maintainDate) - { - this.maintainDate = maintainDate; - } - - public String getDescription() - { - return description; - } - - public void setDescription(String description) - { - this.description = description; - } - - public String getResult() - { - return result; - } - - public void setResult(String result) - { - this.result = result; - } - - public String getMaintenanceType() - { - return maintenanceType; - } - - public void setMaintenanceType(String maintenanceType) - { - this.maintenanceType = maintenanceType; - } - - public Date getStartTime() - { - return startTime; - } - - public void setStartTime(Date startTime) - { - this.startTime = startTime; - } - - public Date getEndTime() - { - return endTime; - } - - public void setEndTime(Date endTime) - { - this.endTime = endTime; - } -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarMileageLifecycleDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarMileageLifecycleDTO.java index 8600a845..29125fc3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarMileageLifecycleDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CarMileageLifecycleDTO.java @@ -38,6 +38,9 @@ public class CarMileageLifecycleDTO implements Serializable /** 统计结束时的花纹深度(毫米),用于与起始深度对比评估磨损速率。 */ private String patternDepth; + /** 里程记录类型,数据库 record_type 为 varchar,对应实体使用 String。 */ + private String recordType; + public Long getId() { return id; @@ -117,4 +120,14 @@ public class CarMileageLifecycleDTO implements Serializable { this.patternDepth = patternDepth; } + + public String getRecordType() + { + return recordType; + } + + public void setRecordType(String recordType) + { + this.recordType = recordType; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/RecordTyreMileage.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/RecordTyreMileage.java index 35cbd16b..a27f6028 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/RecordTyreMileage.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/RecordTyreMileage.java @@ -63,7 +63,13 @@ public class RecordTyreMileage extends BaseEntity this.recordType = recordType; } + public Long getMileageOld() { + return mileageOld; + } + public void setMileageOld(Long mileageOld) { + this.mileageOld = mileageOld; + } public String getPlateNumber() { return plateNumber; @@ -111,82 +117,74 @@ public class RecordTyreMileage extends BaseEntity this.id = id; } - public Long getId() + public Long getId() { return id; } - public void setTyreRfid(String tyreRfid) + public void setTyreRfid(String tyreRfid) { this.tyreRfid = tyreRfid; } - public String getTyreRfid() + public String getTyreRfid() { return tyreRfid; } - public void setStartTime(Date startTime) + public void setStartTime(Date startTime) { this.startTime = startTime; } - public Date getStartTime() + public Date getStartTime() { return startTime; } - public void setEndTime(Date endTime) + public void setEndTime(Date endTime) { this.endTime = endTime; } - public Date getEndTime() + public Date getEndTime() { return endTime; } - public void setMileage(Long mileage) + public void setMileage(Long mileage) { this.mileage = mileage; } - public Long getMileage() + public Long getMileage() { return mileage; } - public void setMileageOld(Long mileageOld) - { - this.mileageOld = mileageOld; - } - - public Long getMileageOld() - { - return mileageOld; - } - @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - - .append("id", getId()) - - .append("tyreRfid", getTyreRfid()) - - .append("startTime", getStartTime()) - - .append("endTime", getEndTime()) - - .append("mileage", getMileage()) - - .append("plateNumber", getPlateNumber()) - - .append("createBy", getCreateBy()) - - .append("createTime", getCreateTime()) - - .append("updateBy", getUpdateBy()) - - .append("updateTime", getUpdateTime()) - - .append("remark", getRemark()) - .toString(); + + .append("id", getId()) + + .append("tyreRfid", getTyreRfid()) + + .append("startTime", getStartTime()) + + .append("endTime", getEndTime()) + + .append("mileage", getMileage()) + + .append("plateNumber", getPlateNumber()) + + .append("recordType", getRecordType()) + + .append("createBy", getCreateBy()) + + .append("createTime", getCreateTime()) + + .append("updateBy", getUpdateBy()) + + .append("updateTime", getUpdateTime()) + + .append("remark", getRemark()) + .toString(); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseCarLifecycleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseCarLifecycleMapper.java index 94d35571..c402dd1c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseCarLifecycleMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseCarLifecycleMapper.java @@ -2,7 +2,6 @@ package com.ruoyi.system.mapper; import java.util.List; import com.ruoyi.system.domain.CarCheckLifecycleDTO; -import com.ruoyi.system.domain.CarLifecycleEventDTO; import com.ruoyi.system.domain.CarLifecycleQuery; import com.ruoyi.system.domain.CarLifecycleSummaryDTO; import com.ruoyi.system.domain.CarMaintenanceLifecycleDTO; @@ -16,7 +15,7 @@ import com.ruoyi.system.domain.CarTyreInstallLifecycleDTO; * 承担车辆全生命周期弹窗所需的所有数据持久化查询职责。 * 设计原则: * 1. 以车牌号(carNo)为入口,通过 join sys_dept 等权限表支持 {@link DataScope} 拦截; - * 2. 首屏概要(selectLifecycleCar / selectMountedTyres / selectRecentEvents / count*)与明细分页(select*List)分离,避免大数据量拖慢首屏; + * 2. 首屏概要(selectLifecycleCar / selectMountedTyres / selectMaintenanceList / count*)与明细分页(select*List)分离,避免大数据量拖慢首屏; * 3. 各子查询优先使用回填后的 carId 做精确过滤,提升性能并减少字符串匹配歧义。 *

*/ @@ -46,18 +45,6 @@ public interface BaseCarLifecycleMapper */ public List selectMountedTyres(CarLifecycleQuery query); - /** - * 查询车辆最近事件时间线(TopN)。 - *

- * 聚合轮胎装卸记录与维保工单两类事件,取按时间倒序的最近 N 条(例如 10 条)。 - * 用于弹窗首屏快速展示最新动态,避免加载全量历史。 - *

- * - * @param query 已回填 carId 的查询参数 - * @return 最近事件列表;无记录时返回空列表 - */ - public List selectRecentEvents(CarLifecycleQuery query); - /** * 分页查询车辆轮胎装卸历史明细。 *

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseTyreMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseTyreMapper.java index ac6f78b4..8f7da5da 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseTyreMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/BaseTyreMapper.java @@ -4,9 +4,11 @@ package com.ruoyi.system.mapper; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.system.domain.BaseTyre; +import com.ruoyi.system.domain.RecordTyreMileage; import com.ruoyi.system.domain.vo.BaseTyreVo; import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; import java.util.List; import java.util.Map; @@ -104,4 +106,28 @@ public interface BaseTyreMapper List selectCarNoByTyreEpcs(List tyreEpcs); double selectSumMileageByRFID(@Param("tyreEpc") String tyreEpc); + + /** + * 按轮胎 RFID 汇总全部里程记录,不按 record_type 过滤。 + * + * @param tyreEpc 轮胎 RFID + * @return 轮胎累计行驶里程 + */ + BigDecimal selectTotalMileageByRFID(@Param("tyreEpc") String tyreEpc); + + /** + * 按轮胎 RFID 查询最近两条保养花纹深度。 + * + * @param tyreEpc 轮胎 RFID + * @return 最新在前的保养花纹深度列表 + */ + List selectRecentMaintenancePatternDepthByRFID(@Param("tyreEpc") String tyreEpc); + + /** + * 按轮胎 RFID 查询全部保养里程记录。 + * + * @param tyreEpc 轮胎 RFID + * @return 最新在前的保养记录列表 + */ + List selectMaintenanceMileageListByRFID(@Param("tyreEpc") String tyreEpc); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseCarLifecycleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseCarLifecycleServiceImpl.java index 91ebb5f7..f3874a3f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseCarLifecycleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseCarLifecycleServiceImpl.java @@ -51,7 +51,6 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService * 作为弹窗“首屏”数据,一次性返回: * - 车辆主档概要(车牌号、车队、线路、车型、最近录入里程) * - 当前装车轮胎快照(mountedTyres) - * - 最近事件时间线(recentEvents) * - 维保工单历史(maintenanceList) * - 各维度记录总数量(installCount / maintenanceCount / checkCount / mileageCount) * 维保历史与概要合并返回,避免页面为同一车辆重复请求独立维保列表接口。 @@ -73,19 +72,17 @@ public class BaseCarLifecycleServiceImpl implements IBaseCarLifecycleService dto.setCar(car); // 4. 查询当前装车的轮胎列表 dto.setMountedTyres(baseCarLifecycleMapper.selectMountedTyres(query)); - // 5. 查询最近发生的事件时间线 - dto.setRecentEvents(baseCarLifecycleMapper.selectRecentEvents(query)); - // 6. 查询维保工单历史列表 + // 5. 当前车辆生命周期页面只展示维保工单,避免查询未渲染的装卸/质检/里程聚合事件。 dto.setMaintenanceList(baseCarLifecycleMapper.selectMaintenanceList(query)); - // 7. 统计装卸记录总条数 + // 6. 统计装卸记录总条数 dto.setInstallCount(baseCarLifecycleMapper.countInstallRecords(query)); - // 8. 统计维保工单总条数 + // 7. 统计维保工单总条数 dto.setMaintenanceCount(baseCarLifecycleMapper.countMaintenanceOrders(query)); - // 9. 统计质检记录总条数 + // 8. 统计质检记录总条数 dto.setCheckCount(baseCarLifecycleMapper.countCheckRecords(query)); - // 10. 统计里程记录总条数 + // 9. 统计里程记录总条数 dto.setMileageCount(baseCarLifecycleMapper.countMileageRecords(query)); - // 11. 返回聚合后的生命周期数据 + // 10. 返回聚合后的生命周期数据 return dto; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseTyreServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseTyreServiceImpl.java index 805f06e3..2f7b07da 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseTyreServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BaseTyreServiceImpl.java @@ -33,7 +33,7 @@ import static com.ruoyi.common.utils.ShiroUtils.getLoginName; /** * 轮胎基础信息Service业务层处理 - * + * * @author highway * @date 2025-12-16 */ @@ -60,7 +60,7 @@ public class BaseTyreServiceImpl implements IBaseTyreService /** * 查询轮胎基础信息 - * + * * @param tyreId 轮胎基础信息ID * @return 轮胎基础信息 */ @@ -72,7 +72,7 @@ public class BaseTyreServiceImpl implements IBaseTyreService /** * 查询轮胎基础信息列表 - * + * * @param baseTyre 轮胎基础信息 * @return 轮胎基础信息 */ @@ -85,7 +85,7 @@ public class BaseTyreServiceImpl implements IBaseTyreService /** * 新增轮胎基础信息 - * + * * @param baseTyre 轮胎基础信息 * @return 结果 */ @@ -125,7 +125,7 @@ public class BaseTyreServiceImpl implements IBaseTyreService /** * 修改轮胎基础信息 - * + * * @param baseTyre 轮胎基础信息 * @return 结果 */ @@ -257,7 +257,7 @@ public class BaseTyreServiceImpl implements IBaseTyreService @Override @DataScope(deptAlias = "d", userAlias = "u") public List vTyreStockSummary(SysDept sysDept) { - List mapList = baseTyreMapper.vTyreStockSummary(sysDept); + List mapList = baseTyreMapper.vTyreStockSummary(sysDept); return mapList; } @@ -328,6 +328,8 @@ public class BaseTyreServiceImpl implements IBaseTyreService // 3. 初始化里程相关字段默认值,确保返回结构完整 map.put("recordTyreMileageList", new ArrayList<>()); + map.put("maintenanceMileageList", new ArrayList<>()); + map.put("bizMaintenanceOrderList", new ArrayList<>()); map.put("totalMileage", null); map.put("currentPatternDepth", null); @@ -347,42 +349,59 @@ public class BaseTyreServiceImpl implements IBaseTyreService // 原 PDA 方法历史上会在 EPC 为空时按空条件查流转表;Web 详情必须置空,避免误把全量历史展示给用户。 map.put("recordWarehousingList", new ArrayList<>()); map.put("recordTyreInstallList", new ArrayList<>()); + map.put("bizMaintenanceOrder", null); return map; } - // 7. 转换安装记录列表并计算当前花纹深度 - List installList = castInstallList(map.get("recordTyreInstallList")); - map.put("currentPatternDepth", TyreLifecycleCalc.currentPatternDepth(installList)); + // 7. Web 详情按“保养”记录作为花纹口径,避免装卸记录和维保记录混用导致当前花纹漂移。 + List recentMaintenanceDepthList = baseTyreMapper.selectRecentMaintenancePatternDepthByRFID(tyreRfid); + if (!StringUtils.isEmpty(recentMaintenanceDepthList)) + { + map.put("currentPatternDepth", normalizeDepthText(recentMaintenanceDepthList.get(0))); + } + List maintenanceMileageList = baseTyreMapper.selectMaintenanceMileageListByRFID(tyreRfid); + if (maintenanceMileageList != null && !maintenanceMileageList.isEmpty()) + { + fillMissingMileagePlateNumber(maintenanceMileageList); + } + map.put("maintenanceMileageList", buildMaintenanceMileageVoList(maintenanceMileageList)); + putMaintenanceOrderList(map, resultBase); - // 8. 构造里程查询对象并执行查询 + // 8. 轮胎总行驶里程直接由 Mapper 聚合 record_tyre_mileage.mileage,不按 record_type 过滤。 + BigDecimal totalMileage = baseTyreMapper.selectTotalMileageByRFID(tyreRfid); + map.put("totalMileage", totalMileage == null ? null : totalMileage.stripTrailingZeros().toPlainString()); + + // 9. 构造里程查询对象并执行查询 RecordTyreMileage query = new RecordTyreMileage(); query.setTyreRfid(tyreRfid); List mileageList = recordTyreMileageMapper.selectRecordTyreMileageList(query); - // 9. 若无里程记录,直接返回当前已组装的数据 + // 10. 若无里程记录,直接返回当前已组装的数据 if (mileageList == null || mileageList.isEmpty()) { return map; } - // 10. 老数据可能未写 record_tyre_mileage.plate_number,按需补查车牌,避免页面层猜测或全量查询。 + // 11. 老数据可能未写 record_tyre_mileage.plate_number,按需补查车牌,避免页面层猜测或全量查询。 fillMissingMileagePlateNumber(mileageList); - // 10. 解析初始花纹深度,并计算各段磨损量 + // 12. 解析初始花纹深度,并计算各段磨损量 BigDecimal initialDepth = TyreLifecycleCalc.parseDepth(resultBase.getPatternDepth()); Map wearMap = TyreLifecycleCalc.computeSegmentWears(initialDepth, mileageList); - // 11. 初始化总里程累加器和标志位 - BigDecimal totalMileage = BigDecimal.ZERO; - boolean hasMileage = false; - // 12. 按开始时间降序、ID 降序对里程记录排序,确保时间线正确 + // 13. 按开始时间降序、ID 降序对里程记录排序,确保时间线正确 mileageList.sort(Comparator .comparing(RecordTyreMileage::getStartTime, Comparator.nullsLast(Comparator.reverseOrder())) .thenComparing(RecordTyreMileage::getId, Comparator.nullsLast(Comparator.reverseOrder()))); - // 13. 遍历里程记录,构造前端展示用的 VO 列表 + // 14. 遍历里程记录,构造前端展示用的 VO 列表 List> mileageVoList = new ArrayList<>(mileageList.size()); for (RecordTyreMileage item : mileageList) { + if ("保养".equals(item.getRecordType())) + { + // 保养记录已在“保养记录”生命周期块按花纹磨损口径单独展示,避免同一条记录在里程块重复出现。 + continue; + } Map vo = new HashMap<>(); vo.put("id", item.getId()); // 记录主键 vo.put("tyreRfid", item.getTyreRfid()); // 轮胎 RFID @@ -398,24 +417,168 @@ public class BaseTyreServiceImpl implements IBaseTyreService vo.put("tyreBrand", item.getTyreBrand()); // 轮胎品牌 vo.put("tyreNo", item.getTyreNo()); // 轮胎编号 vo.put("plateNumber", item.getPlateNumber()); // 卸胎时的车牌快照,用于详情页按里程段追溯车辆归属 + vo.put("recordType", item.getRecordType()); // 记录类型,便于页面区分装胎、卸胎、保养来源 vo.put("wearDepth", item.getId() == null ? null : wearMap.get(item.getId())); // 磨损深度(从计算结果取) - // 14. 累加有效里程值(mileage 为 Long 类型,表示该段 km 差值) - if (item.getMileage() != null) - { - // mileage 实体类型是 Long,表示该程 km 差值,直接累加可避免 varchar 花纹解析逻辑误入里程路径。 - totalMileage = totalMileage.add(BigDecimal.valueOf(item.getMileage())); - hasMileage = true; - } mileageVoList.add(vo); } - // 15. 将组装好的里程列表和总里程写入返回 Map + // 15. 将组装好的里程列表写入返回 Map map.put("recordTyreMileageList", mileageVoList); - map.put("totalMileage", hasMileage ? totalMileage.stripTrailingZeros().toPlainString() : null); // 16. 返回完整的轮胎详情数据 return map; } + private List> buildMaintenanceMileageVoList(List maintenanceMileageList) + { + List> voList = new ArrayList<>(); + if (maintenanceMileageList == null || maintenanceMileageList.isEmpty()) + { + return voList; + } + + Map wearMap = computeMaintenanceWearMap(maintenanceMileageList); + List sortedList = new ArrayList<>(); + for (RecordTyreMileage item : maintenanceMileageList) + { + if (item != null) + { + sortedList.add(item); + } + } + sortedList.sort(Comparator + .comparing(this::maintenanceRecordTime, Comparator.nullsLast(Comparator.reverseOrder())) + .thenComparing(RecordTyreMileage::getId, Comparator.nullsLast(Comparator.reverseOrder()))); + + for (RecordTyreMileage item : sortedList) + { + Map vo = new HashMap<>(); + vo.put("id", item.getId()); + vo.put("tyreRfid", item.getTyreRfid()); + vo.put("startTime", item.getStartTime()); + vo.put("endTime", item.getEndTime()); + vo.put("mileage", item.getMileage()); + vo.put("patternDepth", normalizeDepthText(item.getPatternDepth())); + vo.put("plateNumber", item.getPlateNumber()); + vo.put("recordId", item.getRecordId()); + vo.put("recordType", item.getRecordType()); + vo.put("createBy", item.getCreateBy()); + vo.put("createTime", item.getCreateTime()); + vo.put("updateBy", item.getUpdateBy()); + vo.put("updateTime", item.getUpdateTime()); + vo.put("remark", item.getRemark()); + // 磨损数只比较当前保养和上一条“有效花纹”保养,空值/脏值不参与,避免把异常录入放大到页面。 + vo.put("wearDepth", item.getId() == null ? null : wearMap.get(item.getId())); + voList.add(vo); + } + return voList; + } + + private Map computeMaintenanceWearMap(List maintenanceMileageList) + { + Map wearMap = new HashMap<>(); + List sortedList = new ArrayList<>(); + for (RecordTyreMileage item : maintenanceMileageList) + { + if (item != null) + { + sortedList.add(item); + } + } + sortedList.sort(Comparator + .comparing(this::maintenanceRecordTime, Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(RecordTyreMileage::getId, Comparator.nullsLast(Comparator.naturalOrder()))); + + BigDecimal previousDepth = null; + for (RecordTyreMileage item : sortedList) + { + BigDecimal currentDepth = TyreLifecycleCalc.parseDepth(item.getPatternDepth()); + if (currentDepth == null) + { + continue; + } + if (previousDepth != null && item.getId() != null) + { + wearMap.put(item.getId(), formatDecimal(previousDepth.subtract(currentDepth))); + } + previousDepth = currentDepth; + } + return wearMap; + } + + private void putMaintenanceOrderList(Map map, BaseTyre resultBase) + { + if (resultBase.getTyreId() == null) + { + map.put("bizMaintenanceOrder", null); + return; + } + + BizOrderTireDetail query = new BizOrderTireDetail(); + query.setTireId(resultBase.getTyreId()); + List detailList = bizOrderTireDetailMapper.selectBizOrderTireDetailList(query); + if (detailList == null || detailList.isEmpty()) + { + map.put("bizMaintenanceOrder", null); + return; + } + + Map> detailMap = new LinkedHashMap<>(); + for (BizOrderTireDetail detail : detailList) + { + if (detail != null && detail.getOrderId() != null) + { + detailMap.computeIfAbsent(detail.getOrderId(), key -> new ArrayList<>()).add(detail); + } + } + + List orderList = new ArrayList<>(); + for (Map.Entry> entry : detailMap.entrySet()) + { + BizMaintenanceOrder order = bizMaintenanceOrderMapper.selectBizMaintenanceOrderByOrderId(entry.getKey()); + if (order == null) + { + continue; + } + order.setBizOrderTireDetailList(entry.getValue()); + if (order.getLastMileage() == null) + { + order.setLastMileage(BigDecimal.ZERO); + } + orderList.add(order); + } + + orderList.sort(Comparator + .comparing(BizMaintenanceOrder::getMaintainDate, Comparator.nullsLast(Comparator.reverseOrder())) + .thenComparing(BizMaintenanceOrder::getOrderId, Comparator.nullsLast(Comparator.reverseOrder()))); + map.put("bizMaintenanceOrderList", orderList); + // 保留旧 key 便于已有模板或脚本兜底,但 Web 新模板会按列表展示全部维保工单。 + map.put("bizMaintenanceOrder", orderList.isEmpty() ? null : orderList.get(0)); + } + + private Date maintenanceRecordTime(RecordTyreMileage item) + { + if (item == null) + { + return null; + } + // 保养记录的“最新”优先按创建时间判定;历史补录缺 create_time 时再退回业务开始时间。 + return item.getCreateTime() != null ? item.getCreateTime() : item.getStartTime(); + } + + private String normalizeDepthText(String value) + { + if (StringUtils.isBlank(value)) + { + return null; + } + return value.trim(); + } + + private String formatDecimal(BigDecimal value) + { + return value == null ? null : value.stripTrailingZeros().toPlainString(); + } + private List castInstallList(Object value) diff --git a/ruoyi-system/src/main/resources/mapper/tyre/BaseCarLifecycleMapper.xml b/ruoyi-system/src/main/resources/mapper/tyre/BaseCarLifecycleMapper.xml index 8a82c7bc..d8b34251 100644 --- a/ruoyi-system/src/main/resources/mapper/tyre/BaseCarLifecycleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/tyre/BaseCarLifecycleMapper.xml @@ -111,7 +111,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" rtm.start_time as startTime, rtm.end_time as endTime, rtm.mileage as mileage, - rtm.pattern_depth as patternDepth + rtm.pattern_depth as patternDepth, + rtm.record_type as recordType from record_tyre_mileage rtm inner join ( select distinct tyre_rfid @@ -123,123 +124,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by rtm.start_time desc, rtm.id desc - - + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml b/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml index 779e85bc..45b15660 100644 --- a/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml @@ -1,9 +1,9 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -21,27 +21,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select id, tyre_rfid, start_time, end_time, mileage, mileage_old, pattern_depth, create_by, create_time, update_by, update_time, remark from record_tyre_mileage - select id, tyre_rfid, start_time, end_time, mileage, pattern_depth, plate_number, record_id, create_by, create_time, update_by, update_time, remark from record_tyre_mileage + select id, tyre_rfid, start_time, end_time, mileage, pattern_depth, plate_number, record_id, record_type, create_by, create_time, update_by, update_time, remark from record_tyre_mileage @@ -49,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + insert into record_tyre_mileage @@ -67,7 +68,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" pattern_depth, plate_number, record_id, - + record_type, + #{id}, #{tyreRfid}, @@ -83,7 +85,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{patternDepth}, #{plateNumber}, #{recordId}, - + #{recordType}, + @@ -100,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time = #{updateTime}, pattern_depth = #{patternDepth}, plate_number = #{plateNumber}, + record_type = #{recordType}, remark = #{remark}, where id = #{id} @@ -110,7 +114,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from record_tyre_mileage where id in + delete from record_tyre_mileage where id in #{id} From e3afd05112dbeaf3407daff61e9103caa744aaa6 Mon Sep 17 00:00:00 2001 From: Yangk Date: Wed, 29 Apr 2026 17:26:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(tyre):=20=E6=96=B0=E5=A2=9E=E8=BD=AE?= =?UTF-8?q?=E8=83=8E=E7=B4=AF=E8=AE=A1=E8=A1=8C=E9=A9=B6=E9=87=8C=E7=A8=8B?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/RecordTyreInstallServiceImpl.java | 18 ++++++++++++++++++ .../mapper/tyre/RecordTyreMileageMapper.xml | 2 ++ 2 files changed, 20 insertions(+) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordTyreInstallServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordTyreInstallServiceImpl.java index 21e70ce9..69a9f6d2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordTyreInstallServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordTyreInstallServiceImpl.java @@ -127,6 +127,22 @@ public class RecordTyreInstallServiceImpl implements IRecordTyreInstallService baseTyre.setTyreNo(recordTyreInstall.getTyreNo()); int m = baseTyreMapper.updateBaseTyre(baseTyre); if (n>0&&m>0){ + // 装车时插入一条里程快照记录(段里程为0,仅记录装车时刻的累计总里程) + Long totalMileage = recordTyreMileageMapper.selectTotalMileageByTyreRfid(recordTyreInstall.getTyreRfid()); + if (totalMileage == null) { + totalMileage = 0L; + } + RecordTyreMileage recordTyreMileage = new RecordTyreMileage(); + recordTyreMileage.setTyreRfid(recordTyreInstall.getTyreRfid()); + recordTyreMileage.setStartTime(DateUtils.getNowDate()); + recordTyreMileage.setMileage(totalMileage); // 装车时累计总里程不变 + recordTyreMileage.setMileageOld(0L); // 装车操作本身不产生行驶里程 + recordTyreMileage.setPlateNumber(recordTyreInstall.getCarNo()); + recordTyreMileage.setPatternDepth(recordTyreInstall.getPatternDepth()); + recordTyreMileage.setRecordType("install"); // 标记为装车记录 + recordTyreMileage.setCreateTime(DateUtils.getNowDate()); + recordTyreMileage.setCreateBy(recordTyreInstall.getCreateBy()); + recordTyreMileageMapper.insertRecordTyreMileage(recordTyreMileage); return AjaxResult.success("安装成功!"); } }catch (Exception e){ @@ -178,6 +194,8 @@ public class RecordTyreInstallServiceImpl implements IRecordTyreInstallService recordTyreMileage.setEndTime(DateUtils.getNowDate()); recordTyreMileage.setMileage(totalMileage + between); // 当前累计总里程 recordTyreMileage.setMileageOld(between); // 本段行驶里程 + recordTyreMileage.setPlateNumber(recordTyreInstall.getCarNo()); // 车牌快照 + recordTyreMileage.setRecordType("uninstall"); // 标记为卸车记录 recordTyreMileage.setCreateTime(DateUtils.getNowDate()); recordTyreMileage.setCreateBy(recordTyreInstall.getCreateBy()); recordTyreMileage.setRecordId(recordId); diff --git a/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml b/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml index 45b15660..a9e09cf5 100644 --- a/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/tyre/RecordTyreMileageMapper.xml @@ -29,6 +29,8 @@