| | |
| | | package com.sinata.rest.modular.mall.service.impl; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.fasterxml.jackson.core.JsonProcessingException; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.sinata.common.enums.EnumMemberGrade; |
| | | import com.sinata.common.enums.EnumPayType; |
| | | import com.sinata.common.enums.EnumUserBankDetailDoneType; |
| | |
| | | import com.sinata.common.enums.mall.EnumMallGoodsState; |
| | | import com.sinata.common.enums.mall.EnumMallOrderPrefix; |
| | | import com.sinata.common.enums.mall.EnumMallOrderState; |
| | | import com.sinata.common.model.GroupSpecGoodsSkuJsonVo; |
| | | import com.sinata.rest.common.ApiUtils; |
| | | import com.sinata.rest.core.util.DailyIncrementIdGenerator; |
| | | import com.sinata.rest.core.util.DateUtils; |
| | |
| | | import com.sinata.rest.modular.mall.dao.NoticeMapper; |
| | | import com.sinata.rest.modular.mall.model.*; |
| | | import com.sinata.rest.modular.mall.service.*; |
| | | import com.sinata.rest.modular.member.controller.common.body.BodyMallOrderDetailUse; |
| | | import com.sinata.rest.modular.member.model.MemMerchant; |
| | | import com.sinata.rest.modular.member.model.MemUser; |
| | | import com.sinata.rest.modular.member.model.MemUserBankDetail; |
| | |
| | | import com.sinata.rest.modular.system.model.AreaCity; |
| | | import com.sinata.rest.modular.system.service.ISystemSetService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeoutException; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | @Resource |
| | | private DailyIncrementIdGenerator dailyIncrementIdGenerator; |
| | | |
| | | @Resource |
| | | private IMallOrderDetailGroupSpecService mallOrderDetailGroupSpecService; |
| | | |
| | | @Resource |
| | | private IMallGroupSpecService mallGroupSpecService; |
| | | |
| | | @Resource |
| | | private IMallCommissionSettlementService mallCommissionSettlementService; |
| | | |
| | | @Override |
| | | public List<VoMallOrder> getOrderByUserIdList(Integer userId, Integer saleUserId, Integer state, Page page) { |
| | | return this.baseMapper.getOrderByUserIdList(userId, saleUserId, state, page); |
| | |
| | | |
| | | @Override |
| | | public VoMallOrder getOrderByOrderNo(String orderNo) { |
| | | return this.baseMapper.getOrderByOrderNo(orderNo); |
| | | List<VoMallOrder> voMallOrderList = this.baseMapper.getOrderListByOrderNo(orderNo); |
| | | return voMallOrderList.stream().findFirst().orElse(null); |
| | | } |
| | | |
| | | @Override |
| | | public List<VoMallOrder> getOrderListByOrderNo(String orderNo) { |
| | | return this.baseMapper.getOrderListByOrderNo(orderNo); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public Object createOrder(List<BodyMallOrder> list) { |
| | | ObjectMapper objectMapper = new ObjectMapper(); |
| | | try { |
| | | log.info("createOrder:{}", objectMapper.writeValueAsString(list)); |
| | | } catch (JsonProcessingException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | // 持久化数据组 |
| | | List<MallOrder> orderList = new ArrayList<>(); |
| | | List<MallOrderDetail> orderDetailList = new ArrayList<>(); |
| | |
| | | MallOrder order = new MallOrder(); |
| | | order.setOrderMainNo(orderMain.getOrderNo()); |
| | | order.setSaleUserId(body.getSaleUserId()); |
| | | // 设置销售人员地区所属区域 |
| | | if (order.getSaleUserId() != null) { |
| | | MemUser saleUser = memUserService.getById(order.getSaleUserId()); |
| | | if (saleUser != null && StrUtil.isNotBlank(saleUser.getCityCode())) { |
| | | order.setCityCode(saleUser.getCityCode()); |
| | | } |
| | | } |
| | | order.setMerchantId(body.getMerchantId()); |
| | | order.setCityCode(body.getCityCode()); |
| | | order.setUserId(userId); |
| | |
| | | order.setIdCard(body.getIdCard()); |
| | | order.setNumber(body.getNumber()); |
| | | order.setState(EnumMallOrderState.WAIT_PAY.index); |
| | | if (Objects.isNull(order.getCityCode())) { |
| | | AreaCity city = areaCityMapper.getCityByMerchantId(body.getMerchantId()); |
| | | Optional.ofNullable(city).ifPresent(c ->order.setCityCode(c.getCityCode())); |
| | | } |
| | | // 生成订单编号 |
| | | order.setOrderNo(dailyIncrementIdGenerator.generateId()); |
| | | String generateOrderNo = dailyIncrementIdGenerator.generateId(); |
| | | order.setOrderNo(generateOrderNo); |
| | | |
| | | String provinceCode = null; |
| | | String cityCode = null; |
| | |
| | | // 套餐商品 |
| | | skuVoList.add(o); |
| | | |
| | | order.setOrderNo(EnumMallOrderPrefix.GOODS_GROUP_ORDER.index + order.getOrderNo()); |
| | | // 拼接套餐订单编号 |
| | | order.setOrderNo(EnumMallOrderPrefix.GOODS_GROUP_ORDER.index + generateOrderNo); |
| | | } |
| | | order.setOrderType(o.getGroupType()); |
| | | } |
| | |
| | | for(BodyMallOrderDetail boSku : body.getSkuList()) { |
| | | for (VoGoodsSku skuVo : skuVoList) { |
| | | if(skuVo.getId().intValue() == boSku.getSkuId() || skuVo.getSkuId().intValue() == boSku.getSkuId() ) { |
| | | // 设置订单详情编号 |
| | | String orderDetailNoStr = EnumMallOrderPrefix.ORDER_DETAIL.index + DateUtils.format(new Date(), "yyMMddHHmmSSS") + ToolUtil.getRandomNumber(6); |
| | | |
| | | // 判断商品状态是否正常 |
| | | if(skuVo.getState() != EnumMallGoodsState.FOR_SALE.index) { |
| | | return ApiUtils.returnNG(null, "商品:" + skuVo.getGoodsName() + "," + EnumMallGoodsState.getMarkByIndex(skuVo.getState())); |
| | |
| | | if(skuVo.getStock() < boSku.getGoodsNum()) { |
| | | return ApiUtils.returnNG(null, "商品:" + skuVo.getGoodsName() + ",库存不足"); |
| | | } |
| | | log.info("商品:{},减去库存:{}",skuVo,boSku.getGoodsNum()); |
| | | // 减去库存 |
| | | goodsSkuService.updateStock(skuVo.getSkuId(), -boSku.getGoodsNum()); |
| | | goodsSkuService.updateStock(skuVo.getId(), -1 * boSku.getGoodsNum()); |
| | | |
| | | // 商品价格 |
| | | BigDecimal sellCost; |
| | |
| | | // 美天销售价 |
| | | sellCost = skuVo.getPriceSale(); |
| | | } else { |
| | | if (user != null && user.getMemberGradeId() != EnumMemberGrade.G_1.index) { |
| | | if (user != null && user.getMemberGradeId() != EnumMemberGrade.G_1.index && EnumMemberGrade.G_2.index != user.getMemberGradeId()) { |
| | | // 会员价 |
| | | sellCost = skuVo.getPriceMember(); |
| | | } else { |
| | |
| | | // 销售价 |
| | | sellCost = skuVo.getPriceMerchant(); |
| | | } |
| | | // 查询套餐规格组ID |
| | | MallGroupSpec mallGroupSpec = mallGroupSpecService.getById(skuVo.getSpecIds()); |
| | | List<GroupSpecGoodsSkuJsonVo> groupSpecGoodsSkuJsonVoList = JSONUtil.parseArray(mallGroupSpec.getGoodsSkuJson()).toList(GroupSpecGoodsSkuJsonVo.class); |
| | | for (GroupSpecGoodsSkuJsonVo groupSpecGoodsSkuJsonVo : groupSpecGoodsSkuJsonVoList) { |
| | | // 对套餐规格组商品添加记录 |
| | | MallOrderDetailGroupSpec.builder() |
| | | .orderNo(order.getOrderNo()) |
| | | .orderDetailNo(orderDetailNoStr) |
| | | .goodsId(skuVo.getGoodsId()) |
| | | .skuId(skuVo.getId()) |
| | | .skuNum(boSku.getGoodsNum()) |
| | | .groupSpecId(mallGroupSpec.getId()) |
| | | .groupSpecGoodsId(groupSpecGoodsSkuJsonVo.getGoodsId()) |
| | | .groupSpecGoodsNum(groupSpecGoodsSkuJsonVo.getGoodsNum() * boSku.getGoodsNum()) |
| | | .build() |
| | | .insert(); |
| | | } |
| | | } |
| | | |
| | | // 总金额 |
| | |
| | | |
| | | // 订单详细信息 |
| | | MallOrderDetail orderDetail = new MallOrderDetail(); |
| | | orderDetail.setOrderDetailNo(EnumMallOrderPrefix.ORDER_DETAIL.index + DateUtils.format(new Date(), "yyMMddHHmmSSS") + ToolUtil.getRandomNumber(6)); |
| | | orderDetail.setOrderDetailNo(orderDetailNoStr); |
| | | orderDetail.setOrderNo(order.getOrderNo()); |
| | | orderDetail.setTotalMoney(totalMoney); |
| | | orderDetail.setGoodsId(skuVo.getGoodsId()); |
| | | orderDetail.setSkuId(skuVo.getSkuId()); |
| | | orderDetail.setSkuId(skuVo.getId()); |
| | | orderDetail.setGoodsSku(JSON.toJSONString(skuVo)); |
| | | orderDetail.setSellCost(sellCost); |
| | | orderDetail.setGoodsNum(boSku.getGoodsNum()); |
| | | orderDetail.setGoodsName(skuVo.getGoodsName()); |
| | | orderDetail.setGrepName(skuVo.getGrepName()); |
| | | orderDetail.setSpecGrep(skuVo.getSpecGrep()); |
| | | orderDetail.setSpecGrep(skuVo.getSpecIds()); |
| | | orderDetail.setGoodsImage(skuVo.getGoodsImage()); |
| | | orderDetail.setProvinceCode(StrUtil.isNotBlank(provinceCode) ? provinceCode : skuVo.getProvinceCode()); |
| | | orderDetail.setCityCode(StrUtil.isNotBlank(cityCode) ? cityCode : skuVo.getCityCode()); |
| | |
| | | .select(MallOrderDetail::getSkuId, MallOrderDetail::getGoodsNum) |
| | | .eq(MallOrderDetail::getOrderNo, orderNo); |
| | | List<MallOrderDetail> orderDetails = orderDetailService.list(orderDetailLambdaQueryWrapper); |
| | | log.info("-----------------------开始退回库存--------------------"); |
| | | log.info("orderDetails:{}", JSON.toJSONString(orderDetails)); |
| | | for (MallOrderDetail od : orderDetails) { |
| | | // 增加库存 |
| | | goodsSkuService.updateStock(od.getSkuId(), od.getGoodsNum()); |
| | | } |
| | | |
| | | log.info("-----------------------退回库存结束--------------------"); |
| | | if (order.getCouponId() != null && order.getCouponId() != 0) { |
| | | // 退还优惠券 |
| | | myCouponService.updateUseCoupon(order.getUserId(), order.getCouponId(), 0); |
| | |
| | | public List<VoMallOrder> getNotCommissionSettlementOrderList() { |
| | | return this.baseMapper.getNotCommissionSettlementOrderList(); |
| | | } |
| | | |
| | | @Override |
| | | public Boolean use(BodyMallOrderDetailUse body) throws TimeoutException { |
| | | VoMallOrder order = this.getOrderByOrderNo(body.getOrderNo()); |
| | | if (Objects.isNull(order)) { |
| | | throw new IllegalArgumentException("错误的订单信息"); |
| | | } |
| | | if (!order.getMerchantId().equals(ThreadPoolUtil.getUserId()) && body.getOrderDetailGroupSpecId() == null) { |
| | | throw new IllegalArgumentException("该订单不是此门店的预约订单"); |
| | | } |
| | | Long nowTime = System.currentTimeMillis(); |
| | | if ((Objects.nonNull(order.getStartTime()) && Objects.nonNull(order.getEndTime()) |
| | | && (nowTime.compareTo(order.getEndTime().getTime()) > 0 |
| | | || nowTime.compareTo(order.getStartTime().getTime()) < 0))) { |
| | | throw new IllegalArgumentException("未到核销时间"); |
| | | } |
| | | if (!order.getState().equals(EnumMallOrderState.WAIT_CHECK.index) |
| | | && !order.getState().equals(EnumMallOrderState.USE.index)) { |
| | | throw new IllegalArgumentException("订单状态无法被核销"); |
| | | } |
| | | LambdaQueryWrapper<MallOrderDetail> queryWrapper2 = new LambdaQueryWrapper<>(); |
| | | queryWrapper2.eq(MallOrderDetail::getOrderDetailNo, body.getOrderDetailNo()); |
| | | MallOrderDetail orderDetail = orderDetailService.getOne(queryWrapper2); |
| | | Integer useNumber = 0; |
| | | |
| | | // 是否保存核销记录 |
| | | Boolean isSaveUse = false; |
| | | if (body.getOrderDetailGroupSpecId() != null) { |
| | | MallOrderDetailGroupSpec orderDetailGroupSpec = mallOrderDetailGroupSpecService.getById(body.getOrderDetailGroupSpecId()); |
| | | if (orderDetailGroupSpec == null) { |
| | | throw new TimeoutException("套餐规格组商品信息无效!"); |
| | | } |
| | | // 套餐规格组商品核销数 |
| | | Integer groupSpecUse = orderDetailGroupSpec.getGroupSpecUse() + body.getUseNum(); |
| | | orderDetailGroupSpec.setGroupSpecUse(groupSpecUse); |
| | | if (groupSpecUse.equals(orderDetailGroupSpec.getGroupSpecGoodsNum())) { |
| | | orderDetailGroupSpec.setIsUse(1); |
| | | } |
| | | orderDetailGroupSpec.setUseDateTime(new Date()); |
| | | orderDetailGroupSpec.setUseMerchantId(order.getMerchantId()); |
| | | // 更新信息 |
| | | orderDetailGroupSpec.updateById(); |
| | | |
| | | // 核销记录 |
| | | MallOrderDetailGroupSpecLog mallOrderDetailGroupSpecLog = BeanUtil.copyProperties(orderDetailGroupSpec, MallOrderDetailGroupSpecLog.class); |
| | | mallOrderDetailGroupSpecLog.setId(null); |
| | | mallOrderDetailGroupSpecLog.setGroupSpecUse(body.getUseNum()); |
| | | mallOrderDetailGroupSpecLog.setIsUse(1); |
| | | mallOrderDetailGroupSpecLog.insert(); |
| | | |
| | | int notUseCount = mallOrderDetailGroupSpecService.count( |
| | | Wrappers.<MallOrderDetailGroupSpec>query().lambda() |
| | | .eq(MallOrderDetailGroupSpec::getOrderDetailNo, body.getOrderDetailNo()) |
| | | .eq(MallOrderDetailGroupSpec::getSkuId, orderDetailGroupSpec.getSkuId()) |
| | | .eq(MallOrderDetailGroupSpec::getIsUse, 0) |
| | | ); |
| | | if (notUseCount == 0) { |
| | | // 已全部核销,可以保存核销记录 |
| | | isSaveUse = true; |
| | | |
| | | // 重新定义核销数量 |
| | | body.setUseNum(orderDetailGroupSpec.getSkuNum()); |
| | | useNumber = body.getUseNum(); |
| | | } |
| | | } else { |
| | | // 普通商品直接保存记录 |
| | | isSaveUse = true; |
| | | |
| | | useNumber = orderDetail.getUseNum() + body.getUseNum(); |
| | | if (useNumber > orderDetail.getGoodsNum()) { |
| | | throw new IllegalArgumentException("核销信息错误请检查"); |
| | | } |
| | | } |
| | | |
| | | if (isSaveUse) { |
| | | // 添加核销记录 |
| | | MallOrderDetailUse detailUse = new MallOrderDetailUse(); |
| | | BeanUtils.copyProperties(orderDetail, detailUse); |
| | | detailUse.setId(null); |
| | | detailUse.setUseNum(body.getUseNum()); |
| | | detailUse.setUseTime(new Date()); |
| | | mallOrderDetailUseService.save(detailUse); |
| | | } |
| | | |
| | | //添加核销时间 |
| | | MallOrderDetail updateOrder = new MallOrderDetail(); |
| | | updateOrder.setUseNum(useNumber); |
| | | updateOrder.setUseTime(new Date()); |
| | | UpdateWrapper<MallOrderDetail> updateWrapper = new UpdateWrapper<>(); |
| | | updateWrapper.eq("order_detail_no", orderDetail.getOrderDetailNo()); |
| | | orderDetailService.update(updateOrder, updateWrapper); |
| | | |
| | | LambdaQueryWrapper<MallOrderDetail> orderWrapper = new LambdaQueryWrapper<>(); |
| | | orderWrapper.eq(MallOrderDetail::getOrderNo, body.getOrderNo()); |
| | | orderWrapper.last("and use_num <> goods_num"); |
| | | List<MallOrderDetail> detailList = orderDetailService.list(orderWrapper); |
| | | if (detailList.size() == 0) { |
| | | //修改订单状态 |
| | | MallOrder mallOrder = new MallOrder(); |
| | | mallOrder.setState(EnumMallOrderState.SUCCESS.index); |
| | | mallOrder.setOrderNo(orderDetail.getOrderNo()); |
| | | this.updateById(mallOrder); |
| | | |
| | | // 核销订单-分佣 |
| | | mallCommissionSettlementService.commissionSettlement(mallOrder.getOrderNo()); |
| | | } else { |
| | | //修改订单状态 |
| | | MallOrder mallOrder = new MallOrder(); |
| | | mallOrder.setState(EnumMallOrderState.USE.index); |
| | | mallOrder.setOrderNo(orderDetail.getOrderNo()); |
| | | this.updateById(mallOrder); |
| | | } |
| | | |
| | | //插入预约通知 |
| | | if(Objects.nonNull(order.getMerchantId())){ |
| | | noticeMapper.addMerchantNotice(order.getMerchantId(),2,"您有新的核销订单"); |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | |
| | | } |