diff --git a/ebike-user/src/main/java/com/cdzy/user/controller/EbikeReportRecordController.java b/ebike-user/src/main/java/com/cdzy/user/controller/EbikeReportRecordController.java new file mode 100644 index 0000000..2c37222 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/controller/EbikeReportRecordController.java @@ -0,0 +1,36 @@ +package com.cdzy.user.controller; + +import com.cdzy.common.model.response.JsonResult; +import com.cdzy.user.model.dto.EbikeReportRecordDto; +import com.cdzy.user.service.EbikeReportRecordService; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 用户上报记录 控制层 + * + * @author yanglei + * @since 2025-12-23 16:51 + */ + +@RestController +@RequestMapping("/ebikeReportRecord") +public class EbikeReportRecordController { + + @Resource + private EbikeReportRecordService reportRecordService; + + /** + * 保存用户上报记录 + * + * @param reportRecordDto 用户上报记录参数 + */ + @PostMapping("/saveReportRecord") + public JsonResult saveReportRecord(@RequestBody EbikeReportRecordDto reportRecordDto) { + reportRecordService.saveReportRecord(reportRecordDto); + return JsonResult.success(); + } +} diff --git a/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeReportRecordFileMapper.java b/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeReportRecordFileMapper.java new file mode 100644 index 0000000..fead30e --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeReportRecordFileMapper.java @@ -0,0 +1,12 @@ +package com.cdzy.user.mapper; + +import com.cdzy.user.model.entity.EbikeReportRecordFile; +import com.mybatisflex.core.BaseMapper; + +/** + * @author yanglei + * @since 2025-12-23 16:50 + */ + +public interface EbikeReportRecordFileMapper extends BaseMapper { +} diff --git a/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeReportRecordMapper.java b/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeReportRecordMapper.java new file mode 100644 index 0000000..009411a --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/mapper/EbikeReportRecordMapper.java @@ -0,0 +1,12 @@ +package com.cdzy.user.mapper; + +import com.cdzy.user.model.entity.EbikeReportRecord; +import com.mybatisflex.core.BaseMapper; + +/** + * @author yanglei + * @since 2025-12-23 16:50 + */ + +public interface EbikeReportRecordMapper extends BaseMapper { +} diff --git a/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeReportRecordDto.java b/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeReportRecordDto.java new file mode 100644 index 0000000..44b2462 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeReportRecordDto.java @@ -0,0 +1,43 @@ +package com.cdzy.user.model.dto; + +import com.cdzy.user.handler.PGpointDeserializer; +import com.cdzy.user.handler.PGpointSerializer; +import com.cdzy.user.handler.PGpointTypeHandler; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.mybatisflex.annotation.Column; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.postgresql.geometric.PGpoint; + +import java.util.List; + +/** + * 用户上报请求参数 + * + * @author yanglei + * @since 2025-12-23 16:55 + */ +@Data +public class EbikeReportRecordDto { + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空") + private Long userId; + + /** + * 骑行起始点 + */ + @Column(typeHandler = PGpointTypeHandler.class) + @JsonSerialize(using = PGpointSerializer.class) + @JsonDeserialize(using = PGpointDeserializer.class) + @NotNull(message = "上报位置") + private PGpoint location; + + /** + * 用户上报文件 + */ + private List recordFiles; +} diff --git a/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeReportRecordFileDto.java b/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeReportRecordFileDto.java new file mode 100644 index 0000000..008a49a --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/model/dto/EbikeReportRecordFileDto.java @@ -0,0 +1,29 @@ +package com.cdzy.user.model.dto; + +import lombok.Data; + +/** + * 用户上报文件请求参数 + * + * @author yanglei + * @since 2025-11-18 11:26 + */ + +@Data +public class EbikeReportRecordFileDto { + + /** + * 用户上报文件主键id + */ + private Long recordFileId; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件地址 + */ + private String fileUrl; +} diff --git a/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeReportRecord.java b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeReportRecord.java new file mode 100644 index 0000000..d9bbf42 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeReportRecord.java @@ -0,0 +1,82 @@ +package com.cdzy.user.model.entity; + +import com.cdzy.user.handler.PGpointDeserializer; +import com.cdzy.user.handler.PGpointSerializer; +import com.cdzy.user.handler.PGpointTypeHandler; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +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 org.postgresql.geometric.PGpoint; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author yanglei + * @since 2025-12-23 16:44 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("ebike_report_record") +public class EbikeReportRecord implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @Id + private Long recordId; + + /** + * 上报位置 + */ + @Column(typeHandler = PGpointTypeHandler.class) + @JsonSerialize(using = PGpointSerializer.class) + @JsonDeserialize(using = PGpointDeserializer.class) + private PGpoint location; + + /** + * 处理状态 0-未处理 1-已处理 + */ + private Integer recordStatus; + + /** + * 创建人 + */ + 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/EbikeReportRecordFile.java b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeReportRecordFile.java new file mode 100644 index 0000000..5ec74b4 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/model/entity/EbikeReportRecordFile.java @@ -0,0 +1,76 @@ +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-12-23 16:44 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("ebike_report_record_file") +public class EbikeReportRecordFile implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @Id + private Long recordFileId; + + /** + * 用户退款主键id + */ + private Long recordId; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件地址 + */ + private String fileUrl; + + /** + * 创建人 + */ + 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/service/EbikeReportRecordService.java b/ebike-user/src/main/java/com/cdzy/user/service/EbikeReportRecordService.java new file mode 100644 index 0000000..d28d503 --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/service/EbikeReportRecordService.java @@ -0,0 +1,15 @@ +package com.cdzy.user.service; + +import com.cdzy.user.model.dto.EbikeReportRecordDto; +import com.cdzy.user.model.entity.EbikeReportRecord; +import com.mybatisflex.core.service.IService; + +/** + * @author yanglei + * @since 2025-12-23 16:53 + */ + +public interface EbikeReportRecordService extends IService { + + void saveReportRecord(EbikeReportRecordDto reportRecordDto); +} diff --git a/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeReportRecordServiceImpl.java b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeReportRecordServiceImpl.java new file mode 100644 index 0000000..0c0c20e --- /dev/null +++ b/ebike-user/src/main/java/com/cdzy/user/service/impl/EbikeReportRecordServiceImpl.java @@ -0,0 +1,55 @@ +package com.cdzy.user.service.impl; + +import com.cdzy.common.enums.GlobalConstants; +import com.cdzy.user.mapper.EbikeReportRecordFileMapper; +import com.cdzy.user.mapper.EbikeReportRecordMapper; +import com.cdzy.user.model.dto.EbikeFaultFileDto; +import com.cdzy.user.model.dto.EbikeReportRecordDto; +import com.cdzy.user.model.dto.EbikeReportRecordFileDto; +import com.cdzy.user.model.entity.EbikeFaultFile; +import com.cdzy.user.model.entity.EbikeReportRecord; +import com.cdzy.user.model.entity.EbikeReportRecordFile; +import com.cdzy.user.service.EbikeReportRecordService; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author yanglei + * @since 2025-12-23 16:53 + */ +@Service +public class EbikeReportRecordServiceImpl extends ServiceImpl implements EbikeReportRecordService { + + @Resource + private EbikeReportRecordFileMapper reportRecordFileMapper; + + @Transactional + @Override + public void saveReportRecord(EbikeReportRecordDto reportRecordDto) { + EbikeReportRecord ebikeReportRecord = EbikeReportRecord.builder() + .location(reportRecordDto.getLocation()) + .recordStatus(GlobalConstants.NUMBER_ZERO) + .createBy(reportRecordDto.getUserId()) + .build(); + this.save(ebikeReportRecord); + Long recordId = ebikeReportRecord.getRecordId(); + List recordFiles = reportRecordDto.getRecordFiles(); + if (Objects.nonNull(recordFiles)) { + List fileEntities = recordFiles.stream() + .map(dto -> EbikeReportRecordFile.builder() + .recordId(recordId) + .fileName(dto.getFileName()) + .fileUrl(dto.getFileUrl()) + .createBy(reportRecordDto.getUserId()) + .build()) + .collect(Collectors.toList()); + reportRecordFileMapper.insertBatch(fileEntities); + } + } +}