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

铸造订单筛选优化,vip优先购买

licailing пре 3 година
родитељ
комит
8c25d2ce06

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

@@ -206,4 +206,7 @@ public class Order {
     }
 
     private String countId;
+
+    @ApiModelProperty("是否vip")
+    private boolean vip;
 }

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

@@ -132,4 +132,7 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty("勋章等级")
     private int level;
 
+    @ApiModelProperty("优先购买")
+    private int vipPurchase;
+
 }

+ 9 - 7
src/main/java/com/izouma/nineth/event/CreateOrderEvent.java

@@ -10,11 +10,13 @@ import java.io.Serializable;
 @AllArgsConstructor
 @NoArgsConstructor
 public class CreateOrderEvent implements Serializable {
-    private Long id;
-    private Long userId;
-    private Long collectionId;
-    private int  qty;
-    private Long addressId;
-    private Long userCouponId;
-    private Long invitor;
+    private Long    id;
+    private Long    userId;
+    private Long    collectionId;
+    private int     qty;
+    private Long    addressId;
+    private Long    userCouponId;
+    private Long    invitor;
+    private boolean vip;
+    private int     vipPurchase;
 }

+ 2 - 1
src/main/java/com/izouma/nineth/listener/CreateOrderListener.java

@@ -36,7 +36,8 @@ public class CreateOrderListener implements RocketMQListener<CreateOrderEvent> {
         Map<String, Object> map = new HashMap<>();
         try {
             Order order = orderService.create(event.getUserId(), event.getCollectionId(), event.getQty(),
-                    event.getAddressId(), event.getUserCouponId(), event.getInvitor(), event.getId());
+                    event.getAddressId(), event.getUserCouponId(), event.getInvitor(), event.getId(),
+                    event.isVip(), event.getVipPurchase());
             map.put("success", true);
             map.put("data", order);
         } catch (Exception e) {

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

@@ -43,4 +43,6 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
 
     @Query("select id from Order where userId = ?1 and opened = false")
     List<Long> findAllByUserIdAndOpenedFalse(Long userId);
+
+    int countByUserIdAndCollectionIdAndVipTrueAndStatusIn(Long userId, Long collectionId, Collection<OrderStatus> status);
 }

+ 17 - 7
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -91,7 +91,8 @@ public class OrderService {
         return orderRepo.findAll(JpaUtils.toSpecification(pageQuery, Order.class), JpaUtils.toPageRequest(pageQuery));
     }
 
-    public String mqCreate(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor, String sign) {
+    public String mqCreate(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor,
+                           String sign, boolean vip, int vipPurchase) {
         String qs = null;
         try {
             qs = AESEncryptUtil.decrypt(sign);
@@ -105,12 +106,13 @@ public class OrderService {
 
         Long id = snowflakeIdWorker.nextId();
         SendResult result = rocketMQTemplate.syncSend(generalProperties.getCreateOrderTopic(),
-                new CreateOrderEvent(id, userId, collectionId, qty, addressId, userCouponId, invitor), 100000);
+                new CreateOrderEvent(id, userId, collectionId, qty, addressId, userCouponId, invitor, vip, vipPurchase), 100000);
         log.info("发送订单到队列: {}, result={}", id, result);
         return String.valueOf(id);
     }
 
-    public Order create(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor, Long id) {
+    public Order create(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor,
+                        Long id, boolean vip, int vipPurchase) {
         long t = System.currentTimeMillis();
         qty = 1;
         int stock = Optional.ofNullable(collectionService.decreaseStock(collectionId, qty))
@@ -174,10 +176,17 @@ public class OrderService {
 
             //查询是否有拉新任务,只算官方购买
             if (collection.getSource() != CollectionSource.TRANSFER && collection.getAssignment() > 0) {
-                long count = userRepo.countAllByCollectionIdAndCollectionInvitor(collectionId, userId);
-                int sub = collection.getAssignment() - (int) count;
-                if (sub > 0) {
-                    throw new BusinessException("再拉新" + sub + "人即可购买");
+                if (vip) {
+                    int purchase = orderRepo.countByUserIdAndCollectionIdAndVipTrueAndStatusIn(userId, collectionId, Arrays.asList(OrderStatus.FINISH, OrderStatus.NOT_PAID, OrderStatus.PROCESSING));
+                    if (vipPurchase - purchase <= 0) {
+                        throw new BusinessException("vip名额已使用完毕!");
+                    }
+                } else {
+                    long count = userRepo.countAllByCollectionIdAndCollectionInvitor(collectionId, userId);
+                    int sub = collection.getAssignment() - (int) count;
+                    if (sub > 0) {
+                        throw new BusinessException("再拉新" + sub + "人即可购买");
+                    }
                 }
             }
 
@@ -218,6 +227,7 @@ public class OrderService {
                     .couponId(userCouponId)
                     .invitor(invitor)
                     .countId(collection.getCountId())
+                    .vip(vip)
                     .build();
             if (coupon != null) {
                 coupon.setUsed(true);

+ 2 - 3
src/main/java/com/izouma/nineth/web/MintOrderController.java

@@ -68,9 +68,8 @@ public class MintOrderController extends BaseController {
     public MintOrder get(@PathVariable Long id) {
         MintOrder mintOrder = mintOrderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         if (!Objects.isNull(mintOrder.getMintActivityId())) {
-            MintActivity activity = mintActivityRepo.findByIdAndDelFalse(mintOrder.getMintActivityId())
-                    .orElseThrow(new BusinessException("无铸造活动"));
-            mintOrder.setMintActivity(activity.getName());
+            mintActivityRepo.findByIdAndDelFalse(mintOrder.getMintActivityId())
+                    .ifPresent(activity -> mintOrder.setMintActivity(activity.getName()));
         }
         mintOrder.setMaterial(mintMaterialRepo.findAllByOrderIdAndDelFalse(id));
         return mintOrder;

+ 5 - 3
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -107,10 +107,12 @@ public class OrderController extends BaseController {
                                             @RequestParam(required = false) Long addressId,
                                             @RequestParam(required = false) Long couponId,
                                             @RequestParam(required = false) Long invitor,
-                                            @RequestParam String sign) {
+                                            @RequestParam String sign,
+                                            @RequestParam(defaultValue = "false") boolean priority) {
+        final User user = SecurityUtils.getAuthenticatedUser();
         return new HashMap<>() {{
-            put("id", orderService.mqCreate(SecurityUtils.getAuthenticatedUser().getId(),
-                    collectionId, qty, addressId, couponId, invitor, sign));
+            put("id", orderService.mqCreate(user.getId(), collectionId, qty, addressId, couponId, invitor, sign,
+                    priority, user.getVipPurchase()));
         }};
     }
 

+ 54 - 6
src/main/vue/src/views/MintOrderList.vue

@@ -21,7 +21,7 @@
             </el-button>
         </page-title>
         <div class="filters-container">
-            <created-at-picker v-model="createdAt" @input="getData" name="铸造" class="filter-item"></created-at-picker>
+            <created-at-picker v-model="createdAt" @input="getData" name="支付" class="filter-item"></created-at-picker>
             <el-input
                 placeholder="搜索..."
                 v-model="search"
@@ -31,6 +31,34 @@
             >
                 <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
             </el-input>
+            <el-select
+                v-model="activity"
+                placeholder="请选择活动"
+                @change="getData"
+                clearable
+                filterable
+                class="filter-item"
+            >
+                <el-option v-for="item in activities" :key="item.id" :value="item.id" :label="item.name">
+                    <span style="float: left">{{ item.name }}</span>
+                    <span style="float: right; color: #8492a6; font-size: 13px">#{{ item.id }}</span>
+                </el-option>
+            </el-select>
+            <el-select
+                v-model="status"
+                placeholder="请选择状态"
+                @change="getData"
+                clearable
+                filterable
+                class="filter-item"
+            >
+                <el-option
+                    v-for="item in statusOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                ></el-option>
+            </el-select>
         </div>
         <el-table
             :data="tableData"
@@ -70,8 +98,8 @@
                 </template>
             </el-table-column>
             <el-table-column prop="payAt" label="支付时间" min-width="120" show-overflow-tooltip></el-table-column>
-            <!-- <el-table-column prop="payMethod" label="支付方式" :formatter="payMethodFormatter"> </el-table-column>
-            <el-table-column prop="gasPrice" label="gas费"> </el-table-column> -->
+            <!-- <el-table-column prop="payMethod" label="支付方式" :formatter="payMethodFormatter"> </el-table-column> -->
+            <el-table-column prop="gasPrice" label="gas费"> </el-table-column>
             <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
             <el-table-column label="操作" align="left" fixed="right" width="160">
                 <template slot-scope="{ row }">
@@ -85,7 +113,7 @@
                     <el-button @click="finish(row)" type="success" size="mini" plain v-if="row.status == 'RECEIVE'"
                         >已收货</el-button
                     >
-                    
+
                     <!-- <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button> -->
                 </template>
             </el-table-column>
@@ -120,6 +148,20 @@ import pageableTable from '@/mixins/pageableTable';
 export default {
     name: 'MintOrderList',
     mixins: [pageableTable],
+    created() {
+        this.$http
+            .post(
+                '/mintActivity/all',
+                {
+                    sort: 'createdAt,desc',
+                    query: { del: false }
+                },
+                { body: 'json' }
+            )
+            .then(res => {
+                this.activities = res.content;
+            });
+    },
     data() {
         return {
             multipleMode: false,
@@ -138,7 +180,10 @@ export default {
                 { label: '已完成', value: 'FINISH' },
                 { label: '已取消', value: 'CANCELLED' }
             ],
-            createdAt: ''
+            createdAt: '',
+            activities: [],
+            activity: '',
+            status: ''
         };
     },
     computed: {
@@ -162,7 +207,10 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search, query: { del: false, payAt: this.createdAt } };
+            return {
+                search: this.search,
+                query: { del: false, payAt: this.createdAt, mintActivityId: this.activity, status: this.status }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 12 - 1
src/main/vue/src/views/UserEdit.vue

@@ -57,6 +57,15 @@
                     <el-form-item prop="shareRatio" label="分成比例(%)">
                         <el-input-number :min="0" :max="99" v-model="formData.shareRatio"></el-input-number>
                     </el-form-item>
+                    <el-form-item label="vip优先购">
+                        <el-switch
+                            v-model="vip"
+                            @change="formData.vipPurchase = vip == false ? 0 : formData.vipPurchase"
+                        ></el-switch>
+                    </el-form-item>
+                    <el-form-item label="优先购数量" v-if="vip">
+                        <el-input-number type="number" v-model="formData.vipPurchase" :min="0" :step="1"></el-input-number>
+                    </el-form-item>
                     <el-form-item>
                         <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                         <el-button @click="del" :disabled="saving" type="danger" v-if="formData.id && formData.id !== 1"
@@ -80,6 +89,7 @@ export default {
                 .get(`/user/get/${this.$route.query.id}`)
                 .then(res => {
                     this.formData = res;
+                    this.vip = res.vipPurchase > 0;
                 })
                 .catch(e => {
                     console.log(e);
@@ -115,7 +125,8 @@ export default {
                 ],
                 authorities: [{ required: true, message: '请选择角色', trigger: 'blur' }]
             },
-            authorities: []
+            authorities: [],
+            vip: false
         };
     },
     methods: {

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

@@ -10,6 +10,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -48,6 +50,13 @@ class AssetServiceTest extends ApplicationTests {
 
     @Test
     void testCancelConsignment() {
+        List<Long> ids = Arrays.asList(7920L, 26684L, 45655L,
+                25308L, 157533L, 268927L, 7944L, 78740L,
+                222146L, 268937L, 268949L, 765671L,
+                220921L, 220949L, 766743L, 729011L,
+                769787L, 702426L, 54865L, 304757L);
+        ids.forEach(id -> assetService.cancelConsignment(id));
+
     }
 
     @Test