diff --git a/pom.xml b/pom.xml index 28f0542..ab1ae6b 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,25 @@ 25 + + + + + + org.springframework.cloud + spring-cloud-dependencies + 2025.0.1 + pom + import + + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + org.springframework.boot spring-boot-starter-web @@ -76,6 +94,22 @@ commons-lang3 3.18.0 + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.1396 + + + com.qcloud + cos_api + 5.6.246 + + + org.apache.tika + tika-core + 3.2.3 + diff --git a/src/main/java/com/xjhs/findmemerchant/common/jpa/AbstractBaseEntity.java b/src/main/java/com/xjhs/findmemerchant/common/jpa/AbstractBaseEntity.java index 0d16da2..d91a194 100644 --- a/src/main/java/com/xjhs/findmemerchant/common/jpa/AbstractBaseEntity.java +++ b/src/main/java/com/xjhs/findmemerchant/common/jpa/AbstractBaseEntity.java @@ -34,7 +34,7 @@ public class AbstractBaseEntity { @CreatedDate @Column(name = "created_at", nullable = false, updatable = false) @Comment("创建时间") - private LocalDateTime createdAt; + private LocalDateTime createTime; /** * 创建人 */ @@ -49,7 +49,7 @@ public class AbstractBaseEntity { @LastModifiedDate @Column(name = "updated_at", nullable = false) @Comment("更新时间") - private LocalDateTime updatedAt; + private LocalDateTime updateTime; /** * 更新人 */ @@ -62,20 +62,20 @@ public class AbstractBaseEntity { */ @Column(name = "deleted_at") @Comment("软删除时间") - private LocalDateTime deletedAt; + private LocalDateTime deleteTime; /** * 是否已删除 */ public boolean isDeleted() { - return deletedAt != null; + return deleteTime != null; } /** * 标记删除 */ public void markDeleted() { - this.deletedAt = LocalDateTime.now(); + this.deleteTime = LocalDateTime.now(); } } diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/TencentCOSService.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/TencentCOSService.java new file mode 100644 index 0000000..63ae89c --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/TencentCOSService.java @@ -0,0 +1,75 @@ +package com.xjhs.findmemerchant.common.openapi; + +import com.qcloud.cos.COSClient; +import com.qcloud.cos.exception.CosClientException; +import com.qcloud.cos.model.GetObjectRequest; +import com.qcloud.cos.model.PutObjectRequest; +import com.xjhs.findmemerchant.common.openapi.dto.CosPutObjectResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.InputStream; +import java.util.UUID; + +@Slf4j +@Service +@RequiredArgsConstructor +public class TencentCOSService { + @Value("${appconfig.tencentCos.bucketName}") + private String bucketName; + private final COSClient tencentCosClient; + + /** + * 文件上传到Cos存储桶 + * + * @param file 文件 + * @return 存储对象信息 + */ + public CosPutObjectResult putObject(File file) throws Exception { + try { + var key = UUID.randomUUID().toString(); + var req = new PutObjectRequest(this.bucketName, key, file); + var result = tencentCosClient.putObject(req); + return new CosPutObjectResult(key, result.getETag()); + } catch (CosClientException e) { + log.error("文件上传到对象存储失败", e); + throw new Exception("文件上传到对象存储失败"); + } + } + + /** + * 获取文件输入流(下载文件) + * @param key 对象key + * @return 输入流 + * @throws Exception 下载失败 + */ + public InputStream getObject(String key) throws Exception{ + try { + var req = new GetObjectRequest(this.bucketName, key); + var cosObject = this.tencentCosClient.getObject(req); + return cosObject.getObjectContent(); + } catch (CosClientException e) { + log.error("从对象存储下载文件失败",e); + throw new Exception("从对象存储下载文件失败"); + } + } + + + /** + * 删除存储对象 + * + * @param key 对象key + * @throws Exception 删除失败 + */ + public void deleteObject(String key) throws Exception { + try { + this.tencentCosClient.deleteObject(this.bucketName, key); + } catch (CosClientException e) { + log.error("文件上传到对象存储失败", e); + throw new Exception("文件上传到对象存储失败"); + } + } +} diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/TencentCloudSMSService.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/TencentCloudSMSService.java new file mode 100644 index 0000000..8c4c583 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/TencentCloudSMSService.java @@ -0,0 +1,57 @@ +package com.xjhs.findmemerchant.common.openapi; + + +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20190711.SmsClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor() +public class TencentCloudSMSService { + @Value("${appconfig.tencentSms.sdkAppId}") + private String sdkAppid; + @Value("${appconfig.tencentSms.templateId}") + private String templateId; + @Value("${appconfig.tencentSms.signName}") + private String signName; + private final SmsClient tencentSmsClient; + + + /** + * 发送短信验证码 + * + * @param phone 11位国内手机号码 + * @param code 验证码 + * @return 验证码值 + * @throws Exception 发送失败 + */ + public String sendVerifyCode(String phone, String code) throws Exception { + try { + if (!phone.startsWith("+86")) { + phone = "+86" + phone; + } + var req = new SendSmsRequest(); + req.setSmsSdkAppid(this.sdkAppid); + req.setTemplateID(this.templateId); + req.setSign(this.signName); + req.setPhoneNumberSet(new String[]{phone}); + req.setTemplateParamSet(new String[]{code}); + var resp = this.tencentSmsClient.SendSms(req); + if (resp.getSendStatusSet().length == 0){ + throw new Exception("取回短信发送结果失败"); + } + if (!"ok".equalsIgnoreCase(resp.getSendStatusSet()[0].getCode())){ + throw new Exception(resp.getSendStatusSet()[0].getMessage()); + } + return code; + } catch (TencentCloudSDKException e) { + log.error("验证码发送失败", e); + throw new Exception("系统错误,验证码发送失败"); + } + } +} diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/AmapFeignClient.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/AmapFeignClient.java new file mode 100644 index 0000000..a98d2bf --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/AmapFeignClient.java @@ -0,0 +1,35 @@ +package com.xjhs.findmemerchant.common.openapi.amap; + + +import com.xjhs.findmemerchant.common.openapi.amap.response.AmapGeocodeResponse; +import com.xjhs.findmemerchant.common.openapi.amap.response.AmapReGeocodeResponse; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 高德地图服务接口 + */ +@FeignClient(name = "amapFeignClient", url = "https://restapi.amap.com") +public interface AmapFeignClient { + + /** + * 地理编码 API 服务 + * @param key 高德Key + * @param address 结构化地址信息,规则遵循:国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦,如:北京市朝阳区阜通东大街6号。 + * @return 响应信息 + */ + @GetMapping("/v3/geocode/geo") + AmapGeocodeResponse getGeo(@RequestParam(name = "key") String key, + @RequestParam(name = "address") String address); + + + /** + * 逆地理编码 API 服务地址 + * @param key 高德Key + * @param location 经纬度坐标 传入内容规则:经度在前,纬度在后,经纬度间以“,”分割,经纬度小数点后不要超过 6 位。 + */ + @GetMapping("/v3/geocode/regeo") + AmapReGeocodeResponse getReGeo(@RequestParam(name = "key") String key, + @RequestParam(name = "location") String location); +} diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/AmapService.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/AmapService.java new file mode 100644 index 0000000..a9583fb --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/AmapService.java @@ -0,0 +1,39 @@ +package com.xjhs.findmemerchant.common.openapi.amap; + +import com.xjhs.findmemerchant.common.openapi.amap.response.AmapGeocodeResponse; +import com.xjhs.findmemerchant.common.openapi.amap.response.AmapReGeocodeResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AmapService { + + @Value("${appconfig.amapKey}") + private String amapKey = "c618de6e686c43095a8593db836c7de2"; + private final AmapFeignClient amapFeignClient; + + /** + * 地址转经纬度 + * + * @param address 地址信息 + * @return 经纬度信息结果 + */ + public AmapGeocodeResponse getGeo(String address) { + return this.amapFeignClient.getGeo(this.amapKey, address); + } + + /** + * 经纬度转地理位置信息 + * + * @param lng 经度 + * @param lat 纬度 + * @return 位置信息 + */ + public AmapReGeocodeResponse getRegeo(double lng, double lat) { + return this.amapFeignClient.getReGeo(this.amapKey, lng + "," + lat); + } +} diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/response/AmapGeocodeResponse.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/response/AmapGeocodeResponse.java new file mode 100644 index 0000000..0969541 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/response/AmapGeocodeResponse.java @@ -0,0 +1,95 @@ +package com.xjhs.findmemerchant.common.openapi.amap.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 地理编码 API 服务响应内容 + */ +@Data +public class AmapGeocodeResponse { + /** + * 请求状态值,0 表示请求失败,1 表示请求成功 + */ + private int status; + + /** + * 返回结果的数量 + */ + private int count; + + /** + * 返回结果的详细说明,当 status 为 0 时,info 会包含错误原因;否则返回 "OK" + */ + private String info; + + /** + * 地理编码信息列表,包含多个地址组件 + */ + private List geocodes = new ArrayList<>(); + + /** + * 地理编码信息的详细字段 + */ + @Data + public static class GeocodeDetails { + + @JsonProperty("formatted_address") + private String address; + + /** + * 国家,默认返回中国 + */ + private String country; + + /** + * 省份名称,例如:北京市 + */ + private String province; + + /** + * 城市名称,例如:北京市 + */ + private String city; + + /** + * 城市编码,例如:010 + */ + private String citycode; + + /** + * 区域名称,例如:朝阳区 + */ + private String district; + + /** + * 街道名称,例如:单通东大街 + */ + private String street; + + /** + * 门牌号,例如:6号 + */ + private String number; + + /** + * 区域编码,例如:110101 + */ + private String adcode; + + /** + * 经纬度坐标,逗号分隔 + */ + private String location; + + /** + * 匹配级别,用于地理匹配的精确度 + */ + private String level; + } + + +} diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/response/AmapReGeocodeResponse.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/response/AmapReGeocodeResponse.java new file mode 100644 index 0000000..11d01dd --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/amap/response/AmapReGeocodeResponse.java @@ -0,0 +1,207 @@ +package com.xjhs.findmemerchant.common.openapi.amap.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 逆地理位置服务响应内容 + */ +@Data +public class AmapReGeocodeResponse { + + /** + * 请求状态,1 表示请求成功 + */ + private String status; + + /** + * 地址组件信息 + */ + private Regeocode regeocode; + + /** + * 返回的状态信息 + */ + private String info; + + /** + * 状态码,10000 表示成功 + */ + private String infocode; + + /** + * 地址组件类,包含具体的地理信息 + */ + @Data + public static class Regeocode { + + /** + * 地址组件,包含城市、区、街道等信息 + */ + private AddressComponent addressComponent; + + /** + * 格式化后的地址,整合了详细信息 + */ + @JsonProperty("formatted_address") + private String address; + } + + /** + * 地址组件,包含详细的地理信息 + */ + @Data + public static class AddressComponent { + + /** + * 城市名称,可能为空 + */ + private List city = new ArrayList<>(); + + /** + * 省份名称 + */ + private String province; + + /** + * 区域编码 + */ + private String adcode; + + /** + * 区域名称 + */ + private String district; + + /** + * 城镇编码 + */ + private String towncode; + + /** + * 街道信息 + */ + private StreetNumber streetNumber; + + /** + * 国家名称 + */ + private String country; + + /** + * 街道所属乡镇名称 + */ + private String township; + + /** + * 商圈信息,包含多个商圈 + */ + private List businessAreas; + + /** + * 建筑信息 + */ + private Building building; + + /** + * 邻里信息 + */ + private Neighborhood neighborhood; + + /** + * 城市编码 + */ + private String citycode; + } + + /** + * 街道信息,包括街道名称、位置、方向等 + */ + @Data + public static class StreetNumber { + + /** + * 门牌号 + */ + private String number; + + /** + * 经纬度位置 + */ + private String location; + + /** + * 方向 + */ + private String direction; + + /** + * 距离 + */ + private String distance; + + /** + * 街道名称 + */ + private String street; + } + + /** + * 商圈信息 + */ + @Data + public static class BusinessArea { + + /** + * 商圈位置(经纬度) + */ + private String location; + + /** + * 商圈名称 + */ + private String name; + + /** + * 商圈ID + */ + private String id; + } + + /** + * 建筑信息,包括建筑名称和类型 + */ + @Data + public static class Building { + + /** + * 建筑名称 + */ + private String name; + + /** + * 建筑类型 + */ + private String type; + } + + /** + * 邻里信息 + */ + @Data + public static class Neighborhood { + + /** + * 邻里名称 + */ + private String name; + + /** + * 邻里类型 + */ + private String type; + } +} diff --git a/src/main/java/com/xjhs/findmemerchant/common/openapi/dto/CosPutObjectResult.java b/src/main/java/com/xjhs/findmemerchant/common/openapi/dto/CosPutObjectResult.java new file mode 100644 index 0000000..4ff570a --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/common/openapi/dto/CosPutObjectResult.java @@ -0,0 +1,13 @@ +package com.xjhs.findmemerchant.common.openapi.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CosPutObjectResult { + private String key; + private String eTag; +} diff --git a/src/main/java/com/xjhs/findmemerchant/config/FeignConfig.java b/src/main/java/com/xjhs/findmemerchant/config/FeignConfig.java new file mode 100644 index 0000000..d3790a1 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/config/FeignConfig.java @@ -0,0 +1,13 @@ +package com.xjhs.findmemerchant.config; + +import com.xjhs.findmemerchant.common.openapi.amap.AmapFeignClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableFeignClients(basePackageClasses = { + AmapFeignClient.class, +}) +public class FeignConfig { + +} diff --git a/src/main/java/com/xjhs/findmemerchant/config/JpaConfig.java b/src/main/java/com/xjhs/findmemerchant/config/JpaConfig.java index 18bf7fa..a64a9ec 100644 --- a/src/main/java/com/xjhs/findmemerchant/config/JpaConfig.java +++ b/src/main/java/com/xjhs/findmemerchant/config/JpaConfig.java @@ -1,6 +1,6 @@ package com.xjhs.findmemerchant.config; -import com.xjhs.findmemerchant.entity.Merchant; +import com.xjhs.findmemerchant.security.LoginUser; import com.xjhs.findmemerchant.security.sms.SmsAuthenticationToken; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,8 +20,8 @@ public class JpaConfig { var auth = SecurityContextHolder.getContext().getAuthentication(); if (auth instanceof SmsAuthenticationToken){ var principal = auth.getPrincipal(); - if (principal instanceof Merchant merchant){ - return Optional.of(merchant.getId()); + if (principal instanceof LoginUser loginUser){ + return Optional.of(loginUser.getUserId()); } } return Optional.of(0L); diff --git a/src/main/java/com/xjhs/findmemerchant/config/ThirdOpenApiConfig.java b/src/main/java/com/xjhs/findmemerchant/config/ThirdOpenApiConfig.java new file mode 100644 index 0000000..6c66601 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/config/ThirdOpenApiConfig.java @@ -0,0 +1,36 @@ +package com.xjhs.findmemerchant.config; + +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.common.profile.Region; +import com.tencentcloudapi.sms.v20190711.SmsClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ThirdOpenApiConfig { + + @Bean + public SmsClient tencentSmsClient(@Value("${appconfig.tencentSms.secretId}") String secretId, + @Value("${appconfig.tencentSms.secretKey}") String secretKey) { + var cred = new Credential(secretId, secretKey); + var httpProfile = new HttpProfile(); + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + var clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + return new SmsClient(cred, "ap-guangzhou", clientProfile); + } + + @Bean + public COSClient tencentCosClient(@Value("${appconfig.tencentCos.secretId}") String secretId, + @Value("${appconfig.tencentCos.secretKey}") String secretKey){ + var cred = new BasicCOSCredentials(secretId,secretKey); + ClientConfig clientConfig = new ClientConfig(new com.qcloud.cos.region.Region("ap-guangzhou")); + return new COSClient(cred, clientConfig); + } +} diff --git a/src/main/java/com/xjhs/findmemerchant/controller/AuthController.java b/src/main/java/com/xjhs/findmemerchant/controller/AuthController.java index 745053d..c854ced 100644 --- a/src/main/java/com/xjhs/findmemerchant/controller/AuthController.java +++ b/src/main/java/com/xjhs/findmemerchant/controller/AuthController.java @@ -1,20 +1,22 @@ package com.xjhs.findmemerchant.controller; import com.xjhs.findmemerchant.common.ApiResult; -import com.xjhs.findmemerchant.dto.MerchantDto; import com.xjhs.findmemerchant.dto.auth.RegisterDto; +import com.xjhs.findmemerchant.dto.merchant.MerchantDto; import com.xjhs.findmemerchant.entity.Merchant; +import com.xjhs.findmemerchant.mapper.MerchantMapper; import com.xjhs.findmemerchant.redis.TokenBlacklistRedisService; import com.xjhs.findmemerchant.repository.MerchantRepository; import com.xjhs.findmemerchant.security.JwtTokenService; +import com.xjhs.findmemerchant.security.LoginUser; import com.xjhs.findmemerchant.security.RefreshTokenService; import com.xjhs.findmemerchant.security.sms.SmsAuthenticationToken; import com.xjhs.findmemerchant.security.sms.SmsCodeService; +import com.xjhs.findmemerchant.system.SystemUserService; import com.xjhs.findmemerchant.vo.auth.SmsLoginVo; import com.xjhs.findmemerchant.vo.auth.SmsSendVo; -import com.xjhs.findmemerchant.service.MerchantService; -import com.xjhs.findmemerchant.vo.merchant.MerchantUpdateVo; import com.xjhs.findmemerchant.vo.auth.RegisterVo; +import com.xjhs.findmemerchant.vo.merchant.MerchantUpdateVo; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -22,6 +24,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.Map; @@ -40,7 +43,8 @@ public class AuthController { private final RefreshTokenService refreshTokenService; private final MerchantRepository merchantRepository; private final TokenBlacklistRedisService tokenBlacklistRedisService; - private final MerchantService merchantService; + private final SystemUserService systemUserService; + private final MerchantMapper merchantMapper; /** * 发送短信验证码 @@ -122,41 +126,46 @@ public class AuthController { * @return 注册成功返回登录令牌信息 */ @PostMapping("/register") - public ApiResult register(@Valid @RequestBody RegisterVo registerVo) { + @Transactional + public ApiResult register(@Valid @RequestBody RegisterVo registerVo) throws Exception { try { this.smsCodeService.verifyCode(registerVo.getPhone(), "register", registerVo.getCode()); - var exists = merchantRepository.existsByPhone(registerVo.getPhone()); - if (exists) { - return ApiResult.fail("手机号已被注册"); + var systemUser = this.systemUserService.getAndRegisterByPhone(registerVo.getPhone()); + if (systemUser.getMerchant() != null){ + throw new Exception("手机号已被注册"); } + var merchant = new Merchant(); - merchant.setPhone(registerVo.getPhone()); + merchant.setSystemUser(systemUser); + systemUser.setMerchant(merchant); this.merchantRepository.save(merchant); return ApiResult.data( - new RegisterDto( - merchant.getId(), - this.jwtTokenService.generateToken(registerVo.getPhone()), - this.refreshTokenService.create(registerVo.getPhone()) - ) + new RegisterDto( + merchant.getId().toString(), + this.jwtTokenService.generateToken(registerVo.getPhone()), + this.refreshTokenService.create(registerVo.getPhone()) + ) ); } catch (Exception e) { log.error("注册失败", e); - return ApiResult.fail("注册失败:" + e.getMessage()); + throw e; } } /** * 获取当前登录的商家基本信息 * - * @param merchant @ignore 当前商家 + * @param loginUser @ignore 当前登录用户 * @return 商家信息 */ @GetMapping("/profile") - public ApiResult getProfile(@AuthenticationPrincipal Merchant merchant) { - if (merchant == null) { + @Transactional(readOnly = true) + public ApiResult getProfile(@AuthenticationPrincipal LoginUser loginUser) { + if (loginUser.getMerchantId() == null) { return ApiResult.fail("商家信息不存在"); } - return this.merchantService.getById(merchant.getId()) + return this.merchantRepository.findById(loginUser.getMerchantId()) + .map(this.merchantMapper::toDto) .map(ApiResult::data) .orElse(ApiResult.fail("商家信息不存在")); } @@ -172,8 +181,8 @@ public class AuthController { public ApiResult updateProfile(@AuthenticationPrincipal Merchant merchant, @Valid @RequestBody MerchantUpdateVo merchantUpdateVo) { try { - var result = this.merchantService.updateMerchant(merchant.getId(), merchantUpdateVo); - return ApiResult.data(result); + // TODO : 待完成 + return ApiResult.data(null); } catch (Exception e) { return ApiResult.fail(e.getMessage()); } diff --git a/src/main/java/com/xjhs/findmemerchant/controller/MerchantController.java b/src/main/java/com/xjhs/findmemerchant/controller/MerchantController.java deleted file mode 100644 index 332bc93..0000000 --- a/src/main/java/com/xjhs/findmemerchant/controller/MerchantController.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.xjhs.findmemerchant.controller; - -import com.xjhs.findmemerchant.common.ApiResult; -import com.xjhs.findmemerchant.dto.MerchantDto; -import com.xjhs.findmemerchant.entity.Merchant; -import com.xjhs.findmemerchant.service.MerchantService; -import com.xjhs.findmemerchant.vo.merchant.MerchantUpdateVo; -import com.xjhs.findmemerchant.vo.merchant.MerchantVerifyVo; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.*; - -import java.security.Principal; - -/** - * 商家管理接口 - */ -@Slf4j -@RestController -@RequestMapping("/merchant") -@RequiredArgsConstructor -public class MerchantController { - private final MerchantService merchantService; - - /** - * 查询当前登录商家详情 - * - * @param merchant @ignore 当前商家 - * @return 商家详情信息 - */ - @GetMapping - public ApiResult getMerchant(@AuthenticationPrincipal Merchant merchant) { - return this.merchantService.getById(merchant.getId()) - .map(ApiResult::data) - .orElse(ApiResult.fail("商家信息不存在")); - } - - /** - * 更新当前登录商家信息 - * - * @param merchant @ignore 当前商家 - * @param merchantUpdateVo 更新参数 - * @return 商家信息 - */ - @PutMapping - public ApiResult updateMerchant(@AuthenticationPrincipal Merchant merchant, - @Valid @RequestBody MerchantUpdateVo merchantUpdateVo) { - try { - var dto = this.merchantService.updateMerchant(merchant.getId(), merchantUpdateVo); - return ApiResult.data(dto); - } catch (Exception e) { - return ApiResult.fail(e.getMessage()); - } - } - - /** - * 当前商家验证 - * - * @param merchant @ignore 当前商家 - * @param merchantVerifyVo 验证参数 - * @return 商家信息 - */ - @PostMapping("/verify") - public ApiResult verifyMerchant(@AuthenticationPrincipal Merchant merchant, - @Valid @RequestBody MerchantVerifyVo merchantVerifyVo) { - try { - var dto = this.merchantService.verifyMerchant(merchant.getId(), merchantVerifyVo.getIdCardNo(), merchantVerifyVo.getRealName()); - return ApiResult.data(dto); - } catch (Exception e) { - return ApiResult.fail(e.getMessage()); - } - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/controller/StoreController.java b/src/main/java/com/xjhs/findmemerchant/controller/StoreController.java deleted file mode 100644 index e2bbe03..0000000 --- a/src/main/java/com/xjhs/findmemerchant/controller/StoreController.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.xjhs.findmemerchant.controller; - -import com.xjhs.findmemerchant.common.ApiResult; -import com.xjhs.findmemerchant.common.PageData; -import com.xjhs.findmemerchant.common.jpa.query.JpaSpecs; -import com.xjhs.findmemerchant.common.mvc.PageVo; -import com.xjhs.findmemerchant.dto.store.BusinessPeriodDto; -import com.xjhs.findmemerchant.dto.store.StoreBusinessStatusDto; -import com.xjhs.findmemerchant.dto.store.StoreDto; -import com.xjhs.findmemerchant.entity.BusinessPeriod; -import com.xjhs.findmemerchant.entity.Merchant; -import com.xjhs.findmemerchant.entity.Store; -import com.xjhs.findmemerchant.mapper.StoreMapper; -import com.xjhs.findmemerchant.repository.BusinessPeriodRepository; -import com.xjhs.findmemerchant.repository.MerchantRepository; -import com.xjhs.findmemerchant.repository.StoreRepository; -import com.xjhs.findmemerchant.vo.store.BusinessPeriodVo; -import com.xjhs.findmemerchant.vo.store.StoreBusinessStatusUpdateVo; -import com.xjhs.findmemerchant.vo.store.StoreCreateVo; -import com.xjhs.findmemerchant.vo.store.StoreUpdateVo; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.security.Principal; -import java.util.List; -import java.util.Objects; - -/** - * 门店管理接口 - */ -@Slf4j -@RestController -@RequestMapping("/stores") -@RequiredArgsConstructor -public class StoreController { - private final MerchantRepository merchantRepository; - private final StoreRepository storeRepository; - private final StoreMapper storeMapper; - private final BusinessPeriodRepository businessPeriodRepository; - - - /** - * 门店信息(分页查询) - * - * @param pageVo 分页参数 - * @param merchant @ignore 当前登录商家 - * @return 分页数据信息 - */ - @GetMapping - @Transactional(readOnly = true) - public ApiResult> findPage(@AuthenticationPrincipal Merchant merchant, PageVo pageVo) { - var pageData = this.storeRepository.findAll(Specification.allOf( - JpaSpecs.eq("merchant.id", merchant.getId()) - ), pageVo.getPageable()).map(this.storeMapper::toDto); - return ApiResult.page(pageData.getTotalElements(), pageData.getContent()); - } - - /** - * 创建商家的门店 - * - * @param vo 门店信息 - * @param merchant @ignore 当前登录的商家 - * @return 门店信息 - */ - @PostMapping - @Transactional(rollbackFor = Exception.class) - public ApiResult create(@AuthenticationPrincipal Merchant merchant, - @Valid @RequestBody StoreCreateVo vo) { - var store = this.storeMapper.toEntity(vo); - merchant.addStore(store); - this.storeRepository.save(store); - var dto = this.storeMapper.toDto(store); - return ApiResult.data(dto); - } - - /** - * 查询门店详情 - * - * @param storeId 门店id - * @param merchant @ignore 当前登录的商家 - * @return 门店详情 - */ - @GetMapping("/{storeId}") - @Transactional(readOnly = true) - public ApiResult findById(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") String storeId) { - var storeIdLong = Long.parseLong(storeId); - return merchant.getStores().stream() - .filter(x -> Objects.equals(x.getId(), storeIdLong)) - .map(this.storeMapper::toDto) - .map(ApiResult::data) - .findFirst() - .orElse(ApiResult.fail("门店信息不存在")); - } - - /** - * 更新门店信息 - * - * @param storeId 门店id - * @param merchant @ignore 当前登录的商家 - * @param vo 更新对象 - * @return 门店信息 - */ - @PutMapping("/{storeId}") - @Transactional(rollbackFor = Exception.class) - public ApiResult updateById(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") String storeId, - @Valid @RequestBody StoreUpdateVo vo) { - var storeIdLong = Long.parseLong(storeId); - for (Store store : merchant.getStores()) { - if (Objects.equals(storeIdLong, store.getId())) { - this.storeMapper.updateFromVo(vo, store); - this.storeRepository.save(store); - return ApiResult.data(this.storeMapper.toDto(store)); - } - } - return ApiResult.fail("门店信息不存在"); - } - - /** - * 删除门店 - * - * @param storeId 门店id - * @param merchant @ignore 当前登录的商家 - */ - @DeleteMapping("/{storeId}") - @Transactional(rollbackFor = Exception.class) - public ApiResult delteById(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") String storeId) { - var storeIdLong = Long.parseLong(storeId); - merchant.getStores().removeIf(x -> Objects.equals(storeIdLong, x.getId())); - this.merchantRepository.save(merchant); - return ApiResult.success("删除成功"); - } - - /** - * 获取门店营业状态 - * - * @param storeId 门店id - * @param merchant @ignore 当前商户 - * @return 门店营业状态信息 - */ - @GetMapping("/{storeId}/business-status") - @Transactional(readOnly = true) - public ApiResult getStoreBusinessStatus(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") String storeId) { - var storeIdLong = Long.parseLong(storeId); - return merchant.getStores().stream() - .filter(x -> Objects.equals(x.getId(), storeIdLong)) - .map(this.storeMapper::toBusinessStatusDto) - .map(ApiResult::data) - .findFirst() - .orElse(ApiResult.fail("门店信息不存在")); - } - - /** - * 设置门店营业状态 - * - * @param storeId 门店id - * @param merchant @ignore 当前商家 - * @param updateVo 更新参数 - * @return 门店营业状态信息 - */ - @PutMapping("/{storeId}/business-status") - @Transactional(rollbackFor = Exception.class) - public ApiResult putStoreBusinessStatus(@PathVariable("storeId") String storeId, - @AuthenticationPrincipal Merchant merchant, - @Validated @RequestBody StoreBusinessStatusUpdateVo updateVo) { - var storeIdLong = Long.parseLong(storeId); - return merchant.getStores().stream() - .filter(x -> Objects.equals(x.getId(), storeIdLong)) - .findFirst() - .map(x -> { - this.storeMapper.updateFromBusinessUpdateVo(updateVo, x); - this.storeRepository.save(x); - return this.storeMapper.toBusinessStatusDto(x); - }) - .map(ApiResult::data) - .orElse(ApiResult.fail("门店信息不存在")); - - } - - /** - * 获取门店营业时间段 - * - * @param storeId 门店id - * @param merchant @ignore 当前商家 - * @return 门店营业时间段 列表 - */ - @GetMapping("/{storeId}/business-periods") - public ApiResult> getStoreBusinessPeriodList(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") String storeId) { - var storeIdLong = Long.parseLong(storeId); - return merchant.getStores().stream() - .filter(x -> Objects.equals(x.getId(), storeIdLong)) - .findFirst() - .map(x -> this.storeMapper.toDtoList(x.getBusinessPeriods())) - .map(ApiResult::data) - .orElse(ApiResult.fail("门店信息不存在")); - } - - /** - * 设置门店营业时间段 - * - * @param storeId 门店id - * @param merchant @ignore 当前商家 - * @param updateVoList 门店营业时间段更新参数列表 - * @return 门店营业时间段 列表 - */ - @PutMapping("/{storeId}/business-periods") - public ApiResult> putStoreBusinessPeriodList(@PathVariable("storeId") String storeId, - @AuthenticationPrincipal Merchant merchant, - @Validated @RequestBody List updateVoList) { - var storeIdLong = Long.parseLong(storeId); - return merchant.getStores().stream() - .filter(x -> Objects.equals(x.getId(), storeIdLong)) - .findFirst() - .map(store -> { - store.getBusinessPeriods().clear(); - for (BusinessPeriodVo businessPeriodVo : updateVoList) { - var entity = this.storeMapper.toEntity(businessPeriodVo); - store.addBusinessPeriods(entity); - this.businessPeriodRepository.save(entity); - } - return this.storeMapper.toDtoList(store.getBusinessPeriods()); - }) - .map(ApiResult::data) - .orElse(ApiResult.fail("门店信息不存在")); - - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/controller/StoreEmployeeController.java b/src/main/java/com/xjhs/findmemerchant/controller/StoreEmployeeController.java deleted file mode 100644 index 00d452e..0000000 --- a/src/main/java/com/xjhs/findmemerchant/controller/StoreEmployeeController.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.xjhs.findmemerchant.controller; - -import com.xjhs.findmemerchant.common.ApiResult; -import com.xjhs.findmemerchant.dto.member.EmployeeDto; -import com.xjhs.findmemerchant.entity.Merchant; -import com.xjhs.findmemerchant.mapper.EmployeeMapper; -import com.xjhs.findmemerchant.repository.EmployeeRepository; -import com.xjhs.findmemerchant.vo.member.EmployeeCreateVo; -import com.xjhs.findmemerchant.vo.member.EmployeeUpdateVo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Objects; - -/** - * 门店员工管理接口 - */ -@Slf4j -@RestController -@RequestMapping("/stores/{storeId}/employees") -@RequiredArgsConstructor -public class StoreEmployeeController { - private final EmployeeRepository employeeRepository; - private final EmployeeMapper employeeMapper; - - /** - * 查询门店员工列表 - * @param merchant @ignore 当前商户 - * @param storeId 门店id - * @return 员工列表信息 - */ - @GetMapping - @Transactional(readOnly = true) - public ApiResult> getList(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") Long storeId) { - var list = this.employeeRepository.findByStoreId(storeId) - .stream().map(this.employeeMapper::toDto) - .toList(); - return ApiResult.data(list); - } - - /** - * 新建门店员工 - * @param merchant @ignore 当前商户 - * @param storeId 门店id - * @param createVo 员工信息参数 - * @return 门店员工信息 - */ - @PostMapping - @Transactional - public ApiResult create(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") Long storeId, - @Validated @RequestBody EmployeeCreateVo createVo) throws Exception { - try { - var store = merchant.getStores().stream() - .filter(x -> Objects.equals(storeId, x.getId())) - .findFirst() - .orElseThrow(() -> new Exception("门店信息不存在")); - var phoneExists = store.getEmployees().stream() - .anyMatch(x -> Objects.equals(x.getPhone(), createVo.getPhone())); - if (phoneExists) { - throw new Exception("手机号码已被使用"); - } - var employee = this.employeeMapper.toEntity(createVo); - store.addEmployee(employee); - this.employeeRepository.save(employee); - var dto = this.employeeMapper.toDto(employee); - return ApiResult.data(dto); - } catch (Exception e) { - log.error("员工信息注册失败", e); - throw e; - } - } - - /** - * 查询门店员工详情 - * @param merchant @ignore 当前商户 - * @param storeId 门店id - * @param employeeId 门店员工id - * @return 员工详情 - */ - @GetMapping("/{employeeId}") - @Transactional(readOnly = true) - public ApiResult findById(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") Long storeId, - @PathVariable("employeeId") Long employeeId) { - return merchant.getStores().stream() - .filter(x -> Objects.equals(storeId, x.getId())) - .flatMap(x -> x.getEmployees().stream()) - .filter(x -> Objects.equals(employeeId, x.getId())) - .findFirst() - .map(this.employeeMapper::toDto) - .map(ApiResult::data) - .orElse(ApiResult.fail("员工信息不存在")); - - } - - /** - * 根据员工id更新员工信息 - * @param merchant @ignore 当前商户 - * @param storeId 门店id - * @param employeeId 员工id - * @param updateVo 更新参数 - * @return 员工详情 - */ - @PutMapping("/{employeeId}") - @Transactional - public ApiResult updateById(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") Long storeId, - @PathVariable("employeeId") Long employeeId, - @Validated @RequestBody EmployeeUpdateVo updateVo) { - return merchant.getStores().stream() - .filter(x -> Objects.equals(storeId, x.getId())) - .flatMap(x -> x.getEmployees().stream()) - .filter(x -> Objects.equals(employeeId, x.getId())) - .findFirst() - .map(employee -> { - this.employeeMapper.updateEntityFormUpdateVo(updateVo, employee); - this.employeeRepository.save(employee); - return ApiResult.data( - this.employeeMapper.toDto(employee) - ); - }) - .orElse(ApiResult.fail("员工信息不存在")); - } - - /** - * 根据id删除员工信息 - * @param merchant @ignore 当前商户 - * @param storeId 门店id - * @param employeeId 员工id - * @return 删除结果 - */ - @DeleteMapping("/{employeeId}") - @Transactional - public ApiResult deleteById(@AuthenticationPrincipal Merchant merchant, - @PathVariable("storeId") Long storeId, - @PathVariable("employeeId") Long employeeId) throws Exception { - try { - var store = merchant.getStores().stream() - .filter(x -> Objects.equals(storeId, x.getId())) - .findFirst() - .orElseThrow(()->new Exception("门店信息不存在")); - store.getEmployees().removeIf(x->Objects.equals(employeeId,x.getId())); - return ApiResult.success(); - } catch (Exception e) { - log.error("删除员工失败",e); - throw e; - } - } - -} diff --git a/src/main/java/com/xjhs/findmemerchant/dto/MerchantDto.java b/src/main/java/com/xjhs/findmemerchant/dto/MerchantDto.java deleted file mode 100644 index 1c235c3..0000000 --- a/src/main/java/com/xjhs/findmemerchant/dto/MerchantDto.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.xjhs.findmemerchant.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.xjhs.findmemerchant.types.AuthStatus; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 商家信息 - */ -@Data -public class MerchantDto { - /** - * 商家id - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long id; - /** - * 手机号码 - * TODO: 手机号码需要脱敏 - */ - private String phone; - /** - * 真实姓名 - */ - private String realName; - /** - * 身份证号(明文) - */ - private String idCardNo; - /** - * 认证状态 - */ - private AuthStatus authStatus; - /** - * 认证状态(说明) - */ - private String authStatusDesc; - /** - * 创建时间 - */ - private LocalDateTime createdAt; -} diff --git a/src/main/java/com/xjhs/findmemerchant/dto/auth/RegisterDto.java b/src/main/java/com/xjhs/findmemerchant/dto/auth/RegisterDto.java index 6a415d8..8c2ee41 100644 --- a/src/main/java/com/xjhs/findmemerchant/dto/auth/RegisterDto.java +++ b/src/main/java/com/xjhs/findmemerchant/dto/auth/RegisterDto.java @@ -16,8 +16,7 @@ public class RegisterDto { /** * 商家id */ - @JsonSerialize(using = ToStringSerializer.class) - private Long merchantId; + private String merchantId; /** * 访问令牌 */ diff --git a/src/main/java/com/xjhs/findmemerchant/dto/member/EmployeeDto.java b/src/main/java/com/xjhs/findmemerchant/dto/member/EmployeeDto.java deleted file mode 100644 index d592180..0000000 --- a/src/main/java/com/xjhs/findmemerchant/dto/member/EmployeeDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.dto.member; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -public class EmployeeDto { - - @JsonSerialize(using = ToStringSerializer.class) - private Long id; - /** - * 员工姓名 - */ - private String name; - /** - * 手机号码 - */ - private String phone; - /** - * 关联角色id - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long roleId; - /** - * 关联门店id - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long storeId; - /** - * 员工状态 - */ - private Integer status; - /** - * 创建时间 - */ - private LocalDateTime createdAt; -} diff --git a/src/main/java/com/xjhs/findmemerchant/dto/merchant/MerchantDto.java b/src/main/java/com/xjhs/findmemerchant/dto/merchant/MerchantDto.java new file mode 100644 index 0000000..5742c20 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/dto/merchant/MerchantDto.java @@ -0,0 +1,9 @@ +package com.xjhs.findmemerchant.dto.merchant; + +import lombok.Data; + +@Data +public class MerchantDto { + private String id; + private String merchantName; +} diff --git a/src/main/java/com/xjhs/findmemerchant/dto/store/BusinessPeriodDto.java b/src/main/java/com/xjhs/findmemerchant/dto/store/BusinessPeriodDto.java deleted file mode 100644 index c7201d8..0000000 --- a/src/main/java/com/xjhs/findmemerchant/dto/store/BusinessPeriodDto.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.xjhs.findmemerchant.dto.store; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -@Data -public class BusinessPeriodDto { - /** - * 门店id - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long storeId; - /** - * 周几,周天0,... - */ - private Integer dayOfWeek; - /** - * 开始营业时间 HH:mm 格式 - */ - private String startTime; - /** - * 结束营业时间 HH:mm 格式 - */ - private String endTime; - /** - * 是否启用 - */ - private Boolean enabled; -} diff --git a/src/main/java/com/xjhs/findmemerchant/dto/store/StoreBusinessStatusDto.java b/src/main/java/com/xjhs/findmemerchant/dto/store/StoreBusinessStatusDto.java deleted file mode 100644 index 67c1533..0000000 --- a/src/main/java/com/xjhs/findmemerchant/dto/store/StoreBusinessStatusDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.xjhs.findmemerchant.dto.store; - -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 门店营业状态 - */ -@Data -public class StoreBusinessStatusDto { - /** - * 业务状态值 - */ - private Integer status; - - /** - * 业务状态文案 - */ - private String statusText; - - /** - * 临时关闭原因(可为空) - */ - private String tempCloseReason; - - /** - * 临时关闭截止时间(可为空) - */ - private LocalDateTime tempCloseUntil; - - /** - * 是否营业 - */ - private Boolean isOpen; -} diff --git a/src/main/java/com/xjhs/findmemerchant/dto/store/StoreDto.java b/src/main/java/com/xjhs/findmemerchant/dto/store/StoreDto.java deleted file mode 100644 index 563a993..0000000 --- a/src/main/java/com/xjhs/findmemerchant/dto/store/StoreDto.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.xjhs.findmemerchant.dto.store; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.xjhs.findmemerchant.types.BusinessStatus; -import com.xjhs.findmemerchant.types.CommonStatus; -import com.xjhs.findmemerchant.types.StoreAuditStatus; -import lombok.Data; - -import java.math.BigDecimal; - -@Data -public class StoreDto { - /** - * 门店id - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long id; - /** - * 商家id - */ - @JsonSerialize(using = ToStringSerializer.class) - private Long merchantId; - /** - * 门店名称 - */ - private String name; - /** - * 门店logo - */ - private String logo; - /** - * 联系电话 - */ - private String phone; - /** - * 省 - */ - private String province; - /** - * 市 - */ - private String city; - /** - * 区/县 - */ - private String district; - /** - * 详细地址 - */ - private String address; - /** - * 完整地址 - */ - private String fullAddress; - - // TODO: 后续改为 Point location - /** - * 经度 - */ - private BigDecimal longitude; - /** - * 纬度 - */ - private BigDecimal latitude; - /** - * 营业时间描述 - */ - private String businessHours; - /** - * 营业状态 - */ - private BusinessStatus businessStatus; - /** - * 营业状态(说明) - */ - private String businessStatusDesc; - /** - * 临时打烊原因 - */ - private String tempCloseReason; - /** - * 临时打烊结束时间 - */ - private String tempCloseUntil; - /** - * 审核状态 - */ - private StoreAuditStatus auditStatus; - /** - * 审核状态(说明) - */ - private String auditStatusDesc; - /** - * 审核备注 - */ - private String auditRemark; - /** - * 启用状态 - */ - private CommonStatus status; - /** - * 启用状态(说明) - */ - private String statusDesc; - /** - * 创建时间 - */ - private String createdAt; -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Activity.java b/src/main/java/com/xjhs/findmemerchant/entity/Activity.java deleted file mode 100644 index 746fc32..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Activity.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.ActivityStatus; -import com.xjhs.findmemerchant.types.ActivityType; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.time.LocalDateTime; - -/** - * 活动 / 营销活动实体 - * 对应表:activities - */ -@Getter -@Setter -@Entity -@Table( - name = "activities", - indexes = { - @Index(name = "idx_activities_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_activities_time", columnList = "start_time,end_time"), - @Index(name = "idx_activities_status", columnList = "status") - } -) -public class Activity extends AbstractBaseEntity { - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id") - private Merchant merchant; - - /** - * 活动名称 - */ - @Column(name = "name", length = 100) - @Comment("活动名称") - private String name; - - /** - * 活动类型 (1团购 2折扣 3限时优惠) - */ - @Column(name = "type", length = 15, columnDefinition = "VARCHAR(15)") - @Enumerated(EnumType.STRING) - @Comment("活动类型") - private ActivityType type; - - /** - * 开始时间 - */ - @Column(name = "start_time") - @Comment("开始时间") - private LocalDateTime startTime; - - /** - * 结束时间 - */ - @Column(name = "end_time") - @Comment("结束时间") - private LocalDateTime endTime; - - /** - * 库存 - */ - @Column(name = "stock") - @Comment("库存总数") - private Integer stock = 0; - - /** - * 已售数量 - */ - @Column(name = "sold_count") - @Comment("已售数量") - private Integer soldCount = 0; - - /** - * 库存告警阈值 - */ - @Column(name = "alert_threshold") - @Comment("库存告警阈值") - private Integer alertThreshold; - - /** - * 活动状态 - */ - @Column(name = "status", columnDefinition = "VARCHAR(20)") - @Enumerated(EnumType.STRING) - @Comment("活动状态:0未开始 1进行中 2已结束 3已下架") - private ActivityStatus status = ActivityStatus.NOT_STARTED; - - - - - // ================= 业务逻辑 ================= - - public boolean isOngoing() { - var now = LocalDateTime.now(); - return this.status == ActivityStatus.ONGOING - && now.isAfter(startTime) - && now.isBefore(endTime); - } - - public boolean hasStock() { - return stock != null && soldCount != null && soldCount < stock; - } - - public int remainingStock() { - if (stock == null || soldCount == null) return 0; - return stock - soldCount; - } - - public boolean isLowStock() { - return alertThreshold != null && remainingStock() <= alertThreshold; - } - - public String getTypeText() { - var e = this.type; - return e != null ? e.getDesc() : "未知"; - } - - public String getStatusText() { - var e = this.status; - return e != null ? e.getDesc() : "未知"; - } - - public boolean canEdit() { - return this.status == ActivityStatus.NOT_STARTED; - } - - public boolean canOffline() { - var s = this.status; - return s == ActivityStatus.NOT_STARTED || s == ActivityStatus.ONGOING; - } - - -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/BankCard.java b/src/main/java/com/xjhs/findmemerchant/entity/BankCard.java deleted file mode 100644 index 1f26233..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/BankCard.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.CommonStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -/** - * 商家提现银行卡 - * 对应表:bank_cards - */ -@Getter -@Setter -@Entity -@Table( - name = "bank_cards", - indexes = { - @Index(name = "idx_bank_cards_merchant_id", columnList = "merchant_id") - } -) -public class BankCard extends AbstractBaseEntity { - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - /** - * 银行名称 - */ - @Column(name = "bank_name", length = 50) - @Comment("银行名称") - private String bankName; - - /** - * 银行代码 - */ - @Column(name = "bank_code", length = 20) - @Comment("银行代码") - private String bankCode; - - /** - * 支行名称 - */ - @Column(name = "branch_name", length = 100) - @Comment("支行名称") - private String branchName; - - /** - * 银行账号(建议加密存储) - */ - @Column(name = "account_no", length = 30) - @Comment("银行卡号(加密存储)") - private String accountNo; - - /** - * 开户名 - */ - @Column(name = "account_name", length = 50) - @Comment("开户名") - private String accountName; - - /** - * 是否默认卡 - */ - @Column(name = "is_default") - @Comment("是否默认卡") - private Boolean isDefault = false; - - /** - * 状态:0-禁用 1-启用 - */ - @Column(name = "status",columnDefinition = "VARCHAR(15)",length = 15) - @Enumerated(EnumType.STRING) - @Comment("状态:0禁用 1启用") - private CommonStatus status = CommonStatus.ENABLED; - - - - // ========== 业务方法 ========== - - /** - * 脱敏账号,例如:6222****1234 - */ - public String maskAccountNo() { - if (accountNo == null || accountNo.length() <= 8) { - return accountNo; - } - return accountNo.substring(0, 4) - + "****" - + accountNo.substring(accountNo.length() - 4); - } - - /** - * 是否启用 - */ - public boolean isActive() { - return this.status == CommonStatus.ENABLED; - } - - public String getStatusText() { - CommonStatus e = this.status; - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/BusinessLicense.java b/src/main/java/com/xjhs/findmemerchant/entity/BusinessLicense.java deleted file mode 100644 index 03b579e..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/BusinessLicense.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.xjhs.findmemerchant.entity; - - -import com.xjhs.findmemerchant.common.jpa.json.HashMapJsonConverter; -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.BusinessLicenseStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.util.HashMap; - -/** - * 营业执照资质 - * 对应表:business_licenses - */ -@Getter -@Setter -@Entity -@Table( - name = "business_licenses", - indexes = { - @Index(name = "idx_business_licenses_merchant_id", columnList = "merchant_id") - } -) -public class BusinessLicense extends AbstractBaseEntity { - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - @Column(name = "image_url", length = 500) - @Comment("营业执照图片URL") - private String imageUrl; - - @Column(name = "company_name", length = 200) - @Comment("公司名称(OCR识别)") - private String companyName; - - @Column(name = "license_no", length = 50) - @Comment("营业执照号(OCR识别)") - private String licenseNo; - - @Convert(converter = HashMapJsonConverter.class) - @Column(name = "ocr_raw", columnDefinition = "json") - @Comment("OCR原始结果") - private HashMap ocrRaw; - - @Column(name = "status",length = 15,columnDefinition = "VARCHAR(15)") - @Enumerated(EnumType.STRING) - @Comment("状态:0待审核 1已通过 2已拒绝") - private BusinessLicenseStatus status = BusinessLicenseStatus.PENDING; - - - // ===== 业务方法 ===== - - public boolean isApproved() { - return this.status == BusinessLicenseStatus.APPROVED; - } - - - public String getStatusText() { - var e = this.status; - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/BusinessPeriod.java b/src/main/java/com/xjhs/findmemerchant/entity/BusinessPeriod.java deleted file mode 100644 index 489b74f..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/BusinessPeriod.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -/** - * 门店营业时间段 - * 对应表:business_periods - */ -@Getter -@Setter -@Entity -@Table( - name = "business_periods", - indexes = { - @Index(name = "idx_business_periods_store_id", columnList = "store_id") - } -) -public class BusinessPeriod extends AbstractBaseEntity { - - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id", insertable = false, updatable = false) - @Comment("门店Id") - private Store store; - - /** - * 周几:0=周日 ... 6=周六 - */ - @Column(name = "day_of_week") - @Comment("周几:0周日 1周一 ... 6周六") - private Integer dayOfWeek; - - /** - * 开始时间,HH:MM - */ - @Column(name = "start_time", length = 5) - @Comment("开始时间,HH:MM") - private String startTime; - - /** - * 结束时间,HH:MM - */ - @Column(name = "end_time", length = 5) - @Comment("结束时间,HH:MM") - private String endTime; - - /** - * 是否启用 - */ - @Column(name = "is_enabled") - @Comment("是否启用") - private Boolean isEnabled = Boolean.TRUE; - - - // ========== 业务方法 ========== - - /** - * 中文周几,比如:周一 - */ - public String getDayName() { - if (dayOfWeek == null) { - return "未知"; - } - return switch (dayOfWeek) { - case 0 -> "周日"; - case 1 -> "周一"; - case 2 -> "周二"; - case 3 -> "周三"; - case 4 -> "周四"; - case 5 -> "周五"; - case 6 -> "周六"; - default -> "未知"; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Coupon.java b/src/main/java/com/xjhs/findmemerchant/entity/Coupon.java deleted file mode 100644 index 5f8b1d7..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Coupon.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.CouponStatus; -import com.xjhs.findmemerchant.types.CouponType; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 优惠券模板实体 - * 对应表:coupons - */ -@Getter -@Setter -@Entity -@Table( - name = "coupons", - indexes = { - @Index(name = "idx_coupons_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_coupons_status", columnList = "status"), - @Index(name = "idx_coupons_gift_product_id", columnList = "gift_product_id") - } -) -public class Coupon extends AbstractBaseEntity { - - /** - * 优惠券名称 - */ - @Column(name = "name", length = 100) - @Comment("优惠券名称") - private String name; - - /** - * 优惠券类型:1-折扣券 2-满减券 3-现金券 4-赠品券 - */ - @Column(name = "type",length = 15,columnDefinition = "VARCHAR(15)") - @Comment("优惠券类型:1折扣券 2满减券 3现金券 4赠品券") - private CouponType type; - - /** - * 折扣率 0.01-0.99,decimal(3,2) - */ - @Column(name = "discount_rate", precision = 3, scale = 2) - @Comment("折扣率 0.01-0.99") - private BigDecimal discountRate; - - /** - * 满减门槛,decimal(10,2) - */ - @Column(name = "min_amount", precision = 10, scale = 2) - @Comment("满减门槛") - private BigDecimal minAmount; - - /** - * 减免金额,decimal(10,2) - */ - @Column(name = "reduce_amount", precision = 10, scale = 2) - @Comment("减免金额") - private BigDecimal reduceAmount; - - /** - * 赠品商品ID - */ - @Column(name = "gift_product_id") - @Comment("赠品商品ID") - private Long giftProductId; - - /** - * 赠品数量,默认 1 - */ - @Column(name = "gift_quantity") - @Comment("赠品数量") - private Integer giftQuantity = 1; - - /** - * 发放总量 - */ - @Column(name = "total_count") - @Comment("发放总量") - private Integer totalCount; - - /** - * 已领取数量 - */ - @Column(name = "claimed_count") - @Comment("已领取数量") - private Integer claimedCount = 0; - - /** - * 每人限领数量,0 表示不限 - */ - @Column(name = "per_user_limit") - @Comment("每人限领数量,0表示不限") - private Integer perUserLimit = 1; - - /** - * 领取后有效天数 - */ - @Column(name = "valid_days") - @Comment("领取后有效天数") - private Integer validDays; - - /** - * 活动开始时间 - */ - @Column(name = "start_time") - @Comment("活动开始时间") - private LocalDateTime startTime; - - /** - * 活动结束时间 - */ - @Column(name = "end_time") - @Comment("活动结束时间") - private LocalDateTime endTime; - - /** - * 使用规则 - */ - @Column(name = "rules", columnDefinition = "text") - @Comment("使用规则") - private String rules; - - /** - * 状态:0-下架 1-进行中 2-已结束 - */ - @Column(name = "status",columnDefinition = "VARCHAR(15)",length = 15) - @Comment("状态:0下架 1进行中 2已结束") - private CouponStatus status = CouponStatus.ONLINE; - - - // ================= 关联关系 ================= - - /** - * 所属商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - /** - * 可用门店关联 - */ - @OneToMany(mappedBy = "coupon", fetch = FetchType.LAZY) - private List stores; - - /** - * 所有券码 - */ - @OneToMany(mappedBy = "coupon", fetch = FetchType.LAZY) - private List codes; - - /** - * 赠品商品 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "gift_product_id", insertable = false, updatable = false) - private Product giftProduct; - - // ================= 业务方法 ================= - - /** - * 是否当前有效(进行中 + 时间范围内) - */ - public boolean isActive() { - LocalDateTime now = LocalDateTime.now(); - return this.status == CouponStatus.ONLINE - && now.isAfter(startTime) - && now.isBefore(endTime); - } - - /** - * 是否还有库存可领取 - */ - public boolean hasStock() { - return claimedCount != null && totalCount != null && claimedCount < totalCount; - } - - /** - * 剩余可领取数量 - */ - public int remainingCount() { - if (totalCount == null || claimedCount == null) { - return 0; - } - return totalCount - claimedCount; - } - - /** - * 优惠券类型文案 - */ - public String getTypeText() { - CouponType typeEnum = this.type; - return typeEnum != null ? typeEnum.getDesc() : "未知"; - } - - /** - * 是否为赠品券 - */ - public boolean isGiftCoupon() { - return this.type == CouponType.GIFT; - } - - -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/CouponCode.java b/src/main/java/com/xjhs/findmemerchant/entity/CouponCode.java deleted file mode 100644 index fe78cc2..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/CouponCode.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.CouponCodeStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.time.LocalDateTime; - -/** - * 优惠券码实例 - * 对应表:coupon_codes - */ -@Getter -@Setter -@Entity -@Table( - name = "coupon_codes", - indexes = { - @Index(name = "idx_coupon_codes_coupon_id", columnList = "coupon_id"), - @Index(name = "idx_coupon_codes_member_id", columnList = "member_id"), - @Index(name = "idx_coupon_codes_status", columnList = "status") - }, - uniqueConstraints = { - @UniqueConstraint(name = "uk_coupon_codes_code", columnNames = "code") - } -) -public class CouponCode extends AbstractBaseEntity { - - - /** - * 券码 - */ - @Column(name = "code", length = 32) - @Comment("优惠券码") - private String code; - - /** - * 状态:0-未领取 1-已领取 2-已核销 3-已过期 - */ - @Column(name = "status",columnDefinition = "VARCHAR(20)",length = 20) - @Comment("状态:0未领取 1已领取 2已核销 3已过期") - private CouponCodeStatus status = CouponCodeStatus.UNCLAIMED; - - /** - * 领取时间 - */ - @Column(name = "claimed_at") - @Comment("领取时间") - private LocalDateTime claimedAt; - - /** - * 有效期至 - */ - @Column(name = "valid_until") - @Comment("有效期至") - private LocalDateTime validUntil; - - /** - * 核销时间 - */ - @Column(name = "verified_at") - @Comment("核销时间") - private LocalDateTime verifiedAt; - - /** - * 核销人ID(员工) - */ - @Column(name = "verified_by") - @Comment("核销人ID(员工)") - private Long verifiedBy; - - /** - * 核销门店ID - */ - @Column(name = "verify_store_id") - @Comment("核销门店ID") - private Long verifyStoreId; - - - // =============== 关联关系 =============== - - /** - * 所属优惠券模板 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "coupon_id", insertable = false, updatable = false) - private Coupon coupon; - - /** - * 会员 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", insertable = false, updatable = false) - private Member member; - - /** - * 核销员工 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "verified_by", insertable = false, updatable = false) - private Employee verifier; - - /** - * 核销门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "verify_store_id", insertable = false, updatable = false) - private Store verifyStore; - - // =============== 业务方法 =============== - - /** - * 是否已领取 - */ - public boolean isClaimed() { - return this.status != null && - this.status.ordinal() >= CouponCodeStatus.CLAIMED.ordinal(); - } - - /** - * 是否已核销 - */ - public boolean isVerified() { - return this.status == CouponCodeStatus.VERIFIED; - } - - /** - * 是否已过期 - */ - public boolean isExpired() { - CouponCodeStatus statusEnum = this.status; - if (statusEnum == CouponCodeStatus.EXPIRED) { - return true; - } - if (validUntil != null && LocalDateTime.now().isAfter(validUntil)) { - return true; - } - return false; - } - - /** - * 是否可核销 - */ - public boolean canVerify() { - return this.status == CouponCodeStatus.CLAIMED && !isExpired(); - } - - /** - * 状态文案 - */ - public String getStatusText() { - CouponCodeStatus statusEnum = this.status; - return statusEnum != null ? statusEnum.getDesc() : "未知"; - } - - /** - * 脱敏券码,例如:ABC***XYZ - */ - public String maskCode() { - if (code == null) { - return null; - } - if (code.length() <= 6) { - return code; - } - return code.substring(0, 3) + "***" + code.substring(code.length() - 3); - } - -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/CouponStore.java b/src/main/java/com/xjhs/findmemerchant/entity/CouponStore.java deleted file mode 100644 index 2031490..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/CouponStore.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -/** - * 优惠券与门店的关联关系 - * 对应表:coupon_stores - */ -@Getter -@Setter -@Entity -@Table( - name = "coupon_stores", - uniqueConstraints = { - @UniqueConstraint( - name = "idx_coupon_store", - columnNames = {"coupon_id", "store_id"} - ) - } -) -public class CouponStore extends AbstractBaseEntity { - - - /** - * 优惠券 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "coupon_id", insertable = false, updatable = false) - private Coupon coupon; - - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id", insertable = false, updatable = false) - private Store store; -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Employee.java b/src/main/java/com/xjhs/findmemerchant/entity/Employee.java deleted file mode 100644 index 9350ab8..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Employee.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.CommonStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -/** - * 员工实体 - * 对应表:employees - */ -@Getter -@Setter -@Entity -@Table( - name = "employees", - indexes = { - @Index(name = "idx_employees_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_employees_store_id", columnList = "store_id"), - @Index(name = "idx_employees_role_id", columnList = "role_id"), - @Index(name = "idx_employees_phone", columnList = "phone") - } -) -public class Employee extends AbstractBaseEntity { - - - /** - * 手机号 - */ - @Column(name = "phone", length = 11) - @Comment("手机号") - private String phone; - - /** - * 员工姓名 - */ - @Column(name = "name", length = 50) - @Comment("员工姓名") - private String name; - - /** - * 状态:0-禁用 1-启用 - */ - @Column(name = "status",columnDefinition = "VARCHAR(15)",length = 15) - @Comment("状态") - private CommonStatus status = CommonStatus.ENABLED; - - - - // ===== 关联关系 ===== - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id", insertable = false, updatable = false) - private Store store; - - /** - * 角色 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "role_id", insertable = false, updatable = false) - private Role role; - - // ===== 业务方法 ===== - - /** - * 是否为启用状态 - */ - public boolean isActive() { - return this.status == CommonStatus.ENABLED; - } - - - - /** - * 状态文案 - */ - public String getStatusText() { - CommonStatus e = this.status; - return e != null ? e.getDesc() : "未知"; - } - - /** - * 返回脱敏手机号,例如:138****1234 - */ - public String maskPhone() { - if (phone == null || phone.length() != 11) { - return phone; - } - return phone.substring(0, 3) + "****" + phone.substring(7); - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/HealthCertificate.java b/src/main/java/com/xjhs/findmemerchant/entity/HealthCertificate.java deleted file mode 100644 index b0111a9..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/HealthCertificate.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.json.HashMapJsonConverter; -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.HealthCertificateStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.time.LocalDateTime; -import java.util.HashMap; - -/** - * 健康证资质 - * 对应表:health_certificates - */ -@Getter -@Setter -@Entity -@Table( - name = "health_certificates", - indexes = { - @Index(name = "idx_health_certificates_store_id", columnList = "store_id"), - @Index(name = "idx_health_certificates_employee_id", columnList = "employee_id") - } -) -public class HealthCertificate extends AbstractBaseEntity { - - @Column(name = "image_url", length = 500) - @Comment("健康证图片URL") - private String imageUrl; - - @Column(name = "holder_name", length = 50) - @Comment("持证人姓名(OCR识别)") - private String holderName; - - @Column(name = "valid_until") - @Comment("证件有效期至(OCR识别)") - private LocalDateTime validUntil; - - @Column(name = "issuer", length = 100) - @Comment("签发机构(OCR识别)") - private String issuer; - - @Convert(converter = HashMapJsonConverter.class) - @Column(name = "ocr_raw", columnDefinition = "json") - @Comment("OCR原始结果") - private HashMap ocrRaw; - - @Column(name = "status",columnDefinition = "VARCHAR(20)",length = 20) - @Comment("状态:0待审核 1有效 2过期") - private HealthCertificateStatus status = HealthCertificateStatus.PENDING; - - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id", insertable = false, updatable = false) - private Store store; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "employee_id", insertable = false, updatable = false) - private Employee employee; - - // ===== 业务方法 ===== - - public boolean isValid() { - if (getStatusEnum() != HealthCertificateStatus.VALID) { - return false; - } - if (validUntil != null && LocalDateTime.now().isAfter(validUntil)) { - return false; - } - return true; - } - - public boolean isExpired() { - if (validUntil == null) return false; - return LocalDateTime.now().isAfter(validUntil); - } - - public HealthCertificateStatus getStatusEnum() { - return this.status; - } - - - public String getStatusText() { - var e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Member.java b/src/main/java/com/xjhs/findmemerchant/entity/Member.java deleted file mode 100644 index 994abee..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Member.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 会员实体(C 端用户) - * 对应表:members - */ -@Getter -@Setter -@Entity -@Table( - name = "members", - indexes = { - @Index(name = "idx_members_phone", columnList = "phone") - }, - uniqueConstraints = { - @UniqueConstraint( - name = "idx_merchant_phone", - columnNames = {"merchant_id", "phone"} - ) - } -) -public class Member extends AbstractBaseEntity { - - /** - * 手机号 - */ - @Column(name = "phone", length = 11) - @Comment("手机号") - private String phone; - - /** - * 昵称 - */ - @Column(name = "nickname", length = 50) - @Comment("昵称") - private String nickname; - - /** - * 头像地址 - */ - @Column(name = "avatar", length = 500) - @Comment("头像URL") - private String avatar; - - /** - * 累计订单数 - */ - @Column(name = "total_orders") - @Comment("累计订单数") - private Integer totalOrders = 0; - - /** - * 累计消费金额 - */ - @Column(name = "total_amount", precision = 12, scale = 2) - @Comment("累计消费金额") - private BigDecimal totalAmount = BigDecimal.ZERO; - - /** - * 最后一次下单时间 - */ - @Column(name = "last_order_at") - @Comment("最后下单时间") - private LocalDateTime lastOrderAt; - - // ============ 关联关系 ============ - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - /** - * 拥有的券码 - */ - @OneToMany(mappedBy = "member", fetch = FetchType.LAZY) - private List couponCodes; - - /** - * 订单列表 - */ - @OneToMany(mappedBy = "member", fetch = FetchType.LAZY) - private List orders; - - // ============ 业务方法 ============ - - /** - * 返回脱敏手机号,例如:138****1234 - */ - public String maskPhone() { - if (phone == null || phone.length() != 11) { - return phone; - } - return phone.substring(0, 3) + "****" + phone.substring(7); - } - - /** - * 展示用名称:优先昵称,否则使用脱敏手机号 - */ - public String getDisplayName() { - if (nickname != null && !nickname.isBlank()) { - return nickname; - } - return maskPhone(); - } - - /** - * 返回头像URL,若为空则返回默认头像 - */ - public String getAvatarOrDefault() { - if (avatar != null && !avatar.isBlank()) { - return avatar; - } - return "/static/default-avatar.png"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Merchant.java b/src/main/java/com/xjhs/findmemerchant/entity/Merchant.java index 15a4bc2..e10539a 100644 --- a/src/main/java/com/xjhs/findmemerchant/entity/Merchant.java +++ b/src/main/java/com/xjhs/findmemerchant/entity/Merchant.java @@ -1,147 +1,27 @@ package com.xjhs.findmemerchant.entity; - import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.AuthStatus; -import com.xjhs.findmemerchant.types.CommonStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; +import com.xjhs.findmemerchant.system.entity.SystemUser; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.hibernate.annotations.Comment; -import java.util.List; - -/** - * 商家实体 - * 对应表:merchants - */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data @Entity -@Table( - name = "merchants", - indexes = { - @Index(name = "idx_merchants_auth_status", columnList = "auth_status"), - @Index(name = "idx_merchants_status", columnList = "status") - }, - uniqueConstraints = { - @UniqueConstraint(name = "uk_merchant_phone", columnNames = "phone") - } -) +@Table +@Comment("商户信息表") public class Merchant extends AbstractBaseEntity { - - /** - * 登录手机号 + * 用户信息 */ - @Column(name = "phone", length = 11) - @Comment("手机号") - private String phone; + @OneToOne + @JoinColumn(name = "user_id") + @Comment("关联的用户信息") + private SystemUser systemUser; - /** - * 登录密码Hash - */ - @Column(name = "password_hash", length = 255) - @Comment("密码Hash") - private String passwordHash; - - /** - * 真实姓名 - */ - @Column(name = "real_name", length = 50) - @Comment("真实姓名") - private String realName; - - /** - * 身份证号(明文)——不入库 - */ - @Transient - private String idCardNo; - - /** - * 身份证加密存储 - */ - @Column(name = "id_card_encrypted", length = 255) - @Comment("身份证加密存储") - private String idCardEncrypted; - - /** - * 认证状态 - */ - @Column(name = "auth_status",length = 20,columnDefinition = "VARCHAR(20)") - @Comment("认证状态") - @Enumerated(EnumType.STRING) - private AuthStatus authStatus = AuthStatus.NOT_VERIFIED; - - /** - * 账户状态 - */ - @Column(name = "status",length = 20,columnDefinition = "VARCHAR(20)") - @Comment("账户状态") - @Enumerated(EnumType.STRING) - private CommonStatus status = CommonStatus.ENABLED; - - // ========== 关联关系 ========== - - /** - * 门店列表 - */ - @OneToMany(mappedBy = "merchant", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) - private List stores; - - /** - * 添加一个门店 - * @param store 门店信息 - */ - public void addStore(Store store) { - store.setMerchant(this); - this.stores.add(store); - } - - - /** - * 营业执照 - */ - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "id", referencedColumnName = "merchant_id", insertable = false, updatable = false) - private BusinessLicense businessLicense; - - // ========== 业务方法 ========== - - /** - * 是否已完成实名认证 - */ - public boolean isAuthenticated() { - return getAuthStatusEnum() == AuthStatus.VERIFIED; - } - - public AuthStatus getAuthStatusEnum() { - return this.authStatus; - } - /** - * 是否启用 - */ - public boolean isActive() { - return getStatusEnum() == CommonStatus.ENABLED; - } - - public CommonStatus getStatusEnum() { - return this.status; - } - - /** - * 手机脱敏 - */ - public String maskPhone() { - if (phone == null || phone.length() != 11) return phone; - return phone.substring(0, 3) + "****" + phone.substring(7); - } - - /** - * 身份证脱敏 - */ - public String maskIdCard() { - if (idCardNo == null || idCardNo.length() != 18) return idCardNo; - return idCardNo.substring(0, 3) + "***********" + idCardNo.substring(14); - } } diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Message.java b/src/main/java/com/xjhs/findmemerchant/entity/Message.java deleted file mode 100644 index baf6965..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Message.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.MessageType; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.time.LocalDateTime; - -/** - * 消息实体 - * 对应表:messages - */ -@Getter -@Setter -@Entity -@Table( - name = "messages", - indexes = { - @Index(name = "idx_messages_merchant", columnList = "merchant_id"), - @Index(name = "idx_messages_type_read", columnList = "merchant_id,type,is_read") - } -) -public class Message extends AbstractBaseEntity { - - /** - * 消息类型:1-系统通知 2-活动提醒 3-私信 - */ - @Column(name = "type",columnDefinition = "VARCHAR(20)",length = 20) - @Enumerated(EnumType.STRING) - @Comment("消息类型:1系统通知 2活动提醒 3私信") - private MessageType type; - - /** - * 标题 - */ - @Column(name = "title", length = 200) - @Comment("消息标题") - private String title; - - /** - * 内容 - */ - @Column(name = "content", columnDefinition = "text") - @Comment("消息内容") - private String content; - - /** - * 是否已读:0-未读 1-已读 - */ - @Column(name = "is_read") - @Comment("是否已读:0未读 1已读") - private Boolean isRead = false; - - /** - * 创建时间 - */ - @Column(name = "created_at") - @Comment("创建时间") - private LocalDateTime createdAt; - - /** - * 阅读时间 - */ - @Column(name = "read_at") - @Comment("阅读时间") - private LocalDateTime readAt; - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - // ========== 业务方法 ========== - - /** - * 标记为已读 - */ - public void markAsRead() { - this.isRead = true; - this.readAt = LocalDateTime.now(); - } - - /** - * 是否未读 - */ - public boolean isUnread() { - return this.isRead != null && !this.isRead; - } - - /** - * 消息类型文案 - */ - public String getTypeText() { - MessageType t = getTypeEnum(); - return t != null ? t.getDesc() : "未知"; - } - - /** - * 内容摘要,最多100字符 - */ - public String getSummary() { - if (content == null) { - return ""; - } - if (content.length() <= 100) { - return content; - } - return content.substring(0, 100) + "..."; - } - - // ========== 枚举转换辅助 ========== - - public MessageType getTypeEnum() { - return this.type; - } - -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Order.java b/src/main/java/com/xjhs/findmemerchant/entity/Order.java deleted file mode 100644 index f690469..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Order.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.OrderStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 订单实体 - * 对应表:orders - */ -@Getter -@Setter -@Entity -@Table( - name = "orders", - indexes = { - @Index(name = "idx_orders_store_id", columnList = "store_id"), - @Index(name = "idx_orders_member_id", columnList = "member_id"), - @Index(name = "idx_orders_status", columnList = "status") - }, - uniqueConstraints = { - @UniqueConstraint(name = "uk_orders_order_no", columnNames = "order_no") - } -) -public class Order extends AbstractBaseEntity { - /** - * 订单号 - */ - @Column(name = "order_no", length = 32) - @Comment("订单号") - private String orderNo; - - - /** - * 订单总金额 - */ - @Column(name = "total_amount", precision = 10, scale = 2) - @Comment("订单总金额") - private BigDecimal totalAmount; - - /** - * 优惠金额 - */ - @Column(name = "discount_amount", precision = 10, scale = 2) - @Comment("优惠金额") - private BigDecimal discountAmount = BigDecimal.ZERO; - - /** - * 实付金额 - */ - @Column(name = "pay_amount", precision = 10, scale = 2) - @Comment("实付金额") - private BigDecimal payAmount; - - /** - * 使用的券码ID(可为空) - */ - @Column(name = "coupon_code_id") - @Comment("优惠券码ID") - private Long couponCodeId; - - /** - * 订单状态:1-待支付 2-已支付 3-已完成 4-已退款 5-已取消 - */ - @Column(name = "status") - @Comment("订单状态:1待支付 2已支付 3已完成 4已退款 5已取消") - private OrderStatus status; - - /** - * 支付时间 - */ - @Column(name = "paid_at") - @Comment("支付时间") - private LocalDateTime paidAt; - - - // ========== 关联关系 ========== - - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id", insertable = false, updatable = false) - private Store store; - - /** - * 会员 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", insertable = false, updatable = false) - private Member member; - - /** - * 优惠券码 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "coupon_code_id", insertable = false, updatable = false) - private CouponCode couponCode; - - /** - * 订单明细 - */ - @OneToMany(mappedBy = "order", fetch = FetchType.LAZY) - private List items; - - // ========== 业务方法 ========== - - /** - * 是否已支付(状态>=已支付且非已取消) - */ - public boolean isPaid() { - OrderStatus s = getStatusEnum(); - if (s == null) return false; - return s.getCodeValue() >= OrderStatus.PAID.getCodeValue() - && s != OrderStatus.CANCELLED; - } - - /** - * 是否已完成 - */ - public boolean isCompleted() { - return getStatusEnum() == OrderStatus.COMPLETED; - } - - /** - * 是否可退款(已支付或已完成) - */ - public boolean canRefund() { - OrderStatus s = getStatusEnum(); - return s == OrderStatus.PAID || s == OrderStatus.COMPLETED; - } - - /** - * 是否可取消(待支付) - */ - public boolean canCancel() { - return getStatusEnum() == OrderStatus.PENDING; - } - - /** - * 状态文案 - */ - public String getStatusText() { - OrderStatus s = getStatusEnum(); - return s != null ? s.getDesc() : "未知"; - } - - /** - * 是否有优惠 - */ - public boolean hasDiscount() { - return discountAmount != null && discountAmount.compareTo(BigDecimal.ZERO) > 0; - } - - // ========== 枚举转换辅助 ========== - - public OrderStatus getStatusEnum() { - return this.status; - } - -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/OrderItem.java b/src/main/java/com/xjhs/findmemerchant/entity/OrderItem.java deleted file mode 100644 index 640d5f2..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/OrderItem.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.id.SnowflakeGenerated; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 订单明细 - * 对应表:order_items - */ -@Getter -@Setter -@Entity -@Table( - name = "order_items", - indexes = { - @Index(name = "idx_order_items_order_id", columnList = "order_id"), - @Index(name = "idx_order_items_product_id", columnList = "product_id"), - @Index(name = "idx_order_items_sku_id", columnList = "sku_id") - } -) -public class OrderItem { - - /** - * 主键(雪花ID) - */ - @Id - @GeneratedValue - @SnowflakeGenerated - @Comment("主键ID") - private Long id; - - - - /** - * 商品ID(可能被删除所以可空) - */ - @Column(name = "product_id") - @Comment("商品ID(可空)") - private Long productId; - - /** - * 商品名称(快照) - */ - @Column(name = "product_name", length = 100) - @Comment("商品名称(快照)") - private String productName; - - /** - * SKU ID(可能被删除所以可空) - */ - @Column(name = "sku_id") - @Comment("SKU ID(可空)") - private Long skuId; - - /** - * SKU 名称(快照) - */ - @Column(name = "sku_name", length = 100) - @Comment("SKU名称(快照)") - private String skuName; - - /** - * 商品图片(快照) - */ - @Column(name = "image", length = 255) - @Comment("商品图片(快照)") - private String image; - - /** - * 商品单价 - */ - @Column(name = "unit_price", precision = 10, scale = 2) - @Comment("商品单价") - private BigDecimal unitPrice; - - /** - * 购买数量 - */ - @Column(name = "quantity") - @Comment("购买数量") - private Integer quantity = 1; - - /** - * 小计金额 - */ - @Column(name = "total_price", precision = 10, scale = 2) - @Comment("小计金额") - private BigDecimal totalPrice; - - /** - * 创建时间 - */ - @Column(name = "created_at") - @Comment("创建时间") - private LocalDateTime createdAt; - - // ========== 关联关系 ========== - - /** - * 所属订单 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "order_id") - private Order order; - - // ========== 业务方法 ========== - - /** - * 根据单价 * 数量计算小计 - */ - public BigDecimal getSubtotal() { - if (unitPrice == null || quantity == null) { - return BigDecimal.ZERO; - } - return unitPrice.multiply(BigDecimal.valueOf(quantity)); - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Product.java b/src/main/java/com/xjhs/findmemerchant/entity/Product.java deleted file mode 100644 index ca1cd2b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Product.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.ProductStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.List; - -/** - * 商品实体 - * 对应表:products - */ -@Getter -@Setter -@Entity -@Table( - name = "products", - indexes = { - @Index(name = "idx_products_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_products_store_id", columnList = "store_id"), - @Index(name = "idx_products_category_id", columnList = "category_id"), - @Index(name = "idx_products_status", columnList = "status") - } -) -public class Product extends AbstractBaseEntity { - - /** - * 商品名称 - */ - @Column(name = "name", length = 100) - @Comment("商品名称") - private String name; - - /** - * 商品描述 - */ - @Column(name = "description", columnDefinition = "text") - @Comment("商品描述") - private String description; - - /** - * 商品图片列表(JSON数组字符串) - */ - @Column(name = "images", columnDefinition = "text") - @Comment("商品图片(JSON数组)") - private String images; - - /** - * 原价 - */ - @Column(name = "original_price", precision = 10, scale = 2) - @Comment("原价") - private BigDecimal originalPrice; - - /** - * 售价 - */ - @Column(name = "sale_price", precision = 10, scale = 2) - @Comment("售价") - private BigDecimal salePrice; - - /** - * 库存,-1 表示无限库存 - */ - @Column(name = "stock") - @Comment("库存,-1表示无限库存") - private Integer stock = -1; - - /** - * 已售数量 - */ - @Column(name = "sold_count") - @Comment("已售数量") - private Integer soldCount = 0; - - /** - * 排序值 - */ - @Column(name = "sort_order") - @Comment("排序值") - private Integer sortOrder = 0; - - /** - * 商品状态:0-下架 1-上架 - */ - @Column(name = "status",columnDefinition = "VARCHAR(20)",length = 20) - @Enumerated(EnumType.STRING) - @Comment("商品状态:0下架 1上架") - private ProductStatus status = ProductStatus.OFF_SALE; - - // ========== 关联关系 ========== - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id", insertable = false, updatable = false) - private Store store; - - /** - * 商品分类 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "category_id", insertable = false, updatable = false) - private ProductCategory category; - - /** - * SKU 列表 - */ - @OneToMany(mappedBy = "product", fetch = FetchType.LAZY) - private List skus; - - // ========== 业务方法 ========== - - /** - * 是否上架中 - */ - public boolean isOnSale() { - return getStatusEnum() == ProductStatus.ON_SALE; - } - - /** - * 是否有库存 - */ - public boolean hasStock() { - if (stock == null) return false; - return stock == -1 || stock > 0; - } - - /** - * 是否有折扣(售价 < 原价) - */ - public boolean hasDiscount() { - if (salePrice == null || originalPrice == null) return false; - return salePrice.compareTo(originalPrice) < 0; - } - - /** - * 折扣率 (0-100),整数部分 - */ - public int getDiscountRate() { - if (originalPrice == null || originalPrice.compareTo(BigDecimal.ZERO) == 0 - || salePrice == null) { - return 0; - } - BigDecimal rate = salePrice - .divide(originalPrice, 2, RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)); - return rate.intValue(); - } - - /** - * 状态文案 - */ - public String getStatusText() { - ProductStatus s = getStatusEnum(); - return s != null ? s.getDesc() : "未知"; - } - - /** - * 是否可扣减库存 - */ - public boolean canDeductStock(int quantity) { - if (stock == null || quantity <= 0) { - return false; - } - if (stock == -1) { - return true; // 无限库存 - } - return stock >= quantity; - } - - // ========== 枚举转换辅助 ========== - - public ProductStatus getStatusEnum() { - return this.status; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/ProductCategory.java b/src/main/java/com/xjhs/findmemerchant/entity/ProductCategory.java deleted file mode 100644 index c0aca82..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/ProductCategory.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.CommonStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.util.List; - -/** - * 商品分类实体 - * 对应表:product_categories - */ -@Getter -@Setter -@Entity -@Table( - name = "product_categories", - indexes = { - @Index(name = "idx_product_categories_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_product_categories_parent_id", columnList = "parent_id"), - @Index(name = "idx_product_categories_status", columnList = "status") - } -) -public class ProductCategory extends AbstractBaseEntity { - - /** - * 分类名称 - */ - @Column(name = "name", length = 50) - @Comment("分类名称") - private String name; - - /** - * 父分类ID,支持二级分类 - */ - @Column(name = "parent_id") - @Comment("父分类ID,支持二级分类") - private Long parentId; - - /** - * 排序值 - */ - @Column(name = "sort_order") - @Comment("排序值") - private Integer sortOrder = 0; - - /** - * 状态:0-禁用 1-启用 - */ - @Column(name = "status") - @Comment("状态:0禁用 1启用") - private CommonStatus status = CommonStatus.ENABLED; - - // ========== 关联关系 ========== - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - /** - * 父分类 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "parent_id", insertable = false, updatable = false) - private ProductCategory parent; - - /** - * 子分类列表 - */ - @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) - private List children; - - /** - * 分类下商品 - */ - @OneToMany(mappedBy = "category", fetch = FetchType.LAZY) - private List products; - - // ========== 业务方法 ========== - - /** - * 是否启用 - */ - public boolean isEnabled() { - return getStatusEnum() == CommonStatus.ENABLED; - } - - /** - * 是否为一级分类(无父分类) - */ - public boolean isTopLevel() { - return parentId == null; - } - - public CommonStatus getStatusEnum() { - return this.status; - } - - public String getStatusText() { - CommonStatus e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/ProductSKU.java b/src/main/java/com/xjhs/findmemerchant/entity/ProductSKU.java deleted file mode 100644 index aa78e36..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/ProductSKU.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.id.SnowflakeGenerated; -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.CommonStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; - -/** - * 商品SKU(规格)实体 - * 对应表:product_skus - */ -@Getter -@Setter -@Entity -@Table( - name = "product_skus", - indexes = { - @Index(name = "idx_product_skus_product_id", columnList = "product_id"), - @Index(name = "idx_product_skus_sku_code", columnList = "sku_code") - } -) -public class ProductSKU extends AbstractBaseEntity { - - /** - * 主键(雪花ID) - */ - @Id - @GeneratedValue - @SnowflakeGenerated - @Comment("主键ID") - private Long id; - - /** - * 规格名称(如:大杯/加冰) - */ - @Column(name = "sku_name", length = 100) - @Comment("规格名称") - private String skuName; - - /** - * SKU 编码 - */ - @Column(name = "sku_code", length = 50) - @Comment("SKU编码") - private String skuCode; - - /** - * 售价 - */ - @Column(name = "price", precision = 10, scale = 2) - @Comment("规格价格") - private BigDecimal price; - - /** - * 库存,-1 表示无限库存 - */ - @Column(name = "stock") - @Comment("库存,-1表示无限库存") - private Integer stock = -1; - - /** - * 已售数量 - */ - @Column(name = "sold_count") - @Comment("已售数量") - private Integer soldCount = 0; - - /** - * 状态:0-禁用 1-启用 - */ - @Column(name = "status",columnDefinition = "VARCHAR(20)",length = 20) - @Comment("状态:0禁用 1启用") - private CommonStatus status = CommonStatus.ENABLED; - - - /** - * 所属商品 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "product_id", insertable = false, updatable = false) - private Product product; - - // ===== 业务方法 ===== - - /** - * 是否启用 - */ - public boolean isEnabled() { - return getStatusEnum() == CommonStatus.ENABLED; - } - - /** - * 是否有库存 - */ - public boolean hasStock() { - if (stock == null) return false; - return stock == -1 || stock > 0; - } - - /** - * 是否可扣减库存 - */ - public boolean canDeductStock(int quantity) { - if (stock == null || quantity <= 0) { - return false; - } - if (stock == -1) { - return true; - } - return stock >= quantity; - } - - public CommonStatus getStatusEnum() { - return this.status; - } - - public String getStatusText() { - CommonStatus e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Review.java b/src/main/java/com/xjhs/findmemerchant/entity/Review.java deleted file mode 100644 index 6928222..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Review.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.ReviewStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -/** - * 用户评价(C端共享) - * 对应表:reviews - */ -@Getter -@Setter -@Entity -@Table( - name = "reviews", - indexes = { - @Index(name = "idx_reviews_order_id", columnList = "order_id"), - @Index(name = "idx_reviews_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_reviews_store_id", columnList = "store_id"), - @Index(name = "idx_reviews_user_id", columnList = "user_id"), - @Index(name = "idx_reviews_created_at", columnList = "created_at") - } -) -public class Review extends AbstractBaseEntity { - - - - - /** - * C端用户ID - */ - @Column(name = "user_id") - @Comment("C端用户ID") - private Long userId; - - /** - * 用户昵称 - */ - @Column(name = "user_name", length = 50) - @Comment("用户昵称") - private String userName; - - /** - * 用户头像 - */ - @Column(name = "user_avatar", length = 255) - @Comment("用户头像URL") - private String userAvatar; - - /** - * 评分 1-5 - */ - @Column(name = "rating") - @Comment("评分 1-5") - private Integer rating; - - /** - * 评价内容 - */ - @Column(name = "content", columnDefinition = "text") - @Comment("评价内容") - private String content; - - /** - * 图片URL,逗号分隔 - */ - @Column(name = "images", length = 1000) - @Comment("评价图片URL,逗号分隔") - private String images; - - /** - * 是否匿名 - */ - @Column(name = "is_anonymous") - @Comment("是否匿名") - private Boolean isAnonymous = Boolean.FALSE; - - /** - * 状态:1-正常 0-隐藏 - */ - @Column(name = "status",columnDefinition = "VARCHAR(20)",length = 20) - @Comment("状态:1正常 0隐藏") - private ReviewStatus status = ReviewStatus.NORMAL; - - // ========== 关联关系 ========== - - /** - * 回复 - */ - @OneToOne(mappedBy = "review", fetch = FetchType.LAZY) - private ReviewReply reply; - - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id") - private Merchant merchant; - /** - * 门店 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "store_id") - private Store store; - - /** - * 订单 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "order_id") - private Order order; - - - - - // ========== 业务方法 ========== - - /** - * 评分文案 - */ - public String getRatingText() { - if (rating == null) { - return "未知"; - } - return switch (rating) { - case 5 -> "非常满意"; - case 4 -> "满意"; - case 3 -> "一般"; - case 2 -> "不满意"; - case 1 -> "非常不满意"; - default -> "未知"; - }; - } - - /** - * 是否好评(4-5星) - */ - public boolean isPositive() { - return rating != null && rating >= 4; - } - - /** - * 是否差评(1-2星) - */ - public boolean isNegative() { - return rating != null && rating <= 2; - } - - /** - * 展示用昵称(匿名/真实) - */ - public String getDisplayName() { - if (Boolean.TRUE.equals(isAnonymous)) { - return "匿名用户"; - } - return userName; - } - - public ReviewStatus getStatusEnum() { - return this.status; - } - - public String getStatusText() { - ReviewStatus e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/ReviewReply.java b/src/main/java/com/xjhs/findmemerchant/entity/ReviewReply.java deleted file mode 100644 index 3a3b223..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/ReviewReply.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.id.SnowflakeGenerated; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -/** - * 商家对评价的回复 - * 对应表:review_replies - */ -@Getter -@Setter -@Entity -@Table( - name = "review_replies", - uniqueConstraints = { - @UniqueConstraint(name = "uk_review_replies_review_id", columnNames = "review_id") - }, - indexes = { - @Index(name = "idx_review_replies_merchant_id", columnList = "merchant_id") - } -) -public class ReviewReply{ - - /** - * 主键(雪花ID) - */ - @Id - @GeneratedValue - @SnowflakeGenerated - @Comment("主键ID") - private Long id; - - /** - * 评价ID(唯一,一个评价一条回复) - */ - @Column(name = "review_id") - @Comment("评价ID") - private Long reviewId; - - /** - * 商家ID - */ - @Column(name = "merchant_id") - @Comment("商家ID") - private Long merchantId; - - /** - * 回复内容 - */ - @Column(name = "content", columnDefinition = "text") - @Comment("回复内容") - private String content; - - /** - * 回复人ID(商家或员工) - */ - @Column(name = "replier_id") - @Comment("回复人ID(商家或员工)") - private Long replierId; - - /** - * 回复人名称 - */ - @Column(name = "replier_name", length = 50) - @Comment("回复人名称") - private String replierName; - - /** - * 所属评价 - */ - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "review_id", insertable = false, updatable = false) - private Review review; -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Role.java b/src/main/java/com/xjhs/findmemerchant/entity/Role.java deleted file mode 100644 index e9f9004..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Role.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.json.StringListJsonConverter; -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.util.ArrayList; -import java.util.List; - -import static com.xjhs.findmemerchant.constants.RoleConstants.*; - - -/** - * 角色实体 - * 对应表:roles - */ -@Getter -@Setter -@Entity -@Table( - name = "roles", - uniqueConstraints = { - @UniqueConstraint(name = "uk_roles_code", columnNames = "code") - } -) -public class Role extends AbstractBaseEntity { - - - /** - * 角色名称 - */ - @Column(name = "name", length = 50) - @Comment("角色名称") - private String name; - - /** - * 角色编码(唯一) - */ - @Column(name = "code", length = 50) - @Comment("角色编码") - private String code; - - /** - * 描述 - */ - @Column(name = "description", length = 200) - @Comment("角色描述") - private String description; - - /** - * 权限列表(JSON数组) - */ - @Convert(converter = StringListJsonConverter.class) - @Column(name = "permissions", columnDefinition = "json") - @Comment("权限列表(JSON数组)") - private List permissions = new ArrayList<>(); - - /** - * 是否系统内置角色:1-是 0-否 - */ - @Column(name = "is_system") - @Comment("是否系统内置角色:1是 0否") - private Byte isSystem = 0; - - // ========== 业务方法 ========== - - /** - * 是否系统预置角色 - */ - public boolean isSystemRole() { - return Byte.valueOf((byte) 1).equals(isSystem); - } - - /** - * 是否拥有指定权限(支持 *) - */ - public boolean hasPermission(String permission) { - if (permission == null || permissions == null || permissions.isEmpty()) { - return false; - } - for (String p : permissions) { - if (PERMISSION_ALL.equals(p) || permission.equals(p)) { - return true; - } - } - return false; - } - - /** - * 返回权限列表,避免 null - */ - public List getPermissionsSafe() { - return permissions != null ? permissions : new ArrayList<>(); - } - - /** - * 系统内置默认角色(不带ID、时间,用于初始化) - */ - public static List getDefaultRoles() { - List roles = new ArrayList<>(); - - // 店长:全部权限 - Role owner = new Role(); - owner.setCode(ROLE_CODE_OWNER); - owner.setName("店长"); - owner.setPermissions(List.of(PERMISSION_ALL)); - owner.setIsSystem((byte) 1); - roles.add(owner); - - // 运营 - Role operator = new Role(); - operator.setCode(ROLE_CODE_OPERATOR); - operator.setName("运营"); - operator.setPermissions(List.of( - PERMISSION_STORE_VIEW, - PERMISSION_COUPON_MANAGE, - PERMISSION_COUPON_VIEW, - PERMISSION_COUPON_VERIFY, - PERMISSION_ORDER_VIEW, - PERMISSION_ACTIVITY_MANAGE, - PERMISSION_ACTIVITY_VIEW, - PERMISSION_ANALYTICS_VIEW, - PERMISSION_MEMBER_VIEW - )); - operator.setIsSystem((byte) 1); - roles.add(operator); - - // 客服 - Role service = new Role(); - service.setCode(ROLE_CODE_SERVICE); - service.setName("客服"); - service.setPermissions(List.of( - PERMISSION_STORE_VIEW, - PERMISSION_COUPON_VIEW, - PERMISSION_COUPON_VERIFY, - PERMISSION_ORDER_VIEW, - PERMISSION_MEMBER_VIEW, - PERMISSION_MESSAGE_VIEW - )); - service.setIsSystem((byte) 1); - roles.add(service); - - // 营销管理员 - Role marketing = new Role(); - marketing.setCode(ROLE_CODE_MARKETING); - marketing.setName("营销管理员"); - marketing.setPermissions(List.of( - PERMISSION_COUPON_MANAGE, - PERMISSION_COUPON_VIEW, - PERMISSION_ACTIVITY_MANAGE, - PERMISSION_ACTIVITY_VIEW, - PERMISSION_ANALYTICS_VIEW - )); - marketing.setIsSystem((byte) 1); - roles.add(marketing); - - return roles; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Settlement.java b/src/main/java/com/xjhs/findmemerchant/entity/Settlement.java deleted file mode 100644 index 9e0f89c..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Settlement.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.SettlementStatus; -import com.xjhs.findmemerchant.types.SettlementType; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -/** - * 结算记录(按日/按周) - * 对应表:settlements - */ -@Getter -@Setter -@Entity -@Table( - name = "settlements", - indexes = { - @Index(name = "idx_settlements_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_settlements_status", columnList = "status") - }, - uniqueConstraints = { - @UniqueConstraint(name = "uk_settlements_no", columnNames = "settlement_no") - } -) -public class Settlement extends AbstractBaseEntity { - - private static final DateTimeFormatter PERIOD_DATE_FORMATTER = - DateTimeFormatter.ofPattern("yyyy-MM-dd"); - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - - /** - * 结算单号 - */ - @Column(name = "settlement_no", length = 32) - @Comment("结算单号") - private String settlementNo; - - /** - * 结算类型:1-日结 2-周结 - */ - @Column(name = "type") - @Comment("结算类型:1日结 2周结") - private SettlementType type; - - /** - * 结算周期开始时间 - */ - @Column(name = "period_start") - @Comment("结算周期开始时间") - private LocalDateTime periodStart; - - /** - * 结算周期结束时间 - */ - @Column(name = "period_end") - @Comment("结算周期结束时间") - private LocalDateTime periodEnd; - - /** - * 订单数量 - */ - @Column(name = "order_count") - @Comment("订单数量") - private Integer orderCount = 0; - - /** - * 订单总额 - */ - @Column(name = "total_amount", precision = 12, scale = 2) - @Comment("订单总额") - private BigDecimal totalAmount; - - /** - * 退款金额 - */ - @Column(name = "refund_amount", precision = 12, scale = 2) - @Comment("退款金额") - private BigDecimal refundAmount = BigDecimal.ZERO; - - /** - * 平台服务费 - */ - @Column(name = "platform_fee", precision = 10, scale = 2) - @Comment("平台服务费") - private BigDecimal platformFee = BigDecimal.ZERO; - - /** - * 结算金额 - */ - @Column(name = "settlement_amount", precision = 12, scale = 2) - @Comment("结算金额") - private BigDecimal settlementAmount; - - /** - * 结算状态:0-待结算 1-已结算 - */ - @Column(name = "status") - @Comment("结算状态:0待结算 1已结算") - private SettlementStatus status = SettlementStatus.PENDING; - - /** - * 实际结算时间 - */ - @Column(name = "settled_at") - @Comment("实际结算时间") - private LocalDateTime settledAt; - - - - // ========== 业务方法 ========== - - public SettlementType getTypeEnum() { - return this.type; - } - - public SettlementStatus getStatusEnum() { - return this.status; - } - /** - * 结算类型文案 - */ - public String getTypeText() { - SettlementType e = getTypeEnum(); - return e != null ? e.getDesc() : "未知"; - } - - /** - * 状态文案 - */ - public String getStatusText() { - SettlementStatus e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } - - /** - * 是否已结算 - */ - public boolean isSettled() { - return getStatusEnum() == SettlementStatus.SETTLED; - } - - /** - * 周期文案,例如:2024-01-01 ~ 2024-01-07 - */ - public String getPeriodText() { - if (periodStart == null || periodEnd == null) { - return ""; - } - return periodStart.format(PERIOD_DATE_FORMATTER) - + " ~ " - + periodEnd.format(PERIOD_DATE_FORMATTER); - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Store.java b/src/main/java/com/xjhs/findmemerchant/entity/Store.java deleted file mode 100644 index 550d0d6..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Store.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.BusinessStatus; -import com.xjhs.findmemerchant.types.CommonStatus; -import com.xjhs.findmemerchant.types.StoreAuditStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - * 门店实体 - * 对应表:stores - */ -@Getter -@Setter -@Entity -@Table( - name = "stores", - indexes = { - @Index(name = "idx_stores_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_stores_audit_status", columnList = "audit_status") - } -) -public class Store extends AbstractBaseEntity { - /** - * 门店名称 - */ - @Column(name = "name", length = 100) - @Comment("门店名称") - private String name; - - /** - * 门店Logo - */ - @Column(name = "logo", length = 500) - @Comment("门店Logo") - private String logo; - - /** - * 联系电话 - */ - @Column(name = "phone", length = 11) - @Comment("联系电话") - private String phone; - - /** - * 省 - */ - @Column(name = "province", length = 50) - @Comment("省") - private String province; - - /** - * 市 - */ - @Column(name = "city", length = 50) - @Comment("市") - private String city; - - /** - * 区/县 - */ - @Column(name = "district", length = 50) - @Comment("区/县") - private String district; - - /** - * 详细地址 - */ - @Column(name = "address", length = 200) - @Comment("详细地址") - private String address; - - /** - * 经度 - */ - @Column(name = "longitude", precision = 10, scale = 7) - @Comment("经度") - private BigDecimal longitude; - - /** - * 纬度 - */ - @Column(name = "latitude", precision = 10, scale = 7) - @Comment("纬度") - private BigDecimal latitude; - - /** - * 营业时间描述 - */ - @Column(name = "business_hours", length = 100) - @Comment("营业时间描述") - private String businessHours; - - /** - * 营业状态:0-已打烊 1-营业中 2-临时打烊 - */ - @Column(name = "business_status",columnDefinition = "VARCHAR(20)", length = 20) - @Enumerated(EnumType.STRING) - @Comment("营业状态:0已打烊 1营业中 2临时打烊") - private BusinessStatus businessStatus = BusinessStatus.OPEN; - - /** - * 临时打烊原因 - */ - @Column(name = "temp_close_reason", length = 200) - @Comment("临时打烊原因") - private String tempCloseReason; - - /** - * 临时打烊结束时间 - */ - @Column(name = "temp_close_until") - @Comment("临时打烊结束时间") - private LocalDateTime tempCloseUntil; - - /** - * 审核状态 - */ - @Column(name = "audit_status",columnDefinition = "VARCHAR(20)", length = 20) - @Comment("审核状态:0待审核 1已通过 2已拒绝") - private StoreAuditStatus auditStatus = StoreAuditStatus.PENDING; - - /** - * 审核备注 - */ - @Column(name = "audit_remark", length = 500) - @Comment("审核备注") - private String auditRemark; - - /** - * 启用状态:0-禁用 1-启用 - */ - @Column(name = "status",columnDefinition = "VARCHAR(20)", length = 20) - @Comment("启用状态:0禁用 1启用") - private CommonStatus status = CommonStatus.ENABLED; - - // ========== 关联关系 ========== - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id") - private Merchant merchant; - - /** - * 员工列表 - */ - @OneToMany(mappedBy = "store", fetch = FetchType.LAZY,cascade = CascadeType.ALL,orphanRemoval = true) - private List employees = new ArrayList<>(); - - public void addEmployee(Employee employee){ - employee.setStore(this); - this.employees.add(employee); - } - - /** - * 营业时间段 - */ - @OneToMany(mappedBy = "store", fetch = FetchType.LAZY,cascade = CascadeType.ALL,orphanRemoval = true) - private List businessPeriods = new ArrayList<>(); - - public void addBusinessPeriods(BusinessPeriod businessPeriod){ - businessPeriod.setStore(this); - this.businessPeriods.add(businessPeriod); - } - - - // ========== 业务方法 ========== - - /** - * 完整地址 - */ - public String getFullAddress() { - return (province == null ? "" : province) - + (city == null ? "" : city) - + (district == null ? "" : district) - + (address == null ? "" : address); - } - - /** - * 是否审核通过 - */ - public boolean isApproved() { - return getAuditStatusEnum() == StoreAuditStatus.APPROVED; - } - - /** - * 是否启用 - */ - public boolean isActive() { - return getStatusEnum() == CommonStatus.ENABLED; - } - - /** - * 是否有地理位置 - */ - public boolean hasLocation() { - return longitude != null && latitude != null; - } - - /** - * 当前是否营业 - */ - public boolean isBusinessOpen() { - BusinessStatus bs = getBusinessStatusEnum(); - if (bs == null) { - return false; - } - if (bs == BusinessStatus.TEMP_CLOSED) { - // 如果设置了临时打烊结束时间且已过期,则视作应恢复营业 - if (tempCloseUntil != null && LocalDateTime.now().isAfter(tempCloseUntil)) { - return true; - } - return false; - } - return bs == BusinessStatus.OPEN; - } - - /** - * 营业状态文案 - */ - public String getBusinessStatusText() { - BusinessStatus bs = getBusinessStatusEnum(); - return bs != null ? bs.getDesc() : "未知"; - } - - public BusinessStatus getBusinessStatusEnum() { - return this.businessStatus; - } - - - public StoreAuditStatus getAuditStatusEnum() { - return this.auditStatus; - } - - public CommonStatus getStatusEnum() { - return this.status; - } - - public String getAuditStatusText() { - StoreAuditStatus e = getAuditStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } - - public String getStatusText() { - CommonStatus e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Transaction.java b/src/main/java/com/xjhs/findmemerchant/entity/Transaction.java deleted file mode 100644 index 4a1c803..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Transaction.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.id.SnowflakeGenerated; -import com.xjhs.findmemerchant.types.TransactionType; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 钱包交易流水 - * 对应表:wallet_transactions - */ -@Getter -@Setter -@Entity -@Table( - name = "wallet_transactions", - indexes = { - @Index(name = "idx_wallet_transactions_wallet_id", columnList = "wallet_id"), - @Index(name = "idx_wallet_transactions_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_wallet_transactions_type", columnList = "type"), - @Index(name = "idx_wallet_transactions_created_at", columnList = "created_at") - } -) -public class Transaction { - - /** - * 主键(雪花ID) - */ - @Id - @GeneratedValue - @SnowflakeGenerated - @Comment("主键ID") - private Long id; - - - /** - * 交易类型:1-收入 2-支出 3-冻结 4-解冻 5-提现 - */ - @Column(name = "type",columnDefinition = "VARCHAR(20)",length = 20) - @Comment("交易类型:1收入 2支出 3冻结 4解冻 5提现") - private TransactionType type; - - /** - * 交易金额 - */ - @Column(name = "amount", precision = 12, scale = 2) - @Comment("交易金额") - private BigDecimal amount; - - /** - * 交易前余额 - */ - @Column(name = "balance_before", precision = 12, scale = 2) - @Comment("交易前余额") - private BigDecimal balanceBefore; - - /** - * 交易后余额 - */ - @Column(name = "balance_after", precision = 12, scale = 2) - @Comment("交易后余额") - private BigDecimal balanceAfter; - - /** - * 关联类型: order, withdrawal, settlement - */ - @Column(name = "ref_type", length = 32) - @Comment("关联类型:order/withdrawal/settlement等") - private String refType; - - /** - * 关联ID - */ - @Column(name = "ref_id") - @Comment("关联业务ID") - private Long refId; - - /** - * 描述 - */ - @Column(name = "description", length = 200) - @Comment("交易描述") - private String description; - - /** - * 创建时间 - */ - @Column(name = "created_at") - @Comment("创建时间") - private LocalDateTime createdAt; - - /** - * 所属钱包 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "wallet_id", insertable = false, updatable = false) - private Wallet wallet; - - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - - // ========== 业务方法 ========== - - public TransactionType getTypeEnum() { - return this.type; - } - - /** - * 交易类型文案 - */ - public String getTypeText() { - TransactionType t = getTypeEnum(); - return t != null ? t.getDesc() : "未知"; - } - - /** - * 是否收入流水 - */ - public boolean isIncome() { - return getTypeEnum() == TransactionType.INCOME; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Wallet.java b/src/main/java/com/xjhs/findmemerchant/entity/Wallet.java deleted file mode 100644 index 06dffe2..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Wallet.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; - -/** - * 商家钱包 - * 对应表:wallets - */ -@Getter -@Setter -@Entity -@Table( - name = "wallets", - uniqueConstraints = { - @UniqueConstraint(name = "uk_wallets_merchant_id", columnNames = "merchant_id") - } -) -public class Wallet extends AbstractBaseEntity { - - /** - * 可用余额 - */ - @Column(name = "balance", precision = 12, scale = 2) - @Comment("可用余额") - private BigDecimal balance = BigDecimal.ZERO; - - /** - * 冻结余额(提现中) - */ - @Column(name = "frozen_balance", precision = 12, scale = 2) - @Comment("冻结余额(提现中)") - private BigDecimal frozenBalance = BigDecimal.ZERO; - - /** - * 累计收入 - */ - @Column(name = "total_income", precision = 12, scale = 2) - @Comment("累计收入") - private BigDecimal totalIncome = BigDecimal.ZERO; - - /** - * 累计提现 - */ - @Column(name = "total_withdrawn", precision = 12, scale = 2) - @Comment("累计提现") - private BigDecimal totalWithdrawn = BigDecimal.ZERO; - - /** - * 待结算金额 - */ - @Column(name = "pending_settlement", precision = 12, scale = 2) - @Comment("待结算金额") - private BigDecimal pendingSettlement = BigDecimal.ZERO; - - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id") - private Merchant merchant; - - // ========== 业务方法 ========== - - /** - * 可提现余额 - */ - public BigDecimal getAvailableBalance() { - return balance != null ? balance : BigDecimal.ZERO; - } - - /** - * 总余额(含冻结) - */ - public BigDecimal getTotalBalance() { - BigDecimal b = balance != null ? balance : BigDecimal.ZERO; - BigDecimal f = frozenBalance != null ? frozenBalance : BigDecimal.ZERO; - return b.add(f); - } - - /** - * 是否可提现指定金额 - */ - public boolean canWithdraw(BigDecimal amount) { - if (amount == null) { - return false; - } - if (amount.compareTo(BigDecimal.ZERO) <= 0) { - return false; - } - BigDecimal b = balance != null ? balance : BigDecimal.ZERO; - return b.compareTo(amount) >= 0; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/entity/Withdrawal.java b/src/main/java/com/xjhs/findmemerchant/entity/Withdrawal.java deleted file mode 100644 index 8efa02e..0000000 --- a/src/main/java/com/xjhs/findmemerchant/entity/Withdrawal.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.xjhs.findmemerchant.entity; - -import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; -import com.xjhs.findmemerchant.types.WithdrawalStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.Comment; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 提现申请 - * 对应表:withdrawals - */ -@Getter -@Setter -@Entity -@Table( - name = "withdrawals", - indexes = { - @Index(name = "idx_withdrawals_merchant_id", columnList = "merchant_id"), - @Index(name = "idx_withdrawals_wallet_id", columnList = "wallet_id"), - @Index(name = "idx_withdrawals_status", columnList = "status"), - @Index(name = "idx_withdrawals_created_at", columnList = "created_at") - } -) -public class Withdrawal extends AbstractBaseEntity { - - - /** - * 提现金额 - */ - @Column(name = "amount", precision = 12, scale = 2) - @Comment("提现金额") - private BigDecimal amount; - - /** - * 手续费 - */ - @Column(name = "fee", precision = 10, scale = 2) - @Comment("提现手续费") - private BigDecimal fee = BigDecimal.ZERO; - - /** - * 实际到账金额 - */ - @Column(name = "actual_amount", precision = 12, scale = 2) - @Comment("实际到账金额") - private BigDecimal actualAmount; - - /** - * 银行名称 - */ - @Column(name = "bank_name", length = 50) - @Comment("银行名称") - private String bankName; - - /** - * 银行账号(加密存储) - */ - @Column(name = "bank_account", length = 30) - @Comment("银行账号(加密)") - private String bankAccount; - - /** - * 户名 - */ - @Column(name = "account_name", length = 50) - @Comment("开户人姓名") - private String accountName; - - /** - * 状态:0-待审核 1-处理中 2-已完成 3-已拒绝 4-已取消 - */ - @Column(name = "status") - @Comment("提现状态") - private Byte status = 0; - - /** - * 拒绝原因 - */ - @Column(name = "reject_reason", length = 200) - @Comment("拒绝原因") - private String rejectReason; - - /** - * 审核/处理时间 - */ - @Column(name = "processed_at") - @Comment("审核/处理时间") - private LocalDateTime processedAt; - - /** - * 完成时间 - */ - @Column(name = "completed_at") - @Comment("完成时间") - private LocalDateTime completedAt; - - /** - * 银行流水号 - */ - @Column(name = "transaction_no", length = 64) - @Comment("银行流水号") - private String transactionNo; - - /** - * 备注 - */ - @Column(name = "remark", length = 200) - @Comment("备注") - private String remark; - - /** - * 商家 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "merchant_id", insertable = false, updatable = false) - private Merchant merchant; - - /** - * 钱包 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "wallet_id", insertable = false, updatable = false) - private Wallet wallet; - - // ========= 业务方法 ========= - - public WithdrawalStatus getStatusEnum() { - return WithdrawalStatus.fromCode(this.status); - } - - public void setStatusEnum(WithdrawalStatus statusEnum) { - this.status = statusEnum == null ? null : statusEnum.code(); - } - - public String getStatusText() { - WithdrawalStatus e = getStatusEnum(); - return e != null ? e.getDesc() : "未知"; - } - - /** - * 是否待审核 - */ - public boolean isPending() { - return getStatusEnum() == WithdrawalStatus.PENDING; - } - - /** - * 是否已完成 - */ - public boolean isCompleted() { - return getStatusEnum() == WithdrawalStatus.COMPLETED; - } - - /** - * 是否可以取消 - */ - public boolean canCancel() { - return getStatusEnum() == WithdrawalStatus.PENDING; - } - - /** - * 脱敏银行卡号 - */ - public String getMaskedBankAccount() { - if (bankAccount == null || bankAccount.length() <= 8) { - return bankAccount; - } - return bankAccount.substring(0, 4) + "****" + bankAccount.substring(bankAccount.length() - 4); - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/file/FileController.java b/src/main/java/com/xjhs/findmemerchant/file/FileController.java new file mode 100644 index 0000000..15eb8ab --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/file/FileController.java @@ -0,0 +1,108 @@ +package com.xjhs.findmemerchant.file; + +import com.xjhs.findmemerchant.common.ApiResult; +import com.xjhs.findmemerchant.file.dao.FileMetaInfo; +import com.xjhs.findmemerchant.file.dao.FileMetaInfoRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.tika.mime.MimeTypes; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +/** + * 统一文件管理控制器 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class FileController { + + + @Value("${appconfig.saveFileRoot}") + private String fileSaveRoot="./file-data"; + + private final FileMetaInfoRepository fileMetaInfoRepository; + + /** + * 获取并检查创建文件存储目录 + * @return 文件存储目录带日期 + */ + public Path getFileSavePath() throws IOException { + var datePath = DateTimeFormatter.ofPattern("yyyy/MM-dd").format(LocalDate.now()); + var path = Path.of(this.fileSaveRoot, datePath); + if (!Files.exists(path)){ + Files.createDirectories(path); + } + return path; + } + + + /** + * 上传文件 + * + * @param file 文件数据内容 + * @return 文件描信息 + */ + + @PostMapping("/platform/file/upload") + public ApiResult uploadFile(@RequestPart(name = "file") MultipartFile file) { + try { + var ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); + if (StringUtils.isEmpty(ext)) { + try { + ext = MimeTypes.getDefaultMimeTypes().forName(file.getContentType()).getExtension(); + } catch (Exception e) { + ext = ""; + } + } + + var filePath = Path.of(this.fileSaveRoot, UUID.randomUUID() + ext); + file.transferTo(filePath); + var fileMetaInfo = new FileMetaInfo(); + fileMetaInfo.setName(file.getOriginalFilename()); + fileMetaInfo.setContentType(file.getContentType()); + fileMetaInfo.setExtension(ext); + fileMetaInfo.setSavePath(filePath.toFile().getAbsolutePath()); + fileMetaInfoRepository.save(fileMetaInfo); + return ApiResult.data(fileMetaInfo); + } catch (Exception e) { + log.error(e.getMessage(),e); + return ApiResult.fail(e.getMessage()); + } + } + + /** + * 预览文件 + * @param fileId 文件id + * @return 文件内容 + */ + @GetMapping("/platform/file/view/{fileId}") + public ResponseEntity uploadFile(@PathVariable("fileId") String fileId) { + return this.fileMetaInfoRepository.findById(fileId).map(item->{ + try { + var bytes = Files.readAllBytes(Paths.get(item.getSavePath())); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(item.getContentType())) + .body(bytes); + } catch (IOException e) { + return ResponseEntity.internalServerError().build(); + } + + }).orElse(ResponseEntity.internalServerError().build()); + + } + + +} \ No newline at end of file diff --git a/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfo.java b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfo.java new file mode 100644 index 0000000..d735ee9 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfo.java @@ -0,0 +1,41 @@ +package com.xjhs.findmemerchant.file.dao; + +import com.xjhs.findmemerchant.common.jpa.id.SnowflakeGenerated; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Data; +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + + +/** + * 文件信息表 + */ +@Data +@Entity +@Comment("文件信息表") +public class FileMetaInfo { + @Id + @SnowflakeGenerated + @Comment("主键") + private Long id; + @Comment("文件原始名称") + private String name; + @Comment("文件媒体类型") + private String contentType; + @Comment("文件扩展名称") + @Column(length = 10) + private String extension; + @Comment("本地存储路径") + private String savePath; + @Comment("是否已迁移到云服务") + private boolean moveToCloud = false; + @Comment("云对象id") + @Column(length = 50) + private String cloudObjectId; + @Comment("创建时间") + private LocalDateTime createTime = LocalDateTime.now(); + +} \ No newline at end of file diff --git a/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfoRepository.java b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfoRepository.java new file mode 100644 index 0000000..a7f845a --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfoRepository.java @@ -0,0 +1,10 @@ +package com.xjhs.findmemerchant.file.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; + +@Repository +public interface FileMetaInfoRepository extends JpaRepository, JpaSpecificationExecutor { + +} \ No newline at end of file diff --git a/src/main/java/com/xjhs/findmemerchant/mapper/EmployeeMapper.java b/src/main/java/com/xjhs/findmemerchant/mapper/EmployeeMapper.java deleted file mode 100644 index 5ec5ed3..0000000 --- a/src/main/java/com/xjhs/findmemerchant/mapper/EmployeeMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.xjhs.findmemerchant.mapper; - -import com.xjhs.findmemerchant.dto.member.EmployeeDto; -import com.xjhs.findmemerchant.entity.Employee; -import com.xjhs.findmemerchant.vo.member.EmployeeCreateVo; -import com.xjhs.findmemerchant.vo.member.EmployeeUpdateVo; -import org.mapstruct.*; - -@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE,unmappedSourcePolicy = ReportingPolicy.IGNORE) -public interface EmployeeMapper { - @Mapping(target = "storeId",source = "store.id") - @Mapping(target = "roleId",source = "role.id") - EmployeeDto toDto(Employee employee); - - Employee toEntity(EmployeeCreateVo createVo); - - @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) - void updateEntityFormUpdateVo(EmployeeUpdateVo updateVo, @MappingTarget Employee employee); - -} diff --git a/src/main/java/com/xjhs/findmemerchant/mapper/MerchantMapper.java b/src/main/java/com/xjhs/findmemerchant/mapper/MerchantMapper.java index e74e846..95c0db5 100644 --- a/src/main/java/com/xjhs/findmemerchant/mapper/MerchantMapper.java +++ b/src/main/java/com/xjhs/findmemerchant/mapper/MerchantMapper.java @@ -1,15 +1,12 @@ package com.xjhs.findmemerchant.mapper; -import com.xjhs.findmemerchant.dto.MerchantDto; +import com.xjhs.findmemerchant.dto.merchant.MerchantDto; import com.xjhs.findmemerchant.entity.Merchant; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; @Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE,unmappedSourcePolicy = ReportingPolicy.IGNORE) public interface MerchantMapper { - - @Mapping(target = "authStatusDesc",source = "authStatus.desc") MerchantDto toDto(Merchant merchant); } diff --git a/src/main/java/com/xjhs/findmemerchant/mapper/StoreMapper.java b/src/main/java/com/xjhs/findmemerchant/mapper/StoreMapper.java deleted file mode 100644 index 0db647e..0000000 --- a/src/main/java/com/xjhs/findmemerchant/mapper/StoreMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.xjhs.findmemerchant.mapper; - -import com.xjhs.findmemerchant.dto.store.BusinessPeriodDto; -import com.xjhs.findmemerchant.dto.store.StoreBusinessStatusDto; -import com.xjhs.findmemerchant.dto.store.StoreDto; -import com.xjhs.findmemerchant.entity.BusinessPeriod; -import com.xjhs.findmemerchant.entity.Store; -import com.xjhs.findmemerchant.vo.store.BusinessPeriodVo; -import com.xjhs.findmemerchant.vo.store.StoreBusinessStatusUpdateVo; -import com.xjhs.findmemerchant.vo.store.StoreCreateVo; -import com.xjhs.findmemerchant.vo.store.StoreUpdateVo; -import org.mapstruct.*; - -import java.util.List; - -@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE,unmappedSourcePolicy = ReportingPolicy.IGNORE) -public interface StoreMapper { - StoreDto toDto(Store store); - StoreBusinessStatusDto toBusinessStatusDto(Store store); - Store toEntity(StoreCreateVo createVo); - Store toEntity(StoreUpdateVo updateVo); - - @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) - void updateFromVo(StoreUpdateVo vo, @MappingTarget Store entity); - @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) - void updateFromBusinessUpdateVo(StoreBusinessStatusUpdateVo updateVo,@MappingTarget Store store); - - BusinessPeriod toEntity(BusinessPeriodVo vo); - @Mapping(source = "store.id",target = "storeId") - BusinessPeriodDto toDto(BusinessPeriod entity); - List toDtoList(List entityList); -} diff --git a/src/main/java/com/xjhs/findmemerchant/mapper/SystemUserMapper.java b/src/main/java/com/xjhs/findmemerchant/mapper/SystemUserMapper.java new file mode 100644 index 0000000..cca0ad0 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/mapper/SystemUserMapper.java @@ -0,0 +1,15 @@ +package com.xjhs.findmemerchant.mapper; + +import com.xjhs.findmemerchant.security.LoginUser; +import com.xjhs.findmemerchant.system.entity.SystemUser; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; + + +@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE,unmappedSourcePolicy = ReportingPolicy.IGNORE) +public interface SystemUserMapper { + + @Mapping(target = "merchantId",source = "systemUser.merchant.id") + LoginUser toLoginUserInfo(SystemUser systemUser); +} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/ActivityRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/ActivityRepository.java deleted file mode 100644 index fd53c89..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/ActivityRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Activity; -import com.xjhs.findmemerchant.types.ActivityStatus; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface ActivityRepository extends JpaRepository { - - List findByMerchant_Id(Long merchantId); - - List findByStatus(ActivityStatus status); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/BankCardRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/BankCardRepository.java deleted file mode 100644 index 7c2df2b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/BankCardRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.BankCard; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 商家银行卡仓储 - */ -public interface BankCardRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按商家查询所有银行卡 - */ - List findByMerchant_Id(Long merchantId); - - /** - * 查询商家的默认卡 - */ - Optional findByMerchant_IdAndIsDefaultTrue(Long merchantId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/BusinessLicenseRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/BusinessLicenseRepository.java deleted file mode 100644 index 5dcf65a..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/BusinessLicenseRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.BusinessLicense; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -public interface BusinessLicenseRepository extends JpaRepository, - JpaSpecificationExecutor { - - List findByMerchant_Id(Long merchantId); - - Optional findTopByMerchant_IdOrderByCreatedAtDesc(Long merchantId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/BusinessPeriodRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/BusinessPeriodRepository.java deleted file mode 100644 index 0980b1b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/BusinessPeriodRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.BusinessPeriod; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 门店营业时间段仓储 - */ -public interface BusinessPeriodRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按门店查询所有营业时间段 - */ - List findByStore_Id(Long storeId); - - /** - * 按门店 + 周几查询启用的时间段 - */ - List findByStore_IdAndDayOfWeekAndIsEnabledTrue(Long storeId, Byte dayOfWeek); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/CouponCodeRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/CouponCodeRepository.java deleted file mode 100644 index 2d21ff2..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/CouponCodeRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.CouponCode; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 优惠券码仓储 - */ -public interface CouponCodeRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按券模板查询券码 - */ - List findByCoupon_Id(Long couponId); - - /** - * 按会员查询券码 - */ - List findByMember_Id(Long memberId); - - /** - * 按券码查询 - */ - Optional findByCode(String code); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/CouponRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/CouponRepository.java deleted file mode 100644 index 6638486..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/CouponRepository.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Coupon; -import com.xjhs.findmemerchant.types.CouponStatus; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.Optional; - -/** - * 优惠券模板仓储 - */ -public interface CouponRepository extends JpaRepository { - - /** - * 按商家查询优惠券 - */ - List findByMerchant_Id(Long merchantId); - - /** - * 按状态查询优惠券 - */ - List findByStatus(CouponStatus status); - - /** - * 按ID + 商家ID 查询(防越权) - */ - Optional findByIdAndMerchant_Id(Long id, Long merchantId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/CouponStoreRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/CouponStoreRepository.java deleted file mode 100644 index 8e762d8..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/CouponStoreRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.CouponStore; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 优惠券与门店关联仓储 - */ -public interface CouponStoreRepository extends JpaSpecificationExecutor,JpaRepository { - - List findByCoupon_Id(Long couponId); - - List findByStore_Id(Long storeId); - - Optional findByCoupon_IdAndStore_Id(Long couponId, Long storeId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/EmployeeRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/EmployeeRepository.java deleted file mode 100644 index 042e926..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/EmployeeRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Employee; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 员工仓储 - */ -public interface EmployeeRepository extends JpaRepository, - JpaSpecificationExecutor { - - List findByStoreId(Long storeId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/HealthCertificateRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/HealthCertificateRepository.java deleted file mode 100644 index 99ba8e9..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/HealthCertificateRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.HealthCertificate; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -public interface HealthCertificateRepository extends JpaRepository, - JpaSpecificationExecutor { - - List findByStore_Id(Long storeId); - - List findByEmployee_Id(Long employeeId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/MemberRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/MemberRepository.java deleted file mode 100644 index 87edaf7..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/MemberRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Member; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 会员仓储 - */ -public interface MemberRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按商家查询会员 - */ - List findByMerchant_Id(Long merchantId); - - /** - * 按商家 + 手机号查询(唯一) - */ - Optional findByPhone(String phone); - - -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/MerchantRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/MerchantRepository.java index 0a51aaa..ae7944c 100644 --- a/src/main/java/com/xjhs/findmemerchant/repository/MerchantRepository.java +++ b/src/main/java/com/xjhs/findmemerchant/repository/MerchantRepository.java @@ -6,16 +6,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import java.util.Optional; -/** - * 商家仓储 - */ -public interface MerchantRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 根据手机号查询 - */ - Optional findByPhone(String phone); - - Boolean existsByPhone(String phone); +public interface MerchantRepository extends JpaSpecificationExecutor, JpaRepository { + Optional findBySystemUserPhone(String phone); } diff --git a/src/main/java/com/xjhs/findmemerchant/repository/MessageRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/MessageRepository.java deleted file mode 100644 index 79989a0..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/MessageRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Message; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 消息仓储 - */ -public interface MessageRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按商家查询消息 - */ - List findByMerchant_Id(Long merchantId); - - List findByMerchant_IdAndIsRead(Long merchantId, Boolean isRead); - - /** - * 统计未读消息数量 - */ - long countByMerchant_IdAndIsRead(Long merchantId, Boolean isRead); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/OrderItemRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/OrderItemRepository.java deleted file mode 100644 index 138e3c9..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/OrderItemRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.OrderItem; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 订单明细仓储 - */ -public interface OrderItemRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按订单查询订单明细 - */ - List findByOrder_Id(Long orderId); - - List findByProductId(Long productId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/OrderRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/OrderRepository.java deleted file mode 100644 index f32769e..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/OrderRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Order; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 订单仓储 - */ -public interface OrderRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按订单号查询(唯一) - */ - Optional findByOrderNo(String orderNo); - - /** - * 按门店查询订单 - */ - List findByStore_Id(Long storeId); - - List findByMember_Id(Long memberId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/ProductCategoryRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/ProductCategoryRepository.java deleted file mode 100644 index 59f6448..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/ProductCategoryRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.ProductCategory; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 商品分类仓储 - */ -public interface ProductCategoryRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按商家查询所有分类 - */ - List findByMerchant_Id(Long merchantId); - - /** - * 查询某商家下指定父分类的子分类 - */ - List findByMerchantIdAndParentId(Long merchantId, Long parentId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/ProductRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/ProductRepository.java deleted file mode 100644 index 77a861f..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/ProductRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Product; -import com.xjhs.findmemerchant.types.ProductStatus; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 商品仓储 - */ -public interface ProductRepository extends JpaRepository, - JpaSpecificationExecutor { - - List findByMerchant_Id(Long merchantId); - - /** - * 按门店查询商品 - */ - List findByStoreId(Long storeId); - - /** - * 按分类查询商品 - */ - List findByCategoryId(Long categoryId); - - /** - * 按状态查询商品 - */ - List findByStatus(ProductStatus status); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/ProductSKURepository.java b/src/main/java/com/xjhs/findmemerchant/repository/ProductSKURepository.java deleted file mode 100644 index 71f2a8d..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/ProductSKURepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.ProductSKU; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 商品SKU仓储 - */ -public interface ProductSKURepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 查询商品下的所有SKU - */ - List findByProductId(Long productId); - - /** - * 按编码查询 - */ - List findBySkuCode(String skuCode); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/ReviewReplyRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/ReviewReplyRepository.java deleted file mode 100644 index 42a1fc7..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/ReviewReplyRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.ReviewReply; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.Optional; - -/** - * 评价回复仓储 - */ -public interface ReviewReplyRepository extends JpaRepository, - JpaSpecificationExecutor { - - Optional findByReviewId(Long reviewId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/ReviewRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/ReviewRepository.java deleted file mode 100644 index 79a70cd..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/ReviewRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Review; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 用户评价仓储 - */ -public interface ReviewRepository extends JpaRepository, - JpaSpecificationExecutor { - - List findByMerchant_Id(Long merchantId); - - List findByStoreId(Long storeId); - - List findByOrderId(Long orderId); - - List findByUserId(Long userId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/RoleRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/RoleRepository.java deleted file mode 100644 index 7971f97..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/RoleRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Role; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.Optional; - -/** - * 角色仓储 - */ -public interface RoleRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按编码查询角色 - */ - Optional findByCode(String code); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/SettlementRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/SettlementRepository.java deleted file mode 100644 index 275b644..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/SettlementRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Settlement; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 结算记录仓储 - */ -public interface SettlementRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按结算单号查询 - */ - Optional findBySettlementNo(String settlementNo); - - /** - * 按商家查询结算记录 - */ - List findByMerchantId(Long merchantId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/StoreRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/StoreRepository.java deleted file mode 100644 index 2ee48b0..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/StoreRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Store; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; -import java.util.Optional; - -/** - * 门店仓储 - */ -public interface StoreRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按商家查询门店 - */ - List findByMerchantId(Long merchantId); - - Optional findByMerchant_IdAndId(Long merchantId, Long id); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/TransactionRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/TransactionRepository.java deleted file mode 100644 index ef1d01b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/TransactionRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Transaction; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 钱包交易流水仓储 - */ -public interface TransactionRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按钱包查询流水 - */ - List findByWalletId(Long walletId); - - /** - * 按商家查询流水 - */ - List findByMerchantId(Long merchantId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/WalletRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/WalletRepository.java deleted file mode 100644 index 515f6b1..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/WalletRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Wallet; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.Optional; - -/** - * 商家钱包仓储 - */ -public interface WalletRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 根据商家ID查询钱包(唯一) - */ - Optional findByMerchantId(Long merchantId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/repository/WithdrawalRepository.java b/src/main/java/com/xjhs/findmemerchant/repository/WithdrawalRepository.java deleted file mode 100644 index 0754d57..0000000 --- a/src/main/java/com/xjhs/findmemerchant/repository/WithdrawalRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.repository; - -import com.xjhs.findmemerchant.entity.Withdrawal; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.List; - -/** - * 提现仓储 - */ -public interface WithdrawalRepository extends JpaRepository, - JpaSpecificationExecutor { - - /** - * 按商家查提现记录 - */ - List findByMerchantId(Long merchantId); - - /** - * 按钱包查提现记录 - */ - List findByWalletId(Long walletId); -} diff --git a/src/main/java/com/xjhs/findmemerchant/security/JwtAuthenticationFilter.java b/src/main/java/com/xjhs/findmemerchant/security/JwtAuthenticationFilter.java index fd97ad4..bb23f89 100644 --- a/src/main/java/com/xjhs/findmemerchant/security/JwtAuthenticationFilter.java +++ b/src/main/java/com/xjhs/findmemerchant/security/JwtAuthenticationFilter.java @@ -1,7 +1,7 @@ package com.xjhs.findmemerchant.security; -import com.xjhs.findmemerchant.repository.MemberRepository; +import com.xjhs.findmemerchant.mapper.SystemUserMapper; import com.xjhs.findmemerchant.repository.MerchantRepository; import com.xjhs.findmemerchant.security.sms.SmsAuthenticationToken; import jakarta.servlet.FilterChain; @@ -24,24 +24,18 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtTokenService jwtTokenService; private final MerchantRepository merchantRepository; - private final MemberRepository memberRepository; + private final SystemUserMapper systemUserMapper; - - private SmsAuthenticationToken getAuthenticationToken(String phone) throws Exception { + private SmsAuthenticationToken getAuthenticationToken(String phone) throws Exception { // 手机号查商家 - var merchant = merchantRepository.findByPhone(phone).orElse(null); - if(merchant != null){ + var merchant = merchantRepository.findBySystemUserPhone(phone).orElse(null); + if (merchant != null) { var authorities = List.of(new SimpleGrantedAuthority("ROLE_USER")); - return new SmsAuthenticationToken(merchant, authorities); + var loginUser = systemUserMapper.toLoginUserInfo(merchant.getSystemUser()); + return new SmsAuthenticationToken(loginUser, authorities); } - // 手机号查员工 - var member = memberRepository.findByPhone(phone).orElse(null); - if(member != null){ - var authorities = List.of(new SimpleGrantedAuthority("ROLE_MEMBER")); - return new SmsAuthenticationToken(member, authorities); - } - throw new Exception("用户信息不存在"); + throw new Exception("用户信息不存在"); } @Override diff --git a/src/main/java/com/xjhs/findmemerchant/security/LoginUser.java b/src/main/java/com/xjhs/findmemerchant/security/LoginUser.java new file mode 100644 index 0000000..4c7b133 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/security/LoginUser.java @@ -0,0 +1,23 @@ +package com.xjhs.findmemerchant.security; + +import lombok.Data; + +/** + * 登录用户信息 + */ +@Data +public class LoginUser { + /** + * 用户id + */ + private Long userId; + /** + * 手机号 + */ + private String phone; + /** + * 关联商户id,不存在则为null + */ + private Long merchantId; + +} diff --git a/src/main/java/com/xjhs/findmemerchant/security/sms/SmsAuthenticationProvider.java b/src/main/java/com/xjhs/findmemerchant/security/sms/SmsAuthenticationProvider.java index 199089a..fe5acfc 100644 --- a/src/main/java/com/xjhs/findmemerchant/security/sms/SmsAuthenticationProvider.java +++ b/src/main/java/com/xjhs/findmemerchant/security/sms/SmsAuthenticationProvider.java @@ -1,25 +1,31 @@ package com.xjhs.findmemerchant.security.sms; -import com.xjhs.findmemerchant.repository.MemberRepository; -import com.xjhs.findmemerchant.repository.MerchantRepository; +import com.xjhs.findmemerchant.mapper.SystemUserMapper; +import com.xjhs.findmemerchant.system.SystemUserService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.CredentialsExpiredException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Objects; +@Slf4j @Component @RequiredArgsConstructor public class SmsAuthenticationProvider implements AuthenticationProvider { private final SmsCodeService smsCodeService; - private final MerchantRepository merchantRepository; - private final MemberRepository memberRepository; + private final SystemUserService systemUserService; + private final SystemUserMapper systemUserMapper; @Override + @Transactional(readOnly = true) public Authentication authenticate(Authentication authentication) throws AuthenticationException { SmsAuthenticationToken token = (SmsAuthenticationToken) authentication; String phone = (String) token.getPrincipal(); @@ -27,21 +33,17 @@ public class SmsAuthenticationProvider implements AuthenticationProvider { try { this.smsCodeService.verifyCode(phone,"login" ,code); } catch (Exception e) { - throw new UsernameNotFoundException(e.getMessage()); + throw new CredentialsExpiredException(e.getMessage()); } - // 手机号查商家 - var merchant = merchantRepository.findByPhone(phone).orElse(null); - if(merchant != null){ - var authorities = List.of(new SimpleGrantedAuthority("ROLE_USER")); - return new SmsAuthenticationToken(merchant, authorities); + // 取回商家身份 + var systemUser = systemUserService.getAndRegisterByPhone(phone); + if (Objects.isNull(systemUser.getMerchant())){ + throw new UsernameNotFoundException("手机号码未注册"); } - // 手机号查员工 - var member = memberRepository.findByPhone(phone).orElse(null); - if(member != null){ - var authorities = List.of(new SimpleGrantedAuthority("ROLE_MEMBER")); - return new SmsAuthenticationToken(member, authorities); - } - throw new UsernameNotFoundException("用户信息不存在"); + + var loginUser = this.systemUserMapper.toLoginUserInfo(systemUser); + var authorities = List.of(new SimpleGrantedAuthority("ADMIN")); + return new SmsAuthenticationToken(loginUser, authorities); } @Override diff --git a/src/main/java/com/xjhs/findmemerchant/security/sms/SmsCodeService.java b/src/main/java/com/xjhs/findmemerchant/security/sms/SmsCodeService.java index ca61396..25356e9 100644 --- a/src/main/java/com/xjhs/findmemerchant/security/sms/SmsCodeService.java +++ b/src/main/java/com/xjhs/findmemerchant/security/sms/SmsCodeService.java @@ -17,7 +17,7 @@ public class SmsCodeService { private static final String SMS_CODE_KEY_PREFIX = "sms:code:"; /** 验证码有效期:5 分钟 */ - private static final Duration SMS_CODE_TTL = Duration.ofMinutes(5); + private static final Duration SMS_CODE_TTL = Duration.ofMinutes(1); private final StringRedisTemplate redisTemplate; private final Random random = new Random(); @@ -29,10 +29,10 @@ public class SmsCodeService { } /** - * 生成 6 位数字验证码 + * 生成 4 位数字验证码 */ private String generateCode() { - return String.format("%06d", random.nextInt(1_000_000)); + return String.format("%04d", random.nextInt(10000)); } /** @@ -64,7 +64,6 @@ public class SmsCodeService { // 对齐 Go 里的 ErrSMSCodeExpired throw new Exception("验证码已过期或未发送"); } - if (!realCode.equals(inputCode)) { // 不正确,但不删除,让用户继续尝试(错误次数由 AuthService 控制) throw new Exception("验证码错误"); diff --git a/src/main/java/com/xjhs/findmemerchant/service/MerchantService.java b/src/main/java/com/xjhs/findmemerchant/service/MerchantService.java deleted file mode 100644 index 7f3e11b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/service/MerchantService.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.xjhs.findmemerchant.service; - -import com.xjhs.findmemerchant.dto.MerchantDto; -import com.xjhs.findmemerchant.mapper.MerchantMapper; -import com.xjhs.findmemerchant.repository.MerchantRepository; -import com.xjhs.findmemerchant.types.AuthStatus; -import com.xjhs.findmemerchant.vo.merchant.MerchantUpdateVo; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Slf4j -@Service -@RequiredArgsConstructor -public class MerchantService { - public final MerchantRepository merchantRepository; - public final MerchantMapper merchantMapper; - - /** - * 根据商家id获取商家信息 - * @param id 商家id - * @return 商家信息 - */ - public Optional getById(Long id) { - return this.merchantRepository.findById(id) - .map(this.merchantMapper::toDto); - } - - /** - * 更新商家信息 - * @param id 商家id - * @param merchantUpdateVo 更新信息 - * @return 商家信息 - * @throws Exception 错误信息 - */ - @Transactional(rollbackOn = Exception.class) - public MerchantDto updateMerchant(Long id, MerchantUpdateVo merchantUpdateVo) throws Exception { - var entity = this.merchantRepository.findById(id) - .orElseThrow(() -> new Exception("商家信息不存在")); - entity.setRealName(merchantUpdateVo.getRealName()); - this.merchantRepository.save(entity); - return this.merchantMapper.toDto(entity); - } - - /** - * 商家身份证信息验证 - * - * @param id 商家id - * @param idCardNo 身份证号 - * @param realName 真实姓名 - * @throws Exception 验证异常信息 - */ - @Transactional(rollbackOn = Exception.class) - public MerchantDto verifyMerchant(Long id, String idCardNo, String realName) throws Exception { - var entity = this.merchantRepository.findById(id) - .orElseThrow(() -> new Exception("商家信息不存在")); - if (entity.getAuthStatus() == AuthStatus.VERIFIED) { - throw new Exception("商家信息已认证"); - } - this.idCardVerify(idCardNo, realName); - entity.setAuthStatus(AuthStatus.VERIFIED); - entity.setIdCardNo(idCardNo); - entity.setIdCardEncrypted(idCardNo); - entity.setRealName(realName); - this.merchantRepository.save(entity); - return this.merchantMapper.toDto(entity); - } - - - /** - * 第三方验证 - * @param idCardNo 身份证号码 - * @param realName 真实姓名 - * @throws Exception 验证失败信息 - */ - public void idCardVerify(String idCardNo, String realName) throws Exception { - // TODO: 调用腾讯云身份证二要素核验接口 - throw new Exception("验证失败,正在开发中"); - } - - -} diff --git a/src/main/java/com/xjhs/findmemerchant/service/StoreService.java b/src/main/java/com/xjhs/findmemerchant/service/StoreService.java deleted file mode 100644 index acdc4b9..0000000 --- a/src/main/java/com/xjhs/findmemerchant/service/StoreService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.xjhs.findmemerchant.service; - -import com.xjhs.findmemerchant.common.jpa.query.JpaSpecs; -import com.xjhs.findmemerchant.dto.store.StoreDto; -import com.xjhs.findmemerchant.mapper.StoreMapper; -import com.xjhs.findmemerchant.repository.StoreRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.stereotype.Service; - -@Slf4j -@Service -@RequiredArgsConstructor -public class StoreService { - - private final StoreRepository storeRepository; - private final StoreMapper storeMapper; - - /** - * 分页查询 - * - * @param pageable 分页参数 - * @param merchantId 商家id - * @return 分页数据 - */ - public Page findPage(Pageable pageable, Long merchantId) { - return this.storeRepository.findAll(Specification.allOf( - JpaSpecs.eq("merchant.id", merchantId) - ), pageable).map(this.storeMapper::toDto); - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/system/SystemUserService.java b/src/main/java/com/xjhs/findmemerchant/system/SystemUserService.java new file mode 100644 index 0000000..e590d2d --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/system/SystemUserService.java @@ -0,0 +1,36 @@ +package com.xjhs.findmemerchant.system; + +import com.xjhs.findmemerchant.system.entity.SystemUser; +import com.xjhs.findmemerchant.system.repository.SystemUserRepository; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Slf4j +@Service +@AllArgsConstructor +public class SystemUserService { + + private final SystemUserRepository systemUserRepository; + /** + * 通过手机号获取用户信息,不存在则进行注册 + * + * @param phone 手机号码 + * @return 用户信息 + */ + public SystemUser getAndRegisterByPhone(String phone) { + return this.systemUserRepository.findByPhoneAndDeleteTimeIsNull(phone) + .orElseGet(() -> { + var systemUser = new SystemUser(); + systemUser.setPhone(phone); + return this.systemUserRepository.save(systemUser); + }); + } + + public Optional findByPhone(String phone){ + return this.systemUserRepository.findByPhoneAndDeleteTimeIsNull(phone); + } +} diff --git a/src/main/java/com/xjhs/findmemerchant/system/entity/SystemUser.java b/src/main/java/com/xjhs/findmemerchant/system/entity/SystemUser.java new file mode 100644 index 0000000..39b4264 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/system/entity/SystemUser.java @@ -0,0 +1,31 @@ +package com.xjhs.findmemerchant.system.entity; + +import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; +import com.xjhs.findmemerchant.entity.Merchant; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.Comment; + +/** + * 用户信息表 + */ + +@Getter +@Setter +@Entity +@Table +public class SystemUser extends AbstractBaseEntity { + @Column(columnDefinition = "CHAR(11)",length = 11) + @Comment("用户手机号") + private String phone; + @Column(length = 20) + @Comment("用户真实姓名") + private String realName; + @Column(length = 18) + @Comment("身份证号") + private String idCardNo; + @OneToOne(mappedBy = "systemUser",cascade = CascadeType.ALL) + private Merchant merchant; + +} diff --git a/src/main/java/com/xjhs/findmemerchant/system/repository/SystemUserRepository.java b/src/main/java/com/xjhs/findmemerchant/system/repository/SystemUserRepository.java new file mode 100644 index 0000000..bae01fc --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/system/repository/SystemUserRepository.java @@ -0,0 +1,11 @@ +package com.xjhs.findmemerchant.system.repository; + +import com.xjhs.findmemerchant.system.entity.SystemUser; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.Optional; + +public interface SystemUserRepository extends JpaRepository , JpaSpecificationExecutor { + Optional findByPhoneAndDeleteTimeIsNull(String phone); +} diff --git a/src/main/java/com/xjhs/findmemerchant/types/ActivityStatus.java b/src/main/java/com/xjhs/findmemerchant/types/ActivityStatus.java deleted file mode 100644 index a0d47a7..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/ActivityStatus.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 活动状态 - * 0-未开始 1-进行中 2-已结束 3-已下架 - */ -@Getter -@AllArgsConstructor -public enum ActivityStatus { - /** - * 未开始 - */ - NOT_STARTED("未开始"), - /** - * 进行中 - */ - ONGOING("进行中"), - /** - * 已结束 - */ - ENDED("已结束"), - /** - * 已下架 - */ - OFFLINE("已下架"); - - private final String desc; - - public static ActivityStatus fromCode(Byte code) { - if (code == null) return null; - - return switch (code) { - case 0 -> NOT_STARTED; - case 1 -> ONGOING; - case 2 -> ENDED; - case 3 -> OFFLINE; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case NOT_STARTED -> 0; - case ONGOING -> 1; - case ENDED -> 2; - case OFFLINE -> 3; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/ActivityType.java b/src/main/java/com/xjhs/findmemerchant/types/ActivityType.java deleted file mode 100644 index c07b365..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/ActivityType.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ActivityType { - - /** - * 团购 - */ - GROUP_BUY("团购"), - /** - * 折扣 - */ - DISCOUNT("折扣"), - /** - * 限时优惠 - */ - FLASH_SALE("限时优惠"); - - private final String desc; - - // 数据库存储 tinyint -> 转为枚举 - public static ActivityType fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 1 -> GROUP_BUY; - case 2 -> DISCOUNT; - case 3 -> FLASH_SALE; - default -> null; - }; - } - - // 枚举 -> 数据库存储值 - public byte code() { - return switch (this) { - case GROUP_BUY -> 1; - case DISCOUNT -> 2; - case FLASH_SALE -> 3; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/AuthStatus.java b/src/main/java/com/xjhs/findmemerchant/types/AuthStatus.java deleted file mode 100644 index 4c817cd..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/AuthStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 商家实名认证状态 - * 0-未认证 1-已认证 - */ -@Getter -@AllArgsConstructor -public enum AuthStatus { - - /** - * 未认证 - */ - NOT_VERIFIED("未认证"), - /** - * 已认证 - */ - VERIFIED("已认证"); - - private final String desc; - - public static AuthStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> NOT_VERIFIED; - case 1 -> VERIFIED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case NOT_VERIFIED -> 0; - case VERIFIED -> 1; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/BusinessLicenseStatus.java b/src/main/java/com/xjhs/findmemerchant/types/BusinessLicenseStatus.java deleted file mode 100644 index 6643d75..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/BusinessLicenseStatus.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 营业执照审核状态 - * 0-待审核 1-已通过 2-已拒绝 - */ -@Getter -@AllArgsConstructor -public enum BusinessLicenseStatus { - - /** - * 待审核 - */ - PENDING("待审核"), - /** - * 已通过 - */ - APPROVED("已通过"), - /** - * 已拒绝 - */ - REJECTED("已拒绝"); - - private final String desc; - - public static BusinessLicenseStatus fromCode(Byte code) { - if (code == null) return null; - - return switch (code) { - case 0 -> PENDING; - case 1 -> APPROVED; - case 2 -> REJECTED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case PENDING -> 0; - case APPROVED -> 1; - case REJECTED -> 2; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/BusinessStatus.java b/src/main/java/com/xjhs/findmemerchant/types/BusinessStatus.java deleted file mode 100644 index e8622cc..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/BusinessStatus.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 门店营业状态 - * 1-营业中 0-已打烊 2-临时打烊 - */ -@Getter -@AllArgsConstructor -public enum BusinessStatus { - - /** - * 已打烊 - */ - CLOSED("已打烊"), // 0 - /** - * 营业中 - */ - OPEN("营业中"), // 1 - /** - * 临时打烊 - */ - TEMP_CLOSED("临时打烊"); // 2 - - private final String desc; - - public static BusinessStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> CLOSED; - case 1 -> OPEN; - case 2 -> TEMP_CLOSED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case CLOSED -> 0; - case OPEN -> 1; - case TEMP_CLOSED -> 2; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/CommonStatus.java b/src/main/java/com/xjhs/findmemerchant/types/CommonStatus.java deleted file mode 100644 index a98d6a2..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/CommonStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 通用启用/禁用状态 - * 0-禁用 1-启用 - */ -@Getter -@AllArgsConstructor -public enum CommonStatus { - - /** - * 禁用 - */ - DISABLED("禁用"), - /** - * 启用 - */ - ENABLED("启用"); - - private final String desc; - - public static CommonStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> DISABLED; - case 1 -> ENABLED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case DISABLED -> 0; - case ENABLED -> 1; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/CouponCodeStatus.java b/src/main/java/com/xjhs/findmemerchant/types/CouponCodeStatus.java deleted file mode 100644 index bb3e650..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/CouponCodeStatus.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 券码状态 - * 0-未领取 1-已领取 2-已核销 3-已过期 - */ -@Getter -@AllArgsConstructor -public enum CouponCodeStatus { - - /** - * 未领取 - */ - UNCLAIMED("未领取"), - /** - * 已领取 - */ - CLAIMED("已领取"), - /** - * 已核销 - */ - VERIFIED("已核销"), - /** - * 已过期 - */ - EXPIRED("已过期"); - - private final String desc; - - - public static CouponCodeStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> UNCLAIMED; - case 1 -> CLAIMED; - case 2 -> VERIFIED; - case 3 -> EXPIRED; - default -> null; - }; - } - - -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/CouponStatus.java b/src/main/java/com/xjhs/findmemerchant/types/CouponStatus.java deleted file mode 100644 index f9ad8fb..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/CouponStatus.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 优惠券状态 - * 0-下架 1-进行中 2-已结束 - */ -@Getter -@AllArgsConstructor -public enum CouponStatus { - - /** - * 下架 - */ - OFFLINE("下架"), - /** - * 进行中 - */ - ONLINE("进行中"), - /** - * 已结束 - */ - ENDED("已结束"); - - private final String desc; - - public static CouponStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> OFFLINE; - case 1 -> ONLINE; - case 2 -> ENDED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case OFFLINE -> 0; - case ONLINE -> 1; - case ENDED -> 2; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/CouponType.java b/src/main/java/com/xjhs/findmemerchant/types/CouponType.java deleted file mode 100644 index 7a4118a..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/CouponType.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 优惠券类型 - * 1-折扣券 2-满减券 3-现金券 4-赠品券 - */ -@Getter -@AllArgsConstructor -public enum CouponType { - - /** - * 折扣券 - */ - DISCOUNT("折扣券"), - /** - * 满减券 - */ - REDUCE("满减券"), - /** - * 现金券 - */ - CASH("现金券"), - /** - * 赠品券 - */ - GIFT("赠品券"); - - private final String desc; - - /** - * 数据库 tinyint -> 枚举 - */ - public static CouponType fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 1 -> DISCOUNT; - case 2 -> REDUCE; - case 3 -> CASH; - case 4 -> GIFT; - default -> null; - }; - } - - /** - * 枚举 -> 数据库 tinyint - */ - public byte code() { - return switch (this) { - case DISCOUNT -> 1; - case REDUCE -> 2; - case CASH -> 3; - case GIFT -> 4; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/HealthCertificateStatus.java b/src/main/java/com/xjhs/findmemerchant/types/HealthCertificateStatus.java deleted file mode 100644 index 477ae33..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/HealthCertificateStatus.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 健康证状态 - * 0-待审核 1-有效 2-过期 - */ -@Getter -@AllArgsConstructor -public enum HealthCertificateStatus { - - /** - * 待审核 - */ - PENDING("待审核"), - /** - * 有效 - */ - VALID("有效"), - /** - * 已过期 - */ - EXPIRED("已过期"); - - private final String desc; - - public static HealthCertificateStatus fromCode(Byte code) { - if (code == null) return null; - - return switch (code) { - case 0 -> PENDING; - case 1 -> VALID; - case 2 -> EXPIRED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case PENDING -> 0; - case VALID -> 1; - case EXPIRED -> 2; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/MessageType.java b/src/main/java/com/xjhs/findmemerchant/types/MessageType.java deleted file mode 100644 index 5ed8cd9..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/MessageType.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 消息类型 - * 1-系统通知 2-活动提醒 3-私信 - */ -@Getter -@AllArgsConstructor -public enum MessageType { - - /** - * 系统通知 - */ - SYSTEM("系统通知"), - /** - * 活动提醒 - */ - ACTIVITY("活动提醒"), - /** - * 私信 - */ - PRIVATE("私信"); - - private final String desc; - - public static MessageType fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 1 -> SYSTEM; - case 2 -> ACTIVITY; - case 3 -> PRIVATE; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case SYSTEM -> 1; - case ACTIVITY -> 2; - case PRIVATE -> 3; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/OrderStatus.java b/src/main/java/com/xjhs/findmemerchant/types/OrderStatus.java deleted file mode 100644 index 3f872ec..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/OrderStatus.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 订单状态 - * 1-待支付 2-已支付 3-已完成 4-已退款 5-已取消 - */ -@Getter -@AllArgsConstructor -public enum OrderStatus { - - /** - * 待支付 - */ - PENDING("待支付"), // 1 - /** - * 已支付 - */ - PAID("已支付"), // 2 - /** - * 已完成 - */ - COMPLETED("已完成"), // 3 - /** - * 已退款 - */ - REFUNDED("已退款"), // 4 - /** - * 已取消 - */ - CANCELLED("已取消"); // 5 - - private final String desc; - - public static OrderStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 1 -> PENDING; - case 2 -> PAID; - case 3 -> COMPLETED; - case 4 -> REFUNDED; - case 5 -> CANCELLED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case PENDING -> 1; - case PAID -> 2; - case COMPLETED -> 3; - case REFUNDED -> 4; - case CANCELLED -> 5; - }; - } - - /** - * 数值比较用 - */ - public int getCodeValue() { - return code(); - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/ProductStatus.java b/src/main/java/com/xjhs/findmemerchant/types/ProductStatus.java deleted file mode 100644 index 4f0f015..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/ProductStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 商品状态 - * 0-下架 1-上架 - */ -@Getter -@AllArgsConstructor -public enum ProductStatus { - - /** - * 已下架 - */ - OFF_SALE("已下架"), - /** - * 已上架 - */ - ON_SALE("已上架"); - - private final String desc; - - public static ProductStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> OFF_SALE; - case 1 -> ON_SALE; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case OFF_SALE -> 0; - case ON_SALE -> 1; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/ReviewStatus.java b/src/main/java/com/xjhs/findmemerchant/types/ReviewStatus.java deleted file mode 100644 index b5fcd6d..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/ReviewStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 评价状态 - * 1-正常 0-隐藏 - */ -@Getter -@AllArgsConstructor -public enum ReviewStatus { - - /** - * 隐藏 - */ - HIDDEN("隐藏"), - /** - * 正常 - */ - NORMAL("正常"); - - private final String desc; - - public static ReviewStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> HIDDEN; - case 1 -> NORMAL; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case HIDDEN -> 0; - case NORMAL -> 1; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/SettlementStatus.java b/src/main/java/com/xjhs/findmemerchant/types/SettlementStatus.java deleted file mode 100644 index d9caf44..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/SettlementStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 结算状态 - * 0-待结算 1-已结算 - */ -@Getter -@AllArgsConstructor -public enum SettlementStatus { - - /** - * 待结算 - */ - PENDING("待结算"), - /** - * 已结算 - */ - SETTLED("已结算"); - - private final String desc; - - public static SettlementStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> PENDING; - case 1 -> SETTLED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case PENDING -> 0; - case SETTLED -> 1; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/SettlementType.java b/src/main/java/com/xjhs/findmemerchant/types/SettlementType.java deleted file mode 100644 index 43536a7..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/SettlementType.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 结算类型 - * 1-日结 2-周结 - */ -@Getter -@AllArgsConstructor -public enum SettlementType { - - /** - * 日结 - */ - DAILY("日结"), - /** - * 周结 - */ - WEEKLY("周结"); - - private final String desc; - - public static SettlementType fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 1 -> DAILY; - case 2 -> WEEKLY; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case DAILY -> 1; - case WEEKLY -> 2; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/StoreAuditStatus.java b/src/main/java/com/xjhs/findmemerchant/types/StoreAuditStatus.java deleted file mode 100644 index 1f8fe0b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/StoreAuditStatus.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 门店审核状态 - * 0-待审核 1-已通过 2-已拒绝 - */ -@Getter -@AllArgsConstructor -public enum StoreAuditStatus { - - /** - * 待审核 - */ - PENDING("待审核"), - /** - * 已通过 - */ - APPROVED("已通过"), - /** - * 已拒绝 - */ - REJECTED("已拒绝"); - - private final String desc; - - public static StoreAuditStatus fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 0 -> PENDING; - case 1 -> APPROVED; - case 2 -> REJECTED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case PENDING -> 0; - case APPROVED -> 1; - case REJECTED -> 2; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/TransactionType.java b/src/main/java/com/xjhs/findmemerchant/types/TransactionType.java deleted file mode 100644 index 50b7f86..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/TransactionType.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 钱包交易类型 - * 1-收入 2-支出 3-冻结 4-解冻 5-提现 - */ -@Getter -@AllArgsConstructor -public enum TransactionType { - - /** - * 收入 - */ - INCOME("收入"), // 1 - /** - * 支出 - */ - EXPENSE("支出"), // 2 - /** - * 冻结 - */ - FREEZE("冻结"), // 3 - /** - * 解冻 - */ - UNFREEZE("解冻"), // 4 - /** - * 提现 - */ - WITHDRAW("提现"); // 5 - - private final String desc; - - public static TransactionType fromCode(Byte code) { - if (code == null) return null; - return switch (code) { - case 1 -> INCOME; - case 2 -> EXPENSE; - case 3 -> FREEZE; - case 4 -> UNFREEZE; - case 5 -> WITHDRAW; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case INCOME -> 1; - case EXPENSE -> 2; - case FREEZE -> 3; - case UNFREEZE -> 4; - case WITHDRAW -> 5; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/types/WithdrawalStatus.java b/src/main/java/com/xjhs/findmemerchant/types/WithdrawalStatus.java deleted file mode 100644 index 400a6f1..0000000 --- a/src/main/java/com/xjhs/findmemerchant/types/WithdrawalStatus.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.xjhs.findmemerchant.types; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 提现状态 - * 0-待审核 1-处理中 2-已完成 3-已拒绝 4-已取消 - */ -@Getter -@AllArgsConstructor -public enum WithdrawalStatus { - - /** - * 待审核 - */ - PENDING("待审核"), - /** - * 处理中 - */ - PROCESSING("处理中"), - /** - * 已完成 - */ - COMPLETED("已完成"), - /** - * 已拒绝 - */ - REJECTED("已拒绝"), - /** - * 已取消 - */ - CANCELLED("已取消"); - - private final String desc; - - public static WithdrawalStatus fromCode(Byte code) { - if (code == null) return null; - - return switch (code) { - case 0 -> PENDING; - case 1 -> PROCESSING; - case 2 -> COMPLETED; - case 3 -> REJECTED; - case 4 -> CANCELLED; - default -> null; - }; - } - - public byte code() { - return switch (this) { - case PENDING -> 0; - case PROCESSING -> 1; - case COMPLETED -> 2; - case REJECTED -> 3; - case CANCELLED -> 4; - }; - } -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/auth/RegisterVo.java b/src/main/java/com/xjhs/findmemerchant/vo/auth/RegisterVo.java index c0d031c..5270338 100644 --- a/src/main/java/com/xjhs/findmemerchant/vo/auth/RegisterVo.java +++ b/src/main/java/com/xjhs/findmemerchant/vo/auth/RegisterVo.java @@ -19,6 +19,6 @@ public class RegisterVo { * 短信验证码 */ @NotBlank - @Size(max = 6, min = 6) + @Size(max = 4, min = 4) private String code; } diff --git a/src/main/java/com/xjhs/findmemerchant/vo/member/EmployeeCreateVo.java b/src/main/java/com/xjhs/findmemerchant/vo/member/EmployeeCreateVo.java deleted file mode 100644 index e412ccc..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/member/EmployeeCreateVo.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.xjhs.findmemerchant.vo.member; - -import com.xjhs.findmemerchant.common.jackson.JsonLong; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; -import lombok.Data; - -@Data -public class EmployeeCreateVo { - /** - * 员工姓名 - */ - @NotBlank(message = "name 不能为空") - @Size(min = 2, max = 50, message = "name 长度必须在 2~50 之间") - private String name; - /** - * 员工手机号 - */ - @NotBlank(message = "phone 不能为空") - @Pattern(regexp = "^\\d{11}$", message = "phone 必须是 11 位数字") - private String phone; - /** - * 角色id(前端传递请使用 string 类型) - */ - @NotNull(message = "roleId 不能为空") - @JsonLong - private Long roleId; - /** - * 角色id(前端传递请使用 string 类型) - */ - @NotNull(message = "storeId 不能为空") - @JsonLong - @Deprecated(since = "多余的") - private Long storeId; -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/member/EmployeeUpdateVo.java b/src/main/java/com/xjhs/findmemerchant/vo/member/EmployeeUpdateVo.java deleted file mode 100644 index 64bcfc2..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/member/EmployeeUpdateVo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.xjhs.findmemerchant.vo.member; - -import com.xjhs.findmemerchant.common.jackson.JsonLong; -import jakarta.validation.constraints.Size; -import lombok.Data; - -/** - * 员工更新参数 - */ -@Data -public class EmployeeUpdateVo { - /** - * 员工姓名 - */ - @Size(min = 2,max = 50) - private String name; - /** - * 员工角色(前端传递string类型) - */ - @JsonLong - private Long roleId; -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantUpdateVo.java b/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantUpdateVo.java index bb5dfde..34b917a 100644 --- a/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantUpdateVo.java +++ b/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantUpdateVo.java @@ -2,13 +2,7 @@ package com.xjhs.findmemerchant.vo.merchant; import lombok.Data; -/** - * 商家信息更新对象 - */ @Data public class MerchantUpdateVo { - /** - * 真实姓名 - */ - private String realName; + } diff --git a/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantVerifyVo.java b/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantVerifyVo.java deleted file mode 100644 index 22ed468..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/merchant/MerchantVerifyVo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.vo.merchant; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; - -/** - * 商家验证参数 - */ -@Data -public class MerchantVerifyVo { - /** - * 身份证号 - */ - @NotBlank - @Size(min = 18, max = 18) - private String idCardNo; - /** - * 真实姓名 - */ - @NotBlank - @Size(min = 2, max = 50) - private String realName; -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/store/BusinessPeriodVo.java b/src/main/java/com/xjhs/findmemerchant/vo/store/BusinessPeriodVo.java deleted file mode 100644 index e6fc08b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/store/BusinessPeriodVo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.xjhs.findmemerchant.vo.store; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; - -@Data -public class BusinessPeriodVo { - /** - * 周几,周天0,... - */ - @Size(max = 6) - @NotNull - private Integer dayOfWeek; - /** - * 开始营业时间 HH:mm 格式 - */ - @NotBlank - private String startTime; - /** - * 结束营业时间 HH:mm 格式 - */ - @NotBlank - private String endTime; - /** - * 是否启用 - */ - private Boolean enabled; -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/store/StoreBusinessStatusUpdateVo.java b/src/main/java/com/xjhs/findmemerchant/vo/store/StoreBusinessStatusUpdateVo.java deleted file mode 100644 index 459133b..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/store/StoreBusinessStatusUpdateVo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xjhs.findmemerchant.vo.store; - -import com.xjhs.findmemerchant.types.BusinessStatus; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Data -public class StoreBusinessStatusUpdateVo { - /** - * 营业状态 - */ - @NotNull - private BusinessStatus businessStatus; - - /** - * 临时关闭原因(可选;temp_closed 时使用) - */ - private String reason; - - /** - * 重新营业时间(RFC3339 字符串,可选) - */ - private String until; -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/store/StoreCreateVo.java b/src/main/java/com/xjhs/findmemerchant/vo/store/StoreCreateVo.java deleted file mode 100644 index 4bc7741..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/store/StoreCreateVo.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.xjhs.findmemerchant.vo.store; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; - -/** - * 创建门店参数 - */ -@Data -public class StoreCreateVo { - /** - * 门店名称 - */ - @NotBlank - @Size(min = 2, max = 100) - private String name; - /** - * 门店logo - */ - private String logo; - /** - * 联系电话 - */ - @NotBlank - @Size(min = 11, max = 11) - private String phone; - /** - * 省份 - */ - @NotBlank - @Size(max = 50) - private String province; - /** - * 市 - */ - @NotBlank - @Size(max = 50) - private String city; - /** - * 街道 - */ - @NotBlank - @Size(max = 50) - private String district; - /** - * 地址 - */ - @NotBlank - @Size(max = 200) - private String address; - /** - * 营业时间 - */ - private String businessHours; - -} diff --git a/src/main/java/com/xjhs/findmemerchant/vo/store/StoreUpdateVo.java b/src/main/java/com/xjhs/findmemerchant/vo/store/StoreUpdateVo.java deleted file mode 100644 index 97ad487..0000000 --- a/src/main/java/com/xjhs/findmemerchant/vo/store/StoreUpdateVo.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.xjhs.findmemerchant.vo.store; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import lombok.Data; - -/** - * 门店更新参数 - */ -@Data -public class StoreUpdateVo { - /** - * 门店名称 - */ - @NotBlank - @Size(max = 100, message = "name长度不能超过100") - private String name; - /** - * 门店logo - */ - @Size(max = 255, message = "logo长度不能超过255") - private String logo; - - /** - * 联系电话 - */ - // @Pattern(regexp = "^(\\+\\d{1,3})?\\d{6,20}$", message = "phone格式不正确") - @NotBlank - @Size(min = 11, max = 11) - private String phone; - /** - * 省 - */ - @NotBlank - @Size(max = 50, message = "province长度不能超过50") - private String province; - /** - * 市 - */ - @NotBlank - @Size(max = 50, message = "city长度不能超过50") - private String city; - /** - * 区 - */ - @NotBlank - @Size(max = 50, message = "district长度不能超过50") - private String district; - /** - * 地址 - */ - @NotBlank - @Size(max = 255, message = "address长度不能超过255") - private String address; - /** - * 营业时间 - */ - @Size(max = 100, message = "businessHours长度不能超过100") - private String businessHours; - - /** - * 验证码(先按常见4~8位数字) - */ - @NotBlank - private String phoneVerifyCode; -} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 074d7f7..0000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,14 +0,0 @@ - -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.1.20:3306/findme-merchant?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: root - password: 123456 - data: - redis: - host: 192.168.1.20 - port: 6379 - password: 123456 - database: 0 - timeout: 3s \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8c6d574..83feb8c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: default,local + active: default application: name: findme-backend-merchant main: @@ -21,13 +21,30 @@ spring: format_sql: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://${MYSQL_HOST:192.168.1.20}:${MYSQL_PORT:3306}/findme-merchant?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + url: jdbc:mysql://${MYSQL_HOST:8.137.94.92}:${MYSQL_PORT:23306}/findme-merchant?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: ${MYSQL_USER:root} - password: ${MYSQL_PASS:123456} + password: ${MYSQL_PASS:pW2CwlHte3%^#y8Z} data: redis: - host: ${REDIS_HOST:192.168.1.20} - port: ${REDIS_PORT:6379} - password: ${REDIS_PASS:123456} + host: ${REDIS_HOST:8.137.94.92} + port: ${REDIS_PORT:26379} + password: ${REDIS_PASS:9Hii(AaVzTNY<%e} database: 0 - timeout: 3s \ No newline at end of file + timeout: 3s + +appconfig: + saveFileRoot: ${SAVE_FILE_ROOT:./file-data} + amapKey: ${AMAP_KEY:c618de6e686c43095a8593db836c7de2} + tencentSms: + sdkAppId: ${SMS_SDKAPP_ID:1401031336} + templateId: ${SMS_TEMPLATE_ID:2512787} + signName: ${SMS_SIGN_NAME:新疆火烁智能科技} + secretId: ${SMS_SECRET_ID:AKIDWyGMFwQinhPFzXt54rTuAD5kEYheOyOd} + secretKey: ${SMS_SECRET_KEY:62mLjvwmQs9GAsQ5f6LQ7umgWCgy31sX} + tencentCos: + secretId: ${COS_SECRET_ID:AKIDWyGMFwQinhPFzXt54rTuAD5kEYheOyOd} + secretKey: ${COS_SECRET_KEY:62mLjvwmQs9GAsQ5f6LQ7umgWCgy31sX} + appId: ${COS_APP_ID:1375214531} + bucketName: ${COS_APP_BUCKET:merchant-1375214531} + +