licailing пре 5 година
родитељ
комит
48b90241f4
22 измењених фајлова са 342 додато и 47 уклоњено
  1. 2 0
      src/main/java/com/izouma/jiashanxia/domain/Company.java
  2. 6 0
      src/main/java/com/izouma/jiashanxia/domain/UserPackageFlow.java
  3. 1 1
      src/main/java/com/izouma/jiashanxia/dto/GoodsDTO.java
  4. 1 1
      src/main/java/com/izouma/jiashanxia/dto/UserPackageDTO.java
  5. 6 0
      src/main/java/com/izouma/jiashanxia/dto/WriteOffRecordDTO.java
  6. 6 1
      src/main/java/com/izouma/jiashanxia/dto/WriteOffSaveVO.java
  7. 7 1
      src/main/java/com/izouma/jiashanxia/repo/UserPackageRepo.java
  8. 14 11
      src/main/java/com/izouma/jiashanxia/service/UserPackageFlowService.java
  9. 3 2
      src/main/java/com/izouma/jiashanxia/service/UserPackageService.java
  10. 0 5
      src/main/java/com/izouma/jiashanxia/web/CompanyController.java
  11. 4 3
      src/main/java/com/izouma/jiashanxia/web/UserPackageController.java
  12. 2 2
      src/main/java/com/izouma/jiashanxia/web/UserPackageFlowController.java
  13. 2 2
      src/main/vue/src/plugins/http.js
  14. 9 0
      src/main/vue/src/router.js
  15. 20 4
      src/main/vue/src/views/CompanyEdit.vue
  16. 11 2
      src/main/vue/src/views/CompanyList.vue
  17. 4 4
      src/main/vue/src/views/UserEdit.vue
  18. 26 5
      src/main/vue/src/views/UserPackageFlowEdit.vue
  19. 20 2
      src/main/vue/src/views/UserPackageFlowList.vue
  20. 187 0
      src/main/vue/src/views/UserPackageFlowList1.vue
  21. 7 0
      src/test/java/com/izouma/jiashanxia/repo/UserPackageRepoTest.java
  22. 4 1
      src/test/java/com/izouma/jiashanxia/service/UserPackageFlowServiceTest.java

+ 2 - 0
src/main/java/com/izouma/jiashanxia/domain/Company.java

@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
 
 import javax.persistence.Entity;
 import javax.persistence.Transient;
@@ -21,6 +22,7 @@ import java.util.List;
 @Builder
 @Data
 @ApiModel(value = "企业表")
+@Where(clause = "del = 0")
 public class Company extends BaseEntity implements Serializable {
 
     private Long userId;

+ 6 - 0
src/main/java/com/izouma/jiashanxia/domain/UserPackageFlow.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.domain;
 
 import com.izouma.jiashanxia.enums.FlowType;
+import com.izouma.jiashanxia.enums.PackageType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -9,6 +10,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.hibernate.annotations.NotFound;
 import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.Where;
 
 import javax.persistence.*;
 
@@ -18,12 +20,16 @@ import javax.persistence.*;
 @Builder
 @Data
 @ApiModel(value = "套餐流水")
+@Where(clause = "del = 0")
 public class UserPackageFlow extends BaseEntity {
     private Long userId;
 
     @Enumerated(EnumType.STRING)
     private FlowType type;
 
+    @Enumerated(EnumType.STRING)
+    private PackageType packageType;
+
     /*
     存储内容
     [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1},{"goodsInfoId":13,"num":4}]

+ 1 - 1
src/main/java/com/izouma/jiashanxia/dto/GoodsDTO.java

@@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @NoArgsConstructor
 public class GoodsDTO {
-    private Long    userPackageId;
+//    private Long    userPackageId;
     private Long    goodsInfoId;
     private Integer num;
 }

+ 1 - 1
src/main/java/com/izouma/jiashanxia/dto/UserPackageDTO.java

@@ -3,7 +3,7 @@ package com.izouma.jiashanxia.dto;
 public interface UserPackageDTO {
     Long getId();
 
-    Long getUserPackageId();
+//    Long getUserPackageId();
 
     String getName();
 

+ 6 - 0
src/main/java/com/izouma/jiashanxia/dto/WriteOffRecordDTO.java

@@ -1,5 +1,7 @@
 package com.izouma.jiashanxia.dto;
 
+import com.izouma.jiashanxia.enums.FlowType;
+import com.izouma.jiashanxia.enums.PackageType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -19,6 +21,10 @@ public class WriteOffRecordDTO {
 
     private Long id;
 
+    private FlowType type;
+
+    private PackageType packageType;
+
     @ApiModelProperty(value = "被核销人")
     private String nickname;
 

+ 6 - 1
src/main/java/com/izouma/jiashanxia/dto/WriteOffSaveVO.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.dto;
 
 import com.izouma.jiashanxia.domain.BaseEntity;
+import com.izouma.jiashanxia.enums.PackageType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -22,9 +23,13 @@ public class WriteOffSaveVO extends BaseEntity {
     @ApiModelProperty(value = "核销人")
     private Long writeOffUserId;
 
+    @ApiModelProperty(value = "类型")
+    private PackageType type;
+
     /*
     存储内容
-    [{"userPackageId":1,"goodsInfoId":11,"num":1},{"userPackageId":1,"goodsInfoId":12,"num":1}]
+    "userPackageId":1,
+    [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1}]
      */
     @Column(columnDefinition = "TEXT")
     @ApiModelProperty(value = "核销内容")

+ 7 - 1
src/main/java/com/izouma/jiashanxia/repo/UserPackageRepo.java

@@ -26,9 +26,15 @@ public interface UserPackageRepo extends JpaRepository<UserPackage, Long>, JpaSp
     @Transactional
     void updateUserId(Long oldUserId,Long newUserId);
 
-    @Query(value = "select goods_info.*, ifnull(user_package.num, 0) as num, user_package.id as userPackageId " +
+    @Query(value = "select goods_info.*, ifnull(user_package.num, 0) as num " +
             "from goods_info " +
             "left join user_package on goods_info.id = user_package.goods_info_id and user_package.user_id = ?1 " +
             "where goods_info.del = 0", nativeQuery = true)
     List<UserPackageDTO> userPackage(Long userId);
+
+    @Query(value = "select goods_info.*, ifnull(user_package.num, 0) as num " +
+            "from goods_info " +
+            "inner join user_package on goods_info.id = user_package.goods_info_id and user_package.user_id = ?1 " +
+            "where goods_info.del = 0 and user_package.type = ?2", nativeQuery = true)
+    List<UserPackageDTO> userPackageByType(Long userId,String type);
 }

+ 14 - 11
src/main/java/com/izouma/jiashanxia/service/UserPackageFlowService.java

@@ -1,7 +1,6 @@
 package com.izouma.jiashanxia.service;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -27,9 +26,9 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class UserPackageFlowService {
 
-    private UserPackageFlowRepo userPackageFlowRepo;
-    private GoodsInfoRepo       goodsInfoRepo;
-    private UserPackageRepo     userPackageRepo;
+    private final UserPackageFlowRepo userPackageFlowRepo;
+    private final GoodsInfoRepo       goodsInfoRepo;
+    private final UserPackageRepo     userPackageRepo;
 
     public Page<UserPackageFlow> all(PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
@@ -45,7 +44,7 @@ public class UserPackageFlowService {
         return userPackageFlowRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = JpaUtils
                     .toPredicates(pageQuery, UserPackageFlow.class, root, criteriaQuery, criteriaBuilder);
-            and.add(criteriaBuilder.equal(root.get("type"), FlowType.WRITE_OFF));
+//            and.add(criteriaBuilder.equal(root.get("type"), FlowType.WRITE_OFF));
             if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
                 List<Predicate> or = new ArrayList<>();
                 or.add(and.get(and.size() - 1));
@@ -129,17 +128,18 @@ public class UserPackageFlowService {
         }
 
         // 用户已有套餐
+        Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserIdAndType(writeOffSaveVO.getUserId(), writeOffSaveVO
+                .getType())
+                .stream()
+                .collect(Collectors.toMap(UserPackage::getGoodsInfoId, userPackage -> userPackage));
+
 //        Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserId(writeOffSaveVO.getUserId())
 //                .stream()
-//                .collect(Collectors.toMap(UserPackage::getGoodsInfoId, userPackage -> userPackage));
-
-        Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserId(writeOffSaveVO.getUserId())
-                .stream()
-                .collect(Collectors.toMap(UserPackage::getId, userPackage -> userPackage));
+//                .collect(Collectors.toMap(UserPackage::getId, userPackage -> userPackage));
 
         List<GoodsDTO> goodsDTOS = JSONObject.parseArray(writeOffSaveVO.getContent(), GoodsDTO.class);
         goodsDTOS.forEach(goodsDTO -> {
-            UserPackage userPackage = userPackageMap.get(goodsDTO.getUserPackageId());
+            UserPackage userPackage = userPackageMap.get(goodsDTO.getGoodsInfoId());
             if (ObjectUtil.isEmpty(userPackage)) {
                 throw new BusinessException("无此项目");
             }
@@ -162,6 +162,7 @@ public class UserPackageFlowService {
                         .userId(writeOffSaveVO.getUserId())
                         .content(content)
                         .type(FlowType.WRITE_OFF)
+                        .packageType(writeOffSaveVO.getType())
                         .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
                         .build());
     }
@@ -180,6 +181,8 @@ public class UserPackageFlowService {
                 .id(writeOffRecord.getId())
                 .createdAt(writeOffRecord.getCreatedAt())
                 .goods(goodsVOS)
+                .packageType(writeOffRecord.getPackageType())
+                .type(writeOffRecord.getType())
                 .build();
         if (writeOffRecord.getUser() != null) {
             build.setNickname(writeOffRecord.getUser().getNickname());

+ 3 - 2
src/main/java/com/izouma/jiashanxia/service/UserPackageService.java

@@ -28,8 +28,8 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class UserPackageService {
 
-    private UserPackageRepo     userPackageRepo;
-    private UserPackageFlowRepo userPackageFlowRepo;
+    private final UserPackageRepo     userPackageRepo;
+    private final UserPackageFlowRepo userPackageFlowRepo;
 
     public Page<UserPackage> all(PageQuery pageQuery) {
         return userPackageRepo.findAll(JpaUtils.toSpecification(pageQuery, UserPackage.class), JpaUtils.toPageRequest(pageQuery));
@@ -73,6 +73,7 @@ public class UserPackageService {
         userPackageFlowRepo.save(UserPackageFlow.builder()
                 .userId(userId)
                 .type(FlowType.BUY)
+                .packageType(type)
                 .content(JSONObject.toJSONString(goodsDTOS))
                 .build());
     }

+ 0 - 5
src/main/java/com/izouma/jiashanxia/web/CompanyController.java

@@ -1,12 +1,9 @@
 package com.izouma.jiashanxia.web;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.dto.CompanyDTO;
-import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.repo.UserRepo;
-import com.izouma.jiashanxia.security.Authority;
 import com.izouma.jiashanxia.service.CompanyService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -22,8 +19,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 @RestController

+ 4 - 3
src/main/java/com/izouma/jiashanxia/web/UserPackageController.java

@@ -2,6 +2,7 @@ package com.izouma.jiashanxia.web;
 
 import com.izouma.jiashanxia.domain.UserPackage;
 import com.izouma.jiashanxia.dto.UserPackageDTO;
+import com.izouma.jiashanxia.enums.PackageType;
 import com.izouma.jiashanxia.service.UserPackageService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -22,8 +23,8 @@ import java.util.List;
 @RequestMapping("/userPackage")
 @AllArgsConstructor
 public class UserPackageController extends BaseController {
-    private UserPackageService userPackageService;
-    private UserPackageRepo    userPackageRepo;
+    private final UserPackageService userPackageService;
+    private final UserPackageRepo    userPackageRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -68,7 +69,7 @@ public class UserPackageController extends BaseController {
     @PreAuthorize("hasAnyRole('ADMIN','WRITER')")
     @GetMapping("/byUser")
     public List<UserPackageDTO> byUser(@RequestParam Long userId) {
-        return userPackageRepo.userPackage(userId);
+        return userPackageRepo.userPackageByType(userId, PackageType.TEAM.toString());
     }
 }
 

+ 2 - 2
src/main/java/com/izouma/jiashanxia/web/UserPackageFlowController.java

@@ -25,8 +25,8 @@ import java.util.List;
 @RequestMapping("/userPackageFlow")
 @AllArgsConstructor
 public class UserPackageFlowController extends BaseController {
-    private UserPackageFlowService userPackageFlowService;
-    private UserPackageFlowRepo    userPackageFlowRepo;
+    private final UserPackageFlowService userPackageFlowService;
+    private final UserPackageFlowRepo    userPackageFlowRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")

+ 2 - 2
src/main/vue/src/plugins/http.js

@@ -5,8 +5,8 @@ import qs from 'qs';
 let baseUrl = 'http://localhost:8080';
 switch (process.env.NODE_ENV) {
     case 'development':
-        // baseUrl = 'http://localhost:8080';
-        baseUrl = 'https://jiashanxia.izouma.com/';
+        baseUrl = 'http://localhost:8080';
+        // baseUrl = 'https://jiashanxia.izouma.com/';
         // baseUrl = 'http://192.168.50.127:8080';
         break;
     case 'test':

+ 9 - 0
src/main/vue/src/router.js

@@ -87,6 +87,15 @@ const router = new Router({
                         title: '员工列表'
                     }
                 },
+                {
+                    path: '/userPackageFlowList1',
+                    name: 'UserPackageFlowList1',
+                    component: () =>
+                        import(/* webpackChunkName: "userPackageFlowList1" */ '@/views/UserPackageFlowList1.vue'),
+                    meta: {
+                        title: '充值核销记录'
+                    }
+                },
                 {
                     path: '/userEdit',
                     name: 'userEdit',

+ 20 - 4
src/main/vue/src/views/CompanyEdit.vue

@@ -52,9 +52,15 @@
                     </el-table>
                 </div>
             </el-form-item>
-            <!--<el-form-item prop="amount" label="团队余额">
-                <el-input-number type="number" v-model="formData.amount"></el-input-number>
-            </el-form-item>-->
+            <el-form-item prop="amount" label="套餐剩余" v-if="$route.query.id">
+                <div class="subform">
+                    <el-table :data="userPackage">
+                        <el-table-column prop="name" label="名称"></el-table-column>
+                        <el-table-column prop="num" label="数量"></el-table-column>
+                        <el-table-column prop="unit" label="单位"></el-table-column>
+                    </el-table>
+                </div>
+            </el-form-item>
             <el-form-item>
                 <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                 <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除</el-button>
@@ -77,6 +83,15 @@ export default {
                         .then(res => {
                             this.formData = res;
                             this.getEmp(res);
+                            this.$http
+                                .get('userPackage/byUser', { userId: this.formData.userId })
+                                .then(res => {
+                                    this.userPackage = res;
+                                })
+                                .catch(e => {
+                                    console.log(e);
+                                    this.$message.error(e.error);
+                                });
                         })
                         .catch(e => {
                             console.log(e);
@@ -113,7 +128,8 @@ export default {
             users: [],
             emps: [],
             employeeId: '',
-            employeeIds: []
+            employeeIds: [],
+            userPackage: []
         };
     },
     methods: {

+ 11 - 2
src/main/vue/src/views/CompanyList.vue

@@ -30,10 +30,11 @@
             <el-table-column prop="name" label="企业名称"> </el-table-column>
             <el-table-column prop="amount" label="企业余额"> </el-table-column>
             <el-table-column prop="nickname" label="管理员"> </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+            <el-table-column label="操作" align="center" fixed="right" min-width="200">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button size="mini" @click="recharge(row)" type="warning" plain v-if="display">充值</el-button>
+                    <el-button size="mini" @click="handleCommand3(row.userId)">记录</el-button>
                     <el-button size="mini" @click="handleCommand(row.userId)">推广</el-button>
                     <el-button size="mini" @click="handleCommand1(row.id)">员工</el-button>
                     <el-button size="mini" @click="handleCommand2(row.id)">收益</el-button>
@@ -81,7 +82,7 @@
                 </el-form-item>
             </el-form>
             <div slot="footer">
-                <el-button type="primary" size="mini" @click="addCompany" :loading="saving">创建</el-button>
+                <el-button type="primary" size="mini" @click="addCompany" :loading="saving">充值</el-button>
             </div>
         </el-dialog>
     </div>
@@ -228,6 +229,14 @@ export default {
                 }
             });
         },
+        handleCommand3(id) {
+            this.$router.push({
+                path: '/userPackageFlowList1',
+                query: {
+                    id: id
+                }
+            });
+        },
         recharge(row) {
             this.userId = row.userId;
             this.packageId = '';

+ 4 - 4
src/main/vue/src/views/UserEdit.vue

@@ -26,12 +26,12 @@
             <el-form-item prop="phone" label="手机">
                 <el-input v-model="formData.phone"></el-input>
             </el-form-item>
-            <el-form-item prop="companyId" label="团队">
+            <!-- <el-form-item prop="companyId" label="团队">
                 <el-select v-model="formData.companyId" placeholder="请选择团队" clearable v-if="!formData.teamFounder">
                     <el-option v-for="item in companies" :key="item.id" :value="item.id" :label="item.name">
                     </el-option>
-                </el-select>
-                <!-- <el-button
+                </el-select> -->
+            <!-- <el-button
                     style="margin-left: 20px"
                     @click="showDialog = true"
                     v-if="!formData.teamFounder && id !== 0"
@@ -41,7 +41,7 @@
                 <el-button @click="showEmployee" v-if="formData.teamFounder">
                     我的团队
                 </el-button> -->
-            </el-form-item>
+            <!-- </el-form-item> -->
             <el-form-item prop="authorities" label="角色">
                 <el-select
                     v-model="formData.authorities"

+ 26 - 5
src/main/vue/src/views/UserPackageFlowEdit.vue

@@ -4,19 +4,20 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="80px"
+            label-width="90px"
             label-position="right"
             size="small"
             style="max-width: 500px;"
         >
-            <el-form-item prop="userId" label="被核销人">
+            <el-form-item prop="userId" label="昵称">
                 <el-input v-model="formData.nickname" readonly></el-input>
             </el-form-item>
-            <el-form-item prop="writeOffUserId" label="核销人">
+            <el-form-item prop="writeOffUserId" label="核销人" v-if="formData.type === 'WRITE_OFF'">
                 <el-input v-model="formData.writeOffNickname" readonly></el-input>
             </el-form-item>
-            <el-form-item prop="createdAt" label="核销时间">
+            <el-form-item prop="createdAt" label="时间">
                 <el-date-picker
+                    class="input1"
                     readonly
                     v-model="formData.createdAt"
                     type="datetime"
@@ -25,7 +26,24 @@
                 >
                 </el-date-picker>
             </el-form-item>
-            <el-form-item prop="content" label="核销内容">
+            <el-form-item prop="packageType" label="类型">
+                <el-select v-model="formData.packageType" class="input1">
+                    <el-option label="企业" value="TEAM" disabled></el-option>
+                    <el-option label="个人" value="PERSONAL" disabled></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="type" label="操作">
+                <el-select v-model="formData.type" class="input1">
+                    <el-option
+                        disabled
+                        v-for="item in typeOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    ></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="content" label="内容">
                 <div class="subform">
                     <el-table :data="formData.goods">
                         <el-table-column prop="name" label="商品名"></el-table-column>
@@ -127,4 +145,7 @@ export default {
     border: 1px solid #eee;
     margin-bottom: 10px;
 }
+.input1 {
+    width: 410px;
+}
 </style>

+ 20 - 2
src/main/vue/src/views/UserPackageFlowList.vue

@@ -27,8 +27,10 @@
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
             <el-table-column prop="user.nickname" label="被核销人"> </el-table-column>
             <el-table-column prop="writeOffUser.nickname" label="核销人"> </el-table-column>
+            <el-table-column prop="packageType" label="类型" show-overflow-tooltip :formatter="packageTypeFormatter">
+            </el-table-column>
             <el-table-column prop="createdAt" label="核销时间" show-overflow-tooltip> </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+            <el-table-column label="操作" align="center" fixed="right" min-width="100">
                 <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> -->
@@ -74,6 +76,10 @@ export default {
             typeOptions: [
                 { label: '购买', value: 'BUY' },
                 { label: '核销', value: 'WRITE_OFF' }
+            ],
+            packageTypeOptions: [
+                { label: '企业', value: 'TEAM' },
+                { label: '个人', value: 'PERSONAL' }
             ]
         };
     },
@@ -90,8 +96,20 @@ export default {
             }
             return '';
         },
+        packageTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.packageTypeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
         beforeGetData() {
-            return { search: this.search };
+            return {
+                search: this.search,
+                query: {
+                    type: 'WRITE_OFF'
+                }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 187 - 0
src/main/vue/src/views/UserPackageFlowList1.vue

@@ -0,0 +1,187 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <!-- <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> -->
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="user.nickname" label="昵称"> </el-table-column>
+            <!-- <el-table-column prop="writeOffUser.nickname" label="核销人"> </el-table-column> -->
+            <el-table-column prop="type" label="操作" :formatter="typeFormatter"></el-table-column>
+            <el-table-column prop="packageType" label="类型" show-overflow-tooltip :formatter="packageTypeFormatter">
+            </el-table-column>
+            <el-table-column prop="createdAt" label="核销时间" show-overflow-tooltip> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="100">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/userPackageFlow/writeOffAll',
+            downloading: false,
+            typeOptions: [
+                { label: '购买', value: 'BUY' },
+                { label: '核销', value: 'WRITE_OFF' }
+            ],
+            packageTypeOptions: [
+                { label: '企业', value: 'TEAM' },
+                { label: '个人', value: 'PERSONAL' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        packageTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.packageTypeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return {
+                search: this.search,
+                query: {
+                    packageType: 'TEAM',
+                    userId: this.$route.query.id
+                }
+            };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/userPackageFlowEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/userPackageFlowEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/userPackageFlow/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/userPackageFlow/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 7 - 0
src/test/java/com/izouma/jiashanxia/repo/UserPackageRepoTest.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.repo;
 
 import com.izouma.jiashanxia.dto.UserPackageDTO;
+import com.izouma.jiashanxia.enums.PackageType;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,4 +22,10 @@ public class UserPackageRepoTest {
         List<UserPackageDTO> dtos = userPackageRepo.userPackage(125L);
         dtos.forEach(System.out::println);
     }
+
+    @Test
+    public void test1() {
+        List<UserPackageDTO> dtos = userPackageRepo.userPackageByType(125L, PackageType.TEAM.toString());
+        dtos.forEach(System.out::println);
+    }
 }

+ 4 - 1
src/test/java/com/izouma/jiashanxia/service/UserPackageFlowServiceTest.java

@@ -3,6 +3,7 @@ package com.izouma.jiashanxia.service;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.UserPackageFlowVO;
 import com.izouma.jiashanxia.dto.WriteOffSaveVO;
+import com.izouma.jiashanxia.enums.PackageType;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,10 +28,12 @@ public class UserPackageFlowServiceTest {
 
     @Test
     public void test() {
+//        "userPackageId":577,
         userPackageFlowService.writeOff(WriteOffSaveVO.builder()
                 .userId(125L)
                 .writeOffUserId(1L)
-                .content("[{\"userPackageId\":577,\"goodsInfoId\":101,\"num\":1}]")
+                .content("[{\"goodsInfoId\":27,\"num\":1}]")
+                .type(PackageType.TEAM)
                 .build());
     }