Преглед изворни кода

Merge branch 'dev'

# Conflicts:
#	src/main/java/com/izouma/nineth/domain/Collection.java
#	src/main/java/com/izouma/nineth/repo/AssetRepo.java
#	src/main/java/com/izouma/nineth/web/AssetController.java
xiongzhu пре 3 година
родитељ
комит
0414558861
25 измењених фајлова са 355 додато и 40 уклоњено
  1. BIN
      src/main/comos/src/assets/info_icon_huodongshouji.png
  2. 4 2
      src/main/comos/src/components/order/OrderOpen.vue
  3. 6 0
      src/main/comos/src/mixins/list.js
  4. 8 0
      src/main/comos/src/router/index.js
  5. 10 5
      src/main/comos/src/views/Discover.vue
  6. 206 0
      src/main/comos/src/views/activity/List1.vue
  7. 2 0
      src/main/java/com/izouma/nineth/domain/ActivityCollection.java
  8. 3 3
      src/main/java/com/izouma/nineth/domain/Collection.java
  9. 5 0
      src/main/java/com/izouma/nineth/domain/Coupon.java
  10. 10 0
      src/main/java/com/izouma/nineth/dto/GeneralDTO.java
  11. 4 1
      src/main/java/com/izouma/nineth/repo/AssetRepo.java
  12. 2 0
      src/main/java/com/izouma/nineth/repo/CollectionRepo.java
  13. 2 0
      src/main/java/com/izouma/nineth/security/WebSecurityConfig.java
  14. 2 2
      src/main/java/com/izouma/nineth/service/ActivityOrderService.java
  15. 3 2
      src/main/java/com/izouma/nineth/service/AssetService.java
  16. 1 1
      src/main/java/com/izouma/nineth/web/ActivityCollectionController.java
  17. 9 2
      src/main/java/com/izouma/nineth/web/ActivityOrderController.java
  18. 1 2
      src/main/java/com/izouma/nineth/web/AssetController.java
  19. 23 5
      src/main/java/com/izouma/nineth/web/CouponController.java
  20. 1 1
      src/main/vue/.env.development
  21. 35 12
      src/main/vue/src/views/ActivityCollectionEdit.vue
  22. 1 1
      src/main/vue/src/views/ActivityCollectionList.vue
  23. 4 0
      src/main/vue/src/views/CouponEdit.vue
  24. 1 1
      src/test/java/com/izouma/nineth/service/ActivityOrderServiceTest.java
  25. 12 0
      src/test/java/com/izouma/nineth/service/AssetServiceTest.java

BIN
src/main/comos/src/assets/info_icon_huodongshouji.png


+ 4 - 2
src/main/comos/src/components/order/OrderOpen.vue

@@ -15,7 +15,7 @@
                 <img class="productImg" :src="imgSrc" />
                 <img class="productImg" :src="imgSrc" />
             </div>
             </div>
 
 
-            <div class="text1" v-if="!showProduct">点击打开盲盒</div>
+            <div class="text1" v-if="!showProduct && id">点击打开盲盒</div>
 
 
             <div class="text" v-else>藏品正在生成中<br />约1~3分钟,完成后会出现在你的藏品室</div>
             <div class="text" v-else>藏品正在生成中<br />约1~3分钟,完成后会出现在你的藏品室</div>
 
 
@@ -44,7 +44,9 @@ export default {
     },
     },
     methods: {
     methods: {
         open() {
         open() {
-            this.$http.post('/order/open?id=' + this.id);
+            if (this.id) {
+                this.$http.post('/order/open?id=' + this.id);
+            }
             this.addClass('img2', 'animate__rollOut', false)
             this.addClass('img2', 'animate__rollOut', false)
                 .then(() => {
                 .then(() => {
                     return this.addClass('img3', 'animate__bounceOutUp', false);
                     return this.addClass('img3', 'animate__bounceOutUp', false);

+ 6 - 0
src/main/comos/src/mixins/list.js

@@ -44,6 +44,9 @@ export default {
                     if (!this.finished) {
                     if (!this.finished) {
                         this.page = this.page + 1;
                         this.page = this.page + 1;
                     }
                     }
+                    if (this.afterData) {
+                        this.afterData();
+                    }
                 });
                 });
             } else {
             } else {
                 this.$http.post(this.url, data, { body: 'json' }).then(res => {
                 this.$http.post(this.url, data, { body: 'json' }).then(res => {
@@ -57,6 +60,9 @@ export default {
                     if (!this.finished) {
                     if (!this.finished) {
                         this.page = this.page + 1;
                         this.page = this.page + 1;
                     }
                     }
+                    if (this.afterData) {
+                        this.afterData();
+                    }
                 });
                 });
             }
             }
         }
         }

+ 8 - 0
src/main/comos/src/router/index.js

@@ -398,6 +398,14 @@ const routes = [
             title: 'Cosmos Art'
             title: 'Cosmos Art'
         }
         }
     },
     },
+    {
+        path: '/activityList1',
+        name: 'activityList1',
+        component: () => import('../views/activity/List1.vue'),
+        meta: {
+            title: 'Cosmos Art'
+        }
+    },
     {
     {
         path: '/activityDetail',
         path: '/activityDetail',
         name: 'activityDetail',
         name: 'activityDetail',

+ 10 - 5
src/main/comos/src/views/Discover.vue

@@ -17,7 +17,7 @@
             </swiper-slide>
             </swiper-slide>
         </swiper>
         </swiper>
 
 
-        <van-grid :border="false" :column-num="$store.state.review ? 4 : 5">
+        <van-grid :border="false" :column-num="4">
             <van-grid-item text="精选推荐" :to="{ path: '/productList' }">
             <van-grid-item text="精选推荐" :to="{ path: '/productList' }">
                 <template v-slot:icon>
                 <template v-slot:icon>
                     <img class="grid-img" src="@assets/info_icon_jingxuanxilie.png" />
                     <img class="grid-img" src="@assets/info_icon_jingxuanxilie.png" />
@@ -43,6 +43,11 @@
                     <img class="grid-img" src="@assets/info_icon_xiliehuodong.png" />
                     <img class="grid-img" src="@assets/info_icon_xiliehuodong.png" />
                 </template>
                 </template>
             </van-grid-item>
             </van-grid-item>
+            <van-grid-item text="活动收集" :to="{ path: '/activityList1' }">
+                <template v-slot:icon>
+                    <img class="grid-img" src="@assets/info_icon_huodongshouji.png" />
+                </template>
+            </van-grid-item>
             <!-- <van-grid-item text="铸造商店" @click="wait">
             <!-- <van-grid-item text="铸造商店" @click="wait">
                 <template v-slot:icon>
                 <template v-slot:icon>
                     <img class="grid-img" src="@assets/info_icon_zhuzaoshangdian.png" />
                     <img class="grid-img" src="@assets/info_icon_zhuzaoshangdian.png" />
@@ -171,10 +176,10 @@ export default {
     },
     },
     methods: {
     methods: {
         getInit() {
         getInit() {
-            this.$toast.loading({
-                message: '加载中...',
-                forbidClick: true
-            });
+            // this.$toast.loading({
+            //     message: '加载中...',
+            //     forbidClick: true
+            // });
             this.getBanner();
             this.getBanner();
             this.getProduct('BLIND_BOX', this.sortOptions['精选盲盒']).then(res => {
             this.getProduct('BLIND_BOX', this.sortOptions['精选盲盒']).then(res => {
                 this.box = res;
                 this.box = res;

+ 206 - 0
src/main/comos/src/views/activity/List1.vue

@@ -0,0 +1,206 @@
+<template>
+    <div class="search">
+        <van-list v-model:loading="loading" :finished="finished" finished-text="" @load="getData">
+            <template v-for="(item, index) in list" :key="index">
+                <div class="activity">
+                    <van-image
+                        width="calc(50vw - 20px)"
+                        height="calc(50vw - 20px)"
+                        :src="getImg(item.pic)"
+                        fit="cover"
+                    />
+                    <div class="stock">剩余数量:{{ item.stock }}张</div>
+                    <div class="content">
+                        <div class="text1">{{ item.name }}</div>
+                        <div class="text2">
+                            集齐{{ item.num }}张{{ item.collectionName }}徽章, 可换取一张<span>{{
+                                item.awardCollectionName
+                            }}</span
+                            >藏品
+                        </div>
+                        <van-button
+                            size="small"
+                            @click="getActivity(item, index)"
+                            :disabled="!canGet(item) || item.stock === 0"
+                            type="primary"
+                            round
+                            block
+                            >{{ item.stock ? '领取' : '无库存' }}</van-button
+                        >
+                    </div>
+
+                    <div class="status" :class="{ used: !canGet(item) }">{{ canGet(item) ? '已集齐' : '未集齐' }}</div>
+                </div>
+            </template>
+
+            <van-empty v-if="empty" description="暂无活动哦~" :image="require('@assets/kong_png_wusousuo.png')" />
+        </van-list>
+
+        <order-open ref="box" :imgSrc="getImg(changeImgs(orderInfo.pic))"></order-open>
+    </div>
+</template>
+
+<script>
+import OrderOpen from '../../components/order/OrderOpen.vue';
+import list from '../../mixins/list';
+import product from '../../mixins/product';
+export default {
+    components: { OrderOpen },
+    name: 'Search',
+    mixins: [list, product],
+    data() {
+        return {
+            list: [],
+            empty: false,
+            url: '/activityCollection/all',
+            orderInfo: {}
+        };
+    },
+    methods: {
+        beforeData() {
+            return {
+                query: {
+                    del: false
+                }
+            };
+        },
+        canGet(info) {
+            return info.collections && info.collections.length >= info.num;
+        },
+        afterData() {
+            if (this.isLogin) {
+                [...this.list].forEach((item, index) => {
+                    console.log(item);
+                    this.getCollect(item.collectionId).then(res => {
+                        this.list[index] = { ...item, collections: res };
+                    });
+                });
+            }
+        },
+        getCollect(id) {
+            return this.$http
+                .post(
+                    '/asset/all',
+                    {
+                        query: {
+                            userId: this.$store.state.userInfo.id,
+                            collectionId: Number(id),
+                            projectId: this.$store.state.projectId,
+                            status: 'NORMAL,TRADING,GIFTING'
+                        }
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    return Promise.resolve(res.content);
+                });
+        },
+        getActivity(info, index) {
+            this.$dialog
+                .confirm({
+                    title: '提示',
+                    message: `确认要使用${info.num}张${info.collectionName}兑换一张${info.awardCollectionName}吗?`,
+                    confirmButtonText: '立即兑换'
+                })
+                .then(res => {
+                    return this.$http.post('/activityOrder/create?mintActivityId=' + info.id);
+                })
+                .then(res => {
+                    this.getData(true);
+                    this.orderInfo = res;
+                    this.show();
+                })
+                .catch(e => {
+                    if (e && e.error) {
+                        this.$toast(e.error);
+                    }
+                });
+        },
+        show() {
+            this.$refs.box.show = true;
+            this.$nextTick(() => {
+                this.$refs.box.open();
+            });
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.search {
+    padding-bottom: 50px;
+    background-color: @bg3;
+}
+.van-list {
+    padding: 10px;
+}
+.activity {
+    display: inline-block;
+    vertical-align: top;
+    width: calc(50vw - 20px);
+    box-sizing: border-box;
+    margin: 5px;
+    border-radius: 8px;
+    overflow: hidden;
+    position: relative;
+
+    .status {
+        font-size: 12px;
+        background-color: #f7931a;
+        color: @bg;
+        position: absolute;
+        top: 0;
+        right: 0;
+        border-radius: 0 8px 0 8px;
+        padding: 0 6px;
+        line-height: 18px;
+
+        &.used {
+            background-color: #939599;
+        }
+    }
+    .van-image {
+        display: block;
+    }
+    .text1 {
+        font-size: 16px;
+        color: @text0;
+        line-height: 24px;
+        text-align: center;
+    }
+
+    .content {
+        padding: 7px;
+        background-color: @bg;
+    }
+
+    .text2 {
+        text-align: center;
+        font-size: 14px;
+        line-height: 16px;
+        margin-top: 5px;
+        color: @text0;
+        span {
+            color: @prim;
+        }
+    }
+
+    .van-button {
+        margin-top: 10px;
+    }
+}
+.stock {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: calc(50vw - 40px);
+    line-height: 20px;
+    background-color: rgba(0, 0, 0, 0.6);
+    color: #fff;
+    text-align: center;
+}
+.van-button--disabled {
+    background-color: #939599;
+    opacity: 1;
+}
+</style>

+ 2 - 0
src/main/java/com/izouma/nineth/domain/ActivityCollection.java

@@ -46,4 +46,6 @@ public class ActivityCollection extends BaseEntity {
 
 
     @ApiModelProperty("领取藏品名称")
     @ApiModelProperty("领取藏品名称")
     private String awardCollectionName;
     private String awardCollectionName;
+
+    private int projectId;
 }
 }

+ 3 - 3
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -58,14 +58,14 @@ public class Collection extends BaseEntity {
     @ApiModelProperty("铸造者头像")
     @ApiModelProperty("铸造者头像")
     private String minterAvatar;
     private String minterAvatar;
 
 
-    @ApiModelProperty("铸造者")
+    @ApiModelProperty("拥有者")
 //    @Searchable
 //    @Searchable
     private String owner;
     private String owner;
 
 
-    @ApiModelProperty("铸造者ID")
+    @ApiModelProperty("拥有者ID")
     private Long ownerId;
     private Long ownerId;
 
 
-    @ApiModelProperty("铸造者头像")
+    @ApiModelProperty("拥有者头像")
     private String ownerAvatar;
     private String ownerAvatar;
 
 
     @ApiModelProperty("详情")
     @ApiModelProperty("详情")

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

@@ -1,6 +1,7 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
 import com.izouma.nineth.converter.LongArrayConverter;
 import com.izouma.nineth.converter.LongArrayConverter;
+import com.izouma.nineth.dto.GeneralDTO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -11,6 +12,7 @@ import lombok.NoArgsConstructor;
 import javax.persistence.Column;
 import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Convert;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
 
 
@@ -41,4 +43,7 @@ public class Coupon extends BaseEntity {
     private LocalDateTime expiration;
     private LocalDateTime expiration;
 
 
     private int projectId;
     private int projectId;
+
+    @Transient
+    private List<GeneralDTO> collections;
 }
 }

+ 10 - 0
src/main/java/com/izouma/nineth/dto/GeneralDTO.java

@@ -0,0 +1,10 @@
+package com.izouma.nineth.dto;
+
+import lombok.Data;
+
+@Data
+public class GeneralDTO {
+    private Long id;
+
+    private String name;
+}

+ 4 - 1
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -44,7 +44,10 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
 
 
     Asset findFirstByTokenIdAndCreatedAtAfterOrderByCreatedAt(String tokenId, LocalDateTime time);
     Asset findFirstByTokenIdAndCreatedAtAfterOrderByCreatedAt(String tokenId, LocalDateTime time);
 
 
-    List<Asset> findByTxHashIsNullAndTokenIdNotNullAndCreatedAtBeforeAndStatusOrderByCreatedAtDesc(LocalDateTime time, AssetStatus status);
+    @Query("select a from Asset a where a.txHash is null and a.tokenId is not null " +
+            "and a.status = com.izouma.nineth.enums.AssetStatus.NORMAL and a.createdAt < ?1 " +
+            "order by a.createdAt desc")
+    List<Asset> toMint(LocalDateTime time);
 
 
     @Query("select id from Asset where status = ?1")
     @Query("select id from Asset where status = ?1")
     List<Long> findAllByStatus(AssetStatus status);
     List<Long> findAllByStatus(AssetStatus status);

+ 2 - 0
src/main/java/com/izouma/nineth/repo/CollectionRepo.java

@@ -143,4 +143,6 @@ public interface CollectionRepo extends JpaRepository<Collection, Long>, JpaSpec
             "c.owner_avatar = ?5, c.detail = ?6 where c.id = ?1", nativeQuery = true)
             "c.owner_avatar = ?5, c.detail = ?6 where c.id = ?1", nativeQuery = true)
     int updateCDN(Long id, String pic, String model3d, String minterAvatar,
     int updateCDN(Long id, String pic, String model3d, String minterAvatar,
                   String ownerAvatar, String detail);
                   String ownerAvatar, String detail);
+
+    List<Collection> findAllByIdIn(java.util.Collection<Long> ids);
 }
 }

+ 2 - 0
src/main/java/com/izouma/nineth/security/WebSecurityConfig.java

@@ -101,6 +101,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/activity/get/*").permitAll()
                 .antMatchers("/activity/get/*").permitAll()
                 .antMatchers("/druid/**").permitAll()
                 .antMatchers("/druid/**").permitAll()
                 .antMatchers("/testmq/**").permitAll()
                 .antMatchers("/testmq/**").permitAll()
+                .antMatchers("/activityCollection/all").permitAll()
+                .antMatchers("/activityCollection/get/**").permitAll()
                 // all other requests need to be authenticated
                 // all other requests need to be authenticated
                 .anyRequest().authenticated().and()
                 .anyRequest().authenticated().and()
                 // make sure we use stateless session; session won't be used to
                 // make sure we use stateless session; session won't be used to

+ 2 - 2
src/main/java/com/izouma/nineth/service/ActivityOrderService.java

@@ -38,7 +38,7 @@ public class ActivityOrderService {
     }
     }
 
 
 
 
-    public void created(User user, Long mintActivityId) {
+    public Asset create(User user, Long mintActivityId) {
         try {
         try {
             ActivityCollection activity = activityCollectionRepo.findById(mintActivityId)
             ActivityCollection activity = activityCollectionRepo.findById(mintActivityId)
                     .orElseThrow(new BusinessException("活动不存在"));
                     .orElseThrow(new BusinessException("活动不存在"));
@@ -129,7 +129,7 @@ public class ActivityOrderService {
             });
             });
 
 
             //发放新的
             //发放新的
-            assetService.createAsset(award, user, order.getId(), null, "兑换",
+            return assetService.createAsset(award, user, order.getId(), null, "兑换",
                     award.getTotal() > 1 ? collectionService.getNextNumber(award.getId()) : null);
                     award.getTotal() > 1 ? collectionService.getNextNumber(award.getId()) : null);
 
 
         } catch (Exception e) {
         } catch (Exception e) {

+ 3 - 2
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -374,14 +374,15 @@ public class AssetService {
                     userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "作品交易——买入" : "作品交易——售出");
                     userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "作品交易——买入" : "作品交易——售出");
                     break;
                     break;
                 case "兑换":
                 case "兑换":
-                    userHistory.setDescription("兑换");
+                    userHistory.setDescription("活动收集——兑换");
+                    break;
                 case "空投":
                 case "空投":
                     userHistory.setDescription("空投");
                     userHistory.setDescription("空投");
                     break;
                     break;
                 case "转赠":
                 case "转赠":
                     userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "他人赠送" : "作品赠送");
                     userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "他人赠送" : "作品赠送");
                     if (userHistory.getToUserId().equals(1590945L)) {
                     if (userHistory.getToUserId().equals(1590945L)) {
-                        userHistory.setDescription("活动收集销毁");
+                        userHistory.setDescription("活动收集——销毁");
                     }
                     }
                     break;
                     break;
             }
             }

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

@@ -23,7 +23,7 @@ public class ActivityCollectionController extends BaseController {
     private ActivityCollectionService activityCollectionService;
     private ActivityCollectionService activityCollectionService;
     private ActivityCollectionRepo    activityCollectionRepo;
     private ActivityCollectionRepo    activityCollectionRepo;
 
 
-    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
     public ActivityCollection save(@RequestBody ActivityCollection record) {
     public ActivityCollection save(@RequestBody ActivityCollection record) {
         if (record.getCollectionId().equals(record.getAwardCollectionId())) {
         if (record.getCollectionId().equals(record.getAwardCollectionId())) {

+ 9 - 2
src/main/java/com/izouma/nineth/web/ActivityOrderController.java

@@ -1,14 +1,16 @@
 package com.izouma.nineth.web;
 package com.izouma.nineth.web;
+
 import com.izouma.nineth.domain.ActivityOrder;
 import com.izouma.nineth.domain.ActivityOrder;
+import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.service.ActivityOrderService;
 import com.izouma.nineth.service.ActivityOrderService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.ActivityOrderRepo;
 import com.izouma.nineth.repo.ActivityOrderRepo;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.ObjUtils;
+import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
@@ -20,7 +22,7 @@ import java.util.List;
 @AllArgsConstructor
 @AllArgsConstructor
 public class ActivityOrderController extends BaseController {
 public class ActivityOrderController extends BaseController {
     private ActivityOrderService activityOrderService;
     private ActivityOrderService activityOrderService;
-    private ActivityOrderRepo activityOrderRepo;
+    private ActivityOrderRepo    activityOrderRepo;
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
@@ -56,5 +58,10 @@ public class ActivityOrderController extends BaseController {
         List<ActivityOrder> data = all(pageQuery).getContent();
         List<ActivityOrder> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
         ExcelUtils.export(response, data);
     }
     }
+
+    @PostMapping("/create")
+    public Asset create(@RequestParam Long mintActivityId) {
+        return activityOrderService.create(SecurityUtils.getAuthenticatedUser(), mintActivityId);
+    }
 }
 }
 
 

+ 1 - 2
src/main/java/com/izouma/nineth/web/AssetController.java

@@ -7,7 +7,6 @@ import com.izouma.nineth.domain.GiftOrder;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.UserHistory;
 import com.izouma.nineth.dto.UserHistory;
-import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.TokenHistoryRepo;
 import com.izouma.nineth.repo.TokenHistoryRepo;
@@ -141,7 +140,7 @@ public class AssetController extends BaseController {
 
 
     @GetMapping("/mint")
     @GetMapping("/mint")
     public String mint() {
     public String mint() {
-        for (Asset asset : assetRepo.findByTxHashIsNullAndTokenIdNotNullAndCreatedAtBeforeAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), AssetStatus.NORMAL)) {
+        for (Asset asset : assetRepo.toMint(LocalDateTime.now())) {
             rocketMQTemplate.syncSend(generalProperties.getMintTopic(), asset.getId());
             rocketMQTemplate.syncSend(generalProperties.getMintTopic(), asset.getId());
         }
         }
         return "ok";
         return "ok";

+ 23 - 5
src/main/java/com/izouma/nineth/web/CouponController.java

@@ -1,26 +1,31 @@
 package com.izouma.nineth.web;
 package com.izouma.nineth.web;
+
 import com.izouma.nineth.domain.Coupon;
 import com.izouma.nineth.domain.Coupon;
-import com.izouma.nineth.service.CouponService;
+import com.izouma.nineth.dto.GeneralDTO;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.CouponRepo;
 import com.izouma.nineth.repo.CouponRepo;
+import com.izouma.nineth.service.CouponService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.List;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
 @RequestMapping("/coupon")
 @RequestMapping("/coupon")
 @AllArgsConstructor
 @AllArgsConstructor
 public class CouponController extends BaseController {
 public class CouponController extends BaseController {
-    private CouponService couponService;
-    private CouponRepo couponRepo;
+    private CouponService  couponService;
+    private CouponRepo     couponRepo;
+    private CollectionRepo collectionRepo;
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
@@ -42,7 +47,20 @@ public class CouponController extends BaseController {
 
 
     @GetMapping("/get/{id}")
     @GetMapping("/get/{id}")
     public Coupon get(@PathVariable Long id) {
     public Coupon get(@PathVariable Long id) {
-        return couponRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        Coupon coupon = couponRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        if (CollectionUtils.isNotEmpty(coupon.getCollectionIds())) {
+            List<GeneralDTO> dtos = collectionRepo.findAllByIdIn(coupon.getCollectionIds())
+                    .stream()
+                    .map(collection -> {
+                        GeneralDTO dto = new GeneralDTO();
+                        dto.setId(collection.getId());
+                        dto.setName(collection.getName());
+                        return dto;
+                    })
+                    .collect(Collectors.toList());
+            coupon.setCollections(dtos);
+        }
+        return coupon;
     }
     }
 
 
     @PostMapping("/del/{id}")
     @PostMapping("/del/{id}")

+ 1 - 1
src/main/vue/.env.development

@@ -1 +1 @@
-VUE_APP_BASE_URL=https://nfttest.9space.vip/
+VUE_APP_BASE_URL=http://localhost:8080/

+ 35 - 12
src/main/vue/src/views/ActivityCollectionEdit.vue

@@ -16,14 +16,20 @@
                     size="small"
                     size="small"
                     style="max-width: 500px"
                     style="max-width: 500px"
                 >
                 >
+                    <el-form-item label="项目" prop="projectId">
+                        <el-select v-model="formData.projectId" @change="changeProject" :disabled="!canEdit">
+                            <el-option :value="0" label="第九空间"></el-option>
+                            <el-option :value="1" label="cosmos art"></el-option>
+                            <!-- <el-option :value="2" label="modern point"></el-option> -->
+                        </el-select>
+                    </el-form-item>
                     <el-form-item prop="name" label="活动名称">
                     <el-form-item prop="name" label="活动名称">
-                        <el-input v-model="formData.name"></el-input>
+                        <el-input v-model="formData.name" :disabled="!canEdit"></el-input>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item prop="pic" label="图片">
                     <el-form-item prop="pic" label="图片">
                         <single-upload v-model="formData.pic"></single-upload>
                         <single-upload v-model="formData.pic"></single-upload>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item prop="collectionId" label="兑换藏品">
                     <el-form-item prop="collectionId" label="兑换藏品">
-                        <!-- <collection-search v-model="formData.collectionId" style="width: 300px"></collection-search> -->
                         <el-select
                         <el-select
                             v-model="formData.collectionId"
                             v-model="formData.collectionId"
                             filterable
                             filterable
@@ -45,19 +51,20 @@
                         <el-input-number type="number" v-model="formData.total" :disabled="!canEdit"></el-input-number>
                         <el-input-number type="number" v-model="formData.total" :disabled="!canEdit"></el-input-number>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item prop="awardCollectionId" label="获得藏品">
                     <el-form-item prop="awardCollectionId" label="获得藏品">
-                        <!-- <collection-search
-                            v-model="formData.awardCollectionId"
-                            style="width: 300px"
-                        ></collection-search> -->
                         <el-select
                         <el-select
                             v-model="formData.awardCollectionId"
                             v-model="formData.awardCollectionId"
                             filterable
                             filterable
-                            :filter-method="filterCollection"
+                            :filter-method="filterCollection1"
                             style="width: 100%"
                             style="width: 100%"
                             @change="changAwardCollection"
                             @change="changAwardCollection"
                             :disabled="!canEdit"
                             :disabled="!canEdit"
                         >
                         >
-                            <el-option v-for="item in filterOptions" :label="item.name" :value="item.id" :key="item.id">
+                            <el-option
+                                v-for="item in filterOptions1"
+                                :label="item.name"
+                                :value="item.id"
+                                :key="item.id"
+                            >
                                 <span style="float: left">{{ item.name }}</span>
                                 <span style="float: left">{{ item.name }}</span>
                                 <span style="float: right; color: #8492a6; font-size: 13px">#{{ item.id }}</span>
                                 <span style="float: right; color: #8492a6; font-size: 13px">#{{ item.id }}</span>
                             </el-option>
                             </el-option>
@@ -101,13 +108,17 @@ export default {
                 { body: 'json' }
                 { body: 'json' }
             )
             )
             .then(res => {
             .then(res => {
-                this.filterOptions = this.options = res.content;
+                this.options = res.content;
+                this.filterOptions = this.options.filter(i => i.projectId == this.$store.state.projectId);
+                this.filterOptions1 = this.options.filter(i => i.projectId == this.$store.state.projectId);
             });
             });
     },
     },
     data() {
     data() {
         return {
         return {
             saving: false,
             saving: false,
-            formData: {},
+            formData: {
+                projectId: this.$store.state.projectId
+            },
             rules: {
             rules: {
                 name: [
                 name: [
                     {
                     {
@@ -153,7 +164,8 @@ export default {
                 ]
                 ]
             },
             },
             options: [],
             options: [],
-            filterOptions: []
+            filterOptions: [],
+            filterOptions1: []
         };
         };
     },
     },
     computed: {
     computed: {
@@ -163,7 +175,18 @@ export default {
     },
     },
     methods: {
     methods: {
         filterCollection(val) {
         filterCollection(val) {
-            this.filterOptions = this.options.filter(i => i.name.includes(val) || i.id == val);
+            this.filterOptions = this.options.filter(
+                i => i.projectId == this.formData.projectId && (i => i.name.includes(val) || i.id == val)
+            );
+        },
+        filterCollection1(val) {
+            this.filterOptions1 = this.options.filter(
+                i => i.projectId == this.formData.projectId && (i.name.includes(val) || i.id == val)
+            );
+        },
+        changeProject(val) {
+            this.filterOptions = this.options.filter(i => i.projectId == val);
+            this.filterOptions1 = this.options.filter(i => i.projectId == val);
         },
         },
         onSave() {
         onSave() {
             this.$refs.form.validate(valid => {
             this.$refs.form.validate(valid => {

+ 1 - 1
src/main/vue/src/views/ActivityCollectionList.vue

@@ -114,7 +114,7 @@ export default {
     },
     },
     methods: {
     methods: {
         beforeGetData() {
         beforeGetData() {
-            return { search: this.search, query: { del: false } };
+            return { search: this.search, query: { del: false, projectId: this.$store.state.projectId } };
         },
         },
         toggleMultipleMode(multipleMode) {
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
             this.multipleMode = multipleMode;

+ 4 - 0
src/main/vue/src/views/CouponEdit.vue

@@ -91,6 +91,9 @@ export default {
                 .get('coupon/get/' + this.$route.query.id)
                 .get('coupon/get/' + this.$route.query.id)
                 .then(res => {
                 .then(res => {
                     this.formData = res;
                     this.formData = res;
+                    if (res.collectionIds) {
+                        this.collections = res.collections;
+                    }
                 })
                 })
                 .catch(e => {
                 .catch(e => {
                     console.log(e);
                     console.log(e);
@@ -166,6 +169,7 @@ export default {
         },
         },
         submit() {
         submit() {
             let data = { ...this.formData };
             let data = { ...this.formData };
+            data.collections = null;
 
 
             this.saving = true;
             this.saving = true;
             this.$http
             this.$http

+ 1 - 1
src/test/java/com/izouma/nineth/service/ActivityOrderServiceTest.java

@@ -16,6 +16,6 @@ public class ActivityOrderServiceTest extends ApplicationTests {
     @Test
     @Test
     public void created() {
     public void created() {
         User user = userRepo.findById(7834L).orElse(null);
         User user = userRepo.findById(7834L).orElse(null);
-        activityOrderService.created(user, 8847L);
+        activityOrderService.create(user, 8847L);
     }
     }
 }
 }

+ 12 - 0
src/test/java/com/izouma/nineth/service/AssetServiceTest.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.service;
 
 
 import com.izouma.nineth.ApplicationTests;
 import com.izouma.nineth.ApplicationTests;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.repo.*;
@@ -136,4 +137,15 @@ class AssetServiceTest extends ApplicationTests {
         }
         }
     }
     }
 
 
+    @Test
+    public void all() {
+        PageQuery pageQuery = new PageQuery();
+        Map<String, Object> query = pageQuery.getQuery();
+        query.put("userId", 79151);
+        query.put("status", "TRANSFERRED");
+        query.put("projectId", 1);
+        pageQuery.setSearch("熊");
+        System.out.println(assetService.all(pageQuery).getContent());
+    }
+
 }
 }