| package com.dy.pipIrrSell.virtualCard; | 
|   | 
| import com.dy.common.webUtil.BaseResponse; | 
| import com.dy.common.webUtil.BaseResponseUtils; | 
| import com.dy.common.webUtil.QueryResultVo; | 
| import com.dy.pipIrrGlobal.daoSe.*; | 
| import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge; | 
| import com.dy.pipIrrGlobal.pojoSe.SeVcRefund; | 
| import com.dy.pipIrrGlobal.pojoSe.SeVcRefundItem; | 
| import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; | 
| import com.dy.pipIrrGlobal.voSe.VoOrders; | 
| import com.dy.pipIrrGlobal.voSe.VoVcRecharge; | 
| import com.dy.pipIrrGlobal.voSe.VoVirtualCard; | 
| import com.dy.pipIrrSell.result.SellResultCode; | 
| import com.dy.pipIrrSell.virtualCard.dto.DtoVcRecharge; | 
| import com.dy.pipIrrSell.virtualCard.dto.DtoVirtualCard; | 
| import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM; | 
| import com.dy.pipIrrSell.virtualCard.enums.OrderStateENUM; | 
| 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; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import java.util.Date; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
| /** | 
|  * @author ZhuBaoMin | 
|  * @date 2024-03-06 8:41 | 
|  * @LastEditTime 2024-03-06 8:41 | 
|  * @Description | 
|  */ | 
|   | 
| @Slf4j | 
| @Service | 
| public class VirtualCardSv { | 
|     @Autowired | 
|     private SeVirtualCardMapper seVirtualCardMapper; | 
|   | 
|     @Autowired | 
|     private SeVcRechargeMapper seVcRechargeMapper; | 
|   | 
|     @Autowired | 
|     private SeVcRefundMapper seVcRefundMapper; | 
|   | 
|     @Autowired | 
|     private SeVcRefundItemMapper seVcRefundItemMapper; | 
|   | 
|     @Autowired | 
|     private SeClientMapper seClientMapper; | 
|   | 
|     @Value("${vc.alarmValue}") | 
|     private Integer alarmValue; | 
|   | 
|     /** | 
|      * 根据农户ID获取5级行政区划代码,注册虚拟卡使用 | 
|      * @param clientId 农户ID | 
|      * @return 5级行政区划代码 | 
|      */ | 
|     public Long getAreaCodeById(Long clientId) { | 
|         return seClientMapper.getAreaCodeById(clientId); | 
|     } | 
|   | 
|     /** | 
|      * 获取农户全部虚拟卡 | 
|      * @return | 
|      */ | 
|     public List<VoVirtualCard> getVCs(Long clientId) { | 
|         return seVirtualCardMapper.getVCs(alarmValue, clientId); | 
|     } | 
|   | 
|     /** | 
|      * 根据虚拟卡ID获取虚拟卡对象 | 
|      * @param vcId | 
|      * @return | 
|      */ | 
|     public VoVirtualCard getVcById(Long vcId) { | 
|         return seVirtualCardMapper.getVcById(vcId); | 
|     } | 
|   | 
|     /** | 
|      * 注册虚拟卡 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Long insertVirtualCard(SeVirtualCard po) { | 
|         seVirtualCardMapper.insert(po); | 
|         return po.getId(); | 
|     } | 
|   | 
|     /** | 
|      * 根据行政区划串模糊查询虚拟卡编号,注册虚拟卡使用 | 
|      * @param areaCode | 
|      * @return | 
|      */ | 
|     String getVcCardNumOfMax(String areaCode) { | 
|         return seVirtualCardMapper.getVcCardNumOfMax(areaCode); | 
|     } | 
|   | 
|     /** 废弃 | 
|      * 验证农户是否拥有指定名称的虚拟卡 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     //public Integer getRecordCountByName(DtoRegist po) { | 
|     //    return seVirtualCardMapper.getRecordCountByName(po.getClientId(), po.getVcName()); | 
|     //} | 
|   | 
|     /** | 
|      * 修改虚拟卡 | 
|      * 充值、消费、申请退款、审核退款时需要修改虚拟卡的:余额、最后操作、最后操作时间 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Integer updateVirtualCard(SeVirtualCard po) { | 
|         return seVirtualCardMapper.updateByPrimaryKeySelective(po); | 
|     } | 
|   | 
|     /** | 
|      * 根据虚拟卡编号获取虚拟卡对象 | 
|      * @param virtualId | 
|      * @return | 
|      */ | 
|     public SeVirtualCard selectVirtuCardById(Long virtualId) { | 
|         return seVirtualCardMapper.selectByPrimaryKey(virtualId); | 
|     } | 
|   | 
|     /** | 
|      * 添加虚拟卡充值记录 | 
|      * JSAPI下单后生成部分充值记录 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public BaseResponse<Boolean> insertVCRecharge(DtoVirtualCard po) { | 
|         String orderNumber = po.getOrderNumber(); | 
|         Long virtualId = po.getVirtualId(); | 
|         Long clientId = po.getClientId(); | 
|         Double rechargeAmount = po.getRechargeAmount(); | 
|   | 
|         // 验证该虚拟卡账户是否存在并取出当前账户余额 | 
|         SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); | 
|         if(seVirtualCard == null) { | 
|             return BaseResponseUtils.buildFail(SellResultCode.NO_ACCOUNT.getMessage()); | 
|         } | 
|         Double money = seVirtualCard.getMoney(); | 
|   | 
|         // 添加充值记录 | 
|         SeVcRecharge seVcRecharge = new SeVcRecharge(); | 
|         seVcRecharge.setVcId(virtualId); | 
|         seVcRecharge.setClientId(clientId); | 
|         seVcRecharge.setMoney(money); | 
|         seVcRecharge.setOrderNumber(orderNumber); | 
|         seVcRecharge.setRechargeAmount(rechargeAmount); | 
|         seVcRecharge.setOrderTime(new Date()); | 
|         seVcRecharge.setOrderState(OrderStateENUM.NON_PAYMENT.getCode()); | 
|         Integer rec = seVcRechargeMapper.insert(seVcRecharge); | 
|         if(rec == null) { | 
|             return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage()); | 
|         } | 
|         return BaseResponseUtils.buildSuccess(true) ; | 
|     } | 
|   | 
|     /** | 
|      * 根据订单号获取虚拟卡充值对象 | 
|      * @param orderNumber | 
|      * @return | 
|      */ | 
|     public SeVcRecharge getVCRechargeByorderNumber(String orderNumber) { | 
|         return seVcRechargeMapper.getVCRechargeByorderNumber(orderNumber); | 
|     } | 
|   | 
|     /** | 
|      * 修改虚拟卡充值记录 | 
|      * 微信支付通知后: | 
|      *      1. 更新充值表:充值后余额、支付完成时间、订单状态 | 
|      *      2. 更新虚拟卡表:账户余额、最后操作、最后操作时间 | 
|      * @param orderNumber 订单编号 | 
|      * @return | 
|      */ | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public BaseResponse<Boolean> updateVCRecharge(String orderNumber, Date rechargeTime) { | 
|         SeVcRecharge seVcRecharge = seVcRechargeMapper.getVCRechargeByorderNumber(orderNumber); | 
|         if(seVcRecharge == null) { | 
|             return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_NOT_EXIST.getMessage()); | 
|         } | 
|   | 
|         Long virtualId = seVcRecharge.getVcId(); | 
|         Double money = seVcRecharge.getMoney(); | 
|         Double rechargeAmount = seVcRecharge.getRechargeAmount(); | 
|         Double afterRrecharge = money + rechargeAmount; | 
|   | 
|         seVcRecharge.setAfterRecharge(afterRrecharge); | 
|         seVcRecharge.setRechargeTime(rechargeTime); | 
|         seVcRecharge.setOrderState(OrderStateENUM.PAID.getCode()); | 
|         Integer rec = seVcRechargeMapper.updateByPrimaryKeySelective(seVcRecharge); | 
|         if(rec == null) { | 
|             return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage()); | 
|         } | 
|   | 
|         SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); | 
|         if(seVirtualCard == null) { | 
|             return BaseResponseUtils.buildFail(SellResultCode.VIRTUAL_CARD_NOT_EXIST.getMessage()); | 
|         } | 
|         seVirtualCard.setMoney(afterRrecharge); | 
|         seVirtualCard.setLastOperate(LastOperateENUM.RECHARGE.getCode()); | 
|         seVirtualCard.setLastOperateTime(new Date()); | 
|         Integer rec2 = seVirtualCardMapper.updateByPrimaryKeySelective(seVirtualCard); | 
|         if(rec2 == null) { | 
|             return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage()); | 
|         } | 
|         return BaseResponseUtils.buildSuccess(true) ; | 
|     } | 
|   | 
|     /** | 
|      * 修改虚拟卡充值记录(废弃) | 
|      * 微信小程序支付通知后修改:余额、充值后余额、充值完成时间 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Integer updateVCRecharge(SeVcRecharge po) { | 
|         return seVcRechargeMapper.updateByPrimaryKeySelective(po); | 
|     } | 
|   | 
|     /** | 
|      * 根据虚拟卡号获取订单列表 | 
|      * @param virtualId | 
|      * @return | 
|      */ | 
|     public List<VoOrders> selectOrders(Long virtualId) { | 
|         List<VoOrders> rsVo = seVcRechargeMapper.getOrders(virtualId); | 
|         return rsVo ; | 
|     } | 
|   | 
|     /** | 
|      * 根据退款ID获取退款对象 | 
|      * @param refundId | 
|      * @return | 
|      */ | 
|     public SeVcRefund selectRefundByRefundId(Long refundId) { | 
|         return seVcRefundMapper.selectByPrimaryKey(refundId); | 
|     } | 
|   | 
|     /** | 
|      * 添加退款申请 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Long addRefund(SeVcRefund po) { | 
|         seVcRefundMapper.insert(po); | 
|         return po.getId(); | 
|     } | 
|   | 
|     /** | 
|      * 修改退款记录 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Integer updateRefund(SeVcRefund po) { | 
|         return seVcRefundMapper.updateByPrimaryKeySelective(po); | 
|     } | 
|   | 
|     /** | 
|      * 根据订单号获取其各笔退款金额 | 
|      * @param orderNumber | 
|      * @return | 
|      */ | 
|     public List<Integer> selectRefundAmount(String orderNumber) { | 
|         List<Integer> rsVo = seVcRefundMapper.getRefundAmount(orderNumber); | 
|         return rsVo; | 
|     } | 
|   | 
|     /** | 
|      * 添加退款分项 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Long addRefundItem(SeVcRefundItem po) { | 
|         seVcRefundItemMapper.insert(po); | 
|         return po.getRefundId(); | 
|     } | 
|   | 
|     /** | 
|      * 编辑退款分项 | 
|      * @param po | 
|      * @return | 
|      */ | 
|     public Integer updateRefundItem(SeVcRefundItem po) { | 
|         return seVcRefundItemMapper.updateByPrimaryKeySelective(po); | 
|     } | 
|   | 
|     /** | 
|      * 根据订单号生成退款单号 | 
|      * @param orderNumber | 
|      * @return | 
|      */ | 
|     public String generateRefundNumber(String orderNumber) { | 
|         String refundNumber = seVcRefundItemMapper.getLastRefundNumber(orderNumber); | 
|         if(refundNumber == null) { | 
|             refundNumber = orderNumber + "01"; | 
|             return refundNumber; | 
|         } | 
|   | 
|         String a = String.format("%02d", (Integer.parseInt(refundNumber.substring(29,30).trim()) + 1)); | 
|         return  a; | 
|     } | 
|   | 
|     /** | 
|      * 根据订单号获取充值金额,调用退款申请接口使用 | 
|      * @param orderNumber | 
|      * @return | 
|      */ | 
|     public Double getRechargeAmountByOrderNumber(String orderNumber) { | 
|         return seVcRechargeMapper.getRechargeAmountByOrderNumber(orderNumber); | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 根据退款通知接口返回的退款单号反查退款ID,查询该退款ID下未退款记录数量 | 
|      * @param refundNumber | 
|      * @return | 
|      */ | 
|     public Integer getNoRefundedCount(String refundNumber) { | 
|         return seVcRefundItemMapper.getNoRefundedCount(refundNumber); | 
|     } | 
|   | 
|     /** | 
|      * 根据退款单号获取退款ID,退款通知后更新退款表所需 | 
|      * @param refundNumber | 
|      * @return | 
|      */ | 
|     public Long getRefundIdByRefundNumber(String refundNumber) { | 
|         return seVcRefundItemMapper.getRefundIdByRefundNumber(refundNumber); | 
|     } | 
|   | 
|     /** | 
|      * 获取虚拟卡充值记录 | 
|      * @param dtoVcRecharge | 
|      * @return | 
|      */ | 
|     public QueryResultVo<List<VoVcRecharge>> getVcRechargeRecords(DtoVcRecharge dtoVcRecharge){ | 
|         Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(dtoVcRecharge); | 
|         Long itemTotal = seVirtualCardMapper.getRechargeRecordCount(params); | 
|   | 
|         QueryResultVo<List<VoVcRecharge>> rsVo = new QueryResultVo<>(); | 
|         rsVo.pageSize = dtoVcRecharge.pageSize; | 
|         rsVo.pageCurr = dtoVcRecharge.pageCurr; | 
|   | 
|         rsVo.calculateAndSet(itemTotal, params); | 
|         rsVo.obj = seVirtualCardMapper.getVcRechargeRecords(params); | 
|   | 
|         return rsVo; | 
|     } | 
| } |