| 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); | 
|         } | 
|     } | 
|   | 
|   | 
| } |