فهرست منبع

铸造活动新功能

xiongzhu 3 سال پیش
والد
کامیت
abb507b4d8

+ 5 - 0
src/main/java/com/izouma/nineth/domain/MintActivity.java

@@ -96,4 +96,9 @@ public class MintActivity extends BaseEntity {
 
     @Column(columnDefinition = "bigint default 1 not null")
     private Long companyId = 1L;
+
+    private int autoDropNum = 1;
+
+    @Convert(converter = StringArrayConverter.class)
+    private List<Long> holdingTags;
 }

+ 8 - 0
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -115,4 +115,12 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     List<Asset> findAllByIdNotInAndUserIdAndStatusInAndOpened(List<Long> ids, Long userId, List<AssetStatus> status, boolean opened);
 
     List<Asset> findAllByUserIdAndStatusInAndOpened(Long userId, List<AssetStatus> status, boolean opened);
+
+    @Query(value = "select count(tag_id) " +
+            "from asset " +
+            "         left join asset_tag on asset.id = asset_tag.asset_id " +
+            "where asset.user_id = ?1 and asset_tag.tag_id in ?2 group by tag_id", nativeQuery = true)
+    long checkHoldingTags(Long userId, List<Long> tagIds);
+
+    List<Asset> findByUserIdAndStatusAndTagsIdIn(Long userId, AssetStatus status, List<Long> tagIds);
 }

+ 32 - 1
src/main/java/com/izouma/nineth/service/MintOrderService.java

@@ -167,6 +167,11 @@ public class MintOrderService {
         if (!mintActivity.isOnShelf()) {
             throw new BusinessException("活动已下架");
         }
+        if (mintActivity.getHoldingTags() != null && !mintActivity.getHoldingTags().isEmpty()) {
+            if (!checkHolding(user.getId(), mintActivity)) {
+                throw new BusinessException("您不满足参与条件");
+            }
+        }
 
         UserAddress userAddress = null;
         if (addressId != null) {
@@ -340,6 +345,11 @@ public class MintOrderService {
 //        if (!mintActivity.isOnShelf()) {
 //            throw new BusinessException("活动已下架");
 //        }
+        if (mintActivity.getHoldingTags() != null && !mintActivity.getHoldingTags().isEmpty()) {
+            if (!checkHolding(user.getId(), mintActivity)) {
+                throw new BusinessException("您不满足参与条件");
+            }
+        }
 
         UserAddress userAddress = null;
         if (addressId != null) {
@@ -492,7 +502,7 @@ public class MintOrderService {
                     .type(AirDropType.asset)
                     .userIds(Collections.singletonList(mintOrder.getUserId()))
                     .collectionId(mintActivity.getAirDropCollectionId())
-                    .targets(Collections.singletonList(new DropTarget(user.getId(), user.getPhone(), user.getNickname(), 1)))
+                    .targets(Collections.singletonList(new DropTarget(user.getId(), user.getPhone(), user.getNickname(), mintActivity.getAutoDropNum())))
                     .auto(true)
                     .companyId(mintActivity.getCompanyId())
                     .build());
@@ -808,4 +818,25 @@ public class MintOrderService {
     public void releaseOrderLock(Long orderId) {
         redisTemplate.delete(RedisKeys.MINT_ORDER_LOCK + orderId);
     }
+
+    public boolean checkHolding(Long userId, Long mintActivityId) {
+        return checkHolding(userId, mintActivityRepo.findById(mintActivityId)
+                .orElseThrow(new BusinessException("活动不存在")));
+    }
+
+    public boolean checkHolding(Long userId, MintActivity mintActivity) {
+        if (mintActivity.getHoldingTags() != null && !mintActivity.getHoldingTags().isEmpty()) {
+            List<Asset> assets = assetRepo.findByUserIdAndStatusAndTagsIdIn(userId, AssetStatus.NORMAL, mintActivity.getHoldingTags());
+            for (Long tag : mintActivity.getHoldingTags()) {
+                Asset a = assets.stream().filter(asset -> asset.getTags().stream().anyMatch(t -> t.getId().equals(tag)))
+                        .findFirst().orElse(null);
+                if (a == null) {
+                    return false;
+                } else {
+                    assets.remove(a);
+                }
+            }
+        }
+        return true;
+    }
 }

+ 5 - 1
src/main/java/com/izouma/nineth/web/MintOrderController.java

@@ -147,7 +147,7 @@ public class MintOrderController extends BaseController {
     }
 
     @GetMapping("/mintRank")
-    public List<MintRank> mintRank(){
+    public List<MintRank> mintRank() {
         List<Map<String, Object>> map = mintOrderRepo.findMintRank();
         JSONArray jsonArray = new JSONArray();
         jsonArray.addAll(map);
@@ -155,5 +155,9 @@ public class MintOrderController extends BaseController {
         return mintRanks;
     }
 
+    @GetMapping("/checkHolding")
+    public boolean checkHolding(@RequestParam Long id) {
+        return mintOrderService.checkHolding(SecurityUtils.getAuthenticatedUser().getId(), id);
+    }
 }
 

+ 40 - 1
src/main/vue/src/views/MintActivityEdit.vue

@@ -105,6 +105,13 @@
                     >
                         <collection-search v-model="formData.airDropCollectionId"></collection-search>
                     </el-form-item>
+                    <el-form-item
+                        prop="autoDropNum"
+                        label="空投数量"
+                        v-if="formData.airDrop === true && formData.autoDrop === true"
+                    >
+                        <el-input-number v-model="formData.autoDropNum" :min="1"></el-input-number>
+                    </el-form-item>
                     <el-form-item prop="onShelf" label="上架">
                         <el-radio v-model="formData.onShelf" :label="true">是</el-radio>
                         <el-radio v-model="formData.onShelf" :label="false">否</el-radio>
@@ -129,6 +136,21 @@
                         </el-button>
                         <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
                     </el-form-item>
+                    <el-form-item prop="holdingTags" label="持有藏品">
+                        <div v-for="(item, i) in formData.holdingTags" class="rule-item">
+                            <el-select v-model="formData.holdingTags[i]" value-key="id" size="mini">
+                                <el-option
+                                    v-for="item in tags"
+                                    :key="item.id"
+                                    :value="item.id"
+                                    :label="item.name"
+                                ></el-option>
+                            </el-select>
+                            <span style="padding: 0 10px; color: #606266; font-weight: bold">×&nbsp;1</span>
+                            <i @click="delHolding(i)" class="el-icon-delete icon-del"></i>
+                        </div>
+                        <el-button size="mini" @click="addHolding">添加</el-button>
+                    </el-form-item>
                 </el-form>
             </div>
         </div>
@@ -285,9 +307,17 @@ export default {
                         message: '请选择空投藏品',
                         trigger: 'blur'
                     }
+                ],
+                autoDropNum: [
+                    {
+                        required: true,
+                        message: '请输入空投数量',
+                        trigger: 'blur'
+                    }
                 ]
             },
-            tags: []
+            tags: [],
+            holdingTags: []
         };
     },
     computed: {
@@ -351,6 +381,15 @@ export default {
         },
         delRule(i) {
             this.formData.rule.and.splice(i, 1);
+        },
+        addHolding() {
+            if (!this.formData.holdingTags) {
+                this.$set(this.formData, 'holdingTags', []);
+            }
+            this.formData.holdingTags.push(null);
+        },
+        delHolding(i) {
+            this.formData.holdingTags.splice(i, 1);
         }
     }
 };