package com.cyksj.service.mange.group; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.cyksj.common.exception.BusinessRuntimeException; import com.cyksj.mapper.GoodsDonSkuMapper; import com.cyksj.mapper.GroupsMapper; import com.cyksj.mapper.GroupsRelationMapper; import com.cyksj.mapper.OrderDonMapper; import com.cyksj.model.entity.GoodsDonSku; import com.cyksj.model.entity.GroupsRelation; import com.cyksj.model.entity.GroupsTrips; import com.cyksj.model.entity.OrderDon; import com.cyksj.service.mange.CmsGroupService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Optional; /** * @author chan * @date 2022/9/27 6:27 PM */ @Slf4j @Service @RequiredArgsConstructor public class CmsGroupServiceImpl extends ServiceImpl implements CmsGroupService { private final GoodsDonSkuMapper skuMapper; private final GroupsRelationMapper relationMapper; private final OrderDonMapper orderDonMapper; @Override public GroupsTrips issuance(GroupsTrips groups) { GoodsDonSku sku = skuMapper.selectById(groups.getSkuId()); if (sku == null) { throw new BusinessRuntimeException("该商品规格不存在!"); } groups.setNum(sku.getNum()); groups.setAvailableNum(sku.getNum()); this.save(groups); for (Integer i = 1; i <= groups.getNum(); i++) { GroupsRelation relation = new GroupsRelation(); relation.setGroupsId(groups.getId()); relation.setStatus(GroupsRelation.Status.none); relation.setNum(i); relationMapper.insert(relation); } return groups; } @Override public void close(Long groupId) { GroupsTrips groupsTrips = this.getById(groupId); if(groupsTrips == null){ throw new BusinessRuntimeException("非法参数.车队不存在"); } Integer count = relationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getStatus, List.of(GroupsRelation.Status.locking, GroupsRelation.Status.validity))); if (count > 0) { throw new BusinessRuntimeException("该车队已有用户购买或锁定.无法删除"); }else { relationMapper.delete(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId,groupId)); this.removeById(groupId); } } @Override @Transactional(rollbackFor = Throwable.class) public void setAccount(GroupsTrips groupsTrips) { int count = count(Wrappers.lambdaQuery(GroupsTrips.class).eq(GroupsTrips::getAccountId, groupsTrips.getAccountId())); if (count > 0) { throw new BusinessRuntimeException("该账号已发车.请选择未发车账户"); } List groupsRelations = relationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId, groupsTrips.getId()).eq(GroupsRelation::getStatus, GroupsRelation.Status.validity)); groupsRelations.forEach((relation)->{ if (relation.getExpiryTime() == null) { List orderDonList = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, relation.getUserId()).eq(OrderDon::getRelationId, relation.getId()).eq(OrderDon::getStatus, OrderDon.Status.hasPayment)); orderDonList.forEach((orderDon)->{ //如果续费增加时间,如果首次则设置当前时间为初始时间 Date expiryTime = Optional.ofNullable(relation.getExpiryTime()).orElse(new Date()); log.info("设置账号,该用户 {} 初始时间:{} ",orderDon.getUserId(),DateUtil.format(expiryTime,"yyyy-MM-dd HH:mm:ss")); GoodsDonSku donSku = skuMapper.selectById(getById(groupsTrips.getId()).getSkuId()); Date newDate = DateUtil.offset(expiryTime, DateField.MONTH, donSku.getMonths() * orderDon.getNum()); relation.setExpiryTime(newDate); log.info("设置账号,该用户 {} 过期时间:{} ",orderDon.getUserId(),DateUtil.format(newDate,"yyyy-MM-dd HH:mm:ss")); relation.setStartTime(relation.getStartTime() == null ? new Date() : null); relationMapper.updateById(relation); orderDon.setStatus(OrderDon.Status.complete); orderDonMapper.updateById(orderDon); }); } }); groupsTrips.setStatus(GroupsTrips.Status.validity); updateById(groupsTrips); } }