licailing пре 5 година
родитељ
комит
1c5b752df9
28 измењених фајлова са 470 додато и 367 уклоњено
  1. 6 4
      src/main/java/com/izouma/dingdong/domain/Chat.java
  2. 40 0
      src/main/java/com/izouma/dingdong/dto/ChatDTO.java
  3. 40 0
      src/main/java/com/izouma/dingdong/dto/MerchantComplaintDTO.java
  4. 29 3
      src/main/java/com/izouma/dingdong/service/ChatService.java
  5. 19 0
      src/main/java/com/izouma/dingdong/service/merchant/MerchantComplaintService.java
  6. 9 11
      src/main/java/com/izouma/dingdong/service/merchant/SalesService.java
  7. 2 0
      src/main/java/com/izouma/dingdong/service/sms/TencentSmsService.java
  8. 8 12
      src/main/java/com/izouma/dingdong/service/tencent/UserSigService.java
  9. 14 5
      src/main/java/com/izouma/dingdong/web/ChatController.java
  10. 16 3
      src/main/java/com/izouma/dingdong/web/merchant/MerchantComplaintController.java
  11. 2 10
      src/main/vue/src/router.js
  12. 2 2
      src/main/vue/src/views/ChatWordsList.vue
  13. 3 3
      src/main/vue/src/views/FastAppraisalList.vue
  14. 26 14
      src/main/vue/src/views/OrderInfoEdit.vue
  15. 3 3
      src/main/vue/src/views/OrderInfoList.vue
  16. 2 2
      src/main/vue/src/views/backstage/BackUserList.vue
  17. 38 30
      src/main/vue/src/views/merchant/MerchantComplaintEdit.vue
  18. 38 33
      src/main/vue/src/views/merchant/MerchantComplaintList.vue
  19. 14 37
      src/main/vue/src/views/merchant/MerchantEdit.vue
  20. 28 45
      src/main/vue/src/views/merchant/MerchantList.vue
  21. 0 88
      src/main/vue/src/views/merchant/MerchantNatureEdit.vue
  22. 70 17
      src/main/vue/src/views/merchant/MerchantNatureList.vue
  23. 10 7
      src/main/vue/src/views/merchant/VoiceList.vue
  24. 21 12
      src/main/vue/src/views/user/ComplaintEdit.vue
  25. 3 3
      src/main/vue/src/views/user/CooperateApplyList.vue
  26. 1 1
      src/test/java/com/izouma/dingdong/repo/ChatRepoTest.java
  27. 19 12
      src/test/java/com/izouma/dingdong/service/MerchantServiceTest.java
  28. 7 10
      src/test/java/com/izouma/dingdong/service/UserSigServiceTest.java

+ 6 - 4
src/main/java/com/izouma/dingdong/domain/Chat.java

@@ -29,13 +29,15 @@ public class Chat extends BaseEntity {
 
     private LocalDateTime sendTime;
 
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ApiModelProperty(value = "是否已读", name = "isRead")
+    private Boolean isRead;
+    /*@ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "sendUserId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     @JsonIgnore
-    private User sendUser;
+    private User sendUser;*/
 
-    @ManyToOne(fetch = FetchType.LAZY)
+    /*@ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "receiveUserId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     @JsonIgnore
-    private User receiveUser;
+    private User receiveUser;*/
 }

+ 40 - 0
src/main/java/com/izouma/dingdong/dto/ChatDTO.java

@@ -0,0 +1,40 @@
+package com.izouma.dingdong.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "聊天框")
+public class ChatDTO {
+
+    @ApiModelProperty(value = "发件人", name = "sendUserId")
+    private Long   sendUserId;
+
+    private String sendAvatar;
+
+    private String sendNickname;
+
+    @ApiModelProperty(value = "收件人", name = "receiveUserId")
+    private Long   receiveUserId;
+
+    private String receiveAvatar;
+
+    private String receiveNickname;
+
+    private String content;
+
+    private LocalDateTime sendTime;
+
+    @ApiModelProperty(value = "是否已读", name = "isRead")
+    private Boolean isRead;
+
+}

+ 40 - 0
src/main/java/com/izouma/dingdong/dto/MerchantComplaintDTO.java

@@ -0,0 +1,40 @@
+package com.izouma.dingdong.dto;
+
+import com.izouma.dingdong.domain.merchant.MerchantComplaint;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class MerchantComplaintDTO {
+//    @ApiModelProperty(value = "id", name = "id")
+//    private Long id;
+
+    @ApiModelProperty(value = "用户昵称", name = "userNickname")
+    private String userNickname;
+
+    @ApiModelProperty(value = "商家", name = "merShowName")
+    private String merShowName;
+
+//    @ApiModelProperty(value = "投诉类型", name = "type")
+//    private String type;
+//
+//    @ApiModelProperty(value = "图片", name = "img")
+//    private String img;
+//
+//    @ApiModelProperty(value = "具体内容", name = "content")
+//    private String content;
+//
+//    @ApiModelProperty(value = "投诉时间", name = "time")
+//    private LocalDateTime time;
+
+    private MerchantComplaint merchantComplaint;
+
+}

+ 29 - 3
src/main/java/com/izouma/dingdong/service/ChatService.java

@@ -2,7 +2,11 @@ package com.izouma.dingdong.service;
 
 import cn.hutool.core.collection.CollUtil;
 import com.izouma.dingdong.domain.Chat;
+import com.izouma.dingdong.domain.User;
+import com.izouma.dingdong.dto.ChatDTO;
+import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.ChatRepo;
+import com.izouma.dingdong.repo.UserRepo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -15,11 +19,12 @@ import java.util.stream.Collectors;
 public class ChatService {
 
     private ChatRepo chatRepo;
+    private UserRepo userRepo;
 
     /*
     我的聊天列表
      */
-    public List<Chat> my(Long userId) {
+    public List<ChatDTO> my(Long userId) {
         List<Chat> chats = chatRepo.findAllBySendUserIdOrReceiveUserId(userId, userId);
         //发送
         Set<Long> sends = chats.stream().map(Chat::getSendUserId).collect(Collectors.toSet());
@@ -40,12 +45,12 @@ public class ChatService {
     /*
     显示两个人之间的具体对话
      */
-    public List<Chat> showChat(Long userOne, Long userTwo) {
+    public List<ChatDTO> showChat(Long userOne, Long userTwo) {
         List<Chat> sendChats = chatRepo.findAllBySendUserIdAndReceiveUserId(userOne, userTwo);
         List<Chat> receiveChats = chatRepo.findAllBySendUserIdAndReceiveUserId(userTwo, userOne);
         sendChats.addAll(receiveChats);
         sendChats.sort((a, b) -> b.getId().compareTo(a.getId()));
-        return sendChats;
+        return sendChats.stream().map(this::toDto).collect(Collectors.toList());
     }
 
     /*
@@ -59,4 +64,25 @@ public class ChatService {
             }
         });
     }
+
+    /*
+    toDTO
+     */
+    public ChatDTO toDto(Chat chat) {
+        ChatDTO dto = ChatDTO.builder()
+                .content(chat.getContent())
+                .isRead(chat.getIsRead())
+                .receiveUserId(chat.getReceiveUserId())
+                .sendTime(chat.getSendTime())
+                .sendUserId(chat.getSendUserId())
+                .build();
+        User receive = userRepo.findById(chat.getReceiveUserId()).orElseThrow(new BusinessException("无用户"));
+        dto.setReceiveAvatar(receive.getAvatar());
+        dto.setReceiveNickname(receive.getNickname());
+
+        User send = userRepo.findById(chat.getSendUserId()).orElseThrow(new BusinessException("无用户"));
+        dto.setSendAvatar(send.getAvatar());
+        dto.setReceiveNickname(send.getNickname());
+        return dto;
+    }
 }

+ 19 - 0
src/main/java/com/izouma/dingdong/service/merchant/MerchantComplaintService.java

@@ -1,7 +1,14 @@
 package com.izouma.dingdong.service.merchant;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.izouma.dingdong.domain.User;
+import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.MerchantComplaint;
+import com.izouma.dingdong.dto.MerchantComplaintDTO;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.merchant.MerchantComplaintRepo;
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -10,5 +17,17 @@ import org.springframework.stereotype.Service;
 public class MerchantComplaintService {
 
     private MerchantComplaintRepo merchantComplaintRepo;
+    private MerchantRepo          merchantRepo;
+    private UserRepo              userRepo;
 
+    public MerchantComplaintDTO toDto(MerchantComplaint complaint) {
+        MerchantComplaintDTO dto = new MerchantComplaintDTO();
+        dto.setMerchantComplaint(complaint);
+        User user = userRepo.findById(complaint.getUserId()).orElseThrow(new BusinessException("无记录"));
+        dto.setUserNickname(user.getNickname());
+        Merchant merchant = merchantRepo.findById(complaint.getMerchantId()).orElseThrow(new BusinessException("无记录"));
+        dto.setMerShowName(merchant.getShowName());
+
+        return dto;
+    }
 }

+ 9 - 11
src/main/java/com/izouma/dingdong/service/merchant/SalesService.java

@@ -226,19 +226,18 @@ public class SalesService {
                 .likes(dayLikes)
                 .sale(daySales)
                 .income(dayIncome)
-                .name("本日报表")
+                .name("本日")
                 .build());
 
         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();
+        int monthSales = monthSale.stream().mapToInt(Sales::getDaySales).sum();
+        int monthBad = monthSale.stream().mapToInt(Sales::getDayBad).sum();
+        int monthLikes = monthSale.stream().mapToInt(Sales::getDayLikes).sum();
         //月收入
         BigDecimal monthIncome = moneyRecordService.income(userId, dateTime, nowDateTime);
 
         dtos.add(SalesDTO.builder()
-                .name("本月报表")
+                .name("本月")
                 .bad(monthBad)
                 .likes(monthLikes)
                 .sale(monthSales)
@@ -247,16 +246,15 @@ public class SalesService {
 
 
         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();
+        int allSales = allDaySales.stream().mapToInt(Sales::getDaySales).sum();
+        int allBad = allDaySales.stream().mapToInt(Sales::getDayBad).sum();
+        int allLikes = allDaySales.stream().mapToInt(Sales::getDayLikes).sum();
 
         //所有收入
         LocalDateTime lastTime = LocalDateTime.of(2020, 5, 1, 0, 0, 0);
         BigDecimal allIncome = moneyRecordService.income(userId, lastTime, nowDateTime);
         dtos.add(SalesDTO.builder()
-                .name("所有报表")
+                .name("所有")
                 .income(allIncome)
                 .sale(allSales)
                 .likes(allLikes)

+ 2 - 0
src/main/java/com/izouma/dingdong/service/sms/TencentSmsService.java

@@ -62,6 +62,8 @@ public class TencentSmsService {
 
             //发送请求
             SendSmsRequest req = SendSmsRequest.fromJsonString(params, SendSmsRequest.class);
+            //国际短信必传
+            req.setSenderId("Qcloud");
             //回调
             SendSmsResponse resp = client.SendSms(req);
             String s = SendSmsResponse.toJsonString(resp);

+ 8 - 12
src/main/java/com/izouma/dingdong/service/tencent/UserSigService.java

@@ -7,19 +7,15 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserSigService {
 
-//    @Value("$IMConfig.sdkAppId")
-//    private Long sdkAppId;
+    @Value("${IMConfig.sdkAppId}")
+    private Long sdkAppId;
 
-//    @Value("$IMConfig.secretKey")
-//    private String secretKey;
+    @Value("${IMConfig.secretKey}")
+    private String secretKey;
 
-    private Long expire = 604800L;
-
-    public String generateUserSig(String userId) {
-//        TLSSigAPIv2 api = new TLSSigAPIv2(sdkAppId, secretKey);
-
-//        return api.genSig(userId, expire);
-
-        return null;
+    public String generateUserSig(Long userId) {
+        TLSSigAPIv2 api = new TLSSigAPIv2(sdkAppId, secretKey);
+        long expire = 604800L;
+        return api.genSig(userId.toString(), expire);
     }
 }

+ 14 - 5
src/main/java/com/izouma/dingdong/web/ChatController.java

@@ -1,10 +1,12 @@
 package com.izouma.dingdong.web;
 
 import com.izouma.dingdong.domain.Chat;
+import com.izouma.dingdong.dto.ChatDTO;
 import com.izouma.dingdong.service.ChatService;
 import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.ChatRepo;
+import com.izouma.dingdong.service.tencent.UserSigService;
 import com.izouma.dingdong.utils.ObjUtils;
 import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
@@ -24,8 +26,9 @@ import java.util.List;
 @RequestMapping("/chat")
 @AllArgsConstructor
 public class ChatController extends BaseController {
-    private ChatService chatService;
-    private ChatRepo chatRepo;
+    private ChatService    chatService;
+    private ChatRepo       chatRepo;
+    private UserSigService userSigService;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -66,14 +69,20 @@ public class ChatController extends BaseController {
 
     @ApiOperation("显示个人聊天列表")
     @GetMapping("/my")
-    public List<Chat> my(){
+    public List<ChatDTO> my() {
         return chatService.my(SecurityUtils.getAuthenticatedUser().getId());
     }
 
     @ApiOperation("显示两个人的所有聊天内容")
     @GetMapping("/showChat")
-    public List<Chat> showChat(Long userOne, Long userTwo) {
-        return chatService.showChat(userOne,userTwo);
+    public List<ChatDTO> showChat(Long userOne, Long userTwo) {
+        return chatService.showChat(userOne, userTwo);
+    }
+
+    @ApiOperation("获得userSig")
+    @GetMapping("/getUserSig")
+    public String getUserSig(@RequestParam Long userId) {
+        return userSigService.generateUserSig(userId);
     }
 }
 

+ 16 - 3
src/main/java/com/izouma/dingdong/web/merchant/MerchantComplaintController.java

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.web.merchant;
 
+import com.izouma.dingdong.dto.MerchantComplaintDTO;
 import com.izouma.dingdong.web.BaseController;
 import com.izouma.dingdong.domain.merchant.MerchantComplaint;
 import com.izouma.dingdong.service.merchant.MerchantComplaintService;
@@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.time.LocalDateTime;
 import java.util.List;
 
 @RestController
@@ -23,16 +25,18 @@ import java.util.List;
 @AllArgsConstructor
 public class MerchantComplaintController extends BaseController {
     private MerchantComplaintService merchantComplaintService;
-    private MerchantComplaintRepo merchantComplaintRepo;
+    private MerchantComplaintRepo    merchantComplaintRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public MerchantComplaint save(@RequestBody MerchantComplaint record) {
         if (record.getId() != null) {
-            MerchantComplaint orig = merchantComplaintRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            MerchantComplaint orig = merchantComplaintRepo.findById(record.getId())
+                    .orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, record);
             return merchantComplaintRepo.save(orig);
         }
+        record.setTime(LocalDateTime.now());
         return merchantComplaintRepo.save(record);
     }
 
@@ -40,13 +44,22 @@ public class MerchantComplaintController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
     public Page<MerchantComplaint> all(PageQuery pageQuery) {
-        return merchantComplaintRepo.findAll(toSpecification(pageQuery,MerchantComplaint.class), toPageRequest(pageQuery));
+        return merchantComplaintRepo.findAll(toSpecification(pageQuery, MerchantComplaint.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/allDto")
+    public Page<MerchantComplaintDTO> allDto(PageQuery pageQuery) {
+        return all(pageQuery).map(merchantComplaintService::toDto);
     }
 
     @GetMapping("/get/{id}")
     public MerchantComplaint get(@PathVariable Long id) {
         return merchantComplaintRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
+    @GetMapping("/getDto/{id}")
+    public MerchantComplaintDTO getDto(@PathVariable Long id) {
+        return merchantComplaintService.toDto(merchantComplaintRepo.findById(id).orElseThrow(new BusinessException("无记录")));
+    }
 
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {

+ 2 - 10
src/main/vue/src/router.js

@@ -247,14 +247,6 @@ const router = new Router({
                        title: '时间类别',
                     },
                },
-                {
-                    path: '/merchantNatureEdit',
-                    name: 'MerchantNatureEdit',
-                    component: () => import(/* webpackChunkName: "merchantNatureEdit" */ '@/views/merchant/MerchantNatureEdit.vue'),
-                    meta: {
-                       title: '商家性质编辑',
-                    },
-                },
                 {
                     path: '/merchantNatureList',
                     name: 'MerchantNatureList',
@@ -426,7 +418,7 @@ const router = new Router({
                 {
                     path: '/merchantComplaintEdit',
                     name: 'MerchantComplaintEdit',
-                    component: () => import(/* webpackChunkName: "merchantComplaintEdit" */ '@/views/MerchantComplaintEdit.vue'),
+                    component: () => import(/* webpackChunkName: "merchantComplaintEdit" */ '@/views/merchant/MerchantComplaintEdit.vue'),
                     meta: {
                        title: '商家投诉表编辑',
                     },
@@ -434,7 +426,7 @@ const router = new Router({
                 {
                     path: '/merchantComplaintList',
                     name: 'MerchantComplaintList',
-                    component: () => import(/* webpackChunkName: "merchantComplaintList" */ '@/views/MerchantComplaintList.vue'),
+                    component: () => import(/* webpackChunkName: "merchantComplaintList" */ '@/views/merchant/MerchantComplaintList.vue'),
                     meta: {
                        title: '商家投诉表',
                     },

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

@@ -58,10 +58,10 @@
             </el-pagination>
         </div>
 
-        <el-dialog :visible.sync="showDialog" width="500px">
+        <el-dialog :visible.sync="showDialog" width="320px">
             <el-form :model="formData" :rules="rules" ref="form" label-width="52px" label-position="right" size="small">
                 <el-form-item prop="context" label="内容">
-                    <el-input v-model="formData.context"></el-input>
+                    <el-input v-model="formData.context" style="width: 192px"></el-input>
                 </el-form-item>
                 <el-form-item prop="type" label="类型">
                     <el-select v-model="formData.type"

+ 3 - 3
src/main/vue/src/views/FastAppraisalList.vue

@@ -55,13 +55,13 @@
             </el-pagination>
         </div>
 
-        <el-dialog :visible.sync="showDialog" width="560px">
+        <el-dialog :visible.sync="showDialog" width="320px">
             <el-form :model="formData" :rules="rules" ref="form" label-width="52px" label-position="right" size="small">
                 <el-form-item prop="content" label="内容">
-                    <el-input v-model="formData.content"></el-input>
+                    <el-input v-model="formData.content" style="width: 192px" ></el-input>
                 </el-form-item>
                 <el-form-item prop="type" label="类型">
-                    <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                    <el-select v-model="formData.type" filterable placeholder="请选择">
                         <el-option
                                 v-for="item in typeOptions"
                                 :key="item.value"

+ 26 - 14
src/main/vue/src/views/OrderInfoEdit.vue

@@ -28,11 +28,11 @@
                             :value="item.value">
                     </el-option>
                 </el-select>-->
-                <el-steps :active="number" >
-                    <el-step  title="未接单/已拒单" ></el-step>
-                    <el-step  title="已接单" ></el-step>
-                    <el-step title="已完成" ></el-step>
-                </el-steps>
+                    <el-steps :active="number" style="font-size: 10px">
+                        <el-step description="未接单/已拒单"></el-step>
+                        <el-step description="已接单"></el-step>
+                        <el-step description="已完成"></el-step>
+                    </el-steps>
             </el-form-item>
             <!--            <el-form-item prop="merchantAddress" label="商家地址">-->
             <!--                <el-input v-model="formData.merchantAddress"></el-input>-->
@@ -58,8 +58,8 @@
                             :value="item.value">
                     </el-option>
                 </el-select>-->
-                <el-steps :active="riderNumber" >
-                    <el-step v-for="item in riderStatusOptions" :key="item.value" :title="item.label" ></el-step>
+                <el-steps :active="riderNumber">
+                    <el-step v-for="item in riderStatusOptions" :key="item.value" :description="item.label"></el-step>
                 </el-steps>
             </el-form-item>
             <el-form-item prop="totalAmount" label="总价">
@@ -287,21 +287,33 @@
                     }
                 });
             },
-            active(){
+            active() {
                 let add = this.formData.userAddress.split(",");
                 this.address.name = add[0];
                 this.address.phone = add[1];
                 this.address.info = add[2];
 
                 switch (this.formData.merchantStatus) {
-                    case "RECEIVED":this.number = 2;break;
-                    case "CARRY_OUT":this.number = 3;break;
+                    case "RECEIVED":
+                        this.number = 2;
+                        break;
+                    case "CARRY_OUT":
+                        this.number = 3;
+                        break;
                 }
                 switch (this.formData.riderStatus) {
-                    case "RECEIVED":this.riderNumber = 2;break;
-                    case "TAKE_MEAL":this.riderNumber = 3;break;
-                    case "MEAL_DELIVERY":this.riderNumber = 4;break;
-                    case "CARRY_OUT":this.riderNumber = 5;break;
+                    case "RECEIVED":
+                        this.riderNumber = 2;
+                        break;
+                    case "TAKE_MEAL":
+                        this.riderNumber = 3;
+                        break;
+                    case "MEAL_DELIVERY":
+                        this.riderNumber = 4;
+                        break;
+                    case "CARRY_OUT":
+                        this.riderNumber = 5;
+                        break;
                 }
             }
         }

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

@@ -6,12 +6,12 @@
             <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"
+            <!--<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"
+            <!--<el-button @click="download" type="primary" icon="el-icon-download"
                        :loading="downloading" class="filter-item">导出EXCEL
-            </el-button>
+            </el-button>-->
 
             <el-select v-model="status" class="filter-item" placeholder="筛选状态" clearable filterable
                        @change="getData">

+ 2 - 2
src/main/vue/src/views/backstage/BackUserList.vue

@@ -9,9 +9,9 @@
             <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"
+            <!--<el-button @click="download" type="primary" icon="el-icon-download"
                 :loading="downloading" class="filter-item">导出EXCEL
-            </el-button>
+            </el-button>-->
         </div>
         <el-table :data="tableData" row-key="id" ref="table"
             height="tableHeight" header-row-class-name="table-header-row"

+ 38 - 30
src/main/vue/src/views/MerchantComplaintEdit.vue → src/main/vue/src/views/merchant/MerchantComplaintEdit.vue

@@ -2,35 +2,40 @@
     <div class="edit-view">
         <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
                  style="max-width: 500px;">
-                <el-form-item prop="userId" label="投诉用户">
-                            <el-input-number type="number" v-model="formData.userId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="merchantId" label="商家ID">
-                            <el-input-number type="number" v-model="formData.merchantId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="type" label="投诉类型">
-                            <el-input v-model="formData.type"></el-input>
-                </el-form-item>
-                <el-form-item prop="img" label="图片">
-                            <el-input v-model="formData.img"></el-input>
-                </el-form-item>
-                <el-form-item prop="content" label="具体内容">
-                            <el-input v-model="formData.content"></el-input>
-                </el-form-item>
-                <el-form-item prop="time" label="投诉时间">
-                            <el-date-picker
-                                    v-model="formData.time"
-                                    type="datetime"
-                                    value-format="yyyy-MM-dd HH:mm:ss"
-                                    placeholder="选择日期时间">
-                            </el-date-picker>
-                </el-form-item>
+            <el-form-item prop="userNickname" label="投诉用户">
+                <el-card shadow="hover" class="rt-card">{{formData.userNickname}}</el-card>
+            </el-form-item>
+            <el-form-item prop="merShowName" label="商家名称">
+                <!-- <el-input v-model="formData.merShowName"></el-input>-->
+                <el-card shadow="hover" class="rt-card">{{formData.merShowName}}</el-card>
+            </el-form-item>
+            <el-form-item prop="merchantComplaint.type" label="投诉类型">
+                <el-card shadow="hover" class="rt-card">{{formData.merchantComplaint.type}}</el-card>
+            </el-form-item>
+            <el-form-item prop="img" label="图片">
+                    <el-image style="width: 80px; height: 80px"
+                              :src="formData.merchantComplaint.img" fit="cover"
+                              :preview-src-list="[formData.merchantComplaint.img]"></el-image>
+            </el-form-item>
+            <el-form-item prop="content" label="具体内容">
+                <el-card class="rt-card" shadow="hover" >{{formData.merchantComplaint.content}}</el-card>
+            </el-form-item>
+            <el-form-item prop="time" label="投诉时间">
+                <!--<el-date-picker
+                        v-model="formData.merchantComplaint.time"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        placeholder="选择日期时间">
+                </el-date-picker>-->
+                <el-input v-model="formData.merchantComplaint.time" readonly></el-input>
+            </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 @click="onSave" :loading="saving"
+                           type="primary">保存
                 </el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.merchantComplaint.id">删除
+                </el-button>-->
                 <el-button @click="$router.go(-1)">取消</el-button>
             </el-form-item>
         </el-form>
@@ -42,7 +47,7 @@
         created() {
             if (this.$route.query.id) {
                 this.$http
-                    .get('merchantComplaint/get/'+this.$route.query.id)
+                    .get('merchantComplaint/getDto/' + this.$route.query.id)
                     .then(res => {
                         this.formData = res;
                     })
@@ -56,9 +61,9 @@
             return {
                 saving: false,
                 formData: {
+                    merchantComplaint:{}
                 },
-                rules: {
-                },
+                rules: {},
             }
         },
         methods: {
@@ -105,4 +110,7 @@
     }
 </script>
 <style lang="less" scoped>
+    .rt-card /deep/ .el-card__body {
+        padding: 3px 15px !important;
+    }
 </style>

+ 38 - 33
src/main/vue/src/views/MerchantComplaintList.vue → src/main/vue/src/views/merchant/MerchantComplaintList.vue

@@ -1,15 +1,15 @@
 <template>
-    <div  class="list-view">
+    <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"
+            <!--<el-button @click="addRow" type="primary" icon="el-icon-plus"
                        class="filter-item">添加
-            </el-button>
-                    </div>
+            </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"
@@ -18,35 +18,40 @@
             <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 prop="merchantComplaint.id" label="ID" width="100">
+            </el-table-column>
+            <el-table-column prop="userNickname" label="投诉用户"
+            >
+            </el-table-column>
+            <el-table-column prop="merShowName" label="商家名称"
+            >
+            </el-table-column>
+            <el-table-column prop="merchantComplaint.type" label="投诉类型"
+            >
+            </el-table-column>
+            <el-table-column label="图片"
+            >
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.merchantComplaint.img" fit="cover"
+                              :preview-src-list="[row.merchantComplaint.img]"></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="merchantComplaint.content" label="具体内容"
+            >
+            </el-table-column>
+            <el-table-column prop="merchantComplaint.time" label="投诉时间"
+                             :formatter="datetimeFormatter"
+            >
             </el-table-column>
-                    <el-table-column prop="userId" label="投诉用户"
->
-                    </el-table-column>
-                    <el-table-column prop="merchantId" label="商家ID"
->
-                    </el-table-column>
-                    <el-table-column prop="type" label="投诉类型"
->
-                    </el-table-column>
-                    <el-table-column prop="img" label="图片"
->
-                    </el-table-column>
-                    <el-table-column prop="content" label="具体内容"
->
-                    </el-table-column>
-                    <el-table-column prop="time" label="投诉时间"
-                            :formatter="datetimeFormatter"
->
-                    </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="deleteRow(row)" type="danger" 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>
         </el-table>
@@ -70,7 +75,7 @@
     </div>
 </template>
 <script>
-    import { mapState } from "vuex";
+    import {mapState} from "vuex";
     import pageableTable from "@/mixins/pageableTable";
 
     export default {
@@ -83,7 +88,7 @@
             return {
                 multipleMode: false,
                 search: "",
-                url: "/merchantComplaint/all",
+                url: "/merchantComplaint/allDto",
                 downloading: false,
             }
         },
@@ -95,7 +100,7 @@
         methods: {
             beforeGetData() {
                 if (this.search) {
-                    return { search: this.search };
+                    return {search: this.search};
                 }
             },
             toggleMultipleMode(multipleMode) {
@@ -108,7 +113,7 @@
                 this.$router.push({
                     path: "/merchantComplaintEdit",
                     query: {
-                    ...this.$route.query
+                        ...this.$route.query
                     }
                 });
             },
@@ -116,16 +121,16 @@
                 this.$router.push({
                     path: "/merchantComplaintEdit",
                     query: {
-                    id: row.id
+                        id: row.merchantComplaint.id
                     }
                 });
             },
             download() {
                 this.downloading = true;
                 this.$axios
-                    .get("/merchantComplaint/excel", { 
+                    .get("/merchantComplaint/excel", {
                         responseType: "blob",
-                        params: { size: 10000 }
+                        params: {size: 10000}
                     })
                     .then(res => {
                         console.log(res);

+ 14 - 37
src/main/vue/src/views/merchant/MerchantEdit.vue

@@ -14,8 +14,16 @@
             <el-form-item prop="showName" label="显示名称">
                 <el-input v-model="formData.showName" readonly></el-input>
             </el-form-item>
-            <el-form-item prop="introduction" label="简介">
-                <el-input type="textarea" v-model="formData.introduction" :rows="2" readonly></el-input>
+            <el-form-item prop="introduction" label="详细介绍">
+                <!--<el-input type="textarea" v-model="formData.introduction" :rows="2" readonly></el-input>-->
+                <el-card shadow="hover" class="rt-card">
+                    <div>显示:{{formData.name}}</div>
+                    <div>简介:{{formData.introduction==null?"无":formData.introduction}}</div>
+                    <div>公告:{{formData.proclamation==null?"无":formData.proclamation}}</div>
+                </el-card>
+            </el-form-item>
+            <el-form-item prop="phone" label="手机">
+                <el-input v-model="formData.phone" readonly></el-input>
             </el-form-item>
             <!--            <el-form-item prop="proclamation" label="公告">
                             <el-input type="textarea" v-model="formData.proclamation" :rows="2"></el-input>
@@ -29,9 +37,7 @@
             <!--            <el-form-item prop="address" label="地址">
                             <el-input v-model="formData.address"></el-input>
                         </el-form-item>-->
-            <el-form-item prop="phone" label="手机">
-                <el-input v-model="formData.phone" readonly></el-input>
-            </el-form-item>
+
             <!--            <el-form-item prop="password" label="密码">
                             <el-input v-model="formData.password" show-password></el-input>
                         </el-form-item>-->
@@ -130,22 +136,6 @@
             <el-form-item prop="buyAlliance" label="口碑联盟">
                 <el-switch v-model="formData.rated"></el-switch>
             </el-form-item>
-            <el-form-item label="实名信息">
-                <el-card>
-                    <div class="info-item">法人姓名:{{verified.realName}}</div>
-                    <div class="info-item">法人身份证:{{verified.idNo}}</div>
-                    <div class="info-item">身份证照片:
-                        <el-image style="width: 30px; height: 30px"
-                                  :src="picList(verified.idNoImg)[0]" fit="fit"
-                                  :preview-src-list="picList(verified.idNoImg)?picList(verified.idNoImg):[]"/>
-                    </div>
-                    <div class="info-item">手持身份证:
-                        <el-image style="width: 30px; height: 30px"
-                                  :src="verified.handheldIdNo" fit="fit"
-                                  :preview-src-list="[verified.handheldIdNo]"/>
-                    </div>
-                </el-card>
-            </el-form-item>
             <el-form-item>
                 <black-button></black-button>
                 <el-button @click="onSave" :loading="saving"
@@ -173,17 +163,6 @@
                         console.log(e);
                         this.$message.error(e.error);
                     });
-                this.$http
-                    .get('/verified/user', {
-                        userId: this.formData.userId
-                    })
-                    .then(res => {
-                        this.verified = res;
-                    })
-                    .catch(e => {
-                        console.log(e);
-                        this.$message.error(e.error);
-                    });
             }
         },
         data() {
@@ -195,7 +174,6 @@
                 },
                 rules: {},
                 category: [],
-                verified: {},
             }
         },
         methods: {
@@ -217,10 +195,6 @@
             },
             submit() {
                 let data = {...this.formData};
-                // data.img = data.img.join(",");
-                // data.qualification = data.qualification.join(",");
-                /*data.week = data.week.join(",")*/
-
                 this.saving = true;
                 this.$http
                     .post('/merchant/saveDTO', data, {body: 'json'})
@@ -255,4 +229,7 @@
     }
 </script>
 <style lang="less" scoped>
+    .rt-card /deep/ .el-card__body {
+        padding: 10px 15px !important;
+    }
 </style>

+ 28 - 45
src/main/vue/src/views/merchant/MerchantList.vue

@@ -6,9 +6,9 @@
             <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"
+            <!--<el-button @click="addRow" type="primary" icon="el-icon-plus"
                        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>-->
@@ -66,38 +66,17 @@
             <el-table-column prop="address" label="地址"
             >
             </el-table-column>
-            <!--<el-table-column prop="firstOrder" label="首单优惠"
-            >
-            </el-table-column>
-            <el-table-column prop="newUser" label="新用户优惠"
-            >
-            </el-table-column>-->
             <el-table-column prop="category" label="类别"
             >
                 <template slot-scope="{ row }">
                     <span v-for="item in row.category">{{ item.name }}</span>
                 </template>
             </el-table-column>
-            <!--            <el-table-column prop="tag" label="标签"
-                        >
-                        </el-table-column>-->
+
             <el-table-column prop="status" label="状态" :formatter="statusFormatter"
             >
             </el-table-column>
-            <!--            <el-table-column prop="startTime" label="营业时间"
-                        >
-                        </el-table-column>
-                        <el-table-column prop="endTime" label="结束时间"
-                        >
-                        </el-table-column>-->
-            <!--            <el-table-column prop="qualification" label="营业资质"
-                        >
-                            <template slot-scope="{row}">
-                                <el-image style="width: 30px; height: 30px"
-                                          :src="row.qual" fit="cover"
-                                          :preview-src-list="[row.qualifications]"></el-image>
-                            </template>
-                        </el-table-column>-->
+
             <el-table-column prop="merchantNature.name" label="营业性质"
             >
             </el-table-column>
@@ -165,52 +144,50 @@
                 :with-header="false">
             <div class="info-content">
                 <div class="info-item">
-                    Logo:
-                    <el-image style="width: 30px; height: 30px"
+                    Logo/banner
+                    <el-image style="width: 30px; height: 30px; margin-right: 8px""
                               :src="formData.logo" fit="cover"
                               :preview-src-list="[formData.logo]"/>
-                </div>
-                <div class="info-item">名称:{{formData.name}}</div>
-                <div class="info-item">显示名称:{{formData.showName}}</div>
-                <div class="info-item">横幅:
                     <el-image style="width: 60px; height: 30px"
                               :src="formData.banner" fit="cover"
                               :preview-src-list="[formData.banner]"/>
                 </div>
-                <div class="info-item">电话:{{formData.phone}}</div>
+                <div class="info-item">名称(显示名称):{{formData.name}}({{formData.showName}})</div>
                 <div class="info-item">简介:{{formData.introduction}}</div>
-                <div class="info-item">图片: {{formData.img}}
+                <div class="info-item">图片:
                     <el-image style="width: 30px; height: 30px"
                               :src="picList(formData.img)[0]" fit="fit"
                               :preview-src-list="picList(formData.img)?picList(formData.img):[]"/>
                 </div>
-                <div class="info-item">地址:{{formData.address}}</div>
+                <div class="info-item">电话地址:{{formData.phone}} / {{formData.address}}</div>
                 <div class="info-item">成立时间:{{formData.establishTime}}</div>
                 <div class="info-item">营业资质:
                     <el-image style="width: 30px; height: 30px"
-                              :src="formData.qualification" fit="fit"
-                              :preview-src-list="[formData.qualification]"/>
+                              :src="picList(formData.qualification)[0]" fit="fit"
+                              :preview-src-list="picList(formData.qualification)?picList(formData.qualification):[]"/>
                 </div>
                 <!--<div class="info-item">营业性质:{{formData.merchantNature.name}}</div>-->
                 <div class="info-item">公告:{{formData.proclamation}}</div>
-                <div class="info-item">经营品类:{{formData.category}}
+                <div class="info-item">经营品类:{{categoryNames}}
                 </div>
-                <div class="info-item">营业:{{formData.week}}</div>
+                <div class="info-item">营业日期:{{formData.week}}</div>
                 <div class="info-item">营业时间:{{formData.startTime}} - {{formData.endTime}}</div>
                 <el-divider></el-divider>
                 <div class="info-item">法人姓名:{{verified.realName}}</div>
-                <div class="info-item">法人身份证:{{verified.idNo}}</div>
-                <div class="info-item">身份证照片:
-                    <el-image style="width: 30px; height: 30px"
+                <div class="info-item">身份证:{{verified.idNo}}</div>
+                <div class="info-item">身份证照片/手持
+                    <el-image style="width: 40px; height: 40px; margin-right: 8px"
                               :src="picList(verified.idNoImg)[0]" fit="fit"
                               :preview-src-list="picList(verified.idNoImg)?picList(verified.idNoImg):[]"/>
+                    <el-image style="width: 40px; height: 40px"
+                              :src="verified.handheldIdNo" fit="fit"
+                              :preview-src-list="[verified.handheldIdNo]"/>
                 </div>
-                <div class="info-item">手持身份证:
+                <!--<div class="info-item">手持身份证:
                     <el-image style="width: 30px; height: 30px"
                               :src="verified.handheldIdNo" fit="fit"
                               :preview-src-list="[verified.handheldIdNo]"/>
-                </div>
-                <!--                <div class="info-item">申请状态:{{formData.status}}</div>-->
+                </div>-->
                 <el-button @click="editRow(formData)" type="primary" size="mini" plain>编辑</el-button>
                 <el-button @click="deleteRow(formData)" type="danger" size="mini" plain>删除</el-button>
             </div>
@@ -240,7 +217,6 @@
     import format from "date-fns/format";
     import startOfDay from "date-fns/startOfDay";
     import endOfDay from "date-fns/endOfDay";
-    import ReportDialog from '@/components/ReportDialog';
 
     export default {
         name: 'MerchantList',
@@ -264,6 +240,7 @@
                 verified: {},
                 showReportDialog: false,
                 reports: [],
+                categoryNames: "",
 
                 pickerOptions: {
                     shortcuts: [
@@ -346,6 +323,12 @@
                     .get('merchant/getDTO/' + row.mid)
                     .then(res => {
                         this.formData = res;
+                        this.categoryNames = "";
+                        let data = this.formData.category;
+                        for (let i in data) {
+                            this.categoryNames += data[i].name + " ";
+                        }
+
                     })
                     .catch(e => {
                         console.log(e);

+ 0 - 88
src/main/vue/src/views/merchant/MerchantNatureEdit.vue

@@ -1,88 +0,0 @@
-<template>
-    <div class="edit-view">
-        <el-form :model="formData" :rules="rules" ref="form" label-width="52px" label-position="right" size="small"
-                 style="max-width: 500px;">
-                <el-form-item prop="name" label="名称">
-                            <el-input v-model="formData.name"></el-input>
-                </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>
-                <el-button @click="$router.go(-1)">取消</el-button>
-            </el-form-item>
-        </el-form>
-    </div>
-</template>
-<script>
-    export default {
-        name: 'MerchantNatureEdit',
-        created() {
-            if (this.$route.query.id) {
-                this.$http
-                    .get('merchantNature/get/'+this.$route.query.id)
-                    .then(res => {
-                        this.formData = res;
-                    })
-                    .catch(e => {
-                        console.log(e);
-                        this.$message.error(e.error);
-                    });
-            }
-        },
-        data() {
-            return {
-                saving: false,
-                formData: {
-                },
-                rules: {
-                },
-            }
-        },
-        methods: {
-            onSave() {
-                this.$refs.form.validate((valid) => {
-                    if (valid) {
-                        this.submit();
-                    } else {
-                        return false;
-                    }
-                });
-            },
-            submit() {
-                let data = {...this.formData};
-
-                this.saving = true;
-                this.$http
-                    .post('/merchantNature/save', data, {body: 'json'})
-                    .then(res => {
-                        this.saving = false;
-                        this.$message.success('成功');
-                        this.$router.go(-1);
-                    })
-                    .catch(e => {
-                        console.log(e);
-                        this.saving = false;
-                        this.$message.error(e.error);
-                    });
-            },
-            onDelete() {
-                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
-                    return this.$http.post(`/merchantNature/del/${this.formData.id}`)
-                }).then(() => {
-                    this.$message.success('删除成功');
-                    this.$router.go(-1);
-                }).catch(e => {
-                    if (e !== 'cancel') {
-                        console.log(e);
-                        this.$message.error(e.error);
-                    }
-                })
-            },
-        }
-    }
-</script>
-<style lang="less" scoped>
-</style>

+ 70 - 17
src/main/vue/src/views/merchant/MerchantNatureList.vue

@@ -1,17 +1,17 @@
 <template>
-    <div  class="list-view">
+    <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"
+            <el-button @click="editRow()" type="primary" icon="el-icon-plus"
                        class="filter-item">添加
             </el-button>
-            <el-button @click="download" type="primary" icon="el-icon-download"
+            <!--<el-button @click="download" type="primary" icon="el-icon-download"
                        :loading="downloading" class="filter-item">导出EXCEL
-            </el-button>
+            </el-button>-->
         </div>
         <el-table :data="tableData" row-key="id" ref="table"
                   header-row-class-name="table-header-row"
@@ -21,11 +21,11 @@
             <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 prop="id" label="ID" >
+            </el-table-column>
+            <el-table-column prop="name" label="名称"
+            >
             </el-table-column>
-                                <el-table-column prop="name" label="名称"
->
-                    </el-table-column>
             <el-table-column
                     label="操作"
                     align="center"
@@ -54,10 +54,20 @@
             </el-pagination>
         </div>
 
+        <el-dialog :visible.sync="showDialog" width="320px">
+            <el-form :model="formData" :rules="rules" ref="form" label-width="52px" label-position="right" size="small">
+                <el-form-item prop="name" label="名称">
+                    <el-input v-model="formData.name" maxlength="10" show-word-limit></el-input>
+                </el-form-item>
+            </el-form>
+            <span slot="footer">
+                <el-button type="primary" size="mini" @click="save" :loading="saving">保存</el-button>
+            </span>
+        </el-dialog>
     </div>
 </template>
 <script>
-    import { mapState } from "vuex";
+    import {mapState} from "vuex";
     import pageableTable from "@/mixins/pageableTable";
 
     export default {
@@ -72,6 +82,16 @@
                 search: "",
                 url: "/merchantNature/all",
                 downloading: false,
+                showDialog: false,
+                saving: false,
+                formData: {
+                    name: ""
+                },
+                rules: {
+                    name: [
+                        {required: true, message: '请输入名称', trigger: 'blur'},
+                    ],
+                }
             }
         },
         computed: {
@@ -82,7 +102,7 @@
         methods: {
             beforeGetData() {
                 if (this.search) {
-                    return { search: this.search };
+                    return {search: this.search};
                 }
             },
             toggleMultipleMode(multipleMode) {
@@ -91,28 +111,28 @@
                     this.$refs.table.clearSelection();
                 }
             },
-            addRow() {
+            /*addRow() {
                 this.$router.push({
                     path: "/merchantNatureEdit",
                     query: {
-                    ...this.$route.query
+                        ...this.$route.query
                     }
                 });
-            },
-            editRow(row) {
+            },*/
+            /*editRow(row) {
                 this.$router.push({
                     path: "/merchantNatureEdit",
                     query: {
                     id: row.id
                     }
                 });
-            },
+            },*/
             download() {
                 this.downloading = true;
                 this.$axios
-                    .get("/merchantNature/excel", { 
+                    .get("/merchantNature/excel", {
                         responseType: "blob",
-                        params: { size: 10000 }
+                        params: {size: 10000}
                     })
                     .then(res => {
                         console.log(res);
@@ -157,6 +177,39 @@
                     }
                 })
             },
+            save() {
+                this.$refs.form.validate(valid => {
+                    if (valid) {
+                        let data = {...this.formData};
+                        this.saving = true;
+                        this.$http
+                            .post('/merchantNature/save', data, {body: 'json'})
+                            .then(res => {
+                                this.saving = false;
+                                this.$message.success('成功');
+                                this.showDialog = false;
+                                this.getData();
+                            })
+                            .catch(e => {
+                                console.log(e);
+                                this.saving = false;
+                                this.showDialog = false;
+                                this.$message.error(e.error);
+                            });
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            editRow(row) {
+                if (!row) {
+                    row = {
+                        name: '',
+                    };
+                }
+                this.formData = row;
+                this.showDialog = true;
+            },
         }
     }
 </script>

+ 10 - 7
src/main/vue/src/views/merchant/VoiceList.vue

@@ -29,32 +29,32 @@
             <el-table-column prop="url" label="中文文件"
             >
                 <template slot-scope="{row}">
-                    <video controls v-if="row.url!=null">
+                    <audio controls v-if="row.url!=null" class="audio-width">
                         <source :src="row.url" type="audio/mpeg">
-                    </video>
+                    </audio>
                 </template>
             </el-table-column>
             <el-table-column prop="enUrl" label="英文文件"
             >
                 <template slot-scope="{row}">
-                    <video controls v-if="row.enUrl!=null">
+                    <audio controls v-if="row.enUrl!=null" class="audio-width">
                         <source :src="row.enUrl" type="audio/mpeg">
-                    </video>
+                    </audio>
                 </template>
             </el-table-column>
             <el-table-column prop="thUrl" label="泰文文件"
             >
                 <template slot-scope="{row}">
-                    <video controls v-if="row.thUrl!=null">
+                    <audio controls v-if="row.thUrl!=null" class="audio-width">
                         <source :src="row.thUrl" type="audio/mpeg">
-                    </video>
+                    </audio>
                 </template>
             </el-table-column>
             <el-table-column
                     label="操作"
                     align="center"
                     fixed="right"
-                    min-width="150">
+                    min-width="120">
                 <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>
@@ -185,4 +185,7 @@
     }
 </script>
 <style lang="less" scoped>
+    .audio-width {
+        width: 160px;
+    }
 </style>

+ 21 - 12
src/main/vue/src/views/user/ComplaintEdit.vue

@@ -3,10 +3,11 @@
         <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
                  style="max-width: 500px;">
             <el-form-item prop="orderId" label="订单ID">
-                <el-input-number type="number" v-model="formData.orderId"></el-input-number>
+               <!-- <el-input-number type="number" v-model="formData.orderId"></el-input-number>-->
+                <el-button @click="showOrder">订单详情</el-button>
             </el-form-item>
             <el-form-item prop="target" label="投诉目标">
-                <el-select v-model="formData.target" clearable filterable placeholder="请选择">
+                <el-select v-model="formData.target" disabled>
                     <el-option disabled
                                v-for="item in targetOptions"
                                :key="item.value"
@@ -31,9 +32,6 @@
             <el-form-item prop="content" label="内容">
                 <el-input type="textarea" v-model="formData.content" readonly></el-input>
             </el-form-item>
-            <el-form-item prop="resolve" label="是否解决">
-                <el-switch v-model="formData.resolve"></el-switch>
-            </el-form-item>
             <el-form-item prop="time" label="投诉时间">
                 <!--     <el-date-picker
                              v-model="formData.time"
@@ -43,6 +41,9 @@
                      </el-date-picker>-->
                 <el-input v-model="formData.time" readonly></el-input>
             </el-form-item>
+            <el-form-item prop="resolve" label="是否解决">
+                <el-switch v-model="formData.resolve"></el-switch>
+            </el-form-item>
             <el-form-item prop="solution" label="解决方式">
                 <el-select v-model="formData.solution" clearable filterable placeholder="请选择">
                     <el-option
@@ -56,7 +57,7 @@
                            @click="showCoupon">发放优惠券
                 </el-button>
                 <el-button class="left" type="warning" v-if="formData.solution==='REFUND'" size="mini"
-                           @click="dislogForm=true">退款
+                           @click="dialogForm=true">退款
                 </el-button>
             </el-form-item>
             <el-form-item>
@@ -67,14 +68,14 @@
                            type="danger" v-if="formData.id">删除
                 </el-button>
 
-                <el-button @click="$router.go(-1)">取消</el-button>
+                <el-button @click="$router.go(-1)">返回</el-button>
             </el-form-item>
         </el-form>
 
         <el-dialog
                 title="优惠券列表"
                 center
-                :visible.sync="dislogTableCoupon"
+                :visible.sync="dialogTableCoupon"
         >
             <el-table :data="coupons" ref="table">
                 <el-table-column align="center" type="selection"
@@ -94,7 +95,7 @@
         <el-dialog
                 title="退款"
                 center
-                :visible.sync="dislogForm"
+                :visible.sync="dialogForm"
                 width="400px"
         >
             <el-form>
@@ -144,8 +145,8 @@
                     "label": "退款",
                     "value": "REFUND"
                 }, {"label": "发放优惠券", "value": "ISSUE_COUPONS"}],
-                dislogTableCoupon: false,
-                dislogForm: false,
+                dialogTableCoupon: false,
+                dialogForm: false,
                 coupons: [],
                 merchantLiability: '',
                 riderLiability: '',
@@ -154,6 +155,14 @@
             }
         },
         methods: {
+            showOrder() {
+                this.$router.push({
+                    path: "/orderInfoEdit",
+                    query: {
+                        id: this.formData.orderId
+                    }
+                });
+            },
             picList(row) {
                 if (row) {
                     return row.split(",");
@@ -225,7 +234,7 @@
                     });
             },
             showCoupon() {
-                this.dislogTableCoupon = true;
+                this.dialogTableCoupon = true;
                 this.$http
                     .get('/coupon/platform')
                     .then(res => {

+ 3 - 3
src/main/vue/src/views/user/CooperateApplyList.vue

@@ -42,11 +42,11 @@
             <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 prop="id" label="ID" width="100">
             </el-table-column>
             <el-table-column prop="userId" label="用户ID"
             >
-            </el-table-column>
+            </el-table-column>-->
             <el-table-column prop="type" label="类型" :formatter="typesFormatter"
             >
             </el-table-column>
@@ -68,7 +68,7 @@
             <el-table-column prop="remark" label="合作内容"
             >
             </el-table-column>
-            <el-table-column prop="isPass" label="是否已联系"
+            <el-table-column prop="isPass" label="已联系"
             >
                 <template slot-scope="{row}">
                     <el-tag :type="row.isPass?'':'info'">{{row.isPass!=null?row.isPass:false}}</el-tag>

+ 1 - 1
src/test/java/com/izouma/dingdong/repo/ChatRepoTest.java

@@ -27,7 +27,7 @@ public class ChatRepoTest {
         chats.addAll(cs);
         System.out.println(chats);
 
-        System.out.println(cs.get(0).getSendUser().getAvatar());
+//        System.out.println(cs.get(0).getSendUser().getAvatar());
     }
 
     @Test

+ 19 - 12
src/test/java/com/izouma/dingdong/service/MerchantServiceTest.java

@@ -1,10 +1,13 @@
 package com.izouma.dingdong.service;
 
+import com.izouma.dingdong.domain.merchant.MerchantComplaint;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
 import com.izouma.dingdong.dto.MerchantDTO;
 import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.merchant.MerchantComplaintRepo;
 import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
+import com.izouma.dingdong.service.merchant.MerchantComplaintService;
 import com.izouma.dingdong.service.merchant.MerchantService;
 import com.izouma.dingdong.service.merchant.MerchantSettingsService;
 import com.izouma.dingdong.utils.MapUtils;
@@ -30,13 +33,17 @@ import java.util.Map;
 public class MerchantServiceTest {
 
     @Autowired
-    private MerchantService         merchantService;
+    private MerchantService          merchantService;
     @Autowired
-    private MerchantController      merchantController;
+    private MerchantController       merchantController;
     @Autowired
-    private MerchantSettingsService merchantSettingsService;
+    private MerchantSettingsService  merchantSettingsService;
     @Autowired
-    private MerchantSettingsRepo    merchantSettingsRepo;
+    private MerchantSettingsRepo     merchantSettingsRepo;
+    @Autowired
+    private MerchantComplaintService merchantComplaintService;
+    @Autowired
+    private MerchantComplaintRepo    merchantComplaintRepo;
 
     @Test
     public void testChange() {
@@ -88,18 +95,15 @@ 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;
         double b = lon3 * Math.PI / 180.0 - lon5 * Math.PI / 180.0;
-
         double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                 Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
         s = s * 6378.137;
         s = Math.round(s * 1000);
         System.out.println(s);*/
-
         System.out.println(MapUtils.distance(lon3, lat3, lon5, lat5));
 //        System.out.println(MapUtils.distance(lon3, lat3, lon4, lat4));
 
@@ -119,7 +123,6 @@ public class MerchantServiceTest {
         pageQuery.setSort("");
         //118.738275 31.991961
         //List<MerchantDTO> list = merchantService.showAll(pageQuery, 1.0, 1.0, "首单立减", 82L);
-
         //System.out.println(list.size());
     }
 
@@ -132,7 +135,6 @@ public class MerchantServiceTest {
         pageQuery.setSort("");
         //118.738275 31.991961
         List<MerchantDTO> list = merchantSettingsService.showAll(pageQuery, 1.0, 1.0, 1L, 82L);
-
         System.out.println(list.size());
     }
 
@@ -140,13 +142,10 @@ public class MerchantServiceTest {
     public void testapi() {
         //LocalDateTime time = LocalDateTime.now().minusDays(7);
         LocalDate d = LocalDate.now().minusDays(7);
-
-
         LocalTime parse = LocalTime.parse("00:00:00");
         LocalDateTime of = LocalDateTime.of(d, parse);
         System.out.println(of);
         System.out.println(merchantRepo.findAllByEstablishTimeAfter(of).size());
-
         //System.out.println(TencentLocationUtils.distanceBetween(31.981746, 118.734661, 31.990671, 118.754795));
     }*/
 
@@ -195,4 +194,12 @@ public class MerchantServiceTest {
         System.out.println(merchantService.heatMap(118.774621, 31.977269));
     }
 
+    @Test
+    public void test8() {
+        long startTime = System.currentTimeMillis(); //获取开始时间
+        MerchantComplaint complaint = merchantComplaintRepo.findById(2041L).orElseThrow(new BusinessException("无记录"));
+        merchantComplaintService.toDto(complaint);//测试的代码段
+        long endTime = System.currentTimeMillis(); //获取结束时间
+        System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
+    }
 }

+ 7 - 10
src/test/java/com/izouma/dingdong/service/UserSigServiceTest.java

@@ -1,27 +1,25 @@
 package com.izouma.dingdong.service;
 
+import com.izouma.dingdong.service.tencent.UserSigService;
 import com.tencent.xinge.XingeApp;
 import com.tencent.xinge.bean.AudienceType;
 import com.tencent.xinge.bean.Message;
 import com.tencent.xinge.bean.MessageType;
 import com.tencent.xinge.push.app.PushAppRequest;
-import com.tencentyun.TLSSigAPIv2;
-import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.http.HttpResponse;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.HttpClient;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicNameValuePair;
 import org.json.JSONObject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.io.BufferedReader;
-import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -30,15 +28,14 @@ import java.util.*;
 @SpringBootTest
 @RunWith(SpringRunner.class)
 public class UserSigServiceTest {
-//    @Autowired
-//    private UserSigService userSigService;
+    @Autowired
+    private UserSigService userSigService;
 
     @Test
     public void test() {
-//        System.out.println(userSigService.generateUserSig("83"));
-        TLSSigAPIv2 api = new TLSSigAPIv2(1400375593, "7fe225c3b41cf2e7f0c79ebaf0e3b7ec60f6c7188e1561dcfddacb4767654417");
-
-        System.out.println(api.genSig("administrator", 30000));
+        System.out.println(userSigService.generateUserSig(83L));
+//        TLSSigAPIv2 api = new TLSSigAPIv2(1400375593, "7fe225c3b41cf2e7f0c79ebaf0e3b7ec60f6c7188e1561dcfddacb4767654417");
+//        System.out.println(api.genSig("82", 30000));
     }
 
     @Test