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.pojoSe.SeVcOperate; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voIr.VoPlanDetails; import com.dy.pipIrrGlobal.voSe.VoRechargeProfile; import com.dy.pipIrrGlobal.voSe.VoVcRecharge; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrWechat.result.WechatResultCode; import com.dy.pipIrrWechat.util.PayHelper; import com.dy.pipIrrWechat.virtualCard.dto.Client; import com.dy.pipIrrWechat.virtualCard.dto.DtoCancel; import com.dy.pipIrrWechat.virtualCard.dto.DtoRegist; import com.dy.pipIrrWechat.virtualCard.enums.LastOperateENUM; import com.dy.pipIrrWechat.virtualCard.qo.QoVcRecharge; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.*; /** * @author ZhuBaoMin * @date 2024-07-15 9:55 * @LastEditTime 2024-07-15 9:55 * @Description */ @Slf4j @Tag(name = "虚拟卡管理", description = "虚拟卡管理") @RestController @RequestMapping(path="virtual_card") @RequiredArgsConstructor @Validated public class VirtualCardCtrl { private final VirtualCardSv virtualCardSv; private final PayHelper payHelper; /** * 注册虚拟卡 * @param po * @param bindingResult * @return */ @PostMapping(path = "add_vc") @Transactional(rollbackFor = Exception.class) public BaseResponse addVC(@RequestBody @Valid DtoRegist po, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Map map_result = virtualCardSv.addVC(po.getClientId(), 0D); if(map_result.get("success").equals(false)) { return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString()); } return BaseResponseUtils.buildSuccess() ; //Long clientId = po.getClientId(); // //// 获取5级行政区划串areaCode //Long areaCodeL = virtualCardSv.getAreaCodeById(clientId); //if(areaCodeL == null) { // return BaseResponseUtils.buildErrorMsg(WechatResultCode.AREA_CODE_MISTAKE.getMessage()); //} //String areaCode = String.valueOf(areaCodeL); // ///** // * 根据行政区划串(areaCode)在虚拟卡表中针对虚拟卡编号(vcNum)进行模糊查询 // * 如果5位顺序号已经达到最大值,提示用户联系系统管理员 // * 如果5位顺序号未达到最大值,则加1 // * cardNum为新的卡号 // */ //String vcNum = Optional.ofNullable(virtualCardSv.getVcCardNumOfMax(areaCode)).orElse(""); //if(vcNum != null && vcNum.trim().length() > 0) { // Integer number = Integer.parseInt(vcNum.substring(12)); // number = number + 1; // if(number > 65535) { // return BaseResponseUtils.buildErrorMsg(WechatResultCode.CARD_NUMBER_OVERRUN.getMessage()); // } // 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(0d); //seVirtualCard.setState((byte)1); //seVirtualCard.setLastOperate(LastOperateENUM.OPEN_ACCOUNT.getCode()); //seVirtualCard.setLastOperateTime(new Date()); //seVirtualCard.setInUse((byte) 0); //seVirtualCard.setCreateTime(new Date()); //Long vcId = virtualCardSv.insertVirtualCard(seVirtualCard); //if(vcId == null) { // return BaseResponseUtils.buildErrorMsg(WechatResultCode.VC_OPEN_ACCOUNT_FAIL.getMessage()); //} // //// 生成虚拟卡操作记录,注册虚拟卡操作人为农户 //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 = virtualCardSv.insertVcOperate(seVcOperate); //if(vcOperateId == null) { // return BaseResponseUtils.buildErrorMsg(WechatResultCode.VC_OPEN_ACCOUNT_FAIL.getMessage()); //} // //return BaseResponseUtils.buildSuccess(true) ; } /** * 根据虚拟卡ID注销虚拟卡 * @param po * @param bindingResult * @return */ @PostMapping(path = "cancel") @Transactional(rollbackFor = Exception.class) public BaseResponse cancelVC(@RequestBody @Valid DtoCancel po, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Long clientId = po.getClientId(); Long vcId = po.getVcId(); // 根据农户ID及虚拟卡Id判断是否存在正常状态(可注销)的虚拟卡 SeVirtualCard seVirtualCard = virtualCardSv.getVcByClientIdAndVcId(clientId, vcId); if(seVirtualCard == null) { return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_VC_FIT_THE_BILL.getMessage()); } // 注销虚拟卡 Integer rec = virtualCardSv.cancelVc(clientId, vcId); if(rec == null || rec == 0) { return BaseResponseUtils.buildErrorMsg(WechatResultCode.VC_CANCEL_FAIL.getMessage()); } // 生成虚拟卡操作记录,注册虚拟卡操作人为农户 SeVcOperate seVcOperate = new SeVcOperate(); seVcOperate.setVcId(vcId); seVcOperate.setClientId(clientId); seVcOperate.setOperateType(LastOperateENUM.CLOSING_ACCOUNT.getCode()); seVcOperate.setOperator(clientId); seVcOperate.setOperateTime(new Date()); Long vcOperateId = virtualCardSv.insertVcOperate(seVcOperate); if(vcOperateId == null) { return BaseResponseUtils.buildErrorMsg(WechatResultCode.VC_OPEN_ACCOUNT_FAIL.getMessage()); } return BaseResponseUtils.buildSuccess(true) ; } /** * 获取农户全部虚拟卡 * @return */ @GetMapping(path = "/get") public BaseResponse> getVCs(Long clientId){ try { return BaseResponseUtils.buildSuccess(virtualCardSv.getVCs(clientId)); } catch (Exception e) { log.error("获取支付方式记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 根据虚拟卡ID获取虚拟卡对象 * @param vcId * @return */ @GetMapping(path = "/getVcById") public BaseResponse getVcById(@RequestParam Long vcId){ try { return BaseResponseUtils.buildSuccess(virtualCardSv.getVcById(vcId)); } catch (Exception e) { log.error("获取支付方式记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 用户申请退款 * @param po * @param bindingResult * @return */ //@Operation(summary = "虚拟卡申请退款", description = "虚拟卡申请退款") //@ApiResponses(value = { // @ApiResponse( // responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, // description = "操作结果:true:成功,false:失败(BaseResponse.content)", // content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, // schema = @Schema(implementation = Boolean.class))} // ) //}) //@PostMapping(path = "add_refund", consumes = MediaType.APPLICATION_JSON_VALUE) //@Transactional(rollbackFor = Exception.class) //public BaseResponse addRefund(@RequestBody @Valid DtoRefund po, BindingResult bindingResult){ // if(bindingResult != null && bindingResult.hasErrors()){ // return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); // } // // Long virtualId = po.getVirtualId(); // Integer refundAmount = po.getRefundAmount(); // // // 根据虚拟卡ID获取虚拟卡对象 // SeVirtualCard seVirtualCard = virtualCardSv.selectVirtuCardById(virtualId); // if(seVirtualCard == null) { // return BaseResponseUtils.buildFail(WechatResultCode.VIRTUAL_CARD_NOT_EXIST.getMessage()); // } // Long clientId = seVirtualCard.getClientId(); // Double money = seVirtualCard.getMoney(); // // // 验证退款金额是否大于余额 // if(refundAmount > money) { // return BaseResponseUtils.buildFail(WechatResultCode.REFUND_AMOUNT_CANNOT_GREATER_THAN_MONEY.getMessage()); // } // // // 计算消费后余额 // Double afterRefund = money - refundAmount; // // SeVcRefund seVcRefund = new SeVcRefund(); // seVcRefund.setVcId(virtualId); // seVcRefund.setClientId(clientId); // seVcRefund.setMoney(money); // seVcRefund.setRefundAmount(refundAmount); // seVcRefund.setAfterRefund(afterRefund); // seVcRefund.setApplicationTime(new Date()); // seVcRefund.setRefundStatus(RefundStateENUM.TO_AUDIT.getCode()); // // Long rec = virtualCardSv.addRefund(seVcRefund); // if(rec == 0) { // return BaseResponseUtils.buildFail(WechatResultCode.APPLICATION_REFUND_FAIL.getMessage()); // } // return BaseResponseUtils.buildSuccess(true) ; //} /** * 审核退款申请 * @param po * @param bindingResult * @return */ //@Operation(summary = "审核退款申请", description = "审核退款申请") //@ApiResponses(value = { // @ApiResponse( // responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, // description = "操作结果:true:成功,false:失败(BaseResponse.content)", // content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, // schema = @Schema(implementation = Boolean.class))} // ) //}) //@PostMapping(path = "audit_refund", consumes = MediaType.APPLICATION_JSON_VALUE) //@Transactional(rollbackFor = Exception.class) //public BaseResponse auditRefund(@RequestBody @Valid DtoAudit po, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException { // if(bindingResult != null && bindingResult.hasErrors()){ // return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); // } // // // 根据退款ID获取退款对象,并更新审核人、审核时间、审核备注、退款状态字段 // SeVcRefund seVcRefund = virtualCardSv.selectRefundByRefundId(po.getRefundId()); // Long virtualId = seVcRefund.getVcId(); // Integer refundAmount = seVcRefund.getRefundAmount(); // seVcRefund.setAuditor(po.getAuditor()); // seVcRefund.setAuditTime(new Date()); // seVcRefund.setRemarks(po.getRemarks()); // seVcRefund.setRefundStatus(RefundStateENUM.TO_REFUND.getCode()); // Integer rec = virtualCardSv.updateRefund(seVcRefund); // if(rec == 0) { // return BaseResponseUtils.buildFail(WechatResultCode.AUDIT_REFUND_FAIL.getMessage()); // } // // // 完成审核后获取待退款订单列表 // List list_ToRefund = payHelper.getToRefunds(virtualId, refundAmount); // if(list_ToRefund == null || list_ToRefund.size() <=0) // return BaseResponseUtils.buildFail(WechatResultCode.NOT_SUFFICIENT_FUNDS.getMessage()); // // //遍历待退款列表 // JSONArray array_ToRefund = (JSONArray) JSON.toJSON(list_ToRefund); // for(int i = 0; i < array_ToRefund.size(); i++) { // JSONObject job_ToRefund = array_ToRefund.getJSONObject(i); // String orderNumber_ToRefund = job_ToRefund.getString("orderNumber"); // Integer refundAmount_ToRefund = job_ToRefund.getInteger("refundAmount"); // // // 生成退款分项记录 // SeVcRefundItem seVcRefundItem = new SeVcRefundItem(); // seVcRefundItem.setRefundId(po.getRefundId()); // seVcRefundItem.setOrderNumber(orderNumber_ToRefund); // String refundNumber = virtualCardSv.generateRefundNumber(orderNumber_ToRefund); // seVcRefundItem.setRefundNumber(refundNumber); // seVcRefundItem.setRefundAmount(refundAmount_ToRefund); // seVcRefundItem.setCreateTime(new Date()); // seVcRefundItem.setRefundStatus(RefundItemStateENUM.NO_REFUND.getCode()); // Long refundItemId = virtualCardSv.addRefundItem(seVcRefundItem); // // // 调用微信退款申请接口 // Refund refund = new Refund(); // refund.setTradeNo(orderNumber_ToRefund); // refund.setRefundNo(refundNumber); // refund.setRefund(refundAmount_ToRefund); // BaseResponse rep = payHelper.refunds(refund); // } // // return BaseResponseUtils.buildSuccess(true) ; //} /** * 获取虚拟卡充值记录 * @return */ @GetMapping(path = "/getVcRechargeRecords") public BaseResponse>> getVcRechargeRecords(QoVcRecharge dtoVcRecharge){ try { if(dtoVcRecharge.getVcId() == null) { return BaseResponseUtils.buildErrorMsg("虚拟卡不能为空"); } QueryResultVo> res = virtualCardSv.getVcRechargeRecords(dtoVcRecharge); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取虚拟卡充值记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 获取虚拟卡常用充值金额配置 * @return */ @GetMapping(path = "/gerRechargeProfiles") public BaseResponse> gerRechargeProfiles(){ try { return BaseResponseUtils.buildSuccess(virtualCardSv.gerRechargeProfiles()); } catch (Exception e) { log.error("获取虚拟卡常用充值金额配置异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 绑定虚拟卡到取水口 * @return */ @PostMapping(path = "linkVcToIntake") @Transactional(rollbackFor = Exception.class) public BaseResponse linkVcToIntake(@RequestBody @Valid Client client, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Long clientId = client.getClientId(); Map map_result = virtualCardSv.linkVcToIntake(clientId); if(map_result.get("success").equals(false)) { return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString()); } return BaseResponseUtils.buildSuccess() ; } }