KKSU
2023-11-24 0122f61044683af26a0462431260be389e6d17ad
匹配
2 files added
19 files modified
399 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/ProductEnum.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java 25 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java 36 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminGfaBasicSetDto.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallProductBuyRecordMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellRecordMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAgentService.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 82 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallProductServiceImpl.java 54 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderBuyInfoVo.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderBuyRecordInfoVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderSellInfoVo.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderSellRecordInfoVo.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 10 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallProductBuyRecordMapper.xml 6 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallProductSellRecordMapper.xml 6 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/news/gfaBasicSet.html 76 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/index.html 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -6,6 +6,12 @@
@Getter
public enum DataDictionaryEnum {
    /**
     * 预约开始时间
     * 预约结束时间
     */
    YU_YUE_START_TIME("YU_YUE_START_TIME","YU_YUE_START_TIME"),
    YU_YUE_END_TIME("YU_YUE_END_TIME","YU_YUE_END_TIME"),
    /**
     * NFT最小提现数量
     * NFT手续费
     */
src/main/java/cc/mrbird/febs/common/enumerates/ProductEnum.java
@@ -5,6 +5,11 @@
@Getter
public enum ProductEnum {
    /**
     * 用户冻结
     */
    MEMBER_FROZEN(1,"用户冻结"),
    MEMBER_UNFROZEN(0,"用户未冻结"),
    /**
     * 用户NFT提现状态  0:失败 1:进行中 2:超时  3:已完成
     */
    PRODUCT_SELL_SUCCESS(3,"已完成"),
src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java
@@ -4,12 +4,12 @@
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.ProductEnum;
import cc.mrbird.febs.mall.dto.AdminMallProductNftDto;
import cc.mrbird.febs.mall.dto.AdminPickSellRecordDtoDto;
import cc.mrbird.febs.mall.dto.MallNewsInfoDto;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.MallProductNftMapper;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.mall.service.IMallNewsInfoService;
import cc.mrbird.febs.mall.vo.AdminMallProductNftVo;
import cc.mrbird.febs.mall.vo.AdminMallProductSellPickVo;
@@ -37,6 +37,7 @@
    private final IMallNewsInfoService mallNewsInfoService;
    private final MallProductNftMapper mallProductNftMapper;
    private final ICommonService commonService;
    /**
     * NFT预约产品
@@ -128,6 +129,24 @@
    }
    /**
     * 基础设置
     * @param gfaBasicSetDto
     * @return
     */
    @PostMapping(value = "/gfaBasicSet")
    public FebsResponse gfaBasicSet(AdminGfaBasicSetDto gfaBasicSetDto) {
        commonService.updateDataDic(
                DataDictionaryEnum.YU_YUE_START_TIME.getType(),
                DataDictionaryEnum.YU_YUE_START_TIME.getCode(),
                gfaBasicSetDto.getStartTime());
        commonService.updateDataDic(
                DataDictionaryEnum.YU_YUE_END_TIME.getType(),
                DataDictionaryEnum.YU_YUE_END_TIME.getCode(),
                gfaBasicSetDto.getEndTime());
        return new FebsResponse().success();
    }
    /**
     * 新闻中心-列表
     * @param mallNewsInfo
     * @param request
src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java
@@ -1,14 +1,16 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.mall.entity.MallNewsCategory;
import cc.mrbird.febs.mall.entity.MallNewsInfo;
import cc.mrbird.febs.mall.entity.MallProductBuy;
import cc.mrbird.febs.mall.entity.MallProductNft;
import cc.mrbird.febs.mall.dto.AdminGfaBasicSetDto;
import cc.mrbird.febs.mall.dto.HlmScoreSetDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallProductBuyMapper;
import cc.mrbird.febs.mall.mapper.MallProductNftMapper;
import cc.mrbird.febs.mall.service.IMallNewsInfoService;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
@@ -29,6 +31,7 @@
    private final IMallNewsInfoService mallNewsInfoService;
    private final MallProductNftMapper mallProductNftMapper;
    private final MallProductBuyMapper mallProductBuyMapper;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    /**
     * NFT预约产品
@@ -91,6 +94,31 @@
    }
    /**
     * 基础设置
     * @param model
     * @return
     */
    @GetMapping("gfaBasicSet")
    @RequiresPermissions("gfaBasicSet:view")
    public String gfaBasicSet(Model model) {
        AdminGfaBasicSetDto gfaBasicSetDto = new AdminGfaBasicSetDto();
        DataDictionaryCustom startTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.YU_YUE_START_TIME.getType(),
                DataDictionaryEnum.YU_YUE_START_TIME.getCode());
        if (startTimeDic != null) {
            gfaBasicSetDto.setStartTime(startTimeDic.getValue());
        }
        DataDictionaryCustom endCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.YU_YUE_END_TIME.getType(),
                DataDictionaryEnum.YU_YUE_END_TIME.getCode());
        if (startTimeDic != null) {
            gfaBasicSetDto.setEndTime(endCntDic.getValue());
        }
        model.addAttribute("gfaBasicSet", gfaBasicSetDto);
        return FebsUtil.view("modules/news/gfaBasicSet");
    }
    /**
     * 新闻中心-列表
     * @return
     */
src/main/java/cc/mrbird/febs/mall/dto/AdminGfaBasicSetDto.java
New file
@@ -0,0 +1,10 @@
package cc.mrbird.febs.mall.dto;
import lombok.Data;
@Data
public class AdminGfaBasicSetDto {
    private String startTime;
    private String endTime;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallProductBuyRecordMapper.java
@@ -12,4 +12,6 @@
    List<ApiOrderBuyRecordInfoVo> selectByBuyId(@Param("productBuyId")Long productBuyId);
    List<MallProductBuyRecord> selectListByBuyId(@Param("buyId")Long buyId,@Param("state")Integer state);
    List<MallProductBuyRecord> selectByState(@Param("state")int value);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellRecordMapper.java
@@ -12,4 +12,6 @@
    List<ApiOrderSellRecordInfoVo> selectBySellId(@Param("productSellId")Long productSellId);
    List<MallProductSellRecord> selectListBySellId(@Param("sellId")Long sellId,@Param("state")Integer state);
    List<MallProductSellRecord> selectListByState(@Param("state")int value);
}
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -125,6 +125,24 @@
        agentService.BuyToSell();
    }
    /**
     * 买单
     * 看是否是开始显示订单的时间段,超出结束时间的买单,全部超时失败
     */
    @Scheduled(cron = "0 0/30 * * * ? ")
    public void timeGetOrderBuy() {
        agentService.timeGetOrderBuy();
    }
    /**
     * 卖单
     * 看是否是开始显示订单的时间段,超出结束时间的卖单,全部超时失败
     */
    @Scheduled(cron = "0 0/30 * * * ? ")
    public void timeGetOrderSell() {
        agentService.timeGetOrderSell();
    }
src/main/java/cc/mrbird/febs/mall/service/IAgentService.java
@@ -41,4 +41,8 @@
    void perkAgent();
    void BuyToSell();
    void timeGetOrderBuy();
    void timeGetOrderSell();
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -864,6 +864,88 @@
            }
        }
    }
    @Override
    public void timeGetOrderBuy() {
        DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date()));
        DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.YU_YUE_END_TIME.getType(),
                DataDictionaryEnum.YU_YUE_END_TIME.getCode()
        );
        DateTime endTime = DateUtil.parseTime(endTimeDic.getValue());
        /**
         * 当前时间比结束时间大
         */
        if(nowTime.compareTo(endTime) >= 0){
            List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectByState(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue());
            if(CollUtil.isNotEmpty(mallProductBuyRecords)){
                for(MallProductBuyRecord mallProductBuyRecord : mallProductBuyRecords){
                    /**
                     * 用户有超时未支付的订单
                     * 1、冻结账户
                     * 2、更新买单主表
                     * 2、更新卖单主表
                     * 3、更新买单子表的数据
                     * 3、更新卖单子表的数据
                     */
                    Long buyId = mallProductBuyRecord.getBuyId();
                    Long sellRecordId = mallProductBuyRecord.getSellRecordId();
                    MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(buyId);
                    Long memberIdBuy = mallProductBuy.getMemberId();
                    //冻结账户
                    MallMember mallMemberBuy = memberMapper.selectById(memberIdBuy);
                    mallMemberBuy.setIsFrozen(ProductEnum.MEMBER_FROZEN.getValue());
                    memberMapper.updateById(mallMemberBuy);
                    //更新买单子表的数据
                    mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
                    mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
                    //更新买单主表
                    mallProductBuy.setNftAva(mallProductBuy.getNftAva().add(mallProductBuyRecord.getPickNftCnt()));
                    mallProductBuyMapper.updateById(mallProductBuy);
                    //更新卖单子表的数据
                    MallProductSellRecord mallProductSellRecord = mallProductSellRecordMapper.selectById(sellRecordId);
                    mallProductSellRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
                    mallProductSellRecordMapper.updateById(mallProductSellRecord);
                    //更新卖单主表
                    Long sellId = mallProductSellRecord.getSellId();
                    MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId);
                    mallProductSell.setNftCntAva(mallProductSell.getNftCntAva().add(mallProductSellRecord.getNftCnt()));
                    mallProductSellMapper.updateById(mallProductSell);
                }
            }
        }
    }
    @Override
    public void timeGetOrderSell() {
        DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date()));
        DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.YU_YUE_END_TIME.getType(),
                DataDictionaryEnum.YU_YUE_END_TIME.getCode()
        );
        DateTime endTime = DateUtil.parseTime(endTimeDic.getValue());
        /**
         * 当前时间比结束时间大
         */
        if(nowTime.compareTo(endTime) >= 0){
            List<MallProductSellRecord> mallProductSellRecords = mallProductSellRecordMapper.selectListByState(ProductEnum.PRODUCT_MATE_STATE_PAY.getValue());
            if(CollUtil.isNotEmpty(mallProductSellRecords)){
                for(MallProductSellRecord mallProductSellRecord : mallProductSellRecords){
                    /**
                     * 卖方
                     * 1:冻结账户
                     */
                    Long sellId = mallProductSellRecord.getSellId();
                    MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId);
                    MallMember mallMember = memberMapper.selectById(mallProductSell.getMemberId());
                    mallMember.setIsFrozen(ProductEnum.MEMBER_FROZEN.getValue());
                    memberMapper.updateById(mallMember);
                }
            }
        }
    }
    public void insertSell(Long memberId,BigDecimal nftCnt,BigDecimal nftCntAva,
                           BigDecimal nftFee,BigDecimal fcmFeeCnt){
        String orderNo = MallUtils.getOrderNum("NFT");
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -758,7 +758,7 @@
        Long unfreezeMemberId = unfreezeDto.getMemberId();
        MallMember mallMember = this.baseMapper.selectById(unfreezeMemberId);
        Integer isFrozen = mallMember.getIsFrozen();
        if(1 != isFrozen){
        if(ProductEnum.MEMBER_UNFROZEN.getValue() == isFrozen){
            throw new FebsException("账户未被冻结");
        }
        DataDictionaryCustom memberFrozenFcmCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
@@ -781,7 +781,7 @@
        BigDecimal fcmCntAvaSub = fcmCntAva.subtract(memberFrozenFcmCnt);
        mallMemberAmount.setFcmCntAva(fcmCntAvaSub);
        mallMemberAmountMapper.updateById(mallMemberAmount);
        mallMember.setIsFrozen(0);
        mallMember.setIsFrozen(ProductEnum.MEMBER_UNFROZEN.getValue());
        this.baseMapper.updateById(mallMember);
        mallMoneyFlowService.addMoneyFlow(
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallProductServiceImpl.java
@@ -271,29 +271,53 @@
        return new FebsResponse().success();
    }
    public static void main(String[] args) {
        DateTime dateTime = DateUtil.parseTime("15:00:00");
        DateTime dateTime2 = DateUtil.parseTime("19:00:00");
        DateTime dateTime1 = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date()));
        System.out.println(dateTime);
        System.out.println(dateTime1);
        System.out.println(dateTime1.compareTo(dateTime));
        System.out.println(dateTime1.compareTo(dateTime2));
        System.out.println(dateTime1.compareTo(dateTime) >= 0 && dateTime1.compareTo(dateTime2) <= 0);
    }
    @Override
    public FebsResponse orderList(ApiOrderListDto apiOrderListDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        List<ApiOrderListVo> objects = new ArrayList<>();
        Integer orderType = apiOrderListDto.getOrderType();
        apiOrderListDto.setMemberId(memberId);
        //买单
        if(2 == orderType){
            IPage<ApiOrderListVo> page = new Page<>(apiOrderListDto.getPageNum(), apiOrderListDto.getPageSize());
            IPage<ApiOrderListVo> apiOrderListVoIPageBuy = mallProductBuyMapper.selectListInPage(page, apiOrderListDto);
            if(CollUtil.isNotEmpty(apiOrderListVoIPageBuy.getRecords())){
                for(ApiOrderListVo apiOrderListVo : apiOrderListVoIPageBuy.getRecords()){
                    objects.add(apiOrderListVo);
        DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date()));
        DataDictionaryCustom startTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.YU_YUE_START_TIME.getType(),
                DataDictionaryEnum.YU_YUE_START_TIME.getCode()
        );
        DateTime startTime = DateUtil.parseTime(startTimeDic.getValue());
        DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.YU_YUE_END_TIME.getType(),
                DataDictionaryEnum.YU_YUE_END_TIME.getCode()
        );
        DateTime endTime = DateUtil.parseTime(endTimeDic.getValue());
        if(nowTime.compareTo(startTime) >= 0 && nowTime.compareTo(endTime) <= 0){
            //买单
            if(2 == orderType){
                IPage<ApiOrderListVo> page = new Page<>(apiOrderListDto.getPageNum(), apiOrderListDto.getPageSize());
                IPage<ApiOrderListVo> apiOrderListVoIPageBuy = mallProductBuyMapper.selectListInPage(page, apiOrderListDto);
                if(CollUtil.isNotEmpty(apiOrderListVoIPageBuy.getRecords())){
                    for(ApiOrderListVo apiOrderListVo : apiOrderListVoIPageBuy.getRecords()){
                        objects.add(apiOrderListVo);
                    }
                }
            }
        }
        //卖单
        if(1 == orderType){
            IPage<ApiOrderListVo> page = new Page<>(apiOrderListDto.getPageNum(), apiOrderListDto.getPageSize());
            IPage<ApiOrderListVo> apiOrderListVoIPageSell = mallProductSellMapper.selectListInPage(page, apiOrderListDto);
            if(CollUtil.isNotEmpty(apiOrderListVoIPageSell.getRecords())){
                for(ApiOrderListVo apiOrderListVo : apiOrderListVoIPageSell.getRecords()){
                    objects.add(apiOrderListVo);
            //卖单
            if(1 == orderType){
                IPage<ApiOrderListVo> page = new Page<>(apiOrderListDto.getPageNum(), apiOrderListDto.getPageSize());
                IPage<ApiOrderListVo> apiOrderListVoIPageSell = mallProductSellMapper.selectListInPage(page, apiOrderListDto);
                if(CollUtil.isNotEmpty(apiOrderListVoIPageSell.getRecords())){
                    for(ApiOrderListVo apiOrderListVo : apiOrderListVoIPageSell.getRecords()){
                        objects.add(apiOrderListVo);
                    }
                }
            }
        }
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderBuyInfoVo.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -11,12 +12,20 @@
@ApiModel(value = "ApiOrderBuyInfoVo", description = "信息返回类")
public class ApiOrderBuyInfoVo {
    private Long id;
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    @ApiModelProperty(value = "预约状态  0:失败 1:进行中 2:超时  3:已完成")
    private int state;//预约状态  0:失败 1:进行中 2:超时  3:已完成
    @ApiModelProperty(value = "匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成")
    private int mateState;//匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成
    @ApiModelProperty(value = "nft预约额度")
    private BigDecimal nftTotal;//nft预约额度
    @ApiModelProperty(value = "待分配")
    private BigDecimal nftAva;//待分配
    @ApiModelProperty(value = "匹配时间")
    private Date orderTime;//匹配时间
    @ApiModelProperty(value = "支付时间")
    private Date payTime;//支付时间
    @ApiModelProperty(value = "对方详情")
    private List<ApiOrderBuyRecordInfoVo> apiOrderBuyRecordInfoVos;
}
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderBuyRecordInfoVo.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -10,20 +11,35 @@
@ApiModel(value = "ApiOrderBuyRecordInfoVo", description = "信息返回类")
public class ApiOrderBuyRecordInfoVo {
    private Long id;//
    @ApiModelProperty(value = "对方账户")
    private String accountLogin;//
    @ApiModelProperty(value = "分配额度、支付金额")
    private BigDecimal pickNftCnt;//分配额度、支付金额
    @ApiModelProperty(value = "匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成")
    private Integer state;//匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成
    @ApiModelProperty(value = "匹配时间")
    private Date orderTime;//匹配时间
    @ApiModelProperty(value = "支付时间")
    private Date payTime;//支付时间
    @ApiModelProperty(value = "支付凭证")
    private String nftImg;//支付凭证
    @ApiModelProperty(value = "支付类型 1:微信 2:支付宝 3:银行转账 4:USDT转账")
    private Integer type;//支付类型 1:微信 2:支付宝 3:银行转账 4:USDT转账
    @ApiModelProperty(value = "微信收款码")
    private String wxQrcode;//微信收款码
    @ApiModelProperty(value = "支付宝收款码")
    private String aliQrcode;//支付宝收款码
    @ApiModelProperty(value = "真实姓名")
    private String bankName;//真实姓名
    @ApiModelProperty(value = "银行卡号")
    private String bankNo;//银行卡号
    @ApiModelProperty(value = "开户行")
    private String bank;//开户行
    @ApiModelProperty(value = "手机号")
    private String phone;//手机号
    @ApiModelProperty(value = "USDT通道类型:  TRC20 BEP20")
    private String usdtTongdao;//USDT通道类型:  TRC20 BEP20
    @ApiModelProperty(value = "USDT地址")
    private String usdtAddress;//USDT地址
}
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderSellInfoVo.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -10,13 +11,21 @@
@ApiModel(value = "ApiOrderSellInfoVo", description = "信息返回类")
public class ApiOrderSellInfoVo {
    private Long id;
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    @ApiModelProperty(value = "动态NFT总数")
    private BigDecimal nftTotal;//动态NFT总数
    @ApiModelProperty(value = "实际提现数量")
    private BigDecimal nftCnt;//实际提现数量
    @ApiModelProperty(value = "剩余数量")
    private BigDecimal nftCntAva;//剩余数量
    @ApiModelProperty(value = "NFT手续费")
    private BigDecimal nftFee;//NFT手续费
    @ApiModelProperty(value = "代币手续费")
    private BigDecimal fcmFee;//代币手续费
    @ApiModelProperty(value = "预约状态  0:失败 1:进行中 2:超时  3:已完成")
    private Integer state;//预约状态  0:失败 1:进行中 2:超时  3:已完成
    @ApiModelProperty(value = "对方支付方式详情")
    private List<ApiOrderSellRecordInfoVo> apiOrderSellRecordInfoVos;
}
src/main/java/cc/mrbird/febs/mall/vo/ApiOrderSellRecordInfoVo.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -10,20 +11,34 @@
@ApiModel(value = "ApiOrderSellRecordInfoVo", description = "信息返回类")
public class ApiOrderSellRecordInfoVo {
    private Long id;
    @ApiModelProperty(value = "对方账户")
    private String accountLogin;//
    @ApiModelProperty(value = "匹配时间")
    private Date orderTime;//匹配时间
    @ApiModelProperty(value = "支付时间")
    private Date payTime;//支付时间
    @ApiModelProperty(value = "支付数量")
    private BigDecimal nftCnt;//支付数量
    @ApiModelProperty(value = "支付凭证")
    private String nftImg;//支付凭证
    @ApiModelProperty(value = "支付类型 1:微信 2:支付宝 3:银行转账 4:USDT转账")
    private Integer type;//支付类型 1:微信 2:支付宝 3:银行转账 4:USDT转账
    @ApiModelProperty(value = "匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成")
    private Integer state;//匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成
    @ApiModelProperty(value = "微信收款码")
    private String wxQrcode;//微信收款码
    @ApiModelProperty(value = "支付宝收款码")
    private String aliQrcode;//支付宝收款码
    @ApiModelProperty(value = "真实姓名")
    private String bankName;//真实姓名
    @ApiModelProperty(value = "银行卡号")
    private String bankNo;//银行卡号
    @ApiModelProperty(value = "开户行")
    private String bank;//开户行
    @ApiModelProperty(value = "手机号")
    private String phone;//手机号
    @ApiModelProperty(value = "USDT通道类型:  TRC20 BEP20")
    private String usdtTongdao;//USDT通道类型:  TRC20 BEP20
    @ApiModelProperty(value = "USDT地址")
    private String usdtAddress;//USDT地址
}
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -66,14 +66,24 @@
    @ApiModelProperty(value = "内转标识 1:开启 2:关闭")
    private Integer insideWith;
    @ApiModelProperty(value = "静态NFT")
    private BigDecimal staticNft;//静态NFT
    @ApiModelProperty(value = "动态NFT")
    private BigDecimal trendsNft;//动态NFT
    @ApiModelProperty(value = "冻结NFT")
    private BigDecimal frozenNft;//冻结NFT
    @ApiModelProperty(value = "FCM代币可用")
    private BigDecimal fcmCntAva;//FCM代币可用
    @ApiModelProperty(value = "FCM代币冻结")
    private BigDecimal fcmCntFrozen;//FCM代币冻结
    @ApiModelProperty(value = "令牌可用")
    private BigDecimal tokenAva;//令牌可用
    @ApiModelProperty(value = "令牌冻结")
    private BigDecimal tokenFrozen;//令牌冻结
    @ApiModelProperty(value = "FCM提现收续费")
    private BigDecimal outFcmFee;//FCM提现收续费
    @ApiModelProperty(value = "FCM价格")
    private BigDecimal fcmPrice;//FCM价格
}
src/main/resources/mapper/modules/MallProductBuyRecordMapper.xml
@@ -26,4 +26,10 @@
          and a.state = #{state}
    </select>
    <select id="selectByState" resultType="cc.mrbird.febs.mall.entity.MallProductBuyRecord">
        select a.*
        from mall_product_buy_record a
        where a.state = #{state}
    </select>
</mapper>
src/main/resources/mapper/modules/MallProductSellRecordMapper.xml
@@ -26,4 +26,10 @@
            and a.state = #{state}
    </select>
    <select id="selectListByState" resultType="cc.mrbird.febs.mall.entity.MallProductSellRecord">
        select a.*
        from mall_product_sell_record a
        where a.state = #{state}
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/news/gfaBasicSet.html
New file
@@ -0,0 +1,76 @@
<div class="layui-fluid layui-anim febs-anim" id="gfa-Basic-set" lay-title="预约设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="gfa-Basic-set-form">
            <div class="layui-card">
                <div class="layui-card-body">
                    <blockquote class="layui-elem-quote blue-border">买卖单时间设置</blockquote>
                    <div class="layui-form-item">
                        <label class="layui-form-label febs-form-item-require">开始时间:</label>
                        <div class="layui-input-block">
                            <input type="text" name="startTime" class="layui-input" id="startTimePick" placeholder="HH:mm:ss">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label febs-form-item-require">结束时间:</label>
                        <div class="layui-input-block">
                            <input type="text" name="endTime" class="layui-input" id="endTimePick" placeholder="HH:mm:ss">
                        </div>
                    </div>
                    <div class="layui-card-footer">
                        <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="gfa-Basic-set-submit" id="submit">保存</button>
                    </div>
                </div>
            </div>
        </form>
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
</style>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'febs', 'form', 'eleTree','laydate'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            gfaBasicSet = [[${gfaBasicSet}]],
            laydate = layui.laydate,
            $view = $('#gfa-Basic-set');
        //日期范围
        laydate.render({
            elem: '#startTimePick',
            type: 'time'
        });
        //日期范围
        laydate.render({
            elem: '#endTimePick',
            type: 'time'
        });
        initGfaBasicSetValue();
        form.render();
        function initGfaBasicSetValue() {
            form.val("gfa-Basic-set-form", {
                "startTime": gfaBasicSet.startTime,
                "endTime": gfaBasicSet.endTime
            });
        }
        form.on('submit(gfa-Basic-set-submit)', function (data) {
            febs.post(ctx + 'admin/news/gfaBasicSet', data.field, function (res) {
                febs.alert.success('设置成功');
                return ;
            });
            return false;
        });
    });
</script>
src/main/resources/templates/index.html
@@ -3,7 +3,7 @@
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="utf-8">
    <title>鸿楼梦 权限系统</title>
    <title>GFA 权限系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">