xiaoyong931011
2023-05-26 ec95da083dc783b7d7ca80b0a65665e9b60a037f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
package cc.mrbird.febs.dapp.service.impl;
 
import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.dapp.chain.ChainEnum;
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.chain.ContractChainService;
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
import cc.mrbird.febs.dapp.enumerate.FundFlowEnum;
import cc.mrbird.febs.dapp.enumerate.NodeCodeEnum;
import cc.mrbird.febs.dapp.enumerate.PoolEnum;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.utils.BoxUtil;
import cc.mrbird.febs.dapp.vo.ActiveNftListVo;
import cc.mrbird.febs.dapp.vo.DappFundFlowVo;
import cc.mrbird.febs.dapp.vo.DappMemberNodeVo;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
 
/**
 * @author
 * @date 2022-03-18
 **/
@Slf4j
@Service
@RequiredArgsConstructor
public class DappWalletServiceImpl implements DappWalletService {
 
    private final DappMemberDao dappMemberDao;
    private final DappWalletMineDao dappWalletMineDao;
    private final DappWalletCoinDao dappWalletCoinDao;
    private final DappFundFlowDao dappFundFlowDao;
    private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
    private final RedisUtils redisUtils;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final DappNftActivationDao dappNftActivationDao;
    private final MemberCoinWithdrawDao memberCoinWithdrawDao;
 
    private final ChainProducer chainProducer;
    private final DappSystemDao dappSystemDao;
    private final DappSystemProfitDao dappSystemProfitDao;
 
    private final DappNodeOrderMapper dappNodeOrderMapper;
    private final DappMemberNodeMapper dappMemberNodeMapper;
    private final DappChargeUsdtMapper dappChargeUsdtMapper;
    private final DappUsdtPerkEntityMapper dappUsdtPerkEntityMapper;
 
    @Override
    public WalletInfoVo walletInfo() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
 
        DappMemberEntity memberInfo = dappMemberDao.selectById(member.getId());
        WalletInfoVo walletInfo = new WalletInfoVo();
        List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1, 1);
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
        DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
 
        DappMineDataEntity mineData = dappSystemDao.selectMineDataForOne();
        walletInfo.setDirectCnt(direct.size());
        walletInfo.setInviteId(member.getActiveStatus() == 1 ? member.getInviteId() : "-");
        walletInfo.setBalance(walletCoin.getAvailableAmount());
        walletInfo.setHasBuy(memberInfo.getActiveStatus());
        walletInfo.setOutCnt(memberInfo.getOutCnt());
        walletInfo.setProfit(dappFundFlowDao.selectProfitAmountByMemberId(member.getId()));
        walletInfo.setTfcBalance(walletMine.getAvailableAmount());
        walletInfo.setSafePool(mineData.getSafePool());
 
        walletInfo.setAccountType(memberInfo.getAccountType());
        DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectByMemberIdAndState(memberInfo.getId(),DappSystemProfit.STATE_IN);
        walletInfo.setSystemProfitId(ObjectUtil.isEmpty(dappSystemProfit) ? 0L : dappSystemProfit.getId());
        BigDecimal directProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),3,2);
        walletInfo.setDirectProfit(directProfit);
        BigDecimal levelProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),4,2);
        walletInfo.setLevelProfit(levelProfit);
        BigDecimal luckyProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),7,2);
        walletInfo.setLuckyProfit(luckyProfit);
        if(DataDictionaryEnum.BIG_BOSS.getCode().equals(memberInfo.getAccountType())){
            walletInfo.setRunPercent(new BigDecimal(100));
        }else{
            walletInfo.setRunPercent(new BigDecimal(90));
        }
 
        //获取会员节点信息
        List<DappMemberNodeVo> dappMemberNodeVos = dappMemberNodeMapper.selectListByMemberId(member.getId());
        walletInfo.setDappMemberNodeVos(dappMemberNodeVos);
        return walletInfo;
    }
 
    @Override
    public List<DappFundFlowEntity> recordInPage(RecordInPageDto recordInPageDto) {
        Page<DappFundFlowEntity> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
 
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity();
        if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) {
            dappFundFlowEntity.setType(recordInPageDto.getType());
        }
        dappFundFlowEntity.setMemberId(member.getId());
//        dappFundFlowEntity.setStatus(2);
 
        IPage<DappFundFlowEntity> records = dappFundFlowDao.selectInPage(page, dappFundFlowEntity);
        return records.getRecords();
    }
 
    @Override
    public IPage<DappFundFlowEntity> fundFlowInPage(DappFundFlowEntity dappFundFlowEntity, QueryRequest request) {
        Page<DappFundFlowEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        return dappFundFlowDao.selectInPage(page, dappFundFlowEntity);
    }
 
    @Override
    public IPage<DappWalletCoinEntity> walletCoinInPage(DappWalletCoinEntity walletCoin, QueryRequest request) {
        Page<DappWalletCoinEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        return dappWalletCoinDao.selectInPage(walletCoin, page);
    }
 
    @Override
    public IPage<DappWalletMineEntity> walletMineInPage(DappWalletMineEntity walletMine, QueryRequest request) {
        Page<DappWalletMineEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        return dappWalletMineDao.selectInPage(walletMine, page);
    }
 
    @Override
    public IPage<DappAccountMoneyChangeEntity> accountMoneyChangeInPage(DappAccountMoneyChangeEntity change, QueryRequest request) {
        Page<DappAccountMoneyChangeEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        return dappAccountMoneyChangeDao.selectInPage(change, page);
    }
 
    /**
     * // 第一次{amount: val, fee: 0, txHash: '', type: 1, buyType: 2}
     *       // 成功{type: 1, txHash: result.transactionHash, id: res.data, flag: 'success', buyType: 2}
     *       // 失败{type: 1, id: res.data, flag: 'fail', buyType: 2}
     */
    @Override
    public Long transfer(TransferDto transferDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
 
        String upgrade = redisUtils.getString("APP_UPGRADE");
        if ("upgrade".equals(upgrade)) {
            throw new FebsException("功能升级中");
        }
 
//        if (transferDto.getType() != 2) {
//            member = dappMemberDao.selectById(member.getId());
//            if (member.getActiveStatus() == 1) {
//                throw new FebsException("Do not repeat purchase");
//            }
//        }
        /**
         * buyType=1,余额购买
         */
        if (transferDto.getBuyType() == 1) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
            if (transferDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
                throw new FebsException("Balance Not Enough");
            }
 
            updateWalletCoinWithLock(transferDto.getAmount(), member.getId(), 2);
 
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount().negate(), 1, 2, transferDto.getFee(), transferDto.getTxHash());
            dappFundFlowDao.insert(fundFlow);
 
//            chainProducer.sendAchieveTreeMsg(member.getId());
        } else {
            /**
             * buyType=2,钱包购买
             */
            int type = FundFlowEnum.BUY_NODE.getCode();
            // 1-认购 2-充值tfc
            if (transferDto.getType() == 2) {
                type = 6;
            }
            /**
             * 第一次请求,生成一条资金流水ID,并且返回。
             */
            if (transferDto.getId() == null) {
                /**
                 * 验证节点的价格是否和入参价格一致
                 */
                String nodeCode = transferDto.getNodeCode();
                DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCodeForupdate(nodeCode);
                BigDecimal price = dappNodeOrderEntity.getPrice();
                BigDecimal amount = transferDto.getAmount();
                if(price.compareTo(amount) != 0){
                    throw new FebsException("刷新后重试");
//                    throw new FebsException("Refresh and try again");
                }
                Integer surplusCnt = dappNodeOrderEntity.getSurplusCnt();
                if(0 >= surplusCnt){
                    throw new FebsException("该节点剩余数量为0。");
                }
 
 
                /**
                 * 超级节点只允许购买一次
                 */
                if(NodeCodeEnum.SUPER_NODE.getCode().equals(nodeCode)){
                    DappMemberNodeEntity superNode = dappMemberNodeMapper.selectNodeByMemberIdAndNodeCode(
                            member.getId(), NodeCodeEnum.SUPER_NODE.getCode());
                    if(ObjectUtil.isNotEmpty(superNode)){
                        throw new FebsException("超级节点只能购买一次");
                    }
                }
 
                DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING);
                if(ObjectUtil.isNotEmpty(fundFlowOld)){
                    //网络问题导致第二次提交前,未成功就关闭了页面
                    if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) {
                        dappFundFlowDao.deleteById(fundFlowOld.getId());
                        throw new FebsException("Refresh and try again");
                    }
                }
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash(),transferDto.getNodeCode());
                dappFundFlowDao.insert(fundFlow);
                return fundFlow.getId();
            }
 
            if ("success".equals(transferDto.getFlag())) {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){
                    throw new FebsException("请勿重复提交");
//                    throw new FebsException("Do not repeat purchase");
                }
                /**
                 * 生成会员节点表记录
                 */
                String nodeCode = transferDto.getNodeCode();
                DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCodeForupdate(nodeCode);
                DappMemberNodeEntity dappMemberNodeEntityNew = new DappMemberNodeEntity(
                        member.getId(),
                        dappNodeOrderEntity.getId(),
                        dappNodeOrderEntity.getNodeCode(),
                        transferDto.getAmount()
                );
                dappMemberNodeMapper.insert(dappMemberNodeEntityNew);
 
                Integer surplusCnt = dappNodeOrderEntity.getSurplusCnt();
                surplusCnt = surplusCnt - 1;
                dappNodeOrderEntity.setSurplusCnt(surplusCnt);
                dappNodeOrderMapper.updateById(dappNodeOrderEntity);
 
                /**
                 * 流水关联用户购买节点记录
                 */
                flow.setSystemProfitId(dappMemberNodeEntityNew.getId());
                /**
                 * 链上转账的hash值
                 */
                flow.setFromHash(transferDto.getTxHash());
                flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
                dappFundFlowDao.updateById(flow);
                /**
                 * 升级账号类型为对应的节点名称
                 */
//                dappMemberDao.updateMemberAccountType(dappNodeOrderEntity.getNodeName(),member.getId());
                /**
                 * 更新账号的状态为已激活-即已经购买节点
                 */
//                dappMemberDao.updateMemberActiveStatus(1,member.getId());
                /**
                 * 直推奖励
                 */
                DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
                String refererId = dappMemberEntity.getRefererId();
                DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId);
                DataDictionaryCustom directProfitDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                        DataDictionaryEnum.DIRECT_PROFIT.getType(),
                        DataDictionaryEnum.DIRECT_PROFIT.getCode());
                BigDecimal directProfitPercent = new BigDecimal(StrUtil.isEmpty(directProfitDic.getValue()) ? "0.1" : directProfitDic.getValue());
                BigDecimal amount = transferDto.getAmount();
                BigDecimal directProfit = amount.multiply(directProfitPercent).setScale(6,BigDecimal.ROUND_DOWN);
                //生成直推奖励的流水
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                        refererMember.getId(),
                        directProfit,
                        2,
                        1,
                        BigDecimal.ZERO,
                        null,
                        dappMemberNodeEntityNew.getId());
                dappFundFlowDao.insert(fundFlow);
 
                /**
                 * 发送转币消息
                 */
                chainProducer.sendBnbTransferMsg(fundFlow.getId());
 
 
                BigDecimal subtract = amount.subtract(directProfit);
 
                //剩余的钱给分走
                DappFundFlowEntity fundFlowEntityProject = new DappFundFlowEntity(
                        4L,
                        subtract,
                        3,
                        1,
                        BigDecimal.ZERO,
                        null,
                        dappMemberNodeEntityNew.getId());
                dappFundFlowDao.insert(fundFlowEntityProject);
 
                /**
                 * 发送转币消息
                 */
                chainProducer.sendBnbTransferMsg(fundFlowEntityProject.getId());
            } else {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                if (flow.getStatus() == 1) {
                    dappFundFlowDao.deleteById(transferDto.getId());
                }
            }
        }
        return null;
    }
 
    @Override
    public BigDecimal calPrice(PriceDto priceDto) {
//        String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE);
        DataDictionaryCustom symbolPrice = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode());
        DataDictionaryCustom serviceFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getType(), DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getCode());
 
        BigDecimal amount = priceDto.getAmount();
        if (priceDto.getAmount() == null) {
            amount = BigDecimal.ZERO;
        }
        return amount.multiply(new BigDecimal(serviceFeeDic.getValue()).divide(BigDecimal.valueOf(100), 8, RoundingMode.HALF_DOWN)).divide(new BigDecimal(symbolPrice.getValue()), 2, RoundingMode.HALF_UP);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void withdraw(WithdrawDto withdrawDto) {
        /**
         * USDT提现1%手续费.(扣USDT)
         * 提币需要*当前a币价格,转换成USDT
         * A币卖币规则,卖出100%销毁,30%回流底池溢价
         */
        DappMemberEntity member = LoginUserUtil.getAppUser();
        //提币数量
        BigDecimal amount = withdrawDto.getAmount();
        if(BigDecimal.ZERO.compareTo(amount) >= 0){
            throw new FebsException("输入正确的数量");
        }
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
        if (walletCoin.getAvailableAmount().compareTo(withdrawDto.getAmount()) < 0) {
            throw new FebsException("可提现的数量不足");
        }
        DataDictionaryCustom aCoinPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_PRICE.getType(),
                PoolEnum.COIN_A_PRICE.getCode()
        );
        BigDecimal coinAPrice = new BigDecimal(aCoinPriceDic.getValue());
        //预计提现的USDT数量 = 币的数量 * 当前A币的价格
        BigDecimal coinUsdtAmount = amount.multiply(coinAPrice);
        /**
         * 卖币可享有贡献值,鼓励卖币,例.卖出价值100U获得100贡献值
         */
        DappUsdtPerkEntity directDappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId());
        if(ObjectUtil.isEmpty(directDappUsdtPerkEntity)){
            directDappUsdtPerkEntity = new DappUsdtPerkEntity();
            directDappUsdtPerkEntity.setNftDevote(coinUsdtAmount);
            directDappUsdtPerkEntity.setMemberId(member.getId());
            dappUsdtPerkEntityMapper.insert(directDappUsdtPerkEntity);
        }
 
        BigDecimal directNftDevote = directDappUsdtPerkEntity.getNftDevote();
        directNftDevote = directNftDevote.add(coinUsdtAmount);
        directDappUsdtPerkEntity.setNftDevote(directNftDevote);
        dappUsdtPerkEntityMapper.updateById(directDappUsdtPerkEntity);
 
        DataDictionaryCustom toUsdtPercentFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.WALLET_COIN_TO_USDT_PERCENT.getType(),
                PoolEnum.WALLET_COIN_TO_USDT_PERCENT.getCode()
        );
        BigDecimal feePercent = new BigDecimal(toUsdtPercentFeeDic.getValue());
        //手续费扣除USDT
        BigDecimal feeUsdtAmount = coinUsdtAmount.multiply(feePercent).setScale(4,BigDecimal.ROUND_DOWN);
        //实际提现USDT数量
        BigDecimal realUsdtAmount = coinUsdtAmount.subtract(feeUsdtAmount).setScale(4,BigDecimal.ROUND_DOWN);
 
        //减少闪对钱包的币的数量
        this.updateWalletCoinWithLock(amount, member.getId(), 2);
        //增加流水
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(member.getId(), amount.negate(), FundFlowEnum.WALLET_COIN_TO_USDT.getCode(), 2, BigDecimal.ZERO);
        dappFundFlowDao.insert(dappFundFlowEntity);
        //增加流水
        DappFundFlowEntity realUsdtAmountFlow = new DappFundFlowEntity(member.getId(), realUsdtAmount.negate(), FundFlowEnum.WALLET_COIN_TO_USDT_W.getCode(), 1, feeUsdtAmount);
        dappFundFlowDao.insert(realUsdtAmountFlow);
        //增加提现的记录
        MemberCoinWithdrawEntity memberCoinWithdraw = new MemberCoinWithdrawEntity();
        memberCoinWithdraw.setMemberId(member.getId());
        memberCoinWithdraw.setAddress(member.getAddress());
        memberCoinWithdraw.setAmount(realUsdtAmount);
        memberCoinWithdraw.setFeeAmount(feeUsdtAmount);
        memberCoinWithdraw.setStatus(MemberCoinWithdrawEntity.STATUS_YES);
        memberCoinWithdraw.setSymbol("USDT");
        memberCoinWithdraw.setFlowId(realUsdtAmountFlow.getId());
        memberCoinWithdrawDao.insert(memberCoinWithdraw);
        //发送提现消息
        chainProducer.sendAntACoinOutMsg(realUsdtAmountFlow.getId());
 
        /**
         * A币卖币规则,卖出100%销毁,30%回流底池溢价
         */
        DataDictionaryCustom outPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.WALLET_COIN_OUT_PERCENT.getType(),
                PoolEnum.WALLET_COIN_OUT_PERCENT.getCode()
        );
        BigDecimal outPercent = new BigDecimal(outPercentDic.getValue());
        coinUsdtAmount = coinUsdtAmount.multiply(outPercent).setScale(4,BigDecimal.ROUND_DOWN);
        //金本位底池数量
        DataDictionaryCustom coinAUsdtPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_USDT_PRICE.getType(),
                PoolEnum.COIN_A_USDT_PRICE.getCode()
        );
        BigDecimal coinAUsdtCnt = new BigDecimal(coinAUsdtPriceDic.getValue());
        coinAUsdtCnt = coinAUsdtCnt.add(coinUsdtAmount).setScale(4,BigDecimal.ROUND_DOWN);
        coinAUsdtPriceDic.setValue(coinAUsdtCnt.toString());
        dataDictionaryCustomMapper.updateById(coinAUsdtPriceDic);
        //币本位底池数量
        DataDictionaryCustom coinACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_CNT.getType(),
                PoolEnum.COIN_A_CNT.getCode()
        );
        BigDecimal coinACnt = new BigDecimal(coinACntDic.getValue());
        coinACnt = coinACnt.subtract(amount).setScale(4,BigDecimal.ROUND_DOWN);
        coinACntDic.setValue(coinACnt.toString());
        dataDictionaryCustomMapper.updateById(coinACntDic);
 
        coinAPrice = coinAUsdtCnt.divide(coinACnt,8,BigDecimal.ROUND_DOWN);
        aCoinPriceDic.setValue(coinAPrice.toString());
        dataDictionaryCustomMapper.updateById(aCoinPriceDic);
 
        chainProducer.sendAntKLineMsg(0);
    }
 
    @Override
    public void updateWalletCoinWithLock(BigDecimal amount, Long memberId, int type) {
        boolean isSuccess = false;
        while(!isSuccess) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId);
            if(ObjectUtil.isEmpty(walletCoin)){
                return;
            }
            // 加
            if (type == 1) {
                walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount));
                walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(amount));
                // 减
            } else {
                if (amount.compareTo(walletCoin.getAvailableAmount()) > 0) {
                    throw new FebsException("Balance Not Enough");
                }
                walletCoin.setTotalAmount(walletCoin.getTotalAmount().subtract(amount));
                walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(amount));
            }
 
            int i = dappWalletCoinDao.updateWithLock(walletCoin);
            if (i > 0) {
                isSuccess = true;
            }
        }
    }
 
    @Override
    public void updateWalletMineWithLock(BigDecimal amount, Long memberId, int type) {
        boolean isSuccess = false;
        while(!isSuccess) {
            DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(memberId);
            if(ObjectUtil.isEmpty(walletMine)){
                return;
            }
            if (type == 1) {
                walletMine.setTotalAmount(walletMine.getTotalAmount().add(amount));
                walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(amount));
            } else {
                if (amount.compareTo(walletMine.getAvailableAmount()) > 0) {
                    throw new FebsException("Not Enough");
                }
                walletMine.setTotalAmount(walletMine.getTotalAmount().subtract(amount));
                walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(amount));
            }
 
            int i = dappWalletMineDao.updateWithLock(walletMine);
            if (i > 0) {
                isSuccess = true;
            }
        }
    }
 
    @Override
    public void addFrozenAmountWithLock(BigDecimal amount, Long memberId) {
        boolean isSuccess = false;
        while(!isSuccess) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId);
 
            walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount));
            walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(amount));
 
            int i = dappWalletCoinDao.updateWithLock(walletCoin);
            if (i > 0) {
                isSuccess = true;
 
                DappFundFlowEntity frozenAmount = new DappFundFlowEntity(memberId, amount, 9, 2, null, null);
                dappFundFlowDao.insert(frozenAmount);
            }
        }
    }
 
    @Override
    public void releaseFrozenAmountWithLock(Long memberId) {
        boolean isSuccess = false;
        while(!isSuccess) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId);
 
            if (walletCoin.getFrozenAmount().compareTo(BigDecimal.ZERO) <= 0) {
                return;
            }
            BigDecimal frozen = walletCoin.getFrozenAmount();
 
            walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(frozen));
            walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(frozen));
 
            int i = dappWalletCoinDao.updateWithLock(walletCoin);
            if (i > 0) {
                isSuccess = true;
 
                DappFundFlowEntity releaseFrozen = new DappFundFlowEntity(memberId, frozen, 10, 2, null, null);
                dappFundFlowDao.insert(releaseFrozen);
 
                DappFundFlowEntity releaseFrozenNegate = new DappFundFlowEntity(memberId, frozen.negate(), 9, 2, null, null);
                dappFundFlowDao.insert(releaseFrozenNegate);
            }
        }
    }
 
    @Override
    public DappWalletCoinEntity findByMemberId(Long memberId) {
        return dappWalletCoinDao.selectByMemberId(memberId);
    }
 
    @Override
    public void transferAgain(TransferDto transferDto) {
        Long memberId = transferDto.getMemberId();
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        String upgrade = redisUtils.getString("APP_UPGRADE");
        if ("upgrade".equals(upgrade)) {
            throw new FebsException("功能升级中");
        }
        if ("success".equals(transferDto.getFlag())) {
            //是否已经加入动能
            DappSystemProfit dappSystemProfitIng = dappSystemProfitDao.selectByMemberIdAndState(member.getId(), DappSystemProfit.STATE_IN);
            if(ObjectUtil.isNotEmpty(dappSystemProfitIng)){
                return;
            }
            //插入一条会员入列记录,即加入动能队列
            DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), transferDto.getAmount());
            dappSystemProfitDao.insert(dappSystemProfit);
            DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
            flow.setFromHash(transferDto.getTxHash());
            flow.setSystemProfitId(dappSystemProfit.getId());
            flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
            dappFundFlowDao.updateById(flow);
 
            //直接拿走0.05个BNB放入技术方
            DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode());
            String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue();
            DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(1L, new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, null,dappSystemProfit.getId());
            dappFundFlowDao.insert(systemProfitFlow);
            //发送转币消息
            chainProducer.sendBnbTransferMsg(systemProfitFlow.getId());
            //直接返利30%给直接上级
            DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
            String refererId = dappMemberEntity.getRefererId();
            DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId);
 
            DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode());
            BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue());
            BigDecimal directProfit = (transferDto.getAmount().subtract(new BigDecimal(systemProfitStr))).multiply(directProfitStr).setScale(6,BigDecimal.ROUND_DOWN);
 
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, null,dappSystemProfit.getId());
            dappFundFlowDao.insert(fundFlow);
            //发送转币消息
            chainProducer.sendBnbTransferMsg(fundFlow.getId());
            //层级奖励30%
            chainProducer.sendLevelProfitMsg(dappSystemProfit.getId());
            //发送一个消息,计算当前是否有人可以出局
            chainProducer.sendMemberOutMsg(dappSystemProfit.getId());
 
        }
    }
 
    @Override
    public Long transferA(TransferADto transferADto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
 
        String upgrade = redisUtils.getString("APP_UPGRADE");
        if ("upgrade".equals(upgrade)) {
            throw new FebsException("功能升级中");
        }
 
//        if (transferADto.getType() != 2) {
//            member = dappMemberDao.selectById(member.getId());
//            if (member.getActiveStatus() == 1) {
//                throw new FebsException("Do not repeat purchase");
//            }
//        }
        /**
         * buyType=1,余额购买
         */
        if (transferADto.getBuyType() == 1) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
            if (transferADto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
                throw new FebsException("Balance Not Enough");
            }
 
            updateWalletCoinWithLock(transferADto.getAmount(), member.getId(), 2);
 
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                    member.getId(),
                    transferADto.getAmount().negate(),
                    FundFlowEnum.BUY_A_COIN.getCode(),
                    2,
                    transferADto.getFee(),
                    transferADto.getTxHash());
            dappFundFlowDao.insert(fundFlow);
        } else {
            /**
             * buyType=2,钱包购买
             * 4:入金,买入A币
             */
            int type = FundFlowEnum.BUY_A_COIN.getCode();
            // 1-认购 2-充值tfc
            if (transferADto.getType() == 2) {
                type = 6;
            }
            /**
             * 第一次请求,生成一条资金流水ID,并且返回。
             */
            if (transferADto.getId() == null) {
                /**
                 * 查询会员是否已经有正在进行中的入金记录
                 */
                DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING);
                if(ObjectUtil.isNotEmpty(fundFlowOld)){
                    //网络问题导致第二次提交前,未成功就关闭了页面
                    if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) {
                        dappFundFlowDao.deleteById(fundFlowOld.getId());
                        throw new FebsException("Refresh and try again");
                    }
                }
                /**
                 * 验证账户是否有入金金额的10%的AUSD
                 */
                DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId());
                if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){
                    dappUsdtPerkEntity = new DappUsdtPerkEntity();
                    dappUsdtPerkEntity.setMemberId(member.getId());
                    dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity);
                }
                BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount();
                DataDictionaryCustom ausdPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                        PoolEnum.TRANSFER_A_AUSD_PERCENT.getType(),
                        PoolEnum.TRANSFER_A_AUSD_PERCENT.getCode()
                );
                BigDecimal ausdPercent = new BigDecimal(ausdPercentDic.getValue());
                BigDecimal ausdPercentUsdt = transferADto.getAmount().multiply(ausdPercent);
 
                DataDictionaryCustom ausdPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                        PoolEnum.TRANSFER_A_AUSD_PRICE.getType(),
                        PoolEnum.TRANSFER_A_AUSD_PRICE.getCode()
                );
                BigDecimal ausdPrice = new BigDecimal(ausdPriceDic.getValue());
                BigDecimal ausdAmountNeed = ausdPercentUsdt.divide(ausdPrice);
                if(BigDecimal.ZERO.compareTo(ausdAmount) >= 0){
                    throw new FebsException("AUSD数量不足");
                }
                if(ausdAmountNeed.compareTo(ausdAmount) > 0){
                    throw new FebsException("AUSD数量不足");
                }
                /**
                 * 出局复投要求等于戓大于自己上次投资金额
                 */
                BigDecimal maxAmount = dappChargeUsdtMapper.selectByMaxAmountMemberId(member.getId());
                if(maxAmount.compareTo(transferADto.getAmount()) > 0){
                    throw new FebsException("投资金额不能小于"+maxAmount.setScale(4,BigDecimal.ROUND_DOWN));
                }
                //生成一条进行中的入金资金流水记录
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                        member.getId(),
                        transferADto.getAmount(),
                        type,
                        1,
                        ausdAmountNeed,
                        transferADto.getTxHash());
                dappFundFlowDao.insert(fundFlow);
                return fundFlow.getId();
            }
 
            if ("success".equals(transferADto.getFlag())) {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferADto.getId());
                if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){
                    throw new FebsException("请勿重复提交");
                }
                /**
                 * 生成会员入金买A币的记录
                 */
                DappChargeUsdtEntity dappChargeUsdtEntity = new DappChargeUsdtEntity(
                        member.getId(),
                        dappMemberEntity.getAddress(),
                        transferADto.getTxHash(),
                        2,
                        transferADto.getAmount(),
                        BigDecimal.ZERO,
                        BigDecimal.ZERO);
                dappChargeUsdtMapper.insert(dappChargeUsdtEntity);
                /**
                 * 减少用户的AUSD数量
                 */
                DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId());
                BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount();
                ausdAmount = ausdAmount.subtract(flow.getFee()).setScale(4,BigDecimal.ROUND_DOWN);
                dappUsdtPerkEntity.setAusdAmount(ausdAmount);
                dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity);
                /**
                 * 流水关联用户购买记录
                 */
                flow.setSystemProfitId(dappChargeUsdtEntity.getId());
                /**
                 * 链上转账的hash值
                 */
                flow.setFromHash(transferADto.getTxHash());
                flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
                dappFundFlowDao.updateById(flow);
                /**
                 * 发送消息处理返利逻辑
                 */
                chainProducer.sendAntACoinInMsg(flow.getId());
                /**
                 * 发送消息处理代理升级
                 */
                chainProducer.sendAntMemberLevelMsg(member.getId());
            } else {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferADto.getId());
                if (flow.getStatus() == 1) {
                    dappFundFlowDao.deleteById(transferADto.getId());
                }
            }
        }
        return null;
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void mineToCoin(MineToCoinDto mineToCoinDto) {
        /**
         * 资产钱包转帐到闪兑钱包3% 手续费(扣币)
         * 4、增加闪对钱包
         * 5、增加流水
         */
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
 
        BigDecimal aCoinCnt = mineToCoinDto.getACoinCnt();
        if(BigDecimal.ZERO.compareTo(aCoinCnt) >= 0){
            throw new FebsException("输入正确的数量");
        }
 
        DappWalletMineEntity dappWalletMineEntity = dappWalletMineDao.selectByMemberId(dappMemberEntity.getId());
        BigDecimal availableAmount = dappWalletMineEntity.getAvailableAmount();
        if(availableAmount.compareTo(aCoinCnt) < 0){
            throw new FebsException("数量不足");
        }
        //减少资产钱包
        this.updateWalletMineWithLock(aCoinCnt,dappMemberEntity.getId(),2);
        //插入资产闪对的流水
        DappFundFlowEntity aCoinCntFlow = new DappFundFlowEntity(
                dappMemberEntity.getId(),
                aCoinCnt.negate(),
                FundFlowEnum.WALLET_MINE_TO_COIN.getCode(),
                2,
                BigDecimal.ZERO);
        dappFundFlowDao.insert(aCoinCntFlow);
        //闪对钱包3% 手续费(扣币)
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.WALLET_MINE_TO_COIN_PERCENT.getType(),
                PoolEnum.WALLET_MINE_TO_COIN_PERCENT.getCode());
        BigDecimal feePercent = new BigDecimal(StrUtil.isEmpty(dic.getValue()) ? "0.03" : dic.getValue());
        //手续费
        BigDecimal feeCnt = aCoinCnt.multiply(feePercent).setScale(4,BigDecimal.ROUND_DOWN);
        //闪对钱包获取的
        BigDecimal aCoinCntReal = aCoinCnt.subtract(feeCnt).setScale(4, BigDecimal.ROUND_DOWN);
        //增加闪对钱包
        this.updateWalletCoinWithLock(aCoinCntReal,dappMemberEntity.getId(),1);
        //插入资产闪对的流水
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(
                dappMemberEntity.getId(),
                aCoinCntReal,
                FundFlowEnum.WALLET_MINE_TO_COIN.getCode(),
                2,
                BigDecimal.ZERO);
        dappFundFlowDao.insert(dappFundFlowEntity);
 
        //插入资产闪对手续费的流水
        DappFundFlowEntity memberFeeflow = new DappFundFlowEntity(
                dappMemberEntity.getId(),
                feeCnt.negate(),
                FundFlowEnum.WALLET_MINE_TO_COIN_FEE.getCode(),
                2,
                BigDecimal.ZERO);
        dappFundFlowDao.insert(memberFeeflow);
        //插入资产闪对手续费的流水
        DappFundFlowEntity dappFundFlowEntityFee = new DappFundFlowEntity(
                1L,
                feeCnt,
                FundFlowEnum.WALLET_MINE_TO_COIN_FEE.getCode(),
                2,
                BigDecimal.ZERO);
        dappFundFlowDao.insert(dappFundFlowEntityFee);
        this.updateWalletMineWithLock(feeCnt,1L,1);
    }
 
    @Override
    public Long transferAusd(TransferAusdDto transferAusdDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
 
        String upgrade = redisUtils.getString("APP_UPGRADE");
        if ("upgrade".equals(upgrade)) {
            throw new FebsException("功能升级中");
        }
 
//        if (transferAusdDto.getType() != 2) {
//            member = dappMemberDao.selectById(member.getId());
//            if (member.getActiveStatus() == 1) {
//                throw new FebsException("Do not repeat purchase");
//            }
//        }
        /**
         * buyType=1,余额购买
         */
        if (transferAusdDto.getBuyType() == 1) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
            if (transferAusdDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
                throw new FebsException("Balance Not Enough");
            }
 
            updateWalletCoinWithLock(transferAusdDto.getAmount(), member.getId(), 2);
 
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                    member.getId(),
                    transferAusdDto.getAmount().negate(),
                    FundFlowEnum.BUY_AUSD_COIN.getCode(),
                    2,
                    transferAusdDto.getFee(),
                    transferAusdDto.getTxHash());
            dappFundFlowDao.insert(fundFlow);
        } else {
            /**
             * buyType=2,钱包购买
             * 4:入金,买入A币
             */
            int type = FundFlowEnum.BUY_AUSD_COIN.getCode();
            // 1-认购 2-充值tfc
            if (transferAusdDto.getType() == 2) {
                type = 6;
            }
            /**
             * 第一次请求,生成一条资金流水ID,并且返回。
             */
            if (transferAusdDto.getId() == null) {
                /**
                 * 查询会员是否已经有正在进行中的入金记录
                 */
                DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING);
                if(ObjectUtil.isNotEmpty(fundFlowOld)){
                    //网络问题导致第二次提交前,未成功就关闭了页面
                    if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) {
                        dappFundFlowDao.deleteById(fundFlowOld.getId());
                        throw new FebsException("Refresh and try again");
                    }
                }
                //生成一条进行中的入金资金流水记录
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                        member.getId(),
                        transferAusdDto.getAmount(),
                        type,
                        1,
                        transferAusdDto.getFee(),
                        transferAusdDto.getTxHash());
                dappFundFlowDao.insert(fundFlow);
                return fundFlow.getId();
            }
 
            if ("success".equals(transferAusdDto.getFlag())) {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferAusdDto.getId());
                if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){
                    throw new FebsException("请勿重复提交");
                }
                /**
                 * 增加用户的AUSD数量
                 */
                BigDecimal amount = transferAusdDto.getAmount();
                DataDictionaryCustom ausdPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                        PoolEnum.TRANSFER_A_AUSD_PRICE.getType(),
                        PoolEnum.TRANSFER_A_AUSD_PRICE.getCode()
                );
                BigDecimal ausdPrice = new BigDecimal(ausdPriceDic.getValue());
                BigDecimal ausdCnt = amount.divide(ausdPrice, 4, BigDecimal.ROUND_DOWN);
 
                DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId());
                if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){
                    dappUsdtPerkEntity = new DappUsdtPerkEntity();
                    dappUsdtPerkEntity.setMemberId(member.getId());
                    dappUsdtPerkEntity.setAmount(BigDecimal.ZERO);
                    dappUsdtPerkEntity.setAusdAmount(BigDecimal.ZERO);
                    dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity);
                }
                BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount();
                ausdAmount = ausdAmount.add(ausdCnt).setScale(4,BigDecimal.ROUND_DOWN);
                dappUsdtPerkEntity.setAusdAmount(ausdAmount);
                dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity);
                /**
                 * 链上转账的hash值
                 */
                flow.setFromHash(transferAusdDto.getTxHash());
                flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
                dappFundFlowDao.updateById(flow);
            } else {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferAusdDto.getId());
                if (flow.getStatus() == 1) {
                    dappFundFlowDao.deleteById(transferAusdDto.getId());
                }
            }
        }
        return null;
    }
 
    @Override
    public List<DappFundFlowVo> getRecordVoInPage(RecordInPageDto recordInPageDto) {
        Page<DappFundFlowVo> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
 
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity();
        if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) {
            dappFundFlowEntity.setType(recordInPageDto.getType());
        }
        dappFundFlowEntity.setMemberId(member.getId());
        IPage<DappFundFlowVo> records = dappFundFlowDao.selectVoInPage(page, dappFundFlowEntity);
        return records.getRecords();
    }
}