Commit 87d8b55b418fc0e08be8c2ce5f8b35d2f436231f

Authored by ouyang
2 parents 461c6a00 38f1d642

Merge branch 'pay_extension' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension

Showing 25 changed files with 1258 additions and 0 deletions
sql/pay-merchant-menu.sql 0 → 100644
  1 +-- 支付模块-商户中心-菜单SQL
  2 +-- 菜单 SQL
  3 +INSERT INTO `sys_menu` (
  4 + `name`, `permission`,`menu_type`,`sort`, `parent_id`, `path`, `icon`, `component`,
  5 + `status`, `creator`,`create_time`, `updater`, `update_time`, `deleted`
  6 +) VALUES ('支付管理', '', 1, 4,0, '/pay','pay', NULL, 0, '1', '2021-11-03 10:35:04', '1', '2021-11-03 10:35:04', b'0');
  7 +
  8 +INSERT INTO `sys_menu`(
  9 + `name`, `permission`, `menu_type`, `sort`, `parent_id`,
  10 + `path`, `icon`, `component`, `status`
  11 +)
  12 +VALUES (
  13 + '支付商户信息管理', '', 2, 0, ${table.parentMenuId},
  14 + 'merchant', '', 'pay/merchant/index', 0
  15 +);
  16 +
  17 +-- 按钮父菜单ID
  18 +SELECT @parentId := LAST_INSERT_ID();
  19 +
  20 +-- 按钮 SQL
  21 +INSERT INTO `sys_menu`(
  22 + `name`, `permission`, `menu_type`, `sort`, `parent_id`,
  23 + `path`, `icon`, `component`, `status`
  24 +)
  25 +VALUES (
  26 + '支付商户信息查询', 'pay:merchant:query', 3, 1, @parentId,
  27 + '', '', '', 0
  28 +);
  29 +INSERT INTO `sys_menu`(
  30 + `name`, `permission`, `menu_type`, `sort`, `parent_id`,
  31 + `path`, `icon`, `component`, `status`
  32 +)
  33 +VALUES (
  34 + '支付商户信息创建', 'pay:merchant:create', 3, 2, @parentId,
  35 + '', '', '', 0
  36 +);
  37 +INSERT INTO `sys_menu`(
  38 + `name`, `permission`, `menu_type`, `sort`, `parent_id`,
  39 + `path`, `icon`, `component`, `status`
  40 +)
  41 +VALUES (
  42 + '支付商户信息更新', 'pay:merchant:update', 3, 3, @parentId,
  43 + '', '', '', 0
  44 +);
  45 +INSERT INTO `sys_menu`(
  46 + `name`, `permission`, `menu_type`, `sort`, `parent_id`,
  47 + `path`, `icon`, `component`, `status`
  48 +)
  49 +VALUES (
  50 + '支付商户信息删除', 'pay:merchant:delete', 3, 4, @parentId,
  51 + '', '', '', 0
  52 +);
  53 +INSERT INTO `sys_menu`(
  54 + `name`, `permission`, `menu_type`, `sort`, `parent_id`,
  55 + `path`, `icon`, `component`, `status`
  56 +)
  57 +VALUES (
  58 + '支付商户信息导出', 'pay:merchant:export', 3, 5, @parentId,
  59 + '', '', '', 0
  60 +);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/PayMerchantController.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.*;
  4 +import cn.iocoder.yudao.adminserver.modules.pay.convert.merchant.PayMerchantConvert;
  5 +import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService;
  6 +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserUpdateStatusReqVO;
  7 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  9 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  10 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  11 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  12 +import io.swagger.annotations.Api;
  13 +import io.swagger.annotations.ApiImplicitParam;
  14 +import io.swagger.annotations.ApiOperation;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
  16 +import org.springframework.validation.annotation.Validated;
  17 +import org.springframework.web.bind.annotation.*;
  18 +
  19 +import javax.annotation.Resource;
  20 +import javax.servlet.http.HttpServletResponse;
  21 +import javax.validation.Valid;
  22 +import java.io.IOException;
  23 +import java.util.Collection;
  24 +import java.util.List;
  25 +
  26 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  28 +
  29 +@Api(tags = "支付商户信息")
  30 +@RestController
  31 +@RequestMapping("/pay/merchant")
  32 +@Validated
  33 +public class PayMerchantController {
  34 +
  35 + @Resource
  36 + private PayMerchantService merchantService;
  37 +
  38 + @PostMapping("/create")
  39 + @ApiOperation("创建支付商户信息")
  40 + @PreAuthorize("@ss.hasPermission('pay:merchant:create')")
  41 + public CommonResult<Long> createMerchant(@Valid @RequestBody PayMerchantCreateReqVO createReqVO) {
  42 + return success(merchantService.createMerchant(createReqVO));
  43 + }
  44 +
  45 + @PutMapping("/update")
  46 + @ApiOperation("更新支付商户信息")
  47 + @PreAuthorize("@ss.hasPermission('pay:merchant:update')")
  48 + public CommonResult<Boolean> updateMerchant(@Valid @RequestBody PayMerchantUpdateReqVO updateReqVO) {
  49 + merchantService.updateMerchant(updateReqVO);
  50 + return success(true);
  51 + }
  52 +
  53 + @PutMapping("/update-status")
  54 + @ApiOperation("修改支付商户状态")
  55 + @PreAuthorize("@ss.hasPermission('pay:merchant:update')")
  56 + public CommonResult<Boolean> updateMerchantStatus(@Valid @RequestBody PayMerchantUpdateStatusReqVO reqVO) {
  57 + merchantService.updateMerchantStatus(reqVO.getId(), reqVO.getStatus());
  58 + return success(true);
  59 + }
  60 +
  61 + @DeleteMapping("/delete")
  62 + @ApiOperation("删除支付商户信息")
  63 + @ApiImplicitParam(name = "id", value = "编号", required = true)
  64 + @PreAuthorize("@ss.hasPermission('pay:merchant:delete')")
  65 + public CommonResult<Boolean> deleteMerchant(@RequestParam("id") Long id) {
  66 + merchantService.deleteMerchant(id);
  67 + return success(true);
  68 + }
  69 +
  70 + @GetMapping("/get")
  71 + @ApiOperation("获得支付商户信息")
  72 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  73 + @PreAuthorize("@ss.hasPermission('pay:merchant:query')")
  74 + public CommonResult<PayMerchantRespVO> getMerchant(@RequestParam("id") Long id) {
  75 + PayMerchantDO merchant = merchantService.getMerchant(id);
  76 + return success(PayMerchantConvert.INSTANCE.convert(merchant));
  77 + }
  78 +
  79 + @GetMapping("/list")
  80 + @ApiOperation("获得支付商户信息列表")
  81 + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
  82 + @PreAuthorize("@ss.hasPermission('pay:merchant:query')")
  83 + public CommonResult<List<PayMerchantRespVO>> getMerchantList(@RequestParam("ids") Collection<Long> ids) {
  84 + List<PayMerchantDO> list = merchantService.getMerchantList(ids);
  85 + return success(PayMerchantConvert.INSTANCE.convertList(list));
  86 + }
  87 +
  88 + @GetMapping("/page")
  89 + @ApiOperation("获得支付商户信息分页")
  90 + @PreAuthorize("@ss.hasPermission('pay:merchant:query')")
  91 + public CommonResult<PageResult<PayMerchantRespVO>> getMerchantPage(@Valid PayMerchantPageReqVO pageVO) {
  92 + PageResult<PayMerchantDO> pageResult = merchantService.getMerchantPage(pageVO);
  93 + return success(PayMerchantConvert.INSTANCE.convertPage(pageResult));
  94 + }
  95 +
  96 + @GetMapping("/export-excel")
  97 + @ApiOperation("导出支付商户信息 Excel")
  98 + @PreAuthorize("@ss.hasPermission('pay:merchant:export')")
  99 + @OperateLog(type = EXPORT)
  100 + public void exportMerchantExcel(@Valid PayMerchantExportReqVO exportReqVO,
  101 + HttpServletResponse response) throws IOException {
  102 + List<PayMerchantDO> list = merchantService.getMerchantList(exportReqVO);
  103 + // 导出 Excel
  104 + List<PayMerchantExcelVO> datas = PayMerchantConvert.INSTANCE.convertList02(list);
  105 + ExcelUtils.write(response, "支付商户信息.xls", "数据", PayMerchantExcelVO.class, datas);
  106 + }
  107 +
  108 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 +* 支付商户信息 Base VO,提供给添加、修改、详细的子 VO 使用
  10 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 +*/
  12 +@Data
  13 +public class PayMerchantBaseVO {
  14 +
  15 + @ApiModelProperty(value = "商户号")
  16 + private String no;
  17 +
  18 + @ApiModelProperty(value = "商户全称", required = true)
  19 + @NotNull(message = "商户全称不能为空")
  20 + private String name;
  21 +
  22 + @ApiModelProperty(value = "商户简称", required = true)
  23 + @NotNull(message = "商户简称不能为空")
  24 + private String shortName;
  25 +
  26 + @ApiModelProperty(value = "开启状态", required = true)
  27 + @NotNull(message = "开启状态不能为空")
  28 + private Integer status;
  29 +
  30 + @ApiModelProperty(value = "备注")
  31 + private String remark;
  32 +
  33 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import javax.validation.constraints.*;
  7 +
  8 +@ApiModel("支付商户信息创建 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class PayMerchantCreateReqVO extends PayMerchantBaseVO {
  13 +
  14 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import lombok.*;
  6 +import java.util.*;
  7 +import io.swagger.annotations.*;
  8 +
  9 +import com.alibaba.excel.annotation.ExcelProperty;
  10 +
  11 +/**
  12 + * 支付商户信息 Excel VO
  13 + *
  14 + * @author 芋艿
  15 + */
  16 +@Data
  17 +public class PayMerchantExcelVO {
  18 +
  19 + @ExcelProperty("商户编号")
  20 + private Long id;
  21 +
  22 + @ExcelProperty("商户号")
  23 + private String no;
  24 +
  25 + @ExcelProperty("商户全称")
  26 + private String name;
  27 +
  28 + @ExcelProperty("商户简称")
  29 + private String shortName;
  30 +
  31 + @ExcelProperty(value = "开启状态",converter = DictConvert.class)
  32 + @DictFormat("pay_merchant_status")
  33 + private Integer status;
  34 +
  35 + @ExcelProperty("备注")
  36 + private String remark;
  37 +
  38 + @ExcelProperty("创建时间")
  39 + private Date createTime;
  40 +
  41 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantExportReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  7 +import org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +@ApiModel(value = "支付商户信息 Excel 导出 Request VO", description = "参数和 PayMerchantPageReqVO 是一致的")
  12 +@Data
  13 +public class PayMerchantExportReqVO {
  14 +
  15 + @ApiModelProperty(value = "商户号")
  16 + private String no;
  17 +
  18 + @ApiModelProperty(value = "商户全称")
  19 + private String name;
  20 +
  21 + @ApiModelProperty(value = "商户简称")
  22 + private String shortName;
  23 +
  24 + @ApiModelProperty(value = "开启状态")
  25 + private Integer status;
  26 +
  27 + @ApiModelProperty(value = "备注")
  28 + private String remark;
  29 +
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + @ApiModelProperty(value = "开始创建时间")
  32 + private Date beginCreateTime;
  33 +
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + @ApiModelProperty(value = "结束创建时间")
  36 + private Date endCreateTime;
  37 +
  38 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  7 +import org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +@ApiModel("支付商户信息分页 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class PayMerchantPageReqVO extends PageParam {
  16 +
  17 + @ApiModelProperty(value = "商户号")
  18 + private String no;
  19 +
  20 + @ApiModelProperty(value = "商户全称")
  21 + private String name;
  22 +
  23 + @ApiModelProperty(value = "商户简称")
  24 + private String shortName;
  25 +
  26 + @ApiModelProperty(value = "开启状态")
  27 + private Integer status;
  28 +
  29 + @ApiModelProperty(value = "备注")
  30 + private String remark;
  31 +
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + @ApiModelProperty(value = "开始创建时间")
  34 + private Date beginCreateTime;
  35 +
  36 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  37 + @ApiModelProperty(value = "结束创建时间")
  38 + private Date endCreateTime;
  39 +
  40 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +
  7 +@ApiModel("支付商户信息 Response VO")
  8 +@Data
  9 +@EqualsAndHashCode(callSuper = true)
  10 +@ToString(callSuper = true)
  11 +public class PayMerchantRespVO extends PayMerchantBaseVO {
  12 +
  13 + @ApiModelProperty(value = "商户编号", required = true)
  14 + private Long id;
  15 +
  16 + @ApiModelProperty(value = "创建时间", required = true)
  17 + private Date createTime;
  18 +
  19 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import javax.validation.constraints.*;
  7 +
  8 +@ApiModel("支付商户信息更新 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class PayMerchantUpdateReqVO extends PayMerchantBaseVO {
  13 +
  14 + @ApiModelProperty(value = "商户编号", required = true)
  15 + @NotNull(message = "商户编号不能为空")
  16 + private Long id;
  17 +
  18 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/controller/merchant/vo/PayMerchantUpdateStatusReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +
  9 +@ApiModel("商户更新状态 Request VO")
  10 +@Data
  11 +public class PayMerchantUpdateStatusReqVO {
  12 +
  13 + @ApiModelProperty(value = "商户编号", required = true, example = "1024")
  14 + @NotNull(message = "商户编号不能为空")
  15 + private Long id;
  16 +
  17 + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
  18 + @NotNull(message = "状态不能为空")
  19 + private Integer status;
  20 +
  21 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/merchant/PayMerchantConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.convert.merchant;
  2 +
  3 +import java.util.*;
  4 +
  5 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.*;
  11 +
  12 +/**
  13 + * 支付商户信息 Convert
  14 + *
  15 + * @author 芋艿
  16 + */
  17 +@Mapper
  18 +public interface PayMerchantConvert {
  19 +
  20 + PayMerchantConvert INSTANCE = Mappers.getMapper(PayMerchantConvert.class);
  21 +
  22 + PayMerchantDO convert(PayMerchantCreateReqVO bean);
  23 +
  24 + PayMerchantDO convert(PayMerchantUpdateReqVO bean);
  25 +
  26 + PayMerchantRespVO convert(PayMerchantDO bean);
  27 +
  28 + List<PayMerchantRespVO> convertList(List<PayMerchantDO> list);
  29 +
  30 + PageResult<PayMerchantRespVO> convertPage(PageResult<PayMerchantDO> page);
  31 +
  32 + List<PayMerchantExcelVO> convertList02(List<PayMerchantDO> list);
  33 +
  34 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/mysql/merchant/PayMerchantMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant;
  2 +
  3 +import java.util.*;
  4 +
  5 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
  8 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.*;
  11 +
  12 +/**
  13 + * 支付商户信息 Mapper
  14 + *
  15 + * @author 芋艿
  16 + */
  17 +@Mapper
  18 +public interface PayMerchantMapper extends BaseMapperX<PayMerchantDO> {
  19 +
  20 + default PageResult<PayMerchantDO> selectPage(PayMerchantPageReqVO reqVO) {
  21 + return selectPage(reqVO, new QueryWrapperX<PayMerchantDO>()
  22 + .likeIfPresent("no", reqVO.getNo())
  23 + .likeIfPresent("name", reqVO.getName())
  24 + .likeIfPresent("short_name", reqVO.getShortName())
  25 + .eqIfPresent("status", reqVO.getStatus())
  26 + .eqIfPresent("remark", reqVO.getRemark())
  27 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  28 + .orderByDesc("id"));
  29 + }
  30 +
  31 + default List<PayMerchantDO> selectList(PayMerchantExportReqVO reqVO) {
  32 + return selectList(new QueryWrapperX<PayMerchantDO>()
  33 + .likeIfPresent("no", reqVO.getNo())
  34 + .likeIfPresent("name", reqVO.getName())
  35 + .likeIfPresent("short_name", reqVO.getShortName())
  36 + .eqIfPresent("status", reqVO.getStatus())
  37 + .eqIfPresent("remark", reqVO.getRemark())
  38 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  39 + .orderByDesc("id"));
  40 + }
  41 +
  42 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.enums;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/PayMerchantService.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.service.merchant;
  2 +
  3 +import java.util.*;
  4 +import javax.validation.*;
  5 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.*;
  6 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +
  9 +/**
  10 + * 支付商户信息 Service 接口
  11 + *
  12 + * @author 芋艿
  13 + */
  14 +public interface PayMerchantService {
  15 +
  16 + /**
  17 + * 创建支付商户信息
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createMerchant(@Valid PayMerchantCreateReqVO createReqVO);
  23 +
  24 + /**
  25 + * 更新支付商户信息
  26 + *
  27 + * @param updateReqVO 更新信息
  28 + */
  29 + void updateMerchant(@Valid PayMerchantUpdateReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除支付商户信息
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteMerchant(Long id);
  37 +
  38 + /**
  39 + * 获得支付商户信息
  40 + *
  41 + * @param id 编号
  42 + * @return 支付商户信息
  43 + */
  44 + PayMerchantDO getMerchant(Long id);
  45 +
  46 + /**
  47 + * 获得支付商户信息列表
  48 + *
  49 + * @param ids 编号
  50 + * @return 支付商户信息列表
  51 + */
  52 + List<PayMerchantDO> getMerchantList(Collection<Long> ids);
  53 +
  54 + /**
  55 + * 获得支付商户信息分页
  56 + *
  57 + * @param pageReqVO 分页查询
  58 + * @return 支付商户信息分页
  59 + */
  60 + PageResult<PayMerchantDO> getMerchantPage(PayMerchantPageReqVO pageReqVO);
  61 +
  62 + /**
  63 + * 获得支付商户信息列表, 用于 Excel 导出
  64 + *
  65 + * @param exportReqVO 查询条件
  66 + * @return 支付商户信息列表
  67 + */
  68 + List<PayMerchantDO> getMerchantList(PayMerchantExportReqVO exportReqVO);
  69 +
  70 + /**
  71 + * 修改商户状态
  72 + * @param id 商户编号
  73 + * @param status 状态
  74 + */
  75 + void updateMerchantStatus(Long id, Integer status);
  76 +
  77 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/service/merchant/impl/PayMerchantServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.service.merchant.impl;
  2 +
  3 +import cn.hutool.core.date.DateUtil;
  4 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantCreateReqVO;
  5 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantExportReqVO;
  6 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantPageReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantUpdateReqVO;
  8 +import cn.iocoder.yudao.adminserver.modules.pay.convert.merchant.PayMerchantConvert;
  9 +import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant.PayMerchantMapper;
  10 +import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.PayMerchantService;
  11 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  14 +import com.google.common.annotations.VisibleForTesting;
  15 +import org.springframework.stereotype.Service;
  16 +import org.springframework.validation.annotation.Validated;
  17 +
  18 +import javax.annotation.Resource;
  19 +import java.time.LocalDateTime;
  20 +import java.util.Collection;
  21 +import java.util.List;
  22 +
  23 +import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.*;
  24 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  25 +/**
  26 + * 支付商户信息 Service 实现类
  27 + *
  28 + * @author 芋艿
  29 + */
  30 +@Service
  31 +@Validated
  32 +public class PayMerchantServiceImpl implements PayMerchantService {
  33 +
  34 + @Resource
  35 + private PayMerchantMapper merchantMapper;
  36 +
  37 + @Override
  38 + public Long createMerchant(PayMerchantCreateReqVO createReqVO) {
  39 + // 插入
  40 + PayMerchantDO merchant = PayMerchantConvert.INSTANCE.convert(createReqVO);
  41 + // 根据 年月日时分秒毫秒 生成时间戳
  42 + String merchantNo = "M" + DateUtil.format(LocalDateTime.now(),"yyyyMMddHHmmssSSS");
  43 + merchant.setNo(merchantNo);
  44 + merchantMapper.insert(merchant);
  45 + // 返回
  46 + return merchant.getId();
  47 + }
  48 +
  49 + @Override
  50 + public void updateMerchant(PayMerchantUpdateReqVO updateReqVO) {
  51 + // 校验存在
  52 + this.validateMerchantExists(updateReqVO.getId());
  53 + // 更新
  54 + PayMerchantDO updateObj = PayMerchantConvert.INSTANCE.convert(updateReqVO);
  55 + merchantMapper.updateById(updateObj);
  56 + }
  57 +
  58 + @Override
  59 + public void deleteMerchant(Long id) {
  60 + // 校验存在
  61 + this.validateMerchantExists(id);
  62 + // 删除
  63 + merchantMapper.deleteById(id);
  64 + }
  65 +
  66 + private void validateMerchantExists(Long id) {
  67 + if (merchantMapper.selectById(id) == null) {
  68 + throw exception(MERCHANT_NOT_EXISTS);
  69 + }
  70 + }
  71 +
  72 + @Override
  73 + public PayMerchantDO getMerchant(Long id) {
  74 + return merchantMapper.selectById(id);
  75 + }
  76 +
  77 + @Override
  78 + public List<PayMerchantDO> getMerchantList(Collection<Long> ids) {
  79 + return merchantMapper.selectBatchIds(ids);
  80 + }
  81 +
  82 + @Override
  83 + public PageResult<PayMerchantDO> getMerchantPage(PayMerchantPageReqVO pageReqVO) {
  84 + return merchantMapper.selectPage(pageReqVO);
  85 + }
  86 +
  87 + @Override
  88 + public List<PayMerchantDO> getMerchantList(PayMerchantExportReqVO exportReqVO) {
  89 + return merchantMapper.selectList(exportReqVO);
  90 + }
  91 +
  92 + /**
  93 + * 修改商户状态
  94 + *
  95 + * @param id 商户编号
  96 + * @param status 状态
  97 + */
  98 + @Override
  99 + public void updateMerchantStatus(Long id, Integer status) {
  100 + // 校验商户存在
  101 + this.checkMerchantExists(id);
  102 + // 更新状态
  103 + PayMerchantDO merchant = new PayMerchantDO();
  104 + merchant.setId(id);
  105 + merchant.setStatus(status);
  106 + merchantMapper.updateById(merchant);
  107 + }
  108 +
  109 + /**
  110 + * 检查商户是否存在
  111 + * @param id 商户编号
  112 + */
  113 + @VisibleForTesting
  114 + public void checkMerchantExists(Long id) {
  115 + if (id == null) {
  116 + return;
  117 + }
  118 + PayMerchantDO merchant = merchantMapper.selectById(id);
  119 + if (merchant == null) {
  120 + throw exception(MERCHANT_NOT_EXISTS);
  121 + }
  122 + }
  123 +
  124 +
  125 +}
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/pay/merchant/service/PayMerchantServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.pay.merchant.service;
  2 +
  3 +import cn.hutool.core.util.RandomUtil;
  4 +import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantCreateReqVO;
  6 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantExportReqVO;
  7 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantPageReqVO;
  8 +import cn.iocoder.yudao.adminserver.modules.pay.controller.merchant.vo.PayMerchantUpdateReqVO;
  9 +import cn.iocoder.yudao.adminserver.modules.pay.dal.mysql.merchant.PayMerchantMapper;
  10 +import cn.iocoder.yudao.adminserver.modules.pay.service.merchant.impl.PayMerchantServiceImpl;
  11 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayMerchantDO;
  12 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  14 +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  15 +import org.junit.jupiter.api.Test;
  16 +import org.springframework.context.annotation.Import;
  17 +
  18 +import javax.annotation.Resource;
  19 +import java.util.List;
  20 +
  21 +import static cn.iocoder.yudao.coreservice.modules.pay.enums.PayErrorCodeCoreConstants.MERCHANT_NOT_EXISTS;
  22 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  23 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  24 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
  25 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  26 +import static org.junit.jupiter.api.Assertions.*;
  27 +
  28 +/**
  29 +* {@link PayMerchantServiceImpl} 的单元测试类
  30 +*
  31 +* @author 芋艿
  32 +*/
  33 +@Import(PayMerchantServiceImpl.class)
  34 +public class PayMerchantServiceTest extends BaseDbUnitTest {
  35 +
  36 + @Resource
  37 + private PayMerchantServiceImpl merchantService;
  38 +
  39 + @Resource
  40 + private PayMerchantMapper merchantMapper;
  41 +
  42 + @Test
  43 + public void testCreateMerchant_success() {
  44 + // 准备参数
  45 + PayMerchantCreateReqVO reqVO = randomPojo(PayMerchantCreateReqVO.class,o ->
  46 + o.setStatus(RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()));
  47 +
  48 + // 调用
  49 + Long merchantId = merchantService.createMerchant(reqVO);
  50 + // 断言
  51 + assertNotNull(merchantId);
  52 + // 校验记录的属性是否正确
  53 + PayMerchantDO merchant = merchantMapper.selectById(merchantId);
  54 + assertPojoEquals(reqVO, merchant,"no");
  55 + }
  56 +
  57 + @Test
  58 + public void testUpdateMerchant_success() {
  59 + // mock 数据
  60 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o ->
  61 + o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
  62 + merchantMapper.insert(dbMerchant);// @Sql: 先插入出一条存在的数据
  63 + // 准备参数
  64 + PayMerchantUpdateReqVO reqVO = randomPojo(PayMerchantUpdateReqVO.class, o -> {
  65 + o.setId(dbMerchant.getId()); // 设置更新的 ID
  66 + o.setStatus(CommonStatusEnum.DISABLE.getStatus());
  67 + });
  68 +
  69 + // 调用
  70 + merchantService.updateMerchant(reqVO);
  71 + // 校验是否更新正确
  72 + PayMerchantDO merchant = merchantMapper.selectById(reqVO.getId()); // 获取最新的
  73 + assertPojoEquals(reqVO, merchant);
  74 + }
  75 +
  76 + @Test
  77 + public void testUpdateMerchant_notExists() {
  78 + // 准备参数
  79 + PayMerchantUpdateReqVO reqVO = randomPojo(PayMerchantUpdateReqVO.class);
  80 +
  81 + // 调用, 并断言异常
  82 + assertServiceException(() -> merchantService.updateMerchant(reqVO), MERCHANT_NOT_EXISTS);
  83 + }
  84 +
  85 + @Test
  86 + public void testDeleteMerchant_success() {
  87 + // mock 数据
  88 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class,
  89 + o-> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
  90 + merchantMapper.insert(dbMerchant);// @Sql: 先插入出一条存在的数据
  91 + // 准备参数
  92 + Long id = dbMerchant.getId();
  93 +
  94 + // 调用
  95 + merchantService.deleteMerchant(id);
  96 + // 校验数据不存在了
  97 + assertNull(merchantMapper.selectById(id));
  98 + }
  99 +
  100 + @Test
  101 + public void testDeleteMerchant_notExists() {
  102 + // 准备参数
  103 + Long id = randomLongId();
  104 +
  105 + // 调用, 并断言异常
  106 + assertServiceException(() -> merchantService.deleteMerchant(id), MERCHANT_NOT_EXISTS);
  107 + }
  108 +
  109 + @Test
  110 + public void testGetMerchantPage() {
  111 + // mock 数据
  112 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> { // 等会查询到
  113 + o.setNo("M1008611");
  114 + o.setName("灿哥的杂货铺");
  115 + o.setShortName("灿灿子");
  116 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  117 + o.setRemark("灿哥的杂货铺");
  118 + o.setCreateTime(buildTime(2021,11,3));
  119 + });
  120 + merchantMapper.insert(dbMerchant);
  121 + // 测试 no 不匹配
  122 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setNo("M200000")));
  123 + // 测试 name 不匹配
  124 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setName("斌哥的杂货铺")));
  125 + // 测试 shortName 不匹配
  126 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setShortName("斌斌子")));
  127 + // 测试 status 不匹配
  128 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
  129 + // 测试 remark 不匹配
  130 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setRemark("斌哥的杂货铺")));
  131 + // 测试 createTime 不匹配
  132 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setCreateTime(buildTime(2022,12,4))));
  133 + // 准备参数
  134 + PayMerchantPageReqVO reqVO = new PayMerchantPageReqVO();
  135 + reqVO.setNo("M1008611");
  136 + reqVO.setName("灿哥的杂货铺");
  137 + reqVO.setShortName("灿灿子");
  138 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  139 + reqVO.setRemark("灿哥的杂货铺");
  140 + reqVO.setBeginCreateTime(buildTime(2021,11,2));
  141 + reqVO.setEndCreateTime(buildTime(2021,11,4));
  142 +
  143 + // 调用
  144 + PageResult<PayMerchantDO> pageResult = merchantService.getMerchantPage(reqVO);
  145 + // 断言
  146 + assertEquals(1, pageResult.getTotal());
  147 + assertEquals(1, pageResult.getList().size());
  148 + assertPojoEquals(dbMerchant, pageResult.getList().get(0));
  149 + }
  150 +
  151 + @Test
  152 + public void testGetMerchantList() {
  153 + // mock 数据
  154 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> { // 等会查询到
  155 + o.setNo("M1008611");
  156 + o.setName("灿哥的杂货铺");
  157 + o.setShortName("灿灿子");
  158 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  159 + o.setRemark("灿哥的杂货铺");
  160 + o.setCreateTime(buildTime(2021,11,3));
  161 + });
  162 + merchantMapper.insert(dbMerchant);
  163 + // 测试 no 不匹配
  164 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setNo("M200000")));
  165 + // 测试 name 不匹配
  166 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setName("斌哥的杂货铺")));
  167 + // 测试 shortName 不匹配
  168 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setShortName("斌斌子")));
  169 + // 测试 status 不匹配
  170 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
  171 + // 测试 remark 不匹配
  172 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setRemark("斌哥的杂货铺")));
  173 + // 测试 createTime 不匹配
  174 + merchantMapper.insert(ObjectUtils.clone(dbMerchant, o -> o.setCreateTime(buildTime(2022,12,4))));
  175 + // 准备参数
  176 + PayMerchantExportReqVO reqVO = new PayMerchantExportReqVO();
  177 + reqVO.setNo("M1008611");
  178 + reqVO.setName("灿哥的杂货铺");
  179 + reqVO.setShortName("灿灿子");
  180 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  181 + reqVO.setRemark("灿哥的杂货铺");
  182 + reqVO.setBeginCreateTime(buildTime(2021,11,2));
  183 + reqVO.setEndCreateTime(buildTime(2021,11,4));
  184 +
  185 + // 调用
  186 + List<PayMerchantDO> list = merchantService.getMerchantList(reqVO);
  187 + // 断言
  188 + assertEquals(1, list.size());
  189 + assertPojoEquals(dbMerchant, list.get(0));
  190 + }
  191 +
  192 +}
... ...
yudao-admin-server/src/test/resources/sql/clean.sql
... ... @@ -24,3 +24,6 @@ DELETE FROM &quot;sys_sms_template&quot;;
24 24 DELETE FROM "sys_sms_log";
25 25 DELETE FROM "sys_error_code";
26 26 DELETE FROM "sys_social_user";
  27 +
  28 +-- pay 开头的 DB
  29 +DELETE FROM pay_merchant;
... ...
yudao-admin-server/src/test/resources/sql/create_tables.sql
... ... @@ -449,3 +449,18 @@ CREATE TABLE IF NOT EXISTS &quot;sys_social_user&quot; (
449 449 "deleted" bit NOT NULL DEFAULT FALSE,
450 450 PRIMARY KEY ("id")
451 451 ) COMMENT '社交用户';
  452 +
  453 +CREATE TABLE IF NOT EXISTS "pay_merchant" (
  454 + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  455 + "no" varchar(32) NOT NULL,
  456 + "name" varchar(64) NOT NULL,
  457 + "short_name" varchar(64) NOT NULL,
  458 + "status" tinyint NOT NULL,
  459 + "remark" varchar(255) DEFAULT NULL,
  460 + "creator" varchar(64) DEFAULT '',
  461 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  462 + "updater" varchar(64) DEFAULT '',
  463 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  464 + "deleted" bit(1) NOT NULL DEFAULT FALSE,
  465 + PRIMARY KEY ("id")
  466 +) COMMENT '支付商户信息';
... ...
yudao-admin-ui/src/api/pay/merchant.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 创建支付商户信息
  4 +export function createMerchant(data) {
  5 + return request({
  6 + url: '/pay/merchant/create',
  7 + method: 'post',
  8 + data: data
  9 + })
  10 +}
  11 +
  12 +// 更新支付商户信息
  13 +export function updateMerchant(data) {
  14 + return request({
  15 + url: '/pay/merchant/update',
  16 + method: 'put',
  17 + data: data
  18 + })
  19 +}
  20 +
  21 +// 支付商户状态修改
  22 +export function changeMerchantStatus(id, status) {
  23 + const data = {
  24 + id,
  25 + status
  26 + }
  27 + return request({
  28 + url: '/pay/merchant/update-status',
  29 + method: 'put',
  30 + data: data
  31 + })
  32 +}
  33 +
  34 +// 删除支付商户信息
  35 +export function deleteMerchant(id) {
  36 + return request({
  37 + url: '/pay/merchant/delete?id=' + id,
  38 + method: 'delete'
  39 + })
  40 +}
  41 +
  42 +// 获得支付商户信息
  43 +export function getMerchant(id) {
  44 + return request({
  45 + url: '/pay/merchant/get?id=' + id,
  46 + method: 'get'
  47 + })
  48 +}
  49 +
  50 +// 获得支付商户信息分页
  51 +export function getMerchantPage(query) {
  52 + return request({
  53 + url: '/pay/merchant/page',
  54 + method: 'get',
  55 + params: query
  56 + })
  57 +}
  58 +
  59 +// 导出支付商户信息 Excel
  60 +export function exportMerchantExcel(query) {
  61 + return request({
  62 + url: '/pay/merchant/export-excel',
  63 + method: 'get',
  64 + params: query,
  65 + responseType: 'blob'
  66 + })
  67 +}
... ...
yudao-admin-ui/src/assets/icons/svg/merchant.svg 0 → 100644
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1635907181185" class="icon" viewBox="0 0 1184 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3259" xmlns:xlink="http://www.w3.org/1999/xlink" width="231.25" height="200"><defs><style type="text/css">@font-face { font-family: element-icons; src: url("chrome-extension://moombeodfomdpjnpocobemoiaemednkg/fonts/element-icons.woff") format("woff"), url("chrome-extension://moombeodfomdpjnpocobemoiaemednkg/fonts/element-icons.ttf ") format("truetype"); }
  2 +</style></defs><path d="M1005.633722 616.006249c-5.311502-0.479955-10.431022-1.27988-15.518545-2.143799-1.087898-0.127988-2.271787-0.287973-3.359685-0.479955-2.399775-0.415961-4.671562-1.055901-7.007343-1.631847-9.951067-2.143799-19.678155-4.831547-28.989282-8.351217l0 133.235509-731.355435 0 0-133.235509c-9.375121 3.551667-19.006218 6.303409-29.053276 8.511202-2.335781 0.415961-4.607568 1.055901-6.943349 1.535856-1.087898 0.191982-2.175796 0.31997-3.359685 0.511952-5.11952 0.767928-10.271037 1.535856-15.518545 2.079805-5.983439 0.479955-12.094866 0.863919-18.270287 0.863919-12.47883 0-24.701684-1.215886-36.540574-3.327688l0 357.310502c0 29.309252 24.573696 53.11502 54.874855 53.11502l841.073149 0c30.237165 0 54.810861-23.773771 54.810861-53.11502l0-357.342499c-11.83889 2.143799-24.061744 3.327688-36.540574 3.327688-6.07943 0-12.254851-0.351967-18.23829-0.863919z" p-id="3260"></path><path d="M182.83086 109.749711l804.500578 0c30.301159 0 54.874855-24.573696 54.874855-54.874855s-24.573696-54.874855-54.874855-54.874855l-804.500578 0c-30.301159 0-54.874855 24.573696-54.874855 54.874855 0.031997 30.301159 24.605693 54.874855 54.874855 54.874855z" p-id="3261"></path><path d="M1067.387932 164.592569l-964.549573 0-102.838359 256.007999c0 80.728432 65.529857 146.258288 146.258288 146.258288s146.258288-65.529857 146.258288-146.258288c0 80.728432 65.529857 146.258288 146.258288 146.258288s146.258288-65.529857 146.258288-146.258288c0 80.728432 65.529857 146.258288 146.258288 146.258288s146.258288-65.529857 146.258288-146.258288c0 80.728432 65.529857 146.258288 146.258288 146.258288s146.258288-65.529857 146.258288-146.258288l-102.806362-256.007999z" p-id="3262"></path></svg>
0 3 \ No newline at end of file
... ...
yudao-admin-ui/src/assets/icons/svg/pay.svg 0 → 100644
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1635906769564" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2420" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: element-icons; src: url("chrome-extension://moombeodfomdpjnpocobemoiaemednkg/fonts/element-icons.woff") format("woff"), url("chrome-extension://moombeodfomdpjnpocobemoiaemednkg/fonts/element-icons.ttf ") format("truetype"); }
  2 +</style></defs><path d="M512 0C230.4 0 0 230.4 0 512s230.4 512 512 512 512-230.4 512-512S793.6 0 512 0z m0 921.6c-225.28 0-409.6-184.32-409.6-409.6s184.32-409.6 409.6-409.6 409.6 184.32 409.6 409.6-184.32 409.6-409.6 409.6z" p-id="2421"></path><path d="M665.6 537.6h-102.4v-51.2h102.4c25.6 0 51.2-25.6 51.2-51.2s-25.6-51.2-51.2-51.2h-30.72l20.48-20.48c20.48-20.48 20.48-51.2 0-71.68s-51.2-20.48-71.68 0L512 363.52 440.32 296.96c-20.48-20.48-51.2-20.48-71.68 0s-20.48 51.2 0 71.68l20.48 20.48H358.4c-25.6 0-51.2 25.6-51.2 51.2s25.6 51.2 51.2 51.2h102.4v51.2H358.4c-25.6 0-51.2 25.6-51.2 51.2s25.6 51.2 51.2 51.2h102.4v56.32c0 25.6 20.48 46.08 46.08 46.08h10.24c25.6 0 46.08-20.48 46.08-46.08v-56.32h102.4c25.6 0 51.2-25.6 51.2-51.2s-25.6-56.32-51.2-56.32z" p-id="2422"></path></svg>
0 3 \ No newline at end of file
... ...
yudao-admin-ui/src/utils/dict.js
... ... @@ -30,6 +30,9 @@ export const DICT_TYPE = {
30 30 INF_API_ERROR_LOG_PROCESS_STATUS: 'inf_api_error_log_process_status',
31 31  
32 32 TOOL_CODEGEN_TEMPLATE_TYPE: 'tool_codegen_template_type',
  33 +
  34 + // 商户状态
  35 + PAY_MERCHANT_STATUS: 'pay_merchant_status'
33 36 }
34 37  
35 38 /**
... ...
yudao-admin-ui/src/views/pay/merchant/index.vue 0 → 100644
  1 +<template>
  2 + <div class="app-container">
  3 +
  4 + <!-- 搜索工作栏 -->
  5 + <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  6 + <el-form-item label="商户号" prop="no">
  7 + <el-input v-model="queryParams.no" placeholder="请输入商户号" clearable size="small" @keyup.enter.native="handleQuery"/>
  8 + </el-form-item>
  9 + <el-form-item label="商户全称" prop="name">
  10 + <el-input v-model="queryParams.name" placeholder="请输入商户全称" clearable size="small" @keyup.enter.native="handleQuery"/>
  11 + </el-form-item>
  12 + <el-form-item label="商户简称" prop="shortName">
  13 + <el-input v-model="queryParams.shortName" placeholder="请输入商户简称" clearable size="small" @keyup.enter.native="handleQuery"/>
  14 + </el-form-item>
  15 + <el-form-item label="开启状态" prop="status">
  16 + <el-select v-model="queryParams.status" placeholder="请选择开启状态" clearable size="small">
  17 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
  18 + </el-select>
  19 + </el-form-item>
  20 + <el-form-item label="备注" prop="remark">
  21 + <el-input v-model="queryParams.remark" placeholder="请输入备注" clearable size="small" @keyup.enter.native="handleQuery"/>
  22 + </el-form-item>
  23 + <el-form-item label="创建时间">
  24 + <el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
  25 + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
  26 + </el-form-item>
  27 + <el-form-item>
  28 + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  29 + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  30 + </el-form-item>
  31 + </el-form>
  32 +
  33 + <!-- 操作工具栏 -->
  34 + <el-row :gutter="10" class="mb8">
  35 + <el-col :span="1.5">
  36 + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
  37 + v-hasPermi="['pay:merchant:create']">新增</el-button>
  38 + </el-col>
  39 + <el-col :span="1.5">
  40 + <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
  41 + v-hasPermi="['pay:merchant:export']">导出</el-button>
  42 + </el-col>
  43 + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  44 + </el-row>
  45 +
  46 + <!-- 列表 -->
  47 + <el-table v-loading="loading" :data="list">
  48 + <el-table-column label="商户编号" align="center" prop="id" />
  49 + <el-table-column label="商户号" align="center" prop="no" />
  50 + <el-table-column label="商户全称" align="center" prop="name" />
  51 + <el-table-column label="商户简称" align="center" prop="shortName" />
  52 + <el-table-column label="开启状态" align="center" prop="status" >
  53 + <template slot-scope="scope">
  54 + <el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)" />
  55 + </template>
  56 + </el-table-column>
  57 + <el-table-column label="备注" align="center" prop="remark" />
  58 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  59 + <template slot-scope="scope">
  60 + <span>{{ parseTime(scope.row.createTime) }}</span>
  61 + </template>
  62 + </el-table-column>
  63 + <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  64 + <template slot-scope="scope">
  65 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  66 + v-hasPermi="['pay:merchant:update']">修改</el-button>
  67 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  68 + v-hasPermi="['pay:merchant:delete']">删除</el-button>
  69 + </template>
  70 + </el-table-column>
  71 + </el-table>
  72 + <!-- 分页组件 -->
  73 + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  74 + @pagination="getList"/>
  75 +
  76 + <!-- 对话框(添加 / 修改) -->
  77 + <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  78 + <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  79 +<!-- <el-form-item label="商户号" prop="no">-->
  80 +<!-- <el-input v-model="form.no" placeholder="请输入商户号" />-->
  81 +<!-- </el-form-item>-->
  82 + <el-form-item label="商户全称" prop="name">
  83 + <el-input v-model="form.name" placeholder="请输入商户全称" />
  84 + </el-form-item>
  85 + <el-form-item label="商户简称" prop="shortName">
  86 + <el-input v-model="form.shortName" placeholder="请输入商户简称" />
  87 + </el-form-item>
  88 + <el-form-item label="开启状态" prop="status">
  89 + <el-radio-group v-model="form.status">
  90 + <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
  91 + {{dict.label}}</el-radio>
  92 + </el-radio-group>
  93 + </el-form-item>
  94 + <el-form-item label="备注" prop="remark">
  95 + <el-input v-model="form.remark" placeholder="请输入备注" />
  96 + </el-form-item>
  97 + </el-form>
  98 + <div slot="footer" class="dialog-footer">
  99 + <el-button type="primary" @click="submitForm">确 定</el-button>
  100 + <el-button @click="cancel">取 消</el-button>
  101 + </div>
  102 + </el-dialog>
  103 + </div>
  104 +</template>
  105 +
  106 +<script>
  107 +import {
  108 + createMerchant,
  109 + updateMerchant,
  110 + changeMerchantStatus,
  111 + deleteMerchant,
  112 + getMerchant,
  113 + getMerchantPage,
  114 + exportMerchantExcel
  115 +} from "@/api/pay/merchant";
  116 +import {DICT_TYPE, getDictDatas} from "@/utils/dict";
  117 +import {SysCommonStatusEnum} from "@/utils/constants";
  118 +
  119 +export default {
  120 + name: "Merchant",
  121 + components: {
  122 + },
  123 + data() {
  124 + return {
  125 + // 遮罩层
  126 + loading: true,
  127 + // 显示搜索条件
  128 + showSearch: true,
  129 + // 总条数
  130 + total: 0,
  131 + // 支付商户信息列表
  132 + list: [],
  133 + // 弹出层标题
  134 + title: "",
  135 + // 是否显示弹出层
  136 + open: false,
  137 + dateRangeCreateTime: [],
  138 + // 查询参数
  139 + queryParams: {
  140 + pageNo: 1,
  141 + pageSize: 10,
  142 + no: null,
  143 + name: null,
  144 + shortName: null,
  145 + status: null,
  146 + remark: null,
  147 + },
  148 + // 表单参数
  149 + form: {},
  150 + // 表单校验
  151 + rules: {
  152 + no: [{ required: true, message: "商户号不能为空", trigger: "blur" }],
  153 + name: [{ required: true, message: "商户全称不能为空", trigger: "blur" }],
  154 + shortName: [{ required: true, message: "商户简称不能为空", trigger: "blur" }],
  155 + status: [{ required: true, message: "开启状态不能为空", trigger: "blur" }],
  156 + },
  157 + // 数据字典
  158 + statusDictDatas: getDictDatas(DICT_TYPE.PAY_MERCHANT_STATUS)
  159 + };
  160 + },
  161 + created() {
  162 + this.getList();
  163 + },
  164 + methods: {
  165 + /** 查询列表 */
  166 + getList() {
  167 + this.loading = true;
  168 + // 处理查询参数
  169 + let params = {...this.queryParams};
  170 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
  171 + // 执行查询
  172 + getMerchantPage(params).then(response => {
  173 + this.list = response.data.list;
  174 + this.total = response.data.total;
  175 + this.loading = false;
  176 + });
  177 + },
  178 + /** 取消按钮 */
  179 + cancel() {
  180 + this.open = false;
  181 + this.reset();
  182 + },
  183 + /** 表单重置 */
  184 + reset() {
  185 + this.form = {
  186 + id: undefined,
  187 + no: undefined,
  188 + name: undefined,
  189 + shortName: undefined,
  190 + status: undefined,
  191 + remark: undefined,
  192 + };
  193 + this.resetForm("form");
  194 + },
  195 + /** 搜索按钮操作 */
  196 + handleQuery() {
  197 + this.queryParams.pageNo = 1;
  198 + this.getList();
  199 + },
  200 + /** 重置按钮操作 */
  201 + resetQuery() {
  202 + this.dateRangeCreateTime = [];
  203 + this.resetForm("queryForm");
  204 + this.handleQuery();
  205 + },
  206 + /** 新增按钮操作 */
  207 + handleAdd() {
  208 + this.reset();
  209 + this.open = true;
  210 + this.title = "添加支付商户信息";
  211 + },
  212 + /** 修改按钮操作 */
  213 + handleUpdate(row) {
  214 + this.reset();
  215 + const id = row.id;
  216 + getMerchant(id).then(response => {
  217 + this.form = response.data;
  218 + this.open = true;
  219 + this.title = "修改支付商户信息";
  220 + });
  221 + },
  222 + // 用户状态修改
  223 + handleStatusChange(row) {
  224 + let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
  225 + this.$confirm('确认要"' + text + '""' + row.name + '"商户吗?', "警告", {
  226 + confirmButtonText: "确定",
  227 + cancelButtonText: "取消",
  228 + type: "warning"
  229 + }).then(function() {
  230 + return changeMerchantStatus(row.id, row.status);
  231 + }).then(() => {
  232 + this.msgSuccess(text + "成功");
  233 + }).catch(function() {
  234 + row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
  235 + : SysCommonStatusEnum.ENABLE;
  236 + });
  237 + },
  238 + /** 提交按钮 */
  239 + submitForm() {
  240 + this.$refs["form"].validate(valid => {
  241 + if (!valid) {
  242 + return;
  243 + }
  244 + // 修改的提交
  245 + if (this.form.id != null) {
  246 + updateMerchant(this.form).then(response => {
  247 + this.msgSuccess("修改成功");
  248 + this.open = false;
  249 + this.getList();
  250 + });
  251 + return;
  252 + }
  253 + // 添加的提交
  254 + createMerchant(this.form).then(response => {
  255 + this.msgSuccess("新增成功");
  256 + this.open = false;
  257 + this.getList();
  258 + });
  259 + });
  260 + },
  261 + /** 删除按钮操作 */
  262 + handleDelete(row) {
  263 + const id = row.id;
  264 + this.$confirm('是否确认删除支付商户信息编号为"' + id + '"的数据项?', "警告", {
  265 + confirmButtonText: "确定",
  266 + cancelButtonText: "取消",
  267 + type: "warning"
  268 + }).then(function() {
  269 + return deleteMerchant(id);
  270 + }).then(() => {
  271 + this.getList();
  272 + this.msgSuccess("删除成功");
  273 + })
  274 + },
  275 + /** 导出按钮操作 */
  276 + handleExport() {
  277 + // 处理查询参数
  278 + let params = {...this.queryParams};
  279 + params.pageNo = undefined;
  280 + params.pageSize = undefined;
  281 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
  282 + // 执行导出
  283 + this.$confirm('是否确认导出所有支付商户信息数据项?', "警告", {
  284 + confirmButtonText: "确定",
  285 + cancelButtonText: "取消",
  286 + type: "warning"
  287 + }).then(function() {
  288 + return exportMerchantExcel(params);
  289 + }).then(response => {
  290 + this.downloadExcel(response, '支付商户信息.xls');
  291 + })
  292 + }
  293 + }
  294 +};
  295 +</script>
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/merchant/PayMerchantDO.java
... ... @@ -2,6 +2,8 @@ package cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  5 +import com.baomidou.mybatisplus.annotation.FieldFill;
  6 +import com.baomidou.mybatisplus.annotation.TableField;
5 7 import com.baomidou.mybatisplus.annotation.TableId;
6 8 import com.baomidou.mybatisplus.annotation.TableName;
7 9 import lombok.*;
... ... @@ -29,7 +31,9 @@ public class PayMerchantDO extends BaseDO {
29 31 /**
30 32 * 商户号
31 33 * 例如说,M233666999
  34 + * 只有新增时插入,不允许修改
32 35 */
  36 + @TableField(fill = FieldFill.INSERT)
33 37 private String no;
34 38 /**
35 39 * 商户全称
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeCoreConstants.java
... ... @@ -28,4 +28,8 @@ public interface PayErrorCodeCoreConstants {
28 28 ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付");
29 29 ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007003002, "支付订单不处于已支付");
30 30  
  31 + /**
  32 + * ========== 支付商户信息 1-007-004-000 ==========
  33 + */
  34 + ErrorCode MERCHANT_NOT_EXISTS = new ErrorCode(1007004000, "支付商户信息不存在");
31 35 }
... ...