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<ComShopFlowerRefundOrderDAO, ComShopFlowerRefundOrderDO>
|
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<ComShopFlowerRefundOrderVO> 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<ComShopFlowerOrderGoodsVO> orderGoodsVOS = new ArrayList<>();
|
// 查询订单下商品信息
|
List<ComShopFlowerOrderGoodsDO> orderGoodsDOList = comShopFlowerOrderGoodsDAO
|
.selectList(new QueryWrapper<ComShopFlowerOrderGoodsDO>().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<String, String> 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<ComShopOrderCountVO> comShopOrderCountVOS = this.baseMapper.selectCountGroupStatus(storeId);
|
Map<Integer, Integer> collect = comShopOrderCountVOS.stream().collect(Collectors.toMap(ComShopOrderCountVO::getStatus, ComShopOrderCountVO::getAmount));
|
Map<String,Integer> 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<ComShopFlowerOrderGoodsVO> orderGoodsVOS = new ArrayList<>();
|
// 查询订单下商品信息
|
List<ComShopFlowerOrderGoodsDO> orderGoodsDOList = comShopFlowerOrderGoodsDAO
|
.selectList(new QueryWrapper<ComShopFlowerOrderGoodsDO>().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);
|
}
|
}
|