diff --git a/ebike-payment/src/main/java/com/cdzy/payment/model/entity/EbikeRefund.java b/ebike-payment/src/main/java/com/cdzy/payment/model/entity/EbikeRefund.java index 39ca474..6731ce8 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/model/entity/EbikeRefund.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/model/entity/EbikeRefund.java @@ -61,7 +61,7 @@ public class EbikeRefund implements Serializable { private LocalDateTime refundTime; /** - * 退款状态; 0退款成功 1关闭 2退款中 3异常 + * 状态;0退款成功 1关闭 2退款中 3异常 */ private Integer refundStatus; @@ -86,9 +86,14 @@ public class EbikeRefund implements Serializable { private BigDecimal total; /** - * 退款原因 + * 问题类型:1-还车点误判 2-禁停区误判 3-服务区外误判 4-车辆故障 5-开启失败 6-无法换车 7-车辆没电 */ - private String reason; + private Integer problemType; + + /** + * 退款问题描述 + */ + private String problemDescription; /** * 审核状态;0申请中 1处理中 2已处理 3已关闭 diff --git a/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java b/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java index 419390f..cfec3e2 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java @@ -416,7 +416,7 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService { request.setTransactionId(transactionId); request.setOutTradeNo(String.valueOf(ebikePayment.getTradeId())); request.setOutRefundNo(ebikeRefund.getRefundOrderId()); - request.setReason(ebikeRefund.getReason()); + request.setReason(ebikeRefund.getProblemDescription()); request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl()); AmountReq amountReq = new AmountReq(); amountReq.setRefund(yuanToCent(amount.getRefund())); diff --git a/ebike-user/src/main/java/com/cdzy/user/controller/EbikeFaultReportController.java b/ebike-user/src/main/java/com/cdzy/user/controller/EbikeFaultReportController.java index 5a33547..993cf87 100644 --- a/ebike-user/src/main/java/com/cdzy/user/controller/EbikeFaultReportController.java +++ b/ebike-user/src/main/java/com/cdzy/user/controller/EbikeFaultReportController.java @@ -64,8 +64,8 @@ public class EbikeFaultReportController { */ @PostMapping("save") public JsonResult saveFaultReport(@RequestBody EbikeFaultReportDto ebikeFaultReportDto) { - ebikeFaultReportService.saveFaultReport(ebikeFaultReportDto); - return JsonResult.success(); + Long reportId = ebikeFaultReportService.saveFaultReport(ebikeFaultReportDto); + return JsonResult.success(reportId); } /** @@ -131,7 +131,7 @@ public class EbikeFaultReportController { * @param ebikeOrderFaultReportDto 订单请求参数 */ @PostMapping("queryOrderFaultReport") - public JsonResult queryFaultReportByUserId(EbikeOrderFaultReportDto ebikeOrderFaultReportDto) { + public JsonResult queryFaultReportByUserId(@RequestBody EbikeOrderFaultReportDto ebikeOrderFaultReportDto) { Page faultReportVoPage = ebikeFaultReportService.queryOrderFaultReport(ebikeOrderFaultReportDto); return JsonResult.success(faultReportVoPage); } diff --git a/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeFaultPartMapper.java b/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeFaultPartMapper.java new file mode 100644 index 0000000..f1d206e --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeFaultPartMapper.java @@ -0,0 +1,14 @@ +package com.cdzy.user.mapper; + +import com.cdzy.user.model.entity.EbikeFaultPart; +import com.mybatisflex.core.BaseMapper; + +/** + * 用户故障上报损坏部件 映射层 + * + * @author yanglei + * @since 2025-11-18 16:29 + */ + +public interface EbikeFaultPartMapper extends BaseMapper { +} diff --git a/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeFaultReportDto.java b/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeFaultReportDto.java index 3fcccc6..a413c26 100644 --- a/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeFaultReportDto.java +++ b/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeFaultReportDto.java @@ -48,7 +48,7 @@ public class EbikeFaultReportDto { /** * 损坏部件 */ - private Integer faultPart; + private List faultPart; /** * 故障说明 diff --git a/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultPart.java b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultPart.java new file mode 100644 index 0000000..f94714f --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultPart.java @@ -0,0 +1,74 @@ +package com.cdzy.user.model.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 用户故障上报损坏部件实体类 + * + * @author yanglei + * @since 2025-11-18 16:26 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("ebike_fault_part") +public class EbikeFaultPart implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @Id + private Long partId; + + /** + * 报告id + */ + private Long reportId; + + /** + * 损坏部件 + */ + private Integer faultPart; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + /** + * 更新人 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @Column(onUpdateValue = "now()") + private LocalDateTime updateTime; + + /** + * 删除状态(true表示已删除) + */ + private Boolean isDeleted; +} diff --git a/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultReport.java b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultReport.java index 6f07f39..00b160a 100644 --- a/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultReport.java +++ b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeFaultReport.java @@ -51,11 +51,6 @@ public class EbikeFaultReport implements Serializable { */ private String bikeCode; - /** - * 损坏部件 - */ - private Integer faultPart; - /** * 故障说明 */ diff --git a/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeFaultReportVo.java b/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeFaultReportVo.java index 212b6b2..51c6419 100644 --- a/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeFaultReportVo.java +++ b/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeFaultReportVo.java @@ -46,7 +46,7 @@ public class EbikeFaultReportVo { /** * 损坏部件 */ - private Integer faultPart; + private List faultPart; /** * 故障说明 diff --git a/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeOrderFaultReportVo.java b/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeOrderFaultReportVo.java index 6aa98fd..35ee65f 100644 --- a/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeOrderFaultReportVo.java +++ b/ebike-user/src/main/java/com/cdzy/user/model/vo/EbikeOrderFaultReportVo.java @@ -41,7 +41,7 @@ public class EbikeOrderFaultReportVo { /** * 故障类型 */ - private Integer faultPart; + private List faultPart; /** * 图片 diff --git a/ebike-user/src/main/java/com/cdzy/user/service/EbikeAttachmentFileService.java b/ebike-user/src/main/java/com/cdzy/user/service/EbikeAttachmentFileService.java index 5c14d82..6958292 100644 --- a/ebike-user/src/main/java/com/cdzy/user/service/EbikeAttachmentFileService.java +++ b/ebike-user/src/main/java/com/cdzy/user/service/EbikeAttachmentFileService.java @@ -28,4 +28,11 @@ public interface EbikeAttachmentFileService extends IService queryFilesByReportIds(List reportIds); } diff --git a/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultPartService.java b/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultPartService.java new file mode 100644 index 0000000..2803547 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultPartService.java @@ -0,0 +1,30 @@ +package com.cdzy.user.service; + +import com.cdzy.user.model.entity.EbikeFaultPart; +import com.mybatisflex.core.service.IService; + +import java.util.List; + +/** + * 用户故障上报部件 服务层 + * + * @author yanglei + * @since 2025-11-18 16:49 + */ + +public interface EbikeFaultPartService extends IService { + + /** + * 根据故障上报主键id查询损坏部件 + * + * @param reportId 故障上报主键id + */ + List getFaultPartByReportId(Long reportId); + + /** + * 根据故障上报主键id查询损坏部件 + * + * @param reportIds 故障上报主键id + */ + List getFaultPart(List reportIds); +} diff --git a/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultReportService.java b/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultReportService.java index 25ed7ea..29845e4 100644 --- a/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultReportService.java +++ b/ebike-user/src/main/java/com/cdzy/user/service/EbikeFaultReportService.java @@ -27,7 +27,7 @@ public interface EbikeFaultReportService extends IService { * * @param ebikeFaultReportDto 用户故障上报请求参数 */ - void saveFaultReport(EbikeFaultReportDto ebikeFaultReportDto); + Long saveFaultReport(EbikeFaultReportDto ebikeFaultReportDto); /** * 上传文件到minio diff --git a/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeAttachmentFileServiceImpl.java b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeAttachmentFileServiceImpl.java index 9c34f47..83885d5 100644 --- a/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeAttachmentFileServiceImpl.java +++ b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeAttachmentFileServiceImpl.java @@ -7,6 +7,7 @@ import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; import static com.cdzy.user.model.entity.table.EbikeAttachmentFileTableDef.EBIKE_ATTACHMENT_FILE; @@ -35,4 +36,14 @@ public class EbikeAttachmentFileServiceImpl extends ServiceImpl queryFilesByReportIds(List reportIds) { + if (reportIds == null || reportIds.isEmpty()) { + return Collections.emptyList(); + } + QueryWrapper query = QueryWrapper.create() + .and(EBIKE_ATTACHMENT_FILE.REPORT_ID.in(reportIds)); + return this.list(query); + } } diff --git a/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultPartServiceImpl.java b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultPartServiceImpl.java new file mode 100644 index 0000000..4ead8b1 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultPartServiceImpl.java @@ -0,0 +1,46 @@ +package com.cdzy.user.service.impl; + +import com.cdzy.user.mapper.EbikeFaultPartMapper; +import com.cdzy.user.model.entity.EbikeFaultPart; +import com.cdzy.user.service.EbikeFaultPartService; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +import static com.cdzy.user.model.entity.table.EbikeFaultPartTableDef.EBIKE_FAULT_PART; + +/** + * 用户故障上报部件 实现类 + * + * @author yanglei + * @since 2025-11-18 16:50 + */ + +@Service +public class EbikeFaultPartServiceImpl extends ServiceImpl implements EbikeFaultPartService { + + + @Override + public List getFaultPartByReportId(Long reportId) { + QueryWrapper query = QueryWrapper.create() + .select(EBIKE_FAULT_PART.ALL_COLUMNS) + .from(EBIKE_FAULT_PART) + .where(EBIKE_FAULT_PART.REPORT_ID.eq(reportId)); + return this.mapper.selectListByQuery(query) + .stream() + .map(EbikeFaultPart::getFaultPart) + .collect(Collectors.toList()); + } + + @Override + public List getFaultPart(List reportIds) { + QueryWrapper query = QueryWrapper.create() + .select(EBIKE_FAULT_PART.ALL_COLUMNS) + .from(EBIKE_FAULT_PART) + .where(EBIKE_FAULT_PART.REPORT_ID.in(reportIds)); + return this.mapper.selectListByQuery(query); + } +} diff --git a/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultReportServiceImpl.java b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultReportServiceImpl.java index 92ee5dc..f6cfcd5 100644 --- a/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultReportServiceImpl.java +++ b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeFaultReportServiceImpl.java @@ -10,11 +10,13 @@ import com.cdzy.user.model.dto.EbikeFaultReportDto; import com.cdzy.user.model.dto.EbikeFaultReportQueryDto; import com.cdzy.user.model.dto.EbikeOrderFaultReportDto; import com.cdzy.user.model.entity.EbikeAttachmentFile; +import com.cdzy.user.model.entity.EbikeFaultPart; import com.cdzy.user.model.entity.EbikeFaultReport; import com.cdzy.user.model.vo.EbikeAttachmentFileVo; import com.cdzy.user.model.vo.EbikeFaultReportVo; import com.cdzy.user.model.vo.EbikeOrderFaultReportVo; import com.cdzy.user.service.EbikeAttachmentFileService; +import com.cdzy.user.service.EbikeFaultPartService; import com.cdzy.user.service.EbikeFaultReportService; import com.cdzy.user.utils.MinioUtil; import com.ebike.feign.clients.OperationsFeignClient; @@ -35,6 +37,7 @@ import java.util.*; import java.util.stream.Collectors; import static com.cdzy.user.model.entity.table.EbikeAttachmentFileTableDef.EBIKE_ATTACHMENT_FILE; +import static com.cdzy.user.model.entity.table.EbikeFaultPartTableDef.EBIKE_FAULT_PART; import static com.cdzy.user.model.entity.table.EbikeFaultReportTableDef.EBIKE_FAULT_REPORT; import static com.cdzy.user.model.entity.table.EbikeUserTableDef.EBIKE_USER; @@ -53,18 +56,20 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl faultPart = ebikeFaultReportDto.getFaultPart(); + List fileEntities = faultPart.stream().map(e -> EbikeFaultPart.builder() + .reportId(reportId) + .faultPart(e) + .createBy(ebikeFaultReportDto.getUserId()) + .build()) + .toList(); + ebikeFaultPartService.saveBatch(fileEntities); + return reportId; } @Override @@ -145,6 +161,7 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl faultPart = ebikeFaultReportDto.getFaultPart(); + List existingFaultParts = ebikeFaultPartService.getFaultPartByReportId(ebikeFaultReportDto.getReportId()); + + // 需要删除的 + List toDelete = existingFaultParts.stream() + .filter(part -> !faultPart.contains(part)) + .toList(); + + // 需要新增的 + List toInsert = faultPart.stream() + .filter(part -> !existingFaultParts.contains(part)) + .toList(); + List partsToSave = toInsert.stream() + .map(fp -> EbikeFaultPart.builder() + .reportId(ebikeFaultReportDto.getReportId()) + .faultPart(fp) + .isDeleted(false) + .createBy(ebikeFaultReportDto.getUserId()) + .build()) + .toList(); + if (!toDelete.isEmpty()) { + ebikeFaultPartService.removeByIds(toDelete); + } + if (!partsToSave.isEmpty()) { + ebikeFaultPartService.saveBatch(partsToSave); + } } @Override @@ -231,12 +273,13 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl ebikeFaultParts = ebikeFaultPartService.getFaultPartByReportId(reportId); return EbikeFaultReportVo.builder() .reportId(report.getReportId()) .operatorId(report.getOperatorId()) .bikeCode(report.getBikeCode()) - .faultPart(report.getFaultPart()) + .faultPart(ebikeFaultParts) .faultDescription(report.getFaultDescription()) .userMobile(report.getUserMobile()) .reportSource(report.getReportSource()) @@ -249,23 +292,42 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl queryBikeFaultReport(EbikeFaultReportQueryDto ebikeFaultReportQueryDto) { + // 主表查询 QueryWrapper query = QueryWrapper.create() - .where(EBIKE_FAULT_REPORT.BIKE_CODE.eq(ebikeFaultReportQueryDto.getBikeCode())); - + .where(EBIKE_FAULT_REPORT.BIKE_CODE.eq(ebikeFaultReportQueryDto.getBikeCode())) + .and(EBIKE_FAULT_REPORT.IS_DELETED.eq(false)); if (ebikeFaultReportQueryDto.getReviewId() != null) { query.and(EBIKE_FAULT_REPORT.REVIEW_ID.eq(ebikeFaultReportQueryDto.getReviewId())); } - - if (ebikeFaultReportQueryDto.getFaultPart() != null) { - query.and(EBIKE_FAULT_REPORT.FAULT_PART.eq(ebikeFaultReportQueryDto.getFaultPart())); + List reports = this.list(query); + if (reports.isEmpty()) { + return Collections.emptyList(); } + List reportIds = reports.stream() + .map(EbikeFaultReport::getReportId) + .collect(Collectors.toList()); - List list = this.list(query); + // 查询附件文件 + Map> fileMap = ebikeAttachmentFileService + .queryFilesByReportIds(reportIds) + .stream() + .collect(Collectors.groupingBy(EbikeAttachmentFile::getReportId)); - // 转换为 DTO - return list.stream().map(report -> { - List files = ebikeAttachmentFileService.queryFiles(report.getReportId()); - List fileDtos = files.stream() + // 查询故障部件 + List faultParts = ebikeFaultPartService.list( + QueryWrapper.create() + .and(EBIKE_FAULT_PART.REPORT_ID.in(reportIds)) + ); + Map> faultPartMap = faultParts.stream() + .collect(Collectors.groupingBy( + EbikeFaultPart::getReportId, + Collectors.mapping(EbikeFaultPart::getFaultPart, Collectors.toList()) + )); + + return reports.stream().map(report -> { + List fileDtos = Optional.ofNullable(fileMap.get(report.getReportId())) + .orElse(Collections.emptyList()) + .stream() .map(file -> EbikeAttachmentFileDto.builder() .fileId(file.getFileId()) .fileName(file.getFileName()) @@ -275,11 +337,13 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl parts = faultPartMap.getOrDefault(report.getReportId(), Collections.emptyList()); + return EbikeFaultReportVo.builder() .reportId(report.getReportId()) .operatorId(report.getOperatorId()) .bikeCode(report.getBikeCode()) - .faultPart(report.getFaultPart()) + .faultPart(parts) .faultDescription(report.getFaultDescription()) .userMobile(report.getUserMobile()) .reportSource(report.getReportSource()) @@ -295,7 +359,6 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl queryOrderFaultReport(EbikeOrderFaultReportDto ebikeOrderFaultReportDto) { QueryWrapper query = QueryWrapper.create() .select( - EBIKE_FAULT_REPORT.FAULT_PART, EBIKE_FAULT_REPORT.FAULT_DESCRIPTION, EBIKE_USER.NICKNAME.as("username"), EBIKE_FAULT_REPORT.LOCATION, @@ -311,19 +374,26 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl reportIds = records.stream() .map(EbikeOrderFaultReportVo::getReportId) .collect(Collectors.toList()); + // 获取上传图片 按照reportId分组 QueryWrapper attachmentQuery = QueryWrapper.create() .select(EBIKE_ATTACHMENT_FILE.ALL_COLUMNS) .where(EBIKE_ATTACHMENT_FILE.REPORT_ID.in(reportIds)); List allAttachments = ebikeAttachmentFileService.list(attachmentQuery); - Map> attachmentsByReportId = allAttachments.stream() .collect(Collectors.groupingBy(EbikeAttachmentFile::getReportId)); + // 获取部件 按照reportId分组 + List faultPart = ebikeFaultPartService.getFaultPart(reportIds); + Map> faultPartMap = faultPart.stream() + .collect(Collectors.groupingBy( + EbikeFaultPart::getReportId, + Collectors.mapping(EbikeFaultPart::getFaultPart, Collectors.toList()) + )); + for (EbikeOrderFaultReportVo record : records) { List files = attachmentsByReportId.get(record.getReportId()); List fileUrls = new ArrayList<>(); @@ -338,6 +408,7 @@ public class EbikeFaultReportServiceImpl extends ServiceImpl