diff --git a/daxpay-open-server/src/main/resources/application-test.yml b/daxpay-open-server/src/main/resources/application-test.yml index e306f40d..23aecf06 100644 --- a/daxpay-open-server/src/main/resources/application-test.yml +++ b/daxpay-open-server/src/main/resources/application-test.yml @@ -6,7 +6,7 @@ spring: master: # Postgresql连接 driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/dax-pay-plus-test?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true + url: ${DB_URL} username: ${DB_USER} password: ${DB_PASSWORD} hikari: @@ -30,6 +30,12 @@ logging: springdoc: # 默认展开对象类型的属性, 主要用在get类型的参数中 default-flat-param-object: true +knife4j: + # 开启接口文档增强特性 + enable: true + # 是否为生产环境, 为true关闭swagger接口 + production: ${KNIFE4J_PRODUCTION:false} +# 基础脚手架配置 # 基础脚手架配置 bootx-platform: common: @@ -53,7 +59,10 @@ bootx-platform: - org.dromara.daxpay.channel starter: auth: - enable-admin: true + # 是否启用超级管理员登录 + enable-admin: ${DAXPAY_ENABLE_ADMIN:true} + # 用户管理列表中是否显示超级管理员 + admin-in-list: ${DAXPAY_ADMIN_IN_LIST:true} ignore-urls: - '/actuator/**' - '/v3/api-docs/**' @@ -80,13 +89,10 @@ dax-pay: dromara: # 注意, 不要设置 domain 访问路径, 自行进行拼接访问路径, 来保证可迁移性 x-file-storage: - default-platform: tencent-cos-1 - tencent-cos: - - platform: tencent-cos-1 # 存储平台标识 - enable-storage: true # 启用存储 - secret-id: ${OSS_SECRET_ID} - secret-key: ${OSS_SECRET_KEY} - region: ${OSS_REGION} #存仓库所在地域 - bucket-name: ${OSS_BUCKET} - domain: ${OSS_DOMAIN} # 访问域名,注意“/”结尾,例如:https://abc.cos.ap-nanjing.myqcloud.com/ - base-path: dax-pay/ + default-platform: local + # 使用Nginx映射到存储路径, 然后将nginx的地址设置到 bootx-platform.starter.file-upload.file-server-url参数 + local-plus: + - platform: local + enable-storage: true + base-path: /file/ # 基础路径 + storage-path: /data/files # 存储路径 diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java new file mode 100644 index 00000000..7ef0747b --- /dev/null +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/assist/TerminalDeviceController.java @@ -0,0 +1,85 @@ +package org.dromara.daxpay.controller.assist; + +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.validation.ValidationGroup; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.core.trans.anno.TransMethodResult; +import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; +import org.dromara.daxpay.service.param.termina.TerminalDeviceQuery; +import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; +import org.dromara.daxpay.service.service.assist.TerminalDeviceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 支付终端设备 + * @author xxm + * @since 2025/3/9 + */ +@Validated +@Tag(name = "支付终端设备管理") +@RestController +@RequestMapping("/terminal/device") +@RequestGroup(groupCode = "TerminalDevice", groupName = "支付终端设备管理", moduleCode = "PayConfig") +@RequiredArgsConstructor +public class TerminalDeviceController { + private final TerminalDeviceService terminalDeviceService; + + @TransMethodResult + @RequestPath("分页查询") + @Operation(summary = "分页查询") + @GetMapping("/page") + public Result> page(PageParam pageParam, TerminalDeviceQuery query){ + return Res.ok(terminalDeviceService.page(pageParam, query)); + } + + @TransMethodResult + @RequestPath("根据ID查询") + @Operation(summary = "根据ID查询") + @GetMapping("/findById") + public Result findById(@NotNull(message = "支付终端设备id不能为空") Long id){ + return Res.ok(terminalDeviceService.findById(id)); + } + + @RequestPath("新增") + @Operation(summary = "新增") + @PostMapping("/add") + public Result add(@RequestBody @Validated(ValidationGroup.add.class) TerminalDeviceParam param){ + terminalDeviceService.add(param); + return Res.ok(); + } + + @RequestPath("修改") + @Operation(summary = "修改") + @PostMapping("/edit") + public Result edit(@RequestBody @Validated(ValidationGroup.edit.class) TerminalDeviceParam param){ + terminalDeviceService.edit(param); + return Res.ok(); + } + + @RequestPath("删除") + @Operation(summary = "删除") + @PostMapping("/delete") + public Result delete(@NotNull(message = "支付终端设备id不能为空") Long id){ + terminalDeviceService.delete(id); + return Res.ok(); + } + + @RequestPath("根据应用号查询下拉列表") + @Operation(summary = "根据应用号查询下拉列表") + @GetMapping("/dropdown") + public Result> dropdown(String appId){ + return Res.ok(terminalDeviceService.dropdown(appId)); + } +} diff --git a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java index e1bc27e0..2ccd377e 100644 --- a/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java +++ b/daxpay-open/daxpay-open-controller/src/main/java/org/dromara/daxpay/controller/common/TestController.java @@ -1,37 +1,28 @@ package org.dromara.daxpay.controller.common; -import cn.bootx.platform.core.annotation.DataPermScope; import cn.bootx.platform.core.annotation.IgnoreAuth; +import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.starter.redis.delay.annotation.DelayEventListener; -import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent; -import cn.bootx.platform.starter.redis.delay.bean.DelayJob; -import cn.bootx.platform.starter.redis.delay.service.DelayJobService; -import org.dromara.daxpay.core.result.assist.AuthResult; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import cn.hutool.core.util.RandomUtil; +import cn.bootx.platform.starter.cache.handler.CacheClearProcessor; +import cn.bootx.platform.starter.cache.service.CacheClearService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.time.LocalDateTime; -import java.util.concurrent.TimeUnit; +import java.util.List; /** * * @author xxm * @since 2024/7/4 */ -@DataPermScope("123") @Validated @IgnoreAuth @Slf4j @@ -40,49 +31,22 @@ import java.util.concurrent.TimeUnit; @RequestMapping("/test") @RequiredArgsConstructor public class TestController { - - private final RedisTemplate objectRedisTemplate; - - private final DelayJobService delayJobService; + private final CacheClearProcessor cacheClearProcessor; + private final CacheClearService cacheClearService; - @Operation(summary = "测试redis") - @GetMapping("/redis") - public Result redis(){ - PayOrder payOrder = new PayOrder(); - payOrder.setOrderNo("123"); -// redisTemplate.opsForValue().set("payOrder",new AuthResult().setStatus("123"),60000L); - objectRedisTemplate.opsForValue().set("payOrder",new AuthResult().setStatus("123"),600, TimeUnit.MILLISECONDS); -// objectRedisTemplate.opsForValue().set("payOrder",payOrder); - var payOrder1 = objectRedisTemplate.opsForValue().get("payOrder"); - return Res.ok(payOrder1); + @RequestPath("查询所有缓存前缀") + @Operation(summary = "查询所有缓存前缀") + @GetMapping("/getCachePrefix") + public Result> getCachePrefix() { + return Res.ok(cacheClearProcessor.getCachePrefix()); } - @Operation(summary = "添加测试延时任务") - @PostMapping(value = "addTest") - public Result addDefJobTest() { - for (int i = 0; i < 100; i++){ - DelayJob delayJob = new DelayJob<>(); - delayJobService.register(delayJob, "hello", RandomUtil.randomInt(10000,90000)); - delayJobService.register(delayJob, "hello", LocalDateTime.now().plusSeconds(20)); - } + @RequestPath("清除指定前缀的缓存") + @Operation(summary = "清除指定前缀的缓存") + @PostMapping("/prefix") + public Result clearCacheByPrefix(List prefix) { + cacheClearService.clearCacheByPrefix(prefix); return Res.ok(); } - - - @DelayEventListener("hello") - public void hello(DelayJobEvent event) { - if (RandomUtil.randomBoolean()){ - throw new RuntimeException("测试异常"); - } - log.info("接收到消息:{}",event); - } - - @Operation(summary = "v1") - @PostMapping("/v1") - public void v1(@NotNull(message = "id不可为空") Long id){ - log.info("v1: {}", id); - } - - } diff --git a/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalDeviceTypeEnum.java b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalDeviceTypeEnum.java new file mode 100644 index 00000000..0267f4be --- /dev/null +++ b/daxpay-open/daxpay-open-core/src/main/java/org/dromara/daxpay/core/enums/TerminalDeviceTypeEnum.java @@ -0,0 +1,32 @@ +package org.dromara.daxpay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 收款终端设备类型 + * 字典: terminal_device_type + * @author xxm + * @since 2025/3/7 + */ +@Getter +@AllArgsConstructor +public enum TerminalDeviceTypeEnum { + + AUTO_COUNTER("01", "自动柜员机"), + TRADITIONAL_POS("02", "传统POS"), + MPOS("03", "mPOS"), + SMART_POS("04", "智能POS"), + FIXED_PHONE("05", "II型固定电话"), + CLOUD_SHAN_PAY("06", "云闪付终端"), + RESERVE_USE("07", "保留使用"), + PHONE_POS("08", "手机POS"), + FACE_PAY_TERMINAL("09", "刷脸付终端"), + BAR_CODE_PAY_ACCEPT_TERMINAL("10", "条码支付受理终端"), + ASSIST_ACCEPT_TERMINAL("11", "辅助受理终端"), + INDUSTRY_TERMINAL("12", "行业终端"), + MIS_TERMINAL("13", "MIS终端"); + + private final String code; + private final String name; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java new file mode 100644 index 00000000..290c285e --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/convert/assist/TerminalDeviceConvert.java @@ -0,0 +1,22 @@ +package org.dromara.daxpay.service.convert.assist; + +import org.dromara.daxpay.service.entity.assist.TerminalDevice; +import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; +import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 支付终端设备转换 + * @author xxm + * @since 2025/3/8 + */ +@Mapper +public interface TerminalDeviceConvert { + TerminalDeviceConvert CONVERT = Mappers.getMapper(TerminalDeviceConvert.class); + + TerminalDeviceResult toResult(TerminalDevice entity); + + TerminalDevice toEntity(TerminalDeviceParam param); + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceManager.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceManager.java new file mode 100644 index 00000000..ac6f0c61 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceManager.java @@ -0,0 +1,44 @@ +package org.dromara.daxpay.service.dao.assist; + +import cn.bootx.platform.common.mybatisplus.impl.BaseManager; +import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.rest.param.PageParam; +import org.dromara.daxpay.service.entity.assist.TerminalDevice; +import org.dromara.daxpay.service.param.termina.TerminalDeviceQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +/** + * 支付终端设备管理 + * @author xxm + * @since 2025/3/7 + */ +@Slf4j +@Repository +@RequiredArgsConstructor +public class TerminalDeviceManager extends BaseManager { + + /** + * 分页 + */ + public Page page(PageParam pageParam, TerminalDeviceQuery query){ + var mpPage = MpUtil.getMpPage(pageParam, TerminalDevice.class); + QueryWrapper generator = QueryGenerator.generator(query); + return this.page(mpPage,generator); + } + + /** + * 根据编号查询终端信息 + */ + public Optional findByNo(String terminalNo){ + return this.lambdaQuery() + .eq(TerminalDevice::getTerminalNo,terminalNo) + .oneOpt(); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceMapper.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceMapper.java new file mode 100644 index 00000000..4f2218f9 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/dao/assist/TerminalDeviceMapper.java @@ -0,0 +1,14 @@ +package org.dromara.daxpay.service.dao.assist; + +import org.dromara.daxpay.service.entity.assist.TerminalDevice; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 支付终端设备管理 + * @author xxm + * @since 2025/3/7 + */ +@Mapper +public interface TerminalDeviceMapper extends MPJBaseMapper { +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/assist/TerminalDevice.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/assist/TerminalDevice.java new file mode 100644 index 00000000..42ecee05 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/entity/assist/TerminalDevice.java @@ -0,0 +1,97 @@ +package org.dromara.daxpay.service.entity.assist; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import cn.bootx.platform.common.mybatisplus.handler.StringListTypeHandler; +import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; +import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.convert.assist.TerminalDeviceConvert; +import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; +import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.time.LocalDate; +import java.util.List; +import java.util.Objects; + +/** + * 支付终端设备管理 + * @author xxm + * @since 2025/3/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName(value = "pay_terminal_device",autoResultMap = true) +public class TerminalDevice extends MchAppBaseEntity implements ToResult { + + /** 终端名称 */ + private String name; + + /** 终端编码 */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private String terminalNo; + + /** + * 终端类型 + * @see TerminalDeviceTypeEnum + */ + private String type; + + /** 终端序列号 */ + private String serialNum; + + /** 省市区编码 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS, typeHandler = StringListTypeHandler.class) + private List areaCode; + + /** 终端发放地址 */ + private String address; + + /** 终端厂商名称 */ + private String companyName; + + /** 发放日期 */ + private LocalDate putDate; + + /** 支持终端定位 */ + private Boolean gps; + + /** 终端机具体型号 */ + private String machineType; + + /** + * 经度,浮点型, 小数点后最多保留6位 + */ + private String longitude; + /** + * 纬度,浮点型,小数点后最多保留6位 + */ + private String latitude; + + /** 设备 IP 地址 */ + private String ip; + + /** 银行卡受理终端产品入网认证编号 */ + private String networkLicense; + + public Boolean getGps() { + return Objects.equals(gps, true); + } + + /** + * 初始化对象 + */ + public static TerminalDevice init(TerminalDeviceParam param){ + return TerminalDeviceConvert.CONVERT.toEntity(param); + } + + @Override + public TerminalDeviceResult toResult() { + return TerminalDeviceConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceParam.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceParam.java new file mode 100644 index 00000000..9522ff71 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceParam.java @@ -0,0 +1,92 @@ +package org.dromara.daxpay.service.param.termina; + +import cn.bootx.platform.core.validation.ValidationGroup; +import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDate; +import java.util.List; + +/** + * 支付终端设备参数 + * @author xxm + * @since 2025/3/8 + */ +@Data +@Accessors(chain = true) +@Schema(title = "支付终端设备参数") +public class TerminalDeviceParam { + + /** 主键 */ + @Null(message = "Id需要为空", groups = ValidationGroup.add.class) + @NotNull(message = "Id不可为空", groups = ValidationGroup.edit.class) + @Schema(description = "主键") + private Long id; + + /** 终端名称 */ + @Schema(description = "终端名称") + private String name; + + /** + * 终端类型 + * @see TerminalDeviceTypeEnum + */ + @Schema(description = "终端类型") + private String type; + + /** 终端序列号 */ + @Schema(description = "终端序列号") + private String serialNum; + + /** 省市区编码 */ + @Schema(description = "省市区编码") + private List areaCode; + + /** 终端发放地址 */ + @Schema(description = "终端发放地址") + private String address; + + /** 终端厂商名称 */ + @Schema(description = "终端厂商名称") + private String companyName; + + /** 发放日期 */ + @Schema(description = "发放日期") + private LocalDate putDate; + + /** 支持终端定位 */ + @Schema(description = "支持终端定位") + private Boolean gps; + + /** 终端机具型号 */ + @Schema(description = "终端机具型号") + private String machineType; + + /** + * 经度,浮点型, 小数点后最多保留6位 + */ + @Schema(description = "经度,浮点型, 小数点后最多保留6位") + private String longitude; + /** + * 纬度,浮点型,小数点后最多保留6位 + */ + @Schema(description = "纬度,浮点型,小数点后最多保留6位") + private String latitude; + + /** 设备 IP 地址 */ + @Schema(description = "设备 IP 地址") + private String ip; + + /** 银行卡受理终端产品入网认证编号 */ + @Schema(description = "银行卡受理终端产品入网认证编号") + private String networkLicense; + + @NotBlank(message = "商户AppId不能为空") + @Schema(description = "商户应用AppId") + private String appId; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceQuery.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceQuery.java new file mode 100644 index 00000000..4d90ddcb --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/param/termina/TerminalDeviceQuery.java @@ -0,0 +1,45 @@ +package org.dromara.daxpay.service.param.termina; + +import cn.bootx.platform.core.annotation.QueryParam; +import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; +import org.dromara.daxpay.service.common.param.MchQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 支付终端查询参数 + * @author xxm + * @since 2025/3/8 + */ +@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class TerminalDeviceQuery extends MchQuery { + + /** 终端名称 */ + @Schema(description = "终端名称") + private String name; + + /** 终端编码 */ + @Schema(description = "终端编码") + private String terminalNo; + + /** + * 终端类型 + * @see TerminalDeviceTypeEnum + */ + @Schema(description = "终端类型") + private String type; + + /** 终端序列号 */ + @Schema(description = "终端序列号") + private String serialNum; + + /** 终端机具型号 */ + @Schema(description = "终端机具型号") + private String machineType; + +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/termina/TerminalDeviceResult.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/termina/TerminalDeviceResult.java new file mode 100644 index 00000000..47c91a30 --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/result/termina/TerminalDeviceResult.java @@ -0,0 +1,85 @@ +package org.dromara.daxpay.service.result.termina; + +import org.dromara.daxpay.core.enums.TerminalDeviceTypeEnum; +import org.dromara.daxpay.service.common.result.MchResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.time.LocalDate; +import java.util.List; + +/** + * 支付终端设备参数 + * @author xxm + * @since 2025/3/8 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "支付终端设备参数") +public class TerminalDeviceResult extends MchResult { + + /** 终端名称 */ + @Schema(description = "终端名称") + private String name; + + /** 终端编码 */ + @Schema(description = "终端编码") + private String terminalNo; + + /** + * 终端类型 + * @see TerminalDeviceTypeEnum + */ + @Schema(description = "终端类型") + private String type; + + /** 终端序列号 */ + @Schema(description = "终端序列号") + private String serialNum; + + /** 省市区编码 */ + @Schema(description = "省市区编码") + private List areaCode; + + /** 终端发放地址 */ + @Schema(description = "终端发放地址") + private String address; + + /** 终端厂商名称 */ + @Schema(description = "终端厂商名称") + private String companyName; + + /** 发放日期 */ + @Schema(description = "发放日期") + private LocalDate putDate; + + /** 支持终端定位 */ + @Schema(description = "支持终端定位") + private Boolean gps; + + /** 终端机具型号 */ + @Schema(description = "终端机具型号") + private String machineType; + + /** + * 经度,浮点型, 小数点后最多保留6位 + */ + @Schema(description = "经度,浮点型, 小数点后最多保留6位") + private String longitude; + /** + * 纬度,浮点型,小数点后最多保留6位 + */ + @Schema(description = "纬度,浮点型,小数点后最多保留6位") + private String latitude; + + /** 设备 IP 地址 */ + @Schema(description = "设备 IP 地址") + private String ip; + + /** 银行卡受理终端产品入网认证编号 */ + @Schema(description = "银行卡受理终端产品入网认证编号") + private String networkLicense; +} diff --git a/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java new file mode 100644 index 00000000..d7f1660b --- /dev/null +++ b/daxpay-open/daxpay-open-service/src/main/java/org/dromara/daxpay/service/service/assist/TerminalDeviceService.java @@ -0,0 +1,89 @@ +package org.dromara.daxpay.service.service.assist; + +import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.rest.dto.LabelValue; +import cn.bootx.platform.core.rest.param.PageParam; +import cn.bootx.platform.core.rest.result.PageResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.lang.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.dao.assist.TerminalDeviceManager; +import org.dromara.daxpay.service.entity.assist.TerminalDevice; +import org.dromara.daxpay.service.param.termina.TerminalDeviceParam; +import org.dromara.daxpay.service.param.termina.TerminalDeviceQuery; +import org.dromara.daxpay.service.result.termina.TerminalDeviceResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 支付终端设备管理 + * @author xxm + * @since 2025/3/7 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class TerminalDeviceService { + private final TerminalDeviceManager terminalManager; + private final PaymentAssistService paymentAssistService; + + /** + * 分页 + */ + public PageResult page(PageParam pageParam, TerminalDeviceQuery query){ + return MpUtil.toPageResult(terminalManager.page(pageParam, query)); + } + + /** + * 查询详情 + */ + public TerminalDeviceResult findById(Long id){ + return terminalManager.findById(id).map(TerminalDevice::toResult) + .orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + } + + /** + * 添加 + */ + public void add(TerminalDeviceParam param){ + paymentAssistService.initMchAndApp(param.getAppId()); + var mchApp = PaymentContextLocal.get().getMchAppInfo(); + String uuid = UUID.fastUUID().toString(true); + TerminalDevice entity = TerminalDevice.init(param); + entity.setTerminalNo(uuid) + .setAppId(mchApp.getAppId()) + .setMchNo(mchApp.getMchNo()); + terminalManager.save(entity); + } + + /** + * 修改 + */ + public void edit(TerminalDeviceParam param){ + var entity = terminalManager.findById(param.getId()).orElseThrow(() -> new DataNotExistException("支付终端设备不存在")); + BeanUtil.copyProperties(param, entity, CopyOptions.create().ignoreNullValue()); + terminalManager.updateById(entity); + } + + /** + * 删除 + */ + public void delete(Long id){ + terminalManager.deleteById(id); + } + + /** + * 终端下拉列表 + */ + public List dropdown(String appId) { + return terminalManager.findAllByField(MchAppBaseEntity::getAppId, appId).stream() + .map(o -> new LabelValue(o.getName(), o.getTerminalNo())) + .toList(); + } +} diff --git a/docker-compose.yml b/docker-compose.yml index af443f00..b7ac44da 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,12 +16,12 @@ services: # 上传文件目录 - ./data/files/:/data/files environment: - # mysql数据库连接地址 - - MYSQL_URL=jdbc:mysql://127.0.0.1:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true - # mysql数据库账号 - - MYSQL_USERNAME=root - # mysql数据库密码 - - MYSQL_PASSWORD=root + # pgsql数据库连接地址 + - DB_URL=jdbc:pgsql://127.0.0.1:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + # pgsql数据库账号 + - DB_USER=root + # pgsql数据库密码 + - DB_PASSWORD=root # Redis 连接地址 - REDIS_HOST=127.0.0.1 # Redis 端口 @@ -35,4 +35,4 @@ services: # 是否启用超级管理员登录, 正式环境不要开启 - DAXPAY_ENABLE_ADMIN=true # 用户管理列表中是否显示超级管理员 - - DAXPAY_ADMIN-IN-LIST=true + - DAXPAY_ADMIN_IN_LIST=true