From 95747a2a7193dae78836c6a0ce0b36d22703caba Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 25 Feb 2025 15:03:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ycwl/basic/biz/PriceBiz.java | 7 ++ .../com/ycwl/basic/config/WechatConfig.java | 5 - .../controller/pc/PriceConfigController.java | 74 ++++++++++++++ .../ycwl/basic/mapper/PriceConfigMapper.java | 20 ++++ .../pc/price/entity/PriceConfigEntity.java | 38 ++++++++ .../pc/price/req/PriceConfigListReq.java | 10 ++ .../model/pc/price/resp/GoodsListRespVO.java | 13 +++ .../pc/price/resp/PriceConfigRespVO.java | 34 +++++++ .../basic/repository/PriceRepository.java | 60 ++++++++++++ .../basic/service/PriceConfigService.java | 22 +++++ .../service/impl/PriceConfigServiceImpl.java | 97 +++++++++++++++++++ src/main/resources/application-prod.yml | 3 - .../resources/mapper/PriceConfigMapper.xml | 59 +++++++++++ 13 files changed, 434 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/biz/PriceBiz.java create mode 100644 src/main/java/com/ycwl/basic/controller/pc/PriceConfigController.java create mode 100644 src/main/java/com/ycwl/basic/mapper/PriceConfigMapper.java create mode 100644 src/main/java/com/ycwl/basic/model/pc/price/entity/PriceConfigEntity.java create mode 100644 src/main/java/com/ycwl/basic/model/pc/price/req/PriceConfigListReq.java create mode 100644 src/main/java/com/ycwl/basic/model/pc/price/resp/GoodsListRespVO.java create mode 100644 src/main/java/com/ycwl/basic/model/pc/price/resp/PriceConfigRespVO.java create mode 100644 src/main/java/com/ycwl/basic/repository/PriceRepository.java create mode 100644 src/main/java/com/ycwl/basic/service/PriceConfigService.java create mode 100644 src/main/java/com/ycwl/basic/service/impl/PriceConfigServiceImpl.java create mode 100644 src/main/resources/mapper/PriceConfigMapper.xml diff --git a/src/main/java/com/ycwl/basic/biz/PriceBiz.java b/src/main/java/com/ycwl/basic/biz/PriceBiz.java new file mode 100644 index 0000000..6b04c9f --- /dev/null +++ b/src/main/java/com/ycwl/basic/biz/PriceBiz.java @@ -0,0 +1,7 @@ +package com.ycwl.basic.biz; + +import org.springframework.stereotype.Component; + +@Component +public class PriceBiz { +} diff --git a/src/main/java/com/ycwl/basic/config/WechatConfig.java b/src/main/java/com/ycwl/basic/config/WechatConfig.java index ec096ea..ee83f8e 100644 --- a/src/main/java/com/ycwl/basic/config/WechatConfig.java +++ b/src/main/java/com/ycwl/basic/config/WechatConfig.java @@ -25,11 +25,6 @@ public class WechatConfig { */ private String appSecret; - /** - * 公众号推送模板 - */ - @Value("${wx.push.templateId}") - private String templateId; /** * 小程序的AppId diff --git a/src/main/java/com/ycwl/basic/controller/pc/PriceConfigController.java b/src/main/java/com/ycwl/basic/controller/pc/PriceConfigController.java new file mode 100644 index 0000000..0f55214 --- /dev/null +++ b/src/main/java/com/ycwl/basic/controller/pc/PriceConfigController.java @@ -0,0 +1,74 @@ +package com.ycwl.basic.controller.pc; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; +import com.ycwl.basic.model.pc.price.req.PriceConfigListReq; +import com.ycwl.basic.model.pc.price.resp.GoodsListRespVO; +import com.ycwl.basic.model.pc.price.resp.PriceConfigRespVO; +import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; +import com.ycwl.basic.repository.PriceRepository; +import com.ycwl.basic.repository.TemplateRepository; +import com.ycwl.basic.service.PriceConfigService; +import com.ycwl.basic.utils.ApiResponse; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/api/priceConfig/v1") +public class PriceConfigController { + + @Autowired + private PriceConfigService priceConfigService; + @Autowired + private PriceRepository priceRepository; + + @GetMapping("/goodsList") + public ApiResponse> goodsList(@RequestParam Long scenicId) { + return ApiResponse.success(priceConfigService.listGoodsByScenic(scenicId)); + } + + @PostMapping("/add") + public ApiResponse addPriceConfig(@RequestBody PriceConfigEntity priceConfig) { + priceConfig.setId(null); + priceConfigService.save(priceConfig); + return ApiResponse.success(priceConfig); + } + + @PostMapping("/update") + public ApiResponse updatePriceConfig(@RequestBody PriceConfigEntity priceConfig) { + priceRepository.clearPriceCache(priceConfig.getId()); + priceConfigService.updateById(priceConfig); + priceRepository.clearPriceCache(priceConfig.getId()); + return ApiResponse.success(priceConfig); + } + + @DeleteMapping("/delete/{id}") + public ApiResponse deletePriceConfig(@PathVariable Integer id) { + priceRepository.clearPriceCache(id); + priceConfigService.removeById(id); + return ApiResponse.success(true); + } + + @GetMapping("/{id}") + public ApiResponse getPriceConfigById(@PathVariable Integer id) { + PriceConfigRespVO config = priceConfigService.findById(id); + priceConfigService.fillGoodsName(config); + return ApiResponse.success(config); + } + + @GetMapping("/list") + public ApiResponse> list(@RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "10") int pageSize, + @ModelAttribute PriceConfigListReq req) { + PageHelper.startPage(pageNum, pageSize); + List result = priceConfigService.listByCondition(req); + priceConfigService.fillGoodsName(result); + PageInfo pageInfo = new PageInfo<>(result); + return ApiResponse.success(pageInfo); + } +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/mapper/PriceConfigMapper.java b/src/main/java/com/ycwl/basic/mapper/PriceConfigMapper.java new file mode 100644 index 0000000..b617cfd --- /dev/null +++ b/src/main/java/com/ycwl/basic/mapper/PriceConfigMapper.java @@ -0,0 +1,20 @@ +package com.ycwl.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; +import com.ycwl.basic.model.pc.price.req.PriceConfigListReq; +import com.ycwl.basic.model.pc.price.resp.PriceConfigRespVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface PriceConfigMapper extends BaseMapper { + PriceConfigRespVO getById(@Param("id") Integer id); + List listByCondition(@Param("req") PriceConfigListReq req); + + PriceConfigEntity getPriceByScenicTypeGoods(Long scenicId, Integer type, String goodsId); +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/model/pc/price/entity/PriceConfigEntity.java b/src/main/java/com/ycwl/basic/model/pc/price/entity/PriceConfigEntity.java new file mode 100644 index 0000000..0b13328 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/price/entity/PriceConfigEntity.java @@ -0,0 +1,38 @@ +package com.ycwl.basic.model.pc.price.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("price_config") +public class PriceConfigEntity { + @TableId(type = IdType.AUTO) + private Integer id; + /** + * 景区ID + */ + private Long scenicId; + /** + * 类型:-1一口价,0单个定价,1打包定价 + */ + private Integer type; + /** + * 商品ID,多个用逗号隔开 + */ + private String goodsIds; + /** + * 价格 + */ + private BigDecimal price; + /** + * 划线价格 + */ + private BigDecimal slashPrice; + private Date createTime; + private Date updateTime; +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/model/pc/price/req/PriceConfigListReq.java b/src/main/java/com/ycwl/basic/model/pc/price/req/PriceConfigListReq.java new file mode 100644 index 0000000..2108aa5 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/price/req/PriceConfigListReq.java @@ -0,0 +1,10 @@ +package com.ycwl.basic.model.pc.price.req; + +import lombok.Data; + +@Data +public class PriceConfigListReq { + private Long scenicId; + private Integer type; + private Long goodsId; +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/model/pc/price/resp/GoodsListRespVO.java b/src/main/java/com/ycwl/basic/model/pc/price/resp/GoodsListRespVO.java new file mode 100644 index 0000000..e07cec7 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/price/resp/GoodsListRespVO.java @@ -0,0 +1,13 @@ +package com.ycwl.basic.model.pc.price.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class GoodsListRespVO { + private Long goodsId; + private String goodsName; +} diff --git a/src/main/java/com/ycwl/basic/model/pc/price/resp/PriceConfigRespVO.java b/src/main/java/com/ycwl/basic/model/pc/price/resp/PriceConfigRespVO.java new file mode 100644 index 0000000..2c0f406 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/price/resp/PriceConfigRespVO.java @@ -0,0 +1,34 @@ +package com.ycwl.basic.model.pc.price.resp; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class PriceConfigRespVO { + private Integer id; + private String scenicName; + /** + * 景区ID + */ + private Long scenicId; + /** + * 类型:-1一口价,0单个定价,1打包定价 + */ + private Integer type; + /** + * 商品ID,多个用逗号隔开 + */ + private String goodsIds; + private String goodsNames; + /** + * 价格 + */ + private BigDecimal price; + /** + * 划线价格 + */ + private BigDecimal slashPrice; + private Date createTime; +} diff --git a/src/main/java/com/ycwl/basic/repository/PriceRepository.java b/src/main/java/com/ycwl/basic/repository/PriceRepository.java new file mode 100644 index 0000000..7cd0f4e --- /dev/null +++ b/src/main/java/com/ycwl/basic/repository/PriceRepository.java @@ -0,0 +1,60 @@ +package com.ycwl.basic.repository; + +import com.alibaba.fastjson.JSON; +import com.ycwl.basic.mapper.PriceConfigMapper; +import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; + +@Component +public class PriceRepository { + @Autowired + private PriceConfigMapper mapper; + @Autowired + private RedisTemplate redisTemplate; + public static final String PRICE_SCENIC_TYPE_GOODS_CACHE = "price:s%s:t%s:g%s"; + public static final String PRICE_ID_CACHE = "price:%s"; + + public PriceConfigEntity getPriceConfigByScenicTypeGoods(Long scenicId, Integer type, String goodsId) { + String cacheKey = String.format(PRICE_SCENIC_TYPE_GOODS_CACHE, scenicId, type, goodsId); + PriceConfigEntity priceConfigEntity = null; + if (redisTemplate.hasKey(cacheKey)) { + priceConfigEntity = JSON.parseObject(redisTemplate.opsForValue().get(cacheKey), PriceConfigEntity.class); + } + if (priceConfigEntity == null) { + PriceConfigEntity priceConfig = mapper.getPriceByScenicTypeGoods(scenicId, type, goodsId); + if (priceConfig != null) { + redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(priceConfig)); + redisTemplate.opsForValue().set(String.format(PRICE_ID_CACHE, priceConfig.getId()), JSON.toJSONString(priceConfig)); + } + } + return priceConfigEntity; + } + + public PriceConfigEntity getPriceConfig(Integer id) { + String cacheKey = String.format(PRICE_ID_CACHE, id); + PriceConfigEntity priceConfigEntity = null; + if (redisTemplate.hasKey(cacheKey)) { + priceConfigEntity = JSON.parseObject(redisTemplate.opsForValue().get(cacheKey), PriceConfigEntity.class); + } + return priceConfigEntity; + } + + public void clearPriceCache(Integer id) { + if (redisTemplate.hasKey(String.format(PRICE_ID_CACHE, id))) { + PriceConfigEntity priceConfig = getPriceConfig(id); + if (priceConfig != null) { + clearPriceCache(priceConfig.getScenicId(), priceConfig.getType(), priceConfig.getGoodsIds()); + } + } + redisTemplate.delete(String.format(PRICE_ID_CACHE, id)); + } + + public void clearPriceCache(Long scenicId, Integer type, String goodsId) { + String cacheKey = String.format(PRICE_SCENIC_TYPE_GOODS_CACHE, scenicId, type, goodsId); + redisTemplate.delete(cacheKey); + } +} diff --git a/src/main/java/com/ycwl/basic/service/PriceConfigService.java b/src/main/java/com/ycwl/basic/service/PriceConfigService.java new file mode 100644 index 0000000..fdffa52 --- /dev/null +++ b/src/main/java/com/ycwl/basic/service/PriceConfigService.java @@ -0,0 +1,22 @@ +package com.ycwl.basic.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; +import com.ycwl.basic.model.pc.price.req.PriceConfigListReq; +import com.ycwl.basic.model.pc.price.resp.GoodsListRespVO; +import com.ycwl.basic.model.pc.price.resp.PriceConfigRespVO; + +import java.util.List; + +public interface PriceConfigService extends IService { + + List listByCondition(PriceConfigListReq req); + + PriceConfigRespVO findById(Integer id); + + List listGoodsByScenic(Long scenicId); + + void fillGoodsName(List result); + + void fillGoodsName(PriceConfigRespVO config); +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/service/impl/PriceConfigServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/PriceConfigServiceImpl.java new file mode 100644 index 0000000..0bfe168 --- /dev/null +++ b/src/main/java/com/ycwl/basic/service/impl/PriceConfigServiceImpl.java @@ -0,0 +1,97 @@ +package com.ycwl.basic.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ycwl.basic.mapper.PriceConfigMapper; +import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; +import com.ycwl.basic.model.pc.price.req.PriceConfigListReq; +import com.ycwl.basic.model.pc.price.resp.GoodsListRespVO; +import com.ycwl.basic.model.pc.price.resp.PriceConfigRespVO; +import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; +import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; +import com.ycwl.basic.repository.ScenicRepository; +import com.ycwl.basic.repository.TemplateRepository; +import com.ycwl.basic.service.PriceConfigService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Service +public class PriceConfigServiceImpl extends ServiceImpl implements PriceConfigService { + + @Autowired + private TemplateRepository templateRepository; + @Autowired + private ScenicRepository scenicRepository; + + @Override + public List listByCondition(PriceConfigListReq req) { + return baseMapper.listByCondition(req); + } + + @Override + public PriceConfigRespVO findById(Integer id) { + return baseMapper.getById(id); + } + + @Override + public List listGoodsByScenic(Long scenicId) { + List goodsList = new ArrayList<>(); + // 景区视频 + List templateList = templateRepository.getTemplateListByScenicId(scenicId); + templateList.stream().map(template -> { + GoodsListRespVO goods = new GoodsListRespVO(); + goods.setGoodsId(template.getId()); + goods.setGoodsName(template.getName()); + return goods; + }).forEach(goodsList::add); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); + if (scenicConfig != null) { + if (!Integer.valueOf(1).equals(scenicConfig.getDisableSourceVideo())) { + goodsList.add(new GoodsListRespVO(1L, "原片集")); + } + if (!Integer.valueOf(1).equals(scenicConfig.getDisableSourceImage())) { + goodsList.add(new GoodsListRespVO(2L, "照片集")); + } + } + return goodsList; + } + + @Override + public void fillGoodsName(List result) { + for (PriceConfigRespVO item : result) { + fillGoodsName(item); + } + } + + @Override + public void fillGoodsName(PriceConfigRespVO item) { + if (Integer.valueOf(-1).equals(item.getType())) { + item.setGoodsNames("景区内所有售卖商品"); + } else if (StringUtils.isNotBlank(item.getGoodsIds())) { + List goodsNames = new ArrayList<>(); + for (String s : item.getGoodsIds().split(",")) { + if (StringUtils.equals(s, "1")) { + goodsNames.add("原片集"); + } else if (StringUtils.equals(s, "2")) { + goodsNames.add("照片集"); + } else { + if (StringUtils.isNumeric(s)) { + TemplateRespVO template = templateRepository.getTemplate(Long.valueOf(s)); + if (template != null) { + goodsNames.add(template.getName()); + } else { + goodsNames.add("?未知商品【"+s+"】?"); + } + } else { + goodsNames.add("!未知商品【"+s+"】!"); + } + } + } + item.setGoodsNames(StringUtils.join(goodsNames, ",")); + } + } +} \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 5928a25..c296096 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -70,9 +70,6 @@ wx: miniProgramSecret: 5252fbbc68513bc77b7cc0052b9f9695 # 申请openid授权 grandType: authorization_code - # 推送模板 - push: - templateId: 5b8vTm7kvwYubqDxb3dxBqFIhc3Swt5l7QHSK5r-ZRI # 商户号 mchId: 1700540331 # 商户证书序列号 diff --git a/src/main/resources/mapper/PriceConfigMapper.xml b/src/main/resources/mapper/PriceConfigMapper.xml new file mode 100644 index 0000000..01a686b --- /dev/null +++ b/src/main/resources/mapper/PriceConfigMapper.xml @@ -0,0 +1,59 @@ + + + + + + + insert into price_config (scenic_id, type, goods_ids, price, slash_price, create_time, update_time) + values (#{scenicId}, #{type}, #{goodsIds}, #{price}, #{slashPrice}, now(), now()) + + + + update price_config + + scenic_id = #{scenicId}, + type = #{type}, + goods_ids = #{goodsIds}, + price = #{price}, + slash_price = #{slashPrice}, + update_time = now() + + where id = #{id} + + + + delete from price_config where id = #{id} + + + + + + + \ No newline at end of file