客户信息

This commit is contained in:
Vinjor 2024-10-11 20:45:13 +08:00
parent d8a2f4b3cb
commit 0c87ee6793
21 changed files with 380 additions and 56 deletions

View File

@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.app.car.vo.AppCarMainResVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -73,7 +72,6 @@ public class AppCarMainController {
@Operation(summary = "获得车辆信息")
// @PreAuthorize("@ss.hasPermission('base:car-main:query')")
public CommonResult<List<AppCarMainResVo>> getCarMain() {
List<AppCarMainResVo> carMain = carMainService.getCarMain();
return CommonResult.success(carMain);
}

View File

@ -1,21 +0,0 @@
package cn.iocoder.yudao.module.custom.controller.admin;
import cn.iocoder.yudao.module.custom.service.UserCarService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Tag(name = "管理后台 - 用户车辆信息表--用户个人录入的")
@RestController
@RequestMapping("/base/user-car")
@Validated
public class UserCarController {
@Resource
private UserCarService userCarService;
}

View File

@ -0,0 +1,66 @@
package cn.iocoder.yudao.module.custom.controller.app;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.custom.service.UserCarService;
import cn.iocoder.yudao.module.custom.vo.UserCarVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Tag(name = "管理后台 - 用户车辆信息表--用户个人录入的")
@RestController
@RequestMapping("/base/user-car")
@Validated
public class UserCarController {
@Resource
private UserCarService userCarService;
/**
* 查询当前登录用户的所有车辆
* @author vinjor-M
* @date 14:28 2024/10/11
**/
@GetMapping("/getMyCar")
@Operation(summary = "查询个人车辆列表")
public CommonResult<?> getMyCar() {
return CommonResult.success(userCarService.getMyCar());
}
/**
* 创建或更新车辆信息
*
* @param userCarVO 车辆信息
*/
@PostMapping("/createOrUpdate")
@Operation(summary = "创建或更新车辆信息")
public CommonResult<?> createOrUpdate(@RequestBody UserCarVO userCarVO) {
return userCarService.createOrUpdate(userCarVO);
}
/**
* OCR识别
* @author vinjor-M
* @date 16:58 2024/10/11
* @param imagePath 公网图片地址
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@PostMapping("/vehicleLicenseOCR")
public CommonResult<?> vehicleLicenseOCR(@RequestBody String imagePath) throws Exception {
return CommonResult.success(userCarService.vehicleLicenseOCR(imagePath));
}
/**
* 删除车辆
* @author vinjor-M
* @date 14:28 2024/10/11
**/
@DeleteMapping("/delById")
@Operation(summary = "删除车辆")
public CommonResult<?> delById(String id) {
return CommonResult.success(userCarService.removeById(id));
}
}

View File

@ -1,20 +1,12 @@
package cn.iocoder.yudao.module.custom.entity;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.util.Date;
/**
* 用户车辆信息表--用户个人录入的 DO
@ -35,6 +27,10 @@ public class UserCar extends BaseDO {
*/
@TableId(type = IdType.ASSIGN_UUID)
private String id;
/**
* 用户ID
*/
private Long userId;
/**
* 发动机号码
*/
@ -70,11 +66,11 @@ public class UserCar extends BaseDO {
/**
* 车辆注册日期
*/
private LocalDateTime carRegisterDate;
private Date carRegisterDate;
/**
* 保养日期
*/
private LocalDateTime maintenanceDate;
private Date maintenanceDate;
/**
* 保养里程
*/
@ -82,19 +78,19 @@ public class UserCar extends BaseDO {
/**
* 年检日期
*/
private LocalDateTime inspectionDate;
private Date inspectionDate;
/**
* 保险日期
*/
private LocalDateTime insuranceDate;
private Date insuranceDate;
/**
* 二级维护时间
*/
private LocalDateTime checkDate;
private Date checkDate;
/**
* 下次保养日期
*/
private LocalDateTime nextMaintenanceDate;
private Date nextMaintenanceDate;
/**
* 下次保养里程
*/
@ -102,15 +98,15 @@ public class UserCar extends BaseDO {
/**
* 下次年检日期
*/
private LocalDateTime nextInspectionDate;
private Date nextInspectionDate;
/**
* 保险到期日期
*/
private LocalDateTime insuranceExpiryDate;
private Date insuranceExpiryDate;
/**
* 下次二级维护时间
*/
private LocalDateTime nextCheckDate;
private Date nextCheckDate;
/**
* 是否车主
*/

View File

@ -1,8 +1,12 @@
package cn.iocoder.yudao.module.custom.mapper;
import cn.iocoder.yudao.module.custom.entity.UserCar;
import cn.iocoder.yudao.module.custom.vo.UserCarVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 用户车辆信息表--用户个人录入的 Mapper
@ -12,5 +16,13 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserCarMapper extends BaseMapper<UserCar> {
/**
* 查询用户的车辆
* @author vinjor-M
* @date 18:53 2024/10/11
* @param userId 用户id
* @return java.util.List<cn.iocoder.yudao.module.custom.entity.UserCar>
**/
List<UserCarVO> selectByUserId(@Param("userId") Long userId);
}

View File

@ -1,7 +1,12 @@
package cn.iocoder.yudao.module.custom.service;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.custom.entity.UserCar;
import cn.iocoder.yudao.module.custom.vo.UserCarVO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import java.util.List;
/**
* 用户车辆信息表--用户个人录入的 Service 接口
@ -10,5 +15,29 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface UserCarService extends IService<UserCar> {
/**
* 创建或更新车辆信息
* @author vinjor-M
* @date 14:11 2024/10/11
* @param userCarVO 车辆信息
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
CommonResult<?> createOrUpdate(UserCarVO userCarVO);
/**
* 查询当前登录用户的所有车辆
* @author vinjor-M
* @date 14:28 2024/10/11
* @return java.util.List<cn.iocoder.yudao.module.custom.vo.UserCarVO>
**/
List<UserCarVO> getMyCar();
/**
*
* @author vinjor-M
* @date 16:59 2024/10/11
* @param imagePath 公网图片地址
* @return java.lang.Object
**/
Object vehicleLicenseOCR(String imagePath) throws TencentCloudSDKException;
}

View File

@ -1,13 +1,24 @@
package cn.iocoder.yudao.module.custom.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.custom.entity.UserCar;
import cn.iocoder.yudao.module.custom.mapper.UserCarMapper;
import cn.iocoder.yudao.module.custom.service.UserCarService;
import cn.iocoder.yudao.module.custom.vo.DrivelicenseVO;
import cn.iocoder.yudao.module.custom.vo.UserCarVO;
import cn.iocoder.yudao.util.VehicleLicenseOCR;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
/**
* 用户车辆信息表--用户个人录入的 Service 实现类
@ -20,4 +31,53 @@ public class UserCarServiceImpl extends ServiceImpl<UserCarMapper, UserCar> impl
@Resource
private UserCarMapper userCarMapper;
/**
* 创建或更新车辆信息
*
* @param userCarVO 车辆信息
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
* @author vinjor-M
* @date 14:11 2024/10/11
**/
@Override
public CommonResult<?> createOrUpdate(UserCarVO userCarVO) {
//车牌号英文全部转大写
userCarVO.setLicenseNumber(userCarVO.getLicenseNumber().toUpperCase());
//设置所属者
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
userCarVO.setUserId(loginUser.getId());
this.saveOrUpdate(userCarVO);
return CommonResult.ok();
}
/**
* 查询当前登录用户的所有车辆
*
* @return java.util.List<cn.iocoder.yudao.module.custom.vo.UserCarVO>
* @author vinjor-M
* @date 14:28 2024/10/11
**/
@Override
public List<UserCarVO> getMyCar() {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
return userCarMapper.selectByUserId(loginUser.getId());
}
/**
* @param imagePath 公网图片地址
* @return java.lang.Object
* @author vinjor-M
* @date 16:59 2024/10/11
**/
@Override
public Object vehicleLicenseOCR(String imagePath) throws TencentCloudSDKException {
String info = VehicleLicenseOCR.dealFunction(imagePath);
JSONObject infoJson = JSONUtil.parseObj(info);
DrivelicenseVO licenseVO = BeanUtil.toBean(infoJson.getJSONObject("FrontInfo"),DrivelicenseVO.class);
if(licenseVO.getModel().contains("")){
licenseVO.setBrand(licenseVO.getModel().split("")[0]);
}
return licenseVO;
}
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.custom.vo;
import lombok.Data;
/**
* 行驶证OCR识别结果
* @author vinjor-M
* @date 17:17 2024/10/11
**/
@Data
public class DrivelicenseVO {
/**所有人*/
private String Owner;
/**住址*/
private String Address;
/**车辆类型*/
private String VehicleType;
/**品牌型号*/
private String Model;
/**品牌*/
private String brand;
/**注册日期*/
private String RegisterDate;
/**发证日期*/
private String IssueDate;
/**车辆识别代号*/
private String Vin;
/**所有人*/
private String Seal;
/**车牌号*/
private String PlateNo;
/**使用性质*/
private String UseCharacter;
/**发动机号码*/
private String EngineNo;
}

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.custom.vo;
import cn.iocoder.yudao.module.custom.entity.UserCar;
import lombok.Data;
@Data
public class UserCarVO extends UserCar {
/**品牌名称*/
private String brandName;
/**品牌logo*/
private String logoImg;
}

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.util;
import org.springframework.stereotype.Component;
/**
* 基础工具类
* @author vinjor-M
* @date 14:15 2024/10/11
**/
@Component
public class BaseUtil {
}

View File

@ -9,4 +9,15 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="selectByUserId" resultType="cn.iocoder.yudao.module.custom.vo.UserCarVO">
SELECT
buc.* ,
bcb.brand_name AS brandName,
bcb.logo_img as logoImg
FROM
base_user_car buc
LEFT JOIN base_car_brand bcb ON buc.car_brand = bcb.id
WHERE buc.user_id = #{userId}
AND buc.deleted = 0
</select>
</mapper>

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.controller.app.user;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 用户")
@RestController
@RequestMapping("/system/user")
@Validated
public class AppUserController {
@Resource
private AdminUserService userService;
/**
* 微信小程序端修改个人信息
* @author vinjor-M
* @date 20:14 2024/10/11
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.lang.Boolean>
**/
@PutMapping("update")
@Operation(summary = "修改用户")
public CommonResult<Boolean> updateUser(@RequestBody UserInfoVO reqVO) {
userService.updateCusInfo(reqVO);
return success(true);
}
}

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.system.controller.app.user;
import lombok.Data;
@Data
public class UserInfoVO {
/** 用户id **/
private Long id;
/** 用户昵称 **/
private String nickname;
/** 头像地址 **/
private String avatar;
}

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
import cn.iocoder.yudao.module.system.controller.app.user.UserInfoVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -59,4 +60,6 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
AdminUserDO getUserByMobileWithoutTenant(String phoneNumber);
int updateSetOpenId(@Param("userId")Long userId,@Param("openId")String openId);
int updateCusInfo(@Param("entity") UserInfoVO userInfoVO);
}

View File

@ -6,8 +6,6 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
@ -217,6 +215,16 @@ public class AdminAuthServiceImpl implements AdminAuthService {
return AuthConvert.INSTANCE.convert(accessTokenDO);
}
private AuthLoginRespVO createTokenAfterLoginSuccessCustomer(Long userId, String username, LoginLogTypeEnum logType) {
// 插入登陆日志
createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS);
// 创建访问令牌
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, UserTypeEnum.MEMBER.getValue(),
OAuth2ClientConstants.CLIENT_ID_DEFAULT, null);
// 构建返回结果
return AuthConvert.INSTANCE.convert(accessTokenDO);
}
@Override
public AuthLoginRespVO refreshToken(String refreshToken) {
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT);
@ -408,7 +416,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
@Override
public AuthLoginRespVO wxLoginByUserId(Long userId, String userName) {
// 生成token
return createTokenAfterLoginSuccess(userId, userName, LoginLogTypeEnum.LOGIN_SOCIAL);
return createTokenAfterLoginSuccessCustomer(userId, userName, LoginLogTypeEnum.LOGIN_SOCIAL);
}
/**

View File

@ -1,17 +1,23 @@
package cn.iocoder.yudao.module.system.service.user;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.yudao.module.system.controller.app.user.UserInfoVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import javax.validation.Valid;
import java.io.InputStream;
import java.util.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 后台用户 Service 接口
@ -35,6 +41,14 @@ public interface AdminUserService {
*/
void updateUser(@Valid UserSaveReqVO updateReqVO);
/**
* 微信小程序端修改用户个人信息
* @author vinjor-M
* @date 20:11 2024/10/11
* @param userInfoVO 用户对象
**/
void updateCusInfo(UserInfoVO userInfoVO);
/**
* 更新用户的最后登陆信息
*

View File

@ -12,13 +12,13 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import cn.iocoder.yudao.module.infra.api.file.FileApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.yudao.module.system.controller.app.user.UserInfoVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
@ -142,6 +142,18 @@ public class AdminUserServiceImpl implements AdminUserService {
LogRecordContext.putVariable("user", oldUser);
}
/**
* 微信小程序端修改用户个人信息
*
* @param userInfoVO 用户对象
* @author vinjor-M
* @date 20:11 2024/10/11
**/
@Override
public void updateCusInfo(UserInfoVO userInfoVO) {
userMapper.updateCusInfo(userInfoVO);
}
private void updateUserPost(UserSaveReqVO reqVO, AdminUserDO updateObj) {
Long userId = reqVO.getId();
Set<Long> dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId);

View File

@ -6,6 +6,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<update id="updateSetOpenId">
UPDATE system_users SET open_id = #{openId} WHERE id = #{userId}
</update>
<update id="updateCusInfo">
UPDATE system_users
SET nickname = #{entity.nickname},avatar = #{entity.avatar}
WHERE id = #{entity.id}
</update>
<select id="getUsersByRoleRescue" resultType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO">
SELECT

View File

@ -297,7 +297,7 @@ yudao:
- /admin-api/rescuePayApi/payNotify
- /admin-api/payApi/payNotify
- /admin-api/base/notice/**
- /app-api/** #小程序端接口,不区分租户
ignore-tables:
- system_tenant
- system_tenant_package
@ -344,6 +344,7 @@ yudao:
- tmp_report_data_income
- system_users
- dl_base_notice
- base_user_car
ignore-caches:
- permission_menu_ids
- oauth_client

View File

@ -4,7 +4,7 @@
"avatar": "",
"version": "4.9.2",
"createdTime": "2024-10-9 10:34:15",
"updatedTime": "2024-10-11 13:52:26",
"updatedTime": "2024-10-11 14:30:48",
"dbConns": [],
"profile": {
"default": {
@ -28175,6 +28175,24 @@
"extProps": {},
"uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE"
},
{
"defKey": "user_id",
"defName": "用户ID",
"comment": "",
"type": "VARCHAR",
"len": 50,
"scale": "",
"primaryKey": false,
"notNull": false,
"autoIncrement": false,
"defaultValue": "",
"hideInGraph": false,
"refDict": "",
"baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
"extProps": {},
"domain": "",
"id": "043E95EA-52A2-4C8E-B275-5394988C4D30"
},
{
"defKey": "engine_number",
"defName": "发动机号码",