4 Commits

Author SHA1 Message Date
0f922d6978 test方法 移除 2025-09-11 16:28:15 +08:00
01bf1d6500 pom缺少 2025-09-11 16:23:57 +08:00
35d257bc56 分享相关代码 注释掉
优惠券 管理端重写 使用的地方 注释
2025-09-11 16:10:38 +08:00
65ba0e18ce 原作废代码 删除 2025-09-11 13:44:28 +08:00
36 changed files with 1498 additions and 1355 deletions

View File

@@ -1,86 +0,0 @@
package com.czg.controller.admin;
import com.czg.account.dto.ShopActivateDTO;
import com.czg.account.service.ShopActivateService;
import com.czg.annotation.SaAdminCheckPermission;
import com.czg.config.RedisCst;
import com.czg.exception.CzgException;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.service.RedisService;
import com.czg.service.account.util.WechatAuthUtil;
import jakarta.annotation.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 店铺充值活动管理
*
* @author ww
* @description
*/
@RestController
@RequestMapping("/admin/activate")
public class ShopActivateController {
@Resource
private ShopActivateService shopActivateService;
@Resource
private RedisService redisService;
@Resource
private WechatAuthUtil wechatUtil;
/**
* 店铺充值活动列表
* 权限标识: activate:list
*/
@SaAdminCheckPermission(value = "activate:list", name = "店铺充值活动列表")
@GetMapping
public CzgResult<List<ShopActivateDTO>> detail(@RequestParam(required = false) Long shopId) {
return CzgResult.success(shopActivateService.getList(shopId));
}
/**
* 店铺充值活动新增
* 权限标识: activate:add
*/
@SaAdminCheckPermission(value = "activate:add", name = "店铺充值活动新增")
@PostMapping
public CzgResult<Boolean> add(@RequestBody @Validated ShopActivateDTO activateDTO) {
activateDTO.setShopId(StpKit.USER.getShopId());
return CzgResult.success(shopActivateService.add(activateDTO));
}
/**
* 店铺充值活动修改
* 权限标识: activate:edit
*/
@SaAdminCheckPermission(value = "activate:edit", name = "店铺充值活动修改")
@PutMapping
public CzgResult<Boolean> edit(@RequestBody @Validated ShopActivateDTO activateDTO) {
return CzgResult.success(shopActivateService.edit(activateDTO));
}
/**
* 获取会员码
* @param params shopId 必填
* env_version 存在即生成体验版
*/
@PostMapping("/getVipCode")
public CzgResult<Object> getVipCode(@RequestBody Map<String, Object> params) throws Exception {
if (CollectionUtils.isEmpty(params) || !params.containsKey("shopId")) {
throw new CzgException("参数错误");
}
String redisKey = RedisCst.SHOP_VIP_CODE + params.get("shopId");
if (redisService.hasKey(redisKey)) {
return CzgResult.success(redisService.get(redisKey));
}
return CzgResult.success(wechatUtil.getFetchQrCode(params));
}
}

View File

@@ -1,86 +0,0 @@
package com.czg.controller.admin;
import com.czg.account.dto.QueryReceiveDto;
import com.czg.account.dto.ShopCouponDTO;
import com.czg.account.service.ShopCouponService;
import com.czg.account.vo.CouponReceiveVo;
import com.czg.account.vo.UserCouponVo;
import com.czg.annotation.SaAdminCheckPermission;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 店铺优惠券
*
* @author ww
* @description
*/
@RestController
@RequestMapping("/admin/coupon")
public class ShopCouponController {
@Resource
private ShopCouponService couponService;
/**
* 店铺优惠券列表
* 权限标识: coupon:list
* 状态 0 未使用 1已使用 2已过期
*/
@SaAdminCheckPermission(value = "coupon:list", name = "优惠券列表")
@GetMapping
public CzgResult<List<ShopCouponDTO>> detail(@RequestParam(required = false) Integer type,
@RequestParam(required = false) Integer status) {
return CzgResult.success(couponService.getList(StpKit.USER.getShopId(), type, status));
}
/**
* 店铺优惠券新增
* 权限标识: coupon:add
*/
@SaAdminCheckPermission(value = "coupon:add", name = "优惠券添加")
@PostMapping
public CzgResult<Boolean> add(@RequestBody @Validated ShopCouponDTO couponDTO) {
couponDTO.setShopId(StpKit.USER.getShopId());
return CzgResult.success(couponService.add(couponDTO));
}
/**
* 店铺优惠券修改
* 权限标识: coupon:edit
*/
@SaAdminCheckPermission(value = "coupon:edit", name = "优惠券修改")
@PutMapping
public CzgResult<Boolean> edit(@RequestBody @Validated ShopCouponDTO couponDTO) {
couponDTO.setShopId(StpKit.USER.getShopId());
return CzgResult.success(couponService.edit(couponDTO));
}
/**
* 店铺优惠券获取记录
* 权限标识: coupon:delete
*/
@SaAdminCheckPermission(value = "coupon:queryReceive", name = "优惠券领取记录")
@GetMapping("/queryReceive")
public CzgResult<Page<CouponReceiveVo>> queryReceive(@Validated QueryReceiveDto param) {
return CzgResult.success(couponService.queryReceive(param));
}
/**
* 生成订单后使用
* 通过用户Id 查找优惠券
*
* @param shopUserId 店铺用户Id
*/
@GetMapping("/findCoupon")
public CzgResult<List<UserCouponVo>> findCoupon(@RequestParam Long shopUserId, @RequestParam(required = false) Integer type) {
return CzgResult.success(couponService.findCoupon(StpKit.USER.getShopId(), shopUserId, type));
}
}

View File

@@ -1,54 +1,54 @@
package com.czg.controller.admin; //package com.czg.controller.admin;
//
import com.czg.account.dto.ShopShareDTO; //import com.czg.account.dto.ShopShareDTO;
import com.czg.account.service.ShopShareService; //import com.czg.account.service.ShopShareService;
import com.czg.account.vo.ShopShareRecordVO; //import com.czg.account.vo.ShopShareRecordVO;
import com.czg.account.vo.ShopShareVO; //import com.czg.account.vo.ShopShareVO;
import com.czg.annotation.SaAdminCheckPermission; //import com.czg.annotation.SaAdminCheckPermission;
import com.czg.resp.CzgResult; //import com.czg.resp.CzgResult;
import com.czg.sa.StpKit; //import com.czg.sa.StpKit;
import com.mybatisflex.core.paginate.Page; //import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource; //import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; //import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; //import org.springframework.web.bind.annotation.*;
//
/** ///**
* 小程序分享奖励管理 // * 小程序分享奖励管理
* @author Administrator // * @author Administrator
*/ // */
@RestController //@RestController
@RequestMapping("/admin/shopShare") //@RequestMapping("/admin/shopShare")
public class ShopShareController { //public class ShopShareController {
@Resource // @Resource
private ShopShareService shopShareService; // private ShopShareService shopShareService;
//
/** // /**
* 获取分享奖励配置 // * 获取分享奖励配置
*/ // */
@SaAdminCheckPermission(value = "shopShare:list", name = "分享好友信息") // @SaAdminCheckPermission(value = "shopShare:list", name = "分享好友信息")
@GetMapping // @GetMapping
public CzgResult<ShopShareVO> get() { // public CzgResult<ShopShareVO> get() {
return CzgResult.success(shopShareService.get(StpKit.USER.getShopId())); // return CzgResult.success(shopShareService.get(StpKit.USER.getShopId()));
} // }
//
/** // /**
* 修改分享奖励配置 // * 修改分享奖励配置
*/ // */
@SaAdminCheckPermission(value = "shopShare:add", name = "分享好友信息添加") // @SaAdminCheckPermission(value = "shopShare:add", name = "分享好友信息添加")
@PostMapping // @PostMapping
public CzgResult<Boolean> add(@RequestBody @Validated ShopShareDTO shopShareDTO) { // public CzgResult<Boolean> add(@RequestBody @Validated ShopShareDTO shopShareDTO) {
return CzgResult.success(shopShareService.add(StpKit.USER.getShopId(), shopShareDTO)); // return CzgResult.success(shopShareService.add(StpKit.USER.getShopId(), shopShareDTO));
} // }
//
/** // /**
* 分享奖励记录 // * 分享奖励记录
* @param key 邀请人/被邀请人手机号或昵称 // * @param key 邀请人/被邀请人手机号或昵称
* @param status 0 非新用户 1 未领取 2 已领取 3 已使用 不传递为全部 // * @param status 0 非新用户 1 未领取 2 已领取 3 已使用 不传递为全部
* @return 分页数据 // * @return 分页数据
*/ // */
@SaAdminCheckPermission(value = "shopShare:record", name = "分享邀请记录") // @SaAdminCheckPermission(value = "shopShare:record", name = "分享邀请记录")
@GetMapping("/record") // @GetMapping("/record")
public CzgResult<Page<ShopShareRecordVO>> record(String key, Integer status) { // public CzgResult<Page<ShopShareRecordVO>> record(String key, Integer status) {
return CzgResult.success(shopShareService.recordPage(StpKit.USER.getShopId(), key, status)); // return CzgResult.success(shopShareService.recordPage(StpKit.USER.getShopId(), key, status));
} // }
} //}

View File

@@ -1,33 +0,0 @@
package com.czg.controller.user;
import com.czg.account.dto.ShopActivateDTO;
import com.czg.account.service.ShopActivateService;
import com.czg.resp.CzgResult;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 用户店铺充值活动管理
*
* @author ww
*/
@RestController
@RequestMapping("/user/activate")
public class UserShopActivateController {
@Resource
private ShopActivateService shopActivateService;
/**
* 店铺充值活动列表
*/
@GetMapping
public CzgResult<List<ShopActivateDTO>> detail(@RequestParam(required = false) Long shopId) {
return CzgResult.success(shopActivateService.getList(shopId));
}
}

View File

@@ -1,51 +0,0 @@
package com.czg.controller.user;
import com.czg.account.entity.ShopActivateCouponRecord;
import com.czg.account.service.ShopCouponService;
import com.czg.account.vo.UserCouponVo;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.utils.AssertUtil;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 店铺优惠券
*
* @author ww
* @description
*/
@RestController
@RequestMapping("/user/coupon")
public class UserShopCouponController {
@Resource
private ShopCouponService couponService;
/**
* 通过用户Id 查找优惠券
*
* @param status 0 未使用 1已使用 2已过期
*/
@GetMapping("/findByUserId")
public CzgResult<Page<ShopActivateCouponRecord>> findByUserId(
@RequestParam(required = false) Integer status,
@RequestParam(required = false) Long shopId) {
return CzgResult.success(couponService.find(StpKit.USER.getLoginIdAsLong(), shopId, status));
}
/**
* 生成订单后使用
* 通过用户Id 查找优惠券
*
* @param shopUserId 店铺用户Id
*/
@GetMapping("/findCoupon")
public CzgResult<List<UserCouponVo>> findCoupon(@RequestHeader String shopId, @RequestParam Long shopUserId, @RequestParam(required = false) Integer type) {
AssertUtil.isBlank(shopId, "店铺Id不能为空");
return CzgResult.success(couponService.findCoupon(Long.parseLong(shopId), shopUserId, type));
}
}

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.czg</groupId>
<artifactId>cash-api</artifactId>
<version>1.0.0</version>
</parent>
<name>营销相关API</name>
<description>营销相关API</description>
<artifactId>market-server</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.czg</groupId>
<artifactId>cash-common-log</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.czg</groupId>
<artifactId>market-service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,25 @@
package com.czg;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author ww
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableTransactionManagement
@MapperScan("com.czg.service.market.mapper")
@EnableDubbo
@Slf4j
public class MarketApplication {
public static void main(String[] args) {
SpringApplication.run(MarketApplication.class, args);
}
}

View File

@@ -0,0 +1,107 @@
package com.czg.controller.admin;
import cn.hutool.core.thread.ThreadUtil;
import com.czg.annotation.SaAdminCheckPermission;
import com.czg.log.annotation.OperationLog;
import com.czg.market.dto.ShopCouponDTO;
import com.czg.market.service.ShopCouponService;
import com.czg.product.service.ShopSyncService;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.utils.AssertUtil;
import com.czg.validator.group.DefaultGroup;
import com.czg.validator.group.InsertGroup;
import com.czg.validator.group.UpdateGroup;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 优惠券
*
* @author ww
*/
@RestController
@RequestMapping("/admin/coupon")
public class ACouponController {
@Resource
private ShopCouponService shopCouponService;
@DubboReference
private ShopSyncService shopSyncService;
/**
* 分页
*/
@GetMapping("page")
@OperationLog("优惠券列表-分页")
@SaAdminCheckPermission("coupon:page")
public CzgResult<Page<ShopCouponDTO>> getCouponPage(ShopCouponDTO param) {
Page<ShopCouponDTO> data = shopCouponService.getCouponPage(param);
return CzgResult.success(data);
}
/**
* 详情
*
* @param id 分组id
*/
@GetMapping("{id}")
@OperationLog("优惠券-详情")
@SaAdminCheckPermission("coupon:info")
public CzgResult<ShopCouponDTO> getCouponById(@PathVariable("id") Long id) {
AssertUtil.isNull(id, "{}不能为空", "id");
ShopCouponDTO data = shopCouponService.getCouponById(id);
return CzgResult.success(data);
}
/**
* 新增
*/
@PostMapping
@OperationLog("优惠券-新增")
@SaAdminCheckPermission("coupon:add")
public CzgResult<Void> addCoupon(@RequestBody @Validated({InsertGroup.class, DefaultGroup.class}) ShopCouponDTO dto) {
Long shopId = StpKit.USER.getShopId(0L);
dto.setShopId(shopId);
shopCouponService.addCoupon(dto);
asyncToBranchShop(dto.getId(),1);
return CzgResult.success();
}
/**
* 修改
*/
@PutMapping
@OperationLog("优惠券-修改")
@SaAdminCheckPermission("coupon:update")
public CzgResult<Void> updateCoupon(@RequestBody @Validated({UpdateGroup.class, DefaultGroup.class}) ShopCouponDTO dto) {
Long shopId = StpKit.USER.getShopId(0L);
dto.setShopId(shopId);
shopCouponService.updateCouponById(dto);
asyncToBranchShop(dto.getId(),2);
return CzgResult.success();
}
/**
* 删除
*/
@DeleteMapping("{id}")
@OperationLog("优惠券-删除")
@SaAdminCheckPermission("prodGroup:delete")
public CzgResult<Void> deleteCoupon(@PathVariable("id") Long id) {
AssertUtil.isNull(id, "{}不能为空", "id");
shopCouponService.deleteCoupon(id);
asyncToBranchShop(id,3);
return CzgResult.success();
}
private void asyncToBranchShop(Long id,Integer type) {
long shopId = StpKit.USER.getShopId(0L);
ThreadUtil.execAsync(() -> {
shopSyncService.syncCouponBySourceShop(shopId, id,type);
});
}
}

View File

@@ -0,0 +1,56 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.31:3306/czg_cashier?useUnicode=true&characterEncoding=utf-8
username: root
password: Chaozg123.
data:
redis:
host: 192.168.1.31
port: 6379
password: Chaozg123.
timeout: 1000
database: 0
lettuce:
pool:
min-idle: 0
max-idle: 8
max-wait: -1ms
max-active: 16
cloud:
nacos:
discovery:
server-addr: 121.40.109.122:8848
namespace: 237e1905-0a66-4375-9bb6-a51c3c034aca
rabbitmq:
host: 121.40.109.122
port: 5672
username: chaozg
password: chaozg123
dubbo:
application:
name: product-server
qos-port: 22261
qos-enable: true
registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-dev
protocol:
port: 10601
threads: 20
name: dubbo
serialization: hessian2
seata:
application-id: market-server
tx-service-group: group_seata
config:
type: nacos
nacos:
server-addr: 121.40.109.122:8848
namespace:
group: group_seata

View File

@@ -0,0 +1,50 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-bp1b572nblln4jho2.mysql.rds.aliyuncs.com:3306/czg_cashier?useUnicode=true&characterEncoding=utf-8
username: root
password: Czg666888
data:
redis:
host: 121.40.109.122
port: 6379
password: chaozg123
timeout: 1000
database: 3
cloud:
nacos:
discovery:
server-addr: 121.40.109.122:8848
namespace: 237e1905-0a66-4375-9bb6-a51c3c034aca
rabbitmq:
host: 121.40.109.122
port: 5672
username: chaozg
password: chaozg123
dubbo:
application:
name: product-server
qos-port: 22263
qos-enable: true
registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-prod
protocol:
port: 10603
threads: 20
name: dubbo
serialization: hessian2
seata:
application-id: market-server
tx-service-group: group_seata
config:
type: nacos
nacos:
server-addr: 121.40.109.122:8848
namespace:
group: group_seata

View File

@@ -0,0 +1,50 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/czg_cashier?useUnicode=true&characterEncoding=utf-8
username: cashier
password: Cashier@1@
data:
redis:
host: 121.40.109.122
port: 6379
password: chaozg123
timeout: 1000
database: 2
cloud:
nacos:
discovery:
server-addr: 121.40.109.122:8848
namespace: 237e1905-0a66-4375-9bb6-a51c3c034aca
rabbitmq:
host: 121.40.109.122
port: 5672
username: chaozg
password: chaozg123
dubbo:
application:
name: product-server
qos-port: 22262
qos-enable: true
registry:
address: nacos://121.40.109.122:8848 # Nacos 服务地址
group: server-test
protocol:
port: 10602
threads: 20
name: dubbo
serialization: hessian2
seata:
application-id: market-server
tx-service-group: group_seata
config:
type: nacos
nacos:
server-addr: 121.40.109.122:8848
namespace:
group: group_seata

View File

@@ -0,0 +1,34 @@
server:
port: 9500
spring:
application:
name: market-server
profiles:
active: dev
include: tools
wx:
ysk:
appId: wx212769170d2c6b2a
secrete: 8492a7e8d55bbb1b57f5c8276ea1add0
operationMsgTmpId: wFdoUG-dUT7bDRHq8bMJD9CF5TjyH9x_uJQgQByZqHg
warnMsgTmpId: C08OUr80x6wGmUN1zpFhSQ3Sv7VF5vksdZigiEx2pD0
logging:
config: classpath:logback.xml
# MyBatis-Flex
mybatis-flex:
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
pagehelper:
helper-dialect: mysql
support-methods-arguments: true
dubbo:
consumer:
check: false

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<contextName>market-server</contextName>
<property name="log.charset" value="utf-8" />
<property name="log.pattern" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg%n" />
<!--写入文件格式-->
<property name="p_file" value="%d | [%thread] %-5level %c [%L] - %msg %n"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!--按天生成日志-->
<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/market/logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--生成日志文件名称-->
<fileNamePattern>logs/product/history/%d{yyyy-MM-dd}/logback.%i.log.gz</fileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<maxFileSize>20MB</maxFileSize>
</rollingPolicy>
<!-- 日志输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${p_file}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--普通日志输出到控制台-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="logFile"/>
</root>
</configuration>

View File

@@ -1,71 +0,0 @@
package com.czg.account.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import com.czg.account.entity.ShopCoupon;
import com.czg.validator.group.InsertGroup;
import com.czg.validator.group.UpdateGroup;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 活动 实体类。
*
* @author ww
* @since 2025-02-20
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShopActivateDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@NotNull(message = "主键不能为空", groups = {UpdateGroup.class})
private Long id;
private Long shopId;
/**
* 充值金额
*/
@NotNull(message = "充值金额不能为空", groups = {InsertGroup.class, UpdateGroup.class})
private BigDecimal amount;
/**
* 赠送金额
*/
private BigDecimal giftAmount;
/**
* 赠送积分
*/
private Integer giftPoints;
/**
* 是否赠送优惠卷 0否 1是
*/
private Integer isGiftCoupon;
private List<ShopCoupon> couponList;
private String coupons;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -1,146 +0,0 @@
package com.czg.account.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 优惠券 实体类。
*
* @author ww
* @since 2025-02-17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShopCouponDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增
*/
private Long id;
/**
* 状态0-关闭 1 正常
*/
private Integer status;
/**
* 名称(无意义)
*/
private String title;
private Long shopId;
/**
* 已使用数量
*/
private Integer useNumber;
/**
* 发放数量
*/
private Integer number;
/**
* 剩余数量
*/
private Integer leftNumber;
/**
* 有效期类型,可选值为 fixed固定时间/custom自定义时间
*/
private String validityType;
/**
* 有效天数
*/
private Integer validDays;
/**
* 隔多少天生效
*/
private Integer daysToTakeEffect;
/**
* 有效开始时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validStartTime;
/**
* 有效结束时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validEndTime;
/**
* 周 数组["周一","周二"]
*/
private String userDays;
/**
* all-全时段 custom-指定时段
*/
private String useTimeType;
/**
* 可用开始时间
*/
private String useStartTime;
/**
* 可用结束时间
*/
private String useEndTime;
/**
* 1-满减 2-商品
*/
private Integer type;
/**
* 满多少金额
*/
private BigDecimal fullAmount;
/**
* 减多少金额
*/
private BigDecimal discountAmount;
/**
* 商品id
*/
private Long proId;
private String proName;
/**
* 描述
*/
private String description;
/**
* 发放人
*/
private String editor;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -1,51 +0,0 @@
package com.czg.account.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 活动赠送商品表 实体类。
*
* @author ww
* @since 2025-02-18
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShopCouponProductDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long id;
/**
* 活动Id
*/
private Long couponId;
/**
* 商品id
*/
private Long productId;
/**
* 数量
*/
private Integer num;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -1,148 +0,0 @@
package com.czg.account.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serial;
import java.time.LocalTime;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 优惠券 实体类。
*
* @author ww
* @since 2025-02-20
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_shop_coupon")
public class ShopCoupon implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增
*/
@Id(keyType = KeyType.Auto)
private Long id;
private Long shopId;
/**
* 名称(无意义)
*/
private String title;
/**
* 1-满减 2-商品
*/
private Integer type;
/**
* 状态0-关闭 1 正常
*/
private Integer status;
/**
* 已使用数量
*/
private Integer useNumber;
/**
* 发放数量
*/
private Integer number;
/**
* 剩余数量
*/
private Integer leftNumber;
/**
* 有效期类型,可选值为 fixed固定时间/custom自定义时间
*/
private String validityType;
/**
* 有效天数
*/
private Integer validDays;
/**
* 隔多少天生效
*/
private Integer daysToTakeEffect;
/**
* 有效开始时间
*/
private LocalDateTime validStartTime;
/**
* 有效结束时间
*/
private LocalDateTime validEndTime;
/**
* 周 数组["周一","周二"]
*/
private String userDays;
/**
* all-全时段 custom-指定时段
*/
private String useTimeType;
/**
* 可用开始时间
*/
private LocalTime useStartTime;
/**
* 可用结束时间
*/
private LocalTime useEndTime;
/**
* 满多少金额
*/
private BigDecimal fullAmount;
/**
* 减多少金额
*/
private BigDecimal discountAmount;
/**
* 商品id
*/
private Long proId;
/**
* 描述
*/
private String description;
/**
* 发放人
*/
private String editor;
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
}

View File

@@ -1,35 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.ShopActivateDTO;
import com.czg.account.entity.ShopActivate;
import com.czg.account.entity.ShopUser;
import com.mybatisflex.core.service.IService;
import java.math.BigDecimal;
import java.util.List;
/**
* 活动 服务层。
*
* @author ww
* @since 2025-02-17
*/
public interface ShopActivateService extends IService<ShopActivate> {
List<ShopActivateDTO> getList(Long shopId);
Boolean add(ShopActivateDTO activateDTO);
Boolean edit(ShopActivateDTO activateDTO);
/**
* @param memAmount 充值金额
* @param activateId 参加活动Id
* @param relationId 关联Id
* 霸王餐时 订单id
* 充值奖励 的关联id 是tb_shop_user_flow的充值 记录id
* 支付/退款 tb_order_payment.id
*/
void giveActivate(ShopUser shopUser, BigDecimal memAmount, Long activateId, Long relationId);
}

View File

@@ -1,47 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.QueryReceiveDto;
import com.czg.account.dto.ShopCouponDTO;
import com.czg.account.entity.ShopActivateCouponRecord;
import com.czg.account.entity.ShopCoupon;
import com.czg.account.vo.CouponReceiveVo;
import com.czg.account.vo.UserCouponVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.util.List;
/**
* 优惠券 服务层。
*
* @author ww
* @since 2025-02-17
*/
public interface ShopCouponService extends IService<ShopCoupon> {
/**
* 优惠券列表
*
* @param shopId 店铺id
* @param type 1-满减 2-商品
* @param status 状态 0 未使用 1已使用 -1已过期
*/
List<ShopCouponDTO> getList(Long shopId, Integer type, Integer status);
Boolean add(ShopCouponDTO couponDTO);
Boolean edit(ShopCouponDTO couponDTO);
Page<CouponReceiveVo> queryReceive(QueryReceiveDto param);
Page<ShopActivateCouponRecord> find(Long userId,Long shopId, Integer status);
List<UserCouponVo> findCoupon(Long shopId, Long shopUserId, Integer type);
Boolean use(List<Long> ids, Long shopUserId, Long orderId);
Boolean refund(Long orderId, Long shopUserId);
}

View File

@@ -1,23 +1,23 @@
package com.czg.account.service; //package com.czg.account.service;
//
import com.czg.account.dto.ShopShareDTO; //import com.czg.account.dto.ShopShareDTO;
import com.czg.account.vo.ShopShareRecordVO; //import com.czg.account.vo.ShopShareRecordVO;
import com.czg.account.vo.ShopShareVO; //import com.czg.account.vo.ShopShareVO;
import com.mybatisflex.core.paginate.Page; //import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService; //import com.mybatisflex.core.service.IService;
import com.czg.account.entity.ShopShare; //import com.czg.account.entity.ShopShare;
//
/** ///**
* 店铺分享 服务层。 // * 店铺分享 服务层。
* // *
* @author zs // * @author zs
* @since 2025-03-05 // * @since 2025-03-05
*/ // */
public interface ShopShareService extends IService<ShopShare> { //public interface ShopShareService extends IService<ShopShare> {
//
ShopShareVO get(Long shopId); // ShopShareVO get(Long shopId);
//
Boolean add(Long shopId, ShopShareDTO shopShareDTO); // Boolean add(Long shopId, ShopShareDTO shopShareDTO);
//
Page<ShopShareRecordVO> recordPage(Long shopId, String key, Integer status); // Page<ShopShareRecordVO> recordPage(Long shopId, String key, Integer status);
} //}

View File

@@ -0,0 +1,285 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Time;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import java.io.Serial;
import java.util.Objects;
import com.czg.validator.group.DefaultGroup;
import com.czg.validator.group.InsertGroup;
import com.czg.validator.group.UpdateGroup;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 优惠券信息表 实体类。
*
* @author ww
* @since 2025-09-11
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShopCouponDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@Null(message = "ID必须为空", groups = InsertGroup.class)
@NotNull(message = "ID不能为空", groups = UpdateGroup.class)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 同步Id
*/
private Long syncId;
/**
* 优惠券类型1-满减券2-商品兑换券3-折扣券4-第二件半价券5-消费送券6-买一送一券7-固定价格券8-免配送费券
*/
private Integer couponType;
/**
* 券名称
*/
@NotBlank(message = "券名称不能为空", groups = {InsertGroup.class, UpdateGroup.class})
private String title;
/**
* 可用门店类型all-所有门店custom-指定门店
*/
private String useShopType;
/**
* 可用门店
*/
private String useShops;
/**
* 可使用类型:堂食/自取/配送/快递
*/
private String useType;
/**
* 有效期类型fixed固定时间custom自定义时间
*/
@NotBlank(message = "有效期类型不能为空" ,groups = {InsertGroup.class, UpdateGroup.class})
private String validType;
/**
* 有效期(天)
*/
private Integer validDays;
/**
* 有效期开始时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validStartTime;
/**
* 有效期结束时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validEndTime;
/**
* 隔天生效
*/
private Integer daysToTakeEffect;
/**
* 可用周期,如:周一,周二,周三,周四,周五,周六,周七
*/
private String useDays;
/**
* 可用时间段类型all-全时段custom-指定时段
*/
@NotBlank(message = "可用时间段类型不能为空" ,groups = {InsertGroup.class, UpdateGroup.class})
private String useTimeType;
/**
* 可用开始时间
*/
private Time useStartTime;
/**
* 可用结束时间
*/
private Time useEndTime;
/**
* 发放设置:不可自行领取/no可领取/yes
*/
@NotBlank(message = "发放设置不能为空" ,groups = {InsertGroup.class, UpdateGroup.class})
private String getType;
/**
* 用户领取方式
*/
private String getMode;
/**
* 总发放数量,-10086为不限量
*/
private Integer giveNum;
/**
* 可领取用户:全部/all新用户一次/new仅会员/vip
*/
@NotBlank(message = "可领取用户不能为空" ,groups = {InsertGroup.class, UpdateGroup.class})
private String getUserType;
/**
* 每人领取限量,-10086为不限量
*/
private Integer getLimit;
/**
* 每人每日使用限量,-10086为不限量
*/
private Integer useLimit;
/**
* 与限时折扣同享0-否1-是
*/
private Integer discountShare;
/**
* 与会员价同享0-否1-是
*/
private Integer vipPriceShare;
/**
* 附加规则说明
*/
private String ruleDetails;
/**
* 状态0-禁用1-启用
*/
private Integer status;
/**
* 已使用数量
*/
private Integer useNum;
/**
* 剩余数量
*/
private Integer leftNum;
/**
* 指定门槛商品
*/
private String foods;
/**
* 使用门槛:满多少金额
*/
private BigDecimal fullAmount;
/**
* 使用门槛:减多少金额
*/
private BigDecimal discountAmount;
/**
* 折扣%
*/
private Integer discountRate;
/**
* 可抵扣最大金额 元
*/
private BigDecimal maxDiscountAmount;
/**
* 使用规则price_asc-价格低到高price_desc-高到低
*/
private String useRule;
/**
* 抵扣数量
*/
private Integer discountNum;
/**
* 与其它优惠共享0-否1-是
*/
private Integer otherCouponShare;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 根据优惠券类型执行不同的校验规则
*/
@AssertTrue(message = "优惠券参数校验失败", groups = {InsertGroup.class, UpdateGroup.class})
public boolean validateByCouponType() {
// 确保优惠券类型不为空(虽然已有@NotNull注解但这里做双重保障
if (couponType == null) {
return false;
}
// 满减券(1)校验
if (couponType == 1) {
// 校验指定门槛商品不为空且不为空字符串
// if (foods == null || foods.trim().isEmpty()) {
// return false;
// }
// 校验满多少和减多少金额
return fullAmount != null && discountAmount != null;
}
// 折扣券(3)校验
if (couponType == 3) {
// 校验折扣率、满多少可用和最大抵扣金额
return discountRate != null && discountRate > 0 && discountRate <= 100
&& fullAmount != null && maxDiscountAmount != null;
}
// 第二件半价券(4)、买一送一券(6)、商品兑换券(2)校验
if (couponType == 2 || couponType == 4 || couponType == 6) {
// 校验可用商品不为空且不为空字符串
if (foods == null || foods.trim().isEmpty()) {
return false;
}
// 校验使用规则不为空
return useRule != null && !useRule.trim().isEmpty();
}
// 其他类型优惠券暂不做特殊校验返回true
return true;
}
}

View File

@@ -0,0 +1,233 @@
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Time;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 优惠券信息表 实体类。
*
* @author ww
* @since 2025-09-11
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_shop_coupon")
public class ShopCoupon implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 同步Id
*/
private Long syncId;
/**
* 优惠券类型1-满减券2-商品兑换券3-折扣券4-第二件半价券5-消费送券6-买一送一券7-固定价格券8-免配送费券
*/
private Integer couponType;
/**
* 券名称
*/
private String title;
/**
* 可用门店类型all-所有门店custom-指定门店
*/
private String useShopType;
/**
* 可用门店
*/
private String useShops;
/**
* 可使用类型:堂食/自取/配送/快递
*/
private String useType;
/**
* 有效期类型fixed固定时间custom自定义时间
*/
private String validType;
/**
* 有效期(天)
*/
private Integer validDays;
/**
* 有效期开始时间
*/
private LocalDateTime validStartTime;
/**
* 有效期结束时间
*/
private LocalDateTime validEndTime;
/**
* 隔天生效
*/
private Integer daysToTakeEffect;
/**
* 可用周期,如:周一,周二,周三,周四,周五,周六,周七
*/
private String useDays;
/**
* 可用时间段类型all-全时段custom-指定时段
*/
private String useTimeType;
/**
* 可用开始时间
*/
private Time useStartTime;
/**
* 可用结束时间
*/
private Time useEndTime;
/**
* 发放设置:不可自行领取/no可领取/yes
*/
private String getType;
/**
* 用户领取方式
*/
private String getMode;
/**
* 总发放数量,-10086为不限量
*/
private Integer giveNum;
/**
* 可领取用户:全部/all新用户一次/new仅会员/vip
*/
private String getUserType;
/**
* 每人领取限量,-10086为不限量
*/
private Integer getLimit;
/**
* 每人每日使用限量,-10086为不限量
*/
private Integer useLimit;
/**
* 与限时折扣同享0-否1-是
*/
private Integer discountShare;
/**
* 与会员价同享0-否1-是
*/
private Integer vipPriceShare;
/**
* 附加规则说明
*/
private String ruleDetails;
/**
* 状态0-禁用1-启用
*/
private Integer status;
/**
* 已使用数量
*/
private Integer useNum;
/**
* 剩余数量
*/
private Integer leftNum;
/**
* 指定门槛商品
*/
private String foods;
/**
* 使用门槛:满多少金额
*/
private BigDecimal fullAmount;
/**
* 使用门槛:减多少金额
*/
private BigDecimal discountAmount;
/**
* 折扣%
*/
private Integer discountRate;
/**
* 可抵扣最大金额 元
*/
private BigDecimal maxDiscountAmount;
/**
* 使用规则price_asc-价格低到高price_desc-高到低
*/
private String useRule;
/**
* 抵扣数量
*/
private Integer discountNum;
/**
* 与其它优惠共享0-否1-是
*/
private Integer otherCouponShare;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,22 @@
package com.czg.market.service;
import com.czg.market.dto.ShopCouponDTO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.ShopCoupon;
/**
* 优惠券信息表 服务层。
*
* @author ww
* @since 2025-09-11
*/
public interface ShopCouponService extends IService<ShopCoupon> {
Page<ShopCouponDTO> getCouponPage(ShopCouponDTO param);
ShopCouponDTO getCouponById(Long id);
void addCoupon(ShopCouponDTO param);
void updateCouponById(ShopCouponDTO param);
void deleteCoupon(Long id);
}

View File

@@ -85,4 +85,10 @@ public interface ShopSyncService {
* @param vendorId 供应商Id * @param vendorId 供应商Id
*/ */
void syncVendorBySourceShop(Long sourceShopId, Long vendorId, Long sysUserId); void syncVendorBySourceShop(Long sourceShopId, Long vendorId, Long sysUserId);
/**
* 同步优惠券
* @param type 1 新增 2 修改 3 删除
*/
void syncCouponBySourceShop(Long sourceShopId, Long couponId, Integer type);
} }

View File

@@ -1,191 +0,0 @@
package com.czg.service.account.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.czg.account.dto.ShopActivateDTO;
import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO;
import com.czg.account.entity.ShopActivate;
import com.czg.account.entity.ShopActivateCouponRecord;
import com.czg.account.entity.ShopCoupon;
import com.czg.account.entity.ShopUser;
import com.czg.account.service.*;
import com.czg.enums.ShopUserFlowBizEnum;
import com.czg.sa.StpKit;
import com.czg.service.account.mapper.ShopActivateMapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 活动 服务层实现。
*
* @author ww
* @since 2025-02-17
*/
@Slf4j
@DubboService
public class ShopActivateServiceImpl extends ServiceImpl<ShopActivateMapper, ShopActivate> implements ShopActivateService {
@Resource
private ShopCouponService couponService;
@Resource
private ShopActivateCouponRecordService inRecordService;
@Resource
private ShopUserService shopUserService;
@Resource
private MemberPointsService pointsService;
@Override
public List<ShopActivateDTO> getList(Long shopId) {
List<ShopActivateDTO> activateDtoS = queryChain().select()
.eq(ShopActivate::getShopId, shopId == null ? StpKit.USER.getShopId() : shopId)
.orderBy(ShopActivate::getAmount, true)
.listAs(ShopActivateDTO.class);
for (ShopActivateDTO activateDTO : activateDtoS) {
if (StrUtil.isNotBlank(activateDTO.getCoupons())) {
//组装优惠券
activateDTO.setCouponList(getCoupons(activateDTO.getCoupons()));
}
}
return activateDtoS;
}
@Override
public Boolean add(ShopActivateDTO activateDTO) {
ShopActivate shopActivate = new ShopActivate();
BeanUtil.copyProperties(activateDTO, shopActivate);
return save(shopActivate);
}
@Override
public Boolean edit(ShopActivateDTO activateDTO) {
ShopActivate shopActivate = new ShopActivate();
BeanUtil.copyProperties(activateDTO, shopActivate);
return updateById(shopActivate);
}
@Override
public void giveActivate(ShopUser shopUser, BigDecimal memAmount, Long activateId, Long relationId) {
if (activateId == null) {
return;
}
ShopActivate activate = getById(activateId);
if (ObjectUtil.isNull(activate)) {
return;
}
//赠送优惠券
if (activate.getIsGiftCoupon() == 1 && StrUtil.isNotBlank(activate.getCoupons())) {
Map<Long, Integer> couponUseMap = JSONObject.parseObject(activate.getCoupons(), new TypeReference<>() {
});
Map<Long, ShopCoupon> couponMap = new HashMap<>();
couponUseMap.forEach((couponId, giftNumber) -> {
ShopCoupon shopCoupon;
if (couponMap.containsKey(couponId)) {
shopCoupon = couponMap.get(couponId);
} else {
shopCoupon = couponService.queryChain().select().eq(ShopCoupon::getId, couponId).one();
couponMap.put(couponId, shopCoupon);
}
if (shopCoupon != null && shopCoupon.getStatus().equals(1) && shopCoupon.getLeftNumber() > giftNumber) {
LocalDateTime start = LocalDateTime.now().with(LocalTime.MIN);
LocalDateTime end = null;
if ("fixed".equals(shopCoupon.getValidityType())) {
//固定时间
end = LocalDateTimeUtil.offset(start, shopCoupon.getValidDays(), ChronoUnit.DAYS).with(LocalTime.MAX);
} else if ("custom".equals(shopCoupon.getValidityType())) {
//自定义时间
start = shopCoupon.getValidStartTime();
end = shopCoupon.getValidEndTime();
}
List<ShopActivateCouponRecord> actGiveRecords = new ArrayList<>();
ShopActivateCouponRecord record = new ShopActivateCouponRecord();
record.setShopUserId(shopUser.getId());
record.setCouponId(shopCoupon.getId());
record.setShopId(shopUser.getShopId());
record.setSourceActId(activate.getId());
record.setSourceFlowId(relationId);
record.setUseStartTime(start);
record.setUseEndTime(end);
record.setSource("activate");
record.setName(shopCoupon.getTitle());
record.setCouponJson(getCouponJson(activate, shopCoupon));
if (shopCoupon.getType() == 1) {
record.setType(1);
record.setFullAmount(shopCoupon.getFullAmount());
record.setDiscountAmount(shopCoupon.getDiscountAmount());
} else if (shopCoupon.getType() == 2) {
record.setType(2);
record.setProId(shopCoupon.getProId());
}
for (int i = 0; i < giftNumber; i++) {
actGiveRecords.add(record);
}
inRecordService.saveBatch(actGiveRecords);
couponService.updateChain()
.set(ShopCoupon::getLeftNumber, shopCoupon.getLeftNumber() - giftNumber)
.eq(ShopCoupon::getId, shopCoupon.getId())
.update();
}
});
}
//赠送金额
if (activate.getGiftAmount() != null && activate.getGiftAmount().compareTo(BigDecimal.ZERO) > 0) {
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
.setId(shopUser.getId())
.setMoney(activate.getGiftAmount())
.setType(1)
.setRemark("充值活动赠送")
.setRelationId(relationId)
.setBizEnum(ShopUserFlowBizEnum.AWARD_IN);
//更新会员余额 并生成流水
shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
}
if (activate.getGiftPoints() != null && activate.getGiftPoints() > 0) {
pointsService.addPoints(shopUser.getId(), activate.getGiftPoints(), "储值赠送积分", null);
}
}
/**
* 获取优惠券详细信息 目前仅返回 id 名称 剩余数量 赠送数量
*/
private List<ShopCoupon> getCoupons(String couponJson) {
Map<String, Integer> couponMap;
try {
couponMap = JSONObject.parseObject(couponJson, new TypeReference<>() {
});
} catch (Exception e) {
return new ArrayList<>();
}
if (couponMap.isEmpty()) {
return new ArrayList<>();
}
List<ShopCoupon> list = couponService.queryChain()
.select(ShopCoupon::getId, ShopCoupon::getTitle, ShopCoupon::getLeftNumber)
.in(ShopCoupon::getId, couponMap.keySet())
.list();
list.forEach(coupon -> coupon.setNumber(couponMap.get(coupon.getId().toString())));
return list;
}
private String getCouponJson(ShopActivate activate, ShopCoupon tbShopCoupon) {
JSONObject result = new JSONObject();
result.put("activate", JSONObject.toJSONString(activate));
result.put("coupon", JSONObject.toJSONString(tbShopCoupon));
return result.toJSONString();
}
}

View File

@@ -1,222 +1,216 @@
package com.czg.service.account.service.impl; //package com.czg.service.account.service.impl;
//
import cn.hutool.core.bean.BeanUtil; //import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; //import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; //import cn.hutool.core.date.DateUtil;
import cn.hutool.core.exceptions.ValidateException; //import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.util.StrUtil; //import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON; //import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONObject; //import com.czg.account.dto.QueryReceiveDto;
import com.czg.account.dto.QueryReceiveDto; //import com.czg.account.entity.ShopActivateCouponRecord;
import com.czg.account.dto.ShopCouponDTO; //import com.czg.account.entity.ShopUser;
import com.czg.account.entity.ShopActivateCouponRecord; //import com.czg.account.service.ShopActivateCouponRecordService;
import com.czg.account.entity.ShopCoupon; //import com.czg.account.service.ShopInfoService;
import com.czg.account.entity.ShopUser; //import com.czg.account.service.ShopUserService;
import com.czg.account.service.ShopActivateCouponRecordService; //import com.czg.account.vo.CouponReceiveVo;
import com.czg.account.service.ShopCouponService; //import com.czg.account.vo.UserCouponVo;
import com.czg.account.service.ShopInfoService; //import com.czg.product.entity.Product;
import com.czg.account.service.ShopUserService; //import com.czg.product.service.ProductService;
import com.czg.account.vo.CouponReceiveVo; //import com.czg.utils.PageUtil;
import com.czg.account.vo.UserCouponVo; //import com.github.pagehelper.PageHelper;
import com.czg.product.entity.Product; //import com.github.pagehelper.PageInfo;
import com.czg.product.service.ProductService; //import com.mybatisflex.core.paginate.Page;
import com.czg.service.account.mapper.ShopCouponMapper; //import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.utils.AssertUtil; //import jakarta.annotation.Resource;
import com.czg.utils.PageUtil; //import lombok.extern.slf4j.Slf4j;
import com.github.pagehelper.PageHelper; //import org.apache.dubbo.config.annotation.DubboReference;
import com.github.pagehelper.PageInfo; //import org.apache.dubbo.config.annotation.DubboService;
import com.mybatisflex.core.paginate.Page; //
import com.mybatisflex.spring.service.impl.ServiceImpl; //import java.math.BigDecimal;
import jakarta.annotation.Resource; //import java.time.LocalTime;
import lombok.extern.slf4j.Slf4j; //import java.time.format.DateTimeFormatter;
import org.apache.dubbo.config.annotation.DubboReference; //import java.util.*;
import org.apache.dubbo.config.annotation.DubboService; //import java.util.stream.Collectors;
//
import java.math.BigDecimal; ///**
import java.time.LocalTime; // * 优惠券 服务层实现。
import java.time.format.DateTimeFormatter; // *
import java.util.*; // * @author ww
import java.util.stream.Collectors; // * @since 2025-02-17
// */
/** //@Slf4j
* 优惠券 服务层实现。 //@DubboService
* //public class ShopCouponServiceImpl extends ServiceImpl<ShopCouponMapper, ShopCoupon> implements ShopCouponService {
* @author ww //
* @since 2025-02-17 // @Resource
*/ // private ShopActivateCouponRecordService couponRecordService;
@Slf4j // @Resource
@DubboService // private ShopUserService shopUserService;
public class ShopCouponServiceImpl extends ServiceImpl<ShopCouponMapper, ShopCoupon> implements ShopCouponService { // @Resource
// private ShopInfoService shopInfoService;
@Resource // @DubboReference
private ShopActivateCouponRecordService couponRecordService; // private ProductService productService;
@Resource //
private ShopUserService shopUserService; // @Override
@Resource // public List<ShopCouponDTO> getList(Long shopId, Integer type, Integer status) {
private ShopInfoService shopInfoService; // List<ShopCouponDTO> coupons = queryChain().select()
@DubboReference // .eq(ShopCoupon::getShopId, shopId)
private ProductService productService; // .eq(ShopCoupon::getType, type)
// .eq(ShopCoupon::getStatus, status)
@Override // .orderBy(ShopCoupon::getCreateTime).desc()
public List<ShopCouponDTO> getList(Long shopId, Integer type, Integer status) { // .listAs(ShopCouponDTO.class);
List<ShopCouponDTO> coupons = queryChain().select() // System.out.println(coupons);
.eq(ShopCoupon::getShopId, shopId) // coupons.forEach(coupon -> {
.eq(ShopCoupon::getType, type) // if (coupon.getProId() != null) {
.eq(ShopCoupon::getStatus, status) // Product product = productService.getById(coupon.getProId());
.orderBy(ShopCoupon::getCreateTime).desc() // coupon.setProName(product.getName());
.listAs(ShopCouponDTO.class); // }
System.out.println(coupons); // });
coupons.forEach(coupon -> { // return coupons;
if (coupon.getProId() != null) { // }
Product product = productService.getById(coupon.getProId()); //
coupon.setProName(product.getName()); // @Override
} // public Boolean add(ShopCouponDTO couponDTO) {
}); // ShopCoupon shopCoupon = new ShopCoupon();
return coupons; // BeanUtil.copyProperties(couponDTO, shopCoupon);
} // shopCoupon.setLeftNumber(shopCoupon.getNumber());
// return save(shopCoupon);
@Override // }
public Boolean add(ShopCouponDTO couponDTO) { //
ShopCoupon shopCoupon = new ShopCoupon(); // @Override
BeanUtil.copyProperties(couponDTO, shopCoupon); // public Boolean edit(ShopCouponDTO couponDTO) {
shopCoupon.setLeftNumber(shopCoupon.getNumber()); // ShopCoupon shopCoupon = new ShopCoupon();
return save(shopCoupon); // BeanUtil.copyProperties(couponDTO, shopCoupon);
} // if (couponDTO.getNumber() != null) {
// ShopCoupon tbShopCoupon = getById(couponDTO.getId());
@Override // if (shopCoupon.getNumber() < tbShopCoupon.getNumber()) {
public Boolean edit(ShopCouponDTO couponDTO) { // throw new ValidateException("修改失败 发放数量不可减少");
ShopCoupon shopCoupon = new ShopCoupon(); // } else {
BeanUtil.copyProperties(couponDTO, shopCoupon); // shopCoupon.setLeftNumber(shopCoupon.getLeftNumber() + shopCoupon.getNumber() - tbShopCoupon.getNumber());
if (couponDTO.getNumber() != null) { // }
ShopCoupon tbShopCoupon = getById(couponDTO.getId()); // }
if (shopCoupon.getNumber() < tbShopCoupon.getNumber()) { // return updateById(shopCoupon);
throw new ValidateException("修改失败 发放数量不可减少"); // }
} else { //
shopCoupon.setLeftNumber(shopCoupon.getLeftNumber() + shopCoupon.getNumber() - tbShopCoupon.getNumber()); // @Override
} // public Page<CouponReceiveVo> queryReceive(QueryReceiveDto param) {
} // Page<Object> page = PageUtil.buildPage();
return updateById(shopCoupon); // PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize()));
} // return PageUtil.convert(new PageInfo<>(couponRecordService.queryReceive(param)));
// }
@Override //
public Page<CouponReceiveVo> queryReceive(QueryReceiveDto param) { //
Page<Object> page = PageUtil.buildPage(); // @Override
PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize())); // public Page<ShopActivateCouponRecord> find(Long userId, Long shopId, Integer status) {
return PageUtil.convert(new PageInfo<>(couponRecordService.queryReceive(param))); // Page<Object> page = PageUtil.buildPage();
} // List<Long> shopUserIds = shopUserService.queryChain()
// .eq(ShopUser::getUserId, userId)
// .eq(ShopUser::getShopId, shopId)
@Override // .select(ShopUser::getId).listAs(Long.class);
public Page<ShopActivateCouponRecord> find(Long userId, Long shopId, Integer status) { // if (CollectionUtil.isNotEmpty(shopUserIds)) {
Page<Object> page = PageUtil.buildPage(); // PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize()));
List<Long> shopUserIds = shopUserService.queryChain() // return PageUtil.convert(new PageInfo<>(couponRecordService.findByUser(shopUserIds, status)));
.eq(ShopUser::getUserId, userId) // }
.eq(ShopUser::getShopId, shopId) // return new Page<>();
.select(ShopUser::getId).listAs(Long.class); // }
if (CollectionUtil.isNotEmpty(shopUserIds)) { //
PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize())); // @Override
return PageUtil.convert(new PageInfo<>(couponRecordService.findByUser(shopUserIds, status))); // public List<UserCouponVo> findCoupon(Long shopId, Long shopUserId, Integer type) {
} // List<UserCouponVo> tbUserCouponVos = couponRecordService.queryByVipIdAndShopId(shopId, shopUserId, type);
return new Page<>(); // if (CollectionUtil.isNotEmpty(tbUserCouponVos)) {
} // String week = DateUtil.dayOfWeekEnum(new Date()).toChinese("周");
// LocalTime now = LocalTime.now();
@Override // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
public List<UserCouponVo> findCoupon(Long shopId, Long shopUserId, Integer type) { //
List<UserCouponVo> tbUserCouponVos = couponRecordService.queryByVipIdAndShopId(shopId, shopUserId, type); // //券id 券使用描述
if (CollectionUtil.isNotEmpty(tbUserCouponVos)) { // Map<Long, JSONObject> coupons = new HashMap<>();
String week = DateUtil.dayOfWeekEnum(new Date()).toChinese(""); // for (UserCouponVo tbUserCouponVo : tbUserCouponVos) {
LocalTime now = LocalTime.now(); // if (!coupons.containsKey(tbUserCouponVo.getCouponId())) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); // setCouponInfo(coupons, tbUserCouponVo, null, week, now, formatter);
// }
//券id 券使用描述 // JSONObject couponJson = coupons.get(tbUserCouponVo.getCouponId());
Map<Long, JSONObject> coupons = new HashMap<>(); // tbUserCouponVo.setUseRestrictions(couponJson.getString("useRestrictions"));
for (UserCouponVo tbUserCouponVo : tbUserCouponVos) { // tbUserCouponVo.setUse(couponJson.getBoolean("isUse"));
if (!coupons.containsKey(tbUserCouponVo.getCouponId())) { //
setCouponInfo(coupons, tbUserCouponVo, null, week, now, formatter); // }
} // tbUserCouponVos.sort(Comparator.comparing(UserCouponVo::isUse).reversed());
JSONObject couponJson = coupons.get(tbUserCouponVo.getCouponId()); // return tbUserCouponVos;
tbUserCouponVo.setUseRestrictions(couponJson.getString("useRestrictions")); // }
tbUserCouponVo.setUse(couponJson.getBoolean("isUse")); // return null;
// }
} //
tbUserCouponVos.sort(Comparator.comparing(UserCouponVo::isUse).reversed()); // @Override
return tbUserCouponVos; // public Boolean use(List<Long> ids, Long shopUserId, Long orderId) {
} // List<ShopActivateCouponRecord> records = couponRecordService.listByIds(ids);
return null; // if (records.isEmpty()) {
} // log.error("优惠券使用失败订单Id:{}", orderId);
// return false;
@Override // }
public Boolean use(List<Long> ids, Long shopUserId, Long orderId) { // // 使用流来统计 couponId 出现的次数
List<ShopActivateCouponRecord> records = couponRecordService.listByIds(ids); // Map<Long, Long> couponIdCountMap = records.stream()
if (records.isEmpty()) { // .collect(Collectors.groupingBy(ShopActivateCouponRecord::getCouponId,
log.error("优惠券使用失败订单Id:{}", orderId); // Collectors.counting()
return false; // ));
} // couponIdCountMap.forEach((couponId, count) -> {
// 使用流来统计 couponId 出现的次数 // ShopCoupon tbShopCoupon = getById(couponId);
Map<Long, Long> couponIdCountMap = records.stream() // tbShopCoupon.setUseNumber(tbShopCoupon.getUseNumber() + count.intValue());
.collect(Collectors.groupingBy(ShopActivateCouponRecord::getCouponId, // ShopCoupon coupon1 = new ShopCoupon();
Collectors.counting() // coupon1.setId(couponId);
)); // coupon1.setUseNumber(tbShopCoupon.getUseNumber());
couponIdCountMap.forEach((couponId, count) -> { // updateById(coupon1);
ShopCoupon tbShopCoupon = getById(couponId); // });
tbShopCoupon.setUseNumber(tbShopCoupon.getUseNumber() + count.intValue()); // return couponRecordService.updateChain()
ShopCoupon coupon1 = new ShopCoupon(); // .set(ShopActivateCouponRecord::getStatus, 1)
coupon1.setId(couponId); // .set(ShopActivateCouponRecord::getTargetId, orderId)
coupon1.setUseNumber(tbShopCoupon.getUseNumber()); // .eq(ShopActivateCouponRecord::getShopUserId, shopUserId)
updateById(coupon1); // .in(ShopActivateCouponRecord::getId, ids).update();
}); // }
return couponRecordService.updateChain() //
.set(ShopActivateCouponRecord::getStatus, 1) // /**
.set(ShopActivateCouponRecord::getTargetId, orderId) // * 退还券
.eq(ShopActivateCouponRecord::getShopUserId, shopUserId) // */
.in(ShopActivateCouponRecord::getId, ids).update(); // @Override
} // public Boolean refund(Long orderId, Long shopUserId) {
// return couponRecordService.updateChain()
/** // .set(ShopActivateCouponRecord::getStatus, 0)
* 退还券 // .eq(ShopActivateCouponRecord::getShopUserId, shopUserId)
*/ // .eq(ShopActivateCouponRecord::getTargetId, orderId)
@Override // .update();
public Boolean refund(Long orderId, Long shopUserId) { // }
return couponRecordService.updateChain() //
.set(ShopActivateCouponRecord::getStatus, 0) // private void setCouponInfo(Map<Long, JSONObject> coupons, UserCouponVo tbUserCouponVo, BigDecimal amount, String week, LocalTime now, DateTimeFormatter formatter) {
.eq(ShopActivateCouponRecord::getShopUserId, shopUserId) // JSONObject json = new JSONObject();
.eq(ShopActivateCouponRecord::getTargetId, orderId) // boolean isUse = true;
.update(); // ShopCoupon tbShopCoupon = getById(tbUserCouponVo.getCouponId());
} // StringBuilder useRestrictions = new StringBuilder("每天 ");
// if (amount != null && tbShopCoupon.getType().equals(1)) {
private void setCouponInfo(Map<Long, JSONObject> coupons, UserCouponVo tbUserCouponVo, BigDecimal amount, String week, LocalTime now, DateTimeFormatter formatter) { // if (amount.compareTo(tbShopCoupon.getFullAmount()) < 0) {
JSONObject json = new JSONObject(); // isUse = false;
boolean isUse = true; // }
ShopCoupon tbShopCoupon = getById(tbUserCouponVo.getCouponId()); // }
StringBuilder useRestrictions = new StringBuilder("每天 "); // if (StrUtil.isNotBlank(tbShopCoupon.getUserDays())) {
if (amount != null && tbShopCoupon.getType().equals(1)) { // String[] split = tbShopCoupon.getUserDays().split(",");
if (amount.compareTo(tbShopCoupon.getFullAmount()) < 0) { // if (split.length != 7) {
isUse = false; // useRestrictions = new StringBuilder(STR."\{tbShopCoupon.getUserDays()} ");
} // }
} // if (!tbShopCoupon.getUserDays().contains(week)) {
if (StrUtil.isNotBlank(tbShopCoupon.getUserDays())) { // isUse = false;
String[] split = tbShopCoupon.getUserDays().split(","); // }
if (split.length != 7) { // }
useRestrictions = new StringBuilder(STR."\{tbShopCoupon.getUserDays()} "); // if ("custom".equals(tbShopCoupon.getUseTimeType())) {
} // if (now.isBefore(tbShopCoupon.getUseStartTime()) || now.isAfter(tbShopCoupon.getUseEndTime())) {
if (!tbShopCoupon.getUserDays().contains(week)) { // isUse = false;
isUse = false; // }
} // useRestrictions.append(
} // STR."\{tbShopCoupon.getUseStartTime().format(formatter)}-\{tbShopCoupon.getUseEndTime().format(formatter)}");
if ("custom".equals(tbShopCoupon.getUseTimeType())) { // } else {
if (now.isBefore(tbShopCoupon.getUseStartTime()) || now.isAfter(tbShopCoupon.getUseEndTime())) { // useRestrictions.append("全时段");
isUse = false; // }
} // useRestrictions.append(" 可用");
useRestrictions.append( // json.put("isUse", isUse);
STR."\{tbShopCoupon.getUseStartTime().format(formatter)}-\{tbShopCoupon.getUseEndTime().format(formatter)}"); // json.put("useRestrictions", useRestrictions);
} else { //
useRestrictions.append("全时段"); // coupons.put(tbUserCouponVo.getCouponId(), json);
} // }
useRestrictions.append(" 可用"); //
json.put("isUse", isUse); //}
json.put("useRestrictions", useRestrictions);
coupons.put(tbUserCouponVo.getCouponId(), json);
}
}

View File

@@ -1,92 +1,92 @@
package com.czg.service.account.service.impl; //package com.czg.service.account.service.impl;
//
import cn.hutool.core.bean.BeanUtil; //import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil; //import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONArray; //import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; //import com.alibaba.fastjson2.JSONObject;
import com.czg.account.dto.ShopShareCouponDTO; //import com.czg.account.dto.ShopShareCouponDTO;
import com.czg.account.dto.ShopShareDTO; //import com.czg.account.dto.ShopShareDTO;
import com.czg.account.entity.ShopCoupon; //import com.czg.account.entity.ShopCoupon;
import com.czg.account.service.ShopCouponService; //import com.czg.account.service.ShopCouponService;
import com.czg.account.vo.ShopShareRecordVO; //import com.czg.account.vo.ShopShareRecordVO;
import com.czg.account.vo.ShopShareVO; //import com.czg.account.vo.ShopShareVO;
import com.czg.exception.ApiNotPrintException; //import com.czg.exception.ApiNotPrintException;
import com.czg.service.account.mapper.ShopShareRecordMapper; //import com.czg.service.account.mapper.ShopShareRecordMapper;
import com.czg.utils.PageUtil; //import com.czg.utils.PageUtil;
import com.github.pagehelper.PageHelper; //import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; //import com.github.pagehelper.PageInfo;
import com.mybatisflex.core.paginate.Page; //import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper; //import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl; //import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.account.entity.ShopShare; //import com.czg.account.entity.ShopShare;
import com.czg.account.service.ShopShareService; //import com.czg.account.service.ShopShareService;
import com.czg.service.account.mapper.ShopShareMapper; //import com.czg.service.account.mapper.ShopShareMapper;
import jakarta.annotation.Resource; //import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; //import org.springframework.stereotype.Service;
//
/** ///**
* 店铺分享 服务层实现。 // * 店铺分享 服务层实现。
* // *
* @author zs // * @author zs
* @since 2025-03-05 // * @since 2025-03-05
*/ // */
@Service //@Service
public class ShopShareServiceImpl extends ServiceImpl<ShopShareMapper, ShopShare> implements ShopShareService{ //public class ShopShareServiceImpl extends ServiceImpl<ShopShareMapper, ShopShare> implements ShopShareService{
@Resource // @Resource
private ShopCouponService shopCouponService; // private ShopCouponService shopCouponService;
@Resource // @Resource
private ShopShareRecordMapper shopShareRecordMapper; // private ShopShareRecordMapper shopShareRecordMapper;
//
@Override // @Override
public ShopShareVO get(Long shopId) { // public ShopShareVO get(Long shopId) {
ShopShare shopShare = getOne(new QueryWrapper().eq(ShopShare::getShopId, shopId)); // ShopShare shopShare = getOne(new QueryWrapper().eq(ShopShare::getShopId, shopId));
ShopShareVO shopShareVO = new ShopShareVO(); // ShopShareVO shopShareVO = new ShopShareVO();
if (shopShare != null) { // if (shopShare != null) {
BeanUtil.copyProperties(shopShare, shopShareVO); // BeanUtil.copyProperties(shopShare, shopShareVO);
if (StrUtil.isNotBlank(shopShare.getRewardCoupon())) { // if (StrUtil.isNotBlank(shopShare.getRewardCoupon())) {
// shopShareVO.setRewardCouponList(shopCouponService.list(new QueryWrapper().eq(ShopCoupon::getShopId, shopId).in(ShopCoupon::getId, JSONArray.parseArray(shopShare.getRewardCoupon())))); //// shopShareVO.setRewardCouponList(shopCouponService.list(new QueryWrapper().eq(ShopCoupon::getShopId, shopId).in(ShopCoupon::getId, JSONArray.parseArray(shopShare.getRewardCoupon()))));
shopShareVO.setRewardCouponList(JSONArray.parseArray(shopShare.getRewardCoupon(), ShopShareCouponDTO.class)); // shopShareVO.setRewardCouponList(JSONArray.parseArray(shopShare.getRewardCoupon(), ShopShareCouponDTO.class));
} // }
//
if (StrUtil.isNotBlank(shopShare.getNewCoupon())) { // if (StrUtil.isNotBlank(shopShare.getNewCoupon())) {
// shopShareVO.setNewCouponList(shopCouponService.list(new QueryWrapper().eq(ShopCoupon::getShopId, shopId).in(ShopCoupon::getId, JSONArray.parseArray(shopShare.getNewCoupon())))); //// shopShareVO.setNewCouponList(shopCouponService.list(new QueryWrapper().eq(ShopCoupon::getShopId, shopId).in(ShopCoupon::getId, JSONArray.parseArray(shopShare.getNewCoupon()))));
shopShareVO.setNewCouponList(JSONArray.parseArray(shopShare.getNewCoupon(), ShopShareCouponDTO.class)); // shopShareVO.setNewCouponList(JSONArray.parseArray(shopShare.getNewCoupon(), ShopShareCouponDTO.class));
} // }
} // }
return shopShareVO; // return shopShareVO;
} // }
//
@Override // @Override
public Boolean add(Long shopId, ShopShareDTO shopShareDTO) { // public Boolean add(Long shopId, ShopShareDTO shopShareDTO) {
ShopShare shopShare = getOne(new QueryWrapper().eq(ShopShare::getShopId, shopId)); // ShopShare shopShare = getOne(new QueryWrapper().eq(ShopShare::getShopId, shopId));
if (shopShare == null) { // if (shopShare == null) {
shopShare = new ShopShareVO(); // shopShare = new ShopShareVO();
shopShare.setShopId(shopId); // shopShare.setShopId(shopId);
} // }
//
if (shopShareDTO.getNewCouponList() != null && !shopShareDTO.getNewCouponList().isEmpty()) { // if (shopShareDTO.getNewCouponList() != null && !shopShareDTO.getNewCouponList().isEmpty()) {
long count = shopCouponService.count(new QueryWrapper().in(ShopCoupon::getId, shopShareDTO.getNewCouponList().stream().map(ShopShareCouponDTO::getId).toList()).eq(ShopCoupon::getShopId, shopId)); // long count = shopCouponService.count(new QueryWrapper().in(ShopCoupon::getId, shopShareDTO.getNewCouponList().stream().map(ShopShareCouponDTO::getId).toList()).eq(ShopCoupon::getShopId, shopId));
if (count != shopShareDTO.getNewCouponList().size()) { // if (count != shopShareDTO.getNewCouponList().size()) {
throw new ApiNotPrintException("优惠券不存在"); // throw new ApiNotPrintException("优惠券不存在");
} // }
shopShare.setNewCoupon(JSONArray.toJSONString(shopShareDTO.getNewCouponList())); // shopShare.setNewCoupon(JSONArray.toJSONString(shopShareDTO.getNewCouponList()));
} // }
//
if (shopShareDTO.getRewardCouponList() != null && !shopShareDTO.getRewardCouponList().isEmpty()) { // if (shopShareDTO.getRewardCouponList() != null && !shopShareDTO.getRewardCouponList().isEmpty()) {
long count = shopCouponService.count(new QueryWrapper().in(ShopCoupon::getId, shopShareDTO.getRewardCouponList().stream().map(ShopShareCouponDTO::getId).toList()).eq(ShopCoupon::getShopId, shopId)); // long count = shopCouponService.count(new QueryWrapper().in(ShopCoupon::getId, shopShareDTO.getRewardCouponList().stream().map(ShopShareCouponDTO::getId).toList()).eq(ShopCoupon::getShopId, shopId));
if (count != shopShareDTO.getRewardCouponList().size()) { // if (count != shopShareDTO.getRewardCouponList().size()) {
throw new ApiNotPrintException("优惠券不存在"); // throw new ApiNotPrintException("优惠券不存在");
} // }
shopShare.setRewardCoupon(JSONArray.toJSONString(shopShareDTO.getRewardCouponList())); // shopShare.setRewardCoupon(JSONArray.toJSONString(shopShareDTO.getRewardCouponList()));
} // }
BeanUtil.copyProperties(shopShareDTO, shopShare); // BeanUtil.copyProperties(shopShareDTO, shopShare);
return saveOrUpdate(shopShare); // return saveOrUpdate(shopShare);
} // }
//
@Override // @Override
public Page<ShopShareRecordVO> recordPage(Long shopId, String key, Integer status) { // public Page<ShopShareRecordVO> recordPage(Long shopId, String key, Integer status) {
Page<Object> page = PageUtil.buildPage(); // Page<Object> page = PageUtil.buildPage();
PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize())); // PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize()));
return PageUtil.convert(new PageInfo<>(shopShareRecordMapper.getRecord(shopId, key, status))); // return PageUtil.convert(new PageInfo<>(shopShareRecordMapper.getRecord(shopId, key, status)));
} // }
} //}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.czg</groupId>
<artifactId>cash-service</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>market-service</artifactId>
<name>market-service</name>
<dependencies>
</dependencies>
</project>

View File

@@ -1,13 +1,14 @@
package com.czg.service.account.mapper; package com.czg.service.market.mapper;
import com.czg.market.entity.ShopCoupon;
import com.mybatisflex.core.BaseMapper; import com.mybatisflex.core.BaseMapper;
import com.czg.account.entity.ShopCoupon;
/** /**
* 优惠券 映射层 * 优惠券信息表 映射层
* *
* @author ww * @author ww
* @since 2025-02-17 * @since 2025-09-11
*/ */
public interface ShopCouponMapper extends BaseMapper<ShopCoupon> { public interface ShopCouponMapper extends BaseMapper<ShopCoupon> {

View File

@@ -0,0 +1,66 @@
package com.czg.service.market.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.exceptions.ValidateException;
import com.czg.market.dto.ShopCouponDTO;
import com.czg.market.entity.ShopCoupon;
import com.czg.market.service.ShopCouponService;
import com.czg.service.market.mapper.ShopCouponMapper;
import com.czg.utils.AssertUtil;
import com.czg.utils.PageUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
/**
* 优惠券信息表 服务层实现。
*
* @author ww
* @since 2025-09-11
*/
@DubboService
public class ShopCouponServiceImpl extends ServiceImpl<ShopCouponMapper, ShopCoupon> implements ShopCouponService{
@Override
public Page<ShopCouponDTO> getCouponPage(ShopCouponDTO param) {
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
queryWrapper.eq(ShopCoupon::getShopId, param.getShopId())
.eq(ShopCoupon::getCouponType, param.getCouponType())
.orderBy(ShopCoupon::getCreateTime).desc();
return pageAs(PageUtil.buildPage(), queryWrapper, ShopCouponDTO.class);
}
@Override
public ShopCouponDTO getCouponById(Long id) {
AssertUtil.isNull(id, "优惠券ID不能为空");
return getOneAs(new QueryWrapper().eq(ShopCoupon::getId, id), ShopCouponDTO.class);
}
@Override
public void addCoupon(ShopCouponDTO param) {
ShopCoupon coupon = BeanUtil.toBean(param, ShopCoupon.class);
save(coupon);
}
@Override
public void updateCouponById(ShopCouponDTO param) {
if (param.getGiveNum() != null && param.getGiveNum() != -10086) {
ShopCoupon tbShopCoupon = getById(param.getId());
if (param.getGiveNum() < tbShopCoupon.getGiveNum()) {
throw new ValidateException("修改失败 发放数量不可减少");
} else {
param.setLeftNum(tbShopCoupon.getLeftNum() + tbShopCoupon.getGiveNum() - param.getGiveNum());
}
}
ShopCoupon coupon = BeanUtil.toBean(param, ShopCoupon.class);
updateById(coupon,true);
}
@Override
public void deleteCoupon(Long id) {
AssertUtil.isNull(id, "优惠券ID不能为空");
removeById(id);
}
}

View File

@@ -2,6 +2,6 @@
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.account.mapper.ShopCouponMapper"> <mapper namespace="com.czg.service.market.mapper.ShopCouponMapper">
</mapper> </mapper>

View File

@@ -107,12 +107,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
private ShopUserFlowService flowService; private ShopUserFlowService flowService;
@DubboReference @DubboReference
private ShopTableService shopTableService; private ShopTableService shopTableService;
@DubboReference // @DubboReference
private ShopActivateService activateService; // private ShopActivateService activateService;
@DubboReference @DubboReference
private PointsBasicSettingService pointsBasicService; private PointsBasicSettingService pointsBasicService;
@DubboReference // @DubboReference
private ShopCouponService couponService; // private ShopCouponService couponService;
@DubboReference @DubboReference
private ShopActivateCouponRecordService couponRecordService; private ShopActivateCouponRecordService couponRecordService;
// 延迟 5 秒 // 延迟 5 秒
@@ -692,9 +692,9 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
.set(OrderInfo::getPayAmount, 0) .set(OrderInfo::getPayAmount, 0)
.update(); .update();
} else { } else {
//会员活动 // //会员活动
activateService.giveActivate(shopUser, new BigDecimal(czgCallBackDto.getAmount()).divide(new BigDecimal(100), 2, RoundingMode.DOWN), // activateService.giveActivate(shopUser, new BigDecimal(czgCallBackDto.getAmount()).divide(new BigDecimal(100), 2, RoundingMode.DOWN),
payment.getRelatedId(), flowId); // payment.getRelatedId(), flowId);
} }
} }
@@ -785,7 +785,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
//券消耗 //券消耗
List<Long> coupons = JSON.parseArray(orderInfo.getCouponInfoList(), Long.class); List<Long> coupons = JSON.parseArray(orderInfo.getCouponInfoList(), Long.class);
if (CollUtil.isNotEmpty(coupons)) { if (CollUtil.isNotEmpty(coupons)) {
couponService.use(coupons, shopUser.getId(), orderInfo.getId()); // couponService.use(coupons, shopUser.getId(), orderInfo.getId());
} }
} }
String[] payTypes = {PayEnums.VIP_PAY.getValue(), PayEnums.CREDIT_PAY.getValue()}; String[] payTypes = {PayEnums.VIP_PAY.getValue(), PayEnums.CREDIT_PAY.getValue()};
@@ -972,7 +972,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
//券消耗 //券消耗
List<Long> coupons = JSON.parseArray(orderInfo.getCouponInfoList(), Long.class); List<Long> coupons = JSON.parseArray(orderInfo.getCouponInfoList(), Long.class);
if (CollUtil.isNotEmpty(coupons)) { if (CollUtil.isNotEmpty(coupons)) {
couponService.use(coupons, shopUser.getId(), orderInfo.getId()); // couponService.use(coupons, shopUser.getId(), orderInfo.getId());
} }
} }
} }

View File

@@ -75,14 +75,14 @@ public class PayServiceImpl implements PayService {
private UserInfoService userInfoService; private UserInfoService userInfoService;
@DubboReference @DubboReference
private ShopInfoService shopInfoService; private ShopInfoService shopInfoService;
@DubboReference // @DubboReference
private ShopActivateService shopActivateService; // private ShopActivateService shopActivateService;
@DubboReference @DubboReference
private ShopUserFlowService userFlowService; private ShopUserFlowService userFlowService;
@DubboReference @DubboReference
private ShopActivateCouponRecordService inRecordService; private ShopActivateCouponRecordService inRecordService;
@DubboReference // @DubboReference
private ShopCouponService couponService; // private ShopCouponService couponService;
@DubboReference @DubboReference
private MemberPointsService pointsService; private MemberPointsService pointsService;
@DubboReference @DubboReference
@@ -371,7 +371,7 @@ public class PayServiceImpl implements PayService {
//更新会员余额 并生成流水 //更新会员余额 并生成流水
Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO); Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
//会员活动 //会员活动
shopActivateService.giveActivate(shopUser, payParam.getAmount(), payParam.getActivateId(), flowId); // shopActivateService.giveActivate(shopUser, payParam.getAmount(), payParam.getActivateId(), flowId);
return CzgResult.success(); return CzgResult.success();
} }

View File

@@ -19,6 +19,7 @@
<module>system-service</module> <module>system-service</module>
<module>code-generator</module> <module>code-generator</module>
<module>pay-service</module> <module>pay-service</module>
<module>market-service</module>
</modules> </modules>
<properties> <properties>

View File

@@ -15,6 +15,9 @@ import com.czg.account.service.ShopInfoService;
import com.czg.account.service.ShopUserService; import com.czg.account.service.ShopUserService;
import com.czg.account.service.SyncNoticeService; import com.czg.account.service.SyncNoticeService;
import com.czg.exception.CzgException; import com.czg.exception.CzgException;
import com.czg.market.dto.ShopCouponDTO;
import com.czg.market.entity.ShopCoupon;
import com.czg.market.service.ShopCouponService;
import com.czg.product.entity.*; import com.czg.product.entity.*;
import com.czg.product.service.*; import com.czg.product.service.*;
import com.czg.product.vo.ProductGroupVo; import com.czg.product.vo.ProductGroupVo;
@@ -73,6 +76,8 @@ public class ShopSyncServiceImpl implements ShopSyncService {
private ShopUserService shopUserService; private ShopUserService shopUserService;
@Resource @Resource
private ShopVendorService vendorService; private ShopVendorService vendorService;
@Resource
private ShopCouponService couponService;
@DubboReference @DubboReference
private SyncNoticeService syncNoticeService; private SyncNoticeService syncNoticeService;
@@ -1284,4 +1289,66 @@ public class ShopSyncServiceImpl implements ShopSyncService {
throw new CzgException("主店数据同步方式不是自动同步"); throw new CzgException("主店数据同步方式不是自动同步");
} }
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void syncCouponBySourceShop(Long sourceShopId, Long couponId, Integer type) {
AssertUtil.isNull(sourceShopId, "{}不能为空", "源店铺ID");
AssertUtil.isNull(couponId, "{}不能为空", "优惠券ID");
AssertUtil.isNull(type, "{}不能为空", "操作类型");
ShopInfo sourceShop = shopInfoService.getById(sourceShopId);
if (StrUtil.isBlank(sourceShop.getShopType()) || "only".equals(sourceShop.getShopType())
|| sourceShop.getIsHeadShop() == null || sourceShop.getIsHeadShop() != 1) {
// 主店不是主店铺或主店是单店,不进行优惠券同步
return;
}
ShopCoupon couponSource = couponService.getById(couponId);
List<Long> ids = new ArrayList<>();
if ("all".equals(couponSource.getUseShopType())) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.select(column(ShopConfig::getId));
queryWrapper.eq(ShopConfig::getMainId, sourceShopId);
ids = shopConfigService.listAs(queryWrapper, Long.class);
} else {
if (StrUtil.isBlank(couponSource.getUseShops())) {
return;
}
ids = Arrays.stream(couponSource.getUseShops().split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
}
if (CollUtil.isEmpty(ids)) {
return;
}
couponSource.setId(null);
switch (type) {
case 1://新增
saveCouponsForShops(ids, couponSource, couponId);
break;
case 2://先删除再新增
deleteCouponsBySyncId(couponId);
saveCouponsForShops(ids, couponSource, couponId);
break;
case 3:// 删除
deleteCouponsBySyncId(couponId);
break;
default:
// 处理未知类型,可根据业务需求抛出异常或忽略
throw new IllegalArgumentException("不支持的操作类型: " + type);
}
}
private void saveCouponsForShops(List<Long> ids, ShopCoupon coupon, Long couponId) {
ids.forEach(id -> {
coupon.setShopId(id);
coupon.setSyncId(couponId);
coupon.setId(null); // 确保是新增操作
couponService.save(coupon);
});
}
private void deleteCouponsBySyncId(Long couponId) {
couponService.remove(new QueryWrapper()
.eq(ShopCoupon::getSyncId, couponId));
}
} }

View File

@@ -26,6 +26,7 @@
<module>cash-service</module> <module>cash-service</module>
<module>cash-sdk</module> <module>cash-sdk</module>
<module>cash-dependencies</module> <module>cash-dependencies</module>
<module>cash-api/market-server</module>
</modules> </modules>
<properties> <properties>