Ver código fonte

管理后台

licailing 5 anos atrás
pai
commit
242ef7e03a

+ 2 - 0
src/main/java/com/izouma/jiashanxia/dto/PackageGoodsDTO.java

@@ -7,6 +7,8 @@ public interface PackageGoodsDTO {
 
     Long getPackageId();
 
+    Long getGoodsInfoId();
+
     String getName();
 
     String getUnit();

+ 4 - 1
src/main/java/com/izouma/jiashanxia/repo/PackageGoodsRepo.java

@@ -19,7 +19,10 @@ public interface PackageGoodsRepo extends JpaRepository<PackageGoods, Long>, Jpa
     List<PackageGoods> findAllByPackageId(Long packageId);
 
     @Query(value = "select gi.name,gi.unit," +
-            "gi.id AS id," +
+            "gi.id AS goodsInfoId," +
+            "pg.id AS id,"+
+            "pg.package_id AS packageId,"+
+            "pg.remark AS remark,"+
             "ifnull(pg.num, 0) AS num ," +
             "ifnull(pg.num * gi.price, 0) AS price " +
             "from goods_info AS gi " +

+ 10 - 0
src/main/java/com/izouma/jiashanxia/repo/UserRepo.java

@@ -33,4 +33,14 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     long countByParentAndDelFalse(Long parentId);
 
     List<User> findAllByCompanyIdIsNullAndDelFalse();
+
+    @Transactional
+    @Modifying
+    @Query("update User u set u.companyId = null where u.id = ?1")
+    void deleteCompanyIdByUserId(Long id);
+
+    @Transactional
+    @Modifying
+    @Query("update User u set u.companyId = null where u.companyId = ?1")
+    void deleteCompanyId(Long companyId);
 }

+ 42 - 5
src/main/java/com/izouma/jiashanxia/service/CommissionRecordService.java

@@ -1,24 +1,33 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.CommissionRecord;
 import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.domain.Withdraw;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.repo.CommissionRecordRepo;
+import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.security.Authority;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Predicate;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
 public class CommissionRecordService {
 
     private CommissionRecordRepo commissionRecordRepo;
+    private WithdrawService      withdrawService;
+    private UserRepo             userRepo;
 
     public Page<CommissionRecord> all(PageQuery pageQuery) {
         pageQuery.setSort("createdAt,desc");
@@ -31,10 +40,38 @@ public class CommissionRecordService {
     public Page<CommissionRecord> backAll(PageQuery pageQuery, User user) {
         pageQuery.setSort("createdAt,desc");
         Set<Authority> authorities = user.getAuthorities();
-        if (!authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN)) && authorities.contains(Authority.get(AuthorityName.ROLE_CREATOR))) {
-            Map<String, Object> query = pageQuery.getQuery();
-            query.put("userId", user.getId());
-        }
-        return commissionRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, CommissionRecord.class), JpaUtils.toPageRequest(pageQuery));
+        Map<String, Object> query = pageQuery.getQuery();
+        Object company = query.get("companyId");
+        query.remove("companyId");
+
+//        if (!authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN)) && authorities.contains(Authority.get(AuthorityName.ROLE_CREATOR))) {
+//            Map<String, Object> query = pageQuery.getQuery();
+//            query.put("userId", user.getId());
+//        }
+        //return commissionRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, CommissionRecord.class), JpaUtils.toPageRequest(pageQuery));
+
+        return commissionRecordRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, CommissionRecord.class, root, criteriaQuery, criteriaBuilder);
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
+            }
+            if (!authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN))) {
+                List<Long> userIds = userRepo.findAllByCompanyIdAndDelFalse(user.getCompanyId())
+                        .stream()
+                        .map(User::getId)
+                        .collect(Collectors.toList());
+                and.add(root.get("userId").in(userIds));
+            } else {
+                if (ObjectUtil.isNotEmpty(company)) {
+                    List<Long> userIds = userRepo.findAllByCompanyIdAndDelFalse(Long.parseLong(String.valueOf(company)))
+                            .stream()
+                            .map(User::getId)
+                            .collect(Collectors.toList());
+                    and.add(root.get("userId").in(userIds));
+                }
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+
     }
 }

+ 38 - 4
src/main/java/com/izouma/jiashanxia/service/CompanyService.java

@@ -1,6 +1,5 @@
 package com.izouma.jiashanxia.service;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.User;
@@ -15,9 +14,12 @@ import com.izouma.jiashanxia.utils.ObjUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -101,10 +103,25 @@ public class CompanyService {
                 this.teamFounder(record.getUserId(), creator, record.getId());
             }
             ObjUtils.merge(orig, record);
+            // 现在的员工列表
             List<Long> employee = record.getEmployee();
-            // 员工加入团队
-            if (CollUtil.isNotEmpty(employee)) {
-                this.batchEmployee(record.getEmployee(), record.getId());
+            // 原来的员工列表
+            List<User> users = userRepo.findAllByCompanyIdAndDelFalse(record.getId());
+            Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, user -> user));
+            Set<Long> oldEmployee = new HashSet<>(userMap.keySet());
+            // 如果旧员工被移除
+            oldEmployee.removeAll(employee);
+            if (ObjectUtil.isNotEmpty(oldEmployee)) {
+                oldEmployee.forEach(yee -> {
+                    User user = userMap.get(yee);
+                    user.setCompanyId(null);
+                    userRepo.save(user);
+                });
+            }
+            // 新员工加入团队
+            employee.removeAll(userMap.keySet());
+            if (ObjectUtil.isNotEmpty(employee)) {
+                this.batchEmployee(employee, record.getId());
             }
             return companyRepo.save(orig);
         }
@@ -130,4 +147,21 @@ public class CompanyService {
         }
     }
 
+    /*
+    删除企业
+     */
+    public void del(Long id) {
+        companyRepo.findById(id).ifPresent(company -> {
+            userRepo.findById(company.getUserId()).ifPresent(user -> {
+                user.setCompanyId(null);
+                user.setTeamFounder(null);
+                Set<Authority> authorities = user.getAuthorities();
+                authorities.remove(Authority.get(AuthorityName.ROLE_CREATOR));
+                userRepo.save(user);
+            });
+            userRepo.deleteCompanyId(id);
+        });
+        companyRepo.softDelete(id);
+    }
+
 }

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

@@ -206,6 +206,7 @@ public class UserService {
         User user = userRepo.findById(SecurityUtils.getAuthenticatedUser().getId())
                 .orElseThrow(new BusinessException("用户不存在"));
         user.setPhone(phoneNoInfo.getPhoneNumber());
+        user.setUsername(phoneNoInfo.getPhoneNumber());
         return userRepo.save(user);
     }
 

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

@@ -2,6 +2,9 @@ package com.izouma.jiashanxia.web;
 
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.User;
+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;
@@ -17,6 +20,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/company")
@@ -24,6 +29,7 @@ import java.util.List;
 public class CompanyController extends BaseController {
     private CompanyService companyService;
     private CompanyRepo    companyRepo;
+    private UserRepo       userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -39,12 +45,17 @@ public class CompanyController extends BaseController {
 
     @GetMapping("/get/{id}")
     public Company get(@PathVariable Long id) {
-        return companyRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        Company company = companyRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        company.setEmployee(userRepo.findAllByCompanyIdAndDelFalse(id)
+                .stream()
+                .map(User::getId)
+                .collect(Collectors.toList()));
+        return company;
     }
 
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {
-        companyRepo.softDelete(id);
+        companyService.del(id);
     }
 
     @GetMapping("/excel")

+ 1 - 0
src/main/vue/src/components/PackageGoodsTable.vue

@@ -117,6 +117,7 @@ export default {
                 };
             }
             this.formData = { ...row };
+            console.log(this.formData);
             this.showDialog = true;
         },
         download() {

+ 3 - 1
src/main/vue/src/views/CommissionRecordList.vue

@@ -123,7 +123,9 @@ export default {
                 sort: 'createdAt,desc',
                 search: this.search,
                 query: {
-                    transactionType: this.transactionType
+                    transactionType: this.transactionType,
+                    companyId: this.$route.query.id,
+                    del: false
                 }
             };
         },

+ 11 - 6
src/main/vue/src/views/CompanyEdit.vue

@@ -28,14 +28,15 @@
                     </el-select>
                 </div>
             </el-form-item>
-            <el-form-item prop="emps" label="员工">
+            <el-form-item prop="employee" label="员工">
                 <div class="subform">
-                    <el-select v-model="emps" style="width: 360px" filterable clearable multiple>
+                    <el-select v-model="formData.employee" style="width: 360px" filterable multiple>
                         <el-option v-for="item in users" :key="item.id" :value="item.id" :label="item.nickname">
                             <span style="float: left">{{ item.nickname }}</span>
                             <span style="float: right; color: #8492a6; font-size: 13px">{{ item.phone }}</span>
                         </el-option>
                     </el-select>
+                    <span v-for="item in formData.employee" :key="item">{{ item }}</span>
                 </div>
             </el-form-item>
             <!--<el-form-item prop="amount" label="团队余额">
@@ -88,9 +89,13 @@ export default {
         return {
             saving: false,
             formData: {
-                userId: ''
+                userId: '',
+                employee: []
+            },
+            rules: {
+                name: [{ required: true, message: '请输入公司名', trigger: 'blur' }],
+                userId: [{ required: true, message: '请选择管理员', trigger: 'blur' }]
             },
-            rules: {},
             users: [],
             emps: []
         };
@@ -107,7 +112,7 @@ export default {
         },
         submit() {
             let data = { ...this.formData };
-            data.emplyee = this.emps;
+            // data.employee = this.emps;
 
             this.saving = true;
             this.$http
@@ -140,7 +145,7 @@ export default {
                 });
         },
         chooseAdmin(id) {
-            this.user = this.users.find(item => {
+            this.emps = this.users.find(item => {
                 return item.id === id;
             });
         }

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

@@ -33,6 +33,7 @@
                     <el-button size="mini" @click="showDialog = true" type="warning" plain>充值</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>
                     <!--<el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
                 </template>
             </el-table-column>
@@ -60,7 +61,7 @@
         </div>
 
         <el-dialog :visible.sync="showDialog" width="500px" title="选择套餐">
-            <el-form label-width="80px" label-position="right" size="small">
+            <el-form label-width="80px" label-position="right" size="small" :rules="rules">
                 <el-form-item prop="packageId" label="套餐">
                     <el-select v-model="packageId" style="margin-bottom: 10px;width: 300px" placeholder="请选择套餐">
                         <el-option v-for="item in packages" :key="item.id" :value="item.id" :label="item.name" />
@@ -101,7 +102,10 @@ export default {
             showDialog: false,
             num: 1,
             userId: '',
-            saving: false
+            saving: false,
+            rules: {
+                packageId: [{ required: true, message: '请选择套餐', trigger: 'blur' }]
+            }
         };
     },
     created() {
@@ -210,6 +214,14 @@ export default {
                 }
             });
         },
+        handleCommand2(id) {
+            this.$router.push({
+                path: '/CommissionRecordList',
+                query: {
+                    id: id
+                }
+            });
+        },
         recharge(row) {
             this.userId = row.userId;
             this.packageId = '';

+ 3 - 2
src/main/vue/src/views/OrderInfoList.vue

@@ -48,7 +48,7 @@
             <!--<el-table-column prop="setId" label="充值套餐"> </el-table-column>-->
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <!-- <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>
@@ -97,7 +97,8 @@ export default {
             statusOptions: [
                 { label: '未支付', value: 'UNPAID' },
                 { label: '已支付', value: 'PAID' },
-                { label: '已取消', value: 'CANCELLED' }
+                { label: '已取消', value: 'CANCELLED' },
+                { label: '线下支付', value: 'OFFLINE_PAID' }
             ],
             status: [],
             packageId: '',

+ 8 - 3
src/main/vue/src/views/UserPackageFlowEdit.vue

@@ -19,11 +19,12 @@
                 <!--<el-input v-model="formData.content"></el-input>-->
                 <div v-for="item in formData.goods" :key="item.name">
                     <el-col :span="16">
-                        <el-input v-model="item.name"></el-input>
+                        <el-input v-model="item.name" class="input-content"></el-input>
                     </el-col>
                     <el-col :span="8">
-                        <el-input v-model="item.num"></el-input>
+                        <el-input v-model="item.num" class="input-content"></el-input>
                     </el-col>
+                    <!-- <span>{{ item.name }}</span> -->
                 </div>
             </el-form-item>
             <el-form-item prop="createdAt" label="核销时间">
@@ -118,4 +119,8 @@ export default {
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.input-content {
+    margin: 5px 10px 5px 0;
+}
+</style>

+ 11 - 7
src/main/vue/src/views/WithdrawEdit.vue

@@ -10,10 +10,10 @@
             style="max-width: 500px;"
         >
             <el-form-item prop="userId" label="用户ID">
-                <el-input v-model="formData.user.nickname"></el-input>
+                <el-input v-model="formData.user.nickname" readonly></el-input>
             </el-form-item>
             <el-form-item prop="amount" label="提现金额">
-                <el-input-number type="number" v-model="formData.amount"></el-input-number>
+                <el-input-number type="number" v-model="formData.amount" disabled></el-input-number>
             </el-form-item>
             <el-form-item prop="auditTime" label="审核时间">
                 <el-date-picker
@@ -25,7 +25,7 @@
                 </el-date-picker>
             </el-form-item>
             <el-form-item prop="payMethod" label="提现方式">
-                <el-select v-model="formData.payMethod" clearable filterable placeholder="请选择">
+                <el-select v-model="formData.payMethod" placeholder="请选择" disabled class="disabled-color">
                     <el-option
                         v-for="item in payMethodOptions"
                         :key="item.value"
@@ -36,16 +36,16 @@
                 </el-select>
             </el-form-item>
             <el-form-item prop="status" label="提现状态">
-                <el-select v-model="formData.status" clearable filterable placeholder="请选择">
+                <el-select v-model="formData.status" placeholder="请选择" disabled>
                     <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
                     </el-option>
                 </el-select>
             </el-form-item>
             <el-form-item prop="account" label="账号">
-                <el-input v-model="formData.account"></el-input>
+                <el-input v-model="formData.account" readonly></el-input>
             </el-form-item>
             <el-form-item prop="realName" label="真实姓名">
-                <el-input v-model="formData.realName"></el-input>
+                <el-input v-model="formData.realName" readonly></el-input>
             </el-form-item>
             <el-form-item>
                 <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
@@ -135,4 +135,8 @@ export default {
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.disabled-color {
+    color: #000;
+}
+</style>

+ 5 - 3
src/main/vue/src/views/WithdrawList.vue

@@ -12,7 +12,7 @@
                 class="filter-item"
                 >导出EXCEL
             </el-button>
-            <el-select v-model="status" multiple clearable @change="getData">
+            <el-select v-model="status" multiple clearable @change="getData" placeholder="请选择提现状态">
                 <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
                 </el-option>
             </el-select>
@@ -35,10 +35,11 @@
             <el-table-column prop="status" label="提现状态" :formatter="statusFormatter"> </el-table-column>
             <el-table-column prop="account" label="账号"> </el-table-column>
             <el-table-column prop="realName" label="真实姓名"> </el-table-column>
+            <el-table-column prop="createdAt" label="申请时间" show-overflow-tooltip> </el-table-column>
             <el-table-column prop="auditTime" label="审核时间" show-overflow-tooltip> </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" min-width="200">
+            <el-table-column label="操作" align="left" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <!-- <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button> -->
                     <el-button
                         v-if="row.status === 'PENDING'"
                         :loading="row.loading"
@@ -134,6 +135,7 @@ export default {
         },
         beforeGetData() {
             return {
+                sort: 'createdAt,desc',
                 search: this.search,
                 query: {
                     status: this.status

+ 1 - 1
src/main/vue/src/widgets/RecentOrder.vue

@@ -42,7 +42,7 @@ export default {
                         labels: res.map(i => i.date),
                         datasets: [
                             {
-                                label: '销售额',
+                                label: '订单数',
                                 data: res.map(i => i.dayOrder),
                                 backgroundColor: 'rgba(54, 162, 235, 0.2)',
                                 borderColor: 'rgba(54, 162, 235, 1)',

+ 16 - 1
src/test/java/com/izouma/jiashanxia/service/UserServiceTest.java

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.collection.CollUtil;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -11,6 +12,9 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.data.domain.Page;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.ArrayList;
+import java.util.List;
+
 
 @SpringBootTest
 @RunWith(SpringRunner.class)
@@ -35,7 +39,18 @@ public class UserServiceTest {
 
     @Test
     public void test2() {
-        System.out.println(userService.overview(102L));
+//        System.out.println(userService.overview(102L));
 //        System.out.println(1 * 0.01);
+        List<Integer> newList = CollUtil.newArrayList(1,2,3,4,5,6,7);
+//        List<Integer> newList1= new ArrayList<>(newList);
+        List<Integer> oldList = CollUtil.newArrayList(4,5,6,7,8,9,10);
+        List<Integer> oldList1= new ArrayList<>(oldList);
+        System.out.println(oldList.removeAll(newList));
+        System.out.println(newList);
+        System.out.println(oldList);
+        System.out.println("----------");
+        System.out.println(newList.removeAll(oldList1));
+        System.out.println(newList);
+        System.out.println(oldList1);
     }
 }

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

@@ -18,7 +18,7 @@ public class WithdrawServiceTest {
 
     @Test
     public void apply() {
-        System.out.println(withdrawService.apply(40L, new BigDecimal("100"), PayMethod.WEIXIN, "xxx", "xxx"));
+        System.out.println(withdrawService.apply(2L, new BigDecimal("10"), PayMethod.WEIXIN, "xxx", "xxx"));
     }
 
     @Test