From f9cb0f3f384279b2cbe87c35dde3ba573a0197f3 Mon Sep 17 00:00:00 2001 From: “djh” <“3298565835@qq.com”> Date: 星期四, 24 四月 2025 16:17:25 +0800 Subject: [PATCH] 煤矿缴费修改 --- exam-system/src/main/java/com/gkhy/exam/pay/service/impl/NonCoalPayStudentServiceImpl.java | 398 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 393 insertions(+), 5 deletions(-) diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/NonCoalPayStudentServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/NonCoalPayStudentServiceImpl.java index 86af351..1a58a26 100644 --- a/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/NonCoalPayStudentServiceImpl.java +++ b/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/NonCoalPayStudentServiceImpl.java @@ -1,14 +1,40 @@ 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.ruoyi.common.utils.DateUtils; +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.util.List; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** @@ -18,9 +44,215 @@ * @date 2025-01-16 */ @Service +@Slf4j public class NonCoalPayStudentServiceImpl extends ServiceImpl<NonCoalPayStudentMapper, NonCoalPayStudent> 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<NonCoalPayOrder> 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<NonCoalStuRep> 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.<NonCoalPayStudent>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.<NonCoalPayStudent>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<NonCoalCateRep> 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.<NonCoalPayStudent>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.<NonCoalPayStudent>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<NonCoalPayOrder> 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<NonCoalStuRep> 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.<NonCoalPayStudent>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<NonCoalStuRep> nonCoalStuList = nonCoalPayOrder.getNonCoalStuList(); + List<NonCoalCateRep> 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<PayReqData.Feedata> 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; + + } /** * 查询【请填写功能名称】 @@ -32,6 +264,7 @@ public NonCoalPayStudent selectNonCoalPayStudentById(Long id) { return nonCoalPayStudentMapper.selectNonCoalPayStudentById(id); } + /** * 查询【请填写功能名称】列表 @@ -52,7 +285,12 @@ */ @Override public int insertNonCoalPayStudent(NonCoalPayStudent nonCoalPayStudent) { - nonCoalPayStudent.setCreateTime(DateUtils.getNowDate()); + checkSameData(nonCoalPayStudent); + NonCoalPay nonCoalPay = checkNonCoalPay(nonCoalPayStudent.getNonCoalPayId()); + nonCoalPayStudent.setPayType(nonCoalPay.getPayPersonType().longValue()); +// nonCoalPayStudent.setOrderNo(RandomUtil.generateOrderNumber()); + + nonCoalPayStudent.setCreateBy(SecurityUtils.getUsername()); return nonCoalPayStudentMapper.insertNonCoalPayStudent(nonCoalPayStudent); } @@ -64,9 +302,65 @@ */ @Override public int updateNonCoalPayStudent(NonCoalPayStudent nonCoalPayStudent) { - nonCoalPayStudent.setUpdateTime(DateUtils.getNowDate()); + 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.<NonCoalPayStudent>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<NonCoalPayStudent> lambdaQueryWrapper = Wrappers.<NonCoalPayStudent>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<NonCoalPayStudent> lambdaQueryWrapper = Wrappers.<NonCoalPayStudent>lambdaQuery() + .eq(NonCoalPayStudent::getNonCoalPayId, nonPayId) + .eq(NonCoalPayStudent::getDelFlag, 0).eq(NonCoalPayStudent::getPayStatus, 1L); + + Long l = baseMapper.selectCount(lambdaQueryWrapper); + if (l > 0) { + throw new ServiceException("已开始缴费不可修改"); + } + } + /** * 批量删除【请填写功能名称】 @@ -87,6 +381,100 @@ */ @Override public int deleteNonCoalPayStudentById(Long id) { - return nonCoalPayStudentMapper.deleteNonCoalPayStudentById(id); + checkData(id); + return nonCoalPayStudentMapper.deleteNonCoalPayStudentById(id, SecurityUtils.getUsername()); + } + + @Override + public String importData(List<NonCoalPayStuImport> nonCoalPayStudents, String operName, Long nonCoalPayId) { + if (StringUtils.isNull(nonCoalPayStudents) || nonCoalPayStudents.isEmpty()) { + throw new ServiceException("导入数据不能为空!"); + } + NonCoalPay nonCoalPay = checkNonCoalPay(nonCoalPayId); + Integer payPersonType = nonCoalPay.getPayPersonType(); + Set<String> collect = nonCoalPayStudents.stream() + .map(NonCoalPayStuImport::getIdCard) + .collect(Collectors.toSet()); + if (collect.size() != nonCoalPayStudents.size()) { + throw new ServiceException("导入数据不能有重复身份证号!"); + } + Map<String, String> idCardToNameMap = new HashMap<>(); + NonCoalPayStudent student = new NonCoalPayStudent(); + student.setNonCoalPayId(nonCoalPayId); + + List<NonCoalPayStudent> 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("<br/>" + failureNum + "、导入数据为空: " + stu.getIdCard() + " 数据错误"); + } else if (idCardToNameMap.get(stu.getIdCard().trim()) != null) { + failureMsg.append("<br/>" + 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("<br/>" + successNum + "、身份证号 " + stu.getIdCard() + " 导入成功"); + idCardToNameMap.put(stu.getIdCard(), stu.getIdCard()); + } + + } catch (Exception e) { + failureNum++; + String msg = "<br/>" + 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; } } \ No newline at end of file -- Gitblit v1.9.2