From 990c09c842d87d1f179e3a0070541da0457b8393 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Tue, 21 Nov 2023 14:07:19 +0800 Subject: [PATCH] 匹配 --- src/main/java/cc/mrbird/febs/mall/dto/UpdatePaymentDto.java | 38 src/main/java/cc/mrbird/febs/mall/entity/MallProductSellRecord.java | 22 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java | 12 src/main/java/cc/mrbird/febs/mall/dto/ApiCreateNFTDto.java | 21 src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellRecordMapper.java | 7 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java | 8 src/main/java/cc/mrbird/febs/mall/mapper/MallNewsInfoMapper.java | 2 src/main/resources/templates/febs/views/modules/news/productNFTAdd.html | 158 +++ src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java | 49 + src/main/java/cc/mrbird/febs/mall/dto/ApiOutNFTDto.java | 25 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java | 1 src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellMapper.java | 7 src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java | 78 + src/main/java/cc/mrbird/febs/mall/entity/MallProductBuy.java | 24 src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java | 8 src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java | 26 src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java | 16 src/main/java/cc/mrbird/febs/mall/dto/ApiOutFcmDto.java | 25 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallProductServiceImpl.java | 266 +++++ src/main/java/cc/mrbird/febs/mall/service/IApiMallProductService.java | 22 src/main/resources/mapper/modules/MallMemberAmountMapper.xml | 40 src/main/java/cc/mrbird/febs/mall/entity/MallProductNft.java | 22 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberAmountMapper.java | 15 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 256 ++++- src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductBuyVo.java | 24 src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 62 + src/main/resources/templates/febs/views/modules/news/productBuyList.html | 191 ++++ src/main/resources/templates/febs/views/modules/news/productSellList.html | 162 +++ src/main/java/cc/mrbird/febs/mall/vo/MallMemberPaymentVo.java | 27 src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java | 9 src/main/java/cc/mrbird/febs/mall/dto/GetKeyDto.java | 18 src/main/java/cc/mrbird/febs/mall/entity/MallMemberPayment.java | 30 src/main/java/cc/mrbird/febs/mall/dto/AdminMallProductNftDto.java | 22 src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java | 19 src/main/java/cc/mrbird/febs/mall/mapper/MallProductNftMapper.java | 27 src/main/resources/templates/febs/views/modules/news/productNFTUpdate.html | 184 +++ src/main/java/cc/mrbird/febs/mall/entity/MallMemberAmount.java | 17 src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java | 41 src/main/java/cc/mrbird/febs/mall/entity/MallProductSell.java | 20 src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java | 22 src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductNftVo.java | 23 src/main/java/cc/mrbird/febs/mall/conversion/MallMemberPaymentConversion.java | 15 src/main/java/cc/mrbird/febs/common/enumerates/ProductEnum.java | 45 src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java | 13 src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductSellVo.java | 20 src/main/java/cc/mrbird/febs/mall/conversion/MallMemberAmountConversion.java | 15 src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java | 10 src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java | 5 src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeNewEnum.java | 20 src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java | 33 src/main/java/cc/mrbird/febs/mall/controller/ApiMallProductController.java | 51 + src/main/java/cc/mrbird/febs/mall/vo/ApiMallProductNftVo.java | 33 src/main/java/cc/mrbird/febs/mall/conversion/MallProductNftConversion.java | 19 src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java | 2 src/main/resources/mapper/modules/MallProductBuyMapper.xml | 37 src/main/resources/mapper/modules/MallProductNftMapper.xml | 19 src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java | 55 src/main/java/cc/mrbird/febs/mall/entity/MallMember.java | 2 src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java | 56 + src/main/java/cc/mrbird/febs/mall/dto/UnfreezeDto.java | 21 src/main/java/cc/mrbird/febs/common/utils/AppContants.java | 5 src/main/java/cc/mrbird/febs/mall/mapper/MallProductBuyMapper.java | 12 src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java | 51 + src/main/resources/templates/febs/views/modules/news/productNFTList.html | 176 +++ src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java | 2 65 files changed, 2,605 insertions(+), 158 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java index 7079411..b4b5144 100644 --- a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java +++ b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java @@ -164,4 +164,53 @@ } //强制卖出 end + // === 机器人自动抢红包 延时 start === + @Bean + public DirectExchange buyTimeDelayTtlExchange() { + return new DirectExchange(RabbitQueueEnum.FCMPAY_BUY_TIME_TTL.getExchange()); + } + @Bean + public Binding buyTimeDelayBindTtl() { + return BindingBuilder.bind(buyTimeDelayQueueTtl()).to(buyTimeDelayTtlExchange()).with(RabbitQueueEnum.FCMPAY_BUY_TIME_TTL.getRoute()); + } + @Bean + public Queue buyTimeDelayQueueTtl() { + return QueueBuilder.durable(RabbitQueueEnum.FCMPAY_BUY_TIME_TTL.getQueue()) + //到期后转发的交换机 + .withArgument("x-dead-letter-exchange", RabbitQueueEnum.FCMPAY_BUY_TIME.getExchange()) + //到期后转发的路由键 + .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.FCMPAY_BUY_TIME.getRoute()) + .build(); + } + @Bean + public DirectExchange buyTimeDelayExchange() { + return new DirectExchange(RabbitQueueEnum.FCMPAY_BUY_TIME.getExchange()); + } + @Bean + public Queue buyTimeDelayQueue() { + return new Queue(RabbitQueueEnum.FCMPAY_BUY_TIME.getQueue()); + } + @Bean + public Binding buyTimeDelayBind() { + return BindingBuilder.bind(buyTimeDelayQueue()).to(buyTimeDelayExchange()).with(RabbitQueueEnum.FCMPAY_BUY_TIME.getRoute()); + } + // === 机器人自动抢红包 延时 end === + + //强制卖出 start + @Bean + public DirectExchange fcmNFTExchangeExchange() { + return new DirectExchange(RabbitQueueEnum.FCMPAY_FCM_NFT_EXCHANGE.getExchange()); + } + + @Bean + public Queue fcmNFTExchangeQueue() { + return new Queue(RabbitQueueEnum.FCMPAY_FCM_NFT_EXCHANGE.getQueue()); + } + + @Bean + public Binding fcmNFTExchangeBind() { + return BindingBuilder.bind(fcmNFTExchangeQueue()).to(fcmNFTExchangeExchange()).with(RabbitQueueEnum.FCMPAY_FCM_NFT_EXCHANGE.getRoute()); + } + //强制卖出 end + } diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java index 82c087e..1064f96 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java @@ -6,6 +6,28 @@ @Getter public enum DataDictionaryEnum { /** + * NFT最小提现数量 + * NFT手续费 + */ + NFT_MIN("NFT_MIN","NFT_MIN"), + NFT_FEE("NFT_FEE","NFT_FEE"), + /** + * FCM最小提现数量 + * FCM销毁数,累计10000,清零重新累计 + * FCM销毁总数 + * FCM代币价格 + * FCM提现收续费 + */ + OUT_FCM_MIN("OUT_FCM_MIN","OUT_FCM_MIN"), + FCM_DESTORY_CNT("FCM_DESTORY_CNT","FCM_DESTORY_CNT"), + FCM_DESTORY_TOTAL("FCM_DESTORY_TOTAL","FCM_DESTORY_TOTAL"), + FCM_PRICE("FCM_PRICE","FCM_PRICE"), + OUT_FCM_FEE("OUT_FCM_FEE","OUT_FCM_FEE"), + /** + * 银行转账设置-客户号 + */ + MEMBER_FROZEN_FCM_CNT("MEMBER_FROZEN_FCM_CNT","MEMBER_FROZEN_FCM_CNT"), + /** * 银行转账设置-客户号 */ BANK_TRANS_softwareId("BANK_TRANS_SET","BANK_TRANS_softwareId"), diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeNewEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeNewEnum.java new file mode 100644 index 0000000..b9cee35 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeNewEnum.java @@ -0,0 +1,20 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +@Getter +public enum FlowTypeNewEnum { + + NFT(3,"NFT"), + TOKEN(2,"令牌"), + FCM_COIN(1,"FCM代币")// + ; + + private int value; + private String description; + + FlowTypeNewEnum(int value,String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java new file mode 100644 index 0000000..2dee09d --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java @@ -0,0 +1,33 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +/** + * + * 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款 + * @author wzy + * @date 2021-09-24 + **/ +@Getter +public enum MoneyFlowTypeNewEnum { + NFT_OUT_FEE(11,"NFT提现手续费"), + NFT_OUT(10,"NFT提现"), + NFT_IN(9,"FCM动态兑换"), + FCM_OUT_FEE(8,"动态兑换手续费"), + FCM_OUT(7,"FCM动态兑换"), + TOKEN_BUY_FROZEN(6,"预约冻结令牌"), + TOKEN_INSIDE_IN(5,"令牌转入"), + TOKEN_INSIDE_OUT(4,"令牌转出"), + FCM_INSIDE_IN(3,"代币转入"), + FCM_INSIDE_OUT(2,"代币转出"), + UNFREEZE_USER(1,"解除冻结")//解除冻结 + ; + + private int value; + private String descrition; + + MoneyFlowTypeNewEnum(int value,String descrition) { + this.value = value; + this.descrition = descrition; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/ProductEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/ProductEnum.java new file mode 100644 index 0000000..f825942 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/ProductEnum.java @@ -0,0 +1,45 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +@Getter +public enum ProductEnum { + /** + * 用户NFT提现状态 0:失败 1:进行中 2:超时 3:已完成 + */ + PRODUCT_SELL_SUCCESS(3,"已完成"), + PRODUCT_SELL_TIMEOUT(2,"超时"), + PRODUCT_SELL_ON_GOING(1,"进行中"), + PRODUCT_SELL_FAIL(0,"失败"), + + /** + * 匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成 + */ + PRODUCT_MATE_STATE_FINISH(5,"已完成"), + PRODUCT_MATE_STATE_CONFIRM(4,"对方已确认"), + PRODUCT_MATE_STATE_PAY(3,"已支付"), + PRODUCT_MATE_STATE_WAIT_PAY(2,"待支付"), + PRODUCT_MATE_STATE_ON_GOING(1,"匹配中"), + PRODUCT_MATE_STATE_FAIL(0,"失败"), + /** + * 用户预约状态 0:失败 1:进行中 2:超时 3:已完成 + */ + PRODUCT_BUY_SUCCESS(3,"已完成"), + PRODUCT_BUY_TIMEOUT(2,"超时"), + PRODUCT_BUY_ON_GOING(1,"进行中"), + PRODUCT_BUY_FAIL(0,"失败"), + /** + * 预约产品是否开启 + */ + PRODUCT_NFT_OPEN(1,"开启"), + PRODUCT_NFT_CLOSE(0,"关闭") + ; + + private int value; + private String description; + + ProductEnum(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java index 4110120..e167981 100644 --- a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java +++ b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java @@ -39,6 +39,11 @@ * 账号类型-邮箱 */ public static final String ACCOUNT_TYPE_EMAIL = "2"; + /** + * 每次销毁10000个,价格增加0.1 + */ + public static final BigDecimal FCM_BASIC = new BigDecimal(10000); + public static final BigDecimal FCM_BASIC_ADD_PRICE = new BigDecimal("0.1"); /** * 系统推荐人id diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java index 96a8c09..a766cc9 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminNewsInfoController.java @@ -4,10 +4,13 @@ import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.enumerates.ProductEnum; +import cc.mrbird.febs.mall.dto.AdminMallProductNftDto; import cc.mrbird.febs.mall.dto.MallNewsInfoDto; -import cc.mrbird.febs.mall.entity.MallNewsCategory; -import cc.mrbird.febs.mall.entity.MallNewsInfo; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.MallProductNftMapper; import cc.mrbird.febs.mall.service.IMallNewsInfoService; +import cc.mrbird.febs.mall.vo.AdminMallProductNftVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -31,6 +34,77 @@ public class AdminNewsInfoController extends BaseController { private final IMallNewsInfoService mallNewsInfoService; + private final MallProductNftMapper mallProductNftMapper; + + /** + * NFT预约产品 + */ + @GetMapping("getProductNFTList") + public FebsResponse getProductNFTList(MallProductNft mallProductNft, QueryRequest request) { + Map<String, Object> data = getDataTable(mallNewsInfoService.getProductNFTList(mallProductNft, request)); + return new FebsResponse().success().data(data); + } + + /** + * NFT预约产品-新增 + */ + @PostMapping("addProductNFT") + @ControllerEndpoint(operation = "NFT预约产品-新增", exceptionMessage = "操作失败") + public FebsResponse addProductNFT(@Valid AdminMallProductNftDto adminMallProductNftDto) { + return mallNewsInfoService.addProductNFT(adminMallProductNftDto); + } + + @PostMapping(value = "/upNFT/{id}") + public FebsResponse upNFT(@PathVariable Long id) { + MallProductNft mallProductNft = mallProductNftMapper.selectById(id); + mallProductNft.setState(ProductEnum.PRODUCT_NFT_OPEN.getValue()); + mallProductNftMapper.updateById(mallProductNft); + return new FebsResponse().success(); + } + + @PostMapping(value = "/unUpNFT/{id}") + public FebsResponse unUpNFT(@PathVariable Long id) { + MallProductNft mallProductNft = mallProductNftMapper.selectById(id); + mallProductNft.setState(ProductEnum.PRODUCT_NFT_CLOSE.getValue()); + mallProductNftMapper.updateById(mallProductNft); + return new FebsResponse().success(); + } + + /** + * NFT预约产品-删除 + */ + @GetMapping("delNFT/{id}") + @ControllerEndpoint(operation = " 新闻中心-删除", exceptionMessage = "操作失败") + public FebsResponse delNFT(@NotNull(message = "{required}") @PathVariable Long id) { + return mallNewsInfoService.delNFT(id); + } + + /** + * NFT预约产品-更新 + */ + @PostMapping("nftInfoUpdate") + @ControllerEndpoint(operation = "NFT预约产品-更新", exceptionMessage = "操作失败") + public FebsResponse nftInfoUpdate(@Valid MallProductNft mallProductNft) { + return mallNewsInfoService.nftInfoUpdate(mallProductNft); + } + + /** + * 用户NFT预约列表 + */ + @GetMapping("getBuyList") + public FebsResponse getBuyList(MallProductBuy mallProductBuy, QueryRequest request) { + Map<String, Object> data = getDataTable(mallNewsInfoService.getBuyList(mallProductBuy, request)); + return new FebsResponse().success().data(data); + } + + /** + * 用户NFT提现列表 + */ + @GetMapping("getSellList") + public FebsResponse getSellList(MallProductSell mallProductSell, QueryRequest request) { + Map<String, Object> data = getDataTable(mallNewsInfoService.getSellList(mallProductSell, request)); + return new FebsResponse().success().data(data); + } /** * 新闻中心-列表 diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java index e5eb1ad..5b55e36 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java @@ -43,32 +43,32 @@ @ApiOperation(value = "app注册接口", notes = "app注册接口") @PostMapping(value = "/register") - public FebsResponse register(@RequestBody RegisterDto registerDto) { + public FebsResponse register(@RequestBody @Valid RegisterDto registerDto) { return memberService.register(registerDto); } @ApiOperation(value = "账号密码登录接口", notes = "账号密码登录接口") @PostMapping(value = "/toLogin") - public FebsResponse login(@RequestBody LoginDto loginDto) { + public FebsResponse login(@RequestBody @Valid LoginDto loginDto) { return memberService.toLogin(loginDto); } @ApiOperation(value = "忘记/修改密码", notes = "忘记/修改密码") @PostMapping(value = "/forgetPwd") - public FebsResponse forgetPwd(@RequestBody ForgetPwdDto forgetPwdDto) { + public FebsResponse forgetPwd(@RequestBody @Valid ForgetPwdDto forgetPwdDto) { return memberService.forgetPwd(forgetPwdDto); } @ApiOperation(value = "忘记密码", notes = "忘记/修改密码") @PostMapping(value = "/pwdForget") - public FebsResponse pwdForget(@RequestBody ForgetPwdDto forgetPwdDto) { + public FebsResponse pwdForget(@RequestBody @Valid ForgetPwdDto forgetPwdDto) { return memberService.pwdForget(forgetPwdDto); } @ApiOperation(value = "提交注册申诉", notes = "提交注册申诉") @PostMapping(value = "addRegisterAppeal") - public FebsResponse addRegisterAppeal(@RequestBody RegisterAppealDto registerAppeal) { + public FebsResponse addRegisterAppeal(@RequestBody @Valid RegisterAppealDto registerAppeal) { memberService.addRegisterAppeal(registerAppeal); return new FebsResponse().success().message("申请成功"); } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java index e787aaa..4dc5754 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java @@ -45,6 +45,39 @@ return memberService.findMemberInfo(); } + @ApiOperation(value = "修改用户信息") + @PostMapping(value = "/modifyInfo") + public FebsResponse modifyInfo(@RequestBody @Valid ModifyMemberInfoDto modifyMemberInfoDto) { + return memberService.modifyMemberInfo(modifyMemberInfoDto); + } + + @ApiOperation(value = "解除冻结") + @PostMapping(value = "/unfreeze") + public FebsResponse unfreeze(@RequestBody @Valid UnfreezeDto unfreezeDto) { + return memberService.unfreeze(unfreezeDto); + } + + @ApiOperation(value = "找回密钥") + @PostMapping(value = "/getKey") + public FebsResponse getKey(@RequestBody @Valid GetKeyDto getKeyDto) { + return memberService.getKey(getKeyDto); + } + + @ApiOperation(value = "获取收款信息", notes = "获取收款信息") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = MallMemberPaymentVo.class) + }) + @GetMapping(value = "/getPayment") + public FebsResponse getPayment() { + return memberService.getPayment(); + } + + @ApiOperation(value = "修改收款信息", notes = "修改收款信息") + @PostMapping(value = "/updatePayment") + public FebsResponse updatePayment(@RequestBody @Valid UpdatePaymentDto updatePaymentDto) { + return memberService.updatePayment(updatePaymentDto); + } + @ApiOperation(value = "推出登录", notes = "推出登录") @PostMapping(value = "/logout") public FebsResponse logout() { @@ -61,12 +94,6 @@ @PostMapping(value = "/setTradePwd") public FebsResponse setTradePwd(@RequestBody ForgetPwdDto forgetPwdDto) { return memberService.setTradePwd(forgetPwdDto); - } - - @ApiOperation(value = "修改用户信息") - @PostMapping(value = "/modifyInfo") - public FebsResponse modifyInfo(@RequestBody ModifyMemberInfoDto modifyMemberInfoDto) { - return memberService.modifyMemberInfo(modifyMemberInfoDto); } @ApiOperation(value = "我的团队列表") @@ -92,7 +119,7 @@ @PostMapping(value = "/transfer") public FebsResponse transfer(@RequestBody @Validated TransferDto transferDto) { memberService.transfer(transferDto); - return new FebsResponse().success().message("转账成功"); + return new FebsResponse().success().message("操作成功"); } @ApiOperation(value = "提现规则", notes = "提现规则") diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallProductController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallProductController.java new file mode 100644 index 0000000..2c9a301 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallProductController.java @@ -0,0 +1,51 @@ +package cc.mrbird.febs.mall.controller; + +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.entity.MallNewsInfo; +import cc.mrbird.febs.mall.service.IApiMallNewsService; +import cc.mrbird.febs.mall.service.IApiMallProductService; +import cc.mrbird.febs.mall.vo.NewsListVo; +import cc.mrbird.febs.mall.vo.OrderListVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@Slf4j +@RestController +@CrossOrigin("*") +@RequestMapping(value = "/api/product") +@RequiredArgsConstructor +@Api(value = "ApiMallProductController", tags = "NFT/FCM") +public class ApiMallProductController { + + private final IApiMallProductService iApiMallProductService; + + @ApiOperation(value = "预约产品列表", notes = "预约产品列表") + @GetMapping(value = "/productNFTList") + public FebsResponse productNFTList() { + return new FebsResponse().success().data(iApiMallProductService.productNFTList()); + } + @ApiOperation(value = "预约", notes = "预约") + @PostMapping(value = "/createNFT") + public FebsResponse createNFT(@RequestBody @Valid ApiCreateNFTDto createNFTDto) { + return iApiMallProductService.createNFT(createNFTDto); + } + @ApiOperation(value = "FCM提现", notes = "FCM提现") + @PostMapping(value = "/outFcm") + public FebsResponse outFcm(@RequestBody @Valid ApiOutFcmDto outFcmDto) { + return iApiMallProductService.outFcm(outFcmDto); + } + @ApiOperation(value = "NFT提现", notes = "NFT提现") + @PostMapping(value = "/outNFT") + public FebsResponse outNFT(@RequestBody @Valid ApiOutNFTDto outNFTDto) { + return iApiMallProductService.outNFT(outNFTDto); + } + +} diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java index b30b048..c16302a 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewNewsController.java @@ -4,6 +4,8 @@ import cc.mrbird.febs.common.utils.FebsUtil; import cc.mrbird.febs.mall.entity.MallNewsCategory; import cc.mrbird.febs.mall.entity.MallNewsInfo; +import cc.mrbird.febs.mall.entity.MallProductNft; +import cc.mrbird.febs.mall.mapper.MallProductNftMapper; import cc.mrbird.febs.mall.service.IMallNewsInfoService; import lombok.RequiredArgsConstructor; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -23,6 +25,55 @@ public class ViewNewsController { private final IMallNewsInfoService mallNewsInfoService; + private final MallProductNftMapper mallProductNftMapper; + + /** + * NFT预约产品 + */ + @GetMapping("productNFTList") + @RequiresPermissions("productNFTList:view") + public String productNFTList() { + return FebsUtil.view("modules/news/productNFTList"); + } + + /** + * NFT预约产品-新增 + */ + @GetMapping("productNFTAdd") + @RequiresPermissions("productNFTAdd:add") + public String productNFTAdd() { + return FebsUtil.view("modules/news/productNFTAdd"); + } + + /** + * NFT预约产品-详情 + * @return + */ + @GetMapping("productNFTUpdate/{id}") + @RequiresPermissions("productNFTUpdate:update") + public String productNFTUpdate(@PathVariable long id, Model model) { + MallProductNft mallProductNft = mallProductNftMapper.selectById(id); + model.addAttribute("mallProductNft", mallProductNft); + return FebsUtil.view("modules/news/productNFTUpdate"); + } + + /** + * 用户NFT预约列表 + */ + @GetMapping("productBuyList") + @RequiresPermissions("productBuyList:view") + public String productBuyList() { + return FebsUtil.view("modules/news/productBuyList"); + } + + /** + * 用户NFT提现列表 + */ + @GetMapping("productSellList") + @RequiresPermissions("productSellList:view") + public String productSellList() { + return FebsUtil.view("modules/news/productSellList"); + } /** * 新闻中心-列表 diff --git a/src/main/java/cc/mrbird/febs/mall/conversion/MallMemberAmountConversion.java b/src/main/java/cc/mrbird/febs/mall/conversion/MallMemberAmountConversion.java new file mode 100644 index 0000000..5ce0656 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/conversion/MallMemberAmountConversion.java @@ -0,0 +1,15 @@ +package cc.mrbird.febs.mall.conversion; + +import cc.mrbird.febs.mall.entity.MallMember; +import cc.mrbird.febs.mall.entity.MallMemberAmount; +import cc.mrbird.febs.mall.vo.MallMemberPaymentVo; +import cc.mrbird.febs.mall.vo.MallMemberVo; +import cc.mrbird.febs.mall.vo.MyCommissionVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public abstract class MallMemberAmountConversion { + public static final MallMemberAmountConversion INSTANCE = Mappers.getMapper(MallMemberAmountConversion.class); + +} diff --git a/src/main/java/cc/mrbird/febs/mall/conversion/MallMemberPaymentConversion.java b/src/main/java/cc/mrbird/febs/mall/conversion/MallMemberPaymentConversion.java new file mode 100644 index 0000000..6d8e64c --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/conversion/MallMemberPaymentConversion.java @@ -0,0 +1,15 @@ +package cc.mrbird.febs.mall.conversion; + +import cc.mrbird.febs.mall.dto.UpdatePaymentDto; +import cc.mrbird.febs.mall.entity.MallMemberPayment; +import cc.mrbird.febs.mall.vo.MallMemberPaymentVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public abstract class MallMemberPaymentConversion { + public static final MallMemberPaymentConversion INSTANCE = Mappers.getMapper(MallMemberPaymentConversion.class); + + public abstract MallMemberPaymentVo entityToVo(MallMemberPayment mallMemberPayment); + +} diff --git a/src/main/java/cc/mrbird/febs/mall/conversion/MallProductNftConversion.java b/src/main/java/cc/mrbird/febs/mall/conversion/MallProductNftConversion.java new file mode 100644 index 0000000..92dd457 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/conversion/MallProductNftConversion.java @@ -0,0 +1,19 @@ +package cc.mrbird.febs.mall.conversion; + +import cc.mrbird.febs.mall.dto.AdminMallProductNftDto; +import cc.mrbird.febs.mall.entity.MallProductNft; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @author wzy + * @date 2021-09-18 + **/ +@Mapper +public abstract class MallProductNftConversion { + public static final MallProductNftConversion INSTANCE = Mappers.getMapper(MallProductNftConversion.class); + + public abstract MallProductNft dtoToEntity(AdminMallProductNftDto adminMallProductNftDto); +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AdminMallProductNftDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AdminMallProductNftDto.java new file mode 100644 index 0000000..459fd81 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/AdminMallProductNftDto.java @@ -0,0 +1,22 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ApiModel(value = "AdminMallProductNftDto", description = "参数接收类") +public class AdminMallProductNftDto { + + private String nftCode;//编码 + private String nftImg;//图片 + private BigDecimal priceNft;//NFT价格 + private BigDecimal priceToken;//TOKEN价格 + private BigDecimal profit;//收益 5 即百分之五 + private int cycle;//周期 + private int state;//产品状态 1:开启 0:关闭 + private int memberCnt;//预约人数 + private int memberReal;//已预约人数 +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiCreateNFTDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiCreateNFTDto.java new file mode 100644 index 0000000..8257ab7 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiCreateNFTDto.java @@ -0,0 +1,21 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value = "ApiCreateNFTDto", description = "参数接收类") +public class ApiCreateNFTDto { + + @NotNull(message = "交易不能为空") + @ApiModelProperty(value = "id", example = "1") + private Long id; + + @NotNull(message = "交易密码不能为空") + @ApiModelProperty(value = "交易密码", example = "1") + private String tradePassword; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiOutFcmDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiOutFcmDto.java new file mode 100644 index 0000000..9631a57 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiOutFcmDto.java @@ -0,0 +1,25 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "ApiOutFcmDto", description = "参数接收类") +public class ApiOutFcmDto { + + @Valid + @NotNull(message = "FCM数量不能为空") + @Min(0) + @ApiModelProperty(value = "兑换FCM数量", example = "1") + private BigDecimal fcmCnt; + + @NotNull(message = "交易密码不能为空") + @ApiModelProperty(value = "交易密码", example = "1") + private String tradePassword; +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiOutNFTDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiOutNFTDto.java new file mode 100644 index 0000000..3d9258b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiOutNFTDto.java @@ -0,0 +1,25 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "ApiOutNFTDto", description = "参数接收类") +public class ApiOutNFTDto { + + @Valid + @NotNull(message = "NFT数量不能为空") + @Min(0) + @ApiModelProperty(value = "兑换NFT数量", example = "1") + private BigDecimal nftCnt; + + @NotNull(message = "交易密码不能为空") + @ApiModelProperty(value = "交易密码", example = "1") + private String tradePassword; +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/GetKeyDto.java b/src/main/java/cc/mrbird/febs/mall/dto/GetKeyDto.java new file mode 100644 index 0000000..a6f3a3d --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/GetKeyDto.java @@ -0,0 +1,18 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel(value = "GetKeyDto", description = "找回密钥参数接收类") +public class GetKeyDto { + @NotBlank(message = "密码不能为空") + @ApiModelProperty(value = "密码", example = "123456") + private String password; + @NotBlank(message = "交易密码不能为空") + @ApiModelProperty(value = "交易密码", example = "123456") + private String tradePassword; +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java index f595a4b..a535285 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** * @author wzy * @date 2021-09-24 @@ -12,9 +14,14 @@ @ApiModel(value = "ModifyMemberInfoDto", description = "修改用户信息参数接收类") public class ModifyMemberInfoDto { - @ApiModelProperty(value = "昵称", example = "123") + @NotBlank(message = "用户名不能为空") + @ApiModelProperty(value = "用户名", example = "123") private String name; @ApiModelProperty(value = "头像", example = "123") private String photo; + + @NotBlank(message = "电话不能为空") + @ApiModelProperty(value = "电话", example = "123") + private String phone; } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java b/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java index 91428c2..fec677f 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.Valid; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -17,16 +18,20 @@ @ApiModel(value = "TransferDto", description = "转账接收参数类") public class TransferDto { - @NotBlank(message = "参数不能为空") - @ApiModelProperty(value = "联系电话或邀请码", example = "123") + @ApiModelProperty(value = "转出类型 1:FCM 2:令牌", example = "1") + private int type; + + @NotBlank(message = "转出账户不能为空") + @ApiModelProperty(value = "转出账户", example = "123") private String account; - @NotNull(message = "参数不能为空") + @Valid + @NotNull(message = "金额不能为空") @Min(0) @ApiModelProperty(value = "金额", example = "1") private BigDecimal amount; - @NotBlank(message = "参数不能为空") + @NotBlank(message = "交易密码不能为空") @ApiModelProperty(value = "交易密码", example = "123456") private String tradePwd; } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/UnfreezeDto.java b/src/main/java/cc/mrbird/febs/mall/dto/UnfreezeDto.java new file mode 100644 index 0000000..5ea7b9b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/UnfreezeDto.java @@ -0,0 +1,21 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel(value = "UnfreezeDto", description = "参数接收类") +public class UnfreezeDto { + + @NotBlank(message = "用户ID不能为空") + @ApiModelProperty(value = "用户ID") + private Long memberId; + + @NotBlank(message = "类型不能为空") + @ApiModelProperty(value = "类型 1:本人解冻 2:上级解冻") + private int type; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/UpdatePaymentDto.java b/src/main/java/cc/mrbird/febs/mall/dto/UpdatePaymentDto.java new file mode 100644 index 0000000..682787a --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/UpdatePaymentDto.java @@ -0,0 +1,38 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel(value = "UpdatePaymentDto", description = "参数接收类") +public class UpdatePaymentDto { + + @NotBlank(message = "微信收款码不能为空") + @ApiModelProperty(value = "微信收款码") + private String wxQrcode;// + @NotBlank(message = "支付宝收款码不能为空") + @ApiModelProperty(value = "支付宝收款码") + private String aliQrcode;// + @NotBlank(message = "真实姓名不能为空") + @ApiModelProperty(value = "真实姓名") + private String bankName;// + @NotBlank(message = "银行卡号不能为空") + @ApiModelProperty(value = "银行卡号") + private String bankNo;// + @NotBlank(message = "开户行不能为空") + @ApiModelProperty(value = "开户行") + private String bank;// + @NotBlank(message = "手机号不能为空") + @ApiModelProperty(value = "手机号") + private String phone;// + @NotBlank(message = "USDT通道类型不能为空") + @ApiModelProperty(value = "USDT通道类型: TRC20 BEP20") + private String usdtTongdao;// + @NotBlank(message = "USDT地址不能为空") + @ApiModelProperty(value = "USDT地址") + private String usdtAddress;// + +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java index aed3e8e..f73d8be 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java @@ -173,4 +173,6 @@ //提现开关 1:开启 2:关闭 private Integer outsideWith; + private String userKey; + private Integer isFrozen;//是否冻结 1:是 0 :否 } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberAmount.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberAmount.java index 8d50479..10f661e 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberAmount.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberAmount.java @@ -3,6 +3,9 @@ import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; + +import java.math.BigDecimal; + /** * CREATE TABLE `mall_member_amount` ( * `id` bigint(20) NOT NULL AUTO_INCREMENT, @@ -26,11 +29,11 @@ @TableName("mall_member_amount") public class MallMemberAmount extends BaseEntity { private Long memberId; - private Long staticNft;//静态NFT - private Long trendsNft;//动态NFT - private Long frozenNft;//冻结NFT - private Long fcmCntAva;//FCM代币可用 - private Long fcmCntFrozen;//FCM代币冻结 - private Long tokenAva;//令牌可用 - private Long tokenFrozen;//令牌冻结 + private BigDecimal staticNft;//静态NFT + private BigDecimal trendsNft;//动态NFT + private BigDecimal frozenNft;//冻结NFT + private BigDecimal fcmCntAva;//FCM代币可用 + private BigDecimal fcmCntFrozen;//FCM代币冻结 + private BigDecimal tokenAva;//令牌可用 + private BigDecimal tokenFrozen;//令牌冻结 } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberPayment.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberPayment.java index 396c31f..7e73453 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberPayment.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberPayment.java @@ -13,31 +13,17 @@ public class MallMemberPayment extends BaseEntity { private Long memberId; - - private String wxQrcode; - + private String wxQrcode;//微信收款码 private String wxName; - private String wxAccount; - - private String aliQrcode; - + private String aliQrcode;//支付宝收款码 private String aliName; - private String aliAccount; + private String bankName;//真实姓名 + private String bankNo;//银行卡号 + private String bank;//开户行 + private String phone;//手机号 + private String usdtTongdao;//USDT通道类型: TRC20 BEP20 + private String usdtAddress;//USDT地址 - /** - * 持卡人姓名 - */ - private String bankName; - - /** - * 银行卡号 - */ - private String bankNo; - - /** - * 开户行 - */ - private String bank; } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallProductBuy.java b/src/main/java/cc/mrbird/febs/mall/entity/MallProductBuy.java new file mode 100644 index 0000000..1123f40 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallProductBuy.java @@ -0,0 +1,24 @@ +package cc.mrbird.febs.mall.entity; + +import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +import java.math.BigDecimal; + +@Data +@TableName("mall_product_buy") +public class MallProductBuy extends BaseEntity { + + private Long memberId;// + private Long sellId;//出售ID + private Long productNftId;//预约NFT编码 + private int state;//预约状态 0:失败 1:进行中 2:超时 3:已完成 + private int mateState;//匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成 + private BigDecimal nftTotal;//nft预约额度 + private BigDecimal nftAva;//nft分配额度 + private Date orderTime;//匹配时间 + private Date payTime;//支付时间 +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallProductNft.java b/src/main/java/cc/mrbird/febs/mall/entity/MallProductNft.java new file mode 100644 index 0000000..737209e --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallProductNft.java @@ -0,0 +1,22 @@ +package cc.mrbird.febs.mall.entity; + +import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@TableName("mall_product_nft") +public class MallProductNft extends BaseEntity { + + private String nftCode;//编码 + private String nftImg;//图片 + private BigDecimal priceNft;//NFT价格 + private BigDecimal priceToken;//TOKEN价格 + private BigDecimal profit;//收益 5 即百分之五 + private int cycle;//周期 + private int state;//产品状态 1:开启 0:关闭 + private int memberCnt;//预约人数 + private int memberReal;//已预约人数 +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallProductSell.java b/src/main/java/cc/mrbird/febs/mall/entity/MallProductSell.java new file mode 100644 index 0000000..f37423b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallProductSell.java @@ -0,0 +1,20 @@ +package cc.mrbird.febs.mall.entity; + +import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@TableName("mall_product_sell") +public class MallProductSell extends BaseEntity { + + private Long memberId;// + private BigDecimal nftTotal;//动态NFT总数 + private BigDecimal nftCnt;//实际提现数量 + private BigDecimal nftCntAva;//剩余数量 + private BigDecimal nftFee;//NFT手续费 + private BigDecimal fcmFee;//代币手续费 + private Integer state;//预约状态 0:失败 1:进行中 2:超时 3:已完成 +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallProductSellRecord.java b/src/main/java/cc/mrbird/febs/mall/entity/MallProductSellRecord.java new file mode 100644 index 0000000..c3e75ac --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallProductSellRecord.java @@ -0,0 +1,22 @@ +package cc.mrbird.febs.mall.entity; + +import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("mall_product_sell_record") +public class MallProductSellRecord extends BaseEntity { + + private Long sellId;// + private Long memberId;// + private Date orderTime;//匹配时间 + private Date payTime;//支付时间 + private BigDecimal nftCnt;//支付数量 + private String nftImg;//支付凭证 + private Integer type;//支付类型 1:微信 2:支付宝 3:银行转账 4:USDT转账 + private Integer state;//匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成 +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberAmountMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberAmountMapper.java index 5d7fcbf..ccf187e 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberAmountMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberAmountMapper.java @@ -2,6 +2,21 @@ import cc.mrbird.febs.mall.entity.MallMemberAmount; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; public interface MallMemberAmountMapper extends BaseMapper<MallMemberAmount> { + + MallMemberAmount selectByMemberId(@Param("memberId")Long memberId); + + void updateFcmCntAvaById(@Param("record")MallMemberAmount mallMemberAmount); + + void updateTokenAvaById(@Param("record")MallMemberAmount mallMemberAmount); + + void updateTokenAvaAndTokenFrozenById(@Param("record")MallMemberAmount mallMemberAmount); + + void updateTrendsNftById(@Param("record")MallMemberAmount mallMemberAmount); + + void updateFrozenNftById(@Param("record")MallMemberAmount mallMemberAmount); } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallNewsInfoMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallNewsInfoMapper.java index 4c3a65f..781e3b9 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallNewsInfoMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallNewsInfoMapper.java @@ -2,7 +2,9 @@ import cc.mrbird.febs.mall.dto.NewsListDto; import cc.mrbird.febs.mall.entity.MallNewsInfo; +import cc.mrbird.febs.mall.entity.MallProductNft; import cc.mrbird.febs.mall.vo.AdminMallNewsInfoVo; +import cc.mrbird.febs.mall.vo.AdminMallProductNftVo; import cc.mrbird.febs.mall.vo.NewsListVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallProductBuyMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductBuyMapper.java new file mode 100644 index 0000000..3212291 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductBuyMapper.java @@ -0,0 +1,12 @@ +package cc.mrbird.febs.mall.mapper; + +import cc.mrbird.febs.mall.entity.MallProductBuy; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +public interface MallProductBuyMapper extends BaseMapper<MallProductBuy> { + MallProductBuy selectMemberIdAndNFTIdAndStateAndMateState(@Param("memberId")Long memberId, + @Param("productNFTId")Long productNFTId, + @Param("state")Integer state, + @Param("mateState")Integer mateState); +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallProductNftMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductNftMapper.java new file mode 100644 index 0000000..d2142ae --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductNftMapper.java @@ -0,0 +1,27 @@ +package cc.mrbird.febs.mall.mapper; + +import cc.mrbird.febs.mall.entity.MallProductBuy; +import cc.mrbird.febs.mall.entity.MallProductNft; +import cc.mrbird.febs.mall.entity.MallProductSell; +import cc.mrbird.febs.mall.vo.AdminMallProductBuyVo; +import cc.mrbird.febs.mall.vo.AdminMallProductNftVo; +import cc.mrbird.febs.mall.vo.AdminMallProductSellVo; +import cc.mrbird.febs.mall.vo.ApiMallProductNftVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface MallProductNftMapper extends BaseMapper<MallProductNft> { + + IPage<AdminMallProductNftVo> getProductNFTList(Page<AdminMallProductNftVo> page, @Param("record")MallProductNft mallProductNft); + + List<ApiMallProductNftVo> selectByState(@Param("state")int value); + + IPage<AdminMallProductBuyVo> getBuyList(Page<AdminMallProductBuyVo> page, @Param("record")MallProductBuy mallProductBuy); + + IPage<AdminMallProductSellVo> getSellList(Page<AdminMallProductSellVo> page, @Param("record")MallProductSell mallProductSell); + +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellMapper.java new file mode 100644 index 0000000..09541dd --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellMapper.java @@ -0,0 +1,7 @@ +package cc.mrbird.febs.mall.mapper; + +import cc.mrbird.febs.mall.entity.MallProductSell; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface MallProductSellMapper extends BaseMapper<MallProductSell> { +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellRecordMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellRecordMapper.java new file mode 100644 index 0000000..8cb5822 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallProductSellRecordMapper.java @@ -0,0 +1,7 @@ +package cc.mrbird.febs.mall.mapper; + +import cc.mrbird.febs.mall.entity.MallProductSellRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface MallProductSellRecordMapper extends BaseMapper<MallProductSellRecord> { +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java index e51671b..686d2b7 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java @@ -82,4 +82,12 @@ FebsResponse createAccount(); FebsResponse createKey(); + + FebsResponse getPayment(); + + FebsResponse getKey(GetKeyDto getKeyDto); + + FebsResponse updatePayment(UpdatePaymentDto updatePaymentDto); + + FebsResponse unfreeze(UnfreezeDto unfreezeDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java index d6dfd39..811d8d8 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java @@ -26,4 +26,5 @@ int reduce(BigDecimal amount, Long memberId, String field, Map<String, BigDecimal> map); void commissionChange(CommissionChangeDto commissionChange); + } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallProductService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallProductService.java new file mode 100644 index 0000000..8388b5e --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallProductService.java @@ -0,0 +1,22 @@ +package cc.mrbird.febs.mall.service; + +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.dto.ApiCreateNFTDto; +import cc.mrbird.febs.mall.dto.ApiOutFcmDto; +import cc.mrbird.febs.mall.dto.ApiOutNFTDto; +import cc.mrbird.febs.mall.entity.MallNewsCategory; +import cc.mrbird.febs.mall.entity.MallProductNft; +import cc.mrbird.febs.mall.vo.ApiMallProductNftVo; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IApiMallProductService extends IService<MallProductNft> { + List<ApiMallProductNftVo> productNFTList(); + + FebsResponse createNFT(ApiCreateNFTDto createNFTDto); + + FebsResponse outFcm(ApiOutFcmDto outFcmDto); + + FebsResponse outNFT(ApiOutNFTDto outNFTDto); +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java b/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java index 5b35700..8cea027 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java @@ -15,4 +15,6 @@ void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType); + void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType, String description); + } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java b/src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java index 2332a5a..762d896 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IMallNewsInfoService.java @@ -2,10 +2,13 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.dto.AdminMallProductNftDto; import cc.mrbird.febs.mall.dto.MallNewsInfoDto; -import cc.mrbird.febs.mall.entity.MallNewsCategory; -import cc.mrbird.febs.mall.entity.MallNewsInfo; +import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.vo.AdminMallNewsInfoVo; +import cc.mrbird.febs.mall.vo.AdminMallProductBuyVo; +import cc.mrbird.febs.mall.vo.AdminMallProductNftVo; +import cc.mrbird.febs.mall.vo.AdminMallProductSellVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -32,4 +35,16 @@ List<MallNewsCategory> findAllCategory(); FebsResponse delNewsCategoryInfo(Long id); + + IPage<AdminMallProductNftVo> getProductNFTList(MallProductNft mallProductNft, QueryRequest request); + + FebsResponse addProductNFT(AdminMallProductNftDto adminMallProductNftDto); + + FebsResponse delNFT(Long id); + + FebsResponse nftInfoUpdate(MallProductNft mallProductNft); + + IPage<AdminMallProductBuyVo> getBuyList(MallProductBuy mallProductBuy, QueryRequest request); + + IPage<AdminMallProductSellVo> getSellList(MallProductSell mallProductSell, QueryRequest request); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java index 7806be2..8283291 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java @@ -55,4 +55,6 @@ void achieveReleaseJob(); void selaHalfVoucher(String price); + + void fcmNFTExchangeMsg(String cnt); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 230a6e7..d948432 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java @@ -4,16 +4,14 @@ import cc.mrbird.febs.common.enumerates.*; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.*; -import cc.mrbird.febs.mall.conversion.MallGoodsConversion; -import cc.mrbird.febs.mall.conversion.MallMemberBankConversion; -import cc.mrbird.febs.mall.conversion.MallMemberConversion; -import cc.mrbird.febs.mall.conversion.MallShopApplyConversion; +import cc.mrbird.febs.mall.conversion.*; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.ICommonService; +import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.mall.vo.*; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -60,6 +58,7 @@ private final MallShopApplyMapper mallShopApplyMapper; private final MallRegisterAppealMapper mallRegisterAppealMapper; private final MallMemberBankMapper mallMemberBankMapper; + private final IMallMoneyFlowService mallMoneyFlowService; @Value("${spring.profiles.active}") @@ -88,6 +87,7 @@ mallMember = new MallMember(); mallMember.setAccountLogin(accountLogin); mallMember.setPassword(SecureUtil.md5(registerDto.getPassword())); + mallMember.setUserKey(userKey); mallMember.setTradePassword(SecureUtil.md5(registerDto.getTradePassword())); Integer count = this.baseMapper.selectCount(null); @@ -201,7 +201,7 @@ this.baseMapper.updateById(mallMember); redisUtils.del(AppContants.APP_LOGIN_PREFIX + mallMember.getId()); - return new FebsResponse().success().message("重置成功"); + return new FebsResponse().success().message("操作成功"); } @Override @@ -223,27 +223,32 @@ mallMemberVo.setReferrerName(referMember.getName()); } - if (StrUtil.isNotBlank(mallMember.getTradePassword())) { - mallMemberVo.setHasTradePwd(1); - } - MallMemberPayment payment = mallMemberPaymentMapper.selectByMemberId(id); if (payment != null) { mallMemberVo.setHasPayment(1); } + DataDictionaryCustom fcmPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.FCM_PRICE.getType(), + DataDictionaryEnum.FCM_PRICE.getCode()); + mallMemberVo.setFcmPrice(ObjectUtil.isEmpty(fcmPriceDic) ? new BigDecimal(2) : new BigDecimal(fcmPriceDic.getValue())); + + DataDictionaryCustom outFcmFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.OUT_FCM_FEE.getType(), + DataDictionaryEnum.OUT_FCM_FEE.getCode()); + mallMemberVo.setOutFcmFee(ObjectUtil.isEmpty(outFcmFeeDic) ? new BigDecimal(20) : new BigDecimal(outFcmFeeDic.getValue())); DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL, mallMember.getLevel()); if (dic != null) { mallMemberVo.setLevelName(dic.getDescription()); } - MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId()); - mallMemberVo.setBalance(wallet.getBalance()); - mallMemberVo.setScore(wallet.getScore()); - mallMemberVo.setPrizeScore(wallet.getPrizeScore()); - mallMemberVo.setTotalScore(wallet.getTotalScore()); - mallMemberVo.setStar(wallet.getStar()); - mallMemberVo.setVoucherCnt(wallet.getVoucherCnt()); - mallMemberVo.setTotalCost(mallOrderInfoMapper.selectTotalAmount(id)); + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(mallMember.getId()); + mallMemberVo.setStaticNft(mallMemberAmount.getStaticNft()); + mallMemberVo.setTrendsNft(mallMemberAmount.getTrendsNft()); + mallMemberVo.setFrozenNft(mallMemberAmount.getFrozenNft()); + mallMemberVo.setFcmCntAva(mallMemberAmount.getFcmCntAva()); + mallMemberVo.setFcmCntFrozen(mallMemberAmount.getFcmCntFrozen()); + mallMemberVo.setTokenAva(mallMemberAmount.getTokenAva()); + mallMemberVo.setTokenFrozen(mallMemberAmount.getTokenFrozen()); return new FebsResponse().success().data(mallMemberVo); } @@ -279,23 +284,22 @@ } mallMember.setTradePassword(SecureUtil.md5(forgetPwdDto.getPassword())); this.baseMapper.updateById(mallMember); - return new FebsResponse().success().message("设置成功"); + return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse modifyMemberInfo(ModifyMemberInfoDto modifyMemberInfoDto) { MallMember member = LoginUserUtil.getLoginUser(); MallMember mallMember = this.baseMapper.selectById(member.getId()); - if (StrUtil.isNotBlank(modifyMemberInfoDto.getName())) { - mallMember.setName(modifyMemberInfoDto.getName()); - } + mallMember.setName(modifyMemberInfoDto.getName()); + mallMember.setPhone(modifyMemberInfoDto.getPhone()); if (StrUtil.isNotBlank(modifyMemberInfoDto.getPhoto())) { mallMember.setAvatar(modifyMemberInfoDto.getPhoto()); } this.baseMapper.updateById(mallMember); - return new FebsResponse().success().message("修改成功"); + return new FebsResponse().success().message("操作成功"); } @Override @@ -351,64 +355,91 @@ @Override @Transactional(rollbackFor = Exception.class) public void transfer(TransferDto transferDto) { - MallMember mallMember = this.baseMapper.selectInfoByAccount(transferDto.getAccount()); - if (mallMember == null) { - throw new FebsException("用户不存在"); + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember loginMember = this.baseMapper.selectById(memberId); + BigDecimal amount = transferDto.getAmount(); + int type = transferDto.getType(); + + if(1 != type || 2 != type){ + throw new FebsException("请选择互转类型"); } - Integer insideWith = mallMember.getInsideWith() == null ? 2 :mallMember.getInsideWith(); + Integer insideWith = loginMember.getInsideWith() == null ? 2 :loginMember.getInsideWith(); if (1 != insideWith) { throw new FebsException("功能升级中"); } - Long memberId = LoginUserUtil.getLoginUser().getId(); - MallMember loginMember = this.baseMapper.selectById(memberId); + MallMember mallMember = this.baseMapper.selectByAccountLogin(transferDto.getAccount()); + if (mallMember == null) { + throw new FebsException("转出账户不存在"); + } - if (loginMember.getPhone().equals(transferDto.getAccount()) || loginMember.getInviteId().equals(transferDto.getAccount())) { + if (loginMember.getAccountLogin().equals(transferDto.getAccount())) { throw new FebsException("不能给自己转账"); } if (StrUtil.isBlank(loginMember.getTradePassword())) { - throw new FebsException("未设置支付密码"); + throw new FebsException("请设置交易密码"); } if (!loginMember.getTradePassword().equals(SecureUtil.md5(transferDto.getTradePwd()))) { - throw new FebsException("支付密码错误"); + throw new FebsException("交易密码错误"); } - DataDictionaryCustom cashOutSettingDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( - DataDictionaryEnum.CASHOUT_SETTING.getType(), - DataDictionaryEnum.CASHOUT_SETTING.getCode() - ); - CashOutSettingVo cashOutSettingVo = JSONObject.parseObject(cashOutSettingDic.getValue(), CashOutSettingVo.class); - BigDecimal insideFee = cashOutSettingVo.getInsideFee().multiply(BigDecimal.valueOf(0.01)); - //转账手续费 - BigDecimal insideFeeAmount = transferDto.getAmount().multiply(insideFee).setScale(2, BigDecimal.ROUND_DOWN); - - BigDecimal avaAmount = transferDto.getAmount().subtract(insideFeeAmount).setScale(2, BigDecimal.ROUND_DOWN); - walletService.reduceBalance(avaAmount, memberId); - String orderNo = MallUtils.getOrderNum("T"); - this.addMoneyFlow( - memberId, - avaAmount.negate(), - MoneyFlowTypeEnum.TRANSFER.getValue(), - orderNo, - null, - null, - mallMember.getId(), - null, - FlowTypeEnum.BALANCE.getValue()); - - walletService.addBalance(avaAmount, mallMember.getId()); - this.addMoneyFlow( - mallMember.getId(), - avaAmount, - MoneyFlowTypeEnum.TRANSFER.getValue(), - orderNo, - null, - null, - memberId, - null, - FlowTypeEnum.BALANCE.getValue()); + BigDecimal avaAmount = transferDto.getAmount().setScale(2, BigDecimal.ROUND_DOWN); + MallMemberAmount mallMemberAmountLogin = mallMemberAmountMapper.selectByMemberId(loginMember.getId()); + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(mallMember.getId()); + if(1 == type){ + if (amount.compareTo(mallMemberAmountLogin.getFcmCntAva()) > 0) { + throw new FebsException("代币不足"); + } + mallMemberAmountLogin.setFcmCntAva(mallMemberAmountLogin.getFcmCntAva().subtract(amount)); + mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmountLogin); + String orderNo = MallUtils.getOrderNum("DB"); + mallMoneyFlowService.addMoneyFlow( + loginMember.getId(), + amount.negate(), + MoneyFlowTypeNewEnum.FCM_INSIDE_OUT.getValue(), + orderNo, + mallMember.getId(), + FlowTypeNewEnum.FCM_COIN.getValue(), + MoneyFlowTypeNewEnum.FCM_INSIDE_OUT.getDescrition()); + mallMemberAmount.setFcmCntAva(mallMemberAmount.getFcmCntAva().add(amount)); + mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmount); + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + amount, + MoneyFlowTypeNewEnum.FCM_INSIDE_IN.getValue(), + orderNo, + loginMember.getId(), + FlowTypeNewEnum.FCM_COIN.getValue(), + MoneyFlowTypeNewEnum.FCM_INSIDE_IN.getDescrition()); + } + if(2 == type){ + if (amount.compareTo(mallMemberAmountLogin.getTokenAva()) > 0) { + throw new FebsException("令牌不足"); + } + mallMemberAmountLogin.setTokenAva(mallMemberAmountLogin.getTokenAva().subtract(amount)); + mallMemberAmountMapper.updateTokenAvaById(mallMemberAmountLogin); + String orderNo = MallUtils.getOrderNum("LP"); + mallMoneyFlowService.addMoneyFlow( + loginMember.getId(), + amount.negate(), + MoneyFlowTypeNewEnum.TOKEN_INSIDE_OUT.getValue(), + orderNo, + mallMember.getId(), + FlowTypeNewEnum.TOKEN.getValue(), + MoneyFlowTypeNewEnum.TOKEN_INSIDE_OUT.getDescrition()); + mallMemberAmount.setTokenAva(mallMemberAmount.getTokenAva().add(amount)); + mallMemberAmountMapper.updateTokenAvaById(mallMemberAmount); + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + amount, + MoneyFlowTypeNewEnum.TOKEN_INSIDE_IN.getValue(), + orderNo, + loginMember.getId(), + FlowTypeNewEnum.TOKEN.getValue(), + MoneyFlowTypeNewEnum.TOKEN_INSIDE_IN.getDescrition()); + } } @Override @@ -655,7 +686,7 @@ String pwd = SecureUtil.md5(forgetPwdDto.getPassword()); mallMember.setPassword(pwd); this.baseMapper.updateById(mallMember); - return new FebsResponse().success().message("重置成功"); + return new FebsResponse().success().message("操作成功"); } @Override @@ -672,6 +703,99 @@ return new FebsResponse().success().data(key); } + @Override + public FebsResponse getPayment() { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectByMemberId(memberId); + MallMemberPaymentVo mallMemberPaymentVo = MallMemberPaymentConversion.INSTANCE.entityToVo(mallMemberPayment); + return new FebsResponse().success().data(mallMemberPaymentVo); + } + + @Override + public FebsResponse getKey(GetKeyDto getKeyDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember mallMember = this.baseMapper.selectById(memberId); + String md5Pwd = SecureUtil.md5(getKeyDto.getPassword()); + String md5TraPwd = SecureUtil.md5(getKeyDto.getTradePassword()); + if(!mallMember.getPassword().equals(md5Pwd)){ + throw new FebsException("登录密码错误"); + } + if(!mallMember.getTradePassword().equals(md5TraPwd)){ + throw new FebsException("交易密码错误"); + } + return new FebsResponse().success().data(mallMember.getUserKey()); + } + + @Override + public FebsResponse updatePayment(UpdatePaymentDto updatePaymentDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + + MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectByMemberId(memberId); + mallMemberPayment.setWxQrcode(updatePaymentDto.getWxQrcode()); + mallMemberPayment.setAliQrcode(updatePaymentDto.getAliQrcode()); + mallMemberPayment.setBankName(updatePaymentDto.getBankName()); + mallMemberPayment.setBankNo(updatePaymentDto.getBankNo()); + mallMemberPayment.setBank(updatePaymentDto.getBank()); + mallMemberPayment.setPhone(updatePaymentDto.getPhone()); + mallMemberPayment.setUsdtTongdao(updatePaymentDto.getUsdtTongdao()); + mallMemberPayment.setUsdtAddress(updatePaymentDto.getUsdtAddress()); + mallMemberPaymentMapper.updateById(mallMemberPayment); + + return new FebsResponse().success().message("操作成功"); + } + + @Override + public FebsResponse unfreeze(UnfreezeDto unfreezeDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + /** + * 判断账号是否冻结 + * 判断账号FCM代币是否足够 + * 1、自行解冻:扣除对应的FCM代币 + * 2、上级解冻:查询是否是解冻用户的直接上级,扣除对应的FCM代币 + * 更新账号状态 + * 生成流水记录 + */ + Long unfreezeMemberId = unfreezeDto.getMemberId(); + MallMember mallMember = this.baseMapper.selectById(unfreezeMemberId); + Integer isFrozen = mallMember.getIsFrozen(); + if(1 != isFrozen){ + throw new FebsException("账户未被冻结"); + } + DataDictionaryCustom memberFrozenFcmCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.MEMBER_FROZEN_FCM_CNT.getType(), + DataDictionaryEnum.MEMBER_FROZEN_FCM_CNT.getCode() + ); + BigDecimal memberFrozenFcmCnt = new BigDecimal(memberFrozenFcmCntDic.getValue()); + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(unfreezeMemberId); + BigDecimal fcmCntAva = mallMemberAmount.getFcmCntAva(); + if(memberFrozenFcmCnt.compareTo(fcmCntAva) > 0){ + throw new FebsException("解除冻结需要FCM的数量为:" + fcmCntAva); + } + if(2 == unfreezeDto.getType()){ + List<MallMember> mallMembers = this.baseMapper.selectByRefererId(mallMember.getInviteId()); + List<Long> collectMemberIds = mallMembers.stream().map(MallMember::getId).collect(Collectors.toList()); + if(!collectMemberIds.contains(unfreezeMemberId)){ + throw new FebsException("直接推荐人才能解除账户的冻结状态"); + } + } + BigDecimal fcmCntAvaSub = fcmCntAva.subtract(memberFrozenFcmCnt); + mallMemberAmount.setFcmCntAva(fcmCntAvaSub); + mallMemberAmountMapper.updateById(mallMemberAmount); + mallMember.setIsFrozen(0); + this.baseMapper.updateById(mallMember); + + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + memberFrozenFcmCnt.negate(), + MoneyFlowTypeNewEnum.UNFREEZE_USER.getValue(), + MallUtils.getOrderNum(), + memberId, + FlowTypeNewEnum.FCM_COIN.getValue(), + MoneyFlowTypeNewEnum.UNFREEZE_USER.getDescrition()); + + return new FebsResponse().success().message("操作成功"); + } + public static void main(String[] args) { Set<String> objectsAccount = new HashSet<>(); Set<String> objects = new HashSet<>(); diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallProductServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallProductServiceImpl.java new file mode 100644 index 0000000..c2750fd --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallProductServiceImpl.java @@ -0,0 +1,266 @@ +package cc.mrbird.febs.mall.service.impl; + +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; +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.dto.ApiCreateNFTDto; +import cc.mrbird.febs.mall.dto.ApiOutFcmDto; +import cc.mrbird.febs.mall.dto.ApiOutNFTDto; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.*; +import cc.mrbird.febs.mall.service.IApiMallProductService; +import cc.mrbird.febs.mall.service.IMallMoneyFlowService; +import cc.mrbird.febs.mall.vo.ApiMallProductNftVo; +import cc.mrbird.febs.rabbit.producter.AgentProducer; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +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.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ApiMallProductServiceImpl extends ServiceImpl<MallProductNftMapper, MallProductNft> implements IApiMallProductService { + + private final MallMemberMapper memberMapper; + private final MallProductBuyMapper mallProductBuyMapper; + private final MallMemberAmountMapper mallMemberAmountMapper; + private final IMallMoneyFlowService iMallMoneyFlowService; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; + private final AgentProducer agentProducer; + private final MallProductSellMapper mallProductSellMapper; + private final MallProductSellRecordMapper mallProductSellRecordMapper; + + @Override + public List<ApiMallProductNftVo> productNFTList() { + List<ApiMallProductNftVo> list = this.baseMapper.selectByState(ProductEnum.PRODUCT_NFT_OPEN.getValue()); + return list; + } + + @Override + @Transactional + public FebsResponse createNFT(ApiCreateNFTDto createNFTDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember mallMember = memberMapper.selectById(memberId); + Long productNFTId = createNFTDto.getId(); + String tradePassword = SecureUtil.md5(createNFTDto.getTradePassword()); + /** + * 预约,验证交易密码、预约产品是否开启状态、该产品是否已经预约、token是否足够 + * 冻结对应的令牌数量、生成预约记录、生成流水记录 + */ + if(!tradePassword.equals(mallMember.getTradePassword())){ + throw new FebsException("请输入正确的交易密码"); + } + MallProductNft mallProductNft = this.baseMapper.selectById(productNFTId); + if(ObjectUtil.isEmpty(mallProductNft)){ + throw new FebsException("网络异常"); + } + if(ProductEnum.PRODUCT_NFT_OPEN.getValue() != mallProductNft.getState()){ + throw new FebsException("预约超时"); + } + MallProductBuy mallProductBuy = mallProductBuyMapper.selectMemberIdAndNFTIdAndStateAndMateState( + memberId,productNFTId,ProductEnum.PRODUCT_BUY_ON_GOING.getValue(),null); + if(ObjectUtil.isNotEmpty(mallProductBuy)){ + throw new FebsException("不可重复预约"); + } + + BigDecimal priceToken = mallProductNft.getPriceToken(); + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + if(BigDecimal.ZERO.compareTo(mallMemberAmount.getTokenAva()) >= 0 + || priceToken.compareTo(mallMemberAmount.getTokenAva()) > 0){ + throw new FebsException("余额不足"); + } + mallProductBuy = new MallProductBuy(); + mallProductBuy.setMemberId(memberId); + mallProductBuy.setProductNftId(mallProductNft.getId()); + mallProductBuy.setState(ProductEnum.PRODUCT_BUY_ON_GOING.getValue()); + mallProductBuy.setMateState(ProductEnum.PRODUCT_MATE_STATE_ON_GOING.getValue()); + mallProductBuy.setNftTotal(mallProductNft.getPriceNft()); + mallProductBuy.setNftAva(BigDecimal.ZERO); + mallProductBuyMapper.insert(mallProductBuy); + //令牌 可用减少,冻结增加 + mallMemberAmount.setTokenAva(mallMemberAmount.getTokenAva().subtract(priceToken)); + mallMemberAmount.setTokenFrozen(mallMemberAmount.getTokenFrozen().add(priceToken)); + mallMemberAmountMapper.updateTokenAvaAndTokenFrozenById(mallMemberAmount); + + String orderNo = MallUtils.getOrderNum("YY"); + iMallMoneyFlowService.addMoneyFlow( + memberId, + priceToken.negate(), + MoneyFlowTypeNewEnum.TOKEN_BUY_FROZEN.getValue(), + orderNo, + null, + FlowTypeNewEnum.TOKEN.getValue(), + MoneyFlowTypeNewEnum.TOKEN_BUY_FROZEN.getDescrition()); + return new FebsResponse().success(); + } + + @Override + @Transactional + public FebsResponse outFcm(ApiOutFcmDto outFcmDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember mallMember = memberMapper.selectById(memberId); + String tradePassword = SecureUtil.md5(outFcmDto.getTradePassword()); + /** + * 实时兑换FCM-to-NFT + * 验证账户交易密码,fcm余额 + * 计算手续费、减少用户的fcm余额 + * 增加流水 + */ + if(!tradePassword.equals(mallMember.getTradePassword())){ + throw new FebsException("请输入正确的交易密码"); + } + BigDecimal fcmCnt = outFcmDto.getFcmCnt(); + DataDictionaryCustom outFcmMinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.OUT_FCM_MIN.getType(), + DataDictionaryEnum.OUT_FCM_MIN.getCode()); + BigDecimal outFcmMin = ObjectUtil.isEmpty(outFcmMinDic) ? new BigDecimal(100) : new BigDecimal(outFcmMinDic.getValue()); + if(outFcmMin.compareTo(fcmCnt) > 0){ + throw new FebsException("最少"+outFcmMin); + } + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + if(BigDecimal.ZERO.compareTo(mallMemberAmount.getFcmCntAva()) >= 0 + || fcmCnt.compareTo(mallMemberAmount.getTokenAva()) > 0){ + throw new FebsException("余额不足"); + } + DataDictionaryCustom fcmPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.FCM_PRICE.getType(), + DataDictionaryEnum.FCM_PRICE.getCode()); + BigDecimal fcmPrice = ObjectUtil.isEmpty(fcmPriceDic) ? new BigDecimal(2) : new BigDecimal(fcmPriceDic.getValue()); + //手续费 + DataDictionaryCustom outFcmFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.OUT_FCM_FEE.getType(), + DataDictionaryEnum.OUT_FCM_FEE.getCode()); + BigDecimal outFcmFeePercent = ObjectUtil.isEmpty(outFcmFeeDic) ? new BigDecimal(20) : new BigDecimal(outFcmFeeDic.getValue()); + outFcmFeePercent = outFcmFeePercent.divide(new BigDecimal(100),4,BigDecimal.ROUND_DOWN); + BigDecimal outFcmFee = fcmCnt.multiply(outFcmFeePercent); + //实际到账数量 + BigDecimal fcmCntReal = fcmCnt.subtract(outFcmFee).setScale(2, BigDecimal.ROUND_DOWN); + + BigDecimal nftCnt = fcmCntReal.multiply(fcmPrice); + + mallMemberAmount.setFcmCntAva(mallMemberAmount.getFcmCntAva().subtract(fcmCnt)); + mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmount); + String orderNo = MallUtils.getOrderNum("DB"); + iMallMoneyFlowService.addMoneyFlow( + memberId, + fcmCnt.negate(), + MoneyFlowTypeNewEnum.FCM_OUT.getValue(), + orderNo, + mallMember.getId(), + FlowTypeNewEnum.FCM_COIN.getValue(), + MoneyFlowTypeNewEnum.FCM_OUT.getDescrition()); + iMallMoneyFlowService.addMoneyFlow( + memberId, + outFcmFee.negate(), + MoneyFlowTypeNewEnum.FCM_OUT_FEE.getValue(), + orderNo, + mallMember.getId(), + FlowTypeNewEnum.FCM_COIN.getValue(), + MoneyFlowTypeNewEnum.FCM_OUT_FEE.getDescrition()); + + mallMemberAmount.setTrendsNft(mallMemberAmount.getTrendsNft().add(nftCnt)); + mallMemberAmountMapper.updateTrendsNftById(mallMemberAmount); + String orderNoNFT = MallUtils.getOrderNum("NFT"); + iMallMoneyFlowService.addMoneyFlow( + memberId, + nftCnt, + MoneyFlowTypeNewEnum.NFT_IN.getValue(), + orderNoNFT, + mallMember.getId(), + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.NFT_IN.getDescrition()); + + agentProducer.sendFcmNFTExchangeMsg(outFcmFee.toString()); + return new FebsResponse().success(); + } + + @Override + @Transactional + public FebsResponse outNFT(ApiOutNFTDto outNFTDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember mallMember = memberMapper.selectById(memberId); + String tradePassword = SecureUtil.md5(outNFTDto.getTradePassword()); + /** + * 验证数量、交易密码、NFT余额 + * 计算手续费、减少动态NFT、增加冻结NFT + * 增加流水 + */ + if(!tradePassword.equals(mallMember.getTradePassword())){ + throw new FebsException("请输入正确的交易密码"); + } + BigDecimal nftCnt = outNFTDto.getNftCnt(); + DataDictionaryCustom nftMinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.NFT_MIN.getType(), + DataDictionaryEnum.NFT_MIN.getCode()); + BigDecimal nftMin = ObjectUtil.isEmpty(nftMinDic) ? new BigDecimal(100) : new BigDecimal(nftMinDic.getValue()); + if(nftMin.compareTo(nftCnt) > 0){ + throw new FebsException("最少"+nftMin); + } + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + if(BigDecimal.ZERO.compareTo(mallMemberAmount.getTrendsNft()) >= 0 + || nftCnt.compareTo(mallMemberAmount.getTrendsNft()) > 0){ + throw new FebsException("余额不足"); + } + DataDictionaryCustom nftFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.NFT_FEE.getType(), + DataDictionaryEnum.NFT_FEE.getCode()); + BigDecimal nftFeePercent = ObjectUtil.isEmpty(nftFeeDic) ? new BigDecimal(20) : new BigDecimal(nftFeeDic.getValue()); + nftFeePercent = nftFeePercent.divide(new BigDecimal(100),4,BigDecimal.ROUND_DOWN); + BigDecimal nftFee = nftCnt.multiply(nftFeePercent); + BigDecimal nftCntAva = nftCnt.subtract(nftFee); + + DataDictionaryCustom fcmPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.FCM_PRICE.getType(), + DataDictionaryEnum.FCM_PRICE.getCode()); + BigDecimal fcmPrice = ObjectUtil.isEmpty(fcmPriceDic) ? new BigDecimal(2) : new BigDecimal(fcmPriceDic.getValue()); + BigDecimal fcmFeeCnt = nftFee.divide(fcmPrice, 2, BigDecimal.ROUND_DOWN); + + MallProductSell mallProductSell = new MallProductSell(); + mallProductSell.setMemberId(memberId); + mallProductSell.setNftTotal(nftCnt); + mallProductSell.setNftCnt(nftCntAva); + mallProductSell.setNftCntAva(nftCntAva); + mallProductSell.setNftFee(nftFee); + mallProductSell.setFcmFee(fcmFeeCnt); + mallProductSell.setState(ProductEnum.PRODUCT_SELL_ON_GOING.getValue()); + mallProductSellMapper.insert(mallProductSell); + + mallMemberAmount.setTrendsNft(mallMemberAmount.getTrendsNft().subtract(nftCnt)); + mallMemberAmountMapper.updateTrendsNftById(mallMemberAmount); + + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().add(nftCntAva)); + mallMemberAmountMapper.updateFrozenNftById(mallMemberAmount); + String orderNo = MallUtils.getOrderNum("NFT"); + iMallMoneyFlowService.addMoneyFlow( + memberId, + nftCnt.negate(), + MoneyFlowTypeNewEnum.NFT_OUT.getValue(), + orderNo, + mallMember.getId(), + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.NFT_OUT.getDescrition()); + iMallMoneyFlowService.addMoneyFlow( + memberId, + nftFee.negate(), + MoneyFlowTypeNewEnum.NFT_OUT_FEE.getValue(), + orderNo, + mallMember.getId(), + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.NFT_OUT_FEE.getDescrition()); + + agentProducer.sendFcmNFTExchangeMsg(fcmFeeCnt.toString()); + return new FebsResponse().success(); + } +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java index 54e1212..ee0c8e0 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java @@ -49,4 +49,9 @@ public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType) { this.addMoneyFlow(memberId, amount, type, orderNo, null, null, rtMemberId, null, flowType, null); } + + @Override + public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType, String description) { + this.addMoneyFlow(memberId, amount, type, orderNo, description, null, rtMemberId, null, flowType, null); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java index 6eb4ae0..1a68d76 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MallNewsInfoServiceImpl.java @@ -2,13 +2,18 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.conversion.MallProductNftConversion; +import cc.mrbird.febs.mall.dto.AdminMallProductNftDto; import cc.mrbird.febs.mall.dto.MallNewsInfoDto; -import cc.mrbird.febs.mall.entity.MallNewsCategory; -import cc.mrbird.febs.mall.entity.MallNewsInfo; +import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.MallNewsCategoryMapper; import cc.mrbird.febs.mall.mapper.MallNewsInfoMapper; +import cc.mrbird.febs.mall.mapper.MallProductNftMapper; import cc.mrbird.febs.mall.service.IMallNewsInfoService; import cc.mrbird.febs.mall.vo.AdminMallNewsInfoVo; +import cc.mrbird.febs.mall.vo.AdminMallProductBuyVo; +import cc.mrbird.febs.mall.vo.AdminMallProductNftVo; +import cc.mrbird.febs.mall.vo.AdminMallProductSellVo; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -31,7 +36,8 @@ public class MallNewsInfoServiceImpl extends ServiceImpl<MallNewsInfoMapper, MallNewsInfo> implements IMallNewsInfoService { private final MallNewsCategoryMapper mallNewsCategoryMapper; - + private final MallProductNftMapper mallProductNftMapper; + @Override public IPage<AdminMallNewsInfoVo> getNewInfoList(MallNewsInfo mallNewsInfo, QueryRequest request) { Page<AdminMallNewsInfoVo> page = new Page<>(request.getPageNum(), request.getPageSize()); @@ -149,4 +155,48 @@ mallNewsCategoryMapper.deleteById(id); return new FebsResponse().success(); } + + @Override + public IPage<AdminMallProductNftVo> getProductNFTList(MallProductNft mallProductNft, QueryRequest request) { + Page<AdminMallProductNftVo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<AdminMallProductNftVo> adminMallNewsInfoVoIPage = mallProductNftMapper.getProductNFTList(page, mallProductNft); + return adminMallNewsInfoVoIPage; + } + + @Override + public FebsResponse addProductNFT(AdminMallProductNftDto adminMallProductNftDto) { + MallProductNft mallProductNft = MallProductNftConversion.INSTANCE.dtoToEntity(adminMallProductNftDto); + mallProductNftMapper.insert(mallProductNft); + return new FebsResponse().success(); + } + + @Override + public FebsResponse delNFT(Long id) { + MallProductNft mallProductNft = mallProductNftMapper.selectById(id); + if(ObjectUtil.isEmpty(mallProductNft)){ + return new FebsResponse().fail().message("系统繁忙,请刷新页面重试"); + } + mallProductNftMapper.deleteById(id); + return new FebsResponse().success(); + } + + @Override + public FebsResponse nftInfoUpdate(MallProductNft mallProductNft) { + mallProductNftMapper.updateById(mallProductNft); + return new FebsResponse().success(); + } + + @Override + public IPage<AdminMallProductBuyVo> getBuyList(MallProductBuy mallProductBuy, QueryRequest request) { + Page<AdminMallProductBuyVo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<AdminMallProductBuyVo> adminMallProductBuyVoIPage = mallProductNftMapper.getBuyList(page, mallProductBuy); + return adminMallProductBuyVoIPage; + } + + @Override + public IPage<AdminMallProductSellVo> getSellList(MallProductSell mallProductSell, QueryRequest request) { + Page<AdminMallProductSellVo> page = new Page<>(request.getPageNum(), request.getPageSize()); + IPage<AdminMallProductSellVo> adminMallProductSellVoIPage = mallProductNftMapper.getSellList(page, mallProductSell); + return adminMallProductSellVoIPage; + } } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java index e035f39..e061508 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java @@ -59,6 +59,7 @@ private final MallScoreRecordMapper mallScoreRecordMapper; private final MallScoreAchieveReleaseMapper mallScoreAchieveReleaseMapper; private final MallScoreVoucherMapper mallScoreVoucherMapper; + private final CommonService commonService; @Override @Transactional(rollbackFor = Exception.class) @@ -1106,6 +1107,67 @@ } } + @Override + public void fcmNFTExchangeMsg(String cnt) { + //销毁数量 + BigDecimal destoryCnt = new BigDecimal(cnt); + DataDictionaryCustom fcmDestoryCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.FCM_DESTORY_CNT.getType(), + DataDictionaryEnum.FCM_DESTORY_CNT.getCode() + ); + BigDecimal fcmDestoryCnt = new BigDecimal(fcmDestoryCntDic.getValue()); + + BigDecimal fcmDestoryCntAdd = fcmDestoryCnt.add(destoryCnt); + /** + * 每次销毁10000个,价格增加0.1 + * 满足的次数 divide + */ + BigDecimal divide = fcmDestoryCntAdd.divide(AppContants.FCM_BASIC, 0, BigDecimal.ROUND_DOWN); + if(BigDecimal.ZERO.compareTo(divide) == 0){ + commonService.updateDataDic( + DataDictionaryEnum.BANK_TRANS_URL.getType(), + DataDictionaryEnum.BANK_TRANS_URL.getCode(), + fcmDestoryCntAdd.toString()); + } + + if(BigDecimal.ZERO.compareTo(divide) < 0){ + //例:累计15000 去掉10000,累计只剩5000 + BigDecimal fcmDestoryCntReal = fcmDestoryCntAdd.subtract(divide.multiply(AppContants.FCM_BASIC)); + commonService.updateDataDic( + DataDictionaryEnum.FCM_DESTORY_CNT.getType(), + DataDictionaryEnum.FCM_DESTORY_CNT.getCode(), + fcmDestoryCntReal.toString()); + + //更新总销毁数量 + DataDictionaryCustom fcmDestoryTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(), + DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode() + ); + BigDecimal fcmDestoryTotal = new BigDecimal(fcmDestoryTotalDic.getValue()); + fcmDestoryTotal = fcmDestoryTotal.add(destoryCnt); + commonService.updateDataDic( + DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(), + DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode(), + fcmDestoryTotal.toString()); + //更新价格 + DataDictionaryCustom fcmPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.FCM_PRICE.getType(), + DataDictionaryEnum.FCM_PRICE.getCode() + ); + BigDecimal fcmPrice = new BigDecimal(fcmPriceDic.getValue()); + fcmPrice = fcmPrice.add(AppContants.FCM_BASIC_ADD_PRICE.multiply(divide)); + commonService.updateDataDic( + DataDictionaryEnum.FCM_PRICE.getType(), + DataDictionaryEnum.FCM_PRICE.getCode(), + fcmPrice.toString()); + } + } + + public static void main(String[] args) { + BigDecimal divide = new BigDecimal(12000).divide(new BigDecimal(10000), 0, BigDecimal.ROUND_DOWN); + System.out.println(divide); + } + /** * 给用户的增加凭证数据,并且增加流水 * @param memberAchieveRelease 释放数量 diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductBuyVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductBuyVo.java new file mode 100644 index 0000000..93894be --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductBuyVo.java @@ -0,0 +1,24 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ApiModel(value = "AdminMallProductBuyVo", description = "信息返回类") +public class AdminMallProductBuyVo { + + private Long id; + private String accountLogin;//登录账户 + private Long memberId;// + private Long sellId;//出售ID + private Long productNftId;//预约NFT编码 + private int state;//预约状态 0:失败 1:进行中 2:超时 3:已完成 + private int mateState;//匹配状态0:失败 1:匹配中 2:待支付 3:已支付 4:对方已确认 5:已完成 + private BigDecimal nftTotal;//nft预约额度 + private BigDecimal nftAva;//nft分配额度 + private Date orderTime;//匹配时间 + private Date payTime;//支付时间 +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductNftVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductNftVo.java new file mode 100644 index 0000000..0f780e5 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductNftVo.java @@ -0,0 +1,23 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ApiModel(value = "AdminMallProductNftVo", description = "信息返回类") +public class AdminMallProductNftVo { + + private Long id;//编码 + private String nftCode;//编码 + private String nftImg;//图片 + private BigDecimal priceNft;//NFT价格 + private BigDecimal priceToken;//TOKEN价格 + private BigDecimal profit;//收益 5 即百分之五 + private int cycle;//周期 + private int state;//产品状态 1:开启 0:关闭 + private int memberCnt;//预约人数 + private int memberReal;//已预约人数 +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductSellVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductSellVo.java new file mode 100644 index 0000000..99a8c35 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallProductSellVo.java @@ -0,0 +1,20 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "AdminMallProductSellVo", description = "信息返回类") +public class AdminMallProductSellVo { + + private Long id; + private String accountLogin;//登录账户 + private BigDecimal nftTotal;//动态NFT总数 + private BigDecimal nftCnt;//实际提现数量 + private BigDecimal nftCntAva;//剩余数量 + private BigDecimal nftFee;//NFT手续费 + private BigDecimal fcmFee;//代币手续费 + private Integer state;//预约状态 0:失败 1:进行中 2:超时 3:已完成 +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiMallProductNftVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiMallProductNftVo.java new file mode 100644 index 0000000..2d6309a --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiMallProductNftVo.java @@ -0,0 +1,33 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "ApiMallProductNftVo", description = "返回参数类") +public class ApiMallProductNftVo { + + @ApiModelProperty(value = "id") + private Long id; + @ApiModelProperty(value = "编码") + private String nftCode;//编码 + @ApiModelProperty(value = "图片") + private String nftImg;//图片 + @ApiModelProperty(value = "NFT价格") + private BigDecimal priceNft;//NFT价格 + @ApiModelProperty(value = "TOKEN价格") + private BigDecimal priceToken;//TOKEN价格 + @ApiModelProperty(value = "收益 5 即百分之五") + private BigDecimal profit;//收益 5 即百分之五 + @ApiModelProperty(value = "周期") + private int cycle;//周期 + @ApiModelProperty(value = "产品状态 1:开启 0:关闭") + private int state;//产品状态 1:开启 0:关闭 + @ApiModelProperty(value = "预约人数") + private int memberCnt;//预约人数 + @ApiModelProperty(value = "已预约人数") + private int memberReal;//已预约人数 +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberPaymentVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberPaymentVo.java new file mode 100644 index 0000000..473b1f4 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberPaymentVo.java @@ -0,0 +1,27 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "MallMemberPaymentVo", description = "用户收款信息") +public class MallMemberPaymentVo { + + @ApiModelProperty(value = "微信收款码") + private String wxQrcode;// + @ApiModelProperty(value = "支付宝收款码") + private String aliQrcode;// + @ApiModelProperty(value = "真实姓名") + private String bankName;// + @ApiModelProperty(value = "银行卡号") + private String bankNo;// + @ApiModelProperty(value = "开户行") + private String bank;// + @ApiModelProperty(value = "手机号") + private String phone;// + @ApiModelProperty(value = "USDT通道类型: TRC20 BEP20") + private String usdtTongdao;// + @ApiModelProperty(value = "USDT地址") + private String usdtAddress;// +} diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java index 20d222a..078d858 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java @@ -18,34 +18,26 @@ @ApiModelProperty(value = "登录账号") private String accountLogin; - @ApiModelProperty(value = "昵称") + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "用户名") private String name; @ApiModelProperty(value = "手机号") private String phone; - @ApiModelProperty(value = "邮箱") - private String email; - - @ApiModelProperty(value = "性别") - private String sex; - @ApiModelProperty(value = "邀请码") private String inviteId; - @ApiModelProperty(value = "头像") - private String avatar; - - @ApiModelProperty(value = "余额") - private BigDecimal balance; + @ApiModelProperty(value = "代理层级") + private String level; @ApiModelProperty(value = "代理等级") private String levelName; @ApiModelProperty(value = "推荐人昵称") private String referrerName; - - private String level; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; @@ -57,23 +49,8 @@ public static final int ACCOUNTSTATUS_Y = 1; public static final int ACCOUNTSTATUS_N = 2; - @ApiModelProperty(value = "是否设置收款方式", example = "1是2否") + @ApiModelProperty(value = "是否设置收款信息", example = "1是2否") private Integer hasPayment = 2; - - @ApiModelProperty(value = "是否设置交易密码", example = "1是2否") - private Integer hasTradePwd = 2; - - @ApiModelProperty(value = "绑定手机号") - private String bindPhone; - - @ApiModelProperty(value = "累计消费") - private BigDecimal totalCost; - - @ApiModelProperty(value = "赠送积分") - private BigDecimal score; - - @ApiModelProperty(value = "抽奖积分") - private BigDecimal prizeScore; /** * 董事 @@ -87,16 +64,16 @@ @ApiModelProperty(value = "是否店长 1-是 2-否") private Integer storeMaster; - @ApiModelProperty(value = "补贴额度") - private BigDecimal totalScore; - - @ApiModelProperty(value = "贡献点") - private Integer star; - - @ApiModelProperty(value = "凭证数量") - private BigDecimal voucherCnt; - @ApiModelProperty(value = "内转标识 1:开启 2:关闭") private Integer insideWith; + private BigDecimal staticNft;//静态NFT + private BigDecimal trendsNft;//动态NFT + private BigDecimal frozenNft;//冻结NFT + private BigDecimal fcmCntAva;//FCM代币可用 + private BigDecimal fcmCntFrozen;//FCM代币冻结 + private BigDecimal tokenAva;//令牌可用 + private BigDecimal tokenFrozen;//令牌冻结 + private BigDecimal outFcmFee;//FCM提现收续费 + private BigDecimal fcmPrice;//FCM价格 } diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java index 458cedf..a06a328 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java +++ b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java @@ -17,4 +17,12 @@ public static final String PERK_MONEY = "hlm_queue_perk_money"; public static final String FORCE_VOUCHER_SALE = "hlm_queue_force_voucher_sale"; + + /** + * 预约超时队列 + */ + public static final String QUEUE_FCMPAY_BUY_TIME = "queue_fcm_buy_time"; + public static final String QUEUE_FCMPAY_BUY_TIME_TTL = "queue_fcm_buy_time_ttl"; + //fcm实时兑换 + public static final String QUEUE_FCM_NFT_EXCHANGE = "queue_fcm_nft_exchange"; } diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java index 30df9c7..bc17147 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java @@ -96,4 +96,16 @@ } } + + @RabbitListener(queues = QueueConstants.QUEUE_FCM_NFT_EXCHANGE) + public void fcmNFTExchangeMsg(String cnt) { + log.info("收到FCM实时兑换销毁数量:{}",cnt); + try { + memberProfitService.fcmNFTExchangeMsg(cnt); + } catch (Exception e) { + log.error("强制卖出异常", e); + // todo 更新表 + + } + } } diff --git a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java index ea6f262..60544f7 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java +++ b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java @@ -1,9 +1,23 @@ package cc.mrbird.febs.rabbit.enumerates; +import cc.mrbird.febs.rabbit.constants.QueueConstants; import lombok.Getter; @Getter public enum RabbitQueueEnum { + + FCMPAY_FCM_NFT_EXCHANGE("exchange_fcm_nft_exchange", + "route_key_fcm_nft_exchange", + QueueConstants.QUEUE_FCM_NFT_EXCHANGE), + /** + * 机器人自动抢红包 + */ + FCMPAY_BUY_TIME("exchange_fcm_buy_time", + "route_key_fcm_buy_time", + QueueConstants.QUEUE_FCMPAY_BUY_TIME), + FCMPAY_BUY_TIME_TTL("exchange_fcm_buy_time_ttl", + "route_key_fcm_buy_time_ttl", + QueueConstants.QUEUE_FCMPAY_BUY_TIME_TTL), DEFAULT("hlm_exchange_default", "hlm_route_key_default", @@ -32,6 +46,8 @@ "hlm_route_key_force_voucher_sale", "hlm_queue_force_voucher_sale"); + + private String exchange; private String route; diff --git a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java index e44c1a2..76f593c 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java @@ -63,6 +63,32 @@ } /** + * 匹配成功,有一个倒计时,超时后 + * 匹配成功2小时内不打款或收到款不确认的自动冻结帐户,但可以登陆, + * 会员解封号自己可以解冻或找上级解冻帐户,解冻需要消毁相应代币FCM, + * 封号期间该帐户不产生团队奖金。 + * 中途如有问题可以点申诉,留言与客服交流窗口,后台可以核实和查询 + * @param id + * @param times + */ + public void sendFcmPayBuyTimeTTLMsg(Long id, Long times) { + rabbitTemplate.convertAndSend(RabbitQueueEnum.FCMPAY_BUY_TIME_TTL.getExchange(), + RabbitQueueEnum.FCMPAY_BUY_TIME_TTL.getRoute(), + id, new MessagePostProcessor() { + @Override + public Message postProcessMessage(Message message) throws AmqpException { + message.getMessageProperties().setExpiration(String.valueOf(times)); + return message; + } + }); + } + + public void sendFcmNFTExchangeMsg(String value) { + log.info("发送FCM实时兑换销毁数量:{}",value); + rabbitTemplate.convertAndSend(RabbitQueueEnum.FCMPAY_FCM_NFT_EXCHANGE.getExchange(), RabbitQueueEnum.FCMPAY_FCM_NFT_EXCHANGE.getRoute(),value); + } + + /** * 发送代理自动升级消息 * * @param memberId diff --git a/src/main/resources/mapper/modules/MallMemberAmountMapper.xml b/src/main/resources/mapper/modules/MallMemberAmountMapper.xml index 30f21f8..86f5f15 100644 --- a/src/main/resources/mapper/modules/MallMemberAmountMapper.xml +++ b/src/main/resources/mapper/modules/MallMemberAmountMapper.xml @@ -2,4 +2,44 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.mall.mapper.MallMemberAmountMapper"> + <select id="selectByMemberId" resultType="cc.mrbird.febs.mall.entity.MallMemberAmount"> + select * from mall_member_amount where member_id = #{memberId} + </select> + + <update id="updateFcmCntAvaById"> + update mall_member_amount + set revision = revision + 1, + fcm_cnt_ava = #{record.fcmCntAva} + where id = #{record.id} and revision=#{record.revision} + </update> + + <update id="updateTokenAvaById"> + update mall_member_amount + set revision = revision + 1, + token_ava = #{record.tokenAva} + where id = #{record.id} and revision=#{record.revision} + </update> + + <update id="updateTokenAvaAndTokenFrozenById"> + update mall_member_amount + set revision = revision + 1, + token_ava = #{record.tokenAva}, + token_frozen = #{record.tokenFrozen} + where id = #{record.id} and revision=#{record.revision} + </update> + + <update id="updateTrendsNftById"> + update mall_member_amount + set revision = revision + 1, + trends_nft = #{record.trendsNft} + where id = #{record.id} and revision=#{record.revision} + </update> + + <update id="updateFrozenNftById"> + update mall_member_amount + set revision = revision + 1, + frozen_nft = #{record.frozenNft} + where id = #{record.id} and revision=#{record.revision} + </update> + </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallProductBuyMapper.xml b/src/main/resources/mapper/modules/MallProductBuyMapper.xml new file mode 100644 index 0000000..25a8ecf --- /dev/null +++ b/src/main/resources/mapper/modules/MallProductBuyMapper.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cc.mrbird.febs.mall.mapper.MallProductNftMapper"> + + <select id="getProductNFTList" resultType="cc.mrbird.febs.mall.vo.AdminMallProductNftVo"> + SELECT + a.* + FROM mall_product_nft a + order by a.CREATED_TIME desc + </select> + + <select id="selectByState" resultType="cc.mrbird.febs.mall.vo.ApiMallProductNftVo"> + SELECT + a.* + FROM mall_product_nft a + where a.state = #{state} + </select> + + <select id="getBuyList" resultType="cc.mrbird.febs.mall.vo.AdminMallProductBuyVo"> + SELECT + a.*, + b.account_login + FROM mall_product_buy a + left join mall_member b on a.member_id = b.id + order by a.CREATED_TIME desc + </select> + + <select id="getSellList" resultType="cc.mrbird.febs.mall.vo.AdminMallProductSellVo"> + SELECT + a.*, + b.account_login + FROM mall_product_sell a + left join mall_member b on a.member_id = b.id + order by a.CREATED_TIME desc + </select> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallProductNftMapper.xml b/src/main/resources/mapper/modules/MallProductNftMapper.xml new file mode 100644 index 0000000..7a702a3 --- /dev/null +++ b/src/main/resources/mapper/modules/MallProductNftMapper.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cc.mrbird.febs.mall.mapper.MallProductBuyMapper"> + + <select id="selectMemberIdAndNFTIdAndStateAndMateState" resultType="cc.mrbird.febs.mall.entity.MallProductBuy"> + select * from mall_product_buy + <where> + member_id = #{memberId} + and product_nft_id = #{productNFTId} + <if test="state != null"> + and state = #{state} + </if> + <if test="mateState != null"> + and mate_state = #{mateState} + </if> + </where> + </select> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/news/productBuyList.html b/src/main/resources/templates/febs/views/modules/news/productBuyList.html new file mode 100644 index 0000000..8001b1f --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/news/productBuyList.html @@ -0,0 +1,191 @@ +<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-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"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="buyTable" lay-data="{id: 'buyTable'}"></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> +<!-- 表格操作栏 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"></i></a> +</script> +<!-- 表格操作栏 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'), + $add = $view.find('#add'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'phone', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initBuyTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(buyTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + if (layEvent === 'productNFTUpdate') { + febs.modal.open('编辑', 'modules/news/productNFTUpdate/' + data.id, { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#nftInfo-update').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + if (layEvent === 'delNFT') { + febs.modal.confirm('删除', '确认删除?', function () { + delNFT(data.id); + }); + } + }); + + function delNFT(id) { + febs.get(ctx + 'admin/news/delNFT/' + id, null, function () { + febs.alert.success('操作成功'); + $query.click(); + }); + } + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + + $add.on('click', function () { + febs.modal.open('新增', 'modules/news/productNFTAdd/', { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#productNFT-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + }); + + function initBuyTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: '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 '' + }else{ + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="productNFTUpdate" shiro:hasPermission="user:update">编辑</button>' + +'<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delNFT" shiro:hasPermission="user:update">删除</button>' + } + },minWidth: 300,align:'center'} + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + return { + }; + } + + 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> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/news/productNFTAdd.html b/src/main/resources/templates/febs/views/modules/news/productNFTAdd.html new file mode 100644 index 0000000..6aa481d --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/news/productNFTAdd.html @@ -0,0 +1,158 @@ +<style> + #productNFT-add { + padding: 20px 25px 25px 0; + } + + #productNFT-add .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #productNFT-add #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #productNFT-add .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + #productNFT-add img{ + max-width:100px + } + +</style> +<div class="layui-fluid" id="productNFT-add"> + <form class="layui-form" action="" lay-filter="productNFT-add-form"> + <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="nftCode" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </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">NFT:</label> + <div class="layui-input-block"> + <input type="text" name="priceNft" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">需要NFT数量</div> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">TOKEN:</label> + <div class="layui-input-block"> + <input type="text" name="priceToken" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">需要token数量</div> + </div> + </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="profit" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux"> 5 即百分之五</div> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">周期:</label> + <div class="layui-input-block"> + <input type="text" name="cycle" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </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="memberCnt" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">已预约数:</label> + <div class="layui-input-block"> + <input type="text" name="memberReal" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </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="nftImgUpload">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="nftImgImage"></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="state" value="1" title="开启" /> + <input type="radio" name="state" value="0" title="关闭" checked /> + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="productNFT-add-form-submit" id="submit"></button> + </div> + </form> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','layedit', 'laydate', 'upload'], function () { + var $ = layui.$, + febs = layui.febs, + layer = layui.layer, + upload = layui.upload, + formSelects = layui.formSelects, + form = layui.form, + laydate = layui.laydate, + layedit = layui.layedit, + $view = $('#productNFT-add'), + validate = layui.validate; + + + form.render(); + laydate.render({ + elem: '#febs-form-group-date' + }); + + layedit.set({ //设置图片接口 + uploadImage: { + url: 'admin/goods/uploadFileBase64', //接口url + type: 'post', + } + }); + form.on('submit(productNFT-add-form-submit)', function (data) { + febs.post(ctx + 'admin/news/addProductNFT', data.field, function () { + layer.closeAll(); + febs.alert.success('操作成功'); + $('#febs-nft').find('#reset').click(); + }); + return false; + }); + + upload.render({ + elem: '#nftImgUpload' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,multiple: false + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#nftImgImage').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">') + }); + } + ,done: function(res){ + $("#nftImg").val(res.data.src); + } + }); + + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/news/productNFTList.html b/src/main/resources/templates/febs/views/modules/news/productNFTList.html new file mode 100644 index 0000000..40f8c83 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/news/productNFTList.html @@ -0,0 +1,176 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-nft" 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-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"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="NFTInfoTable" lay-data="{id: 'NFTInfoTable'}"></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="isState"> + {{# if(d.state === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="isState"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="isState"> + {{# } }} +</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"></i></a> +</script> +<!-- 表格操作栏 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-nft'), + $query = $view.find('#query'), + $add = $view.find('#add'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'phone', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(NFTInfoTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + if (layEvent === 'productNFTUpdate') { + febs.modal.open('编辑', 'modules/news/productNFTUpdate/' + data.id, { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#nftInfo-update').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + if (layEvent === 'delNFT') { + febs.modal.confirm('删除', '确认删除?', function () { + delNFT(data.id); + }); + } + }); + + function delNFT(id) { + febs.get(ctx + 'admin/news/delNFT/' + id, null, function () { + febs.alert.success('操作成功'); + $query.click(); + }); + } + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + + $add.on('click', function () { + febs.modal.open('新增', 'modules/news/productNFTAdd/', { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#productNFT-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + }); + + function initTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'NFTInfoTable', + url: ctx + 'admin/news/getProductNFTList', + cols: [[ + {field: 'nftCode', title: '编码', minWidth: 120,align:'center'}, + {field: 'priceNft', title: 'NFT', minWidth: 120,align:'center'}, + {field: 'priceToken', title: 'TOKEN', minWidth: 120,align:'center'}, + {field: 'profit', title: '收益(%)', minWidth: 120,align:'center'}, + {field: 'cycle', title: '周期(天)', minWidth: 120,align:'center'}, + {field: 'memberCnt', title: '预约总数', minWidth: 120,align:'center'}, + {field: 'memberReal', title: '已预约数', minWidth: 120,align:'center'}, + {field: 'nftImg', title: '缩略图', + templet: function (d) { + return '<img src="'+d.nftImg+'" >'; + }, minWidth: 150,align:'center'}, + {templet: '#isState', title: '产品状态', minWidth: 120,align:'center'}, + {title: '操作', + templet: function (d) { + if(d.state == 1){ + return '' + }else{ + return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="productNFTUpdate" shiro:hasPermission="user:update">编辑</button>' + +'<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delNFT" shiro:hasPermission="user:update">删除</button>' + } + },minWidth: 300,align:'center'} + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + return { + }; + } + + 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> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/news/productNFTUpdate.html b/src/main/resources/templates/febs/views/modules/news/productNFTUpdate.html new file mode 100644 index 0000000..58d84e9 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/news/productNFTUpdate.html @@ -0,0 +1,184 @@ +<style> + #nftInfo-update { + padding: 20px 25px 25px 0; + } + + #nftInfo-update .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #nftInfo-update #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #nftInfo-update .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + #nftInfo-update img{ + max-width:100px + } + +</style> +<div class="layui-fluid" id="nftInfo-update"> + <form class="layui-form" action="" lay-filter="nftInfo-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="nftCode" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </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">NFT:</label> + <div class="layui-input-block"> + <input type="text" name="priceNft" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">需要NFT数量</div> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">TOKEN:</label> + <div class="layui-input-block"> + <input type="text" name="priceToken" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">需要token数量</div> + </div> + </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="profit" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux"> 5 即百分之五</div> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">周期:</label> + <div class="layui-input-block"> + <input type="text" name="cycle" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </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="memberCnt" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">已预约数:</label> + <div class="layui-input-block"> + <input type="text" name="memberReal" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> + </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="nftImgUpload">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="nftImgImage"></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="state" value="1" title="开启" /> + <input type="radio" name="state" value="0" title="关闭" checked /> + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="nftInfo-update-form-submit" id="submit"></button> + </div> + </form> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','layedit', 'laydate', 'upload'], function () { + var $ = layui.$, + febs = layui.febs, + layer = layui.layer, + upload = layui.upload, + formSelects = layui.formSelects, + form = layui.form, + laydate = layui.laydate, + layedit = layui.layedit, + mallProductNft = [[${mallProductNft}]], + $view = $('#nftInfo-update'), + $uploadDel = $view.find('#uploadDel'), + validate = layui.validate; + + form.render(); + initUserValue(); + laydate.render({ + elem: '#febs-form-group-date' + }); + + + layedit.set({ //设置图片接口 + uploadImage: { + url: 'admin/goods/uploadFileBase64', //接口url + type: 'post', + } + }); + + form.on('submit(nftInfo-update-form-submit)', function (data) { + febs.post(ctx + 'admin/news/nftInfoUpdate', data.field, function () { + layer.closeAll(); + febs.alert.success('操作成功'); + $('#febs-nft').find('#reset').click(); + }); + return false; + }); + + upload.render({ + elem: '#nftImgUpload' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,multiple: false + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#nftImgImage').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img" style="width: 100px">') + }); + } + ,done: function(res){ + $("#nftImg").val(res.data.src); + } + }); + + function initUserValue() { + var nftImg = mallProductNft.nftImg; + $('#nftImgImage').html('<img src="' + nftImg + '" alt="" class="layui-upload-img new-image" style="width: 100px">') + form.val("nftInfo-update-form", { + "id": mallProductNft.id, + "nftCode": mallProductNft.nftCode, + "nftImg": mallProductNft.nftImg, + "priceNft": mallProductNft.priceNft, + "priceToken": mallProductNft.priceToken, + "profit": mallProductNft.profit, + "cycle": mallProductNft.cycle, + "state": mallProductNft.state, + "memberCnt": mallProductNft.memberCnt, + "memberReal": mallProductNft.memberReal, + }); + } + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/news/productSellList.html b/src/main/resources/templates/febs/views/modules/news/productSellList.html new file mode 100644 index 0000000..e3ad58d --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/news/productSellList.html @@ -0,0 +1,162 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-product-sell" lay-title="NFT提现记录"> + <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-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"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="sellTable" lay-data="{id: 'sellTable'}"></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="isSellState"> + {{# 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> +<!-- 表格操作栏 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"></i></a> +</script> +<!-- 表格操作栏 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-sell'), + $query = $view.find('#query'), + $add = $view.find('#add'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'phone', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initSellTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(sellTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + if (layEvent === 'productNFTUpdate') { + febs.modal.open('编辑', 'modules/news/productNFTUpdate/' + data.id, { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#nftInfo-update').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + if (layEvent === 'delNFT') { + febs.modal.confirm('删除', '确认删除?', function () { + delNFT(data.id); + }); + } + }); + + function delNFT(id) { + febs.get(ctx + 'admin/news/delNFT/' + id, null, function () { + febs.alert.success('操作成功'); + $query.click(); + }); + } + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + + $add.on('click', function () { + febs.modal.open('新增', 'modules/news/productNFTAdd/', { + btn: ['提交', '取消'], + yes: function (index, layero) { + $('#productNFT-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + }); + + function initSellTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'sellTable', + url: ctx + 'admin/news/getSellList', + cols: [[ + {field: 'accountLogin', title: '登录账户', minWidth: 120,align:'center'}, + {field: 'nftTotal', title: '动态NFT', minWidth: 120,align:'center'}, + {field: 'nftCnt', title: '实际提现', minWidth: 120,align:'center'}, + {field: 'nftCntAva', title: '剩余数量', minWidth: 120,align:'center'}, + {field: 'nftFee', title: 'NFT手续费', minWidth: 120,align:'center'}, + {field: 'fcmFee', title: '代币手续费', minWidth: 120,align:'center'}, + {templet: '#isSellState', title: '提现状态', minWidth: 120,align:'center'}, + // {title: '操作', + // templet: function (d) { + // if(d.state == 1){ + // return '' + // }else{ + // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="productNFTUpdate" shiro:hasPermission="user:update">编辑</button>' + // +'<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delNFT" shiro:hasPermission="user:update">删除</button>' + // } + // },minWidth: 300,align:'center'} + ]] + }); + } + + // 获取查询参数 + function getQueryParams() { + return { + }; + } + }) +</script> \ No newline at end of file -- Gitblit v1.9.1