Browse Source

商家热力图

licailing 5 years ago
parent
commit
7cbda90938

+ 21 - 0
src/main/java/com/izouma/dingdong/dto/HeatMapDTO.java

@@ -0,0 +1,21 @@
+package com.izouma.dingdong.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HeatMapDTO {
+
+    @ApiModelProperty(value = "数量", name = "count")
+    private Long count;
+
+    @ApiModelProperty(value = "经度", name = "longitude")
+    private Double longitude;
+
+    @ApiModelProperty(value = "纬度", name = "latitude")
+    private Double latitude;
+}

+ 1 - 0
src/main/java/com/izouma/dingdong/repo/BankCardRepo.java

@@ -17,4 +17,5 @@ public interface BankCardRepo extends JpaRepository<BankCard, Long>, JpaSpecific
 
     //按userId查找所有卡号
     List<BankCard> findAllByUserIdAndEnabledTrue(Long userId);
+
 }

+ 2 - 1
src/main/java/com/izouma/dingdong/repo/merchant/SalesRepo.java

@@ -23,7 +23,8 @@ public interface SalesRepo extends JpaRepository<Sales, Long>, JpaSpecificationE
     //找出时间段内销量
     List<Sales> findAllByGoodsIdAndDayBetween(Long goodsId, LocalDate start, LocalDate end);
 
-    //List<Sales> findAllByMerchantIdAndDayBetween(Long merchantId, LocalDate start, LocalDate end);
+    //时间段内商家的销量
+    List<Sales> findAllByMerchantIdAndDayBetween(Long merchantId, LocalDate start, LocalDate end);
 
     List<Sales> findAllByDay(LocalDate day);
 

+ 3 - 0
src/main/java/com/izouma/dingdong/service/backstage/VoiceService.java

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.service.backstage;
 
+import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.enums.Identity;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.UserRepo;
@@ -32,6 +33,8 @@ public class VoiceService {
         map.put("admin", admin);
 
         //总订单数
+        long order = orderInfoRepo.count();
+
         return map;
 
     }

+ 23 - 8
src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java

@@ -6,19 +6,19 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.izouma.dingdong.config.Constants;
 import com.izouma.dingdong.converter.LongArrayConverter;
+import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.Verified;
 import com.izouma.dingdong.domain.backstage.Category;
-import com.izouma.dingdong.domain.merchant.Goods;
-import com.izouma.dingdong.domain.merchant.Merchant;
-import com.izouma.dingdong.domain.merchant.MerchantClassification;
-import com.izouma.dingdong.domain.merchant.MerchantSettings;
+import com.izouma.dingdong.domain.merchant.*;
 import com.izouma.dingdong.domain.user.UserCoupon;
+import com.izouma.dingdong.dto.HeatMapDTO;
 import com.izouma.dingdong.dto.MerchantDTO;
 import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.enums.ApplyStatus;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.CouponRepo;
+import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.VerifiedRepo;
 import com.izouma.dingdong.repo.backstage.CategoryRepo;
@@ -37,6 +37,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.izouma.dingdong.web.BaseController.*;
 
@@ -49,11 +50,8 @@ public class MerchantService {
     private UserRepo                   userRepo;
     private MerchantClassificationRepo merchantClassificationRepo;
     private VerifiedRepo               verifiedRepo;
-    private FullReductionRepo          fullReductionRepo;
-    private CouponRepo                 couponRepo;
-    private UserCouponRepo             userCouponRepo;
     private CategoryRepo               categoryRepo;
-    private GoodsRepo                  goodsRepo;
+    private OrderInfoRepo              orderInfoRepo;
 
     /*
     商户注册申请
@@ -345,4 +343,21 @@ public class MerchantService {
         }
         return dtos;
     }
+
+    /*
+    返回商家热力图
+     */
+    public List<HeatMapDTO> heatMap(Double longitude, Double latitude) {
+        List<HeatMapDTO> list = new ArrayList<>();
+
+        Set<Merchant> merchantSet = new HashSet<>(merchantRepo.findAll());
+        Map<Merchant, Double> map = this.distanceSorting(merchantSet, longitude, latitude, 3000.0);
+        map.keySet().forEach(m -> {
+            long sum = orderInfoRepo.findAllByMerchantId(m.getId()).stream().mapToLong(OrderInfo::getId).count();
+            list.add(new HeatMapDTO(sum, longitude, latitude));
+        });
+
+        return list;
+
+    }
 }

+ 16 - 22
src/main/java/com/izouma/dingdong/service/merchant/SalesService.java

@@ -24,6 +24,8 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 @Service
 @AllArgsConstructor
@@ -227,29 +229,14 @@ public class SalesService {
                 .name("本日报表")
                 .build());
 
-        //月点赞数 差评数 销量
-        Integer monthLikes = 0;
-        Integer monthBad = 0;
-        Integer monthSales = 0;
-        //所有点赞数 差评数 销量
-        Integer allLikes = 0;
-        Integer allBad = 0;
-        Integer allSales = 0;
-
-        List<Sales> allDaySales = salesRepo.findAllByMerchantId(merchantId);
-        for (Sales s : allDaySales) {
-            if (s.getDay().isBefore(dateTime.toLocalDate())) {
-                monthSales += s.getDaySales();
-                monthLikes += s.getDayLikes();
-                monthBad += s.getDayBad();
-            }
-            allLikes += s.getDaySales();
-            allBad += s.getDayLikes();
-            allSales += s.getDayBad();
-        }
-
+        List<Sales> monthSale = salesRepo.findAllByMerchantIdAndDayBetween(merchantId, dateTime.toLocalDate(), nowDate);
+        Stream<Sales> stream = monthSale.stream();
+        int monthSales = stream.mapToInt(Sales::getDaySales).sum();
+        int monthBad = stream.mapToInt(Sales::getDayBad).sum();
+        int monthLikes = stream.mapToInt(Sales::getDayLikes).sum();
         //月收入
         BigDecimal monthIncome = moneyRecordService.income(userId, dateTime, nowDateTime);
+
         dtos.add(SalesDTO.builder()
                 .name("本月报表")
                 .bad(monthBad)
@@ -258,8 +245,15 @@ public class SalesService {
                 .income(monthIncome)
                 .build());
 
+
+        List<Sales> allDaySales = salesRepo.findAllByMerchantId(merchantId);
+        Stream<Sales> stream1 = allDaySales.stream();
+        int allSales = stream1.mapToInt(Sales::getDaySales).sum();
+        int allBad = stream1.mapToInt(Sales::getDayBad).sum();
+        int allLikes = stream1.mapToInt(Sales::getDayLikes).sum();
+
         //所有收入
-        LocalDateTime lastTime = LocalDateTime.of(2020, 7, 1, 0, 0, 0);
+        LocalDateTime lastTime = LocalDateTime.of(2020, 5, 1, 0, 0, 0);
         BigDecimal allIncome = moneyRecordService.income(userId, lastTime, nowDateTime);
         dtos.add(SalesDTO.builder()
                 .name("所有报表")

+ 2 - 5
src/main/java/com/izouma/dingdong/service/rider/DeliveryFeeService.java

@@ -65,18 +65,15 @@ public class DeliveryFeeService {
 
         //配送系数
         //骑手的商品数量
-        Double num = 0.0;
         //List<OrderGoodsSpec> orderGoodsSpecs = cart.getOrderGoodsSpecs();
-        for (OrderGoodsSpec o : orderGoodsSpecs) {
-            num = o.getNum() + num;
-        }
+        int num = orderGoodsSpecs.stream().mapToInt(OrderGoodsSpec::getNum).sum();
         //配送系数的配置
         DeliveryFee distributionFactor = deliveryFeeRepo.findAllByType(DeliveryType.NUMBER_OF_DELIVERY).get(0);
         //配送系数的配置值
         Integer factorRule = new Integer(distributionFactor.getRule());
         //配送系数
         //商品数是配送系数的几倍 每超出几件+1 向下取整
-        double factor = Math.floor(num / factorRule) + 1;
+        double factor = Math.floor((double) num / factorRule) + 1;
         //基础费用的倍数
 //        BigDecimal money = new BigDecimal(baseFee.getValue()).multiply(BigDecimal.valueOf(factor));
 

+ 9 - 11
src/main/java/com/izouma/dingdong/web/merchant/MerchantController.java

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.web.merchant;
 
+import com.izouma.dingdong.dto.HeatMapDTO;
 import com.izouma.dingdong.dto.MerchantDTO;
 import com.izouma.dingdong.service.merchant.MerchantSettingsService;
 import com.izouma.dingdong.utils.SecurityUtils;
@@ -28,8 +29,8 @@ import java.util.Map;
 @RequestMapping("/merchant")
 @AllArgsConstructor
 public class MerchantController extends BaseController {
-    private MerchantService merchantService;
-    private MerchantRepo merchantRepo;
+    private MerchantService         merchantService;
+    private MerchantRepo            merchantRepo;
     private MerchantSettingsService merchantSettingsService;
 
     //@PreAuthorize("hasRole('ADMIN')")
@@ -103,25 +104,22 @@ public class MerchantController extends BaseController {
         merchantService.closeMer(merchantId);
     }
 
-
-/*    @GetMapping("/showAll")
-    @ApiOperation("商家所有信息")
-    public Page<MerchantDTO> showAll(PageQuery pageQuery, Double longitude, Double latitude, String popularTag) {
-        List<MerchantDTO> list = merchantService.showAll(pageQuery, longitude, latitude, popularTag, SecurityUtils.getAuthenticatedUser().getId());
-        return new PageImpl<>(list, toPageRequest(pageQuery), list.size());
-    }*/
-
     @GetMapping("/timeTag")
     @ApiOperation("时间标签下的商户")
     public List<MerchantDTO> timeMer(Long timeTagId) {
         return merchantSettingsService.timeMerchant(timeTagId);
     }
 
-
     @GetMapping("/index")
     @ApiOperation("用户端首页部分信息")
     public Map<String, Object> index(Double longitude, Double latitude) {
         return merchantSettingsService.index(longitude, latitude);
     }
+
+    @GetMapping("/heatMap")
+    @ApiOperation("商家热力图")
+    public List<HeatMapDTO> heatMap(Double longitude, Double latitude) {
+        return merchantService.heatMap(longitude, latitude);
+    }
 }
 

+ 26 - 10
src/main/vue/src/widgets/Report.vue → src/main/vue/src/components/ReportDialog.vue

@@ -1,24 +1,26 @@
 <template>
-<!--    <el-dialog-->
-<!--            title="销售报表"-->
-<!--            center-->
-<!--            :visible.sync="dialogTable"-->
-<!--    >-->
+    <el-dialog title="报表" :visible.sync="show" center width="500px">
         <el-table :data="reports" ref="table">
-            <el-table-column prop="name" label="名称"></el-table-column>
+            <el-table-column prop="name" label="时间"></el-table-column>
             <el-table-column prop="likes" label="点赞数"></el-table-column>
             <el-table-column prop="bad" label="差评数"></el-table-column>
             <el-table-column prop="sale" label="销量"></el-table-column>
             <el-table-column prop="income" label="收入"></el-table-column>
 
         </el-table>
-<!--    </el-dialog>-->
+    </el-dialog>
 </template>
 
 <script>
     export default {
-        name: "Report",
+        name: "ReportDialog",
+        props: {
+            visible: {
+                required: true,
+            },
+        },
         created() {
+            this.show = this.visible;
             this.$http
                 .get('/sales/report', {
                     mid: this.$route.query.mid
@@ -32,12 +34,26 @@
         },
         data() {
             return {
-                // dialogTable: false,
-                reports: [],
+                show: false,
+                reports: [{
+                    name: '',
+                    like: '',
+                    bad: '',
+                    sale: '',
+                    income: ''
+                }],
             }
         },
         methods: {
 
+        },
+        watch: {
+            visible(val) {
+                this.show = val;
+            },
+            show(val) {
+                this.$emit("update:visible", val);
+            },
         }
     }
 </script>

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

@@ -512,14 +512,6 @@ const router = new Router({
                         title: '提现申请',
                     },
                 },
-                {
-                    path: '/report',
-                    name: 'Report',
-                    component: () => import(/* webpackChunkName: "withdrawApplyList" */ '@/widgets/Report.vue'),
-                    meta: {
-                        title: '报表',
-                    },
-                },
             ],
         },
         {

+ 2 - 2
src/main/vue/src/views/AppraisalList.vue

@@ -6,9 +6,9 @@
             <el-button @click="getData" type="primary" icon="el-icon-search"
                        class="filter-item">搜索
             </el-button>
-            <el-button @click="this.$router.go(-1)" type="primary" icon="el-icon-arrow-left"
+         <!--   <el-button @click="" type="primary" icon="el-icon-arrow-left"
                        class="filter-item">返回
-            </el-button>
+            </el-button>-->
 <!--            <el-button @click="download" type="primary" icon="el-icon-download"
                        :loading="downloading" class="filter-item">导出EXCEL
             </el-button>-->

+ 15 - 21
src/main/vue/src/views/merchant/MerchantList.vue

@@ -115,8 +115,10 @@
             <el-table-column label="操作" align="center" fixed="right" min-width="250">
                 <template slot-scope="{ row }">
                     <el-button @click="showDrawer(row)" type="success" size="mini" plain>详情</el-button>
-                    <el-button @click="onReport(row)" type="primary" size="mini" plain v-if="row.isPass">报表</el-button>
-                    <el-button @click="showAppraisal(row)" type="primary" size="mini" plain v-if="row.isPass">评价</el-button>
+                    <el-button @click="showReport(row)" type="primary" size="mini" plain v-if="row.isPass">报表
+                    </el-button>
+                    <el-button @click="showAppraisal(row)" type="primary" size="mini" plain v-if="row.isPass">评价
+                    </el-button>
                     <el-button
                             v-if="row.status === 'PENDING'"
                             :loading="row.loading"
@@ -214,6 +216,10 @@
             </div>
         </el-drawer>
 
+
+        <report-dialog :visible.sync="showReportDialog"
+                           v-model="formData"></report-dialog>
+
     </div>
 </template>
 <script>
@@ -224,11 +230,7 @@
     import format from "date-fns/format";
     import startOfDay from "date-fns/startOfDay";
     import endOfDay from "date-fns/endOfDay";
-    import {GridItem, GridLayout} from "vue-grid-layout";
-    import UserWidget from "../../widgets/UserWidget";
-    import LineChartWidget from "../../widgets/LineChartWidget";
-    import BarChartWidget from "../../widgets/BarChartWidget";
-    import PieChartWidget from "../../widgets/PieChartWidget";
+    import ReportDialog from '@/components/ReportDialog';
 
     export default {
         name: 'MerchantList',
@@ -247,11 +249,10 @@
                 }, {"label": "失败", "value": "DENY"}],
                 status: '',
                 drawer: false,
-                formData: {
-                },
+                formData: {},
                 dateRange: [],
                 verified: {},
-                dialogTable: false,
+                showReportDialog: false,
 
                 pickerOptions: {
                     shortcuts: [
@@ -306,17 +307,9 @@
             }
         },
         methods: {
-            showReport(){
-                this.dialogTable=true;
-
-            },
-            onReport(row) {
-                this.$router.push({
-                    path: "/report",
-                    query: {
-                        mid: row.mid
-                    }
-                });
+            showReport(row) {
+                this.showReportDialog = true;
+                this.$route.query.mid = row.mid;
             },
             picList(row) {
                 if (row) {
@@ -524,6 +517,7 @@
 
         },
         components: {
+            ReportDialog,
         }
     }
 </script>

+ 5 - 1
src/test/java/com/izouma/dingdong/service/MerchantServiceTest.java

@@ -86,7 +86,6 @@ public class MerchantServiceTest {
         double lon5 = 118.738041;
         double lat5 = 32.152372;
 
-
 /*        double radLat1 = lat3 * Math.PI / 180.0;
         double radLat2 = lat5 * Math.PI / 180.0;
         double a = radLat1 - radLat2;
@@ -181,4 +180,9 @@ public class MerchantServiceTest {
         System.out.println(merchantSettingsRepo.findById(190L).orElseThrow(new BusinessException("无商家")).getAutomaticOrder());
     }
 
+    @Test
+    public void test7(){
+        System.out.println(merchantService.heatMap(118.774621, 31.977269));
+    }
+
 }

+ 12 - 2
src/test/java/com/izouma/dingdong/service/RiderServiceTest.java

@@ -1,8 +1,10 @@
 package com.izouma.dingdong.service;
 
+import com.izouma.dingdong.domain.rider.Rider;
 import com.izouma.dingdong.dto.RiderDTO;
 import com.izouma.dingdong.repo.rider.RiderRepo;
 import com.izouma.dingdong.service.rider.RiderService;
+import com.izouma.dingdong.web.rider.RiderController;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -15,9 +17,9 @@ import org.springframework.test.context.junit4.SpringRunner;
 public class RiderServiceTest {
 
     @Autowired
-    private RiderService riderService;
+    private RiderService    riderService;
     @Autowired
-    private RiderRepo    riderRepo;
+    private RiderController riderController;
 
     @Test
     public void test() {
@@ -41,5 +43,13 @@ public class RiderServiceTest {
 //        System.out.println(riderRepo.findByUserId(151L).isPresent());
     }
 
+    @Test
+    public void test2() {
+        Rider rider = Rider.builder()
+                .newNews(false)
+                .userId(2105L)
+                .build();
+        System.out.println(riderController.save(rider));
+    }
 
 }