|
|
|
@ -2,14 +2,15 @@ package com.sztzjy.trade.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
|
|
import com.sztzjy.trade.config.Constant;
|
|
|
|
|
import com.sztzjy.trade.entity.*;
|
|
|
|
|
import com.sztzjy.trade.entity.dto.StuGoodsSalesManageDTO;
|
|
|
|
|
import com.sztzjy.trade.entity.dto.*;
|
|
|
|
|
import com.sztzjy.trade.mapper.*;
|
|
|
|
|
import com.github.pagehelper.PageInfo;
|
|
|
|
|
import com.sztzjy.trade.config.exception.handler.ServiceException;
|
|
|
|
|
import com.sztzjy.trade.entity.*;
|
|
|
|
|
import com.sztzjy.trade.entity.dto.StuSettlementDTO;
|
|
|
|
|
import com.sztzjy.trade.mapper.*;
|
|
|
|
|
import com.sztzjy.trade.service.StuGoodsTradingCenterService;
|
|
|
|
|
import com.sztzjy.trade.util.BigDecimalUtils;
|
|
|
|
@ -22,6 +23,7 @@ import com.sztzjy.trade.util.PageUtil;
|
|
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDate;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
@ -68,6 +70,8 @@ public class StuGoodsTradingCenterServiceImpl implements StuGoodsTradingCenterSe
|
|
|
|
|
@Resource
|
|
|
|
|
StuGoodsOrderInfoMapper orderInfoMapper;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private StuSplicingOrdersInfoMapper stuSplicingOrdersInfoMapper;
|
|
|
|
|
//小广告位招租
|
|
|
|
|
@Override
|
|
|
|
|
public ResultEntity getSmallAdPlacement() {
|
|
|
|
@ -447,6 +451,9 @@ public class StuGoodsTradingCenterServiceImpl implements StuGoodsTradingCenterSe
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PageInfo<StuGoodsSalesManageDTO> goodsSalesManageDTOPageInfo = new PageInfo<>(stuGoodsSalesManageDTOArrayList);
|
|
|
|
|
|
|
|
|
|
return new ResultEntity(HttpStatus.OK, goodsSalesManageDTOPageInfo);
|
|
|
|
@ -487,5 +494,187 @@ public class StuGoodsTradingCenterServiceImpl implements StuGoodsTradingCenterSe
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//拼团购买
|
|
|
|
|
@Override
|
|
|
|
|
public void groupPurchase(StuPurchaseGoodsDTO stuPurchaseGoodsDTO) {
|
|
|
|
|
//判断是否拼团还是单独开团
|
|
|
|
|
if (Constant.PINDUANGOUMAI.equals(stuPurchaseGoodsDTO.getType()))
|
|
|
|
|
{ //开团
|
|
|
|
|
StuSplicingOrdersInfo splicingOrdersInfo = new StuSplicingOrdersInfo();
|
|
|
|
|
int id = UUID.randomUUID().hashCode();
|
|
|
|
|
|
|
|
|
|
id = id > 0 ? id : - id;
|
|
|
|
|
|
|
|
|
|
splicingOrdersInfo.setId(id);
|
|
|
|
|
splicingOrdersInfo.setGoodsId(stuPurchaseGoodsDTO.getGoodsId());
|
|
|
|
|
splicingOrdersInfo.setUserId(stuPurchaseGoodsDTO.getUserId());
|
|
|
|
|
splicingOrdersInfo.setCreateTime(new Date());
|
|
|
|
|
splicingOrdersInfo.setNumber(Convert.toInt(stuPurchaseGoodsDTO.getAmount()));
|
|
|
|
|
splicingOrdersInfo.setStopTime(Convert.toDate(LocalDate.now().plusDays(1)));
|
|
|
|
|
splicingOrdersInfo.setGoodsType(stuPurchaseGoodsDTO.getGoodsType());
|
|
|
|
|
|
|
|
|
|
StuGoodsInfo stuGoodsInfo = stuGoodsInfoMapper.selectByPrimaryKey(stuPurchaseGoodsDTO.getGoodsId());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//分享人数
|
|
|
|
|
splicingOrdersInfo.setMissManyPeople(stuGoodsInfo.getNumberOfShares());
|
|
|
|
|
|
|
|
|
|
stuSplicingOrdersInfoMapper.insertSelective(splicingOrdersInfo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
//拼团 拼团人数是否足够 满足条件 下单
|
|
|
|
|
StuSplicingOrdersInfo splicingOrdersInfo = stuSplicingOrdersInfoMapper.selectByPrimaryKey(stuPurchaseGoodsDTO.getSplicingId());
|
|
|
|
|
|
|
|
|
|
if (splicingOrdersInfo.getStopTime().before(new Date()) || splicingOrdersInfo.getOrderSuccess() == 1)
|
|
|
|
|
{
|
|
|
|
|
//拼单超时 || 拼单成功
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (splicingOrdersInfo.getMissManyPeople()!=0 && splicingOrdersInfo.getMissManyPeople()-1==0) {
|
|
|
|
|
//满足拼单条件
|
|
|
|
|
List<StuGroupOrderInfoDTO> stuGroupOrderInfoDTOList = JSON.parseArray(splicingOrdersInfo.getParticipateInGroupBuying(), StuGroupOrderInfoDTO.class);
|
|
|
|
|
StuGroupOrderInfoDTO stuGroupOrderInfoDTO = new StuGroupOrderInfoDTO();
|
|
|
|
|
stuGroupOrderInfoDTO.setUserId(stuPurchaseGoodsDTO.getUserId());
|
|
|
|
|
stuGroupOrderInfoDTO.setGoodsType(stuPurchaseGoodsDTO.getGoodsType());
|
|
|
|
|
stuGroupOrderInfoDTO.setAmount(Convert.toInt(stuPurchaseGoodsDTO.getAmount()));
|
|
|
|
|
stuGroupOrderInfoDTO.setCreateTime(new Date());
|
|
|
|
|
stuGroupOrderInfoDTOList.add(stuGroupOrderInfoDTO);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String json = JSON.toJSONString(stuGroupOrderInfoDTOList);
|
|
|
|
|
|
|
|
|
|
splicingOrdersInfo.setParticipateInGroupBuying(json);
|
|
|
|
|
|
|
|
|
|
splicingOrdersInfo.setOrderSuccess(1);
|
|
|
|
|
splicingOrdersInfo.setMissManyPeople(0);
|
|
|
|
|
|
|
|
|
|
//拼单成功
|
|
|
|
|
stuSplicingOrdersInfoMapper.updateByPrimaryKeySelective(splicingOrdersInfo);
|
|
|
|
|
StuGroupOrderInfoDTO infoDTO = new StuGroupOrderInfoDTO();
|
|
|
|
|
|
|
|
|
|
infoDTO.setAmount(splicingOrdersInfo.getNumber());
|
|
|
|
|
infoDTO.setGoodsType(splicingOrdersInfo.getGoodsType());
|
|
|
|
|
infoDTO.setUserId(splicingOrdersInfo.getUserId());
|
|
|
|
|
|
|
|
|
|
stuGroupOrderInfoDTOList.add(infoDTO);
|
|
|
|
|
//todo 付款扣钱 发起者和参与拼单的用户扣钱
|
|
|
|
|
|
|
|
|
|
for (StuGroupOrderInfoDTO groupOrderInfoDTO : stuGroupOrderInfoDTOList) {
|
|
|
|
|
StuPurcreateOrderDTO stuPurcreateOrderDTO = new StuPurcreateOrderDTO();
|
|
|
|
|
stuPurcreateOrderDTO.setUserId(groupOrderInfoDTO.getUserId());
|
|
|
|
|
stuPurcreateOrderDTO.setAmount(BigDecimal.valueOf(groupOrderInfoDTO.getAmount()));
|
|
|
|
|
stuPurcreateOrderDTO.setGoodsId(stuPurchaseGoodsDTO.getGoodsId());
|
|
|
|
|
stuPurcreateOrderDTO.setGoodsName(stuPurchaseGoodsDTO.getGoodsName());
|
|
|
|
|
stuPurcreateOrderDTO.setGoodsType(groupOrderInfoDTO.getGoodsType());
|
|
|
|
|
stuPurcreateOrderDTO.setShopName(stuPurchaseGoodsDTO.getShopName());
|
|
|
|
|
stuPurcreateOrderDTO.setGoodsUrl(stuPurchaseGoodsDTO.getGoodsUrl());
|
|
|
|
|
|
|
|
|
|
createOrder(stuPurcreateOrderDTO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
//添加到拼单数据中
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<StuGroupOrderInfoDTO> stuGroupOrderInfoDTOList = JSON.parseArray(splicingOrdersInfo.getParticipateInGroupBuying(), StuGroupOrderInfoDTO.class);
|
|
|
|
|
StuGroupOrderInfoDTO stuGroupOrderInfoDTO = new StuGroupOrderInfoDTO();
|
|
|
|
|
stuGroupOrderInfoDTO.setUserId(stuPurchaseGoodsDTO.getUserId());
|
|
|
|
|
stuGroupOrderInfoDTO.setGoodsType(stuPurchaseGoodsDTO.getGoodsType());
|
|
|
|
|
stuGroupOrderInfoDTO.setAmount(Convert.toInt(stuPurchaseGoodsDTO.getAmount()));
|
|
|
|
|
stuGroupOrderInfoDTO.setCreateTime(new Date());
|
|
|
|
|
stuGroupOrderInfoDTOList.add(stuGroupOrderInfoDTO);
|
|
|
|
|
|
|
|
|
|
splicingOrdersInfo.setParticipateInGroupBuying(JSON.toJSONString(stuGroupOrderInfoDTOList));
|
|
|
|
|
|
|
|
|
|
splicingOrdersInfo.setMissManyPeople(splicingOrdersInfo.getMissManyPeople()+1);
|
|
|
|
|
stuSplicingOrdersInfoMapper.updateByPrimaryKeySelective(splicingOrdersInfo);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void createOrder(StuPurcreateOrderDTO stuPurcreateOrderDTO) {
|
|
|
|
|
// TODO: 2024/10/28 1、查询账户余额,检验余额是否足够、
|
|
|
|
|
StuTradeAccountInfoExample accountInfoExample = new StuTradeAccountInfoExample();
|
|
|
|
|
accountInfoExample.createCriteria().andUserIdEqualTo(stuPurcreateOrderDTO.getUserId());
|
|
|
|
|
List<StuTradeAccountInfo> stuTradeAccountInfos = accountInfoMapper.selectByExample(accountInfoExample);
|
|
|
|
|
if (stuTradeAccountInfos.isEmpty()) { //设置默认值
|
|
|
|
|
StuTradeAccountInfo stuTradeAccountInfo = new StuTradeAccountInfo(stuPurcreateOrderDTO.getUserId());
|
|
|
|
|
accountInfoMapper.insert(stuTradeAccountInfo);
|
|
|
|
|
stuTradeAccountInfos.add(stuTradeAccountInfo);
|
|
|
|
|
}
|
|
|
|
|
//取到余额,去掉末尾的0比较精度
|
|
|
|
|
BigDecimal accountBalance = stuTradeAccountInfos.get(0).getAccountBalance().stripTrailingZeros();
|
|
|
|
|
BigDecimal bigDecimal = stuPurcreateOrderDTO.getAmount().stripTrailingZeros();
|
|
|
|
|
|
|
|
|
|
if (accountBalance.compareTo(bigDecimal) < 0) {
|
|
|
|
|
throw new ServiceException(HttpStatus.ACCEPTED, "余额不足");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: 2024/10/28 2、检验商品上架信息和库存信息
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//根据商品ID查询商品是否已下架
|
|
|
|
|
StuGoodsInfo stuGoodsInfo = stuGoodsInfoMapper.selectByPrimaryKey(stuPurcreateOrderDTO.getGoodsId());
|
|
|
|
|
if (stuGoodsInfo.getOnlineState() == 0) {
|
|
|
|
|
throw new ServiceException(HttpStatus.ACCEPTED, stuGoodsInfo.getGoodsName() + "商品已下架,请重新选择结算商品");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据商品ID查询商品库存是否足够
|
|
|
|
|
StuGoodsSalesManageExample salesManageExample = new StuGoodsSalesManageExample();
|
|
|
|
|
salesManageExample.createCriteria().andGoodsIdEqualTo(stuPurcreateOrderDTO.getGoodsId());
|
|
|
|
|
List<StuGoodsSalesManage> stuGoodsSalesManages = goodsSalesManageMapper.selectByExample(salesManageExample);
|
|
|
|
|
if (stuGoodsSalesManages.get(0).getOnlineTotal() < Convert.toInt(stuPurcreateOrderDTO.getAmount())) {
|
|
|
|
|
throw new ServiceException(HttpStatus.ACCEPTED, stuGoodsInfo.getGoodsName() + "商品已售完,请重新选择结算商品");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: 2024/10/28 3、生成订单信息并删除所结算商品在购物车中的信息
|
|
|
|
|
|
|
|
|
|
//生成订单信息
|
|
|
|
|
StuGoodsOrderInfo stuGoodsOrderInfo = new StuGoodsOrderInfo();
|
|
|
|
|
//赋值
|
|
|
|
|
Integer uuid = UUID.randomUUID().toString().replaceAll("-", "").hashCode();
|
|
|
|
|
uuid = uuid < 0 ? -uuid : uuid;//String.hashCode() 值会为空
|
|
|
|
|
stuGoodsOrderInfo.setId(uuid);
|
|
|
|
|
stuGoodsOrderInfo.setGoodsId(stuPurcreateOrderDTO.getGoodsId());
|
|
|
|
|
stuGoodsOrderInfo.setOrderType(stuPurcreateOrderDTO.getGoodsType());
|
|
|
|
|
|
|
|
|
|
//生成订单编号,将当前时间戳与随机数相结合,生成相对唯一的订单号。
|
|
|
|
|
long timestamp = System.currentTimeMillis();
|
|
|
|
|
int randomNum = new Random().nextInt(10000); // 生成0-9999之间的随机数
|
|
|
|
|
// 订单号格式:时间戳-随机数
|
|
|
|
|
String format = String.format("%d-%04d", timestamp, randomNum);
|
|
|
|
|
stuGoodsOrderInfo.setOrderNumber(format);
|
|
|
|
|
stuGoodsOrderInfo.setGoodsName(stuGoodsInfo.getGoodsName());
|
|
|
|
|
stuGoodsOrderInfo.setShopName(stuPurcreateOrderDTO.getShopName());
|
|
|
|
|
stuGoodsOrderInfo.setConsignee(stuTradeAccountInfos.get(0).getAccountName());
|
|
|
|
|
stuGoodsOrderInfo.setOrderTime(new Date());
|
|
|
|
|
stuGoodsOrderInfo.setGoodsUrl(stuGoodsInfo.getGoodsUrl());
|
|
|
|
|
stuGoodsOrderInfo.setNumber(Convert.toInt(stuPurcreateOrderDTO.getAmount()));
|
|
|
|
|
stuGoodsOrderInfo.setReceiptStatus(0);
|
|
|
|
|
stuGoodsOrderInfo.setCommentStatus(0);
|
|
|
|
|
stuGoodsOrderInfo.setUserId(stuPurcreateOrderDTO.getUserId());
|
|
|
|
|
|
|
|
|
|
orderInfoMapper.insert(stuGoodsOrderInfo);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: 2024/10/28 4、扣除余额
|
|
|
|
|
BigDecimal sub = bigDecimalUtils.sub(accountBalance.toString(), bigDecimal.toString());
|
|
|
|
|
stuTradeAccountInfos.get(0).setAccountBalance(sub);
|
|
|
|
|
|
|
|
|
|
accountInfoMapper.updateByPrimaryKey(stuTradeAccountInfos.get(0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|