|  |  | 
 |  |  | package com.dy.pipIrrTerminal.card; | 
 |  |  |  | 
 |  |  | import com.dy.common.webUtil.BaseResponseUtils; | 
 |  |  | import com.dy.common.webUtil.QueryResultVo; | 
 |  |  | import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; | 
 |  |  | import com.dy.pipIrrGlobal.daoSe.*; | 
 |  |  | import com.dy.pipIrrGlobal.pojoSe.SeCardOperate; | 
 |  |  | import com.dy.pipIrrGlobal.pojoSe.SeClientCard; | 
 |  |  | import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory; | 
 |  |  | import com.dy.pipIrrGlobal.voSe.VoAfterRecharge; | 
 |  |  | import com.dy.pipIrrGlobal.voSe.VoTermActiveCard; | 
 |  |  | import com.dy.pipIrrGlobal.voSe.VoTermCard; | 
 |  |  | import com.dy.pipIrrGlobal.voSe.VoTermCommon; | 
 |  |  | import com.dy.pipIrrGlobal.voSe.*; | 
 |  |  | import com.dy.pipIrrTerminal.card.dto.*; | 
 |  |  | import com.dy.pipIrrTerminal.card.qo.QoCards; | 
 |  |  | import com.dy.pipIrrTerminal.card.qo.QoLostCards; | 
 |  |  | import com.dy.pipIrrTerminal.card.enums.CardStateENUM; | 
 |  |  | import com.dy.pipIrrTerminal.card.enums.LastOperateENUM; | 
 |  |  | import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM; | 
 |  |  | import com.dy.pipIrrTerminal.card.enums.RechargeTypeENUM; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.dubbo.common.utils.PojoUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Map canCancel(DtoCancel po) { | 
 |  |  |         Map map = new HashMap<>(); | 
 |  |  |         map.put("success", false); | 
 |  |  |         map.put("content", null); | 
 |  |  |  | 
 |  |  |         Long cardNum = po.getCardNum(); | 
 |  |  |         String stateName = seClientCardMapper.getCardStateByCardNum(cardNum); | 
 |  |  |         if(stateName == null || stateName.equals("") || !stateName.equals("正常")) { | 
 |  |  |             map.put("msg", stateName + ", " + "水卡状态不支持当前操作"); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 依据水卡编号获取水卡表主键及农户编号 | 
 |  |  |          */ | 
 |  |  |         Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap()); | 
 |  |  |         if (map_card == null || map_card.size() <= 0) { | 
 |  |  |             map.put("msg", "卡号错误,该卡不存在"); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |         CardSimple card = new CardSimple(); | 
 |  |  |         card.setCardId(Long.parseLong(map_card.get("cardId").toString())); | 
 |  |  |         card.setClientId(Long.parseLong(map_card.get("clientId").toString())); | 
 |  |  |  | 
 |  |  |         map.put("success", true); | 
 |  |  |         map.put("content", card); | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 根据水卡编号判断该卡是否可以补扣 | 
 |  |  |      * @param po | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Map canRepay(DtoRepaySupplement po) { | 
 |  |  |         Map map = new HashMap<>(); | 
 |  |  |         map.put("success", false); | 
 |  |  |         map.put("content", null); | 
 |  |  |  | 
 |  |  |         Long cardNum = po.getCardNum(); | 
 |  |  |         String stateName = seClientCardMapper.getCardStateByCardNum(cardNum); | 
 |  |  |         if(stateName == null || stateName.equals("") || !stateName.equals("正常")) { | 
 |  |  |             map.put("msg", stateName + ", " + "水卡状态不支持当前操作"); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 依据水卡编号获取水卡表主键及农户编号 | 
 |  |  |          */ | 
 |  |  |         Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap()); | 
 |  |  |         if (map_card == null || map_card.size() <= 0) { | 
 |  |  |             map.put("msg", "卡号错误,该卡不存在"); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |         CardSimple card = new CardSimple(); | 
 |  |  |         card.setCardId(Long.parseLong(map_card.get("cardId").toString())); | 
 |  |  |         card.setClientId(Long.parseLong(map_card.get("clientId").toString())); | 
 |  |  |  | 
 |  |  |         map.put("success", true); | 
 |  |  |         map.put("content", card); | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 根据水卡编号判断该卡是否可以返还 | 
 |  |  |      * @param po | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Map canSupplement(DtoRepaySupplement po) { | 
 |  |  |         Map map = new HashMap<>(); | 
 |  |  |         map.put("success", false); | 
 |  |  |         map.put("content", null); | 
 |  |  | 
 |  |  |         voTermRecharge.setProjectNo(projectNo); | 
 |  |  |         voTermRecharge.setCardNum(po.getCardNum()); | 
 |  |  |         voTermRecharge.setOrderNo(orderNo); | 
 |  |  |         voTermRecharge.setBalance(afterRecharge); | 
 |  |  |  | 
 |  |  |         map.put("success", true); | 
 |  |  |         map.put("msg", "操作成功"); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 补扣 | 
 |  |  |      * @param po | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public Map repay(DtoRepaySupplement po) { | 
 |  |  |         Map map = new HashMap<>(); | 
 |  |  |         map.put("success", false); | 
 |  |  |         map.put("content", null); | 
 |  |  |         String orderNo = generateOrderNo(); | 
 |  |  |         Date operateTime = new Date(); | 
 |  |  |         Double waterPrice = Optional.ofNullable(prWaterPriceMapper.getPrice()).orElse(0.0); | 
 |  |  |  | 
 |  |  |         Map map_canRepay  = canRepay(po); | 
 |  |  |         if(map_canRepay.get("success").equals(false)) { | 
 |  |  |             map.put("msg", map_canRepay.get("msg").toString()); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |         CardSimple card = (CardSimple) map_canRepay.get("content"); | 
 |  |  |         Long cardId = card.getCardId(); | 
 |  |  |         Long clientId = card.getClientId(); | 
 |  |  |  | 
 |  |  |         SeCardOperate seCardOperate = new SeCardOperate(); | 
 |  |  |         seCardOperate.setCardId(cardId); | 
 |  |  |         seCardOperate.setClientId(clientId); | 
 |  |  |         seCardOperate.setMoney(po.getBalance()); | 
 |  |  |         seCardOperate.setRefundAmount(po.getRepayMorny()); | 
 |  |  |         seCardOperate.setOperateType(OperateTypeENUM.REFUND.getCode()); | 
 |  |  |         seCardOperate.setRemarks(po.getRemarks()); | 
 |  |  |         seCardOperate.setOperator(po.getOperator()); | 
 |  |  |         seCardOperate.setOperateDt(operateTime); | 
 |  |  |         seCardOperate.setOrderNo(orderNo); | 
 |  |  |         seCardOperate.setOperateValid((byte) 1); | 
 |  |  |         seCardOperateMapper.insert(seCardOperate); | 
 |  |  |         if (seCardOperate.getId() == 0) { | 
 |  |  |             map.put("msg", "补扣失败-补扣记录写入异常"); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         VoRepaySupplement voRepaySupplement = new VoRepaySupplement(); | 
 |  |  |         voRepaySupplement.setBalance(po.getBalance() - po.getRepayMorny()); | 
 |  |  |         voRepaySupplement.setWaterPrice(waterPrice); | 
 |  |  |         voRepaySupplement.setTime(operateTime); | 
 |  |  |         voRepaySupplement.setOrderNo(orderNo); | 
 |  |  |  | 
 |  |  |         map.put("success", true); | 
 |  |  |         map.put("msg", "操作成功"); | 
 |  |  |         map.put("content", voRepaySupplement); | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 返还 | 
 |  |  |      * @param po | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public Map supplement(DtoRepaySupplement po) { | 
 |  |  |         Map map = new HashMap<>(); | 
 |  |  |         map.put("success", false); | 
 |  |  |         map.put("content", null); | 
 |  |  |         String orderNo = generateOrderNo(); | 
 |  |  |         Date operateTime = new Date(); | 
 |  |  |         Double waterPrice = Optional.ofNullable(prWaterPriceMapper.getPrice()).orElse(0.0); | 
 |  |  |  | 
 |  |  |         Map map_canSupplement  = canSupplement(po); | 
 |  |  |         if(map_canSupplement.get("success").equals(false)) { | 
 |  |  |             map.put("msg", map_canSupplement.get("msg").toString()); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |         CardSimple card = (CardSimple) map_canSupplement.get("content"); | 
 |  |  |         Long cardId = card.getCardId(); | 
 |  |  |         Long clientId = card.getClientId(); | 
 |  |  |  | 
 |  |  |         SeCardOperate seCardOperate = new SeCardOperate(); | 
 |  |  |         seCardOperate.setCardId(cardId); | 
 |  |  |         seCardOperate.setClientId(clientId); | 
 |  |  |         seCardOperate.setMoney(po.getBalance()); | 
 |  |  |         seCardOperate.setRefundAmount(po.getSupplementMoney()); | 
 |  |  |         seCardOperate.setOperateType(OperateTypeENUM.WRITE_BACK.getCode()); | 
 |  |  |         seCardOperate.setRemarks(po.getRemarks()); | 
 |  |  |         seCardOperate.setOperator(po.getOperator()); | 
 |  |  |         seCardOperate.setOperateDt(operateTime); | 
 |  |  |         seCardOperate.setOrderNo(orderNo); | 
 |  |  |         seCardOperate.setOperateValid((byte) 1); | 
 |  |  |         seCardOperateMapper.insert(seCardOperate); | 
 |  |  |         if (seCardOperate.getId() == 0) { | 
 |  |  |             map.put("msg", "返还失败-返还记录写入异常"); | 
 |  |  |             return map; | 
 |  |  |         } | 
 |  |  |         VoRepaySupplement voRepaySupplement = new VoRepaySupplement(); | 
 |  |  |         voRepaySupplement.setBalance(po.getBalance() + po.getSupplementMoney()); | 
 |  |  |         voRepaySupplement.setWaterPrice(waterPrice); | 
 |  |  |         voRepaySupplement.setTime(operateTime); | 
 |  |  |         voRepaySupplement.setOrderNo(orderNo); | 
 |  |  |  | 
 |  |  |         map.put("success", true); | 
 |  |  |         map.put("msg", "操作成功"); | 
 |  |  |         map.put("content", voRepaySupplement); | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 操作回调 | 
 |  |  |      * @param po | 
 |  |  |      * @return | 
 |  |  | 
 |  |  |                 map.put("msg", "补卡回调失败"); | 
 |  |  |                 return map; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } else if (operateType == 5) { | 
 |  |  |             /** | 
 |  |  |              * 补扣操作执行通知 | 
 |  |  |              * 1. 操作记录改为有效 | 
 |  |  |              * 2. 修改水卡表操作信息及余额 | 
 |  |  |              */ | 
 |  |  |             Integer rec_ope = turnOperateValidByOrderNumber(orderNumber); | 
 |  |  |             Integer rec_card = updateCardInfo_repay(cardId, orderNumber); | 
 |  |  |             if (rec_ope == 0 || rec_card == 0) { | 
 |  |  |                 map.put("msg", "补扣回调失败"); | 
 |  |  |                 return map; | 
 |  |  |             } | 
 |  |  |         } else if (operateType == 6) { | 
 |  |  |             /** | 
 |  |  |              * 返还操作执行通知 | 
 |  |  |              * 1. 操作记录改为有效 | 
 |  |  |              * 2. 修改水卡表操作信息及余额 | 
 |  |  |              */ | 
 |  |  |             Integer rec_ope = turnOperateValidByOrderNumber(orderNumber); | 
 |  |  |             Integer rec_card = updateCardInfo_supplement(cardId, orderNumber); | 
 |  |  |             if (rec_ope == 0 || rec_card == 0) { | 
 |  |  |                 map.put("msg", "返还回调失败"); | 
 |  |  |                 return map; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         map.put("success", true); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 修改补扣水卡表记录及余额 | 
 |  |  |      * @param cardId | 
 |  |  |      * @param orderNumber | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Integer updateCardInfo_repay(Long cardId, String orderNumber) { | 
 |  |  |         VoRepaySupplementSimple po = seCardOperateMapper.getCardOperateByOrderNumber(orderNumber); | 
 |  |  |         Float money = Optional.ofNullable(po.getMoney()).orElse(0f); | 
 |  |  |         Float refundAmount = Optional.ofNullable(po.getRefundAmount()).orElse(0f); | 
 |  |  |         Date operateTime = po.getOperateTime(); | 
 |  |  |  | 
 |  |  |         SeClientCard clientCard = new SeClientCard(); | 
 |  |  |         clientCard.setId(cardId); | 
 |  |  |         clientCard.setRefunddt(operateTime); | 
 |  |  |         clientCard.setMoney(money - refundAmount); | 
 |  |  |         clientCard.setState(CardStateENUM.NORMAL.getCode()); | 
 |  |  |         clientCard.setLastoper(LastOperateENUM.REFUND.getCode()); | 
 |  |  |         return seClientCardMapper.updateByPrimaryKeySelective(clientCard); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 修改返还水卡表记录及余额 | 
 |  |  |      * @param cardId | 
 |  |  |      * @param orderNumber | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public Integer updateCardInfo_supplement(Long cardId, String orderNumber) { | 
 |  |  |         VoRepaySupplementSimple po = seCardOperateMapper.getCardOperateByOrderNumber(orderNumber); | 
 |  |  |         Float money = Optional.ofNullable(po.getMoney()).orElse(0f); | 
 |  |  |         Float refundAmount = Optional.ofNullable(po.getRefundAmount()).orElse(0f); | 
 |  |  |         Date operateTime = po.getOperateTime(); | 
 |  |  |  | 
 |  |  |         SeClientCard clientCard = new SeClientCard(); | 
 |  |  |         clientCard.setId(cardId); | 
 |  |  |         clientCard.setRefunddt(operateTime); | 
 |  |  |         clientCard.setMoney(money + refundAmount); | 
 |  |  |         clientCard.setState(CardStateENUM.NORMAL.getCode()); | 
 |  |  |         clientCard.setLastoper(LastOperateENUM.WRITE_BACK.getCode()); | 
 |  |  |         return seClientCardMapper.updateByPrimaryKeySelective(clientCard); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 判断指定水卡是否为挂失状态且无补卡记录 | 
 |  |  |      * @param cardNum | 
 |  |  |      * @return | 
 |  |  | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 根据指定条件获取水卡列表 | 
 |  |  |      * @param vo 查询条件 | 
 |  |  |      * @return 水卡列表 | 
 |  |  |      */ | 
 |  |  |     public QueryResultVo<List<VoCards>> getCards(QoCards vo) { | 
 |  |  |         Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo); | 
 |  |  |         Long itemTotal = seClientCardMapper.getCardsCount(params); | 
 |  |  |  | 
 |  |  |         QueryResultVo<List<VoCards>> rsVo = new QueryResultVo<>(); | 
 |  |  |         rsVo.pageSize = vo.pageSize; | 
 |  |  |         rsVo.pageCurr = vo.pageCurr; | 
 |  |  |  | 
 |  |  |         if (itemTotal > 0) { | 
 |  |  |             rsVo.calculateAndSet(itemTotal, params); | 
 |  |  |             List<VoCards> list = seClientCardMapper.getCards(params); | 
 |  |  |             rsVo.obj = list; | 
 |  |  |         } else { | 
 |  |  |             rsVo.obj = new ArrayList<>(); | 
 |  |  |             rsVo.itemTotal = 0L; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return rsVo; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取已挂失的水卡列表 | 
 |  |  |      * @param vo 查询条件 | 
 |  |  |      * @return 已挂失的水卡列表 | 
 |  |  |      */ | 
 |  |  |     public QueryResultVo<List<VoCards>> getLostCards(QoLostCards vo) { | 
 |  |  |         Map<String, Object> params = new HashMap<>(); | 
 |  |  |         params.put("pageCurr", vo.pageCurr); | 
 |  |  |         params.put("pageSize", vo.pageSize); | 
 |  |  |         params.put("state", 2); // 挂失状态 | 
 |  |  |          | 
 |  |  |         Long itemTotal = seClientCardMapper.getLostCardsCount(params); | 
 |  |  |  | 
 |  |  |         QueryResultVo<List<VoCards>> rsVo = new QueryResultVo<>(); | 
 |  |  |         rsVo.pageSize = vo.pageSize; | 
 |  |  |         rsVo.pageCurr = vo.pageCurr; | 
 |  |  |  | 
 |  |  |         if (itemTotal > 0) { | 
 |  |  |             rsVo.calculateAndSet(itemTotal, params); | 
 |  |  |             List<VoCards> list = seClientCardMapper.getLostCards(params); | 
 |  |  |             rsVo.obj = list; | 
 |  |  |         } else { | 
 |  |  |             rsVo.obj = new ArrayList<>(); | 
 |  |  |             rsVo.itemTotal = 0L; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return rsVo; | 
 |  |  |     } | 
 |  |  | } |