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.voPr.VoController; 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.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; /** * 根据农户ID获取5级行政区划代码,注册虚拟卡使用 * @param clientId 农户ID * @return 5级行政区划代码 */ public Long getAreaCodeById(Long clientId) { return seClientMapper.getAreaCodeById(clientId); } /** * 获取农户全部虚拟卡 * @return */ public List getVCs(Long clientId) { return seVirtualCardMapper.getVCs(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 insertVCRecharge(DtoVirtualCard po) { String orderNumber = po.getOrderNumber(); Long virtualId = po.getVirtualId(); Long clientId = po.getClientId(); Integer 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 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(); Integer 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 selectOrders(Long virtualId) { List 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 selectRefundAmount(String orderNumber) { List 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 Integer 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> getVcRechargeRecords(DtoVcRecharge dtoVcRecharge){ Map params = (Map) PojoUtils.generalize(dtoVcRecharge); Long itemTotal = seVirtualCardMapper.getRechargeRecordCount(params); QueryResultVo> rsVo = new QueryResultVo<>(); rsVo.pageSize = dtoVcRecharge.pageSize; rsVo.pageCurr = dtoVcRecharge.pageCurr; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = seVirtualCardMapper.getVcRechargeRecords(params); return rsVo; } }