package com.matrix.system.hive.action; 
 | 
  
 | 
import com.matrix.core.constance.MatrixConstance; 
 | 
import com.matrix.core.pojo.AjaxResult; 
 | 
import com.matrix.core.tools.StringUtils; 
 | 
import com.matrix.core.tools.WebUtil; 
 | 
import com.matrix.system.common.bean.SysUsers; 
 | 
import com.matrix.system.constance.Dictionary; 
 | 
import com.matrix.system.hive.bean.*; 
 | 
import com.matrix.system.hive.dao.MoneyCardUseFlowDao; 
 | 
import com.matrix.system.hive.dao.SysOrderDao; 
 | 
import com.matrix.system.hive.dao.SysOrderItemDao; 
 | 
import com.matrix.system.hive.plugin.util.MoneyUtil; 
 | 
import com.matrix.system.hive.pojo.RefundOrderItemVo; 
 | 
import com.matrix.system.hive.pojo.RefundOrderVo; 
 | 
import com.matrix.system.hive.service.*; 
 | 
import org.apache.commons.collections.CollectionUtils; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Controller; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.web.bind.annotation.RequestBody; 
 | 
import org.springframework.web.bind.annotation.RequestMapping; 
 | 
import org.springframework.web.bind.annotation.ResponseBody; 
 | 
  
 | 
import javax.annotation.Resource; 
 | 
import java.util.ArrayList; 
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * 线下订单 
 | 
 * 
 | 
 * @author jiangyouyao 
 | 
 * @date 2016-09-08 
 | 
 */ 
 | 
@Controller 
 | 
@RequestMapping(value = "admin/refundOrder") 
 | 
public class RefundOrderController extends BaseController { 
 | 
    @Resource 
 | 
    private SysOrderService orderService; 
 | 
  
 | 
    @Autowired 
 | 
    private SysOrderItemDao orderItemDao; 
 | 
  
 | 
    @Resource 
 | 
    private MoneyCardUseService cardUseService; 
 | 
  
 | 
    @Autowired 
 | 
    private SysOrderItemService orderItemService; 
 | 
  
 | 
    @Autowired 
 | 
    private SysOrderDao sysOrderDao; 
 | 
  
 | 
    @Autowired 
 | 
    private AchieveNewService achieveNewService; 
 | 
  
 | 
    @Autowired 
 | 
    private SysProjUseService projUseService; 
 | 
  
 | 
    @Autowired 
 | 
    private ShoppingGoodsService shoppingGoodsService; 
 | 
  
 | 
    @Autowired 
 | 
    private MoneyCardUseService moneyCardUseService; 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private CodeService codeService; 
 | 
  
 | 
    @Autowired 
 | 
    private MoneyCardUseFlowDao moneyCardUseFlowDao; 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 订单退款 
 | 
     */ 
 | 
    @RequestMapping(value = "/refundOrder") 
 | 
    @Transactional 
 | 
    public @ResponseBody 
 | 
    AjaxResult refundOrder(@RequestBody RefundOrderVo refundOrderVo) { 
 | 
        SysUsers loginUser = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); 
 | 
        if (CollectionUtils.isEmpty(refundOrderVo.getItems())) { 
 | 
            return new AjaxResult(AjaxResult.STATUS_FAIL, "请添加退款明细"); 
 | 
        } 
 | 
  
 | 
        SysOrder order = new SysOrder(); 
 | 
        order.setOrderNo(codeService.getRefundOrderNo()); 
 | 
        Double total =0D; 
 | 
        for(RefundOrderItemVo itemVo:refundOrderVo.getItems()){ 
 | 
            total=MoneyUtil.add(total,MoneyUtil.add(itemVo.getCardPay(),itemVo.getCashPay())); 
 | 
        } 
 | 
        order.setTotal(0-total); 
 | 
        order.setZkTotal(total); 
 | 
        order.setVipId(refundOrderVo.getVipId()); 
 | 
        order.setOrderTime(new Date()); 
 | 
        order.setPayTime(new Date()); 
 | 
        order.setStaffId(getMe().getSuId()); 
 | 
        order.setShopId(getMe().getShopId()); 
 | 
        order.setStatu(Dictionary.ORDER_STATU_TK); 
 | 
        order.setRemark(refundOrderVo.getRemark()); 
 | 
        orderService.add(order); 
 | 
        List<SysOrderItem> orderItemList = new ArrayList<>(); 
 | 
        for (RefundOrderItemVo itemVo : refundOrderVo.getItems()) { 
 | 
  
 | 
            //设置订单明细基础信息 
 | 
            SysOrderItem orderItem = new SysOrderItem(); 
 | 
            orderItem.setOrderId(order.getId()); 
 | 
            orderItem.setCount(itemVo.getCount()); 
 | 
            orderItem.setZkPrice(itemVo.getZkPrice()); 
 | 
            orderItem.setIsFree(Dictionary.FLAG_NO); 
 | 
            orderItem.setGoodsId(itemVo.getGoodsId()); 
 | 
            if ( itemVo.getCardPay() > 0) { 
 | 
                orderItem.setPayMethod(Dictionary.PAY_TYPE_CARD); 
 | 
  
 | 
                //退回卡内余额 
 | 
                MoneyCardUse moneyCardUse=moneyCardUseService.findById(itemVo.getCardId()); 
 | 
                moneyCardUse.setRealMoney(MoneyUtil.add(moneyCardUse.getRealMoney(),itemVo.getCardPay()) ); 
 | 
                moneyCardUse.setIsOver(Dictionary.FLAG_NO_N); 
 | 
                moneyCardUseService.modify(moneyCardUse); 
 | 
  
 | 
                //充值卡使用流水 
 | 
                MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow(); 
 | 
                moneyCardUseFlow.setTotal(itemVo.getCardPay()); 
 | 
                moneyCardUseFlow.setCarUseId(itemVo.getCardId()); 
 | 
                moneyCardUseFlow.setVipId(order.getVipId()); 
 | 
                moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CZ); 
 | 
                moneyCardUseFlow.setOrderNo(order.getOrderNo()); 
 | 
                moneyCardUseFlow.setCreateTime(new Date()); 
 | 
                moneyCardUseFlow.setOperationId(loginUser.getSuId()); 
 | 
                moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney()+moneyCardUse.getRealMoney()); 
 | 
                moneyCardUseFlowDao.insert(moneyCardUseFlow); 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
            } else { 
 | 
                orderItem.setPayMethod(Dictionary.PAY_TYPE_MOENY); 
 | 
            } 
 | 
            orderItem.setCashPay(itemVo.getCashPay()); 
 | 
            orderItem.setCardPay(itemVo.getCardPay()); 
 | 
            orderItem.setStatus(Dictionary.ORDER_STATU_TK); 
 | 
            orderItem.setPayMethodDetail(itemVo.getCardId() + ""); 
 | 
  
 | 
            //扣减项目余次 
 | 
            if (RefundOrderItemVo.REFUND_TYPE_GOODS.equals(itemVo.getRefundType())) { 
 | 
                orderItem.setType(Dictionary.SHOPPING_GOODS_TYPE_JJCP); 
 | 
            } else if (RefundOrderItemVo.REFUND_TYPE_PROJECT.equals(itemVo.getRefundType())) { 
 | 
                orderItem.setType(Dictionary.SHOPPING_GOODS_TYPE_TC); 
 | 
                //扣减项目余次 
 | 
                SysProjUse projUse = projUseService.findById(itemVo.getBusId()); 
 | 
                int surplusCount = projUse.getSurplusCount() - itemVo.getCount(); 
 | 
                if (surplusCount <= 0  ) { 
 | 
                    projUse.setStatus(Dictionary.TAOCAN_STATUS_WX); 
 | 
                    projUse.setIsOver(Dictionary.FLAG_YES_Y); 
 | 
                } 
 | 
                projUse.setSurplusCount(surplusCount); 
 | 
                projUse.setBalance(surplusCount * projUse.getPrice()); 
 | 
                if (Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(projUse.getType())) { 
 | 
                    projUse.setOrderItemId(itemVo.getOrderItemId()); 
 | 
                    projUseService.updateProjUseTck(projUse); 
 | 
                } else { 
 | 
                    projUseService.modify(projUse); 
 | 
                } 
 | 
  
 | 
  
 | 
            } else if (RefundOrderItemVo.REFUND_TYPE_CARD.equals(itemVo.getRefundType())) { 
 | 
                orderItem.setType(Dictionary.SHOPPING_GOODS_TYPE_CZK); 
 | 
                MoneyCardUse moneyCardUse = moneyCardUseService.findById(itemVo.getBusId()); 
 | 
                moneyCardUse.setRealMoney(MoneyUtil.sub(moneyCardUse.getRealMoney(), (itemVo.getCardPay() + itemVo.getCashPay()))); 
 | 
                if (moneyCardUse.getRealMoney() <= 0 && Dictionary.DELETED_N.equals(moneyCardUse.getIsVipCar()) ) { 
 | 
                    moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y); 
 | 
                    moneyCardUse.setStatus(Dictionary.TAOCAN_STATUS_WX); 
 | 
                } 
 | 
                moneyCardUseService.modify(moneyCardUse); 
 | 
            } 
 | 
            orderItem.setCardPay(0-orderItem.getCardPay()); 
 | 
            orderItem.setCashPay(0-orderItem.getCashPay()); 
 | 
            orderItemDao.insert(orderItem); 
 | 
        } 
 | 
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "退款成功"); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 创建退款明细 
 | 
     */ 
 | 
    @RequestMapping(value = "/createItem") 
 | 
    public @ResponseBody 
 | 
    AjaxResult createItem(@RequestBody RefundOrderItemVo itemVo) { 
 | 
  
 | 
        if (RefundOrderItemVo.REFUND_TYPE_GOODS.equals(itemVo.getRefundType())) { 
 | 
            return createGoodsItem(itemVo); 
 | 
        } else if (RefundOrderItemVo.REFUND_TYPE_PROJECT.equals(itemVo.getRefundType())) { 
 | 
            return createProjctItem(itemVo); 
 | 
        } else if (RefundOrderItemVo.REFUND_TYPE_CARD.equals(itemVo.getRefundType())) { 
 | 
            return createMoneyCarItem(itemVo); 
 | 
        } else { 
 | 
            return new AjaxResult(AjaxResult.STATUS_FAIL, "type参数错误"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 生成充值卡退款明细 
 | 
     * TODO 考虑退款业绩如何处理 
 | 
     * @param itemVo 
 | 
     * @return 
 | 
     */ 
 | 
    private AjaxResult createMoneyCarItem(RefundOrderItemVo itemVo) { 
 | 
        List<RefundOrderItemVo> refundOrderItemVoList = new ArrayList<>(); 
 | 
        List<Long> moneyCardIdList = StringUtils.strToCollToLong(itemVo.getIds(), ","); 
 | 
        for (Long cardId : moneyCardIdList) { 
 | 
            RefundOrderItemVo refundOrderItemVo = new RefundOrderItemVo(); 
 | 
            MoneyCardUse moneyCardUse = moneyCardUseService.findById(cardId); 
 | 
            SysOrderItem orderItem = orderItemDao.selectById(moneyCardUse.getOrderItemId()); 
 | 
            refundOrderItemVo.setOrderItemId(orderItem.getId()); 
 | 
            refundOrderItemVo.setPrice(moneyCardUse.getRealMoney()); 
 | 
            refundOrderItemVo.setZkPrice(moneyCardUse.getRealMoney()); 
 | 
            refundOrderItemVo.setCount(1); 
 | 
            refundOrderItemVo.setMaxCount(1); 
 | 
            refundOrderItemVo.setRefundType(RefundOrderItemVo.REFUND_TYPE_CARD); 
 | 
  
 | 
            refundOrderItemVo.setBusId(cardId); 
 | 
  
 | 
            ShoppingGoods shoppingGoods = shoppingGoodsService.findById(moneyCardUse.getGoodsId()); 
 | 
            refundOrderItemVo.setGoodsName(shoppingGoods.getName()); 
 | 
            refundOrderItemVo.setGoodsId(moneyCardUse.getGoodsId()); 
 | 
  
 | 
            if (orderItem.getCardPay() != null && orderItem.getCardPay() != 0 && orderItem.getPayMethodDetail() != null) { 
 | 
                //查询付款的卡项 
 | 
                MoneyCardUse payMoneyCardUse = cardUseService.findById(Long.parseLong(orderItem.getPayMethodDetail())); 
 | 
                refundOrderItemVo.setCardId(payMoneyCardUse.getId()); 
 | 
                refundOrderItemVo.setCardName(payMoneyCardUse.getCardName() + "-余:" + payMoneyCardUse.getMoney()); 
 | 
            } 
 | 
  
 | 
            refundOrderItemVoList.add(refundOrderItemVo); 
 | 
        } 
 | 
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, refundOrderItemVoList); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 生成套餐项目退款明细 
 | 
     */ 
 | 
    private AjaxResult createProjctItem(RefundOrderItemVo itemVo) { 
 | 
        List<RefundOrderItemVo> refundOrderItemVoList = new ArrayList<>(); 
 | 
        List<Long> projUseIdList = StringUtils.strToCollToLong(itemVo.getIds(), ","); 
 | 
  
 | 
        for (Long projUseId : projUseIdList) { 
 | 
  
 | 
            SysProjUse sysProjUse = projUseService.findById(projUseId); 
 | 
  
 | 
            RefundOrderItemVo refundOrderItemVo = new RefundOrderItemVo(); 
 | 
            SysOrderItem orderItem = orderItemDao.selectById(sysProjUse.getOrderItemId()); 
 | 
            refundOrderItemVo.setOrderItemId(orderItem.getId()); 
 | 
            refundOrderItemVo.setGoodsId(orderItem.getGoodsId()); 
 | 
            refundOrderItemVo.setPrice(sysProjUse.getPrice()); 
 | 
            refundOrderItemVo.setZkPrice(sysProjUse.getPrice()); 
 | 
            refundOrderItemVo.setCount(sysProjUse.getSurplusCount()); 
 | 
            refundOrderItemVo.setBusId(projUseId); 
 | 
            refundOrderItemVo.setCashPay(sysProjUse.getBalance()); 
 | 
            refundOrderItemVo.setRefundType(RefundOrderItemVo.REFUND_TYPE_PROJECT); 
 | 
            refundOrderItemVo.setMaxCount(sysProjUse.getSurplusCount()); 
 | 
            ShoppingGoods projInfo = shoppingGoodsService.findById(sysProjUse.getProjId()); 
 | 
  
 | 
            refundOrderItemVo.setGoodsName(projInfo.getName()); 
 | 
  
 | 
            if (orderItem.getCardPay() != null && orderItem.getPayMethodDetail() != null) { 
 | 
                //查询付款的卡项 
 | 
                MoneyCardUse moneyCardUse = cardUseService.findById(Long.parseLong(orderItem.getPayMethodDetail())); 
 | 
                refundOrderItemVo.setCardId(moneyCardUse.getId()); 
 | 
                refundOrderItemVo.setCardName(moneyCardUse.getCardName() + "-余:" + moneyCardUse.getMoney()); 
 | 
  
 | 
            } 
 | 
            refundOrderItemVoList.add(refundOrderItemVo); 
 | 
        } 
 | 
  
 | 
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, refundOrderItemVoList); 
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 生成家居产品退款明细 
 | 
     */ 
 | 
    private AjaxResult createGoodsItem(RefundOrderItemVo itemVo) { 
 | 
        List<RefundOrderItemVo> refundOrderItemVoList = new ArrayList<>(); 
 | 
        //校验订单状态,只有已付款的订单可以进行退款 
 | 
        SysOrder order = orderService.findById(itemVo.getOrderId()); 
 | 
        if (!Dictionary.ORDER_STATU_YFK.equals(order.getStatu())) { 
 | 
            return new AjaxResult(AjaxResult.STATUS_FAIL, "该订单没有完成付款"); 
 | 
        } 
 | 
        List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(itemVo.getOrderId()); 
 | 
  
 | 
        for (SysOrderItem orderItem : sysOrderItems) { 
 | 
            //只有家居产品支持消费退款 
 | 
            if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(orderItem.getType())) { 
 | 
                RefundOrderItemVo refundOrderItemVo = new RefundOrderItemVo(); 
 | 
  
 | 
                //同属性赋值 
 | 
                BeanUtils.copyProperties(orderItem, refundOrderItemVo); 
 | 
                refundOrderItemVo.setMaxCount(orderItem.getCount()); 
 | 
                refundOrderItemVo.setGoodsName(orderItem.getShoppingGoods().getName()); 
 | 
                refundOrderItemVo.setBusId(orderItem.getGoodsId()); 
 | 
                refundOrderItemVo.setRefundType(RefundOrderItemVo.REFUND_TYPE_GOODS); 
 | 
  
 | 
                if (orderItem.getCardPay() != null && orderItem.getPayMethodDetail() != null) { 
 | 
                    //查询付款的卡项 
 | 
                    MoneyCardUse moneyCardUse = cardUseService.findById(Long.parseLong(orderItem.getPayMethodDetail())); 
 | 
                    refundOrderItemVo.setCardId(moneyCardUse.getId()); 
 | 
                    refundOrderItemVo.setCardName(moneyCardUse.getCardName() + "-余:" + moneyCardUse.getMoney()); 
 | 
                } 
 | 
                refundOrderItemVoList.add(refundOrderItemVo); 
 | 
            } 
 | 
        } 
 | 
        if (CollectionUtils.isEmpty(refundOrderItemVoList)) { 
 | 
            return new AjaxResult(AjaxResult.STATUS_FAIL, "该订单中不存在家居产品"); 
 | 
        } else { 
 | 
            return new AjaxResult(AjaxResult.STATUS_SUCCESS, refundOrderItemVoList); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |