package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.RedisUtil; import com.doumee.core.utils.Utils; import com.doumee.core.utils.kuaidi100.DeliveryDTO; import com.doumee.core.utils.kuaidi100.ExpressUtils; import com.doumee.core.wx.SendWxMessage; import com.doumee.core.wx.WxMiniConfig; import com.doumee.core.wx.WxMiniUtilService; import com.doumee.dao.business.*; import com.doumee.dao.business.join.GoodsorderDetailJoinMapper; import com.doumee.dao.business.join.GoodsorderJoinMapper; import com.doumee.dao.business.join.PlanorderDetailJoinMapper; import com.doumee.dao.business.model.*; import com.doumee.dao.web.request.DealIntegralRequest; import com.doumee.dao.web.request.OrderPayRequest; import com.doumee.dao.web.request.PayDetailRequest; import com.doumee.dao.web.request.goods.MemberOrderRequest; import com.doumee.dao.web.request.goods.DealOrderRequest; import com.doumee.dao.web.request.goods.OrderCommentRequest; import com.doumee.dao.web.request.goods.OrderGoodsCommentRequest; import com.doumee.dao.web.response.MyPageResponse; import com.doumee.dao.web.response.goods.MemberOrderDetailResponse; import com.doumee.dao.web.response.goods.MemberOrderResponse; import com.doumee.dao.web.response.goods.PayResponse; import com.doumee.service.business.AreasService; import com.doumee.service.business.GoodsorderService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.doumee.service.business.IntegralService; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.checkerframework.checker.units.qual.C; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; /** * 商品订单信息表Service实现 * @author 江蹄蹄 * @date 2023/03/21 15:48 */ @Service public class GoodsorderServiceImpl implements GoodsorderService { @Autowired private RedisTemplate redisTemplate; @Autowired private GoodsorderMapper goodsorderMapper; @Autowired private ActivitySignMapper activitySignMapper; @Autowired private AftersaleMapper aftersaleMapper; @Autowired private MemberMapper memberMapper; @Autowired private GoodsorderDetailMapper goodsorderDetailMapper; @Autowired private GoodsSkuMapper goodsSkuMapper; @Autowired private GoodsMapper goodsMapper; @Autowired private AddrMapper addrMapper; @Autowired private MemberCouponMapper memberCouponMapper; @Autowired private WxMiniUtilService wxMiniUtilService; @Autowired private IntegralService integralService; @Autowired private OrderUrgeMapper orderUrgeMapper; @Autowired private OrderCommentMapper orderCommentMapper; @Autowired private ShopcartMapper shopcartMapper; @Autowired private GoodsorderJoinMapper goodsorderJoinMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private PlanorderDetailJoinMapper planorderDetailJoinMapper; @Autowired private FundMapper fundMapper; @Autowired private AreasService areasService; @Autowired private GoodsorderDetailJoinMapper goodsorderDetailJoinMapper; @Override public Integer create(Goodsorder goodsorder) { goodsorderMapper.insert(goodsorder); return goodsorder.getId(); } @Override public void deleteById(Integer id) { goodsorderMapper.deleteById(id); } @Override public void delete(Goodsorder goodsorder) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(goodsorder); goodsorderMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } goodsorderMapper.deleteBatchIds(ids); } @Override public void updateById(Goodsorder goodsorder) { goodsorderMapper.updateById(goodsorder); } /** * 备注 * @param goodsorder */ @Override public void orderRemark(Goodsorder goodsorder) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); Goodsorder query=goodsorderMapper.selectById(goodsorder.getId()); if(query==null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage()); } if(StringUtils.isBlank(goodsorder.getSysInfo())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),ResponseStatus.BAD_REQUEST.getMessage()); } goodsorder.setEditDate(new Date()); goodsorder.setEditor(user.getId()); goodsorderMapper.updateById(goodsorder); } /** * 咖豆 商城订单发货 * @param goodsorder */ @Override public void orderSendOutGoods(Goodsorder goodsorder) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); Goodsorder query=goodsorderMapper.selectById(goodsorder.getId()); if(query==null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage()); } if(!Constants.equalsInteger(query.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态已流转,请刷新页面!"); } goodsorder.setEditDate(new Date()); goodsorder.setEditor(user.getId()); goodsorder.setKdDate(new Date()); goodsorder.setKdUser(user.getId()); goodsorder.setStatus(Constants.OrderStatus.WAIT_RECEIVE.getKey()); goodsorderMapper.updateById(goodsorder); // TODO 发送微信模板消息 Member member=memberMapper.selectById(query.getMemberId()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO); queryWrapper.eq(GoodsorderDetail::getOrderId,goodsorder.getId()); queryWrapper.orderByDesc(GoodsorderDetail::getCreateDate); queryWrapper.last("limit 1"); GoodsorderDetail goodsorderDetail=goodsorderDetailMapper.selectOne(queryWrapper); SendWxMessage.orderSendNotice(goodsorder,goodsorderDetail!=null?goodsorderDetail.getName():"",member); } /** * 咖啡计划取消订单,代发货(调用退款接口,并记录资金流水表),待支付支持取消订单 * @param goodsorder */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void coffeePlanCancelOrder(Goodsorder goodsorder) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); Goodsorder query=goodsorderMapper.selectById(goodsorder.getId()); if(query==null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage()); } if(!(Constants.equalsInteger(query.getStatus(),Constants.ZERO)||Constants.equalsInteger(query.getStatus(),Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"仅支持代发货/待支付订单取消订单!"); } if(!Constants.equalsInteger(query.getType(),Constants.TWO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage()); } //代发货,记录资金流水表 if(Constants.equalsInteger(query.getStatus(),Constants.ONE)){ //微信现金退款 String refundCode = wxMiniUtilService.wxRefund(query.getCode().toString(), query.getPrice(), query.getPrice()); Fund fund = new Fund(); fund.setCreator(user.getId()); fund.setCreateDate(new Date()); fund.setIsdeleted(Constants.ZERO); fund.setRemark(query.getId().toString()); fund.setMemberId(goodsorder.getMemberId()); fund.setTitle("订单取消"); fund.setContent(goodsorder.getCancelInfo()); fund.setObjId(query.getId()); fund.setObjType(Constants.ONE); fund.setType(Constants.ZERO); fund.setNum(goodsorder.getPrice()); fund.setOrderCode(refundCode); fundMapper.insert(fund); //TODO 查询优惠券信息记录 if(!Objects.isNull(query.getCouponId())){ MemberCoupon memberCoupon = memberCouponMapper.selectById(query.getCouponId()); if(!Objects.isNull(memberCoupon)){ memberCoupon.setStatus(Constants.ZERO); memberCouponMapper.updateById(memberCoupon); } } } Date today=new Date(); goodsorder.setEditor(user.getId()); goodsorder.setEditDate(today); goodsorder.setCancelDate(today); goodsorder.setCancelUser(user.getId()); goodsorderMapper.updateById(goodsorder); PlanorderDetail planorderDetail=new PlanorderDetail(); planorderDetail.setEditor(user.getId()); planorderDetail.setEditDate(today); planorderDetail.setStatus(Constants.TWO); planorderDetail.setCancelDate(today); planorderDetail.setCancelUser(user.getId()); planorderDetail.setCancelInfo(goodsorder.getCancelInfo()); PlanorderDetail up=new PlanorderDetail(); UpdateWrapper updateWrapper = new UpdateWrapper<>(up); updateWrapper.lambda().eq(PlanorderDetail::getId,goodsorder.getId()); updateWrapper.lambda().eq(PlanorderDetail::getIsdeleted,Constants.ZERO); planorderDetailJoinMapper.update(planorderDetail ,updateWrapper ); } /** * 咖豆/商品取消订单,代发货(调用退款接口,并记录资金流水表),待支付支持取消订单 ,并返还优惠券、咖豆 * @param goodsorder */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void orderPlanCancelOrder(Goodsorder goodsorder) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); Goodsorder query=goodsorderMapper.selectById(goodsorder.getId()); if(query==null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage()); } if(!(Constants.equalsInteger(query.getStatus(),Constants.ZERO)||Constants.equalsInteger(query.getStatus(),Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"仅支持代发货/待支付订单取消订单!"); } if(Constants.equalsInteger(query.getType(),Constants.TWO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage()); } cancelOrder( query.getId(), user.getId(),goodsorder.getCancelInfo() ); } @Override public void updateByIdInBatch(List goodsorders) { if (CollectionUtils.isEmpty(goodsorders)) { return; } for (Goodsorder goodsorder: goodsorders) { this.updateById(goodsorder); } } @Override public Goodsorder findById(Integer id) { Goodsorder result=goodsorderJoinMapper.selectById(id); if(Objects.nonNull(result)){ MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(GoodsorderDetail.class); queryWrapper.selectAs(Labels::getName,GoodsorderDetail::getLablesName); queryWrapper.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO); queryWrapper.eq(GoodsorderDetail::getOrderId,result.getId()); queryWrapper.leftJoin(GoodsSku.class,GoodsSku::getId,GoodsorderDetail::getGoodsSkuId); queryWrapper.leftJoin(Goods.class,Goods::getId,GoodsSku::getGoodsId); queryWrapper.leftJoin(Labels.class,Labels::getId,Goods::getCategoryId); List goodsorderDetailList=goodsorderDetailMapper.selectList(queryWrapper); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ACTIVITY_FILE).getCode(); for(GoodsorderDetail model:goodsorderDetailList){ if(StringUtils.isNotBlank(model.getImgurl())){ model.setImgurl(path+ model.getImgurl()); } } result.setGoodsorderDetailList(goodsorderDetailList); //查询咖啡计划订阅周期 if(Constants.equalsInteger(result.getType(),Constants.TWO)){ MPJLambdaWrapper queryplan = new MPJLambdaWrapper<>(); queryplan.eq(PlanorderDetail::getOrderId,result.getId()); queryplan.last("limit 1"); PlanorderDetail planorderDetail= planorderDetailJoinMapper.selectOne( queryplan); result.setPlanorderDetail(planorderDetail); } } return result; } @Override public Goodsorder findOne(Goodsorder goodsorder) { QueryWrapper wrapper = new QueryWrapper<>(goodsorder); return goodsorderMapper.selectOne(wrapper); } @Override public List findList(Goodsorder goodsorder) { QueryWrapper wrapper = new QueryWrapper<>(goodsorder); return goodsorderMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Goodsorder.class); queryWrapper.selectAs(Member::getNickname,Goodsorder::getNickName); queryWrapper.selectAs(Member::getPhone,Goodsorder::getPhone); queryWrapper.selectAs(Addr::getAddr,Goodsorder::getAddr); // queryWrapper.select("(select CREATE_DATE from order_urge where ORDER_ID=t.id and ISDELETED=0 ORDER BY CREATE_DATE desc limit 1) as urgeCreateDate "); queryWrapper.leftJoin(Member.class,Member::getId,Goodsorder::getMemberId); queryWrapper.leftJoin(Addr.class,Addr::getMemberId,Member::getId); queryWrapper.eq(Addr::getIsDefault,Constants.ONE); queryWrapper.eq(pageWrap.getModel().getCode()!=null,Goodsorder::getCode,pageWrap.getModel().getCode()); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNickName()),ms->ms.like(Goodsorder::getLinkname,pageWrap.getModel().getNickName()) .or().like(Goodsorder::getLinkphone,pageWrap.getModel().getNickName()) ); queryWrapper.ge(pageWrap.getModel().getStarttime()!=null,Goodsorder::getCreateDate,pageWrap.getModel().getStarttime()); queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Goodsorder::getCreateDate, pageWrap.getModel().getEndtime()); queryWrapper.eq(pageWrap.getModel().getPayOrderId()!=null,Goodsorder::getPayOrderId,pageWrap.getModel().getPayOrderId()); queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Goodsorder::getStatus,pageWrap.getModel().getStatus()); queryWrapper.eq(pageWrap.getModel().getIsdeleted()==null,Goodsorder::getIsdeleted,Constants.ZERO); queryWrapper.eq(pageWrap.getModel().getIsdeleted()!=null,Goodsorder::getIsdeleted,pageWrap.getModel().getIsdeleted()); queryWrapper.orderByDesc(Goodsorder::getCreateDate); IPage result = goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class, queryWrapper); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_FILE).getCode(); for(Goodsorder model:result.getRecords()){ model.setResourcePath(path); //订单总金额等于实付金额加优惠金额,再减去退款金额 BigDecimal sumMoney=new BigDecimal(0); if(model.getPrice()!=null){ if(model.getIntegral()!=null){ sumMoney=model.getPrice().add(model.getIntegral()); if(Constants.equalsInteger(model.getIsAftersale(),Constants.ONE)&&model.getAftersaleMoney()!=null){ sumMoney.subtract(model.getAftersaleMoney()); model.setOrderMoneyCount(sumMoney); }else{ model.setOrderMoneyCount(sumMoney); } }else{ model.setOrderMoneyCount(model.getPrice()); } }else if(model.getIntegral()!=null){ sumMoney=model.getIntegral(); if(Constants.equalsInteger(model.getIsAftersale(),Constants.ONE)&&model.getAftersaleMoney()!=null){ sumMoney.subtract(model.getAftersaleMoney()); model.setOrderMoneyCount(sumMoney); }else{ model.setOrderMoneyCount(sumMoney); } } MPJLambdaWrapper queryGoods = new MPJLambdaWrapper<>(); queryGoods.selectAll(GoodsorderDetail.class); queryGoods.selectAs(Goods::getImgurl,GoodsorderDetail::getGoodsImgurl); queryGoods.selectAs(Labels::getName, GoodsorderDetail::getCategoryName); queryGoods.select("ls.name as parentName "); queryGoods.leftJoin(GoodsSku.class,GoodsSku::getId,GoodsorderDetail::getGoodsSkuId); queryGoods.leftJoin(Goods.class,Goods::getId,GoodsSku::getGoodsId); queryGoods.leftJoin(Labels.class, Labels::getId, Goods::getCategoryId); queryGoods.leftJoin("labels ls on ls.id=t2.PARENT_CATEGORY_ID"); queryGoods.eq(GoodsorderDetail::getOrderId,model.getId()); queryGoods.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO); List goodsorderDetailList=goodsorderDetailJoinMapper.selectList(queryGoods); goodsorderDetailList.stream().forEach(s ->{ if(StringUtils.isBlank(s.getImgurl())){ s.setImgurl(s.getGoodsImgurl()); } }); model.setGoodsorderDetailList(goodsorderDetailList); } return PageData.from(result); } @Override public List exportExcel(Goodsorder pageWrap) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Goodsorder.class); queryWrapper.selectAs(GoodsorderDetail::getName,Goodsorder::getGoodsName); queryWrapper.selectAs(GoodsorderDetail::getSkuName,Goodsorder::getSkuName); queryWrapper.selectAs(GoodsorderDetail::getGoodsNum,Goodsorder::getGoodsNum); queryWrapper.selectAs(GoodsorderDetail::getPrice,Goodsorder::getGoodsPrice); queryWrapper.selectAs(Member::getNickname,Goodsorder::getNickName); queryWrapper.selectAs(Member::getPhone,Goodsorder::getPhone); queryWrapper.selectAs(Addr::getAddr,Goodsorder::getAddr); queryWrapper.select("(select CREATE_DATE from order_urge where ORDER_ID=t.id and ISDELETED=0 ORDER BY CREATE_DATE desc limit 1) as urgeCreateDate "); queryWrapper.leftJoin(Member.class,Member::getId,Goodsorder::getMemberId); queryWrapper.leftJoin(Addr.class,Addr::getMemberId,Member::getId); queryWrapper.leftJoin(GoodsorderDetail.class,GoodsorderDetail::getOrderId,Goodsorder::getId); queryWrapper.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO); queryWrapper.eq(Addr::getIsDefault,Constants.ONE); queryWrapper.eq(pageWrap.getCode()!=null,Goodsorder::getCode,pageWrap.getCode()); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getNickName()),ms->ms.like(Goodsorder::getLinkname,pageWrap.getNickName()) .or().like(Goodsorder::getLinkphone,pageWrap.getNickName()) ); queryWrapper.ge(pageWrap.getStarttime()!=null,Goodsorder::getCreateDate,pageWrap.getStarttime()); queryWrapper.le(pageWrap.getEndtime()!=null,Goodsorder::getCreateDate, pageWrap.getEndtime()); queryWrapper.eq(pageWrap.getStatus()!=null,Goodsorder::getStatus,pageWrap.getStatus()); queryWrapper.eq(pageWrap.getIsdeleted()==null,Goodsorder::getIsdeleted,Constants.ZERO); queryWrapper.eq(pageWrap.getIsdeleted()!=null,Goodsorder::getIsdeleted,pageWrap.getIsdeleted()); queryWrapper.orderByDesc(Goodsorder::getCreateDate); List result = goodsorderJoinMapper.selectJoinList(Goodsorder.class, queryWrapper); return result; } @Override public long count(Goodsorder goodsorder) { QueryWrapper wrapper = new QueryWrapper<>(goodsorder); return goodsorderMapper.selectCount(wrapper); } /****************************************移动端接口开始********************************************************************/ @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public PayResponse orderPay(OrderPayRequest orderPayRequest){ Member member = memberMapper.selectById(orderPayRequest.getMemberId()); //查询收货地址 Addr addr = addrMapper.selectById(orderPayRequest.getAddressId()); if(Objects.isNull(addr)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到收货地址信息!"); } Areas area = areasService.findById(addr.getAreaId(), Constants.TWO); if(Objects.isNull(area)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"收货地址区划信息发生变化,请更新后下单!"); } Goodsorder goodsorder = new Goodsorder(); goodsorder.setCreator(orderPayRequest.getMemberId()); goodsorder.setIntegral(BigDecimal.ZERO); goodsorder.setCreateDate(new Date()); goodsorder.setIsdeleted(Constants.ZERO); goodsorder.setMemberInfo(orderPayRequest.getRemark()); goodsorder.setAddrId(addr.getId()); goodsorder.setLinkaddr(area.getProvinceName()+area.getCityName() + area.getName() + addr.getAddr()); goodsorder.setLinkphone(addr.getPhone()); goodsorder.setLinkname(addr.getName()); goodsorder.setMemberId(member.getId()); goodsorder.setType(orderPayRequest.getOrderType()); //单据编号 自增 goodsorder.setCode(getNextInCode()); //计算订单总金额 BigDecimal sumPrice = BigDecimal.ZERO; //存储记录明细 List payDetailRequestList = orderPayRequest.getPayDetailRequestList(); if(Objects.isNull(payDetailRequestList)||payDetailRequestList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"无明细数据,请检查选择数据!"); } List goodsOrderDetailList = new ArrayList<>(); for (PayDetailRequest payDetailRequest:payDetailRequestList) { //查询商品 GoodsSku goodsSku = goodsSkuMapper.selectById(payDetailRequest.getGoodsSkuId()); if(Objects.isNull(goodsSku)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品SKU信息!"); } Goods goods = goodsMapper.selectById(goodsSku.getGoodsId()); if(Objects.isNull(goods)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品信息!"); } if(goods.getStatus().equals(Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品已删除或已下架,无法下单"); } if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))Constants.ZERO){ //抵扣金额小于会员剩余余额 if(orderPayRequest.getDeductionBalance().compareTo(member.getIntegral())<=Constants.ZERO){ //更新余额信息 添加积分变动记录 DealIntegralRequest dealIntegralRequest = new DealIntegralRequest(); dealIntegralRequest.setIntegralNum(orderPayRequest.getDeductionBalance()); dealIntegralRequest.setDealType(Constants.ONE); dealIntegralRequest.setMemberId(member.getId()); dealIntegralRequest.setObjId(goodsorder.getId()); dealIntegralRequest.setOrderCode(goodsorder.getCode().toString()); dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER); integralService.dealIntegral(dealIntegralRequest); //发送微信小程序订阅消息 SendWxMessage.integralChangeNotice(member,orderPayRequest.getDeductionBalance()); //余额全部抵扣 if(goodsorder.getPrice().compareTo(BigDecimal.ZERO)==Constants.ZERO){ goodsorder.setStatus(Constants.OrderStatus.PAY_DONE.getKey()); goodsorder.setPayStatus(Constants.ONE); goodsorder.setPayDate(new Date()); goodsorderMapper.updateById(goodsorder); PayResponse payResponse = new PayResponse(); payResponse.setOrderId(goodsorder.getId()); return payResponse; } }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"余额不足,无法进行支付,当前剩余余额:【"+member.getIntegral()+"】!"); } } if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品价格发生变化,请刷新后重新支付!"); } return this.wxPay(goodsorder,member); } /** * 重新支付 * @param orderId * @return */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public PayResponse replayPay(Integer orderId){ Goodsorder goodsorder = goodsorderMapper.selectById(orderId); if(!goodsorder.getStatus().equals(Constants.ZERO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态错误,无法重新支付!"); } Member member = memberMapper.selectById(goodsorder.getMemberId()); //更换订单号 goodsorder.setCode(getNextInCode()); goodsorder.setEditDate(new Date());; goodsorder.setEditor(member.getId()); goodsorderMapper.updateById(goodsorder); return this.wxPay(goodsorder,member); } /** * 调起微信支付 * @param goodsorder * @param member * @return */ public PayResponse wxPay(Goodsorder goodsorder,Member member){ try { //--------微信小程序支付-------- Object response = null; WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody("平台商城"); request.setAttach("terraceMall"); request.setOutTradeNo(goodsorder.getCode().toString()); request.setTotalFee(BaseWxPayRequest.yuanToFen(goodsorder.getPrice().toString())); // request.setTotalFee(2); request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss")); request.setSpbillCreateIp(this.getIpAddr()); //微信小程序 request.setOpenid(member.getOpenId()); response = WxMiniConfig.wxPayService.createOrder(request); PayResponse payResponse = new PayResponse(); payResponse.setResponse(response); payResponse.setOrderId(goodsorder.getId()); return payResponse; } catch (WxPayException e) { e.printStackTrace(); } throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"支付失败!"); } /** * 订单列表接口 * @param pageWrap * @return */ @Override public IPage getGoodsOrderPage(PageWrap pageWrap) { IPage page = goodsorderMapper.goodsOrderPage(pageWrap.toPage(),new QueryWrapper() .eq(!Objects.isNull(pageWrap.getModel())&&!Objects.isNull(pageWrap.getModel().getMemberId()),"g.MEMBER_ID",pageWrap.getModel().getMemberId()) .eq("g.ISDELETED",Constants.ZERO) .eq(!Objects.isNull(pageWrap.getModel())&&!Objects.isNull(pageWrap.getModel().getOrderStatus()),"g.STATUS",pageWrap.getModel().getOrderStatus()) .orderByDesc("g.CREATE_DATE") ); String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+ systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode(); page.getRecords().forEach(i->{ List memberOrderDetailResponseList = goodsorderDetailMapper.getDetailList(i.getOrderId()); memberOrderDetailResponseList.forEach(j->{ j.setImgUrl(fullUrl + j.getImgUrl()); }); i.setMemberOrderDetailResponseList(memberOrderDetailResponseList); }); return page; } /** * 查询订单详情 * @param id * @return */ @Override public MemberOrderResponse getGoodsOrderDetail(Integer id) { MemberOrderResponse memberOrderResponse = goodsorderMapper.goodsOrderDetail(id); if(Objects.isNull(memberOrderResponse)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到订单信息"); } if(memberOrderResponse.getOrderStatus().equals(Constants.OrderStatus.WAIT_PAY.getKey())){ memberOrderResponse.setCountdown(memberOrderResponse.getCancelDate().getTime()-System.currentTimeMillis()); } List memberOrderDetailResponseList = goodsorderDetailMapper.getDetailList(memberOrderResponse.getOrderId()); String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+ systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode(); memberOrderDetailResponseList.forEach(j->{ j.setImgUrl(fullUrl + j.getImgUrl()); }); memberOrderResponse.setMemberOrderDetailResponseList(memberOrderDetailResponseList); return memberOrderResponse; } /** * 更新收货地址 * @param updAddressRequest */ @Override public void updAddress(DealOrderRequest updAddressRequest){ Goodsorder goodsorder = goodsorderMapper.selectById(updAddressRequest.getOrderId()); if(!goodsorder.getMemberId().equals(updAddressRequest.getMemberId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单修改失败:用户信息匹配失败!"); } if(!(goodsorder.getStatus().equals(Constants.ZERO)||goodsorder.getStatus().equals(Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单修改失败:订单已发货!"); } if(updAddressRequest.getAddressId().equals(goodsorder.getAddrId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单修改失败:订单地址相同!"); } Addr addr = addrMapper.selectById(updAddressRequest.getAddressId()); if(Objects.isNull(addr)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单修改失败:未查询到新地址信息!"); } goodsorder.setAddrId(addr.getId()); goodsorder.setLinkname(addr.getName()); goodsorder.setLinkaddr(addr.getAddr()); goodsorder.setLinkphone(addr.getPhone()); goodsorder.setEditor(updAddressRequest.getMemberId()); goodsorder.setEditDate(new Date()); goodsorderMapper.updateById(goodsorder); } /** * 取消订单 * @param orderId * @param optUserId * @param cancelInfo */ @Override public void cancelOrder(Integer orderId,Integer optUserId,String cancelInfo){ Goodsorder goodsorder = goodsorderMapper.selectById(orderId); if(!(goodsorder.getStatus().equals(Constants.ZERO)||goodsorder.getStatus().equals(Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单取消失败:订单已发货!"); } if(!(goodsorder.getType().equals(Constants.ZERO)||goodsorder.getType().equals(Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单取消失败:该类型订单不支持取消!"); } if(goodsorder.getStatus().equals(Constants.ONE)){ //已支付 待发货状态 取消订单 根据订单类别处理 if(goodsorder.getType().equals(Constants.ZERO)){ if(goodsorder.getPrice().compareTo(BigDecimal.ZERO)>Constants.ZERO){ //微信现金退款 String refundCode = WxMiniUtilService.wxRefund(goodsorder.getCode().toString(), goodsorder.getPrice(), goodsorder.getPrice()); Fund fund = new Fund(); fund.setOrderCode(refundCode); fund.setCreator(optUserId); fund.setCreateDate(new Date()); fund.setIsdeleted(Constants.ZERO); fund.setRemark(orderId.toString()); fund.setMemberId(goodsorder.getCreator()); fund.setTitle("订单取消"); fund.setContent(cancelInfo); fund.setObjId(orderId); fund.setObjType(Constants.ONE); fund.setType(Constants.ONE); fund.setNum(goodsorder.getPrice()); fundMapper.insert(fund); } } } if(goodsorder.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){ //更新余额信息 添加积分变动记录 DealIntegralRequest dealIntegralRequest = new DealIntegralRequest(); dealIntegralRequest.setIntegralNum(goodsorder.getIntegral()); dealIntegralRequest.setDealType(Constants.ZERO); dealIntegralRequest.setMemberId(goodsorder.getMemberId()); dealIntegralRequest.setObjId(goodsorder.getId()); dealIntegralRequest.setOrderCode(goodsorder.getCode().toString()); dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER_CANCEL); integralService.dealIntegral(dealIntegralRequest); } //订单信息取消 goodsorder.setStatus(Constants.OrderStatus.CLOSE.getKey()); goodsorder.setCancelDate(new Date()); goodsorder.setCancelInfo(cancelInfo); goodsorder.setCancelUser(optUserId); goodsorderMapper.updateById(goodsorder); String goodsName = ""; List goodsorderDetailList = goodsorderDetailMapper.selectList(new QueryWrapper().eq("ORDER_ID",goodsorder.getId())); if(!Objects.isNull(goodsorderDetailList)&&goodsorderDetailList.size()>Constants.ZERO){ for (GoodsorderDetail goodsorderDetail:goodsorderDetailList) { GoodsSku goodsSku = goodsSkuMapper.selectById(goodsorderDetail.getGoodsSkuId()); if(StringUtils.isBlank(goodsName)){ Goods goods = goodsMapper.selectById(goodsSku.getGoodsId()); goodsName = goods.getName(); } if(!Objects.isNull(goodsSku)){ goodsSku.setStock(goodsSku.getStock().add(new BigDecimal(Constants.formatIntegerNum(goodsorderDetail.getGoodsNum())))); goodsSkuMapper.updateById(goodsSku); } } } SendWxMessage.orderCancel(goodsorder,memberMapper.selectById(goodsorder.getMemberId()),goodsName); //查询优惠券信息记录 if(!Objects.isNull(goodsorder.getCouponId())){ MemberCoupon memberCoupon = memberCouponMapper.selectById(goodsorder.getCouponId()); if(!Objects.isNull(memberCoupon)){ memberCoupon.setStatus(Constants.ZERO); memberCouponMapper.updateById(memberCoupon); } } } /** * 催发货 * @param orderId * @param memberId */ @Override public void urgeSend(Integer orderId,Integer memberId){ Goodsorder goodsorder = goodsorderMapper.selectById(orderId); if(!goodsorder.getMemberId().equals(memberId)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"操作失败:用户信息匹配失败!"); } if(!(goodsorder.getStatus().equals(Constants.ZERO)||goodsorder.getStatus().equals(Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"操作失败:订单已发货!"); } if(!(goodsorder.getType().equals(Constants.ZERO)||goodsorder.getType().equals(Constants.ONE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"操作失败:该类型订单不支持!"); } if(DateUtil.daysBetweenDates(new Date(),goodsorder.getCreateDate())() .eq("ORDER_ID",goodsorder.getId()) ); if(!Objects.isNull(oldOrderUrge)){ if(DateUtil.daysBetweenDates(new Date(),oldOrderUrge.getCreateDate()) orderGoodsCommentRequestList = orderCommentRequest.getOrderGoodsCommentRequestList(); if(Objects.isNull(orderGoodsCommentRequestList)||orderGoodsCommentRequestList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"操作失败:无商品评论信息!"); } for (OrderGoodsCommentRequest orderGoodsCommentRequest:orderGoodsCommentRequestList) { OrderComment orderComment = new OrderComment(); orderComment.setCreateDate(new Date()); orderComment.setCreator(orderCommentRequest.getMemberId()); orderComment.setIsdeleted(Constants.ZERO); orderComment.setMemberId(orderCommentRequest.getMemberId()); orderComment.setOrderId(orderCommentRequest.getOrderId()); orderComment.setGoodsId(orderGoodsCommentRequest.getGoodsId()); orderComment.setOrderScore(orderCommentRequest.getOrderScore()); orderComment.setScore(orderGoodsCommentRequest.getScore()); orderComment.setContent(orderCommentRequest.getContent()); orderComment.setKdScore(orderCommentRequest.getKdScore()); orderComment.setShScore(orderCommentRequest.getShScore()); orderCommentMapper.insert(orderComment); } goodsorder.setIsComment(Constants.ONE); goodsorderMapper.updateById(goodsorder); } @Override public MyPageResponse ordersStatistics(Integer memberId){ MyPageResponse myPageResponse = new MyPageResponse(); //待支付订单 myPageResponse.setWaitPayOrders(goodsorderMapper.selectCount(new QueryWrapper() .eq("MEMBER_ID",memberId) .eq("STATUS",Constants.OrderStatus.WAIT_PAY.getKey()) )); myPageResponse.setWaitOrders(goodsorderMapper.selectCount(new QueryWrapper() .eq("MEMBER_ID",memberId) .eq("STATUS",Constants.OrderStatus.PAY_DONE.getKey()) )); myPageResponse.setWaitReceivedOrders(goodsorderMapper.selectCount(new QueryWrapper() .eq("MEMBER_ID",memberId) .eq("STATUS",Constants.OrderStatus.WAIT_RECEIVE.getKey()) )); myPageResponse.setFinishOrders(goodsorderMapper.selectCount(new QueryWrapper() .eq("MEMBER_ID",memberId) .eq("STATUS",Constants.OrderStatus.DONE.getKey()) )); myPageResponse.setAfterOrders(aftersaleMapper.selectCount(new QueryWrapper() .apply(" ID in ( select g.id from goodsorder g where g.MEMBER_ID = '"+memberId+"' ) ") .notIn("STATUS",Constants.AftersaleStatus.DONE,Constants.AftersaleStatus.SHOP_REFUSE,Constants.AftersaleStatus.CANCEL) )); return myPageResponse; } /** * 订单自动取消 */ @Override @Transactional(rollbackFor = Exception.class) public void autoCancel(){ //查询订单数据 List goodsOrderList = goodsorderMapper.selectList( new QueryWrapper() .eq("STATUS",Constants.ZERO) .in("TYPE",Constants.ZERO, Constants.ONE) .apply(" now() >= SUBDATE(CREATE_DATE,interval - 15 minute) ") ); if(!Objects.isNull(goodsOrderList)&&goodsOrderList.size()>Constants.ZERO){ goodsOrderList.forEach(i->{ this.cancelOrder(i.getId(),null,"超时未支付自动取消"); }); } } /** * 订单自动确认 */ @Override @Transactional(rollbackFor = Exception.class) public void autoAffirm(){ //查询订单数据 goodsorderMapper.update(null,new UpdateWrapper() .set("DONE_INFO","发货15天后系统自动确认") .set("STATUS",Constants.OrderStatus.DONE.getKey()) .set("DONE_DATE",new Date()) .eq("STATUS",Constants.OrderStatus.WAIT_RECEIVE.getKey()) .apply(" now() >= date_sub(CREATE_DATE,interval - 15 day) ") ); } @Override public void resetOrderCodes(){ //加入redis缓存,刷新今天报名编号0开始 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.ACTIVITY_SIGN_KEY,0); //加入redis缓存,刷新今天订单编号0开始 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.GOODSORDER_KEY,0); //加入redis缓存,刷新今天售后编号0开始 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.AFTERSALE_KEY,0); } @Override public void refreshOrderCodes(){ long countOrder = 0,countSign=0,countSale=0; QueryWrapper order = new QueryWrapper<>(); order.apply(true, "TO_DAYS(NOW())=TO_DAYS(create_date)"); order.orderByDesc(" CODE "); order.last(" limit 1 "); Goodsorder maxOrder = goodsorderMapper.selectOne(order); if(!Objects.isNull(maxOrder)){ countOrder = Integer.valueOf(maxOrder.getCode().toString().substring(8,12)); } //加入redis缓存,刷新今天订单编号0开始 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.GOODSORDER_KEY,countOrder); QueryWrapper sign = new QueryWrapper<>(); sign.apply(true, "TO_DAYS(NOW())=TO_DAYS(create_date)"); countSign = activitySignMapper.selectCount(sign); //加入redis缓存,刷新今天报名编号0开始 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.ACTIVITY_SIGN_KEY,countSign); QueryWrapper sale = new QueryWrapper<>(); sale.apply(true, "TO_DAYS(NOW())=TO_DAYS(create_date)"); sale.orderByDesc(" CODE "); sale.last(" limit 1 "); Aftersale maxAfterOrder = aftersaleMapper.selectOne(sale); if(!Objects.isNull(maxAfterOrder)){ countSale = Integer.valueOf(maxOrder.getCode().toString().substring(8,12)); } //加入redis缓存,刷新今天售后编号0开始 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.AFTERSALE_KEY,countSale); } public synchronized Long getNextInCode(){ String prefix = DateUtil.getDate(new Date(),"yyyyMMdd") ; Integer countNum = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.GOODSORDER_KEY,Integer.class); countNum = Constants.formatIntegerNum(countNum)+1; //更新缓存 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.GOODSORDER_KEY,countNum); String nextIndex =Long.toString( countNum); return Long.parseLong(prefix + StringUtils.leftPad(nextIndex,4,"0")); } /** * 得到request对象 * * @return */ public HttpServletRequest getRequest() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return request; } public String getIpAddr() { HttpServletRequest request = this.getRequest(); String ipAddress = null; try { ipAddress = request.getHeader("x-forwarded-for"); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("WL-Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if (ipAddress.equals("127.0.0.1")) { // 根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ipAddress = inet.getHostAddress(); } } // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length() // = 15 if (ipAddress.indexOf(",") > 0) { ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); } } } catch (Exception e) { ipAddress = "127.0.0.1"; } // ipAddress = this.getRequest().getRemoteAddr(); return ipAddress; } }