KKSU
2023-11-27 83b56237a9e0b379b46d31ab77def13226f33548
匹配
4 files added
18 files modified
913 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java 37 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminBuyRecordPayDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminPickSellRecordDtoDto.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallProductNftMapper.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 50 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java 149 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductBuyVo.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java 6 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallProductNftMapper.xml 22 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/news/buyRecordImg.html 82 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/news/buyRecordPay.html 122 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/news/productBuyList.html 8 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/news/productBuyListNew.html 299 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/news/productSellPick.html 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -230,4 +230,21 @@
    }
    //卖单用户确认 end
    //买单取消 start
    @Bean
    public DirectExchange fcmOrderBuyCancelExchange() {
        return new DirectExchange(RabbitQueueEnum.FCMPAY_FCM_ORDER_BUY_CANCEL.getExchange());
    }
    @Bean
    public Queue fcmOrderBuyCancelQueue() {
        return new Queue(RabbitQueueEnum.FCMPAY_FCM_ORDER_BUY_CANCEL.getQueue());
    }
    @Bean
    public Binding fcmOrderBuyCancelBind() {
        return BindingBuilder.bind(fcmOrderBuyCancelQueue()).to(fcmOrderBuyCancelExchange()).with(RabbitQueueEnum.FCMPAY_FCM_ORDER_BUY_CANCEL.getRoute());
    }
    //买单取消 end
}
src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java
@@ -101,6 +101,15 @@
    }
    /**
     * 用户NFT预约子记录列表
     */
    @GetMapping("getBuyRecordList")
    public FebsResponse getBuyRecordList(MallProductBuy mallProductBuy, QueryRequest request) {
        Map<String, Object> data = getDataTable(mallNewsInfoService.getBuyRecordList(mallProductBuy, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 用户NFT提现列表
     */
    @GetMapping("getSellList")
@@ -129,6 +138,33 @@
    }
    /**
     * 用户NFT提现-取消
     */
    @GetMapping("buyRecordCancel/{id}")
    @ControllerEndpoint(operation = " 用户NFT提现-取消", exceptionMessage = "操作失败")
    public FebsResponse buyRecordCancel(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallNewsInfoService.buyRecordCancel(id);
    }
    /**
     * 用户NFT提现-确认支付
     */
    @PostMapping("buyRecordPay")
    @ControllerEndpoint(operation = "用户NFT提现-确认支付", exceptionMessage = "操作失败")
    public FebsResponse buyRecordPay(@Valid AdminBuyRecordPayDto buyRecordPayDto) {
        return mallNewsInfoService.buyRecordPay(buyRecordPayDto);
    }
    /**
     * 用户NFT提现-确认收款
     */
    @GetMapping("buyRecordConfirm/{id}")
    @ControllerEndpoint(operation = " 用户NFT提现-确认收款", exceptionMessage = "操作失败")
    public FebsResponse buyRecordConfirm(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallNewsInfoService.buyRecordConfirm(id);
    }
    /**
     * 基础设置
     * @param gfaBasicSetDto
     * @return
src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java
@@ -8,6 +8,7 @@
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.MallProductBuyRecordMapper;
import cc.mrbird.febs.mall.mapper.MallProductNftMapper;
import cc.mrbird.febs.mall.service.IMallNewsInfoService;
import cn.hutool.core.util.ObjectUtil;
@@ -31,6 +32,7 @@
    private final IMallNewsInfoService mallNewsInfoService;
    private final MallProductNftMapper mallProductNftMapper;
    private final MallProductBuyMapper mallProductBuyMapper;
    private final MallProductBuyRecordMapper mallProductBuyRecordMapper;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    /**
@@ -73,6 +75,15 @@
    }
    /**
     * 用户NFT预约列表
     */
    @GetMapping("productBuyListNew")
    @RequiresPermissions("productBuyListNew:view")
    public String productBuyListNew() {
        return FebsUtil.view("modules/news/productBuyListNew");
    }
    /**
     * 用户NFT提现列表
     */
    @GetMapping("productSellList")
@@ -93,6 +104,32 @@
        return FebsUtil.view("modules/news/productSellPick");
    }
    /**
     * 用户预约打款记录--确认支付
     * @return
     */
    @GetMapping("buyRecordPay/{id}")
    @RequiresPermissions("buyRecordPay:update")
    public String buyRecordPay(@PathVariable long id, Model model) {
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(id);
        model.addAttribute("mallProductBuyRecord", mallProductBuyRecord);
        return FebsUtil.view("modules/news/buyRecordPay");
    }
    /**
     * 用户预约打款记录--凭证
     * @return
     */
    @GetMapping("buyRecordImg/{id}")
    @RequiresPermissions("buyRecordImg:update")
    public String buyRecordImg(@PathVariable long id, Model model) {
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(id);
        model.addAttribute("mallProductBuyRecord", mallProductBuyRecord);
        return FebsUtil.view("modules/news/buyRecordImg");
    }
    /**
     * 基础设置
     * @param model
src/main/java/cc/mrbird/febs/mall/dto/AdminBuyRecordPayDto.java
New file
@@ -0,0 +1,16 @@
package cc.mrbird.febs.mall.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class AdminBuyRecordPayDto {
    @NotNull(message = "类型参数不能为空")
    private Long id;//ApiOrderSellRecordInfoVo中的ID,预约单子表ID
    @NotBlank(message = "类型参数不能为空")
    private String nftImg;//支付凭证
    @NotNull(message = "类型参数不能为空")
    private Integer type;//支付类型 1:微信 2:支付宝 3:银行转账 4:USDT转账
}
src/main/java/cc/mrbird/febs/mall/dto/AdminPickSellRecordDtoDto.java
@@ -2,10 +2,15 @@
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class AdminPickSellRecordDtoDto {
    @NotNull(message = "参数不能为空")
    private Long productSellId;
    @NotNull(message = "参数不能为空")
    private Long id;
    @NotBlank(message = "参数不能为空")
    private String pickNftCnt;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallProductNftMapper.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.common.enumerates.ProductEnum;
import cc.mrbird.febs.mall.entity.MallProductBuy;
import cc.mrbird.febs.mall.entity.MallProductBuyRecord;
import cc.mrbird.febs.mall.entity.MallProductNft;
import cc.mrbird.febs.mall.entity.MallProductSell;
import cc.mrbird.febs.mall.vo.*;
@@ -25,4 +26,6 @@
    List<AdminMallProductSellPickVo> selectProductSellByState(@Param("state")int value);
    List<MallProductNft> selectListByState(@Param("state")ProductEnum productNftOpen);
    IPage<MallProductBuyRecord> getBuyRecordList(Page<MallProductBuyRecord> page, @Param("record")MallProductBuy mallProductBuy);
}
src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.dto.AdminBuyRecordPayDto;
import cc.mrbird.febs.mall.dto.AdminMallProductNftDto;
import cc.mrbird.febs.mall.dto.AdminPickSellRecordDtoDto;
import cc.mrbird.febs.mall.dto.MallNewsInfoDto;
@@ -44,9 +45,17 @@
    IPage<AdminMallProductBuyVo> getBuyList(MallProductBuy mallProductBuy, QueryRequest request);
    IPage<MallProductBuyRecord> getBuyRecordList(MallProductBuy mallProductBuy, QueryRequest request);
    IPage<AdminMallProductSellVo> getSellList(MallProductSell mallProductSell, QueryRequest request);
    List<AdminMallProductSellPickVo> findSellList();
    FebsResponse pickSellRecord(AdminPickSellRecordDtoDto pickSellRecordDto);
    FebsResponse buyRecordPay(AdminBuyRecordPayDto buyRecordPayDto);
    FebsResponse buyRecordConfirm(Long id);
    FebsResponse buyRecordCancel(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
@@ -59,4 +59,6 @@
    void fcmNFTExchangeMsg(String cnt);
    void fcmOrderSellInsureMsg(Long sellRecordId);
    void fcmOrderBuyCancelMsg(Long buyRecordId);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -8,6 +8,7 @@
import cc.mrbird.febs.mall.service.*;
import cc.mrbird.febs.mall.vo.AdminMallMoneyFlowVo;
import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cc.mrbird.febs.system.mapper.UserMapper;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
@@ -62,6 +63,7 @@
    private final MallProductSellMapper mallProductSellMapper;
    private final MallProductSellRecordMapper mallProductSellRecordMapper;
    private final MallProductNftMapper mallProductNftMapper;
    private final AgentProducer agentProducer;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -888,29 +890,31 @@
                     * 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);
                    agentProducer.sendFcmOrderBuyCancelMsg(mallProductBuyRecord.getId());
//                    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);
                }
            }
        }
src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java
@@ -2,21 +2,30 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.enumerates.FlowTypeNewEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeNewEnum;
import cc.mrbird.febs.common.enumerates.ProductEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.mall.conversion.MallProductNftConversion;
import cc.mrbird.febs.mall.dto.AdminBuyRecordPayDto;
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.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IMallNewsInfoService;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -42,6 +51,8 @@
    private final MallProductSellMapper mallProductSellMapper;
    private final MallProductSellRecordMapper mallProductSellRecordMapper;
    private final MallProductBuyRecordMapper mallProductBuyRecordMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final AgentProducer agentProducer;
    @Override
    public IPage<AdminMallNewsInfoVo> getNewInfoList(MallNewsInfo mallNewsInfo, QueryRequest request) {
@@ -195,14 +206,18 @@
    public IPage<AdminMallProductBuyVo> getBuyList(MallProductBuy mallProductBuy, QueryRequest request) {
        Page<AdminMallProductBuyVo> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<AdminMallProductBuyVo> adminMallProductBuyVoIPage = mallProductNftMapper.getBuyList(page, mallProductBuy);
        if(CollUtil.isNotEmpty(adminMallProductBuyVoIPage.getRecords())){
            List<AdminMallProductBuyVo> records = adminMallProductBuyVoIPage.getRecords();
            for(AdminMallProductBuyVo adminMallProductBuyVo : records){
                List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectRecordListByBuyId(adminMallProductBuyVo.getId());
                adminMallProductBuyVo.setMallProductBuyRecords(mallProductBuyRecords);
            }
        }
        return adminMallProductBuyVoIPage;
    }
    @Override
    public IPage<MallProductBuyRecord> getBuyRecordList(MallProductBuy mallProductBuy, QueryRequest request) {
        if(ObjectUtil.isNotEmpty(mallProductBuy.getAccountLogin())){
            String accountLogin = mallProductBuy.getAccountLogin();
        }
        Page<MallProductBuyRecord> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MallProductBuyRecord> mallProductBuyRecordIPage = mallProductNftMapper.getBuyRecordList(page, mallProductBuy);
        return mallProductBuyRecordIPage;
    }
    @Override
@@ -281,4 +296,124 @@
        mallProductBuyMapper.updateById(mallProductBuy);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse buyRecordPay(AdminBuyRecordPayDto buyRecordPayDto) {
        Long buyRecordId = buyRecordPayDto.getId();
        String nftImg = buyRecordPayDto.getNftImg();
        Integer type = buyRecordPayDto.getType();
        /**
         * 验证订单是否存在
         * 更新买单状态
         * 更新卖单状态
         * 生成流水信息
         */
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(buyRecordId);
        if(ObjectUtil.isEmpty(mallProductBuyRecord)){
            throw new FebsException("记录不存在");
        }
        Integer state = mallProductBuyRecord.getState();
        if(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue() != state){
            throw new FebsException("记录不是待支付状态");
        }
        MallProductSellRecord mallProductSellRecord = mallProductSellRecordMapper.selectById(mallProductBuyRecord.getSellRecordId());
        if(ObjectUtil.isEmpty(mallProductSellRecord)){
            throw new FebsException("记录不存在");
        }
        Integer stateSell = mallProductSellRecord.getState();
        if(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue() != stateSell){
            throw new FebsException("记录不是待支付状态");
        }
        DateTime payTime = DateUtil.date();
        mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_PAY.getValue());
        mallProductBuyRecord.setPayTime(payTime);
        mallProductBuyRecord.setNftImg(nftImg);
        mallProductBuyRecord.setType(type);
        mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
        mallProductSellRecord.setState(ProductEnum.PRODUCT_MATE_STATE_PAY.getValue());
        mallProductSellRecord.setPayTime(payTime);
        mallProductSellRecord.setNftImg(nftImg);
        mallProductSellRecord.setType(type);
        mallProductSellRecordMapper.updateById(mallProductSellRecord);
        String orderNo = MallUtils.getOrderNum("ZF");
        mallMoneyFlowService.addMoneyFlow(
                mallProductSellRecord.getMemberId(),
                mallProductBuyRecord.getPickNftCnt(),
                MoneyFlowTypeNewEnum.PAY.getValue(),
                orderNo,
                mallProductSellRecord.getMemberId(),
                FlowTypeNewEnum.NFT.getValue(),
                MoneyFlowTypeNewEnum.PAY.getDescrition());
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse buyRecordConfirm(Long id) {
        /**
         * 验证订单是否存在
         * 更新买单状态
         * 更新卖单状态
         * 生成流水信息
         */
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallProductBuyRecord)){
            throw new FebsException("记录不存在");
        }
        Integer state = mallProductBuyRecord.getState();
        if(ProductEnum.PRODUCT_MATE_STATE_PAY.getValue() != state){
            throw new FebsException("记录不是已支付状态");
        }
        Long sellRecordId = mallProductBuyRecord.getSellRecordId();
        MallProductSellRecord mallProductSellRecord = mallProductSellRecordMapper.selectById(mallProductBuyRecord.getSellRecordId());
        if(ObjectUtil.isEmpty(mallProductSellRecord)){
            throw new FebsException("记录不存在");
        }
        Integer stateSell = mallProductSellRecord.getState();
        if(ProductEnum.PRODUCT_MATE_STATE_PAY.getValue() != stateSell){
            throw new FebsException("记录不是已支付状态");
        }
        mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_CONFIRM.getValue());
        mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
        mallProductSellRecord.setState(ProductEnum.PRODUCT_MATE_STATE_CONFIRM.getValue());
        mallProductSellRecordMapper.updateById(mallProductSellRecord);
        agentProducer.sendFcmOrderSellInsureMsg(sellRecordId);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse buyRecordCancel(Long id) {
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallProductBuyRecord)){
            throw new FebsException("记录不存在");
        }
        Integer state = mallProductBuyRecord.getState();
        if(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue() != state){
            throw new FebsException("记录不是待支付状态");
        }
        Long sellRecordId = mallProductBuyRecord.getSellRecordId();
        //更新买单子表的数据
        mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
        mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
        //更新买单主表
        MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(mallProductBuyRecord.getBuyId());
        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);
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -1228,6 +1228,31 @@
        mallProductBuyMapper.updateById(mallProductBuy);
    }
    @Override
    public void fcmOrderBuyCancelMsg(Long buyRecordId) {
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(buyRecordId);
        if(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue() != mallProductBuyRecord.getState()){
            return;
        }
        Long sellRecordId = mallProductBuyRecord.getSellRecordId();
        //更新买单子表的数据
        mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
        mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
        //更新买单主表
        MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(mallProductBuyRecord.getBuyId());
        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);
    }
    public static void main(String[] args) {
        BigDecimal divide = new BigDecimal(12000).divide(new BigDecimal(10000), 0, BigDecimal.ROUND_DOWN);
        System.out.println(divide);
src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductBuyVo.java
@@ -14,6 +14,7 @@
    private Long id;
    private String accountLogin;//登录账户
    private String orderNo;//编号
    private Long memberId;//
    private Long sellId;//出售ID
    private Long productNftId;//预约NFT编码
@@ -23,6 +24,4 @@
    private BigDecimal nftAva;//nft分配额度
    private Date orderTime;//匹配时间
    private Date payTime;//支付时间
    private List<MallProductBuyRecord> mallProductBuyRecords;
}
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -27,4 +27,6 @@
    public static final String QUEUE_FCM_NFT_EXCHANGE = "queue_fcm_nft_exchange";
    //卖单用户确认
    public static final String QUEUE_FCM_ORDER_SELL_INSURE = "queue_fcm_order_sell_insure";
    //买单取消
    public static final String QUEUE_FCM_ORDER_BUY_CANCEL = "queue_fcm_order_buy_cancel";
}
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -120,4 +120,16 @@
        }
    }
    @RabbitListener(queues = QueueConstants.QUEUE_FCM_ORDER_BUY_CANCEL)
    public void fcmOrderBuyCancelMsg(Long buyRecordId) {
        log.info("收到买单取消确认:{}",buyRecordId);
        try {
            memberProfitService.fcmOrderBuyCancelMsg(buyRecordId);
        } catch (Exception e) {
            log.error("收到买单取消确认异常", e);
            // todo 更新表
        }
    }
}
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -5,6 +5,10 @@
@Getter
public enum RabbitQueueEnum {
    //买单取消
    FCMPAY_FCM_ORDER_BUY_CANCEL("exchange_fcm_order_buy_cancel",
            "route_key_fcm_order_buy_cancel",
            QueueConstants.QUEUE_FCM_ORDER_BUY_CANCEL),
    //卖单用户确认
    FCMPAY_FCM_ORDER_SELL_INSURE("exchange_fcm_order_sell_insure",
            "route_key_fcm_order_sell_insure",
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -94,6 +94,12 @@
                RabbitQueueEnum.FCMPAY_FCM_ORDER_SELL_INSURE.getRoute(),sellRecordId);
    }
    public void sendFcmOrderBuyCancelMsg(Long buyRecordId) {
        log.info("发送买单取消:{}",buyRecordId);
        rabbitTemplate.convertAndSend(RabbitQueueEnum.FCMPAY_FCM_ORDER_BUY_CANCEL.getExchange(),
                RabbitQueueEnum.FCMPAY_FCM_ORDER_BUY_CANCEL.getRoute(),buyRecordId);
    }
    /**
     * 发送代理自动升级消息
     *
src/main/resources/mapper/modules/MallProductNftMapper.xml
@@ -32,6 +32,28 @@
        order by a.CREATED_TIME desc
    </select>
    <select id="getBuyRecordList" resultType="cc.mrbird.febs.mall.entity.MallProductBuyRecord">
        SELECT
        a.*,
        b.account_login
        FROM mall_product_buy_record a
        left join mall_member b on a.member_id = b.id
        <where>
            <if test="record != null" >
                <if test="record.accountLogin!=null and record.accountLogin!=''">
                    and a.buy_id in  (
                    SELECT
                    c.id
                    FROM mall_product_buy c
                    left join mall_member d on c.member_id = d.id
                        where d.account_login like concat('%',  #{record.accountLogin},'%')
                    )
                </if>
            </if>
        </where>
        order by a.CREATED_TIME desc
    </select>
    <select id="getSellList" resultType="cc.mrbird.febs.mall.vo.AdminMallProductSellVo">
        SELECT
            a.*,
src/main/resources/templates/febs/views/modules/news/buyRecordImg.html
New file
@@ -0,0 +1,82 @@
<style>
    #buyRecordImg-update {
        padding: 20px 25px 25px 0;
    }
    #buyRecordImg-update .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #buyRecordImg-update #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #buyRecordImg-update .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #buyRecordImg-update img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="buyRecordImg-update">
    <form class="layui-form" action="" lay-filter="buyRecordImg-update-form">
        <div class="layui-form-item febs-hide">
            <label class="layui-form-label febs-form-item-require">id:</label>
            <div class="layui-input-block">
                <input type="text" name="id">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">凭证:</label>
            <div class="layui-input-block">
                <div class="layui-upload">
                    <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 20px;">
                        <div class="layui-upload-list" id="nftImgImagePay"></div>
                    </blockquote>
                    <div class="febs-hide">
                        <input type="text" id="nftImg"  name="nftImg" autocomplete="off" class="layui-input" readonly>
                    </div>
                </div>
            </div>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'upload'], function () {
        var $ = layui.$,
            febs = layui.febs,
            layer = layui.layer,
            upload = layui.upload,
            form = layui.form,
            mallProductBuyRecord = [[${mallProductBuyRecord}]],
            $view = $('#buyRecordImg-update'),
            $uploadDel = $view.find('#uploadDel'),
            validate = layui.validate;
        form.render();
        initPayImgValue();
        function initPayImgValue() {
            var nftImg = mallProductBuyRecord.nftImg;
            layer.open({
                type: 1,
                title: "图片",
                skin: 'layui-layer-rim', //加上边框
                area: ['80%', '80%'], //宽高
                shadeClose: true, //开启遮罩关闭
                end: function (index, layero) {
                    return false;
                },
                content: '<div style="text-align:center"><img src="' + nftImg + '" /></div>'
            });
            // $('#nftImgImagePay').html('<img src="' + nftImg + '" alt="" class="layui-upload-img new-image" style="width: 100px">')
            form.val("buyRecordImg-update-form", {
                "id": mallProductBuyRecord.id,
                "nftImg": mallProductBuyRecord.nftImg,
            });
        }
    });
</script>
src/main/resources/templates/febs/views/modules/news/buyRecordPay.html
New file
@@ -0,0 +1,122 @@
<style>
    #buyRecordPay-update {
        padding: 20px 25px 25px 0;
    }
    #buyRecordPay-update .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #buyRecordPay-update #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #buyRecordPay-update .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #buyRecordPay-update img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="buyRecordPay-update">
    <form class="layui-form" action="" lay-filter="buyRecordPay-update-form">
        <div class="layui-form-item febs-hide">
            <label class="layui-form-label febs-form-item-require">id:</label>
            <div class="layui-input-block">
                <input type="text" name="id">
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">待支付:</label>
                <div class="layui-input-block">
                    <input type="text" name="pickNftCnt" lay-verify="required" placeholder="" autocomplete="off" class="layui-input" readonly>
                </div>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">缩略图:</label>
            <div class="layui-input-block">
                <div class="layui-upload">
                    <button type="button" class="layui-btn layui-btn-normal layui-btn" id="nftImgUploadPay">上传</button>
                    <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
                        <div class="layui-upload-list" id="nftImgImagePay"></div>
                    </blockquote>
                    <div class="febs-hide">
                        <input type="text" id="nftImg"  name="nftImg" autocomplete="off" class="layui-input" readonly>
                    </div>
                </div>
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label">支付类型:</label>
                <div class="layui-input-block">
                    <input type="radio" name="type" value="1" title="微信" checked/>
                    <input type="radio" name="type" value="2" title="支付宝"  />
                    <input type="radio" name="type" value="3" title="银行转账"  />
                    <input type="radio" name="type" value="4" title="USDT转账" />
                </div>
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="buyRecordPay-update-form-submit" id="submit"></button>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'upload'], function () {
        var $ = layui.$,
            febs = layui.febs,
            layer = layui.layer,
            upload = layui.upload,
            form = layui.form,
            mallProductBuyRecord = [[${mallProductBuyRecord}]],
            $view = $('#buyRecordPay-update'),
            $uploadDel = $view.find('#uploadDel'),
            validate = layui.validate;
        form.render();
        initPayValue();
        form.on('submit(buyRecordPay-update-form-submit)', function (data) {
            febs.post(ctx + 'admin/news/buyRecordPay', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-product-buy').find('#query').click();
            });
            return false;
        });
        upload.render({
            elem: '#nftImgUploadPay'
            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
            ,multiple: false
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#nftImgImagePay').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">')
                });
            }
            ,done: function(res){
                $("#nftImg").val(res.data.src);
            }
        });
        function initPayValue() {
            var nftImg = mallProductBuyRecord.nftImg;
            $('#nftImgImagePay').html('<img src="' + nftImg + '" alt="" class="layui-upload-img new-image" style="width: 100px">')
            form.val("buyRecordPay-update-form", {
                "id": mallProductBuyRecord.id,
                "pickNftCnt": mallProductBuyRecord.pickNftCnt,
                "type": mallProductBuyRecord.type,
                "nftImg": mallProductBuyRecord.nftImg,
            });
        }
    });
</script>
src/main/resources/templates/febs/views/modules/news/productBuyList.html
@@ -137,9 +137,11 @@
                            '<td>'+data.mallProductBuyRecords[i].accountLogin+'</td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].pickNftCnt+'</td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].orderTime+'</td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].payTime+'</td>\n' +
                            // '<td>'+data.mallProductBuyRecords[i].payTime+'</td>\n' +
                            '<td><img src="'+data.mallProductBuyRecords[i].nftImg+'" alt="" ></td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].type+'</td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].state+'</td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].state+'</td>\n' +
                            '<td>'+data.mallProductBuyRecords[i].state+'</td>\n' +
                            '</tr>';
                        obj.tr.after(html);
@@ -149,10 +151,12 @@
                        '      <td>匹配用户</td>\n' +
                        '      <td>支付金额</td>\n' +
                        '      <td>匹配时间</td>\n' +
                        '      <td>支付时间</td>\n' +
                        // '      <td>支付时间</td>\n' +
                        '      <td>支付凭证</td>\n' +
                        '      <td>支付类型</td>\n' +
                        '      <td>支付状态</td>\n' +
                        '      <td>支付状态</td>\n' +
                        '      <td>操作</td>\n' +
                        '    </tr>';
                    obj.tr.after(html);
                }
src/main/resources/templates/febs/views/modules/news/productBuyListNew.html
New file
@@ -0,0 +1,299 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-product-buy" lay-title="用户预约记录">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label">登录账户:</label>
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="登录账户" name="accountLogin" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
<!--                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="add">-->
<!--                                    新增-->
<!--                                </div>-->
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="buyTable" lay-data="{id: 'buyTable'}" id="buyTable"></table>
                </div>
                <blockquote class="layui-elem-quote blue-border">用户预约打款记录</blockquote>
                <div class="layui-card-body febs-table-full">
                    <table lay-filter="buyRecordTable"  lay-data="{id: 'buyRecordTable'}" id="buyRecordTable"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<style>
    .layui-table-cell {
        height: auto;
    }
    .layui-form-onswitch {
        background-color: #5FB878 !important;
    }
</style>
<script type="text/html" id="isBuyState">
    {{# if(d.state === 0) { }}
    <span class="layui-badge febs-bg-red">失败</span>
    {{# } else if(d.state === 1) { }}
    <span class="layui-badge febs-bg-blue">进行中</span>
    {{# } else if(d.state === 2) { }}
    <span class="layui-badge febs-bg-orange">超时</span>
    {{# } else if(d.state === 3) { }}
    <span class="layui-badge febs-bg-green">已完成</span>
    {{# } else { }}
    {{# } }}
</script>
<script type="text/html" id="isBuyMateState">
    {{# if(d.mateState === 0) { }}
    <span class="layui-badge febs-bg-red">未转换</span>
    {{# } else if(d.mateState === 1) { }}
    <span class="layui-badge febs-bg-blue">已转换</span>
    {{# } else if(d.mateState === 2) { }}
    <span class="layui-badge febs-bg-orange">待支付</span>
    {{# } else if(d.mateState === 3) { }}
    <span class="layui-badge febs-bg-green">已支付</span>
    {{# } else if(d.mateState === 4) { }}
    <span class="layui-badge febs-bg-green">已确认</span>
    {{# } else if(d.mateState === 5) { }}
    <span class="layui-badge febs-bg-green">已完成</span>
    {{# } else { }}
    {{# } }}
</script>
<script type="text/html" id="isBuyRecordState">
    {{# if(d.state === 0) { }}
    <span class="layui-badge febs-bg-red">失败</span>
    {{# } else if(d.state === 1) { }}
    <span class="layui-badge febs-bg-blue">匹配中</span>
    {{# } else if(d.state === 2) { }}
    <span class="layui-badge febs-bg-orange">待支付</span>
    {{# } else if(d.state === 3) { }}
    <span class="layui-badge febs-bg-green">已支付</span>
    {{# } else if(d.state === 4) { }}
    <span class="layui-badge febs-bg-green">已确认</span>
    {{# } else if(d.state === 5) { }}
    <span class="layui-badge febs-bg-green">已完成</span>
    {{# } else { }}
    {{# } }}
</script>
<!-- 表格操作栏 start -->
<script type="text/html" id="user-option">
    <span shiro:lacksPermission="user:view,user:update,user:delete">
        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
    </span>
    <a lay-event="edit" shiro:hasPermission="user:update"><i
            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
</script>
<style>
    .layui-form-onswitch {
        background-color: #5FB878 !important;
    }
    .thead {background-color: rgba(255, 175, 16,0.2);text-align: center;}
    .tbody {
        background-color: rgba(255, 175, 16, 0.1);
        text-align: center;
        width:100px;
    }
</style>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            $view = $('#febs-product-buy'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'phone', type: null},
            buyRecordTable,
            buyTable,
            tableIns;
        form.render();
        // 表格初始化
        initBuyTable();
        initBuyTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(buyTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'productSellPick') {
                febs.modal.open('编辑', 'modules/news/productSellPick/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#product-sell-pick').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
        });
        // 初始化表格操作栏各个按钮功能
        table.on('tool(buyRecordTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            /**
             *  +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordPay" shiro:hasPermission="user:update">确认支付</button>'
             +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordConfirm" shiro:hasPermission="user:update">确认收款</button>'
             +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordImg" shiro:hasPermission="user:update">收款凭证</button>'
             */
            if (layEvent === 'buyRecordCancel') {
                febs.modal.confirm('取消', '是否确认取消?', function () {
                    buyRecordCancel(data.id);
                });
            }
            if (layEvent === 'buyRecordPay') {
                febs.modal.open('确认支付', 'modules/news/buyRecordPay/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#buyRecordPay-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'buyRecordConfirm') {
                febs.modal.confirm('确认收款', '是否确认收款?', function () {
                    buyRecordConfirm(data.id);
                });
            }
            if (layEvent === 'buyRecordImg') {
                if(data.nftImg == null || data.nftImg == ''){
                    febs.modal.warn('告警信息', '凭证未上传', function () {
                        febs.alert.info("请上传凭证");
                    });
                    return false;
                }
                layer.open({
                    type: 1,
                    title: "凭证",
                    skin: 'layui-layer-rim', //加上边框
                    area: ['80%', '80%'], //宽高
                    shadeClose: true, //开启遮罩关闭
                    end: function (index, layero) {
                        return false;
                    },
                    content: '<div style="text-align:center"><img src="' + data.nftImg + '" /></div>'
                });
                // febs.modal.open('凭证', 'modules/news/buyRecordImg/' + data.id, {
                //     btn2: function () {
                //         layer.closeAll();
                //     }
                // });
            }
        });
        function buyRecordCancel(id) {
            febs.get(ctx + 'admin/news/buyRecordCancel/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function buyRecordConfirm(id) {
            febs.get(ctx + 'admin/news/buyRecordConfirm/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            buyRecordTable.reload({where: params, page: {curr: 1}});
            buyTable.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            buyRecordTable.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
            buyTable.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initBuyTable() {
            buyTable = febs.table.init({
                elem: $('#buyTable'),
                url: ctx + 'admin/news/getBuyList',
                cols: [[
                    {field: 'accountLogin', title: '登录账户', minWidth: 120,align:'center'},
                    {field: 'nftTotal', title: '预约额度', minWidth: 120,align:'center'},
                    {field: 'nftAva', title: '可分配', minWidth: 120,align:'center'},
                    {field: 'orderTime', title: '匹配时间', minWidth: 120,align:'center'},
                    {templet: '#isBuyState', title: '预约状态', minWidth: 120,align:'center'},
                    {templet: '#isBuyMateState', title: '匹配状态', minWidth: 120,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            if(d.state == 1){
                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="productSellPick" shiro:hasPermission="user:update">手动匹配</button>'
                            }else{
                                return ''
                            }
                        },minWidth: 300,align:'center'}
                ]]
            });
            buyRecordTable = febs.table.init({
                elem: $('#buyRecordTable'),
                url: ctx + 'admin/news/getBuyRecordList',
                cols: [[
                    {field: 'id', title: '', minWidth: 120,align:'center'},
                    {field: 'accountLogin', title: '匹配用户', minWidth: 120,align:'center'},
                    {field: 'pickNftCnt', title: '支付金额', minWidth: 120,align:'center'},
                    {field: 'orderTime', title: '匹配时间', minWidth: 120,align:'center'},
                    {field: 'payTime', title: '支付时间', minWidth: 120,align:'center'},
                    {templet: '#isBuyRecordState', title: '支付状态', minWidth: 120,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordCancel" shiro:hasPermission="user:update">取消</button>'
                            +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordPay" shiro:hasPermission="user:update">确认支付</button>'
                            +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordConfirm" shiro:hasPermission="user:update">确认收款</button>'
                            +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="buyRecordImg" shiro:hasPermission="user:update">收款凭证</button>'
                        },minWidth: 300,align:'center'}
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
            };
        }
        form.on('switch(isState)', function (data) {
            if (data.elem.checked) {
                febs.post(ctx + 'admin/news/upNFT/' + data.value, null, function () {
                    febs.alert.success('操作成功');
                    $query.click();
                });
            } else {
                febs.post(ctx + 'admin/news/unUpNFT/' + data.value, null, function () {
                    febs.alert.success('操作成功');
                    $query.click();
                });
            }
        })
    })
</script>
src/main/resources/templates/febs/views/modules/news/productSellPick.html
@@ -137,7 +137,7 @@
            febs.post(ctx + 'admin/news/pickSellRecord', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-product-buy').find('#reset').click();
                $('#febs-product-buy').find('#query').click();
            });
            return false;
        });