package com.gkhy.exam.pay.service.impl; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gkhy.exam.pay.dto.rep.NonCoalCateRep; import com.gkhy.exam.pay.dto.rep.NonCoalPayOrder; import com.gkhy.exam.pay.dto.rep.NonCoalStuRep; import com.gkhy.exam.pay.dto.req.NonCoalPayStuImport; import com.gkhy.exam.pay.dto.req.NonCoalPayStudentReqDto; import com.gkhy.exam.pay.entity.NonCoalPay; import com.gkhy.exam.pay.entity.NonCoalPayStudent; import com.gkhy.exam.pay.entity.PayReqData; import com.gkhy.exam.pay.mapper.NonCoalPayMapper; import com.gkhy.exam.pay.mapper.NonCoalPayStudentMapper; import com.gkhy.exam.pay.service.NonCoalPayStudentService; import com.gkhy.exam.pay.utils.CaiZhengConstans; import com.gkhy.exam.pay.utils.PayUtils; import com.gkhy.exam.pay.utils.ResultVo; import com.gkhy.exam.pay.utils.SexUtils; import com.ruoyi.common.constant.ResultConstants; import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.RandomUtil; import com.ruoyi.common.utils.RedisLock; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * 【请填写功能名称】Service业务层处理 * * @author hh * @date 2025-01-16 */ @Service @Slf4j public class NonCoalPayStudentServiceImpl extends ServiceImpl implements NonCoalPayStudentService { @Resource private NonCoalPayStudentMapper nonCoalPayStudentMapper; @Resource private NonCoalPayMapper nonCoalPayMapper; @Resource private PayUtils payUtils; @Autowired private RedisLock redisLock; @Override public String sendOrder(Long dataId, String payType) { String lockKey = CaiZhengConstans.NON_COAL_PAY_STUDENT_LOCK + dataId + CaiZhengConstans.UN_COAL_ORDER_KEY_1 + payType; Boolean b = redisLock.tryLock(lockKey, 30, 40, TimeUnit.SECONDS); if (b) { String orderNo = RandomUtil.generateOrderNumber(dataId, CaiZhengConstans.UN_COAL_ORDER_PERFIX); List nonCoalPayOrders = nonCoalPayMapper.selectNonCoalPayOrderByParam(dataId, Long.valueOf(payType), 1L); if (StringUtils.isEmpty(nonCoalPayOrders)) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "未找到相关缴费信息"); } NonCoalPayOrder nonCoalPayOrder = nonCoalPayOrders.get(0); List nonCoalStuList = nonCoalPayOrder.getNonCoalStuList(); if (StringUtils.isEmpty(nonCoalStuList)) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "未找到需要缴费的学员"); } NonCoalStuRep nonCoalStuRep = nonCoalStuList.get(0); if (nonCoalStuRep.getPayStatus() == 1) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "已缴费请勿重复缴费"); } //财政缴款码已生成了 if (nonCoalStuRep.getGovPayStatus() == 2) { return nonCoalStuRep.getOrderId(); } //todo 验证缴款类型 if (!nonCoalStuRep.getPayType().toString().equals(payType)) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "缴费类型不一致,请核对类型"); } //财政缴款码未生成 // if (nonCoalStuRep.getPayStatus() == 0) { // if ("1".equals(payType)) { // baseMapper.update(null, Wrappers.lambdaUpdate() // .set(NonCoalPayStudent::getOrderNo, orderNo) // .set(NonCoalPayStudent::getGovPayStatus, 1) // .eq(NonCoalPayStudent::getId, dataId).eq(NonCoalPayStudent::getDelFlag, 0) // .eq(NonCoalPayStudent::getPayType, payType).eq(NonCoalPayStudent::getPayStatus, 0)); // } else { // //团体缴费 // baseMapper.update(null, Wrappers.lambdaUpdate() // .set(NonCoalPayStudent::getOrderNo, orderNo) // .set(NonCoalPayStudent::getGovPayStatus, 1) // .eq(NonCoalPayStudent::getNonCoalPayId, dataId).eq(NonCoalPayStudent::getDelFlag, 0) // .eq(NonCoalPayStudent::getPayType, payType).eq(NonCoalPayStudent::getPayStatus, 0)); // } // } else { // orderNo = nonCoalStuRep.getOrderNo(); // } List nonCoalPayCategoryList = nonCoalPayOrder.getNonCoalPayCategoryList(); if (StringUtils.isEmpty(nonCoalPayCategoryList)) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "缴费信息缺失"); } // 业务处理 //查询主信息 查询是否是团队 PayReqData payReqData = dealData(nonCoalPayOrder, orderNo, payType); try { ResultVo resultVo = payUtils.faqiV2(payReqData); log.info("调用接口返回结果:" + resultVo); if (resultVo.getRespcode().equals(CaiZhengConstans.CAI_ZHENG_SUCCESS)) { String orderId = resultVo.getRespdata().getOrderId(); String billNo = resultVo.getRespdata().getBillNo(); if (StringUtils.isNotEmpty(orderId)) { // 更新订单 if ("1".equals(payType)) { baseMapper.update(null, Wrappers.lambdaUpdate() .set(NonCoalPayStudent::getOrderId, orderId) .set(NonCoalPayStudent::getOrderNo, orderNo) .set(NonCoalPayStudent::getPayCode, billNo) .set(NonCoalPayStudent::getGovPayStatus, 2) .eq(NonCoalPayStudent::getId, dataId).eq(NonCoalPayStudent::getDelFlag, 0) .eq(NonCoalPayStudent::getPayType, payType).eq(NonCoalPayStudent::getPayStatus, 0)); } else { //团体缴费 baseMapper.update(null, Wrappers.lambdaUpdate() .set(NonCoalPayStudent::getOrderId, orderId) .set(NonCoalPayStudent::getOrderNo, orderNo) .set(NonCoalPayStudent::getPayCode, billNo) .set(NonCoalPayStudent::getGovPayStatus, 2) .eq(NonCoalPayStudent::getNonCoalPayId, dataId).eq(NonCoalPayStudent::getDelFlag, 0) .eq(NonCoalPayStudent::getPayType, payType).eq(NonCoalPayStudent::getPayStatus, 0)); } } return orderId; } else { log.error("生成订单失败:" + resultVo.getRespmsg() + ",请稍后重试,错误编码:" + resultVo.getRespcode() + "参数如下:" + payReqData); throw new BusinessException(this.getClass(), ResultConstants.SYSTEM_ERROR, "发起支付失败,请稍后重试"); } } catch (Exception e) { log.error("发起支付调用接口失败:" + e); throw new BusinessException(this.getClass(), ResultConstants.SYSTEM_ERROR, e.getMessage()); } finally { redisLock.unlock(lockKey); } } return null; } @Override public NonCoalStuRep queryOrder(Long dataId, String payType) { List nonCoalPayOrders = nonCoalPayMapper.selectNonCoalPayOrderByParam(dataId, Long.valueOf(payType), 2L); if (StringUtils.isEmpty(nonCoalPayOrders)) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "未找到相关缴费信息"); } NonCoalPayOrder nonCoalPayOrder = nonCoalPayOrders.get(0); List nonCoalStuList = nonCoalPayOrder.getNonCoalStuList(); if (StringUtils.isEmpty(nonCoalStuList)) { throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "未找到需要缴费的学员"); } NonCoalStuRep nonCoalStuRep = nonCoalStuList.get(0); // if (nonCoalStuRep.getPayStatus() == 1) { // throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR, "已缴费请勿重复缴费"); // } if (nonCoalStuRep.getGovPayStatus() == 2 && nonCoalStuRep.getPayStatus() == 0) { try { JSONObject result = payUtils.query(nonCoalStuRep.getOrderNo()); log.info("查询财政订单返回结果:" + result); String respcode = result.getString("respcode"); if (CaiZhengConstans.CAI_ZHENG_SUCCESS.equals(respcode)) { JSONObject respdata = result.getJSONObject("respdata"); if (respdata != null && "1".equals(respdata.getString("status"))) { nonCoalPayStudentMapper.update(null, Wrappers.lambdaUpdate() .set(NonCoalPayStudent::getPayStatus, 1) .set(NonCoalPayStudent::getPayTime, respdata.getDate("payTime")) .eq(NonCoalPayStudent::getOrderNo, nonCoalStuRep.getOrderNo()).eq(NonCoalPayStudent::getDelFlag, 0) .eq(NonCoalPayStudent::getPayStatus, 0)); // 回调确认支付 nonCoalStuRep.setPayStatus(1L); payUtils.affirmPost(nonCoalStuRep.getOrderNo()); } else { log.error("查询财政订单失败:" + result.getString("respmsg") + ",错误编码:" + result.getString("respcode")); } } } catch (Exception e) { log.error("查询财政订单失败:" + e.getMessage()); } } return nonCoalStuRep; } private PayReqData dealData(NonCoalPayOrder nonCoalPayOrder, String orderNo, String payType) { List nonCoalStuList = nonCoalPayOrder.getNonCoalStuList(); List nonCoalPayCategoryList = nonCoalPayOrder.getNonCoalPayCategoryList(); PayReqData payReqData = new PayReqData(); payReqData.setOrderNo(orderNo); payReqData.setPayerType(Integer.valueOf(payType)); payReqData.setMoney(nonCoalPayOrder.getAmount().multiply(BigDecimal.valueOf(nonCoalStuList.size()))); payReqData.setAmount(nonCoalPayCategoryList.size()); payReqData.setDesc(nonCoalPayOrder.getBatchName()); NonCoalCateRep nonCoalCateRep1 = nonCoalPayCategoryList.get(0); payReqData.setHandlingPerson(nonCoalCateRep1.getDrawer()); payReqData.setChecker(nonCoalCateRep1.getReviewer()); payReqData.setEnterCode(nonCoalCateRep1.getCompanyCode()); payReqData.setInvoiceSocialCode(nonCoalCateRep1.getInvoicingCompanyCode()); List feedatas1 = new ArrayList<>(); for (NonCoalCateRep nonCoalCateRep : nonCoalPayCategoryList) { PayReqData.Feedata feedatas = new PayReqData.Feedata(); feedatas.setAmount(nonCoalStuList.size()); feedatas.setBusCode(nonCoalCateRep.getBusinessCode()); feedatas.setPrice(nonCoalCateRep.getCategoryAmount().multiply(BigDecimal.valueOf(nonCoalStuList.size()))); feedatas1.add(feedatas); } payReqData.setFeeDatas(feedatas1); if ("1".equals(payType)) { //个人缴费 NonCoalStuRep nonCoalStuRep = nonCoalStuList.get(0); payReqData.setPayerName(nonCoalStuRep.getStudentName()); payReqData.setCertNo(nonCoalStuRep.getIdCard()); } else { //团体缴费 payReqData.setPayerName(nonCoalPayOrder.getPayCompanyName()); payReqData.setCertNo(nonCoalPayOrder.getPayCompanyCard()); //todo 待确认 // payReqData.setInvoiceSocialCode(nonCoalPayOrder.getPayCompanyCard()); // payReqData.setEnterCode(nonCoalPayOrder.getPayCompanyCard()); } return payReqData; } /** * 查询【请填写功能名称】 * * @param id 【请填写功能名称】主键 * @return 【请填写功能名称】 */ @Override public NonCoalPayStudent selectNonCoalPayStudentById(Long id) { return nonCoalPayStudentMapper.selectNonCoalPayStudentById(id); } /** * 查询【请填写功能名称】列表 * * @param nonCoalPayStudent 【请填写功能名称】 * @return 【请填写功能名称】 */ @Override public List selectNonCoalPayStudentList(NonCoalPayStudent nonCoalPayStudent) { return nonCoalPayStudentMapper.selectNonCoalPayStudentList(nonCoalPayStudent); } /** * 新增【请填写功能名称】 * * @param nonCoalPayStudent 【请填写功能名称】 * @return 结果 */ @Override public int insertNonCoalPayStudent(NonCoalPayStudent nonCoalPayStudent) { checkSameData(nonCoalPayStudent); NonCoalPay nonCoalPay = checkNonCoalPay(nonCoalPayStudent.getNonCoalPayId()); nonCoalPayStudent.setPayType(nonCoalPay.getPayPersonType().longValue()); // nonCoalPayStudent.setOrderNo(RandomUtil.generateOrderNumber()); nonCoalPayStudent.setCreateBy(SecurityUtils.getUsername()); return nonCoalPayStudentMapper.insertNonCoalPayStudent(nonCoalPayStudent); } /** * 修改【请填写功能名称】 * * @param nonCoalPayStudent 【请填写功能名称】 * @return 结果 */ @Override public int updateNonCoalPayStudent(NonCoalPayStudent nonCoalPayStudent) { checkData(nonCoalPayStudent.getId()); checkSameData(nonCoalPayStudent); nonCoalPayStudent.setPayType(null); nonCoalPayStudent.setOrderNo(null); nonCoalPayStudent.setUpdateBy(SecurityUtils.getUsername()); return nonCoalPayStudentMapper.updateNonCoalPayStudent(nonCoalPayStudent); } @Override public int updateNonCoalStu(NonCoalPayStudentReqDto nonCoalPayStudent) { if (nonCoalPayStudent.getId() != null) { NonCoalPayStudent nonCoalPayStudent1 = selectNonCoalPayStudentById(nonCoalPayStudent.getId()); if (nonCoalPayStudent1 != null) { nonCoalPayStudent1.setPayCode(nonCoalPayStudent.getPayCode()); nonCoalPayStudent1.setPayStatus(1L); nonCoalPayStudent1.setUpdateBy(SecurityUtils.getUsername()); } else { log.error("修改缴费学员失败,该缴费学员不存在:" + nonCoalPayStudent.getId()); } } else { if (nonCoalPayStudent.getNonCoalPayId() != null) { baseMapper.update(null, Wrappers.lambdaUpdate() .set(NonCoalPayStudent::getUpdateBy, SecurityUtils.getUsername()) .set(NonCoalPayStudent::getPayCode, nonCoalPayStudent.getPayCode()) .set(NonCoalPayStudent::getPayStatus, 1L) .eq(NonCoalPayStudent::getNonCoalPayId, nonCoalPayStudent.getNonCoalPayId()) .eq(NonCoalPayStudent::getPayStatus, 0L).eq(NonCoalPayStudent::getDelFlag, 0)); } } return 0; } private void checkSameData(NonCoalPayStudent nonCoalPay) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery() .eq(NonCoalPayStudent::getNonCoalPayId, nonCoalPay.getNonCoalPayId()) .eq(NonCoalPayStudent::getIdCard, nonCoalPay.getIdCard()) .eq(NonCoalPayStudent::getDelFlag, 0); if (nonCoalPay.getId() != null) { lambdaQueryWrapper.ne(NonCoalPayStudent::getId, nonCoalPay.getId()); } Long l = baseMapper.selectCount(lambdaQueryWrapper); if (l > 0) { throw new ServiceException("该缴费学员已存在"); } } @Override public void checkHavePayData(Long nonPayId) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery() .eq(NonCoalPayStudent::getNonCoalPayId, nonPayId) .eq(NonCoalPayStudent::getDelFlag, 0).eq(NonCoalPayStudent::getPayStatus, 1L); Long l = baseMapper.selectCount(lambdaQueryWrapper); if (l > 0) { throw new ServiceException("已开始缴费不可修改"); } } /** * 批量删除【请填写功能名称】 * * @param ids 需要删除的【请填写功能名称】主键 * @return 结果 */ @Override public int deleteNonCoalPayStudentByIds(Long[] ids) { return nonCoalPayStudentMapper.deleteNonCoalPayStudentByIds(ids); } /** * 删除【请填写功能名称】信息 * * @param id 【请填写功能名称】主键 * @return 结果 */ @Override public int deleteNonCoalPayStudentById(Long id) { checkData(id); return nonCoalPayStudentMapper.deleteNonCoalPayStudentById(id, SecurityUtils.getUsername()); } @Override public String importData(List nonCoalPayStudents, String operName, Long nonCoalPayId) { if (StringUtils.isNull(nonCoalPayStudents) || nonCoalPayStudents.isEmpty()) { throw new ServiceException("导入数据不能为空!"); } NonCoalPay nonCoalPay = checkNonCoalPay(nonCoalPayId); Integer payPersonType = nonCoalPay.getPayPersonType(); Set collect = nonCoalPayStudents.stream() .map(NonCoalPayStuImport::getIdCard) .collect(Collectors.toSet()); if (collect.size() != nonCoalPayStudents.size()) { throw new ServiceException("导入数据不能有重复身份证号!"); } Map idCardToNameMap = new HashMap<>(); NonCoalPayStudent student = new NonCoalPayStudent(); student.setNonCoalPayId(nonCoalPayId); List nonCoalPayStudents1 = nonCoalPayStudentMapper.selectNonCoalPayStudentList(student); if (nonCoalPayStudents1 != null && !nonCoalPayStudents1.isEmpty()) { idCardToNameMap = nonCoalPayStudents1.stream() .collect(Collectors.toMap( NonCoalPayStudent::getIdCard, NonCoalPayStudent::getIdCard )); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); for (NonCoalPayStuImport stu : nonCoalPayStudents) { try { if (StringUtils.isEmpty(stu.getIdCard()) || StringUtils.isEmpty(stu.getName()) || StringUtils.isEmpty(stu.getPhone())) { failureMsg.append("
" + failureNum + "、导入数据为空: " + stu.getIdCard() + " 数据错误"); } else if (idCardToNameMap.get(stu.getIdCard().trim()) != null) { failureMsg.append("
" + failureNum + "、身份证号: " + stu.getIdCard() + " 数据已存在"); } else { NonCoalPayStudent stu1 = new NonCoalPayStudent(); stu1.setPayStatus(0L); stu1.setPayType(payPersonType.longValue()); stu1.setNonCoalPayId(nonCoalPayId); stu1.setCreateBy(operName); stu1.setName(stu.getName()); stu1.setIdCard(stu.getIdCard()); stu1.setPhone(stu.getPhone()); if (StringUtils.isNotEmpty(stu.getTrain())) { stu1.setTrain(stu.getTrain()); } stu1.setSex(SexUtils.sexType(stu.getIdCard())); nonCoalPayStudentMapper.insertNonCoalPayStudent(stu1); successNum++; successMsg.append("
" + successNum + "、身份证号 " + stu.getIdCard() + " 导入成功"); idCardToNameMap.put(stu.getIdCard(), stu.getIdCard()); } } catch (Exception e) { failureNum++; String msg = "
" + failureNum + "、身份证号 " + stu.getIdCard() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new ServiceException(failureMsg.toString()); } else { successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); } return successMsg.toString(); } private NonCoalPayStudent checkData(Long id) { NonCoalPayStudent byId = nonCoalPayStudentMapper.selectNonCoalPayStudentById(id); if (byId == null) { throw new RuntimeException("该数据不存在"); } if (byId.getDelFlag() == 2) { throw new RuntimeException("该数据已删除"); } if (byId.getPayStatus() == 1) { throw new RuntimeException("该数据已缴费,不可操作"); } return byId; } private NonCoalPay checkNonCoalPay(Long nonCoalPayId) { NonCoalPay nonCoalPay = nonCoalPayMapper.selectNonCoalPayById(nonCoalPayId); if (nonCoalPay == null) { throw new ServiceException("该主数据不存在"); } return nonCoalPay; } }