Kaynağa Gözat

feature: 发新卡的初始化业务实现

luo.yibo@datuai.com 1 yıl önce
ebeveyn
işleme
81d38e0064
20 değiştirilmiş dosya ile 917 ekleme ve 58 silme
  1. 14 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/api/IResult.java
  2. 18 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/api/ResponseResult.java
  3. 116 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/api/ReturnResult.java
  4. 98 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserCategoryEnum.java
  5. 61 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ApiException.java
  6. 11 1
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
  7. 13 12
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtCardtypeServiceImpl.java
  8. 46 13
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardBusiness.java
  9. 79 9
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/CardApiController.java
  10. 3 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtCardBo.java
  11. 102 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/convert/YcVoConvert.java
  12. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/InitCardVo.java
  13. 30 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtCardVo.java
  14. 60 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcBagVo.java
  15. 111 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcCardVo.java
  16. 26 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcInitCardVo.java
  17. 102 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcUserVo.java
  18. 7 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java
  19. 12 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java
  20. 6 9
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/SubsidyScheduled.java

+ 14 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/api/IResult.java

@@ -0,0 +1,14 @@
+package org.dromara.common.core.api;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName IResult
+ * @Description 统一返回第三方或客户端程序响应接口
+ * @Author luoyibo
+ * @Date 2024-11-07 22:24
+ * @Version 1.0
+ * @since jdk17
+ */
+public interface IResult extends Serializable {
+}

+ 18 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/api/ResponseResult.java

@@ -0,0 +1,18 @@
+package org.dromara.common.core.api;
+
+import java.lang.annotation.*;
+
+/**
+ * @ClassName ResponseResult
+ * @Description  接口返回结果增强
+ * @Author luoyibo
+ * @Date 2024-11-07 22:36
+ * @Version 1.0
+ * @since jdk17
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ResponseResult {
+    Class<? extends IResult> value() default ReturnResult.class;
+}

+ 116 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/api/ReturnResult.java

@@ -0,0 +1,116 @@
+package org.dromara.common.core.api;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.enums.ResultCodeEnum;
+
+/**
+ * @ClassName ReturnResult
+ * @Description 通用返回结果
+ * @Author luoyibo
+ * @Date 2024-11-07 22:27
+ * @Version 1.0
+ * @since jdk17
+ */
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ReturnResult implements IResult{
+    private static final long serialVersionUID = 874200365941306385L;
+
+    /**
+     * 请求是否成功
+     */
+    private boolean success;
+
+    /**
+     * 请求成功或失败的结果码
+     */
+    private Integer code;
+
+    /**
+     * 请求成功或失败的提示消息
+     */
+    private String message;
+
+    /**
+     * 成功时返回的数据,失败时返回具体的异常信息
+     */
+    private Object data;
+
+    /**
+     * 返回成功
+     * <p>
+     * date 2020-06-18 23:38
+     *
+     * @return com.zd.api.standard.core.web.result.ReturnResult
+     * {@code @author:} luoyibo
+     */
+    public static ReturnResult success() {
+        ReturnResult result = new ReturnResult();
+        result.setResultCode(ResultCodeEnum.SUCCESS);
+        result.setSuccess(true);
+        return result;
+    }
+
+    /**
+     * 返回成功,同时设置返回数据对象
+     * <p>
+     * date 2020-06-18 23:39
+     *
+     * @param data 返回数据对象
+     * @return com.zd.api.standard.core.web.result.ReturnResult
+     * {@code @author:} luoyibo
+     */
+    public static ReturnResult success(Object data) {
+        ReturnResult result = success();
+        result.setData(data);
+        return result;
+    }
+
+    public static ReturnResult failure(ResultCodeEnum resultCodeEnum) {
+        ReturnResult result = new ReturnResult();
+        result.setResultCode(resultCodeEnum);
+        result.setSuccess(false);
+        return result;
+    }
+
+    public static ReturnResult failure(ResultCodeEnum resultCodeEnum, Object data) {
+        ReturnResult result = new ReturnResult();
+        result.setResultCode(resultCodeEnum);
+        result.setData(data);
+        result.setSuccess(false);
+        return result;
+    }
+
+    public static ReturnResult failure(ResultCodeEnum resultCodeEnum,String message) {
+        ReturnResult result = new ReturnResult();
+        result.setCode(resultCodeEnum.code());
+        result.setMessage(message);
+        result.setSuccess(false);
+        return result;
+    }
+    public static ReturnResult failure(Integer code,String message,Object data) {
+        ReturnResult result = new ReturnResult();
+        result.setCode(code);
+        result.setMessage(message);
+        result.setSuccess(false);
+        result.setData(data);
+        return result;
+    }
+    public static ReturnResult failure(Integer code,String message) {
+        ReturnResult result = new ReturnResult();
+        result.setCode(code);
+        result.setMessage(message);
+        result.setSuccess(false);
+        return result;
+    }
+
+    private void setResultCode(ResultCodeEnum code) {
+        this.code = code.code();
+        this.message = code.message();
+    }
+}

+ 98 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserCategoryEnum.java

@@ -0,0 +1,98 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: OpenCardEnum
+ * package: org.dromara.common.core.enums
+ * description: 一卡通账户开卡情况枚举
+ * date: 2024-09-14 09:29:23 09:29
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum UserCategoryEnum {
+    /**
+     * 未开卡
+     */
+    INSIDE(0, "内部账户"),
+    /**
+     * 教职工
+     */
+    TEACHER(1, "教职工"),
+    /**
+     * 学员
+     */
+    TRAINEE(2, "学员"),
+    /**
+     * 研究生
+     */
+    GRADUATE(3, "研究生"),
+    /**
+     * 其它
+     */
+    OTHER(4, "其它");
+
+    private final Integer code;
+    private final String message;
+
+    UserCategoryEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public static String getMessage(String name) {
+        for (UserCategoryEnum item : UserCategoryEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+
+    public static String getMessage(int code) {
+        for (UserCategoryEnum item : UserCategoryEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+
+    public static Integer getCode(String name) {
+        for (UserCategoryEnum item : UserCategoryEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.code;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+    /***
+     * 校验重复的code值
+     */
+    public static void main(String[] args) {
+        UserCategoryEnum[] thisEnums = UserCategoryEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (UserCategoryEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 61 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ApiException.java

@@ -0,0 +1,61 @@
+package org.dromara.common.core.exception;
+
+import lombok.*;
+
+import java.io.Serial;
+
+/**
+ * 业务异常
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public final class ApiException extends RuntimeException {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    @Getter
+    private Integer code;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误明细,内部调试错误
+     */
+    @Getter
+    private String detailMessage;
+
+    public ApiException(String message) {
+        this.message = message;
+    }
+
+    public ApiException(String message, Integer code) {
+        this.message = message;
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public ApiException setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public ApiException setDetailMessage(String detailMessage) {
+        this.detailMessage = detailMessage;
+        return this;
+    }
+}

+ 11 - 1
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java

@@ -6,11 +6,14 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.api.ReturnResult;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.exception.ApiException;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.base.BaseException;
 import org.dromara.common.core.utils.StreamUtils;
 import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.http.ResponseEntity;
 import org.springframework.validation.BindException;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
@@ -50,6 +53,14 @@ public class GlobalExceptionHandler {
         return ObjectUtil.isNotNull(code) ? R.fail(code, e.getMessage()) : R.fail(e.getMessage());
     }
 
+    @ExceptionHandler(ApiException.class)
+    public ResponseEntity<ReturnResult> handleApiException(ApiException e, HttpServletRequest request) {
+        log.error(e.getMessage());
+        return (ResponseEntity
+                    .status(HttpStatus.HTTP_BAD_METHOD))
+                   .body(ReturnResult.failure(e.getCode(), e.getMessage(), e.getDetailMessage()));
+    }
+
     /**
      * 业务异常
      */
@@ -138,5 +149,4 @@ public class GlobalExceptionHandler {
         String message = e.getBindingResult().getFieldError().getDefaultMessage();
         return R.fail(message);
     }
-
 }

+ 13 - 12
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtCardtypeServiceImpl.java

@@ -2,30 +2,29 @@ package org.dromara.backstage.basics.service.impl;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.domain.PtCardtype;
+import org.dromara.backstage.basics.domain.bo.PtCardtypeBo;
+import org.dromara.backstage.basics.domain.vo.PtCardtypeVo;
+import org.dromara.backstage.basics.mapper.PtCardtypeMapper;
+import org.dromara.backstage.basics.service.IPtCardtypeService;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.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 lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
-import org.dromara.backstage.basics.domain.bo.PtCardtypeBo;
-import org.dromara.backstage.basics.domain.vo.PtCardtypeVo;
-import org.dromara.backstage.basics.domain.PtCardtype;
-import org.dromara.backstage.basics.mapper.PtCardtypeMapper;
-import org.dromara.backstage.basics.service.IPtCardtypeService;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Collection;
 
 /**
  * 卡片类别Service业务层处理
@@ -178,4 +177,6 @@ public class PtCardtypeServiceImpl implements IPtCardtypeService {
         List<PtCardtypeVo> list = baseMapper.selectVoList(buildQueryWrapper(bo));
         return list==null?null:list.get(0);
     }
+
+
 }

+ 46 - 13
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/card/CardBusiness.java

@@ -10,6 +10,7 @@ import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
 import org.dromara.backstage.basics.service.IPtParameterService;
 import org.dromara.backstage.basics.service.IPtWorkstationService;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
+import org.dromara.backstage.cardCenter.domain.vo.InitCardVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
@@ -20,10 +21,7 @@ import org.dromara.backstage.payment.service.IPtUserAccountService;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ResultInfo;
-import org.dromara.common.core.enums.CardOpenEnum;
-import org.dromara.common.core.enums.CardStatusEnum;
-import org.dromara.common.core.enums.ResultCodeEnum;
-import org.dromara.common.core.enums.UserAccountStatusEnum;
+import org.dromara.common.core.enums.*;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -107,7 +105,7 @@ public class CardBusiness {
         }
     }
 
-    public R<ResultInfo> initEntityCard(PtCardBo cardBo) {
+    public R<ResultInfo> initEntityCard(PtCardBo cardBo, InitCardVo initCardVo) {
         PtUserAccountVo userAccountVo = new PtUserAccountVo();
         PtWorkstationVo workstationVo = new PtWorkstationVo();
         // 基本的参数校验
@@ -136,9 +134,44 @@ public class CardBusiness {
         };
         // 所有逻辑校验通过,入库
         cardBo.setCardNo(cardNoBusiness.getCardNo());
+        cardBo.setStatus(CardStatusEnum.NORMAL.code().toString());
+        cardBo.setChangeTime(DateUtil.date());
+        PtCardVo cardVo = ptCardService.saveOrUpdate(cardBo);
+        // 入库成功后,组装返回前端的数据
+        InitCardVo initCard = new InitCardVo();
+        // 1.获取用户钱包信息
+        PtBagBo bagBo = new PtBagBo();
+        bagBo.setUserId(cardBo.getUserId());
+        List<PtBagVo> bagVos = ptBagService.queryList(bagBo);
+        initCard.setBags(bagVos);
+        // 2.设置账户信息
+        initCard.setUser(userAccountVo);
+        // 3.设置当前卡片信息
+        initCard.setCard(cardVo);
+
+        BeanUtil.copyProperties(initCard, initCardVo);
         return result;
     }
 
+    public R<PtCardVo> writeCardSuccess(PtCardBo cardBo){
+        PtCardBo queryBo = new PtCardBo();
+        queryBo.setCardNo(cardBo.getCardNo());
+        queryBo.setFactoryId(cardBo.getFactoryId());
+        PtCardVo cardVo = ptCardService.selectOneByBo(queryBo);
+        // 补卡和换卡时需要注销旧卡
+        if (ObjectUtil.equals(cardBo.getOperateType(), CardOperateEnum.REISSUE.code()) || ObjectUtil.equals(cardBo.getOperateType(),
+                                                                                                            CardOperateEnum.CHANGE.code())) {
+            // 注销旧卡
+            queryBo.setCardNo(cardBo.getOldCardNo());
+            queryBo.setFactoryId(cardBo.getOldFactoryId());
+            queryBo.setStatus(CardStatusEnum.CLOSE.code().toString());
+            queryBo.setChangeTime(DateUtil.date());
+
+            ptCardService.updateByBo(queryBo);
+        }
+        return R.ok(cardVo);
+    }
+
     private R<ResultInfo> checkParam(PtCardBo cardBo, PtUserAccountVo userAccountVo, PtWorkstationVo workstationVo) {
         Long factoryId = cardBo.getFactoryId();
         Long userId = cardBo.getUserId();
@@ -198,8 +231,8 @@ public class CardBusiness {
             String reuseCard = ptParameterService.selectParamByCode("REUSE_CARD");
             if (ObjectUtil.equal(reuseCard, isReuse)) {
                 // 可复用,检查当前卡片是否有状态为正常的对应卡片,如有则不能再使用
-                if (cardVos.stream().anyMatch(p -> ObjectUtil.equal(p.getStatus(), CardStatusEnum.NORMAL.code()))) {
-                    new ResultInfo(ResultCodeEnum.DATA_ALREADY_EXISTED, MessageFormat.format("此卡在正常使用,物理卡号[{0}],不能重新发卡", factoryId));
+                if (cardVos.stream().anyMatch(p -> ObjectUtil.equal(p.getStatus(), CardStatusEnum.NORMAL.code().toString()))) {
+                    return R.fail(new ResultInfo(ResultCodeEnum.DATA_ALREADY_EXISTED, MessageFormat.format("此卡在正常使用,物理卡号[{0}],不能重新发卡", factoryId)));
                 }
             } else {
                 // 不能复用
@@ -221,18 +254,18 @@ public class CardBusiness {
      * @return 检查结果
      */
     private R<ResultInfo> checkUserNewCard(List<PtCardVo> userCardList, PtCardBo cardBo) {
-        if (CollectionUtil.isEmpty(userCardList)) {
+        if (CollectionUtil.isNotEmpty(userCardList)) {
             // 如人员已有正常的主卡,不能再发主卡
             if (userCardList.stream().anyMatch(p -> ObjectUtil.equals(p.getMainCard(), "Y")
-                                                        && ObjectUtil.equals(p.getStatus(), CardStatusEnum.NORMAL.code())
+                                                        && ObjectUtil.equals(p.getStatus(), CardStatusEnum.NORMAL.code().toString())
                                                         && p.getFactoryId() > 0 && cardBo.getMainCard().equals("Y"))) {
                 return R.fail(new ResultInfo(ResultCodeEnum.DATA_ALREADY_EXISTED, MessageFormat.format("Id为[{0}]的人员已有正常主卡,无法再发新卡",
                                                                                                        cardBo.getUserId())));
             }
             // 如果人员已发虚拟卡,此时将虚拟卡转为实体卡
             userCardList.stream().filter(p -> ObjectUtil.equals(p.getMainCard(), "Y")
-                                                  && ObjectUtil.equals(p.getStatus(), CardStatusEnum.NORMAL.code())
-                                                  && p.getFactoryId() == 0).findFirst().ifPresent(k -> {
+                                                  && ObjectUtil.equals(p.getStatus(), CardStatusEnum.NORMAL.code().toString())
+                                                  && p.getFactoryId() == 0L).findFirst().ifPresent(k -> {
                 cardBo.setCardNo(k.getCardNo());
                 cardBo.setCardId(k.getCardId());
                 cardBo.setStatus(k.getStatus());
@@ -257,7 +290,7 @@ public class CardBusiness {
             return R.fail(MessageFormat.format("无法换卡,{0}", result.getData()));
         }
         // 换卡时,原卡必须是正常状态
-        if (ObjectUtil.notEqual(oldCardVo.getStatus(), CardStatusEnum.NORMAL.code())) {
+        if (ObjectUtil.notEqual(oldCardVo.getStatus(), CardStatusEnum.NORMAL.code().toString())) {
             return R.fail(
                 new ResultInfo(ResultCodeEnum.DATA_NOT_FOUND,
                                MessageFormat.format("物理卡号[{0}]和卡流水号[{1}]对应旧卡是正常卡片", oldFactoryId, oldCardNo)));
@@ -294,7 +327,7 @@ public class CardBusiness {
         // 如果待补的旧卡是主卡,检查人员是否有正常主卡
         if (ObjectUtil.equals(oldCardVo.getMainCard(), "Y")) {
             if (userCardList.stream().anyMatch(
-                p -> ObjectUtil.equals(p.getStatus(), CardStatusEnum.NORMAL.code()) && ObjectUtil.equals(p.getMainCard(), "Y"))) {
+                p -> ObjectUtil.equals(p.getStatus(), CardStatusEnum.NORMAL.code().toString()) && ObjectUtil.equals(p.getMainCard(), "Y"))) {
                 return R.fail(new ResultInfo(ResultCodeEnum.DATA_ALREADY_EXISTED,
                                              MessageFormat.format("物理卡号[{0}]和卡流水号[{1}]的挂失卡片为主卡,但人员已有正常的主卡", oldFactoryId,
                                                                   oldCardNo)));

+ 79 - 9
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/CardApiController.java

@@ -1,13 +1,21 @@
 package org.dromara.backstage.cardCenter.controller;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.dromara.backstage.business.card.CardBusiness;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
+import org.dromara.backstage.cardCenter.domain.convert.YcVoConvert;
 import org.dromara.backstage.cardCenter.domain.vo.InitCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.common.core.api.ResponseResult;
+import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ResultInfo;
-import org.dromara.common.core.exception.ServiceException;
-import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.enums.ResultCodeEnum;
+import org.dromara.common.core.exception.ApiException;
 import org.dromara.common.web.core.BaseController;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -15,10 +23,12 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 /**
  * @ClassName CardApiController
  * @Description 提供给自助客户端对卡片操作的接口
- *              因为自有的客户端不需要登录验证所以单独提供接口
+ * 因为自有的客户端不需要登录验证所以单独提供接口
  * @Author luoyibo
  * @Date 2024-11-07 11:27
  * @Version 1.0
@@ -27,15 +37,75 @@ import org.springframework.web.bind.annotation.RestController;
 @Validated
 @RequiredArgsConstructor
 @RestController
+@ResponseResult
 @RequestMapping("/card")
 public class CardApiController extends BaseController {
     private final CardBusiness cardBusiness;
-    @PostMapping("/api/v1/newcard")
-    public InitCardVo initNewCard(@RequestBody @Validated(AddGroup.class)  PtCardBo bo) {
-        R<ResultInfo> result = cardBusiness.initEntityCard(bo);
-        if(R.isSuccess(result)) {
-            return new InitCardVo();
+
+    @PostMapping("/api/v1/new")
+    public ReturnResult initNewCard(@RequestBody Map<String, Object> initParam) {
+        PtCardBo bo = getInitInfo(initParam);
+        InitCardVo initCardVo = new InitCardVo();
+        R<ResultInfo> result = cardBusiness.initEntityCard(bo, initCardVo);
+        if (R.isSuccess(result)) {
+            return ReturnResult.success(YcVoConvert.initCardVoCovert(initCardVo));
+        }
+        throw new ApiException(result.getData().getDetail(), result.getData().getCode());
+    }
+    @PostMapping("/api/v1/change")
+    public ReturnResult initChangeCard(@RequestBody Map<String, Object> initParam) {
+        PtCardBo bo = getInitInfo(initParam);
+        InitCardVo initCardVo = new InitCardVo();
+        R<ResultInfo> result = cardBusiness.initEntityCard(bo, initCardVo);
+        if (R.isSuccess(result)) {
+            return ReturnResult.success(YcVoConvert.initCardVoCovert(initCardVo));
         }
-        throw  new ServiceException(result.getData().getDetail(),result.getCode());
+        throw new ApiException(result.getData().getDetail(), result.getData().getCode());
+    }
+    @PostMapping("/api/v1/reissue")
+    public ReturnResult initReissueCard(@RequestBody Map<String, Object> initParam) {
+        PtCardBo bo = getInitInfo(initParam);
+        InitCardVo initCardVo = new InitCardVo();
+        R<ResultInfo> result = cardBusiness.initEntityCard(bo, initCardVo);
+        if (R.isSuccess(result)) {
+            return ReturnResult.success(YcVoConvert.initCardVoCovert(initCardVo));
+        }
+        throw new ApiException(result.getData().getDetail(), result.getData().getCode());
+    }
+    @PostMapping("/api/v1/write/success")
+    public ReturnResult writeNewCardOk(@RequestBody Map<String, Object> initParam) {
+        PtCardBo bo = getInitInfo(initParam);
+        R<PtCardVo> vo = cardBusiness.writeCardSuccess(bo);
+        if (R.isSuccess(vo)) {
+            return ReturnResult.success(vo.getData());
+        }
+        return ReturnResult.failure(ResultCodeEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST);
+    }
+    @PostMapping("/api/v1/write/failure")
+    public ReturnResult writeCardFailure(@RequestBody Map<String, Object> initParam) {
+        return ReturnResult.success();
+    }
+
+    private PtCardBo getInitInfo(Map<String, Object> initParam) {
+        PtCardBo bo = new PtCardBo();
+        bo.setUserId(ObjUtil.isNotEmpty(initParam.get("userId")) ? Long.parseLong(initParam.get("userId").toString()) : 0);
+        bo.setCardType(ObjUtil.isNotEmpty(initParam.get("cardTypeId")) ? Long.parseLong(initParam.get("cardTypeId").toString()) : 0);
+        bo.setLifespan(ObjUtil.isNotEmpty(initParam.get("expiryDate")) ? DateUtil.parse(initParam.get("expiryDate").toString(),
+                                                                                        DefaultConstants.DATE_TIME_FORMAT) : null);
+        bo.setFactoryId(ObjUtil.isNotEmpty(initParam.get("factoryFixId")) ? Long.parseLong(initParam.get("factoryFixId").toString()) : 0);
+        if (ObjUtil.isNotEmpty(initParam.get("mainDeputyType"))) {
+            bo.setMainCard(ObjectUtil.equals(initParam.get("mainDeputyType"), "1") ? "Y" : "N");
+        } else {
+            bo.setMainCard("Y");
+        }
+        bo.setCardNo(ObjectUtil.isNotEmpty(initParam.get("cardNo")) ? Long.parseLong(initParam.get("cardNo").toString()) : 0);
+        // 默认为发新卡
+        bo.setOperateType(ObjUtil.isNotEmpty(initParam.get("cardOperate")) ? Integer.parseInt(initParam.get("cardOperate").toString()) : 2);
+        bo.setStationNumb(ObjUtil.isNotEmpty(initParam.get("workStationNumb")) ? Long.parseLong(initParam.get("workStationNumb").toString()) : 0);
+        bo.setTenantId(ObjUtil.isNotEmpty(initParam.get("tenantId")) ? initParam.get("tenantId").toString() : DefaultConstants.TENANT_ID);
+        bo.setOldCardNo(ObjUtil.isNotEmpty(initParam.get("oldCardNo")) ? Long.parseLong(initParam.get("oldCardNo").toString()) : 0);
+        bo.setOldFactoryId(ObjUtil.isNotEmpty(initParam.get("oldFactoryFixId")) ? Long.parseLong(initParam.get("oldFactoryFixId").toString()) : 0);
+
+        return bo;
     }
 }

+ 3 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtCardBo.java

@@ -1,12 +1,9 @@
 package org.dromara.backstage.cardCenter.domain.bo;
 
 import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.backstage.cardCenter.domain.PtCard;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 
 import java.util.Date;
@@ -30,18 +27,18 @@ public class PtCardBo extends BaseEntity {
     /**
      * 所属账户Id
      */
-    @NotNull(message = "所属账户Id不能为空", groups = {AddGroup.class, EditGroup.class})
+
     private Long userId;
     /**
      * 卡片类型
      */
-    @NotNull(message = "卡片类型不能为空", groups = {AddGroup.class, EditGroup.class})
+
     private Long cardType;
 
     /**
      * 卡片有效期
      */
-    @NotNull(message = "卡片有效期不能为空", groups = {AddGroup.class, EditGroup.class})
+
     private Date lifespan;
     /*
       卡流水号

+ 102 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/convert/YcVoConvert.java

@@ -0,0 +1,102 @@
+package org.dromara.backstage.cardCenter.domain.convert;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import org.dromara.backstage.cardCenter.domain.vo.InitCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.yc.YcBagVo;
+import org.dromara.backstage.cardCenter.domain.vo.yc.YcCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.yc.YcInitCardVo;
+import org.dromara.backstage.cardCenter.domain.vo.yc.YcUserVo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.common.core.constant.DefaultConstants;
+import org.dromara.common.core.enums.CardStatusEnum;
+import org.dromara.common.core.enums.UserAccountStatusEnum;
+import org.dromara.common.core.enums.UserCategoryEnum;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName YcVoConvert
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-11-08 09:33
+ * @Version 1.0
+ * @since jdk17
+ */
+public class YcVoConvert {
+    public static YcCardVo cardVoConvert(PtCardVo vo) {
+        YcCardVo cardVo = new YcCardVo();
+        cardVo.setCardId(vo.getCardId().toString());
+        cardVo.setCardNo(vo.getCardNo());
+        cardVo.setFactoryFixId(vo.getFactoryId());
+        cardVo.setCardStatusId(Integer.parseInt(vo.getStatus()));
+        cardVo.setCardStatusName(CardStatusEnum.getMessage(Integer.parseInt(vo.getStatus())));
+        cardVo.setCardTypeId(Integer.parseInt(vo.getCardType().toString()));
+        cardVo.setUserId(vo.getUserId().toString());
+        cardVo.setExpiryDate(vo.getLifespan());
+        cardVo.setStatusChangeTime(vo.getChangeTime());
+        cardVo.setMainDeputyType(ObjectUtil.equals(vo.getMainCard(), "Y") ? 1 : 0);
+        cardVo.setMainDeputyTypeName(ObjectUtil.equals(vo.getMainCard(), "Y") ? "主卡" : "副卡");
+        cardVo.setVersion(0);
+        cardVo.setCardTypeName(vo.getCardTypeName());
+        cardVo.setDeposit(vo.getDeposit());
+        cardVo.setIssueFee(vo.getProductCost());
+        cardVo.setCommissionCharge(vo.getCommissionCharge());
+        cardVo.setZheJiuFee(vo.getDepreciation());
+
+        return cardVo;
+    }
+
+    public static YcUserVo YcUserAccountConvert(PtUserAccountVo vo) {
+        YcUserVo userVo = new YcUserVo();
+        userVo.setUserId(vo.getUserId().toString());
+        userVo.setUserXm(vo.getRealName());
+        userVo.setUserNumb(vo.getUserNumb());
+        userVo.setState(vo.getAccountStatus());
+        userVo.setStateName(UserAccountStatusEnum.getMessage(Integer.parseInt(vo.getAccountStatus())));
+        userVo.setCategory(vo.getCategory());
+        userVo.setCategoryName(UserCategoryEnum.getMessage(Integer.parseInt(vo.getCategory())));
+        userVo.setDeptId(vo.getDeptId().toString());
+        userVo.setDeptName(vo.getDeptName());
+        userVo.setUserSex(vo.getSex());
+        userVo.setUserSexName(ObjectUtil.equals(vo.getSex(), "1") ? "男" : "女");
+        userVo.setUserCardTypeId(vo.getCardType().intValue());
+        userVo.setUserCardTypeName(vo.getCardTypeName());
+        userVo.setUserExpiryDate(DateUtil.format(vo.getLifespan(), DefaultConstants.DATE_TIME_FORMAT));
+        userVo.setUserNo(vo.getUserNo().intValue());
+        userVo.setPhotoUrl(vo.getPhoto());
+        userVo.setHasCard(null);
+        userVo.setCollegeName(null);
+
+        return userVo;
+    }
+
+    public static YcBagVo ycBagVoConvert(PtBagVo vo) {
+        YcBagVo bagVo = new YcBagVo();
+        bagVo.setBagCode(vo.getBagCode());
+        bagVo.setBagName(vo.getBagName());
+        bagVo.setBagStatus(1);
+        bagVo.setBagStatusName("启用");
+        bagVo.setCardValue(vo.getBalance());
+        bagVo.setUserId(vo.getUserId().toString());
+
+        return bagVo;
+    }
+
+    public static YcInitCardVo initCardVoCovert(InitCardVo vo) {
+        YcInitCardVo ycInitCardVo = new YcInitCardVo();
+
+        ycInitCardVo.setCard(cardVoConvert(vo.getCard()));
+
+        ycInitCardVo.setUser(YcUserAccountConvert(vo.getUser()));
+
+        List<YcBagVo> ycBagVos = new ArrayList<>();
+        vo.getBags().parallelStream().forEach(p -> ycBagVos.add(ycBagVoConvert(p)));
+        ycInitCardVo.setBags(ycBagVos);
+
+        return ycInitCardVo;
+    }
+}

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/InitCardVo.java

@@ -2,7 +2,7 @@ package org.dromara.backstage.cardCenter.domain.vo;
 
 import lombok.Data;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountInfoVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -27,7 +27,7 @@ public class InitCardVo implements Serializable {
     /**
     * 账户信息
     */
-    private PtUserAccountInfoVo user;
+    private PtUserAccountVo user;
     /**
     * 钱包信息
     */

+ 30 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtCardVo.java

@@ -1,19 +1,18 @@
 package org.dromara.backstage.cardCenter.domain.vo;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.dromara.backstage.cardCenter.domain.PtCard;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.backstage.cardCenter.domain.PtCard;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
 import org.dromara.common.translation.annotation.Translation;
 import org.dromara.common.translation.constant.TransConstant;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 
@@ -124,9 +123,34 @@ public class PtCardVo implements Serializable {
     @ExcelProperty(value = "最后交易餐类,对应营业时段的编号")
     private Long lastMeal;
 
+    //region 根据卡片类型关联到的卡片押金、工本费等信息
     /**
-     * 卡类名
+     * 卡
      */
     @Translation(type = TransConstant.CARD_TYPE_ID_TO_NAME, mapper = "cardType")
     private String cardTypeName;
+
+    /**
+     * 管理费
+     */
+    private BigDecimal commissionCharge;
+
+    /**
+     * 押金
+     */
+    private BigDecimal deposit;
+
+    /**
+     * 工本费
+     */
+    private BigDecimal productCost;
+
+    /**
+     * 折旧费
+     */
+    private BigDecimal depreciation;
+    //endregion
+
+
+
 }

+ 60 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcBagVo.java

@@ -0,0 +1,60 @@
+package org.dromara.backstage.cardCenter.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @ClassName YcBagVo
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-11-08 09:16
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class YcBagVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 钱包代码
+     * 1-消费现金钱包 2-水控钱包 3-消费补助钱包 4-脱机信用钱包 5-就餐钱包 6-配餐钱包
+     */
+    private String bagCode;
+    /**
+     * 钱包名称
+     */
+    private String bagName;
+
+    /**
+     * 钱包状态
+     * 1-正常 0-未启用
+     */
+    private Integer bagStatus;
+
+    /**
+     * 钱包状态名称
+     */
+    private String bagStatusName;
+
+    /**
+     * 钱包余额
+     */
+    private BigDecimal cardValue;
+
+    /**
+     * 用户Id
+     */
+    private String userId;
+
+    /**
+     * 用户编号
+     */
+    private String userNumb;
+    /**
+     * 充值次数
+     */
+    private Integer czCount;
+}

+ 111 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcCardVo.java

@@ -0,0 +1,111 @@
+package org.dromara.backstage.cardCenter.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @ClassName YcCardVo
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-11-08 09:13
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class YcCardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -424256655303905217L;
+
+    //region 卡片的基本信息
+    /**
+     * 卡片主键Id
+     */
+    private String cardId;
+
+    /**
+     * 卡流水号
+     */
+    private long cardNo ;
+
+    /**
+     * 物理卡号
+     */
+    private Long factoryFixId ;
+
+    /**
+     * 卡片状态
+     */
+    private int cardStatusId ;
+
+    /**
+     * 卡片状态名称
+     */
+    private String cardStatusName ;
+
+    /**
+     * 卡片类型
+     */
+    private int cardTypeId ;
+
+    /**
+     * 卡片关联的UserId
+     */
+    private String userId;
+
+    /**
+     * 卡片有效期
+     */
+    private Date expiryDate ;
+
+    /**
+     * 卡片状态变化日期
+     */
+    private Date statusChangeTime;
+    /**
+     * 主副卡类型
+     */
+    private Integer mainDeputyType ;
+
+    /**
+     * 主副卡说明
+     */
+    private String mainDeputyTypeName ;
+
+    /**
+     * 卡片记录版本号
+     */
+    private int version;
+    //endregion
+
+    //region 根据卡片类型关联到的卡片押金、工本费等信息
+    /**
+     * 卡片类型名称
+     */
+    private String cardTypeName ;
+
+    /**
+     * 卡片押金
+     */
+    private BigDecimal deposit ;
+
+    /**
+     * 卡片工本费
+     */
+    private BigDecimal issueFee;
+
+    /**
+     * 卡片管理费费率
+     */
+    private BigDecimal commissionCharge;
+
+    /**
+     * 折旧费
+     */
+    private  BigDecimal zheJiuFee;
+    //endregion
+}

+ 26 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcInitCardVo.java

@@ -0,0 +1,26 @@
+package org.dromara.backstage.cardCenter.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @ClassName YcInitCardVo
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-11-08 09:30
+ * @Version 1.0
+ * @since jdk17
+ */
+ @Data
+public class YcInitCardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2770930105333532133L;
+
+    private YcCardVo card;
+    private YcUserVo user;
+    private List<YcBagVo> bags;
+}

+ 102 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/yc/YcUserVo.java

@@ -0,0 +1,102 @@
+package org.dromara.backstage.cardCenter.domain.vo.yc;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName YcUserVo
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-11-08 09:20
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+public class YcUserVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 2168829430747022234L;
+    public String userId;
+
+    /**
+     * 人员姓名
+     */
+    private String userXm;
+
+    /**
+     * 人员编号
+     */
+    private String userNumb;
+
+    /**
+     * 人员状态
+     */
+    private String state;
+
+    /**
+     * 人员状态名称
+     */
+    private String stateName;
+
+    /**
+     * 人员身份
+     */
+    private String category;
+
+    /**
+     * 人员身份名称
+     */
+    private String categoryName;
+
+    /**
+     * 人员主部门Id
+     */
+    private String deptId;
+
+    /**
+     * 人员主部门名称
+     */
+    private String deptName;
+
+    /**
+     * 人员性别
+     */
+    private String userSex;
+    /**
+     * 人员性别名称
+     */
+    private String userSexName;
+    /**
+     * 人员卡类Id
+     */
+    private Integer userCardTypeId;
+    /**
+     * 人员卡类名称
+     */
+    private String userCardTypeName;
+    /**
+     * 人员有效期
+     */
+    private String userExpiryDate;
+
+    /**
+     * 人员流水号
+     */
+    private Integer userNo;
+
+    /**
+     * 人员照片路径
+     */
+    private String photoUrl;
+
+    /**
+     * 人员是否已发卡
+     */
+    private String hasCard;
+
+    /**
+     * 人员学院名称
+     */
+    private String collegeName;
+}

+ 7 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -120,11 +120,13 @@ public interface IPtCardService {
      * @return 管理费
      */
     BigDecimal computeCommission(PtBagBo bo);
+
     /**
      * 获取已有的最大卡流水号
      * @return 最大卡流水号
      */
     Long getMaxCardNo();
+
     /**
      * 根据卡流水号获取对应的卡片信息
      *
@@ -132,6 +134,7 @@ public interface IPtCardService {
      * @return 卡片信息
      */
     PtCardVo queryCardByCardNo(Long cardNo);
+
     /**
      * 根据物理卡号号获取对应的卡片信息
      *
@@ -139,6 +142,7 @@ public interface IPtCardService {
      * @return 卡片信息
      */
     PtCardVo queryCardByFactoryId(Long factoryId);
+
     /**
      * 根据人员Id获取账户主卡
      *
@@ -146,10 +150,13 @@ public interface IPtCardService {
      * @return 主卡信息
      */
     PtCardVo queryMainCardByUserId(Long userId);
+
     /**
      * 根据卡片业务对象查询卡片信息
      * @param bo 卡片业务对象
      * @return 卡片信息
      */
     PtCardVo selectOneByBo(PtCardBo bo);
+
+    PtCardVo saveOrUpdate(PtCardBo bo);
 }

+ 12 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -385,4 +385,16 @@ public class PtCardServiceImpl implements IPtCardService {
 
         return card.getCardNo();
     }
+
+    @Override
+    public PtCardVo saveOrUpdate(PtCardBo bo) {
+        PtCard entity = MapstructUtils.convert(bo, PtCard.class);
+        boolean flag = baseMapper.insertOrUpdate(entity);
+        if (flag) {
+            if (entity != null) {
+                return baseMapper.selectVoById(entity.getCardId());
+            }
+        }
+        return null;
+    }
 }

+ 6 - 9
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/SubsidyScheduled.java

@@ -3,10 +3,7 @@ package org.dromara.backstage.task;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.business.payments.PayOrderBusiness;
-import org.dromara.common.core.domain.R;
 import org.springframework.boot.CommandLineRunner;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
 
 /**
  * name: SubsidyScheduled
@@ -19,16 +16,16 @@ import org.springframework.stereotype.Component;
  * @since JDK 1.8
  */
 @Slf4j
-@Component
+// @Component
 @RequiredArgsConstructor
 public class SubsidyScheduled implements CommandLineRunner {
     private final PayOrderBusiness subsidyOrderBusiness;
 
-    @Scheduled(fixedDelay = 10 * 60 * 1000)
-    public void rechargeSubsidy(){
-        R<Object> result = subsidyOrderBusiness.createSubsidyOrder();
-        log.info(result.getMsg());
-    }
+    // @Scheduled(fixedDelay = 10 * 60 * 1000)
+    // public void rechargeSubsidy(){
+    //     R<Object> result = subsidyOrderBusiness.createSubsidyOrder();
+    //     log.info(result.getMsg());
+    // }
 
     @Override
     public void run(String... args) throws Exception {