增加车辆报损

This commit is contained in:
2025-08-24 15:57:02 +08:00
parent 0b8d3d8675
commit ad399295c1
11 changed files with 313 additions and 8 deletions

View File

@ -3,13 +3,11 @@ package com.sczx.car.controller;
import com.sczx.car.common.Result; import com.sczx.car.common.Result;
import com.sczx.car.dto.CarDTO; import com.sczx.car.dto.CarDTO;
import com.sczx.car.dto.RentCarRuleDTO; import com.sczx.car.dto.CarDamageReq;
import com.sczx.car.dto.req.CarQueryConditionReq; import com.sczx.car.dto.req.CarQueryConditionReq;
import com.sczx.car.service.CarService; import com.sczx.car.service.CarService;
import com.sczx.car.service.RentCarRuleService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -42,4 +40,11 @@ public class CarController {
public Result<Long> countCarByStoreId(@RequestParam(name = "storeId") Long storeId){ public Result<Long> countCarByStoreId(@RequestParam(name = "storeId") Long storeId){
return Result.ok(carService.countCarByStoreId(storeId)); return Result.ok(carService.countCarByStoreId(storeId));
} }
@ApiOperation(value = "车辆报损")
@PostMapping("/carDamage")
public Result<Boolean> carDamage(@RequestBody CarDamageReq req){
carService.carDamage(req);
return Result.ok(true);
}
} }

View File

@ -0,0 +1,19 @@
package com.sczx.car.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(value = "车辆报损请求", description = "车辆报损请求")
@Data
public class CarDamageReq {
@ApiModelProperty("关联车辆ID外键关联zc_car表")
private Long carId;
@ApiModelProperty("报损类型")
private String damageType;
@ApiModelProperty("报损原因")
private String damageReason;
}

View File

@ -0,0 +1,38 @@
package com.sczx.car.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(value = "基本用户信息")
@Data
public class SimpleUserInfoDTO {
@ApiModelProperty(value = "用户id")
private Integer userId;
@ApiModelProperty(value = "用户姓名")
private String userName;
@ApiModelProperty(value = "手机号")
private String phoneNumber;
@ApiModelProperty(value = "角色id")
private Integer roleId;
@ApiModelProperty(value = "小程序类型")
private String miniProgramType;
@ApiModelProperty("头像")
private String avatarUrl;
@ApiModelProperty("微信小程序 openid")
private String wechatOpenid;
@ApiModelProperty("支付宝小程序 userid")
private String alipayUserid;
@ApiModelProperty("是否认证0未认证1已认证")
private Integer authed;
}

View File

@ -0,0 +1,16 @@
package com.sczx.car.mapper;
import com.sczx.car.po.CarDamagePO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 车辆报损记录表 Mapper 接口
* </p>
*
* @author zhangli
* @since 2025-08-24 15:40:46
*/
public interface CarDamageMapper extends BaseMapper<CarDamagePO> {
}

View File

@ -0,0 +1,91 @@
package com.sczx.car.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 车辆报损记录表
* </p>
*
* @author zhangli
* @since 2025-08-24 15:40:46
*/
@Getter
@Setter
@TableName("zc_car_damage")
@ApiModel(value = "CarDamagePO对象", description = "车辆报损记录表")
public class CarDamagePO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("报损记录ID")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("关联车辆ID外键关联zc_car表")
private Long carId;
@ApiModelProperty("报损类型")
private String damageType;
@ApiModelProperty("报损原因")
private String damageReason;
@ApiModelProperty("报损提交人姓名")
private String submitterName;
@ApiModelProperty("报损提交时间")
private LocalDateTime submitTime;
@ApiModelProperty("报损状态(0:待审核,1:审核通过,2:审核不通过,3:已处理)")
private Integer damageStatus;
@ApiModelProperty("审核人姓名")
private String auditorName;
@ApiModelProperty("审核时间")
private LocalDateTime auditTime;
@ApiModelProperty("审核意见")
private String auditComment;
@ApiModelProperty("状态0正常 1停用")
private String status;
@ApiModelProperty("删除标志0代表存在 2代表删除")
private String delFlag;
@ApiModelProperty("创建者")
private String createBy;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新者")
private String updateBy;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
@ApiModelProperty("备注信息")
private String remark;
@ApiModelProperty("扩展字段1")
private String extend1;
@ApiModelProperty("扩展字段2")
private String extend2;
@ApiModelProperty("扩展字段3")
private String extend3;
}

View File

@ -0,0 +1,16 @@
package com.sczx.car.repository;
import com.sczx.car.po.CarDamagePO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 车辆报损记录表 服务类
* </p>
*
* @author zhangli
* @since 2025-08-24 15:40:46
*/
public interface CarDamageRepo extends IService<CarDamagePO> {
}

View File

@ -0,0 +1,20 @@
package com.sczx.car.repository.impl;
import com.sczx.car.po.CarDamagePO;
import com.sczx.car.mapper.CarDamageMapper;
import com.sczx.car.repository.CarDamageRepo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 车辆报损记录表 服务实现类
* </p>
*
* @author zhangli
* @since 2025-08-24 15:40:46
*/
@Service
public class CarDamageRepoImpl extends ServiceImpl<CarDamageMapper, CarDamagePO> implements CarDamageRepo {
}

View File

@ -1,8 +1,8 @@
package com.sczx.car.service; package com.sczx.car.service;
import com.sczx.car.dto.CarDTO; import com.sczx.car.dto.CarDTO;
import com.sczx.car.dto.CarDamageReq;
import com.sczx.car.dto.req.CarQueryConditionReq; import com.sczx.car.dto.req.CarQueryConditionReq;
import com.sczx.car.po.CarPO;
/** /**
* @Author: 张黎 * @Author: 张黎
@ -23,4 +23,10 @@ public interface CarService {
* @return * @return
*/ */
Long countCarByStoreId(Long storeId); Long countCarByStoreId(Long storeId);
/**
* 车辆报损
* @param req
*/
void carDamage(CarDamageReq req);
} }

View File

@ -3,14 +3,21 @@ package com.sczx.car.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sczx.car.convert.CarConvert; import com.sczx.car.convert.CarConvert;
import com.sczx.car.dto.CarDTO; import com.sczx.car.dto.CarDTO;
import com.sczx.car.dto.CarDamageReq;
import com.sczx.car.dto.SimpleUserInfoDTO;
import com.sczx.car.dto.req.CarQueryConditionReq; import com.sczx.car.dto.req.CarQueryConditionReq;
import com.sczx.car.exception.BizException;
import com.sczx.car.po.CarDamagePO;
import com.sczx.car.po.CarPO; import com.sczx.car.po.CarPO;
import com.sczx.car.repository.CarDamageRepo;
import com.sczx.car.repository.CarRepo; import com.sczx.car.repository.CarRepo;
import com.sczx.car.service.CarService; import com.sczx.car.service.CarService;
import com.sczx.car.util.JwtUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Objects; import java.util.Objects;
/** /**
@ -23,6 +30,12 @@ public class CarServiceImpl implements CarService {
@Autowired @Autowired
private CarRepo carRepo; private CarRepo carRepo;
@Autowired
private CarDamageRepo carDamageRepo;
@Autowired
private JwtUtil jwtUtil;
@Override @Override
public CarDTO getCarByCondition(CarQueryConditionReq req) { public CarDTO getCarByCondition(CarQueryConditionReq req) {
LambdaQueryWrapper<CarPO> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CarPO> queryWrapper = new LambdaQueryWrapper<>();
@ -40,4 +53,20 @@ public class CarServiceImpl implements CarService {
public Long countCarByStoreId(Long storeId) { public Long countCarByStoreId(Long storeId) {
return carRepo.count(new LambdaQueryWrapper<CarPO>().eq(CarPO::getStoreId, storeId)); return carRepo.count(new LambdaQueryWrapper<CarPO>().eq(CarPO::getStoreId, storeId));
} }
@Override
public void carDamage(CarDamageReq req) {
SimpleUserInfoDTO userInfoDTO = jwtUtil.getUserInfoFromToken();
CarPO carPO = carRepo.getById(req.getCarId());
if (carPO == null) {
throw new BizException("车辆不存在");
}
CarDamagePO carDamagePO = new CarDamagePO();
carDamagePO.setCarId(req.getCarId());
carDamagePO.setDamageType(req.getDamageType());
carDamagePO.setDamageReason(req.getDamageReason());
carDamagePO.setSubmitterName(userInfoDTO.getUserName());
carDamagePO.setSubmitTime(LocalDateTime.now());
carDamageRepo.save(carDamagePO);
}
} }

View File

@ -1,5 +1,8 @@
package com.sczx.car.util; package com.sczx.car.util;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.sczx.car.dto.SimpleUserInfoDTO;
import io.jsonwebtoken.JwtException; import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
@ -7,9 +10,13 @@ import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
import javax.servlet.http.HttpServletRequest;
import java.util.Date; import java.util.Date;
import java.util.Map;
/** /**
* @Author: 张黎 * @Author: 张黎
@ -30,16 +37,38 @@ public class JwtUtil {
// this.key = Keys.secretKeyFor(SignatureAlgorithm.HS512); // this.key = Keys.secretKeyFor(SignatureAlgorithm.HS512);
log.info("JWT 密钥:{}", secretKey); log.info("JWT 密钥:{}", secretKey);
} }
// 支持自定义 claims 的 generateToken 方法
public String generateToken(String username, String role) { public String generateToken(SimpleUserInfoDTO simpleUserInfoDTO, String subject){
Map<String, Object> claims = Maps.newHashMap();
claims.put("userInfo", simpleUserInfoDTO.getUserId());
return Jwts.builder() return Jwts.builder()
.setSubject(username) .setClaims(claims) // 设置自定义 claims
.claim("role", role) .setSubject(subject)
.setExpiration(new Date(System.currentTimeMillis() + expiration)) .setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(key, SignatureAlgorithm.HS512) .signWith(key, SignatureAlgorithm.HS512)
.compact(); .compact();
} }
// 从 token 中提取某个字段
public <T> T getClaim(String token, String claimKey, Class<T> clazz) {
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody()
.get(claimKey, clazz);
}
// 从 token 中提取某个对象类型的字段(支持复杂对象)
public <T> T getClaimFromToken(String token, String claimKey, Class<T> targetClass) {
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody()
.get(claimKey, targetClass);
}
public String extractUsername(String token) { public String extractUsername(String token) {
return Jwts.parserBuilder() return Jwts.parserBuilder()
.setSigningKey(key) .setSigningKey(key)
@ -60,4 +89,35 @@ public class JwtUtil {
return false; return false;
} }
} }
public HttpServletRequest getCurrentRequest() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return attributes != null ? attributes.getRequest() : null;
}
/**
* 获取当前请求的Authorization头内容
* @return Authorization头的值如果不存在则返回null
*/
public String getAuthorizationHeader() {
HttpServletRequest request = getCurrentRequest();
return request != null ? request.getHeader("Authorization") : null;
}
/**
* 从token中获取用户信息
* @return 用户信息
*/
public SimpleUserInfoDTO getUserInfoFromToken() {
String authHeader = getAuthorizationHeader();
log.info("token:{}",authHeader);
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
String userInfoJson = getClaim(token, "userInfo", String.class);
// 进行token验证等操作
return JSONObject.parseObject(userInfoJson, SimpleUserInfoDTO.class);
}else {
throw new RuntimeException("token不存在");
}
}
} }

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sczx.car.mapper.CarDamageMapper">
</mapper>