| | |
| | | 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 org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | |
| | | @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级行政区划代码 |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 获取农户全部虚拟卡 |
| | | * |
| | | * @return |
| | | */ |
| | | public List<VoVirtualCard> getVCs(Long clientId) { |
| | |
| | | |
| | | /** |
| | | * 根据虚拟卡ID获取虚拟卡对象 |
| | | * |
| | | * @param vcId |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 注册虚拟卡 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据农户ID及虚拟卡ID获取正常状态的虚拟卡对象 |
| | | * |
| | | * @param clientId |
| | | * @param vcId |
| | | * @return |
| | | */ |
| | | public SeVirtualCard getVcByClientIdAndVcId (Long clientId, Long vcId) { |
| | | public SeVirtualCard getVcByClientIdAndVcId(Long clientId, Long vcId) { |
| | | return seVirtualCardMapper.getVcByClientIdAndVcId(clientId, vcId); |
| | | } |
| | | |
| | | /** |
| | | * 根据虚拟卡ID注销虚拟卡 |
| | | * |
| | | * @param clientId |
| | | * @param vcId |
| | | * @return |
| | |
| | | |
| | | /** |
| | | * 根据行政区划串模糊查询虚拟卡编号,注册虚拟卡使用 |
| | | * |
| | | * @param areaCode |
| | | * @return |
| | | */ |
| | |
| | | /** |
| | | * 修改虚拟卡 |
| | | * 充值、消费、申请退款、审核退款时需要修改虚拟卡的:余额、最后操作、最后操作时间 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据虚拟卡编号获取虚拟卡对象 |
| | | * |
| | | * @param virtualId |
| | | * @return |
| | | */ |
| | |
| | | /** |
| | | * 添加虚拟卡充值记录 |
| | | * JSAPI下单后生成部分充值记录 |
| | | * |
| | | * @param po |
| | | * @return -1:虚拟卡不存在,0:添加充值记录失败 |
| | | */ |
| | |
| | | String orderNumber = po.getOrderNumber(); |
| | | Long virtualId = po.getVirtualId(); |
| | | Long clientId = po.getClientId(); |
| | | Integer rechargeAmount = po.getRechargeAmount(); |
| | | Double rechargeAmount = po.getRechargeAmount(); |
| | | |
| | | // 验证该虚拟卡账户是否存在并取出当前账户余额 |
| | | SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); |
| | | |
| | | if(seVirtualCard == null) { |
| | | if (seVirtualCard == null) { |
| | | return -1L; |
| | | } |
| | | Double money = seVirtualCard.getMoney(); |
| | |
| | | seVcRecharge.setOrderState(OrderStateENUM.NON_PAYMENT.getCode()); |
| | | seVcRechargeMapper.insert(seVcRecharge); |
| | | Long rechargeId = seVcRecharge.getId(); |
| | | if(rechargeId == null) { |
| | | if (rechargeId == null) { |
| | | return 0L; |
| | | } |
| | | return rechargeId; |
| | |
| | | |
| | | /** |
| | | * 根据订单号获取虚拟卡充值对象 |
| | | * |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | |
| | | /** |
| | | * 修改虚拟卡充值记录 |
| | | * 微信支付通知后: |
| | | * 1. 更新充值表:充值后余额、支付完成时间、订单状态 |
| | | * 2. 更新虚拟卡表:账户余额、最后操作、最后操作时间 |
| | | * 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) { |
| | | if (seVcRecharge == null) { |
| | | return BaseResponseUtils.buildFail(WechatResultCode.RECHARGE_NOT_EXIST.getMessage()); |
| | | } |
| | | |
| | | Long virtualId = seVcRecharge.getVcId(); |
| | | Double money = seVcRecharge.getMoney(); |
| | | Integer rechargeAmount = seVcRecharge.getRechargeAmount(); |
| | | 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) { |
| | | if (rec == null) { |
| | | return BaseResponseUtils.buildFail(WechatResultCode.RECHARGE_FAIL.getMessage()); |
| | | } |
| | | |
| | | SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId); |
| | | if(seVirtualCard == null) { |
| | | 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) { |
| | | if (rec2 == null) { |
| | | return BaseResponseUtils.buildFail(WechatResultCode.RECHARGE_FAIL.getMessage()); |
| | | } |
| | | return BaseResponseUtils.buildSuccess(true) ; |
| | | return BaseResponseUtils.buildSuccess(true); |
| | | } |
| | | |
| | | /** |
| | | * 修改虚拟卡充值记录(废弃) |
| | | * 微信小程序支付通知后修改:余额、充值后余额、充值完成时间 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据虚拟卡号获取订单列表 |
| | | * |
| | | * @param virtualId |
| | | * @return |
| | | */ |
| | | public List<VoOrders> selectOrders(Long virtualId) { |
| | | List<VoOrders> rsVo = seVcRechargeMapper.getOrders(virtualId); |
| | | return rsVo ; |
| | | return rsVo; |
| | | } |
| | | |
| | | /** |
| | | * 根据退款ID获取退款对象 |
| | | * |
| | | * @param refundId |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 添加退款申请 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 修改退款记录 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据订单号获取其各笔退款金额 |
| | | * |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 添加退款分项 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 编辑退款分项 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据订单号生成退款单号 |
| | | * |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | | public String generateRefundNumber(String orderNumber) { |
| | | String refundNumber = seVcRefundItemMapper.getLastRefundNumber(orderNumber); |
| | | if(refundNumber == null) { |
| | | if (refundNumber == null) { |
| | | refundNumber = orderNumber + "01"; |
| | | return refundNumber; |
| | | } |
| | | |
| | | String a = String.format("%02d", (Integer.parseInt(refundNumber.substring(29,30).trim()) + 1)); |
| | | return a; |
| | | String a = String.format("%02d", (Integer.parseInt(refundNumber.substring(29, 30).trim()) + 1)); |
| | | return a; |
| | | } |
| | | |
| | | /** |
| | | * 根据订单号获取充值金额,调用退款申请接口使用 |
| | | * |
| | | * @param orderNumber |
| | | * @return |
| | | */ |
| | | public Integer getRechargeAmountByOrderNumber(String orderNumber) { |
| | | public Double getRechargeAmountByOrderNumber(String orderNumber) { |
| | | return seVcRechargeMapper.getRechargeAmountByOrderNumber(orderNumber); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 根据退款通知接口返回的退款单号反查退款ID,查询该退款ID下未退款记录数量 |
| | | * |
| | | * @param refundNumber |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据退款单号获取退款ID,退款通知后更新退款表所需 |
| | | * |
| | | * @param refundNumber |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 获取虚拟卡充值记录 |
| | | * |
| | | * @param dtoVcRecharge |
| | | * @return |
| | | */ |
| | | public QueryResultVo<List<VoVcRecharge>> getVcRechargeRecords(QoVcRecharge dtoVcRecharge){ |
| | | public QueryResultVo<List<VoVcRecharge>> getVcRechargeRecords(QoVcRecharge dtoVcRecharge) { |
| | | Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(dtoVcRecharge); |
| | | Long itemTotal = seVirtualCardMapper.getRechargeRecordCount(params); |
| | | |
| | |
| | | |
| | | /** |
| | | * 添加虚拟卡操作记录 |
| | | * |
| | | * @param po |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 获取虚拟卡常用充值金额配置 |
| | | * |
| | | * @return |
| | | */ |
| | | public List<VoRechargeProfile> 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<VoIntakeSimple> 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; |
| | | } |
| | | } |