Commit 3efebfd8 authored by 刘帅's avatar 刘帅

1.支付接口

parent 79ab4691
......@@ -49,8 +49,8 @@ public class ApiWxLiveBillController extends BaseController {
* 创建缴费账单
*/
@PostMapping("/add")
public R<Void> add(WxLiveBillBo bo) {
return toAjax(iWxLiveBillService.add(bo));
public R<WxLiveBillBo> add(WxLiveBillBo bo) {
return R.ok(iWxLiveBillService.add(bo));
}
}
......@@ -9,10 +9,13 @@ import com.propertyManagement.common.core.controller.BaseController;
import com.propertyManagement.common.core.domain.R;
import com.propertyManagement.common.core.validate.AddGroup;
import com.propertyManagement.common.enums.PayState;
import com.propertyManagement.pay.support.pay.PayReqModel;
import com.siashan.unipay4j.core.Result;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
......@@ -33,20 +36,21 @@ public class ApiWxPayRecordController extends BaseController {
* 查询缴费记录列表
*/
@GetMapping("/listAll")
public R<List<WxPayRecordVo>> listAll() {
public R<List<WxPayRecordVo>> listAll(@NotNull(message = "类型不能为空") Integer type) {
WxPayRecordBo recordBo = new WxPayRecordBo();
recordBo.setProprietorId(AuthUtil.getWxUser().getProprietorId());
recordBo.setPayState(PayState.NO.getCode());
recordBo.setOrderType(type);
// recordBo.setPayState(PayState.NO.getCode());
return R.ok(iWxPayRecordService.queryList(recordBo));
}
/**
* 新增缴费记录
* 支付订单
*/
@RepeatSubmit()
@PostMapping("/add")
public R<Void> add(@Validated(AddGroup.class) @RequestBody WxPayRecordBo bo) {
return toAjax(iWxPayRecordService.insertByBo(bo));
@PostMapping("/pay")
public R<Result<Object>> add(@Validated(AddGroup.class) @RequestBody PayReqModel payReqModel) {
return R.ok(iWxPayRecordService.pay(payReqModel));
}
}
......@@ -119,15 +119,4 @@ public class ApiWxRepairsController extends BaseController {
repairsBo.setState(RepairsState.TWO.getCode());
return toAjax(iWxRepairsService.updateByBo(repairsBo));
}
/**
* 支付报修单
*
* @param repairsId 主键
*/
@PutMapping("/pay/{repairsId}")
public R<Void> pay(@NotEmpty(message = "主键不能为空") @PathVariable Long repairsId) {
return toAjax(true);
}
}
......@@ -13,6 +13,7 @@ import com.propertyManagement.common.core.validate.EditGroup;
import com.propertyManagement.common.enums.BusinessType;
import com.propertyManagement.common.enums.IsEnableType;
import com.propertyManagement.common.utils.poi.ExcelUtil;
import com.propertyManagement.pay.domain.CmsPayMerchant;
import com.propertyManagement.pay.domain.bo.CmsPayMerchantBo;
import com.propertyManagement.pay.domain.vo.CmsPayMerchantVo;
import com.propertyManagement.pay.service.IPayMerchantService;
......@@ -84,6 +85,22 @@ public class PayMerchantController extends BaseController {
return R.ok(iPayMerchantService.getByCode(code));
}
/**
* 修改支付商户
*
* @apiNote 同步商户配置信息到App应用配置
*
* @param cmsPayMerchant 参数
* @return 结果
*/
@SaCheckPermission("@ss.hasPermi('cms:pay-merchant:edit')")
@PutMapping("/syncEdit")
public R syncEdit(@RequestBody CmsPayMerchantBo cmsPayMerchant) {
iPayMerchantService.syncEdit(cmsPayMerchant);
return R.ok();
}
/**
* 新增支付商户
*/
......
......@@ -39,7 +39,11 @@ public class WxPayRecord extends BaseEntity {
/**
* 小区名称
*/
private Long communityName;
private Long communityId;
/**
* 小区名称
*/
private String communityName;
/**
* 业主ID
*/
......@@ -59,11 +63,11 @@ public class WxPayRecord extends BaseEntity {
/**
* 账单主键
*/
private Long billId;
private Long orderId;
/**
* 订单类型
*/
private String orderType;
private Integer orderType;
/**
* 支付渠道
*/
......
......@@ -44,7 +44,12 @@ public class WxPayRecordBo extends BaseEntity {
* 小区名称
*/
@NotNull(message = "小区名称不能为空", groups = { AddGroup.class, EditGroup.class })
private Long communityName;
private Long communityId;
/**
* 小区名称
*/
private String communityName;
/**
* 业主ID
......@@ -74,13 +79,13 @@ public class WxPayRecordBo extends BaseEntity {
* 账单主键
*/
@NotNull(message = "账单主键不能为空", groups = { AddGroup.class, EditGroup.class })
private Long billId;
private Long orderId;
/**
* 订单类型
*/
@NotBlank(message = "订单类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String orderType;
private Integer orderType;
/**
* 支付渠道
......
......@@ -32,11 +32,16 @@ public class WxPayRecordVo implements Serializable {
@ExcelProperty(value = "用户名称")
private String userName;
/**
* 小区ID
*/
private Long communityId;
/**
* 小区名称
*/
@ExcelProperty(value = "小区名称")
private Long communityName;
private String communityName;
/**
* 业主ID
......@@ -65,8 +70,8 @@ public class WxPayRecordVo implements Serializable {
* 订单类型
*/
@ExcelProperty(value = "订单类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "wx_live_bill_type")
private String orderType;
@ExcelDictFormat(dictType = "wx_pay_record_type")
private Integer orderType;
/**
* 支付渠道
......@@ -108,7 +113,7 @@ public class WxPayRecordVo implements Serializable {
* 支付状态
*/
@ExcelProperty(value = "支付状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "wx_pay_record")
@ExcelDictFormat(dictType = "wx_pay_record_state")
private Integer payState;
/**
......
package com.propertyManagement.business.enums;
import com.siashan.toolkit.core.enums.IBaseEnum;
/**
* 支付业务枚举
*
* @author siashan
* @date 2023-11-11
*/
public enum PayBizEnum implements IBaseEnum<String> {
PRESTORE("PRESTORE","预存支付"),
MAINTAIN("MAINTAIN","维修支付"),
;
private String code;
private String desp;
PayBizEnum(String code, String desp){
this.code = code;
this.desp = desp;
}
public String getCode() {
return this.code;
}
public String getDesp() {
return this.desp;
}
public void setCode(String code) {
this.code = code;
}
public void setDesp(String desp) {
this.desp = desp;
}
}
......@@ -35,7 +35,7 @@ public interface IWxLiveBillService {
/**
* 创建缴费账单
*/
Boolean add(WxLiveBillBo bo);
WxLiveBillBo add(WxLiveBillBo bo);
/**
* 新增生活缴费账单
......
......@@ -5,6 +5,8 @@ import com.propertyManagement.business.domain.vo.WxPayRecordVo;
import com.propertyManagement.business.domain.bo.WxPayRecordBo;
import com.propertyManagement.common.core.page.TableDataInfo;
import com.propertyManagement.common.core.domain.PageQuery;
import com.propertyManagement.pay.support.pay.PayReqModel;
import com.siashan.unipay4j.core.Result;
import java.util.Collection;
import java.util.List;
......@@ -32,6 +34,11 @@ public interface IWxPayRecordService {
*/
List<WxPayRecordVo> queryList(WxPayRecordBo bo);
/**
* 新增缴费记录
*/
Result<Object> pay(PayReqModel payReqModel);
/**
* 新增缴费记录
*/
......
......@@ -81,7 +81,7 @@ public class WxLiveBillServiceImpl implements IWxLiveBillService {
}
@Override
public Boolean add(WxLiveBillBo bo) {
public WxLiveBillBo add(WxLiveBillBo bo) {
WxLiveBill add = BeanUtil.toBean(bo, WxLiveBill.class);
LoginWxUser wxUser = AuthUtil.getWxUser();
add.setCommunityId(wxUser.getCommunityId());
......@@ -97,7 +97,7 @@ public class WxLiveBillServiceImpl implements IWxLiveBillService {
if (flag) {
bo.setBillId(add.getBillId());
}
return flag;
return bo;
}
/**
......
package com.propertyManagement.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.propertyManagement.business.domain.WxLiveBill;
import com.propertyManagement.business.domain.WxRepairs;
import com.propertyManagement.business.domain.vo.LoginWxUser;
import com.propertyManagement.business.enums.PayBizEnum;
import com.propertyManagement.business.mapper.WxLiveBillMapper;
import com.propertyManagement.business.mapper.WxRepairsMapper;
import com.propertyManagement.business.support.util.AuthUtil;
import com.propertyManagement.common.enums.LiveBillState;
import com.propertyManagement.common.enums.PayState;
import com.propertyManagement.common.enums.RepairsState;
import com.propertyManagement.common.utils.StringUtils;
import com.propertyManagement.common.core.page.TableDataInfo;
import com.propertyManagement.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.propertyManagement.common.utils.ip.IpUtils;
import com.propertyManagement.pay.support.pay.CmsUnipayProvider;
import com.propertyManagement.pay.support.pay.PayReqModel;
import com.siashan.toolkit.core.enums.EnumUtil;
import com.siashan.toolkit.core.wrapper.AjaxResult;
import com.siashan.unipay4j.core.Result;
import com.siashan.unipay4j.core.TradeStateEnum;
import com.siashan.unipay4j.core.pay.IPayment;
import com.siashan.unipay4j.core.pay.PayModel;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.propertyManagement.business.domain.bo.WxPayRecordBo;
......@@ -15,6 +34,7 @@ import com.propertyManagement.business.domain.WxPayRecord;
import com.propertyManagement.business.mapper.WxPayRecordMapper;
import com.propertyManagement.business.service.IWxPayRecordService;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Collection;
......@@ -30,6 +50,8 @@ import java.util.Collection;
public class WxPayRecordServiceImpl implements IWxPayRecordService {
private final WxPayRecordMapper baseMapper;
private final WxLiveBillMapper liveBillMapper;
private final WxRepairsMapper repairsMapper;
/**
* 查询缴费记录
......@@ -58,6 +80,84 @@ public class WxPayRecordServiceImpl implements IWxPayRecordService {
return baseMapper.selectVoList(lqw);
}
/**
* 新增缴费记录
*
* @param reqModel
*/
@Override
public Result<Object> pay(PayReqModel reqModel) {
PayBizEnum payBiz = EnumUtil.getEnum(PayBizEnum.class, reqModel.getPayBizCode());
Long orderId = null;
BigDecimal payAmount = BigDecimal.ZERO;
String outTradeNo = null;
switch (payBiz) {
case PRESTORE:
WxLiveBill wxLiveBill = liveBillMapper.selectById(reqModel.getOrderId());
if (null == wxLiveBill) {
throw new RuntimeException("订单信息不存在,请刷新后重试");
}
if (LiveBillState.YES.getCode().equals(wxLiveBill.getState())) {
throw new RuntimeException("订单已支付,无需重新支付!");
}
if (reqModel.getAmount().doubleValue() != wxLiveBill.getMoney().doubleValue()) {
throw new RuntimeException("支付金额不匹配");
}
orderId = wxLiveBill.getBillId();
payAmount = wxLiveBill.getMoney();
break;
case MAINTAIN:
WxRepairs wxRepairs = repairsMapper.selectById(reqModel.getOrderId());
if (null == wxRepairs) {
throw new RuntimeException("订单信息不存在,请刷新后重试");
}
if (RepairsState.TWO.getCode().equals(wxRepairs.getState())) {
throw new RuntimeException("订单状态错误,请刷新后重试!");
}
if (reqModel.getAmount().doubleValue() != wxRepairs.getMoney().doubleValue()) {
throw new RuntimeException("支付金额不匹配");
}
orderId = wxRepairs.getRepairsId();
payAmount = wxRepairs.getMoney();
break;
default:
throw new RuntimeException("支付失败,类型错误");
}
WxPayRecord record = createPayRecord(orderId, payAmount);
IPayment payment = CmsUnipayProvider.getPayment(orderId, reqModel.getPayChannelCode(), reqModel.getPayMchCode(), reqModel.getPayAppCode(), reqModel.getPayBizCode());
PayModel payModel = getPayModel(record);
return payment.pay(payModel);
}
private WxPayRecord createPayRecord(Long orderId, BigDecimal payAmount) {
LoginWxUser wxUser = AuthUtil.getWxUser();
WxPayRecord record = new WxPayRecord();
record.setOrderId(orderId);
record.setPayAmount(payAmount);
record.setPayState(PayState.WAIT.getCode());
record.setUserId(wxUser.getId());
record.setUserName(wxUser.getNickName());
record.setProprietorId(wxUser.getProprietorId());
record.setProprietorName(wxUser.getName());
record.setRoom(wxUser.getRoom());
record.setCommunityId(wxUser.getCommunityId());
record.setCommunityName(wxUser.getCommunityName());
baseMapper.insert(record);
return record;
}
private PayModel getPayModel(WxPayRecord record) {
LoginWxUser wxUser = AuthUtil.getWxUser();
PayModel payModel = new PayModel();
payModel.setPrice(record.getPayAmount());
payModel.setOpenid(wxUser.getOpenId());
payModel.setOutTradeNo(record.getOutTradeNo());
payModel.setBody("订单支付");
payModel.setSubject("订单支付");
payModel.setSpbillCreateIp(IpUtils.getIpAddr());
return payModel;
}
private LambdaQueryWrapper<WxPayRecord> buildQueryWrapper(WxPayRecordBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WxPayRecord> lqw = Wrappers.lambdaQuery();
......@@ -67,8 +167,8 @@ public class WxPayRecordServiceImpl implements IWxPayRecordService {
lqw.like(StringUtils.isNotBlank(bo.getProprietorName()), WxPayRecord::getProprietorName, bo.getProprietorName());
lqw.eq(StringUtils.isNotBlank(bo.getRoom()), WxPayRecord::getRoom, bo.getRoom());
lqw.eq(StringUtils.isNotBlank(bo.getPlateNumber()), WxPayRecord::getPlateNumber, bo.getPlateNumber());
lqw.eq(bo.getBillId() != null, WxPayRecord::getBillId, bo.getBillId());
lqw.eq(StringUtils.isNotBlank(bo.getOrderType()), WxPayRecord::getOrderType, bo.getOrderType());
lqw.eq(bo.getOrderId() != null, WxPayRecord::getOrderId, bo.getOrderId());
lqw.eq(bo.getOrderType() != null, WxPayRecord::getOrderType, bo.getOrderType());
lqw.eq(StringUtils.isNotBlank(bo.getPayChannelCode()), WxPayRecord::getPayChannelCode, bo.getPayChannelCode());
lqw.eq(StringUtils.isNotBlank(bo.getPayMchCode()), WxPayRecord::getPayMchCode, bo.getPayMchCode());
lqw.eq(StringUtils.isNotBlank(bo.getPayTradeType()), WxPayRecord::getPayTradeType, bo.getPayTradeType());
......
......@@ -13,7 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="proprietorName" column="proprietor_name"/>
<result property="room" column="room"/>
<result property="plateNumber" column="plate_number"/>
<result property="billId" column="bill_id"/>
<result property="orderId" column="order_id"/>
<result property="orderType" column="order_type"/>
<result property="payChannelCode" column="pay_channel_code"/>
<result property="payMchCode" column="pay_mch_code"/>
......
......@@ -6,8 +6,9 @@ package com.propertyManagement.common.enums;
* @author liushuai
*/
public enum PayState {
NO(1, "支付成功"),
YES(2, "支付失败");
WAIT(0, "待支付"),
YES(1, "支付成功"),
NO(2, "支付失败");
private final Integer code;
......
......@@ -53,4 +53,7 @@ public interface IPayMerchantService {
* 校验并批量删除支付商户信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
void syncEdit(CmsPayMerchantBo bo);
}
package com.propertyManagement.pay.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.propertyManagement.common.enums.IsEnableType;
import com.propertyManagement.common.utils.StringUtils;
import com.propertyManagement.common.core.page.TableDataInfo;
......@@ -8,6 +9,8 @@ import com.propertyManagement.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.propertyManagement.pay.domain.CmsPayApp;
import com.propertyManagement.pay.mapper.PayAppMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.propertyManagement.pay.domain.bo.CmsPayMerchantBo;
......@@ -31,6 +34,7 @@ import java.util.Collection;
public class PayMerchantServiceImpl implements IPayMerchantService {
private final PayMerchantMapper baseMapper;
private final PayAppMapper payAppMapper;
/**
* 查询支付商户
......@@ -131,4 +135,17 @@ public class PayMerchantServiceImpl implements IPayMerchantService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* @param cmsPayMerchant
*/
@Override
public void syncEdit(CmsPayMerchantBo cmsPayMerchant) {
updateByBo(cmsPayMerchant);
LambdaUpdateWrapper<CmsPayApp> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(CmsPayApp::getAppConfig,cmsPayMerchant.getMerchantConfig());
wrapper.eq(CmsPayApp::getMerchantCode,cmsPayMerchant.getMerchantCode());
payAppMapper.update(wrapper);
}
}
......@@ -33,7 +33,7 @@
<el-form-item label="订单类型" prop="orderType">
<el-select v-model="queryParams.orderType" placeholder="请选择订单类型" clearable>
<el-option
v-for="dict in dict.type.wx_live_bill_type"
v-for="dict in dict.type.wx_pay_record_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
......@@ -43,7 +43,7 @@
<el-form-item label="支付状态" prop="payState">
<el-select v-model="queryParams.payState" placeholder="请选择支付状态" clearable>
<el-option
v-for="dict in dict.type.wx_pay_record"
v-for="dict in dict.type.wx_pay_record_state"
:key="dict.value"
:label="dict.label"
:value="dict.value"
......@@ -131,7 +131,7 @@
<el-table-column label="订单金额" align="center" prop="payAmount" />
<el-table-column label="支付状态" align="center" prop="payState">
<template slot-scope="scope">
<dict-tag :options="dict.type.wx_pay_record" :value="scope.row.payState"/>
<dict-tag :options="dict.type.wx_pay_record_state" :value="scope.row.payState"/>
</template>
</el-table-column>
<el-table-column label="平台支付流水号" align="center" prop="outTradeNo" />
......@@ -191,7 +191,7 @@
<el-form-item label="订单类型" prop="orderType">
<el-select v-model="form.orderType" placeholder="请选择订单类型">
<el-option
v-for="dict in dict.type.wx_live_bill_type"
v-for="dict in dict.type.wx_pay_record_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
......@@ -216,7 +216,7 @@
<el-form-item label="支付状态" prop="payState">
<el-select v-model="form.payState" placeholder="请选择支付状态">
<el-option
v-for="dict in dict.type.wx_pay_record"
v-for="dict in dict.type.wx_pay_record_state"
:key="dict.value"
:label="dict.label"
:value="dict.value"
......@@ -244,7 +244,7 @@ import {listCommunityAll} from "@/api/business/community";
export default {
name: "PayRecord",
dicts: ['wx_pay_record', 'wx_live_bill_type'],
dicts: ['wx_pay_record_state', 'wx_pay_record_type'],
data() {
return {
// 按钮loading
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment