package com.wsl.shoppingkill.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wsl.shoppingkill.common.log.MyLog;
import com.wsl.shoppingkill.common.util.ObjectUtil;
import com.wsl.shoppingkill.domain.Activity;
import com.wsl.shoppingkill.domain.Advertise;
import com.wsl.shoppingkill.domain.Goods;
import com.wsl.shoppingkill.domain.Sku;
import com.wsl.shoppingkill.mapper.ActivityMapper;
import com.wsl.shoppingkill.mapper.GoodsMapper;
import com.wsl.shoppingkill.mapper.SkuMapper;
import com.wsl.shoppingkill.obj.constant.LoggerEnum;
import com.wsl.shoppingkill.obj.constant.RedisEnum;
import com.wsl.shoppingkill.obj.param.ActivityParam;
import com.wsl.shoppingkill.obj.param.ActivityUpdateParam;
import com.wsl.shoppingkill.obj.vo.ActivityByGoodsVO;
import com.wsl.shoppingkill.obj.vo.ActivityVO;
import com.wsl.shoppingkill.obj.vo.KillGoodsVO;
import com.wsl.shoppingkill.service.ActivityService;
import com.wsl.shoppingkill.service.SkuService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author WangShilei
*/
@Service
@Slf4j
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> implements ActivityService {
@Resource
private ActivityMapper activityMapper;
@Resource
private GoodsMapper goodsMapper;
@Resource
private SkuMapper skuMapper;
@Resource
private SkuService skuService;
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Override
public List<ActivityVO> getActivityAll(ActivityParam activityParam) {
activityParam.setTime(LocalDateTime.now());
return activityMapper.getActivityAll(activityParam);
}
@Override
public List<KillGoodsVO> getActivityFuture() {
LocalDateTime now = LocalDateTime.now().plusHours(1).withMinute(0).withSecond(0).withNano(0);
LocalDateTime end = now.plusHours(5);
Set<String> keys = redisTemplate.keys(RedisEnum.GOODS_FUTURE + "*");
if (CollectionUtils.isNotEmpty(keys)) {
List<Object> redisList = redisTemplate.executePipelined((RedisCallback<Object>) redisConnection -> {
redisConnection.openPipeline();
keys.forEach(li -> redisConnection.get(li.getBytes()));
return null;
});
List<KillGoodsVO> activitiesList = ObjectUtil.castList(redisList, KillGoodsVO.class);
activitiesList = activitiesList.stream().filter(Objects::nonNull).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(activitiesList)) {
return activitiesList;
}
}
List<Activity> activities = activityMapper.selectList(new QueryWrapper<Activity>()
.ge(Advertise.START_TIME, now)
.le(Advertise.START_TIME, end));
if (CollectionUtils.isEmpty(activities)) {
return new ArrayList<>();
}
List<KillGoodsVO> goodsByActivity = getGoodsByActivity(activities);
redisTemplate.executePipelined(new SessionCallback() {
//管道操作
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
for (KillGoodsVO activity : goodsByActivity) {
if (activity.getId() != null) {
String s = RedisEnum.GOODS_FUTURE + activity.getId();
operations.opsForValue().set(s, activity, 1L, TimeUnit.HOURS);
}
}
return null;
}
});
return goodsByActivity;
}
@Override
public List<KillGoodsVO> getActivityDoing(LocalDateTime now) {
if (now == null) {
now = LocalDateTime.now();
}
List<Activity> activities = activityMapper.selectList(new QueryWrapper<Activity>()
.le(Advertise.START_TIME, now)
.ge(Advertise.END_TIME, now));
if (CollectionUtils.isNotEmpty(activities)) {
return getGoodsByActivity(activities);
}
return new ArrayList<>();
}
@Override
public IPage<ActivityByGoodsVO> getActivityByGoods(Long current, Long size, Long id, String name) {
return goodsMapper.getActivityBuyGoods(new Page<>(current, size), id, name);
}
@Override
@MyLog(detail = "添加/更新一个活动", grade = LoggerEnum.WORN)
@Transactional(rollbackFor = Exception.class)
public boolean addOrUpdateActivity(ActivityUpdateParam activity) {
List<Activity> activityList = new ArrayList<>(8);
//获取对应商品的SKU数量
Sku sku = new Sku();
Map<Long, List<Sku>> collect = sku.selectList(new QueryWrapper<Sku>().select(Sku.ID, Sku.NUM)
.in(Sku.ID, activity.getSkuList()
.stream()
.map(ActivityUpdateParam.Sku::getId)
.map(String::valueOf)
.collect(Collectors.toList())
)).stream().collect(Collectors.groupingBy(Sku::getId));
log.info(activity.getSkuList().toString());
//如果有交叉时段,则不更新
List<Long> ids = new ArrayList<>();
collect.values().forEach(li -> li.forEach(v -> ids.add(v.getId())));
long count = activityMapper.selectList(new QueryWrapper<Activity>()
.in(Activity.SKU_ID, ids)
.le(Activity.START_TIME, activity.getStartTime())
.ge(Activity.END_TIME, activity.getStartTime())
.or()
.in(Activity.SKU_ID, ids)
.le(Activity.START_TIME, activity.getEndTime())
.ge(Activity.END_TIME, activity.getEndTime())
).size();
if (count > 0) {
return false;
}
//遍历判断
List<Sku> skuListTemp = new ArrayList<>();
activity.getSkuList().forEach(li -> {
Activity activityTemp = new Activity();
activityTemp.setStartTime(activity.getStartTime())
.setEndTime(activity.getEndTime())
.setUpdateTime(LocalDateTime.now())
.setSkuId(li.getId());
//设置id更新
if (li.getAId() != null && li.getAId() > 0) {
activityTemp.setId(li.getAId());
} else {
activityTemp.setCreatTime(LocalDateTime.now());
}
//价格>0才更新
if (li.getPrice().compareTo(BigDecimal.ZERO) > 0) {
activityTemp.setPrice(li.getPrice());
}
//数量不能超库存数量
//TODO: bug
if (li.getTotalNum() <= collect.get(li.getId()).get(0).getNum()) {
activityTemp.setTotalNum(li.getTotalNum()).setSellNum(li.getTotalNum());
} else {
activityTemp.setTotalNum(collect.get(li.getId()).get(0).getNum()).setSellNum(collect.get(li.getId()).get(0).getNum());
}
Sku sku1 = collect.get(li.getId()).get(
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip 自己的高分毕业设计项目,感谢张老师的指导,代码完整下载即用,确保可以运行。 基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip 自己的高分毕业设计项目,感谢张老师的指导,代码完整下载即用,确保可以运行。基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip 自己的高分毕业设计项目,感谢张老师的指导,代码完整下载即用,确保可以运行。基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip 自己的高分毕业设计项目,感谢张老师的指导,代码完整下载即用,确保可以运行。基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip 自己的高分毕业设计项目,感谢张老师的指导,代码完整下载即用,确保可以运行。基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip 自己的高分毕业设计项目,感谢张老师的
资源推荐
资源详情
资源评论
收起资源包目录
基于Springboot+Redis+Mysql的商品秒杀系统源码+数据库(毕业设计).zip (951个子文件)
mvnw.cmd 6KB
Nginx.conf 715B
summernote-bs3.css 143KB
style.css 134KB
bootstrap.min.css 118KB
animate.css 64KB
style.css 35KB
datepicker3.css 33KB
font-awesome.css 32KB
bootstrap-rtl.css 31KB
font-awesome.min.css 27KB
ambiance.css 25KB
style.min.css 25KB
bootstrap-editable.css 21KB
sweetalert.css 18KB
simditor.css 17KB
ui.jqgrid.css 16KB
proList.css 15KB
jquery-ui-1.10.4.custom.min.css 14KB
jasny-bootstrap.min.css 14KB
ionic.css 13KB
chosen.css 12KB
dropzone.css 11KB
layer.css 11KB
layim.css 11KB
fullcalendar.css 11KB
summernote.css 10KB
plyr.css 10KB
myorder.css 9KB
comboselect.css 8KB
webuploader-demo.css 7KB
codemirror.css 7KB
carts.css 7KB
public.css 7KB
blueimp-gallery.min.css 7KB
awesome-bootstrap-checkbox.css 7KB
toastr.min.css 7KB
laydate.css 6KB
blueimp-gallery.css 6KB
jquery.steps.css 6KB
footable.core.css 5KB
base.css 5KB
mygrxx.css 5KB
dataTables.bootstrap.css 5KB
bootstrap-table.min.css 4KB
mygxin.css 4KB
clockpicker.css 4KB
basic.css 4KB
style.css 4KB
bootstrap-colorpicker.min.css 3KB
laydate.css 3KB
cropper.min.css 3KB
ion.rangeSlider.css 3KB
jquery.nouislider.css 3KB
layer.ext.css 3KB
sec_kill.css 3KB
slide.css 3KB
bootstrap-markdown.min.css 3KB
goods_list.css 3KB
jquery.gritter.css 3KB
blueimp-gallery-video.css 2KB
login.css 2KB
ion.rangeSlider.skinFlat.css 2KB
bootstrap-duallistbox.css 2KB
blueimp-gallery-indicator.css 2KB
custom.css 1KB
bootstrap-multiselect.css 1KB
forget.css 1KB
bootstrap-treeview.css 1KB
demo.css 865B
fullcalendar.print.css 660B
switchery.css 611B
common.css 604B
webuploader.css 515B
morris-0.4.3.min.css 443B
bootstrapValidator.min.css 244B
Thumbs.db 473KB
Thumbs.db 471KB
Thumbs.db 432KB
Dockerfile 1KB
fontawesome-webfont.eot 67KB
glyphicons-halflings-regular.eot 20KB
footable.eot 5KB
test.ftl 369B
DelUser.ftl 247B
UpdateUser.ftl 213B
Subscription.ftl 184B
AddAdmin.ftl 34B
DelAdmin.ftl 28B
ecsc-join.gif 21KB
loading-0.gif 6KB
xubox_loading0.gif 6KB
loading.gif 4KB
xubox_loading3.gif 2KB
loading-2.gif 2KB
xubox_loading2.gif 2KB
throbber.gif 2KB
loading-upload.gif 2KB
xubox_loading1.gif 701B
loading-1.gif 701B
共 951 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
- weixin_440249662023-11-24资源内容总结的很到位,内容详实,很受用,学到了~
- 伍冕2023-12-27感谢大佬分享的资源,对我启发很大,给了我新的灵感。
- m0_636383212024-03-06感谢资源主分享的资源解决了我当下的问题,非常有用的资源。
盈梓的博客
- 粉丝: 6867
- 资源: 1248
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现夜间车牌识别程序(1).rar
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- sdk.config
- 基于matlab实现配电网三相潮流计算方法,对几种常用的配电网潮流计算方法进行了对比分析.rar
- 基于matlab实现配电网潮流 经典33节点 前推回代法潮流计算 回代电流 前推电压 带注释.rar
- 基于matlab实现模拟退火遗传算法的车辆调度问题研究,用MATLAB语言加以实现.rar
- 基于matlab实现蒙特卡洛的的移动传感器节点定位算法仿真代码.rar
- 华中数控系统818用户说明书
- 基于matlab实现卡尔曼滤波器完成多传感器数据融合 对多个机器人的不同传感器数据进行融合估计足球精确位置.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功