店铺签约

This commit is contained in:
2026-04-27 11:09:53 +08:00
parent 91fc6643a8
commit 61e1aeb16a
16 changed files with 112 additions and 220 deletions

View File

@@ -1,54 +0,0 @@
package com.czg.controller.admin;
import com.czg.account.dto.PageDTO;
import com.czg.account.dto.register.MerchantRegisterDTO;
import com.czg.account.entity.MerchantRegister;
import com.czg.account.service.MerchantRegisterService;
import com.czg.annotation.SaAdminCheckPermission;
import com.czg.annotation.SaAdminCheckRole;
import com.czg.resp.CzgResult;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 激活码管理
* @author Administrator
*/
@RestController
@RequestMapping("/admin/merchantRegister")
public class MerchantRegisterController {
@Resource
private MerchantRegisterService merchantRegisterService;
/**
* 激活码列表
* 权限标识: merchantRegister:list
* @param pageDTO 分页参数
* @param state 状态 0未激活 1已激活
* @param startTime 开始时间
* @param endTime 结束时间
* @return 激活码列表
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission(parentName = "激活码", value = "merchantRegister:list", name = "激活码列表")
@GetMapping
public CzgResult<Page<MerchantRegister>> get(PageDTO pageDTO, Integer state, String startTime, String endTime) {
return CzgResult.success(merchantRegisterService.get(pageDTO, state, startTime, endTime));
}
/**
* 生成激活码
* 权限标识: merchantRegister:add
* @param merchantRegisterDTO 激活码信息
* @return 是否成功
*/
@SaAdminCheckRole("管理员")
@SaAdminCheckPermission(parentName = "激活码", value = "merchantRegister:add", name = "生成激活码")
@PostMapping
public CzgResult<Boolean> add(@RequestBody @Validated MerchantRegisterDTO merchantRegisterDTO) {
return CzgResult.success(merchantRegisterService.add(merchantRegisterDTO));
}
}

View File

@@ -5,8 +5,10 @@ import com.czg.account.dto.shopinfo.ShopBranchSelectDTO;
import com.czg.account.dto.shopinfo.ShopDetailDTO; import com.czg.account.dto.shopinfo.ShopDetailDTO;
import com.czg.account.dto.shopinfo.ShopInfoAddDTO; import com.czg.account.dto.shopinfo.ShopInfoAddDTO;
import com.czg.account.dto.shopinfo.ShopInfoEditDTO; import com.czg.account.dto.shopinfo.ShopInfoEditDTO;
import com.czg.account.entity.ShopRegister;
import com.czg.account.entity.ShopInfo; import com.czg.account.entity.ShopInfo;
import com.czg.account.service.AuthorizationService; import com.czg.account.service.AuthorizationService;
import com.czg.account.service.ShopRegisterService;
import com.czg.account.service.ShopInfoService; import com.czg.account.service.ShopInfoService;
import com.czg.annotation.SaAdminCheckPermission; import com.czg.annotation.SaAdminCheckPermission;
import com.czg.annotation.SaAdminCheckRole; import com.czg.annotation.SaAdminCheckRole;
@@ -32,6 +34,8 @@ public class ShopInfoController {
private ShopInfoService shopInfoService; private ShopInfoService shopInfoService;
@Resource @Resource
private AuthorizationService authorizationService; private AuthorizationService authorizationService;
@Resource
private ShopRegisterService shopRegisterService;
/** /**
* 店铺列表, 只允许管理员调用 * 店铺列表, 只允许管理员调用
@@ -118,4 +122,17 @@ public class ShopInfoController {
return CzgResult.success(); return CzgResult.success();
} }
/**
* 续期记录
*
* @param pageDTO 分页参数
* @return 续期记录列表
*/
@SaAdminCheckRole("管理员")
@GetMapping("/registerRecord")
public CzgResult<Page<ShopRegister>> get(PageDTO pageDTO, Long shopId) {
Page<ShopRegister> page = shopRegisterService.page(new Page<>(pageDTO.page(), pageDTO.size()),
new QueryWrapper().eq(ShopRegister::getShopId, shopId).orderBy(ShopRegister::getCreateTime, false));
return CzgResult.success(page);
}
} }

View File

@@ -1,16 +0,0 @@
package com.czg.account.dto.register;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
public record MerchantRegisterDTO(
@NotNull(message = "激活时长不能为空")
@Min(1)
Integer periodMonth,
@NotNull(message = "数量不为空")
@Min(1)
@Max(10)
Integer num
) {
}

View File

@@ -4,6 +4,8 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
/** /**
* @author Administrator * @author Administrator
*/ */
@@ -20,8 +22,14 @@ public class ShopInfoAddDTO {
private String frontImg; private String frontImg;
@NotEmpty(message = "试用/正式不为空") @NotEmpty(message = "试用/正式不为空")
private String profiles; private String profiles;
// @NotEmpty(message = "激活码不为空") /**
private String activateCode; * 激活时长
*/
private Integer activateDuration;
/**
* 激活费用
*/
private BigDecimal activateAmount;
@NotEmpty(message = "登录账号不为空") @NotEmpty(message = "登录账号不为空")
private String accountName; private String accountName;
@NotEmpty(message = "登录密码不为空") @NotEmpty(message = "登录密码不为空")

View File

@@ -249,9 +249,13 @@ public class ShopInfoEditDTO {
private String taxAmount; private String taxAmount;
/** /**
* 店铺激活码 * 激活时长
*/ */
private String activateCode; private Integer activateDuration;
/**
* 激活费用
*/
private BigDecimal activateAmount;
/** /**
* 是否为主店 1-是 0-否 * 是否为主店 1-是 0-否
*/ */

View File

@@ -14,7 +14,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
* 激活码 实体类 * 店铺签约 实体类
* *
* @author Administrator * @author Administrator
* @since 2025-02-11 * @since 2025-02-11
@@ -23,8 +23,8 @@ import java.time.LocalDateTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Table("tb_merchant_register") @Table("tb_shop_register")
public class MerchantRegister implements Serializable { public class ShopRegister implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -32,18 +32,13 @@ public class MerchantRegister implements Serializable {
@Id(keyType = KeyType.Auto) @Id(keyType = KeyType.Auto)
private Integer id; private Integer id;
/**
* 激活码
*/
private String registerCode;
/** /**
* 店铺id * 店铺id
*/ */
private Long shopId; private Long shopId;
/** /**
* 激活码金额 * 店铺签约金额
*/ */
private BigDecimal amount; private BigDecimal amount;
@@ -52,11 +47,6 @@ public class MerchantRegister implements Serializable {
*/ */
private Integer periodMonth; private Integer periodMonth;
/**
* 状态0未使用1已使用
*/
private Integer status;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -1,20 +0,0 @@
package com.czg.account.service;
import com.czg.account.dto.PageDTO;
import com.czg.account.dto.register.MerchantRegisterDTO;
import com.czg.account.entity.MerchantRegister;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
/**
* 激活码 服务层。
*
* @author Administrator
* @since 2025-02-11
*/
public interface MerchantRegisterService extends IService<MerchantRegister> {
Page<MerchantRegister> get(PageDTO pageDTO, Integer state, String startTime, String endTime);
Boolean add(MerchantRegisterDTO merchantRegisterDTO);
}

View File

@@ -0,0 +1,14 @@
package com.czg.account.service;
import com.czg.account.entity.ShopRegister;
import com.mybatisflex.core.service.IService;
/**
* 店铺签约 服务层。
*
* @author Administrator
* @since 2025-02-11
*/
public interface ShopRegisterService extends IService<ShopRegister> {
}

View File

@@ -1,6 +1,6 @@
package com.czg.account.vo; package com.czg.account.vo;
import com.czg.account.entity.MerchantRegister; import com.czg.account.entity.ShopRegister;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -11,7 +11,7 @@ import java.time.LocalDateTime;
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class MerchantRegisterVO extends MerchantRegister { public class ShopRegisterVO extends ShopRegister {
private String shopName; private String shopName;
private String phone; private String phone;
private String registerType; private String registerType;

View File

@@ -1,19 +0,0 @@
package com.czg.service.account.mapper;
import com.czg.account.entity.MerchantRegister;
import com.czg.account.vo.MerchantRegisterVO;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 激活码 映射层。
*
* @author Administrator
* @since 2025-02-11
*/
public interface MerchantRegisterMapper extends BaseMapper<MerchantRegister> {
List<MerchantRegisterVO> pageInfo(@Param("state") Integer state, @Param("startTime") String startTime, @Param("endTime") String endTime);
}

View File

@@ -0,0 +1,14 @@
package com.czg.service.account.mapper;
import com.czg.account.entity.ShopRegister;
import com.mybatisflex.core.BaseMapper;
/**
* 店铺签约 映射层。
*
* @author Administrator
* @since 2025-02-11
*/
public interface ShopRegisterMapper extends BaseMapper<ShopRegister> {
}

View File

@@ -1,47 +0,0 @@
package com.czg.service.account.service.impl;
import cn.hutool.core.util.IdUtil;
import com.czg.account.dto.PageDTO;
import com.czg.account.dto.register.MerchantRegisterDTO;
import com.czg.account.entity.MerchantRegister;
import com.czg.account.service.MerchantRegisterService;
import com.czg.service.account.mapper.MerchantRegisterMapper;
import com.czg.utils.PageUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
/**
* 激活码 服务层实现。
*
* @author Administrator
* @since 2025-02-11
*/
@Service
public class MerchantRegisterServiceImpl extends ServiceImpl<MerchantRegisterMapper, MerchantRegister> implements MerchantRegisterService {
@Override
public Page<MerchantRegister> get(PageDTO pageDTO, Integer state, String startTime, String endTime) {
Page<Object> page = PageUtil.buildPage();
PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize()));
return PageUtil.convert(new PageInfo<>(mapper.pageInfo(state, startTime, endTime)));
}
@Override
public Boolean add(MerchantRegisterDTO merchantRegisterDTO) {
ArrayList<MerchantRegister> registers = new ArrayList<>();
for (int i = 0; i < merchantRegisterDTO.num(); i++) {
MerchantRegister tbMerchantRegister = new MerchantRegister();
tbMerchantRegister.setRegisterCode(IdUtil.simpleUUID());
tbMerchantRegister.setStatus(0);
tbMerchantRegister.setPeriodMonth(merchantRegisterDTO.periodMonth());
registers.add(tbMerchantRegister);
}
int i = mapper.insertBatchSelective(registers, 50);
return i > 0;
}
}

View File

@@ -63,7 +63,7 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
@Resource @Resource
private SysUserService sysUserService; private SysUserService sysUserService;
@Resource @Resource
private MerchantRegisterService merchantRegisterService; private ShopRegisterService shopRegisterService;
@Resource @Resource
private ShopTableService shopTableService; private ShopTableService shopTableService;
@Resource @Resource
@@ -147,22 +147,23 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
return page; return page;
} }
private void activateShop(ShopInfo shopInfo, String activateCode) { /**
MerchantRegister merchantRegister = merchantRegisterService.queryChain().eq(MerchantRegister::getRegisterCode, activateCode).one(); * 签约店铺
AssertUtil.isNull(merchantRegister, "激活码不存在"); * @param activateDuration 签约时长
if (merchantRegister.getStatus() == 1) { * @param amount 续期费用
throw new CzgException("激活码已使用"); */
} private void activateShop(ShopInfo shopInfo, Integer activateDuration, BigDecimal amount) {
// 签约/续期
// 续期
if (shopInfo.getExpireTime() != null && shopInfo.getExpireTime().isAfter(LocalDateTime.now())) { if (shopInfo.getExpireTime() != null && shopInfo.getExpireTime().isAfter(LocalDateTime.now())) {
shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(shopInfo.getExpireTime()), merchantRegister.getPeriodMonth()).toLocalDateTime()); shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(shopInfo.getExpireTime()), activateDuration).toLocalDateTime());
} else { } else {
shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(), merchantRegister.getPeriodMonth()).toLocalDateTime()); shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(), activateDuration).toLocalDateTime());
} }
merchantRegister.setStatus(1); ShopRegister register = new ShopRegister();
merchantRegister.setShopId(shopInfo.getId()); register.setShopId(shopInfo.getId());
merchantRegisterService.updateById(merchantRegister); register.setPeriodMonth(activateDuration);
register.setAmount(amount);
shopRegisterService.save(register);
} }
@Override @Override
@@ -207,10 +208,9 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
shopInfo.setProfiles("release"); shopInfo.setProfiles("release");
} }
save(shopInfo); save(shopInfo);
if (StrUtil.isNotBlank(shopInfoAddDTO.getActivateCode())) { if (shopInfoAddDTO.getActivateDuration() != null) {
activateShop(shopInfo, shopInfoAddDTO.getActivateCode()); activateShop(shopInfo, shopInfoAddDTO.getActivateDuration(),shopInfoAddDTO.getActivateAmount());
} }
// 增加支付方式 // 增加支付方式
shopPayTypeService.addInfo(shopInfo.getId()); shopPayTypeService.addInfo(shopInfo.getId());
// 初始化积分霸王餐设置 // 初始化积分霸王餐设置
@@ -264,6 +264,7 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
@Override @Override
@CacheEvict(key = "#shopInfoEditDTO.id") @CacheEvict(key = "#shopInfoEditDTO.id")
@Transactional(rollbackFor = Exception.class)
public Boolean edit(ShopInfoEditDTO shopInfoEditDTO) { public Boolean edit(ShopInfoEditDTO shopInfoEditDTO) {
shopInfoEditDTO.setIsMemberPrice(null); shopInfoEditDTO.setIsMemberPrice(null);
ShopInfo shopInfo; ShopInfo shopInfo;
@@ -298,8 +299,8 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
} else { } else {
throw new CzgException("禁止连锁店/加盟店修改为单店"); throw new CzgException("禁止连锁店/加盟店修改为单店");
} }
if (shopInfoEditDTO.getActivateCode() != null) { if (shopInfoEditDTO.getActivateDuration() != null) {
activateShop(shopInfo, shopInfoEditDTO.getActivateCode()); activateShop(shopInfo, shopInfoEditDTO.getActivateDuration(),shopInfoEditDTO.getActivateAmount());
} }
BeanUtil.copyProperties(shopInfoEditDTO, shopInfo); BeanUtil.copyProperties(shopInfoEditDTO, shopInfo);
if (shopInfoEditDTO.getOperationPwd() != null) { if (shopInfoEditDTO.getOperationPwd() != null) {

View File

@@ -0,0 +1,18 @@
package com.czg.service.account.service.impl;
import com.czg.account.entity.ShopRegister;
import com.czg.account.service.ShopRegisterService;
import com.czg.service.account.mapper.ShopRegisterMapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 店铺签约 服务层实现。
*
* @author Administrator
* @since 2025-02-11
*/
@Service
public class ShopRegisterServiceImpl extends ServiceImpl<ShopRegisterMapper, ShopRegister> implements ShopRegisterService {
}

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.account.mapper.MerchantRegisterMapper">
<select id="pageInfo" resultType="com.czg.account.vo.MerchantRegisterVO">
select a.*, b.shop_name, b.phone, b.register_type, b.expire_time
from tb_merchant_register as a
left join tb_shop_info as b on a.shop_id = b.id
<where>
<if test="state != null">
a.status=#{state}
</if>
<if test="startTime != null and startTime != ''">
a.create_time >= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
a.create_time &lt;= #{endTime}
</if>
</where>
order by a.create_time desc
</select>
</mapper>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.account.mapper.ShopRegisterMapper">
</mapper>