Răsfoiți Sursa

线下会员购买

licailing 6 ani în urmă
părinte
comite
2e0b0e28d6

+ 6 - 0
pom.xml

@@ -280,6 +280,12 @@
             <artifactId>assertj-core</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.javafaker</groupId>
+            <artifactId>javafaker</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 1 - 1
src/main/java/com/izouma/immall/domain/BaseEntity.java

@@ -28,7 +28,7 @@ public abstract class BaseEntity implements Serializable {
     @CreatedBy
     private String createdBy;
 
-//    @JsonIgnore
+    @JsonIgnore
     @CreatedDate
     private LocalDateTime createdAt;
 

+ 12 - 0
src/main/java/com/izouma/immall/domain/User.java

@@ -13,12 +13,15 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 import org.hibernate.annotations.Where;
 
 import javax.persistence.*;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -81,5 +84,14 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty("邀请人UserId")
     private Long parentId;
 
+    @ApiModelProperty("注册时间")
+    private LocalDateTime registerTime;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "parentId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private User user;
+
 
 }

+ 2 - 1
src/main/java/com/izouma/immall/repo/VipFeeRepo.java

@@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.List;
 
 public interface VipFeeRepo extends JpaRepository<VipFee, Long>, JpaSpecificationExecutor<VipFee> {
     @Query("update VipFee t set t.enabled = false where t.id = ?1")
@@ -14,7 +15,7 @@ public interface VipFeeRepo extends JpaRepository<VipFee, Long>, JpaSpecificatio
     @Transactional
     void deleteById(Long id);
 
-    VipFee findByUserIdAndEnabledTrue(Long userId);
+    List<VipFee> findByUserIdAndEnabledTrue(Long userId);
 
     VipFee findByOrderId(Long orderId);
 

+ 15 - 1
src/main/java/com/izouma/immall/service/ConsumptionService.java

@@ -8,10 +8,12 @@ import com.github.binarywang.wxpay.service.WxPayService;
 import com.izouma.immall.domain.OrderForm;
 import com.izouma.immall.domain.User;
 import com.izouma.immall.domain.VipFee;
+import com.izouma.immall.domain.VipUser;
 import com.izouma.immall.exception.BusinessException;
 import com.izouma.immall.repo.OrderFormRepo;
 import com.izouma.immall.repo.UserRepo;
 import com.izouma.immall.repo.VipFeeRepo;
+import com.izouma.immall.repo.VipUserRepo;
 import com.izouma.immall.utils.JsonUtils;
 import com.izouma.immall.utils.SnowflakeIdWorker;
 import lombok.extern.slf4j.Slf4j;
@@ -22,7 +24,9 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -39,6 +43,8 @@ public class ConsumptionService {
     private WxPayService wxPayService;
     @Autowired
     private VipFeeRepo vipFeeRepo;
+    @Autowired
+    private VipUserRepo vipUserRepo;
 //    @Autowired
 //    private VipUserService vipUserService;
 
@@ -89,7 +95,15 @@ public class ConsumptionService {
     public WxPayMpOrderResult offline(Long userId, BigDecimal amount) {
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
 
-        //vipUserService.buyVip(userId, false);
+        List<VipFee> fees = vipFeeRepo.findByUserIdAndEnabledTrue(userId);
+        VipUser vip = vipUserRepo.findByUserId(userId);
+        if (vip != null && !vip.getIsShare()) {
+            throw new BusinessException("已购买");
+        }
+        List<VipFee> collect = fees.stream().filter(f -> "线下".equals(f.getRemark())).collect(Collectors.toList());
+        if (collect.size() > 0) {
+            throw new BusinessException("已购买");
+        }
 
         String body = "IM完美生活商城线下VIP活动";
         WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();

+ 0 - 1
src/main/java/com/izouma/immall/service/UserService.java

@@ -28,7 +28,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
-import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;

+ 0 - 4
src/main/java/com/izouma/immall/web/VipFeeController.java

@@ -62,9 +62,5 @@ public class VipFeeController extends BaseController {
     }
     /*generatedEnd*/
 
-    @GetMapping("/my")
-    public VipFee my() {
-        return vipFeeRepo.findByUserIdAndEnabledTrue(SecurityUtils.getAuthenticatedUser().getId());
-    }
 }
 

+ 37 - 36
src/main/vue/src/views/user/UserList.vue

@@ -9,18 +9,18 @@
             <el-button @click="addRow" type="primary" icon="el-icon-plus"
                        class="filter-item">添加
             </el-button>
-<!--            <el-button @click="download" type="primary" icon="el-icon-download"
-                       :loading="downloading" class="filter-item">导出EXCEL
-            </el-button>-->
-<!--            <el-select v-model="identityId" class="filter-item" placeholder="筛选状态" clearable filterable
-                       @change="getData">
-                <el-option
-                        v-for="item in identityOptions"
-                        :label="item.label"
-                        :value="item.value"
-                        :key="item.value"
-                />
-            </el-select>-->
+            <!--            <el-button @click="download" type="primary" icon="el-icon-download"
+                                   :loading="downloading" class="filter-item">导出EXCEL
+                        </el-button>-->
+            <!--            <el-select v-model="identityId" class="filter-item" placeholder="筛选状态" clearable filterable
+                                   @change="getData">
+                            <el-option
+                                    v-for="item in identityOptions"
+                                    :label="item.label"
+                                    :value="item.value"
+                                    :key="item.value"
+                            />
+                        </el-select>-->
         </div>
         <el-table :data="tableData" row-key="id" ref="table"
                   header-row-class-name="table-header-row"
@@ -57,29 +57,29 @@
                              :formatter="sexFormatter"
             >
             </el-table-column>
-            <el-table-column prop="phone" label="手机" >
+            <el-table-column prop="phone" label="手机">
             </el-table-column>
-            <el-table-column prop="parentId" label="邀请人"
+            <el-table-column prop="user.nickname" label="邀请人"
             >
             </el-table-column>
 
-            <el-table-column prop="createdAt" label="注册时间" min-width="120">
+            <el-table-column prop="registerTime" label="注册时间" min-width="120">
             </el-table-column>
-            <el-table-column prop="authorities" label="权限" >
+            <el-table-column prop="authorities" label="权限">
                 <template slot-scope="{ row }">
-                    <el-tag v-for="item in row.authorities">{{ item.description }}</el-tag>
+                    <el-tag v-for="item in row.authorities" v-bind:key="item.id">{{ item.description }}</el-tag>
                 </template>
             </el-table-column>
-<!--            <el-table-column
-                    label="操作"
-                    align="center"
-                    fixed="right"
-                    min-width="150"> &lt;!&ndash;v-if="canEdit"&ndash;&gt;
-                <template slot-scope="{row}">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
-                </template>
-            </el-table-column>-->
+            <!--            <el-table-column
+                                label="操作"
+                                align="center"
+                                fixed="right"
+                                min-width="150"> &lt;!&ndash;v-if="canEdit"&ndash;&gt;
+                            <template slot-scope="{row}">
+                                <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                                <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                            </template>
+                        </el-table-column>-->
         </el-table>
         <div class="pagination-wrapper">
             <div class="multiple-mode-wrapper">
@@ -119,12 +119,12 @@
                 url: "/user/all",
                 downloading: false,
                 sexOptions: [{"label": "男", "value": "男"}, {"label": "女", "value": "女"}],
-/*                identityOptions: [
-                    {label: '普通会员', value: 34},
-                    {label: '特约会员', value: 33},
-                    {label: '总经销', value: 32},
-                ],
-                identityId: '',*/
+                /*                identityOptions: [
+                                    {label: '普通会员', value: 34},
+                                    {label: '特约会员', value: 33},
+                                    {label: '总经销', value: 32},
+                                ],
+                                identityId: '',*/
             }
         },
         computed: {
@@ -151,9 +151,10 @@
             beforeGetData() {
                 return {
                     search: this.search,
-/*                    query: {
-                        identityId: this.identityId
-                    }*/
+                    sort: "registerTime,desc"
+                    /*                    query: {
+                                            identityId: this.identityId
+                                        }*/
                 };
             },
             toggleMultipleMode(multipleMode) {

+ 60 - 3
src/test/java/com/izouma/immall/repo/UserRepoTest.java

@@ -1,9 +1,13 @@
 package com.izouma.immall.repo;
 
+import com.github.javafaker.Faker;
 import com.izouma.immall.domain.User;
+import com.izouma.immall.domain.VipUser;
 import com.izouma.immall.exception.BusinessException;
+import com.izouma.immall.security.Authority;
 import com.izouma.immall.security.JwtTokenUtil;
 import com.izouma.immall.security.JwtUserFactory;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,7 +15,9 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.*;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
@@ -20,6 +26,8 @@ public class UserRepoTest {
     private UserRepo userRepo;
     @Autowired
     private JwtTokenUtil jwtTokenUtil;
+    @Autowired
+    private VipUserRepo vipUserRepo;
 
     @Test
     public void testUser() {
@@ -48,15 +56,64 @@ public class UserRepoTest {
 //    }
 
     @Test
-    public void findAllUser(){
+    public void findAllUser() {
         List<User> list = userRepo.findAll();
         System.out.println(list);
     }
 
 
     @Test
-    public void token(){
+    public void token() {
         User user = userRepo.findById(999l).orElseThrow(new BusinessException("不存在"));
         System.out.println(jwtTokenUtil.generateToken(JwtUserFactory.create(user)));
     }
+
+    @Test
+    public void addFakeUser() {
+        Faker faker = new Faker(new Locale("zh-CN"));
+
+        char[] alls = "A. @#!$%*&。-'`^© A.".toCharArray();
+
+        Random random = new Random();
+
+        for (int i = 0; i < 1000; i++) {
+            //15864
+            int num = 16000 + (int) (Math.random() * (16200 - 15936));
+            if (num % 2 != 0) {
+                num += 1;
+            }
+
+
+            LocalDateTime time = LocalDateTime.now().minusMinutes(Math.round(Math.random() * 6000));
+            String name = faker.name().name();
+            int nextInt = random.nextInt(alls.length);
+            User user = userRepo.save(User.builder()
+                    .password(new BCryptPasswordEncoder().encode("123456"))
+                    .nickname(alls[nextInt] + name + RandomStringUtils.randomAlphabetic(0))
+                    .username(UUID.randomUUID().toString())
+                    .avatar(faker.avatar().image())
+                    .authorities(Collections
+                            .singleton(Authority.builder().name(Authority.NAMES.ROLE_USER.name()).build()))
+                    .registerTime(time)
+                    .parentId((long) num)
+                    .enabled(true)
+                    .sex((int) (10 * Math.random()) % 2 > 0 ? "男" : "女")
+                    .build());
+
+
+            LocalDateTime vipTime = time.plusMinutes(Math.round(Math.random() * 500));
+            vipUserRepo.save(VipUser.builder()
+                    .openId(user.getOpenId())
+                    .startTime(vipTime)
+                    .endTime(vipTime.plusYears(1))
+                    .identityId(34L)
+                    .fansNum(0L)
+                    .money(BigDecimal.ZERO)
+                    .userId(user.getId())
+                    .expired(false)
+                    .parentId(user.getParentId())
+                    .isShare(true)
+                    .build());
+        }
+    }
 }