package com.panzhihua.service_community.service.impl; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; 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.panzhihua.common.constants.Constants; import com.panzhihua.common.model.dtos.shop.ComShopFlowerRefundOrderDTO; import com.panzhihua.common.model.dtos.shop.ComShopOrderQueryDTO; import com.panzhihua.common.model.dtos.shop.PageComOrderRefundDTO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.convenient.ConvenientMerchantVO; import com.panzhihua.common.model.vos.shop.ComShopFlowerOrderGoodsVO; import com.panzhihua.common.model.vos.shop.ComShopFlowerRefundOrderVO; import com.panzhihua.common.model.vos.shop.ComShopOrderCountVO; import com.panzhihua.common.model.vos.user.SysUserVO; import com.panzhihua.common.service.user.UserService; import com.panzhihua.common.utlis.OrderNoUtils; import com.panzhihua.common.utlis.WxPayUtils; import com.panzhihua.common.utlis.WxUtil; import com.panzhihua.common.utlis.wx.WXPayUtil; import com.panzhihua.service_community.dao.*; import com.panzhihua.service_community.model.dos.*; import com.panzhihua.service_community.service.ComShopFlowerRefundOrderService; import com.panzhihua.service_community.util.WxMaConfiguration; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; /** * @ClassName: ComShopFlowerRefundOrderServiceImpl * @Author: yh * @Date: 2022/11/16 14:36 * @Description: 退款订单 */ @Slf4j @Service public class ComShopFlowerRefundOrderServiceImpl extends ServiceImpl implements ComShopFlowerRefundOrderService { @Value("${hcMin.app.isTest}") private Boolean isTest; @Value("${hcMin.app.appid}") private String appid; @Value("${hcMin.app.payKey}") private String payKey; @Value("${hcMin.app.mchId}") private String mchId; @Value("${hcMin.app.notifyUrl}") private String notifyUrl; @Resource private ComShopFlowerOrderDAO comShopFlowerOrderDAO; @Resource private ComShopFlowerOrderPayDAO comShopFlowerOrderPayDAO; @Resource private ComShopFlowerOrderGoodsDAO comShopFlowerOrderGoodsDAO; @Resource private ComShopFlowerGoodsDAO comShopFlowerGoodsDAO; @Resource private ComShopFlowerGoodsAttrDAO comShopFlowerGoodsAttrDAO; @Resource private ConvenientMerchantDAO convenientMerchantDAO; @Resource private WxMaConfiguration wxMaConfiguration; @Resource private UserService userService; @Resource private ConvenientElevatingPointDAO convenientElevatingPointDAO; @Override @Transactional(rollbackFor = Exception.class) public R createRefundOrder(ComShopFlowerRefundOrderDTO comShopFlowerRefundOrderDTO) { ComShopFlowerRefundOrderDO comShopFlowerRefundOrderDO = new ComShopFlowerRefundOrderDO(); BeanUtils.copyProperties(comShopFlowerRefundOrderDTO, comShopFlowerRefundOrderDO); // 生成退款订单号 String refundOrderNo = OrderNoUtils.NextOrderNoFlower(comShopFlowerRefundOrderDTO.getUserId()); comShopFlowerRefundOrderDO.setRefundOrderNo(refundOrderNo); comShopFlowerRefundOrderDO.setStatus(ComShopFlowerRefundOrderDO.status.clz); comShopFlowerRefundOrderDO.setDeleteStatus(ComShopFlowerRefundOrderDO.deleteStatus.no); this.baseMapper.insert(comShopFlowerRefundOrderDO); //商家接受退款信息 ConvenientMerchantVO convenientMerchantVO = convenientMerchantDAO.selectMerchantById(comShopFlowerRefundOrderDTO.getStoreId()); WxMaService maService = wxMaConfiguration.getMaService(Constants.HC_APP_ID); R sysUserVOR = userService.getSysUserVOByPhone(convenientMerchantVO.getMobilePhone()); if (R.isOk(sysUserVOR)) { SysUserVO sysUserVO = JSONObject.parseObject(JSONObject.toJSONString(sysUserVOR.getData()), SysUserVO.class); try { DecimalFormat df = new DecimalFormat("#.00"); WxUtil.sendNewRefundOrderNotice(sysUserVO.getOpenid(),maService.getAccessToken(),refundOrderNo,df.format(comShopFlowerRefundOrderDO.getRefundAmount()),DateUtil.format(comShopFlowerRefundOrderDO.getRefundTime(),"yyyy-MM-dd HH:mm")); } catch (WxErrorException e) { e.printStackTrace(); } } return R.ok(); } @Override public R pageRefundOrder(PageComOrderRefundDTO pageComOrderRefundDTO) { Page page = new Page<>(pageComOrderRefundDTO.getPageNum(), pageComOrderRefundDTO.getPageSize()); IPage pages = this.baseMapper.pageRefundOrder(page, pageComOrderRefundDTO); for (ComShopFlowerRefundOrderVO comShopFlowerRefundOrderVO : pages.getRecords()) { String orderNo = comShopFlowerRefundOrderVO.getOrderNo(); ComShopFlowerOrderDO comShopFlowerOrderDO = comShopFlowerOrderDAO.selectById(comShopFlowerRefundOrderVO.getOrderId()); if (nonNull(comShopFlowerOrderDO)){ comShopFlowerRefundOrderVO.setTotalAmount(comShopFlowerOrderDO.getTotalAmount()); ConvenientElevatingPointDO convenientElevatingPointDO = convenientElevatingPointDAO.selectById(comShopFlowerOrderDO.getPointId()); if (nonNull(convenientElevatingPointDO)){ comShopFlowerRefundOrderVO.setPointName(convenientElevatingPointDO.getName()); } } List orderGoodsVOS = new ArrayList<>(); // 查询订单下商品信息 List orderGoodsDOList = comShopFlowerOrderGoodsDAO .selectList(new QueryWrapper().eq("order_no",orderNo)); StringBuilder sbr = new StringBuilder(); if (!orderGoodsDOList.isEmpty()) { orderGoodsDOList.forEach(orderGoods -> { ComShopFlowerOrderGoodsVO orderGoodsVO = new ComShopFlowerOrderGoodsVO(); BeanUtils.copyProperties(orderGoods, orderGoodsVO); orderGoodsVO.setNum(orderGoods.getAmount()); orderGoodsVO.setGoodsPic(orderGoods.getGoodsAttrPic()); orderGoodsVO.setPrice(orderGoods.getGoodsAttrPrice()); orderGoodsVO.setGoodsAttr(orderGoods.getGoodsAttrName()); orderGoodsVOS.add(orderGoodsVO); sbr.append(orderGoods.getGoodsName()).append(" "); }); comShopFlowerRefundOrderVO.setGoodsAttrName(orderGoodsDOList.get(0).getGoodsAttrName()); } comShopFlowerRefundOrderVO.setOrderGoodsVOList(orderGoodsVOS); comShopFlowerRefundOrderVO.setGoodsName(sbr.toString()); // 查询店铺信息 /* ConvenientMerchantVO shopStoreVO = new ConvenientMerchantVO(); ConvenientMerchantDO shopStoreDO = convenientMerchantDAO.selectById(comShopFlowerRefundOrderVO.getStoreId()); if (shopStoreDO != null) { BeanUtils.copyProperties(shopStoreDO, shopStoreVO); } comShopFlowerRefundOrderVO.setConvenientMerchantVO(shopStoreVO); */ } return R.ok(pages); } @Override @Transactional(rollbackFor = Exception.class) public R updateRefundOrder(ComShopFlowerRefundOrderDTO comShopFlowerRefundOrderDTO) { ComShopFlowerRefundOrderDO comShopFlowerRefundOrderDO = this.baseMapper.selectById(comShopFlowerRefundOrderDTO.getId()); if (Objects.isNull(comShopFlowerRefundOrderDO)) { return R.fail("不存在该退款订单"); } ComShopFlowerOrderDO comShopFlowerOrderDO = comShopFlowerOrderDAO.selectById(comShopFlowerRefundOrderDO.getOrderId()); if (ComShopFlowerRefundOrderDO.handleResult.agree.equals(comShopFlowerRefundOrderDTO.getHandleResult())) { //处理退款事宜 comShopFlowerRefundOrderDO.setRefundTime(new Date()); comShopFlowerRefundOrderDO.setHandleTime(new Date()); comShopFlowerRefundOrderDO.setHandleResult(ComShopFlowerRefundOrderDO.handleResult.agree); //微信处理退款 try { String refundNo = WXPayUtil.generateNonceStr(); String refundStr = WxPayUtils.refund(appid, mchId, comShopFlowerOrderDO.getOrderNo(), comShopFlowerRefundOrderDO.getPayAmount(), comShopFlowerRefundOrderDO.getPayAmount(), refundNo, isTest); log.info("退款请求接口返回参数:{}" , refundStr); Map mapResult = WXPayUtil.xmlToMap(refundStr); if (CollUtil.isNotEmpty(mapResult)) { String return_code = (String) mapResult.get("return_code"); String result_code = (String) mapResult.get("result_code"); String return_msg = mapResult.get("return_msg"); ComShopFlowerOrderPayDO orderPayDO = new ComShopFlowerOrderPayDO(); orderPayDO.setOrderNo(comShopFlowerOrderDO.getOrderNo()); orderPayDO.setOrderAmount(comShopFlowerOrderDO.getTotalAmount()); orderPayDO.setPayTime(new Date()); orderPayDO.setStoreId(comShopFlowerOrderDO.getStoreId()); orderPayDO.setDeliveryType(comShopFlowerOrderDO.getDeliveryType()); orderPayDO.setOrderId(comShopFlowerOrderDO.getId()); orderPayDO.setPayType(ComShopFlowerOrderPayDO.payType.tk); orderPayDO.setRefundOrderNo(comShopFlowerRefundOrderDO.getRefundOrderNo()); orderPayDO.setPayAmount(comShopFlowerRefundOrderDO.getRefundAmount()); if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) { //退款成功 comShopFlowerRefundOrderDO.setStatus(ComShopFlowerRefundOrderDO.status.tkcg); // 添加订单支付记录表 // orderPayDO.setWxTradeNo(wxPayNotifyOrderDTO.getWxTradeNo()); orderPayDO.setPayStatus(ComShopFlowerOrderPayDO.payStatus.yes); orderPayDO.setRefundStatus(ComShopFlowerOrderPayDO.refundStatus.tkcg); //更新订单状态 comShopFlowerOrderDO.setStatus(ComShopFlowerOrderDO.status.ytk); comShopFlowerOrderDAO.updateById(comShopFlowerOrderDO); //退款成功发送消息 sendRefundNotice(comShopFlowerRefundOrderDO, comShopFlowerOrderDO,"同意退款"); }else { //退款失败 comShopFlowerRefundOrderDO.setStatus(ComShopFlowerRefundOrderDO.status.tksb); comShopFlowerRefundOrderDO.setRemark(comShopFlowerRefundOrderDO.getRemark() + "_退款失败"); // 添加订单支付记录表 orderPayDO.setPayStatus(ComShopFlowerOrderPayDO.payStatus.no); orderPayDO.setRefundStatus(ComShopFlowerOrderPayDO.refundStatus.tksb); //退款失败发送消息 sendRefundNotice(comShopFlowerRefundOrderDO, comShopFlowerOrderDO,"退款失败"); } comShopFlowerOrderPayDAO.insert(orderPayDO); } } catch (Exception e) { log.error("申请退款失败,"+e.getMessage()); e.printStackTrace(); } } else if (ComShopFlowerRefundOrderDO.handleResult.refuse.equals(comShopFlowerRefundOrderDTO.getHandleResult())) { comShopFlowerRefundOrderDO.setHandleTime(new Date()); comShopFlowerRefundOrderDO.setStatus(ComShopFlowerRefundOrderDO.status.tksb); comShopFlowerRefundOrderDO.setHandleResult(ComShopFlowerRefundOrderDO.handleResult.refuse); //拒绝退款发送消息 sendRefundNotice(comShopFlowerRefundOrderDO, comShopFlowerOrderDO,"拒绝退款"); } this.baseMapper.updateById(comShopFlowerRefundOrderDO); return R.ok(); } private void sendRefundNotice(ComShopFlowerRefundOrderDO comShopFlowerRefundOrderDO, ComShopFlowerOrderDO comShopFlowerOrderDO,String msg) { WxMaService maService = wxMaConfiguration.getMaService(Constants.HC_APP_ID); R userOpenId = userService.getUserOpenId(comShopFlowerOrderDO.getUserId()); if (R.isOk(userOpenId)) { String openid = userOpenId.getData().toString(); try { DecimalFormat df = new DecimalFormat("#.00"); WxUtil.sendRefundNotice(openid,maService.getAccessToken(),comShopFlowerRefundOrderDO.getRefundOrderNo(),df.format(comShopFlowerRefundOrderDO.getRefundAmount()),msg); } catch (WxErrorException e) { e.printStackTrace(); } } } @Override public R selectCountGroupStatus(Long storeId){ String[] statusStr = {"clz","tkcg","tksb","yqx","tkz"}; List comShopOrderCountVOS = this.baseMapper.selectCountGroupStatus(storeId); Map collect = comShopOrderCountVOS.stream().collect(Collectors.toMap(ComShopOrderCountVO::getStatus, ComShopOrderCountVO::getAmount)); Map retMap = new HashMap<>(); int amountTotal = 0; for (int i = 0; i < statusStr.length; i++) { if (collect.containsKey(i)) { Integer amount = collect.get(i); amountTotal = amountTotal + amount; retMap.put(statusStr[i],amount); }else { retMap.put(statusStr[i],0); } } retMap.put("zdd",amountTotal); return R.ok(retMap); } /** * 根据订单id取消订单 * * @param \ * @return 取消结果 */ @Transactional(rollbackFor = Exception.class) @Override public R orderCancel(Long id) { this.baseMapper.updateCancel(id,ComShopFlowerRefundOrderDO.status.yqx); return R.ok(); } @Override public R refundOrderDetail(Long id){ ComShopFlowerRefundOrderDO comShopFlowerRefundOrderDO = this.baseMapper.selectById(id); if (isNull(comShopFlowerRefundOrderDO)){ return R.fail("未查询到该退款订单"); } ComShopFlowerRefundOrderVO comShopFlowerRefundOrderVO = new ComShopFlowerRefundOrderVO(); BeanUtils.copyProperties(comShopFlowerRefundOrderDO,comShopFlowerRefundOrderVO); String orderNo = comShopFlowerRefundOrderDO.getOrderNo(); List orderGoodsVOS = new ArrayList<>(); // 查询订单下商品信息 List orderGoodsDOList = comShopFlowerOrderGoodsDAO .selectList(new QueryWrapper().eq("order_no",orderNo)); StringBuilder sbr = new StringBuilder(); if (!orderGoodsDOList.isEmpty()) { orderGoodsDOList.forEach(orderGoods -> { ComShopFlowerOrderGoodsVO orderGoodsVO = new ComShopFlowerOrderGoodsVO(); BeanUtils.copyProperties(orderGoods, orderGoodsVO); orderGoodsVO.setNum(orderGoods.getAmount()); orderGoodsVO.setGoodsPic(orderGoods.getGoodsAttrPic()); orderGoodsVO.setPrice(orderGoods.getGoodsAttrPrice()); // 查询商品信息判断商品状态 ComShopFlowerGoodsDO goodsDO = comShopFlowerGoodsDAO.selectById(orderGoods.getGoodsId()); if (goodsDO == null || goodsDO.getDeleteStatus().equals(ComShopFlowerGoodsDO.deleteStatus.yes) || goodsDO.getDeleteStatus().equals(ComShopFlowerGoodsDO.status.recovery)) { orderGoodsVO.setGoodsStatus(ComShopFlowerOrderGoodsVO.goodsStatus.ysc); } else if (goodsDO.getStatus().equals(ComShopFlowerGoodsDO.status.lower)) { orderGoodsVO.setGoodsStatus(ComShopFlowerOrderGoodsVO.goodsStatus.yxj); } else if (goodsDO.getStatus().equals(ComShopFlowerGoodsDO.status.sell)) { orderGoodsVO.setGoodsStatus(ComShopFlowerOrderGoodsVO.goodsStatus.csz); } // 根据商品规格id查询商品规格 ComShopFlowerGoodsAttrDO goodsAttrDO = comShopFlowerGoodsAttrDAO.selectById(orderGoods.getGoodsAttrId()); if (goodsAttrDO != null) { orderGoodsVO.setGoodsAttr(goodsAttrDO.getGoodsAttrName()); } comShopFlowerRefundOrderVO.setGoodsAttrName(orderGoodsDOList.get(0).getGoodsAttrName()); orderGoodsVOS.add(orderGoodsVO); sbr.append(orderGoods.getGoodsName()).append(" "); }); } comShopFlowerRefundOrderVO.setOrderGoodsVOList(orderGoodsVOS); comShopFlowerRefundOrderVO.setGoodsName(sbr.toString()); ConvenientMerchantVO shopStoreVO = new ConvenientMerchantVO(); // 查询店铺信息 ConvenientMerchantDO shopStoreDO = convenientMerchantDAO.selectById(comShopFlowerRefundOrderDO.getStoreId()); if (shopStoreDO != null) { BeanUtils.copyProperties(shopStoreDO, shopStoreVO); } comShopFlowerRefundOrderVO.setConvenientMerchantVO(shopStoreVO); return R.ok(comShopFlowerRefundOrderVO); } }