diff --git a/maintain-business/src/main/java/com/maintain/business/domain/SysPayLog.java b/maintain-business/src/main/java/com/maintain/business/domain/SysPayLog.java new file mode 100644 index 0000000000000000000000000000000000000000..e15dba71f351d5afc21e2dc846bff928211d8c7f --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/domain/SysPayLog.java @@ -0,0 +1,60 @@ +package com.maintain.business.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.maintain.common.core.domain.BaseEntity; + +/** + * 银联支付日志记录对象 sys_pay_log + * + * @author liushuai + * @date 2025-11-10 + */ +@Data +@TableName("sys_pay_log") +public class SysPayLog implements Serializable { + + private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + /** + * 结算维修单ID + */ + private Long settlementMaintainId; + /** + * 认证报文 + */ + private String authorization; + /** + * 请求参数 + */ + private String operParam; + /** + * 返回参数 + */ + private String jsonResult; + /** + * 操作状态(0正常 1异常) + */ + private String status; + /** + * 操作时间 + */ + private Date operTime; + /** + * 操作用户 + */ + private Long operUser; + +} diff --git a/maintain-business/src/main/java/com/maintain/business/domain/bo/SysPayLogBo.java b/maintain-business/src/main/java/com/maintain/business/domain/bo/SysPayLogBo.java new file mode 100644 index 0000000000000000000000000000000000000000..d4a68d29c8340903862b990c81a03a3e8b447a90 --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/domain/bo/SysPayLogBo.java @@ -0,0 +1,69 @@ +package com.maintain.business.domain.bo; + +import com.maintain.common.core.validate.AddGroup; +import com.maintain.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.maintain.common.core.domain.BaseEntity; + +/** + * 银联支付日志记录业务对象 sys_pay_log + * + * @author liushuai + * @date 2025-11-10 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPayLogBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算维修单ID + */ + @NotNull(message = "结算维修单ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long settlementMaintainId; + + /** + * 认证报文 + */ + @NotBlank(message = "认证报文不能为空", groups = { AddGroup.class, EditGroup.class }) + private String authorization; + + /** + * 请求参数 + */ + @NotBlank(message = "请求参数不能为空", groups = { AddGroup.class, EditGroup.class }) + private String operParam; + + /** + * 返回参数 + */ + @NotBlank(message = "返回参数不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @NotNull(message = "操作状态(0正常 1异常)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 操作时间 + */ + @NotNull(message = "操作时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date operTime; + + +} diff --git a/maintain-business/src/main/java/com/maintain/business/domain/vo/SysPayLogVo.java b/maintain-business/src/main/java/com/maintain/business/domain/vo/SysPayLogVo.java new file mode 100644 index 0000000000000000000000000000000000000000..7d698628819918b928066399c5bfc41dc3318a9d --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/domain/vo/SysPayLogVo.java @@ -0,0 +1,70 @@ +package com.maintain.business.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.maintain.common.annotation.ExcelDictFormat; +import com.maintain.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + +import java.io.Serializable; + +/** + * 银联支付日志记录视图对象 sys_pay_log + * + * @author liushuai + * @date 2025-11-10 + */ +@Data +@ExcelIgnoreUnannotated +public class SysPayLogVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算维修单ID + */ + @ExcelProperty(value = "结算维修单ID") + private Long settlementMaintainId; + + /** + * 认证报文 + */ + @ExcelProperty(value = "认证报文") + private String authorization; + + /** + * 请求参数 + */ + @ExcelProperty(value = "请求参数") + private String operParam; + + /** + * 返回参数 + */ + @ExcelProperty(value = "返回参数") + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @ExcelProperty(value = "操作状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=异常") + private Long status; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date operTime; + + +} diff --git a/maintain-business/src/main/java/com/maintain/business/mapper/SysPayLogMapper.java b/maintain-business/src/main/java/com/maintain/business/mapper/SysPayLogMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..ca8d351c21db5a35ccff6cdad690ce369bdb7551 --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/mapper/SysPayLogMapper.java @@ -0,0 +1,15 @@ +package com.maintain.business.mapper; + +import com.maintain.business.domain.SysPayLog; +import com.maintain.business.domain.vo.SysPayLogVo; +import com.maintain.common.core.mapper.BaseMapperPlus; + +/** + * 银联支付日志记录Mapper接口 + * + * @author liushuai + * @date 2025-11-10 + */ +public interface SysPayLogMapper extends BaseMapperPlus { + +} diff --git a/maintain-business/src/main/java/com/maintain/business/service/ISysPayLogService.java b/maintain-business/src/main/java/com/maintain/business/service/ISysPayLogService.java new file mode 100644 index 0000000000000000000000000000000000000000..0a5d1bff81221ad23acc1256491f812a1a6b9e7e --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/service/ISysPayLogService.java @@ -0,0 +1,39 @@ +package com.maintain.business.service; + +import com.maintain.business.domain.bo.SysPayLogBo; +import com.maintain.business.domain.vo.SysPayLogVo; +import com.maintain.common.core.domain.PageQuery; +import com.maintain.common.core.page.TableDataInfo; +import com.maintain.common.pay.PayResult; + +import java.util.List; + +/** + * 银联支付日志记录Service接口 + * + * @author liushuai + * @date 2025-11-10 + */ +public interface ISysPayLogService { + + /** + * 查询银联支付日志记录 + */ + SysPayLogVo queryById(Long id); + + /** + * 查询银联支付日志记录列表 + */ + TableDataInfo queryPageList(SysPayLogBo bo, PageQuery pageQuery); + + /** + * 查询银联支付日志记录列表 + */ + List queryList(SysPayLogBo bo); + + /** + * 新增银联支付日志记录 + */ + PayResult insertByBo(Long id, PayResult payResult); + +} diff --git a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpSettlementMaintainServiceImpl.java b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpSettlementMaintainServiceImpl.java index c6e218910209255dfb4f28725a3ad0481a12fe47..aa522e1c4f9e53cc61f801447718aa49d51786dd 100644 --- a/maintain-business/src/main/java/com/maintain/business/service/impl/ErpSettlementMaintainServiceImpl.java +++ b/maintain-business/src/main/java/com/maintain/business/service/impl/ErpSettlementMaintainServiceImpl.java @@ -18,6 +18,7 @@ import com.maintain.business.mapper.ErpRepairFormMapper; import com.maintain.business.mapper.ErpSettlementMaintainMapper; import com.maintain.business.mapper.ErpSettlementMaintainRepairFormMapper; import com.maintain.business.service.IErpSettlementMaintainService; +import com.maintain.business.service.ISysPayLogService; import com.maintain.common.core.domain.PageQuery; import com.maintain.common.core.domain.entity.SysDept; import com.maintain.common.core.page.TableDataInfo; @@ -26,6 +27,7 @@ import com.maintain.common.enums.SettlementState; import com.maintain.common.exception.ServiceException; import com.maintain.common.helper.LoginHelper; import com.maintain.common.pay.PayResponse; +import com.maintain.common.pay.PayResult; import com.maintain.common.pay.YinLianPayApi; import com.maintain.common.utils.StringUtils; import com.maintain.common.utils.redis.RedisUtils; @@ -57,6 +59,7 @@ public class ErpSettlementMaintainServiceImpl implements IErpSettlementMaintainS private final ErpClientMapper clientMapper; private final YinLianPayApi yinLianPayApi; private final SysDeptMapper sysDeptMapper; + private final ISysPayLogService sysPayLogService; @Value("${pay.merchantCode}") private String merchantCode; @@ -256,12 +259,17 @@ public class ErpSettlementMaintainServiceImpl implements IErpSettlementMaintainS if (money == 0) { throw new ServiceException("结算单金额为0,无需支付!"); } - PayResponse response = yinLianPayApi.pay(orderNo, money, bo.getPaymentAccount(), sysDept.getTerminalCode()); - if (!response.getErrCode().equals("00")) { - throw new ServiceException("结算单支付失败:"+ response.getErrInfo()); + // 调用支付API + PayResult payResult = yinLianPayApi.pay(orderNo, money, bo.getPaymentAccount(), sysDept.getTerminalCode()); + /* 保存支付调用记录 */ + sysPayLogService.insertByBo(maintain.getId(), payResult); + PayResponse payResponse = payResult.getPayResponse(); + /* 判断是否支付成功 */ + if (!payResponse.getErrCode().equals("00")) { + throw new ServiceException("结算单支付失败:"+ payResponse.getErrInfo()); } maintain.setCollectionAccount(merchantCode); - maintain.setCollectionSerialNumber(response.getOrderId()); + maintain.setCollectionSerialNumber(payResponse.getOrderId()); maintain.setCollectionTime(new Date()); maintain.setState(SettlementState.TWO.getCode()); maintain.setPaymentMethod(1); diff --git a/maintain-business/src/main/java/com/maintain/business/service/impl/SysPayLogServiceImpl.java b/maintain-business/src/main/java/com/maintain/business/service/impl/SysPayLogServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d4ae82afa4f59504a77dd6eb68d57353338088f5 --- /dev/null +++ b/maintain-business/src/main/java/com/maintain/business/service/impl/SysPayLogServiceImpl.java @@ -0,0 +1,100 @@ +package com.maintain.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.maintain.business.domain.SysPayLog; +import com.maintain.business.domain.bo.SysPayLogBo; +import com.maintain.business.domain.vo.SysPayLogVo; +import com.maintain.business.mapper.SysPayLogMapper; +import com.maintain.business.service.ISysPayLogService; +import com.maintain.common.core.domain.PageQuery; +import com.maintain.common.core.page.TableDataInfo; +import com.maintain.common.helper.LoginHelper; +import com.maintain.common.pay.PayResult; +import com.maintain.common.utils.StringUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 银联支付日志记录Service业务层处理 + * + * @author liushuai + * @date 2025-11-10 + */ +@RequiredArgsConstructor +@Service +public class SysPayLogServiceImpl implements ISysPayLogService { + + private final SysPayLogMapper baseMapper; + + /** + * 查询银联支付日志记录 + */ + @Override + public SysPayLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询银联支付日志记录列表 + */ + @Override + public TableDataInfo queryPageList(SysPayLogBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询银联支付日志记录列表 + */ + @Override + public List queryList(SysPayLogBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysPayLogBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSettlementMaintainId() != null, SysPayLog::getSettlementMaintainId, bo.getSettlementMaintainId()); + lqw.eq(StringUtils.isNotBlank(bo.getAuthorization()), SysPayLog::getAuthorization, bo.getAuthorization()); + lqw.eq(StringUtils.isNotBlank(bo.getOperParam()), SysPayLog::getOperParam, bo.getOperParam()); + lqw.eq(StringUtils.isNotBlank(bo.getJsonResult()), SysPayLog::getJsonResult, bo.getJsonResult()); + lqw.eq(bo.getStatus() != null, SysPayLog::getStatus, bo.getStatus()); + lqw.eq(bo.getOperTime() != null, SysPayLog::getOperTime, bo.getOperTime()); + return lqw; + } + + /** + * 新增银联支付日志记录 + */ + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class, timeout = 30) + public PayResult insertByBo(Long id, PayResult payResult) { + // 保存支付日志 + SysPayLog sysPayLog = new SysPayLog(); + sysPayLog.setSettlementMaintainId(id); + sysPayLog.setAuthorization(payResult.getAuthorization()); + sysPayLog.setOperParam(payResult.getRequestParams()); + sysPayLog.setJsonResult(payResult.getResponse()); + sysPayLog.setStatus(payResult.getPayResponse().getErrCode()); + sysPayLog.setOperTime(new Date()); + sysPayLog.setOperUser(LoginHelper.getUserId()); + baseMapper.insert(sysPayLog); + return payResult; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysPayLog entity){ + //TODO 做一些数据校验,如唯一约束 + } +} diff --git a/maintain-common/src/main/java/com/maintain/common/pay/PayResult.java b/maintain-common/src/main/java/com/maintain/common/pay/PayResult.java new file mode 100644 index 0000000000000000000000000000000000000000..6569a958c26999119891a555901e756766b776e9 --- /dev/null +++ b/maintain-common/src/main/java/com/maintain/common/pay/PayResult.java @@ -0,0 +1,21 @@ +package com.maintain.common.pay; + +import lombok.Data; + +/** + * PayResult + * + * @author Liu Shuai + * @date 2025/11/10 14:44 + */ +@Data +public class PayResult { + // 请求参数 + private String requestParams; + // 认证报文 + private String authorization; + // 响应结果 + private String response; + // 解析后的响应对象 + private PayResponse payResponse; +} diff --git a/maintain-common/src/main/java/com/maintain/common/pay/YinLianPayApi.java b/maintain-common/src/main/java/com/maintain/common/pay/YinLianPayApi.java index b458e65936ab5919213132fc747168af116a3eb7..6071310daf4d155f1eaed41608ac0fb2c5dce283 100644 --- a/maintain-common/src/main/java/com/maintain/common/pay/YinLianPayApi.java +++ b/maintain-common/src/main/java/com/maintain/common/pay/YinLianPayApi.java @@ -11,9 +11,10 @@ import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; -import java.net.URLConnection; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; /** * 银联支付API @@ -71,7 +72,8 @@ public class YinLianPayApi { * @param terminalCode 终端号 * @return 支付结果 */ - public PayResponse pay(String merchantOrderId,int transactionAmount, String payCode, String terminalCode) { + public PayResult pay(String merchantOrderId,int transactionAmount, String payCode, String terminalCode) { + PayResult payResult = new PayResult(); // 组建请求报文 PayBody reqBody = new PayBody(); reqBody.merchantCode = merchantCode; @@ -90,20 +92,25 @@ public class YinLianPayApi { // 设备类型固定11 reqBody.deviceType = deviceType; String requestBody = reqBody.toString(); + payResult.setRequestParams(requestBody); System.out.println("请求参数:\n" + requestBody); // 获取认证报文,timestamp为当前日期 String timestamp = getCurrentTimestamp14(); String authorization; try { authorization = getAuthorization(appid,appkey,timestamp,"nonce",reqBody.toString()); + payResult.setAuthorization(authorization); System.out.println("认证报文:\n"+authorization); }catch (Exception e){ throw new RuntimeException("获取认证报文失败,请检查!"); } // 发送http请求,并解析返回信息 String response = request(url,authorization,reqBody.toString()); + payResult.setResponse(response); System.out.println("响应参数:\n"+response); - return JSONUtil.toBean(response, PayResponse.class); + PayResponse payResponse = JSONUtil.toBean(response, PayResponse.class); + payResult.setPayResponse(payResponse); + return payResult; } /** diff --git a/maintain-ui/src/views/business/settlementConfirm/index.vue b/maintain-ui/src/views/business/settlementConfirm/index.vue index 60eae5af46fdb436f4d88b1873f8efc801906fa7..41435e5b1dcfb408f87da3a3d84dd1a966fc08c1 100644 --- a/maintain-ui/src/views/business/settlementConfirm/index.vue +++ b/maintain-ui/src/views/business/settlementConfirm/index.vue @@ -271,6 +271,7 @@ @@ -279,12 +280,12 @@ - + - + @@ -440,6 +441,7 @@ export default { open: false, open1: false, open2: false, + isQrPay: false, // 查询参数 queryParams: { pageNum: 1, @@ -560,6 +562,7 @@ export default { paymentAccount: undefined, } this.open2 = true; + this.isQrPay = false; this.title = "扫码支付"; this.$nextTick(() => { // 确保输入框存在并获取焦点 @@ -576,6 +579,7 @@ export default { paySettlementMaintain(this.payForm).then(response => { this.$modal.msgSuccess("支付成功"); this.open2 = false; + this.isQrPay = true; getSettlementMaintain(this.form.id).then(response => { this.form = response.data; });