package com.dy.pipIrrWechat.virtualCard; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper; import com.dy.pipIrrGlobal.daoSe.*; import com.dy.pipIrrGlobal.pojoIr.IrPlanOperate; import com.dy.pipIrrGlobal.pojoPr.PrIntakeVc; import com.dy.pipIrrGlobal.pojoSe.*; import com.dy.pipIrrGlobal.voPr.VoIntakeSimple; import com.dy.pipIrrGlobal.voSe.VoOrders; import com.dy.pipIrrGlobal.voSe.VoRechargeProfile; import com.dy.pipIrrGlobal.voSe.VoVcRecharge; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrWechat.irrigatePlan.enums.OperateTypeENUM; import com.dy.pipIrrWechat.result.WechatResultCode; import com.dy.pipIrrWechat.virtualCard.dto.DtoRegist; import com.dy.pipIrrWechat.virtualCard.dto.DtoVirtualCard; import com.dy.pipIrrWechat.virtualCard.enums.LastOperateENUM; import com.dy.pipIrrWechat.virtualCard.enums.OrderStateENUM; import com.dy.pipIrrWechat.virtualCard.qo.QoVcRecharge; 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.*; /** * @author ZhuBaoMin * @date 2024-07-15 9:39 * @LastEditTime 2024-07-15 9:39 * @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; @Autowired private SeVcOperateMapper seVcOperateMapper; @Autowired private SeRechargeProfileMapper seRechargeProfileMapper; @Autowired private PrIntakeMapper prIntakeMapper; @Autowired private PrIntakeVcMapper prIntakeVcMapper; @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 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(); } /** * 根据农户ID及虚拟卡ID获取正常状态的虚拟卡对象 * * @param clientId * @param vcId * @return */ public SeVirtualCard getVcByClientIdAndVcId(Long clientId, Long vcId) { return seVirtualCardMapper.getVcByClientIdAndVcId(clientId, vcId); } /** * 根据虚拟卡ID注销虚拟卡 * * @param clientId * @param vcId * @return */ public Integer cancelVc(Long clientId, Long vcId) { return seVirtualCardMapper.cancelVc(clientId, vcId); } /** * 根据行政区划串模糊查询虚拟卡编号,注册虚拟卡使用 * * @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 -1:虚拟卡不存在,0:添加充值记录失败 */ //public BaseResponse insertVCRecharge(DtoVirtualCard po) { public Long 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 -1L; } 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()); seVcRechargeMapper.insert(seVcRecharge); Long rechargeId = seVcRecharge.getId(); if (rechargeId == null) { return 0L; } return rechargeId; } /** * 根据订单号获取虚拟卡充值对象 * * @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(WechatResultCode.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(WechatResultCode.RECHARGE_FAIL.getMessage()); } SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); if (seVirtualCard == null) { return BaseResponseUtils.buildFail(WechatResultCode.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(WechatResultCode.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 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> getVcRechargeRecords(QoVcRecharge 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; } /** * 添加虚拟卡操作记录 * * @param po * @return */ public Long insertVcOperate(SeVcOperate po) { seVcOperateMapper.insert(po); return po.getId(); } /** * 获取虚拟卡常用充值金额配置 * * @return */ public List gerRechargeProfiles() { return seRechargeProfileMapper.gerRechargeProfiles(); } /** * 注册虚拟卡 * * @param clientId * @return */ public Map addVC(Long clientId, Double money) { // 获取5级行政区划串areaCode Long areaCodeL = getAreaCodeById(clientId); if (areaCodeL == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.AREA_CODE_MISTAKE.getMessage()); map.put("content", null); return map; } String areaCode = String.valueOf(areaCodeL); /** * 根据行政区划串(areaCode)在虚拟卡表中针对虚拟卡编号(vcNum)进行模糊查询 * 如果5位顺序号已经达到最大值,提示用户联系系统管理员 * 如果5位顺序号未达到最大值,则加1 * cardNum为新的卡号 */ String vcNum = Optional.ofNullable(getVcCardNumOfMax(areaCode)).orElse(""); if (vcNum != null && vcNum.trim().length() > 0) { Integer number = Integer.parseInt(vcNum.substring(12)); number = number + 1; if (number > 65535) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.CARD_NUMBER_OVERRUN.getMessage()); map.put("content", null); return map; } vcNum = vcNum.substring(0, 12) + String.format("%05d", number); } else { vcNum = areaCode + "00001"; } // 生成虚拟卡记录 SeVirtualCard seVirtualCard = new SeVirtualCard(); seVirtualCard.setVcNum(Long.parseLong(vcNum)); seVirtualCard.setClientId(clientId); seVirtualCard.setMoney(money); seVirtualCard.setState((byte) 1); seVirtualCard.setLastOperate(LastOperateENUM.OPEN_ACCOUNT.getCode()); seVirtualCard.setLastOperateTime(new Date()); seVirtualCard.setInUse((byte) 0); seVirtualCard.setCreateTime(new Date()); Long vcId = insertVirtualCard(seVirtualCard); if (vcId == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.VC_OPEN_ACCOUNT_FAIL.getMessage()); map.put("content", null); return map; } // 生成虚拟卡操作记录,注册虚拟卡操作人为农户 SeVcOperate seVcOperate = new SeVcOperate(); seVcOperate.setVcId(vcId); seVcOperate.setClientId(clientId); seVcOperate.setOperateType(LastOperateENUM.OPEN_ACCOUNT.getCode()); seVcOperate.setOperator(clientId); seVcOperate.setOperateTime(new Date()); Long vcOperateId = insertVcOperate(seVcOperate); if (vcOperateId == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", WechatResultCode.VC_OPEN_ACCOUNT_FAIL.getMessage()); map.put("content", null); return map; } Map map = new HashMap<>(); map.put("success", true); map.put("msg", "虚拟卡注册成功"); map.put("content", vcId); return map; } /** * 获取未绑定虚拟卡的取水口列表,给取水口绑虚拟卡使用 * * @return */ public Map linkVcToIntake(Long clientId) { // 验证是否存在取水口未绑虚拟卡 List list = prIntakeMapper.getNotLinkVcIntakes(); if (list == null || list.size() == 0) { Map map = new HashMap<>(); map.put("success", true); map.put("msg", "所有取水口都匹配了虚拟卡"); map.put("content", null); return map; } // 遍历所有未绑虚拟卡的取水口 for (VoIntakeSimple voIntakeSimple : list) { Long intakeId = voIntakeSimple.getIntakeId(); // 创建虚拟卡 Map map_result = addVC(clientId, 100000D); if (map_result.get("success").equals(false)) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "灌虚拟卡注册失败"); map.put("content", null); return map; } Long vcId = (Long) map_result.get("content"); // 取水口绑虚拟卡 PrIntakeVc intakeVc = new PrIntakeVc(); intakeVc.setIntakeId(intakeId); intakeVc.setVcId(vcId); Integer result = prIntakeVcMapper.insert(intakeVc); if (result == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "取水口绑虚拟卡失败"); map.put("content", null); return map; } } Map map = new HashMap<>(); map.put("success", true); map.put("msg", "取水口绑虚拟卡成功"); map.put("content", null); return map; } }