套餐推广管理端接口

This commit is contained in:
gong
2025-12-18 15:17:05 +08:00
parent a1ad1088bb
commit 6256d72a13
24 changed files with 1331 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
package com.czg.service.market.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.PpHelpRecord;
/**
* 套餐推广助力记录 映射层。
*
* @author gyj
* @since 2025-12-18
*/
public interface PpHelpRecordMapper extends BaseMapper<PpHelpRecord> {
}

View File

@@ -0,0 +1,14 @@
package com.czg.service.market.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.PpPackage;
/**
* 套餐推广套餐 映射层。
*
* @author gyj
* @since 2025-12-18
*/
public interface PpPackageMapper extends BaseMapper<PpPackage> {
}

View File

@@ -0,0 +1,14 @@
package com.czg.service.market.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.PpPackageOrder;
/**
* 套餐推广订单 映射层。
*
* @author gyj
* @since 2025-12-18
*/
public interface PpPackageOrderMapper extends BaseMapper<PpPackageOrder> {
}

View File

@@ -0,0 +1,18 @@
package com.czg.service.market.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.market.entity.PpHelpRecord;
import com.czg.market.service.PpHelpRecordService;
import com.czg.service.market.mapper.PpHelpRecordMapper;
import org.springframework.stereotype.Service;
/**
* 套餐推广助力记录 服务层实现。
*
* @author gyj
* @since 2025-12-18
*/
@Service
public class PpHelpRecordServiceImpl extends ServiceImpl<PpHelpRecordMapper, PpHelpRecord> implements PpHelpRecordService{
}

View File

@@ -0,0 +1,78 @@
package com.czg.service.market.service.impl;
import com.czg.constants.PpPackageConstants;
import com.czg.constants.SystemConstants;
import com.czg.enums.OrderNoPrefixEnum;
import com.czg.exception.CzgException;
import com.czg.market.entity.PpPackage;
import com.czg.market.entity.PpPackageOrder;
import com.czg.market.service.PpPackageOrderService;
import com.czg.sa.StpKit;
import com.czg.service.market.mapper.PpPackageMapper;
import com.czg.service.market.mapper.PpPackageOrderMapper;
import com.czg.utils.CzgRandomUtils;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* 套餐推广订单 服务层实现。
*
* @author gyj
* @since 2025-12-18
*/
@Service
public class PpPackageOrderServiceImpl extends ServiceImpl<PpPackageOrderMapper, PpPackageOrder> implements PpPackageOrderService {
@Resource
private PpPackageMapper ppPackageMapper;
@Override
public Long createPackageOrder(Long packageId) {
PpPackage aPackage = ppPackageMapper.selectOneByQuery(QueryWrapper.create().eq(PpPackage::getId, packageId)
.eq(PpPackage::getIsDel, SystemConstants.OneZero.ZERO));
if (aPackage == null) {
throw new CzgException("套餐不存在");
}
if (!aPackage.getOnlineStatus().equals(SystemConstants.OneZero.ONE)) {
throw new CzgException("套餐已下架");
}
PpPackageOrder order = new PpPackageOrder()
.setShopId(aPackage.getShopId())
.setPackageId(packageId)
.setUserId(StpKit.USER.getLoginIdAsLong())
.setShareNum(0)
.setOrderNo(CzgRandomUtils.randomNumber(OrderNoPrefixEnum.PPO, 12, false))
.setStatus(PpPackageConstants.OrderStatus.PROCESSING);
save(order);
return order.getId();
}
@Override
public long getProgressingPackageOrderCount(Long packageId) {
QueryWrapper wrapper = QueryWrapper.create().eq(PpPackageOrder::getPackageId, packageId)
.eq(PpPackageOrder::getStatus, PpPackageConstants.OrderStatus.PROCESSING);
return count(wrapper);
}
@Override
public void cancelProgressingPackageOrder(Long shopId, Long packageId) {
UpdateChain<PpPackageOrder> update = UpdateChain.of(PpPackageOrder.class)
.set(PpPackageOrder::getStatus, PpPackageConstants.OrderStatus.CANCEL)
.set(PpPackageOrder::getCancelTime, LocalDateTime.now())
.set(PpPackageOrder::getCancelReason, "商家下架套餐");
if (packageId != null && packageId > 0L) {
update.eq(PpPackageOrder::getPackageId, packageId);
}
update.eq(PpPackageOrder::getShopId, shopId)
.eq(PpPackageOrder::getStatus, PpPackageConstants.OrderStatus.PROCESSING)
.update();
}
}

View File

@@ -0,0 +1,201 @@
package com.czg.service.market.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.czg.account.entity.ShopConfig;
import com.czg.account.service.ShopConfigService;
import com.czg.account.service.ShopInfoService;
import com.czg.constants.SystemConstants;
import com.czg.exception.CzgException;
import com.czg.market.entity.PpPackage;
import com.czg.market.service.PpPackageOrderService;
import com.czg.market.service.PpPackageService;
import com.czg.market.vo.PpPackagePageReqVo;
import com.czg.market.vo.PpPackageVO;
import com.czg.sa.StpKit;
import com.czg.service.market.mapper.PpPackageMapper;
import com.czg.utils.AssertUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 套餐推广套餐 服务层实现。
*
* @author gyj
* @since 2025-12-18
*/
@Service
public class PpPackageServiceImpl extends ServiceImpl<PpPackageMapper, PpPackage> implements PpPackageService {
@Resource
private PpPackageOrderService ppPackageOrderService;
@DubboReference
private ShopInfoService shopInfoService;
@DubboReference
private ShopConfigService shopConfigService;
@Override
public Integer getPackagePromotionSwitch() {
return shopConfigService.getById(StpKit.USER.getShopId()).getIsPackagePromotion();
}
@Override
@Transactional
public boolean updatePackagePromotionSwitch(Integer status) {
Long shopId = StpKit.USER.getShopId();
ShopConfig shopConfig = new ShopConfig();
shopConfig.setIsPackagePromotion(status);
boolean update = shopConfigService.update(shopConfig, query().eq(ShopConfig::getId, shopId));
if (update && status == 0) {
// 下架所有进行中的套餐订单
UpdateChain.of(PpPackage.class)
.set(PpPackage::getOnlineStatus, SystemConstants.OneZero.ZERO)
.eq(PpPackage::getShopId, shopId)
.update();
ppPackageOrderService.cancelProgressingPackageOrder(StpKit.USER.getShopId(), 0L);
}
return update;
}
@Override
public void insertPackage(PpPackageVO packageVO) {
if (SystemConstants.SubShopType.CUSTOM.equals(packageVO.getUseShopType())) {
AssertUtil.isBlank(packageVO.getUseShops(), "请配置可用门店");
}
Long shopId = StpKit.USER.getShopId();
// 查询名称是否存在
PpPackage ppPackage = getOne(QueryWrapper.create().eq(PpPackage::getPackageName, packageVO.getPackageName())
.eq(PpPackage::getShopId, shopId).eq(PpPackage::getIsDel, SystemConstants.OneZero.ZERO));
if (ppPackage != null) {
throw new CzgException("名称已存在");
}
ppPackage = BeanUtil.copyProperties(packageVO, PpPackage.class);
ppPackage.setShopId(shopId);
ppPackage.setPackageContent(JSONObject.toJSONString(packageVO.getPackageContent()));
ppPackage.setUseWeeks(JSONObject.toJSONString(packageVO.getUseWeeks()));
ppPackage.setTieredDiscount(JSONObject.toJSONString(packageVO.getTieredDiscount()));
save(ppPackage);
}
@Override
public void updatePackage(PpPackageVO packageVO) {
if (SystemConstants.SubShopType.CUSTOM.equals(packageVO.getUseShopType())) {
AssertUtil.isBlank(packageVO.getUseShops(), "请配置可用门店");
}
Long shopId = StpKit.USER.getShopId();
PpPackage ppPackage = getPackageById(packageVO.getId());
if (!ppPackage.getShopId().equals(shopId)) {
throw new CzgException("无权限");
}
ppPackage = BeanUtil.copyProperties(packageVO, PpPackage.class);
ppPackage.setPackageContent(JSONObject.toJSONString(packageVO.getPackageContent()));
ppPackage.setUseWeeks(JSONObject.toJSONString(packageVO.getUseWeeks()));
ppPackage.setTieredDiscount(JSONObject.toJSONString(packageVO.getTieredDiscount()));
updateById(ppPackage);
}
@Override
@Transactional
public long deletePackage(Long id) {
Long shopId = StpKit.USER.getShopId();
PpPackage ppPackage = getPackageById(id);
if (!ppPackage.getShopId().equals(shopId)) {
throw new RuntimeException("无权限");
}
long orderCount = ppPackageOrderService.getProgressingPackageOrderCount(id);
if (orderCount > 0) {
return orderCount;
}
ppPackage.setIsDel(1);
updateById(ppPackage);
return 0L;
}
@Override
@Transactional
public void sureDeletePackage(Long id) {
PpPackage ppPackage = getPackageById(id);
ppPackage.setIsDel(1);
updateById(ppPackage);
ppPackageOrderService.cancelProgressingPackageOrder(StpKit.USER.getShopId(), id);
}
@Override
public Page<PpPackageVO> getPackagePage(PpPackagePageReqVo reqVo, boolean isAdmin) {
Long shopId = StpKit.USER.getShopId();
// 如果没有开启操作,直接返回空数据
ShopConfig shopConfig = shopConfigService.getById(shopId);
if (SystemConstants.OneZero.ZERO.equals(shopConfig.getIsPackagePromotion())) {
return new Page<>();
}
Long mainShopId = shopInfoService.getMainIdByShopId(shopId);
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq(PpPackage::getIsDel, SystemConstants.OneZero.ZERO)
.eq(PpPackage::getOnlineStatus, reqVo.getOnlineStatus())
.like(PpPackage::getPackageName, reqVo.getPackageName())
.orderBy(PpPackage::getCreateTime).desc();
queryWrapper.and(q -> {
q.eq(PpPackage::getShopId, shopId).or(q1 -> {
q1.eq(PpPackage::getUseShopType, SystemConstants.SubShopType.ALL).eq(PpPackage::getShopId, mainShopId);
}).or(q2 -> {
q2.eq(PpPackage::getUseShopType, SystemConstants.SubShopType.CUSTOM).and("FIND_IN_SET( " + shopId + ", use_shops ) > 0");
});
});
Page<PpPackage> page = page(Page.of(reqVo.getPage(), reqVo.getSize()), queryWrapper);
List<PpPackageVO> voList = new ArrayList<>();
page.getRecords().forEach(item -> {
PpPackageVO packageVO = BeanUtil.copyProperties(item, PpPackageVO.class);
packageVO.setUseWeeks(JSONArray.parseArray(item.getUseWeeks(), String.class));
packageVO.setPackageContent(JSONArray.parseArray(item.getPackageContent(), PpPackageVO.PackageContent.class));
packageVO.setTieredDiscount(JSONArray.parseArray(item.getTieredDiscount(), PpPackageVO.TieredDiscount.class));
voList.add(packageVO);
});
Page<PpPackageVO> voPage = new Page<>();
BeanUtil.copyProperties(page, voPage, "records");
voPage.setRecords(voList);
return voPage;
}
private PpPackage getPackageById(Long id) {
PpPackage ppPackage = getOne(QueryWrapper.create().eq(PpPackage::getId, id)
.eq(PpPackage::getIsDel, SystemConstants.OneZero.ZERO));
if (ppPackage == null) {
throw new RuntimeException("套餐不存在");
}
return ppPackage;
}
}

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.market.mapper.PpHelpRecordMapper">
</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.market.mapper.PpPackageMapper">
</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.market.mapper.PpPackageOrderMapper">
</mapper>