Explorar el Código

拜访计划、商机、客户、联系人相关接口

zhouyy hace 5 meses
padre
commit
acffd8fdfd
Se han modificado 27 ficheros con 929 adiciones y 153 borrados
  1. 18 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  2. 14 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java
  3. 39 30
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/VisitPlanController.java
  4. 20 9
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java
  5. 16 9
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Custom.java
  6. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysDict.java
  7. 5 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/VisitPlan.java
  8. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/UserCommonModuleVO.java
  9. 45 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/VisitPlanDetailVO.java
  10. 10 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/VisitPlanVO.java
  11. 7 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/BusinessOpportunityMapper.java
  12. 7 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/CustomMapper.java
  13. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/VisitPlanMapper.java
  14. 6 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessOpportunityService.java
  15. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CustomService.java
  16. 5 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/VisitPlanService.java
  17. 51 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessOpportunityServiceImpl.java
  18. 48 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java
  19. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserCommonModuleServiceImpl.java
  20. 151 64
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java
  21. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  22. 26 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanDelayHandler.java
  23. 137 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanInit.java
  24. 117 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusinessOpportunityMapper.xml
  25. 170 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/CustomMapper.xml
  26. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserCommonModuleMapper.xml
  27. 21 5
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/VisitPlanMapper.xml

+ 18 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java

@@ -9,22 +9,23 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
-import com.management.platform.service.*;
+import com.management.platform.service.BusinessOpportunityService;
+import com.management.platform.service.StageService;
+import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.service.impl.ExcelExportServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -65,6 +66,8 @@ public class BusinessOpportunityController {
     private BusinessOpportunityMapper businessOpportunityMapper;
     @Resource
     private ActionLogMapper actionLogMapper;
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
 
     @RequestMapping("getAll")
     public Object getAll(HttpServletRequest request) {
@@ -410,6 +413,17 @@ public class BusinessOpportunityController {
 
     }
 
+
+    @PostMapping("/listByPin")
+    public HttpRespMsg listByPin(BusinessOpportunity bo, HttpServletRequest request) {
+        return businessOpportunityService.listByPin(bo,request);
+    }
+
+    @PostMapping("/pinBusinessOpportunity")
+    public HttpRespMsg pinBusinessOpportunity(BusinessOpportunity bo, HttpServletRequest request) {
+        return businessOpportunityService.pinBusinessOpportunity(bo,request);
+    }
+
     @RequestMapping("getAllByStage")
     public Object getAllByStage(BusinessOpportunity bo,HttpServletRequest request) {
         User user = userMapper.selectById(request.getHeader("Token"));

+ 14 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java

@@ -5,9 +5,11 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
-import com.management.platform.mapper.*;
+import com.management.platform.mapper.CustomMapper;
+import com.management.platform.mapper.SysDictMapper;
+import com.management.platform.mapper.SysFormMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ContactsService;
 import com.management.platform.service.CustomService;
 import com.management.platform.service.WxCorpInfoService;
@@ -15,8 +17,8 @@ import com.management.platform.service.impl.ExcelExportServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -65,6 +67,15 @@ public class CustomController {
         return customService.getList(custom, request);
     }
 
+    @PostMapping("/listByPin")
+    public HttpRespMsg listByPin(Custom custom, HttpServletRequest request) {
+        return customService.listByPin(custom, request);
+    }
+
+    @PostMapping("/pinCustom")
+    public HttpRespMsg pinCustom(Custom custom, HttpServletRequest request) {
+        return customService.pinCutom(custom,request);
+    }
 
     @RequestMapping("getAllCustom")
     public HttpRespMsg getAllCustom(HttpServletRequest request) {

+ 39 - 30
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/VisitPlanController.java

@@ -2,16 +2,16 @@ package com.management.platform.controller;
 
 import com.management.platform.entity.VisitPlan;
 import com.management.platform.service.VisitPlanService;
+import com.management.platform.time.VisitPlanDelayHandler;
+import com.management.platform.time.VisitPlanDelayItem;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
+import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/visitPlan")
@@ -34,30 +34,30 @@ public class VisitPlanController {
      * @param request
      * @return
      */
-    @PostMapping("/addVisitPlan")
-    public HttpRespMsg addVisitPlan(
+    @PostMapping("/addOrUpdateVisitPlan")
+    public HttpRespMsg addOrUpdateVisitPlan(
+            @RequestParam(value = "planId",required = false) Long planId,
             @RequestParam("planName") String planName,
             @RequestParam("customId") Integer customId,
-            @RequestParam("customName") String customName,
             @RequestParam("inchargerId") String inchargerId,
             @RequestParam("visitGoal") Integer visitGoal,
             @RequestParam("visitTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")Date visitTime,
             @RequestParam("remark") String remark,
             @RequestParam("remindType") Integer remindType,
-            @RequestParam(value = "remindTime",required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date remindTime
-            , HttpServletRequest request) {
+            @RequestParam(value = "remindTime",required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date remindTime,
+            HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         VisitPlan visitPlan = new VisitPlan();
+        visitPlan.setId(planId);
         visitPlan.setPlanName(planName);
         visitPlan.setCustomId(customId);
-        visitPlan.setCustomName(customName);
         visitPlan.setInchargerId(inchargerId);
         visitPlan.setVisitGoal(visitGoal);
         visitPlan.setVisitTime(visitTime);
         visitPlan.setRemark(remark);
         visitPlan.setRemindType(remindType);
         visitPlan.setRemindTime(remindTime);
-        httpRespMsg = visitPlanService.addVisitPlan(visitPlan,request);
+        httpRespMsg = visitPlanService.addOrUpdateVisitPlan(visitPlan,request);
 
         return httpRespMsg;
     }
@@ -114,31 +114,40 @@ public class VisitPlanController {
      * @param request
      * @return
      */
-    @PostMapping("/getPageVisitPlan")
-    public HttpRespMsg getPageVisitPlan(@RequestParam(value = "pageIndex",required = false) Integer pageIndex
+    @PostMapping("/getVisitPlanList")
+    public HttpRespMsg getVisitPlan(@RequestParam(value = "pageIndex",required = false) Integer pageIndex
             , @RequestParam(value = "pageSize",required = false) Integer pageSize
             ,@RequestParam("calenderDate")String calenderDate
             ,HttpServletRequest request){
         HttpRespMsg httpRespMsg = new HttpRespMsg();
-        httpRespMsg = visitPlanService.getPageVisitPlan(pageIndex,pageSize,calenderDate,request);
+        httpRespMsg = visitPlanService.getVisitPlanList(pageIndex,pageSize,calenderDate,request);
         return httpRespMsg;
     }
 
+    @PostMapping("/getVisitPlanDetail")
+    public HttpRespMsg getVisitPlan(@RequestParam("planId")Long planId
+            ,HttpServletRequest request){
+        return visitPlanService.getVisitPlanDetail(planId,request);
+    }
+
+
+
 
-//    @GetMapping("/getDelayQueue")
-//    public HttpRespMsg getDelayQueue(HttpServletRequest request) {
-//        HttpRespMsg httpRespMsg = new HttpRespMsg();
-//        VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
-//        httpRespMsg.setData(tool.getAll());
-//        Object[] all =  tool.getAll();
-//        for (Object obj : all) {
-//            VisitPlanDelayItem item = (VisitPlanDelayItem) obj;
-//            long delay = item.getDelay(TimeUnit.SECONDS);
-//            System.out.println("item== "+item.getVisitPlan().getPlanName()
-//                    +",delayTime=== "+item.getDelayTime()
-//            +",delay=== "+delay
-//            );
-//        }
-//        return httpRespMsg;
-//    }
+
+    @GetMapping("/getDelayQueue")
+    public HttpRespMsg getDelayQueue(HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
+        httpRespMsg.setData(tool.getAll());
+        Object[] all =  tool.getAll();
+        for (Object obj : all) {
+            VisitPlanDelayItem item = (VisitPlanDelayItem) obj;
+            long delay = item.getDelay(TimeUnit.SECONDS);
+            System.out.println("item== "+item.getVisitPlan().getPlanName()
+                    +",delayTime=== "+item.getDelayTime()
+            +",delay=== "+delay
+            );
+        }
+        return httpRespMsg;
+    }
 }

+ 20 - 9
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java

@@ -1,22 +1,21 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-
-import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.List;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
 /**
  * <p>
  * 
@@ -181,6 +180,18 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
      */
     @TableField("plate5")
     private String plate5;
+
+    /**是否需要置顶 0/Flase 1/True*/
+    @TableField("need_pin")
+    private Boolean needPin;
+
+    /**被置顶时间*/
+    @TableField("pin_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date pinTime;
+
+
 //    @JsonDeserialize(using = BusinessItemProductListDeserializer.class)
     @TableField(exist = false)
     private String businessItemProductList;

+ 16 - 9
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Custom.java

@@ -1,21 +1,19 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-
-import java.time.LocalDateTime;
-
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
 /**
  * <p>
  *
@@ -235,6 +233,15 @@ public class Custom extends Model<Custom> {
     @TableField("close_deal")
     private Integer closeDeal;
 
+    /**是否需要置顶 0/Flase 1/True*/
+    @TableField("need_pin")
+    private Boolean needPin;
+
+    /**被置顶时间*/
+    @TableField("pin_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date pinTime;
 
     @TableField(exist = false)
     private String ids;

+ 3 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysDict.java

@@ -66,7 +66,7 @@ public class SysDict extends Model<SysDict> {
         return this.id;
     }
 
-    public static final String[] TYPE_LIST=new String[]{"ClueSources","CustomLevel","CustomIndustry","CustomSources","BusinessStage","ProductType","ProductUnit","OrderType","ContractType"};
+    public static final String[] TYPE_LIST=new String[]{"ClueSources","CustomLevel","CustomIndustry","CustomSources","BusinessStage","ProductType","ProductUnit","OrderType","ContractType","RemindType"};
 
     public static List<Map<String,Object>> getSysDictList(){
         List<Map<String,Object>> itemList=new ArrayList<>();
@@ -92,6 +92,8 @@ public class SysDict extends Model<SysDict> {
                     break;
                 case "ContractType":map.put("name","合同类型");
                     break;
+                case "RemindType":map.put("name","提醒类型");
+                    break;
             }
             itemList.add(map);
         }

+ 5 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/VisitPlan.java

@@ -29,6 +29,9 @@ public class VisitPlan extends Model<VisitPlan> {
     /**客户名称*/
     @TableField(value = "custom_name")
     private String customName;
+    /**公司表id*/
+    @TableField(value = "company_id")
+    private Integer companyId;
     /**负责人id(user表)*/
     @TableField(value = "incharger_id")
     private String inchargerId;
@@ -38,7 +41,7 @@ public class VisitPlan extends Model<VisitPlan> {
     /**拜访时间*/
     @TableField(value = "visit_time")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
     private Date visitTime;
     /**备注*/
     @TableField(value = "remark")
@@ -49,7 +52,7 @@ public class VisitPlan extends Model<VisitPlan> {
     /**提醒时间[自定义时间时再填充]*/
     @TableField(value = "remind_time")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date remindTime;
 
     /**是否达到提醒时间 0未到 1已到 2不需要提醒*/

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/UserCommonModuleVO.java

@@ -6,4 +6,5 @@ import lombok.Data;
 public class UserCommonModuleVO {
     private Integer moduleId;
     private String moduleName;
+    private String path;
 }

+ 45 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/VisitPlanDetailVO.java

@@ -0,0 +1,45 @@
+package com.management.platform.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.management.platform.entity.Contacts;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class VisitPlanDetailVO {
+    private Long id;
+    private String planName;
+    private Integer customId;
+    private String customName;
+    private String inchargerId;
+    /**负责人名称(user表)*/
+    private String inchargerName;
+    /**拜访目的 字典表id*/
+    private Integer visitGoal;
+    private String visitGoalName;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
+    private Date visitTime;
+    /**备注*/
+    private String remark;
+    /**提醒类型 字典表id,对应字典项name类型名称 ex1时间[秒]*/
+    private Integer remindType;
+    private String remindTypeName;
+    /**提醒时间[自定义时间时再填充]*/
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date remindTime;
+    /**是否达到提醒时间 0未到 1已到 2不需要提醒*/
+    private Integer remindState;
+    /**完成状态 0未完成 1已完成*/
+    private Integer finishState;
+
+    /**客户电话*/
+    private String telPhone;
+
+    /**联系人*/
+    private List<Contacts> contacts;
+}

+ 10 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/VisitPlanVO.java

@@ -8,26 +8,33 @@ import java.util.Date;
 
 @Data
 public class VisitPlanVO {
+    private Long id;
     private String planName;
+    private Integer customId;
     private String customName;
+    private String inchargerId;
     /**负责人名称(user表)*/
     private String inchargerName;
     /**拜访目的 字典表id*/
     private Integer visitGoal;
-//    private String visitGoalText;
+    private String visitGoalName;
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
     private Date visitTime;
     /**备注*/
     private String remark;
     /**提醒类型 字典表id,对应字典项name类型名称 ex1时间[秒]*/
     private Integer remindType;
+    private String remindTypeName;
     /**提醒时间[自定义时间时再填充]*/
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date remindTime;
     /**是否达到提醒时间 0未到 1已到 2不需要提醒*/
     private Integer remindState;
     /**完成状态 0未完成 1已完成*/
     private Integer finishState;
+
+    /**客户电话*/
+    private String telPhone;
 }

+ 7 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/BusinessOpportunityMapper.java

@@ -1,11 +1,9 @@
 package com.management.platform.mapper;
 
-import com.management.platform.entity.BusinessOpportunity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.BusinessOpportunity;
 import com.management.platform.entity.User;
-import com.management.platform.util.HttpRespMsg;
 import org.apache.ibatis.annotations.Param;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
@@ -43,4 +41,10 @@ public interface BusinessOpportunityMapper extends BaseMapper<BusinessOpportunit
     List<BusinessOpportunity> getAllList1(User user);
 
     List<BusinessOpportunity> getAllList2(User user);
+
+    List<BusinessOpportunity> selectAllListByPin(BusinessOpportunity bo);
+
+    List<BusinessOpportunity> selectAllList1ByPin(@Param("bo") BusinessOpportunity bo, @Param("userId")String userId);
+
+    List<BusinessOpportunity> selectAllList2ByPin(@Param("bo") BusinessOpportunity bo, @Param("userId")String userId);
 }

+ 7 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/CustomMapper.java

@@ -1,9 +1,7 @@
 package com.management.platform.mapper;
 
-import com.management.platform.entity.Clue;
-import com.management.platform.entity.Custom;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.management.platform.util.HttpRespMsg;
+import com.management.platform.entity.Custom;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -34,4 +32,10 @@ public interface CustomMapper extends BaseMapper<Custom> {
     Custom getInfo(Integer id);
 
     Map<String, Object> getDataSummary(Integer companyId, String startDate, String endDate, String userId,@Param("list") List<String> targetUserIds);
+
+    List<Custom> getListByPin(Custom custom);
+
+    List<Custom> getList1ByPin(Custom custom);
+
+    List<Custom> getList2ByPin(Custom custom);
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/VisitPlanMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.management.platform.entity.VisitPlan;
 import com.management.platform.entity.dto.QueryVisitPlanDTO;
+import com.management.platform.entity.vo.VisitPlanDetailVO;
 import com.management.platform.entity.vo.VisitPlanVO;
 import org.apache.ibatis.annotations.Param;
 
@@ -13,4 +14,6 @@ public interface VisitPlanMapper extends BaseMapper<VisitPlan> {
     IPage<VisitPlanVO> getPageVisitPlan(IPage<VisitPlan> page, @Param("query") QueryVisitPlanDTO query);
 
     List<VisitPlanVO> getListVisitPlan(@Param("query")QueryVisitPlanDTO query);
+
+    VisitPlanDetailVO getDetail(@Param("planId") Long planId);
 }

+ 6 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessOpportunityService.java

@@ -1,9 +1,10 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.*;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.BusinessOpportunity;
+import com.management.platform.entity.UploadFile;
+import com.management.platform.entity.User;
 import com.management.platform.util.HttpRespMsg;
-import org.apache.ibatis.annotations.Param;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -68,4 +69,7 @@ public interface BusinessOpportunityService extends IService<BusinessOpportunity
 
     void saveStage(BusinessOpportunity bo, User user);
 
+    HttpRespMsg listByPin(BusinessOpportunity bo, HttpServletRequest request);
+
+    HttpRespMsg pinBusinessOpportunity(BusinessOpportunity bo, HttpServletRequest request);
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CustomService.java

@@ -61,4 +61,7 @@ public interface CustomService extends IService<Custom> {
 
     HttpRespMsg importData(MultipartFile multipartFile);
 
+    HttpRespMsg listByPin(Custom custom, HttpServletRequest request);
+
+    HttpRespMsg pinCutom(Custom custom, HttpServletRequest request);
 }

+ 5 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/VisitPlanService.java

@@ -8,7 +8,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
 
 public interface VisitPlanService extends IService<VisitPlan> {
-    HttpRespMsg addVisitPlan(VisitPlan visitPlan, HttpServletRequest request);
+    HttpRespMsg addOrUpdateVisitPlan(VisitPlan visitPlan, HttpServletRequest request);
 
     HttpRespMsg finishVisitPlan(Long planId, HttpServletRequest request);
 
@@ -16,5 +16,8 @@ public interface VisitPlanService extends IService<VisitPlan> {
 
     HttpRespMsg delVisitPlan(Long planId, HttpServletRequest request);
 
-    HttpRespMsg getPageVisitPlan(Integer pageIndex, Integer pageSize, String calenderDate, HttpServletRequest request);
+    HttpRespMsg getVisitPlanList(Integer pageIndex, Integer pageSize, String calenderDate, HttpServletRequest request);
+
+    HttpRespMsg getVisitPlanDetail(Long planId, HttpServletRequest request);
+
 }

+ 51 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessOpportunityServiceImpl.java

@@ -3,15 +3,15 @@ package com.management.platform.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.BusinessOpportunityService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.FileUtil;
@@ -38,11 +38,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
-import java.text.SimpleDateFormat;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -91,6 +87,11 @@ public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportun
     @Resource
     private StageMapper stageMapper;
 
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Autowired
+    private BusinessOpportunityMapper businessOpportunityMapper;
+
     @Override
     public List<BusinessOpportunity> getAll(BusinessOpportunity bo) {
         return bOMapper.selectAllList(bo);
@@ -743,6 +744,49 @@ public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportun
         actionLogMapper.insert(al);
     }
 
+    @Override
+    public HttpRespMsg listByPin(BusinessOpportunity bo, HttpServletRequest request) {
+        HashMap<Object, Object> r = new HashMap<>();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setIsDelete(0);
+        bo.setCompanyId(user.getCompanyId());
+        bo.setUserId(user.getId());
+        bo.setEndTime(bo.getEndTime() + " 23:59:59");
+        bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        int i = 0;
+        if (isAll) {
+            list = bOMapper.selectAllListByPin(bo);
+            i = bOMapper.getTotal(bo);
+        } else if (isNotAll) {
+            list = bOMapper.selectAllList1ByPin(bo, user.getId());
+            i = bOMapper.getTotal1(bo, user.getId());
+        } else {
+            list = bOMapper.selectAllList2ByPin(bo, user.getId());
+            i = bOMapper.getTotal2(bo, user.getId());
+        }
+        r.put("data", list);
+        r.put("total",i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(r);
+        return msg;
+
+    }
+
+    @Override
+    public HttpRespMsg pinBusinessOpportunity(BusinessOpportunity bo, HttpServletRequest request) {
+        HttpRespMsg respMsg = new HttpRespMsg();
+//        User user = userMapper.selectById(request.getHeader("Token"));
+        businessOpportunityMapper.update(null,new LambdaUpdateWrapper<BusinessOpportunity>()
+                .set(BusinessOpportunity::getNeedPin,1)
+                .set(BusinessOpportunity::getPinTime,new Date())
+                .eq(BusinessOpportunity::getId,bo.getId())
+        );
+        return respMsg;
+    }
+
 
     private BusinessOpportunity setNull(BusinessOpportunity bo) {
         if (bo.getPlate1() == "") {

+ 48 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.DepartmentVO;
@@ -865,6 +866,53 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg listByPin(Custom custom, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        custom.setCompanyId(user.getCompanyId());
+        custom.setIsDelete(0);
+        custom.setUserId(user.getId());
+        custom.setEndTime(custom.getEndTime() + " 23:59:59");
+        if (custom.getPageIndex()!=null){
+            custom.setPageIndex((custom.getPageIndex() - 1) * custom.getPageFrom());
+        }
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部客户");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门客户");
+        List<Custom> list = new ArrayList<>();
+        int i = 0;
+        if (isAll) {
+            //查看全部线索
+            list = customMapper.getListByPin(custom);
+            i = customMapper.getTotal(custom);
+        } else if (isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = customMapper.getList1ByPin(custom);
+            i = customMapper.getTotal1(custom);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = customMapper.getList2ByPin(custom);
+            i = customMapper.getTotal2(custom);
+        }
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data", list);
+        map.put("total", i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(map);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg pinCutom(Custom custom, HttpServletRequest request) {
+        HttpRespMsg respMsg = new HttpRespMsg();
+//        User user = userMapper.selectById(request.getHeader("Token"));
+        customMapper.update(null,new LambdaUpdateWrapper<Custom>()
+                .set(Custom::getNeedPin,1)
+                .set(Custom::getPinTime,new Date())
+                .eq(Custom::getId,custom.getId())
+        );
+        return respMsg;
+    }
+
 
     private Custom setNull(Custom clue) {
         if (clue.getPlate1() == "") {

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserCommonModuleServiceImpl.java

@@ -83,6 +83,7 @@ public class UserCommonModuleServiceImpl extends ServiceImpl<UserCommonModuleMap
                 }
                 if(CollectionUtils.isNotEmpty(toAddList)){
                     userCommonModuleMapper.insertBatch(toAddList);
+                    commonModules = userCommonModuleMapper.getCommonModules(user.getId(),user.getCompanyId());
                 }
             }
         }

+ 151 - 64
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java

@@ -3,25 +3,23 @@ package com.management.platform.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.SysDict;
-import com.management.platform.entity.User;
-import com.management.platform.entity.VisitPlan;
+import com.management.platform.entity.*;
 import com.management.platform.entity.dto.QueryVisitPlanDTO;
+import com.management.platform.entity.vo.VisitPlanDetailVO;
 import com.management.platform.entity.vo.VisitPlanVO;
-import com.management.platform.mapper.SysDictMapper;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.mapper.VisitPlanMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.VisitPlanService;
 import com.management.platform.time.VisitPlanDelayHandler;
 import com.management.platform.time.VisitPlanDelayItem;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -31,7 +29,8 @@ import java.util.stream.Collectors;
 public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan> implements VisitPlanService {
 
 
-    @Resource
+    @Autowired
+    @Qualifier(value = "VisitPlanThreadPool")
     ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
 
@@ -43,9 +42,14 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
 
     @Resource
     private SysDictMapper sysDictMapper;
+    @Resource
+    private CustomMapper customMapper;
+
+    @Resource
+    private ContactsMapper contactsMapper;
 
     @Override
-    public HttpRespMsg addVisitPlan(VisitPlan visitPlan, HttpServletRequest request) {
+    public HttpRespMsg addOrUpdateVisitPlan(VisitPlan visitPlan, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Date now = new Date();
         User user= userMapper.selectById(request.getHeader("token"));
@@ -53,7 +57,6 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
             httpRespMsg.setError("用户不存在");
             return httpRespMsg;
         }
-
         if(visitPlan.getVisitTime().before(now)){
             httpRespMsg.setError("拜访时间不能在当前时段之前");
             return httpRespMsg;
@@ -68,54 +71,118 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
             return httpRespMsg;
         }
         Map<Integer, SysDict> timeTypeMap = remindTypeList.stream().collect(Collectors.toMap(SysDict::getId, t->t));
-        SysDict timeTypeDict = timeTypeMap.get(visitPlan.getRemindType());
-        if(null == timeTypeDict){
-            httpRespMsg.setError("提醒类型不存在,请重新填写");
-            return httpRespMsg;
+        SysDict timeTypeDict = null;
+        if(-1 != visitPlan.getRemindType()){ //timeType自定义时间不能作为字典项传输,写死为 -1
+            timeTypeDict = timeTypeMap.get(visitPlan.getRemindType());
+            if(null == timeTypeDict){
+                httpRespMsg.setError("提醒类型不存在,请重新填写");
+                return httpRespMsg;
+            }
         }
 
-        Long delayTime = 0L;
-        Long startTimeMilliSec = 0L;
-        Long endTimeMilliSec = 0L;
-        if(timeTypeDict.getName().equals("不提醒")){
-            //不加入队列,不需要提醒
-            visitPlan.setRemindState(2);
-        } else if (timeTypeDict.getName().equals("自定义时间")) {
-            //重新计算delayTime 自定义时间-当前时间
-            if(visitPlan.getRemindTime().before(now)
-                    || visitPlan.getRemindTime().after(visitPlan.getVisitTime())){
-                httpRespMsg.setError("提醒时间不能在当前时段之前或拜访时间之后");
+        if(null != visitPlan.getId()){
+            //修改
+            Date visitTime = visitPlanMapper.selectById(visitPlan.getId()).getVisitTime();
+            long milliCosts = visitTime.getTime() - now.getTime();
+            if(milliCosts > 30 * 60 * 1000){
+                httpRespMsg.setError("原拜访时间为近半小时内的数据无法修改");
                 return httpRespMsg;
             }
-            //毫秒
-            startTimeMilliSec = now.getTime();
-            endTimeMilliSec = visitPlan.getRemindTime().getTime();
-            delayTime = endTimeMilliSec - startTimeMilliSec;
+            Long delayTime = 0L;
+            Long startTimeMilliSec = 0L;
+            Long endTimeMilliSec = 0L;
+            boolean timeTypeCheck = false;
+            if(-1 == visitPlan.getRemindType()){
+                //重新计算delayTime 自定义时间-当前时间
+                if(visitPlan.getRemindTime().before(now)
+                        || visitPlan.getRemindTime().after(visitPlan.getVisitTime())){
+                    httpRespMsg.setError("提醒时间不能在当前时段之前或拜访时间之后");
+                    return httpRespMsg;
+                }
+                //毫秒
+                startTimeMilliSec = now.getTime();
+                endTimeMilliSec = visitPlan.getRemindTime().getTime();
+                delayTime = endTimeMilliSec - startTimeMilliSec;
+                timeTypeCheck = true;
+            } else if (timeTypeDict.getName().equals("不提醒")) {
+                //不加入队列,不需要提醒
+                visitPlan.setRemindState(2);
+            }else{
+                startTimeMilliSec = now.getTime();
+                endTimeMilliSec = visitPlan.getVisitTime().getTime()-Integer.parseInt(timeTypeDict.getExt1()) * 1000L;
+                if(endTimeMilliSec < startTimeMilliSec){
+                    httpRespMsg.setError("提醒时间不能在当前时段之前或拜访时间之后");
+                    return httpRespMsg;
+                }
+                delayTime = endTimeMilliSec-startTimeMilliSec;
+                timeTypeCheck=true;
+            }
+
+            visitPlanMapper.updateById(visitPlan);
+            VisitPlan newPlan = visitPlanMapper.selectById(visitPlan.getId());//前端某些字段不传,以防万一
+
+            //从队列中取出,并重新计算时间入队列
+            if(timeTypeCheck){
+                VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
+                tool.removeIfExist(visitPlan.getId());
+                VisitPlanDelayItem item = new VisitPlanDelayItem(delayTime
+                        ,startTimeMilliSec
+                        ,endTimeMilliSec
+                        ,newPlan.getId(),newPlan);
+                tool.addItem(item);
+            }
+
         }else{
-            startTimeMilliSec = now.getTime();
-            endTimeMilliSec = visitPlan.getVisitTime().getTime()-Integer.parseInt(timeTypeDict.getExt1()) * 1000L;
-            if(endTimeMilliSec < startTimeMilliSec){
-                httpRespMsg.setError("提醒时间不能在当前时段之前或拜访时间之后");
-                return httpRespMsg;
+            //新增
+            visitPlan.setCompanyId(user.getCompanyId());
+            Long delayTime = 0L;
+            Long startTimeMilliSec = 0L;
+            Long endTimeMilliSec = 0L;
+            boolean timeTypeCheck = false;
+            if(-1 == visitPlan.getRemindType()){
+                //重新计算delayTime 自定义时间-当前时间
+                if(visitPlan.getRemindTime().before(now)
+                        || visitPlan.getRemindTime().after(visitPlan.getVisitTime())){
+                    httpRespMsg.setError("提醒时间不能在当前时段之前或拜访时间之后");
+                    return httpRespMsg;
+                }
+                //毫秒
+                startTimeMilliSec = now.getTime();
+                endTimeMilliSec = visitPlan.getRemindTime().getTime();
+                delayTime = endTimeMilliSec - startTimeMilliSec;
+                timeTypeCheck = true;
+            } else if (timeTypeDict.getName().equals("不提醒")) {
+                //不加入队列,不需要提醒
+                visitPlan.setRemindState(2);
+            }else{
+                startTimeMilliSec = now.getTime();
+                endTimeMilliSec = visitPlan.getVisitTime().getTime()-Integer.parseInt(timeTypeDict.getExt1()) * 1000L;
+                if(endTimeMilliSec < startTimeMilliSec){
+                    httpRespMsg.setError("提醒时间不能在当前时段之前或拜访时间之后");
+                    return httpRespMsg;
+                }
+                delayTime = endTimeMilliSec-startTimeMilliSec;
+                timeTypeCheck=true;
             }
-            delayTime = endTimeMilliSec-startTimeMilliSec;
-        }
 
-        visitPlan.setCreateBy(user.getId());
-        visitPlanMapper.insert(visitPlan);
+            Custom custom = customMapper.selectById(visitPlan.getCustomId());
+            visitPlan.setCustomName(custom.getCustomName());
+            visitPlan.setCreateBy(user.getId());
+            visitPlanMapper.insert(visitPlan);
 
-        //加入执行队列
-        if(!timeTypeDict.getName().equals("不提醒")){
-            VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
-            VisitPlan taskPlan = visitPlanMapper.selectById(visitPlan.getId());
-            VisitPlanDelayItem item = new VisitPlanDelayItem(delayTime
-                    ,startTimeMilliSec
-                    ,endTimeMilliSec
-                    ,taskPlan.getId(),taskPlan);
-            tool.addItem(item);
-            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            System.out.println("当前时间: "+format.format(new Date()));
-            threadPoolTaskExecutor.execute(tool);
+            //加入执行队列
+            if(timeTypeCheck){
+                VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
+                VisitPlan taskPlan = visitPlanMapper.selectById(visitPlan.getId());
+                VisitPlanDelayItem item = new VisitPlanDelayItem(delayTime
+                        ,startTimeMilliSec
+                        ,endTimeMilliSec
+                        ,taskPlan.getId(),taskPlan);
+                tool.addItem(item);
+//            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//            System.out.println("当前时间: "+format.format(new Date()));
+                threadPoolTaskExecutor.execute(tool);
+            }
         }
         return httpRespMsg;
     }
@@ -152,19 +219,22 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
             return httpRespMsg;
         }
         VisitPlan taskPlan = visitPlanMapper.selectById(planId);
-        SysDict timeTypeDict = sysDictMapper.selectOne(new LambdaQueryWrapper<SysDict>()
-                .eq(SysDict::getCode, "RemindType")
-                .eq(SysDict::getId, taskPlan.getRemindType())
-                .eq(SysDict::getCompanyId, user.getCompanyId())
-        );
+        SysDict timeTypeDict = null;
+        if(-1 != taskPlan.getRemindType()){
+            timeTypeDict = sysDictMapper.selectOne(new LambdaQueryWrapper<SysDict>()
+                    .eq(SysDict::getCode, "RemindType")
+                    .eq(SysDict::getId, taskPlan.getRemindType())
+                    .eq(SysDict::getCompanyId, user.getCompanyId())
+            );
+        }
+
 
         Long delayTime = 0L;
         Long startTimeMilliSec = 0L;
         Long endTimeMilliSec = 0L;
+        boolean timeTypeCheck = false;
         taskPlan.setVisitTime(newVisitTime);
-        if(timeTypeDict.getName().equals("不提醒")){
-            //不加入队列,不修改状态,只修改拜访时间
-        } else if (timeTypeDict.getName().equals("自定义时间")) {
+        if(-1 == taskPlan.getRemindType()){
             //重新计算delayTime 自定义时间-当前时间
             if(taskPlan.getRemindTime().before(now)
                     || taskPlan.getRemindTime().after(newVisitTime)){
@@ -175,6 +245,9 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
             startTimeMilliSec = now.getTime();
             endTimeMilliSec = taskPlan.getRemindTime().getTime();
             delayTime = endTimeMilliSec - startTimeMilliSec;
+            timeTypeCheck=true;
+        }else if (timeTypeDict.getName().equals("不提醒")){
+            //不加入队列,不修改状态,只修改拜访时间
         }else{
             startTimeMilliSec = now.getTime();
             endTimeMilliSec = newVisitTime.getTime()-Integer.parseInt(timeTypeDict.getExt1()) * 1000L;
@@ -183,17 +256,20 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
                 return httpRespMsg;
             }
             delayTime = endTimeMilliSec-startTimeMilliSec;
+            timeTypeCheck=true;
         }
 
         //删除队列
         VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
         tool.removeIfExist(planId);
         //重新添加
-        VisitPlanDelayItem item = new VisitPlanDelayItem(delayTime
-                ,startTimeMilliSec
-                ,endTimeMilliSec
-                ,taskPlan.getId(),taskPlan);
-        tool.addItem(item);
+        if(timeTypeCheck){
+            VisitPlanDelayItem item = new VisitPlanDelayItem(delayTime
+                    ,startTimeMilliSec
+                    ,endTimeMilliSec
+                    ,taskPlan.getId(),taskPlan);
+            tool.addItem(item);
+        }
 
         visitPlanMapper.update(null,new LambdaUpdateWrapper<VisitPlan>()
                 .set(VisitPlan::getVisitTime,newVisitTime)
@@ -224,7 +300,7 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
     }
 
     @Override
-    public HttpRespMsg getPageVisitPlan(Integer pageIndex, Integer pageSize, String calenderDate, HttpServletRequest request) {
+    public HttpRespMsg getVisitPlanList(Integer pageIndex, Integer pageSize, String calenderDate, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user= userMapper.selectById(request.getHeader("token"));
         if(null == user){
@@ -242,4 +318,15 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
         httpRespMsg.setData(resPage);
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg getVisitPlanDetail(Long planId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        VisitPlanDetailVO detailVO = visitPlanMapper.getDetail(planId);
+        List<Contacts> contacts = contactsMapper.selectList(new LambdaQueryWrapper<Contacts>()
+                .eq(Contacts::getCustomId, detailVO.getCustomId()));
+        detailVO.setContacts(contacts);
+        httpRespMsg.setData(detailVO);
+        return httpRespMsg;
+    }
 }

+ 4 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -91,6 +91,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     public static final int TEXT_CARD_MSG__ASYNC_DWONLOAD = 23;//文件异步下载
 
+    public static final int TEXT_CARD_MSG_VISIT_PLAN = 25;//访客计划
+
     private static Object userLock = new Object();
 
     @Value("${suitId}")
@@ -291,6 +293,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     title = "日报审核通过";
                 } else if (msgType.equals(TEXT_CARD_MSG_TASK)) {
                     title = "客户管家:任务信息提醒";
+                } else if (msgType.equals(TEXT_CARD_MSG_VISIT_PLAN)) {
+                    title = "访客计划";
                 }
             } else {
                 jumpUrl = jumpUrl.replace("STATE", pageRouter);

+ 26 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanDelayHandler.java

@@ -1,11 +1,16 @@
 package com.management.platform.time;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.management.platform.entity.User;
 import com.management.platform.entity.VisitPlan;
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.VisitPlanService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.impl.WxCorpInfoServiceImpl;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.concurrent.DelayQueue;
 
 public class VisitPlanDelayHandler implements Runnable{
@@ -16,6 +21,15 @@ public class VisitPlanDelayHandler implements Runnable{
     private VisitPlanService visitPlanService =
             (VisitPlanService) ApplicationContextHelperUtil.getBean(VisitPlanService.class);
 
+    private WxCorpInfoMapper wxCorpInfoMapper =
+            (WxCorpInfoMapper) ApplicationContextHelperUtil.getBean(WxCorpInfoMapper.class);
+
+    private WxCorpInfoService wxCorpInfoService =
+            (WxCorpInfoService) ApplicationContextHelperUtil.getBean(WxCorpInfoService.class);
+
+    private UserMapper userMapper =
+            (UserMapper) ApplicationContextHelperUtil.getBean(UserMapper.class);
+
 
     public void addItem(VisitPlanDelayItem item) {
         VISIT_PLAN_DELAY_QUEUE.offer(item);
@@ -53,15 +67,23 @@ public class VisitPlanDelayHandler implements Runnable{
                 System.out.println("visitPlanService 未初始化");
                 return;
             }
-            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             //到达提醒时间,则修改 是否到达提醒时间为 已到
             visitPlanService.update(new LambdaUpdateWrapper<VisitPlan>()
                             .set(VisitPlan::getRemindState,1)
                     .eq(VisitPlan::getId, visitPlan.getId())
             );
-            System.out.println("修改时间: "+format.format(new Date()));
+//            System.out.println("修改时间: "+format.format(new Date()));
+            //发送企微消息通知
+            String createById = item.getVisitPlan().getCreateBy();
+            User user = userMapper.selectById(createById);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,user.getCorpwxUserid(),"访客计划提醒",null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_VISIT_PLAN);
+            }
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
+        System.out.println("===执行完成====");
     }
 }

+ 137 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanInit.java

@@ -0,0 +1,137 @@
+package com.management.platform.time;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.Company;
+import com.management.platform.entity.SysDict;
+import com.management.platform.entity.VisitPlan;
+import com.management.platform.mapper.CompanyMapper;
+import com.management.platform.mapper.SysDictMapper;
+import com.management.platform.mapper.VisitPlanMapper;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class VisitPlanInit implements ApplicationRunner {
+
+    @Resource
+    private VisitPlanMapper visitPlanMapper;
+
+    @Resource
+    private SysDictMapper sysDictMapper;
+
+    @Resource
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    @Qualifier(value = "VisitPlanThreadPool")
+    ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    //检查表中数据,在项目重启后重新加入队列
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        System.out.println("====开始访客计划初始化=====");
+        Date now = new Date();
+        List<VisitPlan> visitPlans = visitPlanMapper.selectList(new LambdaQueryWrapper<VisitPlan>()
+                .ne(VisitPlan::getRemindState, 2)
+                .eq(VisitPlan::getFinishState, 0)
+                .gt(VisitPlan::getVisitTime, now)
+        );
+        if(CollectionUtils.isEmpty(visitPlans)){
+            return;
+        }
+        List<SysDict> remindTypeList = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>()
+                .eq(SysDict::getCode, "RemindType"));
+        if(CollectionUtils.isEmpty(remindTypeList)){
+            return;
+        }
+        List<Company> companies = companyMapper.selectList(new LambdaQueryWrapper<Company>()
+                .select(Company::getId)
+                .gt(Company::getExpirationDate, now)
+        );
+        Map<Integer, List<VisitPlan>> companyVisitPlanMap = visitPlans.stream().collect(Collectors.groupingBy(VisitPlan::getCompanyId));
+        Map<Integer, List<SysDict>> companyRemindTypeMap = remindTypeList.stream().collect(Collectors.groupingBy(SysDict::getCompanyId));
+        if(CollectionUtils.isNotEmpty(companies)){
+            for (Company company : companies) {
+                List<SysDict> remindTypes = companyRemindTypeMap.get(company.getId());
+                if(CollectionUtils.isEmpty(remindTypes)){
+                    continue;
+                }
+                System.out.println("remindTypes: " + remindTypes.size());
+                List<VisitPlan> visitPlansList = companyVisitPlanMap.get(company.getId());
+                if(CollectionUtils.isEmpty(visitPlansList)){
+                    continue;
+                }
+                System.out.println("visitPlansList: " + visitPlansList.size());
+                Map<Integer, SysDict> timeTypeMap = remindTypes.stream().collect(Collectors.toMap(SysDict::getId, t->t));
+                int count = 1;
+                for (VisitPlan visitPlan : visitPlansList) {
+                    count++;
+                    Long delayTime = 0L;
+                    Long startTimeMilliSec = 0L;
+                    Long endTimeMilliSec = 0L;
+                    boolean timeTypeCheck = false;
+                    if(-1 == visitPlan.getRemindType()){
+                        //重新计算delayTime 自定义时间-当前时间
+                        if(visitPlan.getRemindTime().before(now)
+                                || visitPlan.getRemindTime().after(visitPlan.getVisitTime())){
+                            //提醒时间不能在当前时段之前或拜访时间之后
+                            continue;
+                        }
+                        //毫秒
+                        startTimeMilliSec = now.getTime();
+                        endTimeMilliSec = visitPlan.getRemindTime().getTime();
+                        delayTime = endTimeMilliSec - startTimeMilliSec;
+                        timeTypeCheck = true;
+                    }else{
+                        SysDict timeTypeDict = timeTypeMap.get(visitPlan.getRemindType());
+                        if(null == timeTypeDict){
+                            continue;
+                        }
+                        if(visitPlan.getVisitTime().before(now)){
+                            //拜访时间不能在当前时段之前
+                            continue;
+                        }
+
+                        if(timeTypeDict.getName().equals("不提醒")){
+                            //不加入队列,不需要提醒
+                            visitPlan.setRemindState(2);
+                        }else{
+                            startTimeMilliSec = now.getTime();
+                            endTimeMilliSec = visitPlan.getVisitTime().getTime()-Integer.parseInt(timeTypeDict.getExt1()) * 1000L;
+                            if(endTimeMilliSec < startTimeMilliSec){
+                                //提醒时间不能在当前时段之前或拜访时间之后
+                                continue;
+                            }
+                            delayTime = endTimeMilliSec-startTimeMilliSec;
+                            timeTypeCheck= true;
+                        }
+                    }
+                    //加入执行队列
+                    if(timeTypeCheck){
+                        VisitPlanDelayHandler tool = new VisitPlanDelayHandler();
+                        VisitPlan taskPlan = visitPlanMapper.selectById(visitPlan.getId());
+                        VisitPlanDelayItem item = new VisitPlanDelayItem(delayTime
+                                ,startTimeMilliSec
+                                ,endTimeMilliSec
+                                ,taskPlan.getId(),taskPlan);
+                        tool.addItem(item);
+                        threadPoolTaskExecutor.execute(tool);
+                    }
+                }
+
+            }
+        }
+        System.out.println("====结束访客计划初始化=====");
+    }
+}

+ 117 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusinessOpportunityMapper.xml

@@ -30,7 +30,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, name, contacts_id, customer_id,  amount_of_money, expected_transaction_date, stage_id, create_time, edit_time, creator_id, incharger_id, remark, is_delete,seq, plate1, plate2, plate3, plate4, plate5
+        id, company_id, name, contacts_id, customer_id,  amount_of_money, expected_transaction_date, stage_id, create_time, edit_time, creator_id, incharger_id, remark, is_delete,seq, plate1, plate2, plate3, plate4, plate5,need_pin ,pin_time
     </sql>
     <select id="selectAllList" resultType="com.management.platform.entity.BusinessOpportunity">
         select
@@ -310,4 +310,120 @@
           and (incharger_id = #{id} or incharger_id is null)
         order by create_time desc
     </select>
+    <select id="selectAllListByPin" resultType="com.management.platform.entity.BusinessOpportunity">
+        select
+        <include refid="Base_Column_List"></include>,
+        (select `name` from  stage where id =  stage_id) stageValue,
+        (select custom_name from custom where id = customer_id) customerName,
+        (select `name` from contacts where id = contacts_id) contactsName,
+        (select `name` from `user` where id = incharger_id) inchargerName,
+        (select `name` from `user` where id = creator_id) creatorName
+        from business_opportunity
+        where company_id = #{companyId}
+        and is_delete = #{isDelete}
+        <if test="name != null and name != ''">
+            and `name` LIKE CONCAT('%', #{name}, '%')
+        </if>
+        <if test="inchargerId != null and inchargerId != '' ">
+            and incharger_id = #{inchargerId}
+        </if>
+        <if test="startTime != null and endTime != null ">
+            and create_time BETWEEN  #{startTime} and #{endTime}
+        </if>
+        <if test="contactsName != null and contactsName != ''">
+            and contacts_id in (select id from contacts where `name`LIKE CONCAT('%', #{contactsName}, '%'))
+        </if>
+        <if test="customerName != null and customerName != ''">
+            and customer_id in (select id from custom where `custom_name`LIKE CONCAT('%', #{customerName}, '%'))
+        </if>
+        <if test="stageId != null ">
+            and stage_id = #{stageId}
+        </if>
+        <if test="productId != null ">
+            and id in (select business_id from business_item_product where product_id = #{productId})
+        </if>
+        ORDER BY need_pin desc,pin_time desc
+        <if test="pageIndex!=null and pageFrom !=null">
+            limit #{pageIndex},#{pageFrom}
+        </if>
+    </select>
+
+    <select id="selectAllList1ByPin" resultType="com.management.platform.entity.BusinessOpportunity">
+        select
+        <include refid="Base_Column_List"></include>,
+        (select `name` from  stage where id =  stage_id) stageValue,
+        (select custom_name from custom where id = customer_id) customerName,
+        (select `name` from contacts where id = contacts_id) contactsName,
+        (select `name` from `user` where id = incharger_id) inchargerName,
+        (select `name` from `user` where id = creator_id) creatorName
+        from business_opportunity
+        where company_id = #{bo.companyId}
+        and is_delete = #{bo.isDelete}
+        and (incharger_id in
+        (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` WHERe id = #{userId}))
+        or incharger_id is null)
+        <if test="bo.name != null and bo.name != ''">
+            and `name` LIKE CONCAT('%', #{bo.name}, '%')
+        </if>
+        <if test="bo.inchargerId != null ">
+            and incharger_id = #{bo.inchargerId}
+        </if>
+        <if test="bo.startTime != null and bo.endTime != null ">
+            and create_time BETWEEN  #{bo.startTime} and #{bo.endTime}
+        </if>
+        <if test="bo.contactsName != null and bo.contactsName != ''">
+            and contacts_id in (select id from contacts where `name`LIKE CONCAT('%', #{bo.contactsName}, '%'))
+        </if>
+        <if test="bo.customerName != null and bo.customerName != ''">
+            and customer_id in (select id from custom where `name`LIKE CONCAT('%', #{bo.customerName}, '%'))
+        </if>
+        <if test="bo.stageId != null ">
+            and stage_id = #{bo.stageId}
+        </if>
+        <if test="bo.productId != null ">
+            and id in (select business_id from business_item_product where product_id = #{bo.productId})
+        </if>
+        ORDER BY need_pin desc,pin_time desc
+        <if test="bo.pageIndex!=null and bo.pageFrom !=null">
+            limit #{bo.pageIndex},#{bo.pageFrom}
+        </if>
+    </select>
+    <select id="selectAllList2ByPin" resultType="com.management.platform.entity.BusinessOpportunity">
+        select
+        <include refid="Base_Column_List"></include>,
+        (select `name` from  stage where id =  stage_id) stageValue,
+        (select custom_name from custom where id = customer_id) customerName,
+        (select `name` from contacts where id = contacts_id) contactsName,
+        (select `name` from `user` where id = incharger_id) inchargerName,
+        (select `name` from `user` where id = creator_id) creatorName
+        from business_opportunity
+        where company_id = #{bo.companyId}
+        and is_delete = #{bo.isDelete}
+        and (incharger_id = #{userId} or incharger_id is null)
+        <if test="bo.name != null and bo.name != ''">
+            and `name` LIKE CONCAT('%', #{bo.name}, '%')
+        </if>
+        <if test="bo.inchargerId != null ">
+            and incharger_id = #{bo.inchargerId}
+        </if>
+        <if test="bo.startTime != null and bo.endTime != null ">
+            and create_time BETWEEN  #{bo.startTime} and #{bo.endTime}
+        </if>
+        <if test="bo.contactsName != null and bo.contactsName != ''">
+            and contacts_id in (select id from contacts where `name`LIKE CONCAT('%', #{bo.contactsName}, '%'))
+        </if>
+        <if test="bo.customerName != null and bo.customerName != ''">
+            and customer_id in (select id from custom where `name`LIKE CONCAT('%', #{bo.customerName}, '%'))
+        </if>
+        <if test="bo.stageId != null ">
+            and stage_id = #{bo.stageId}
+        </if>
+        <if test="bo.productId != null ">
+            and id in (select business_id from business_item_product where product_id =#{bo.productId})
+        </if>
+        ORDER BY need_pin desc,pin_time desc
+        <if test="bo.pageIndex!=null and bo.pageFrom !=null">
+            limit #{bo.pageIndex},#{bo.pageFrom}
+        </if>
+    </select>
 </mapper>

+ 170 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/CustomMapper.xml

@@ -384,5 +384,175 @@
             </foreach>
         </if>
     </select>
+    <select id="getListByPin" resultType="com.management.platform.entity.Custom">
+        select
+        c.id,
+        c.contacts_name,
+        c.custom_name,
+        c.email,
+        c.tel_phone,
+        c.company_phone,
+        c.custom_desc,
+        c.incharger_id,
+        c.address,
+        c.create_time,
+        c.customer_level_id,
+        (select name from sys_dict where customer_level_id = id and code = 'CustomLevel') customerLevelValue,
+        c.customer_industry_id,
+        (select name from sys_dict where customer_industry_id = id and code = 'CustomIndustry') customerIndustryValue,
+        c.custom_source_id,
+        (select name from sys_dict where custom_source_id = id) customSourceValue,
+        c.incharger_id,
+        (select `name` from `user` where id = incharger_id) inchargerName,
+        c.creator_id,
+        c.create_time,
+        (select `name` from `user` where id = creator_id) creatorName
+        from custom c
+        left join sys_dict sd on c.customer_level_id = sd.id
+        where c.company_id = #{companyId}
+        and c.is_delete =#{isDelete}
+        <if test="inchargerId != null and inchargerId != ''  ">
+            and c.incharger_id =#{inchargerId}
+        </if>
+        <if test="startTime != null and endTime != null ">
+            and c.create_time BETWEEN #{startTime} and #{endTime}
+        </if>
+        <if test="customName != null and customName != '' ">
+            and c.custom_name LIKE CONCAT('%', #{customName}, '%')
+        </if>
+        <if test="email != null and email != '' ">
+            and c.email LIKE CONCAT('%', #{email}, '%')
+        </if>
+        <if test="companyPhone != null and companyPhone != '' ">
+            and c.company_phone LIKE CONCAT('%', #{companyPhone}, '%')
+        </if>
+        <if test="customerLevelId != null ">
+            and c.customer_level_id = #{customerLevelId}
+        </if>
+        <if test="customSourceId != null ">
+            and c.custom_source_id = #{customSourceId}
+        </if>
+        <if test="customerIndustryId != null ">
+            and c.customer_industry_id = #{customerIndustryId}
+        </if>
+        ORDER BY c.need_pin desc,c.pin_time desc
+        <if test="pageFrom != null ">
+            Limit #{pageIndex},#{pageFrom}
+        </if>
+    </select>
+    <select id="getList1ByPin" resultType="com.management.platform.entity.Custom">
+        select c.id,
+        c.custom_name,
+        c.email,
+        c.tel_phone,
+        c.contacts_name,
+        c.company_phone,
+        c.custom_desc,
+        c.address,
+        c.create_time,
+        c.customer_level_id,
+        (select name from sys_dict where customer_level_id = id and code = 'CustomLevel') customerLevelValue,
+        c.customer_industry_id,
+        (select name from sys_dict where customer_industry_id = id and code = 'CustomIndustry') customerIndustryValue,
+        c.custom_source_id,
+        (select name from sys_dict where custom_source_id = id ) customSourceValue,
+        c.incharger_id,
+        (select `name` from `user` where id = incharger_id) inchargerName,
+        c.creator_id,
+        c.create_time,
+        (select `name` from `user` where id = creator_id) creatorName
+        from custom c
+        left join sys_dict sd on c.customer_level_id = sd.id
+        where
+        (c.incharger_id in
+        (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` WHERE id = #{userId}))
+        or c.incharger_id is null)
+        and c.company_id = #{companyId}
+        and c.is_delete =#{isDelete}
+        <if test="inchargerId != null and inchargerId != ''  ">
+            and c.incharger_id =#{inchargerId}
+        </if>
+        <if test="startTime != null and endTime != null ">
+            and c.create_time BETWEEN #{startTime} and #{endTime}
+        </if>
+        <if test="customName != null and customName != '' ">
+            and c.custom_name LIKE CONCAT('%', #{customName}, '%')
+        </if>
+        <if test="email != null and email != '' ">
+            and c.email LIKE CONCAT('%', #{email}, '%')
+        </if>
+        <if test="companyPhone != null ">
+            and c.company_phone LIKE CONCAT('%', #{companyPhone}, '%')
+        </if>
+        <if test="customerLevelId != null ">
+            and c.customer_level_id = #{customerLevelId}
+        </if>
+        <if test="customSourceId != null ">
+            and c.custom_source_id = #{customSourceId}
+        </if>
+        <if test="customerIndustryId != null ">
+            and c.customer_industry_id = #{customerIndustryId}
+        </if>
+        ORDER BY c.need_pin desc,c.pin_time desc
+        <if test="pageFrom != null ">
+            Limit #{pageIndex},#{pageFrom}
+        </if>
+    </select>
+    <select id="getList2ByPin" resultType="com.management.platform.entity.Custom">
+        select id,
+        custom_name,
+        email,
+        contacts_name
+        tel_phone,contacts_name,
+        company_phone,
+        custom_desc,
+        contacts_name
+        incharger_id,
+        address,
+        create_time,
+        customer_level_id,
+        (select name from sys_dict where customer_level_id = id and code = 'CustomLevel') customerLevelValue,
+        customer_industry_id,
+        (select name from sys_dict where customer_industry_id = id and code = 'CustomIndustry') customerIndustryValue,
+        custom_source_id,
+        (select name from sys_dict where custom_source_id = id ) customSourceValue,
+        incharger_id,
+        (select `name` from `user` where id = incharger_id) inchargerName,
+        creator_id,
+        (select `name` from `user` where id = creator_id) creatorName
+        from custom
+        where company_id = #{companyId}
+        and is_delete =#{isDelete}
+        and (incharger_id = #{userId}
+        or incharger_id is null)
+        <if test="inchargerId != null and inchargerId != ''  ">
+            and incharger_id =#{inchargerId}
+        </if>
+        <if test="startTime != null and endTime != null ">
+            and create_time BETWEEN #{startTime} and #{endTime}
+        </if>
+        <if test="customName != null and customName != '' ">
+            and custom_name LIKE CONCAT('%', #{customName}, '%')
+        </if>
+        <if test="email != null and email != '' ">
+            and email LIKE CONCAT('%', #{email}, '%')
+        </if>
+        <if test="companyPhone != null ">
+            and company_phone LIKE CONCAT('%', #{companyPhone}, '%')
+        </if>
+        <if test="customerLevelId != null ">
+            and customer_level_id = #{customerLevelId}
+        </if>
+        <if test="customSourceId != null ">
+            and custom_source_id = #{customSourceId}
+        </if>
+        <if test="customerIndustryId != null ">
+            and customer_industry_id = #{customerIndustryId}
+        </if>
+        ORDER BY c.need_pin desc,c.pin_time desc
+        <if test="pageFrom != null ">
+            Limit #{pageIndex},#{pageFrom}
+        </if>
+    </select>
 
 </mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserCommonModuleMapper.xml

@@ -10,7 +10,7 @@
         </foreach>
     </insert>
     <select id="getCommonModules" resultType="com.management.platform.entity.vo.UserCommonModuleVO">
-        select ucm.module_id,sm.name as moduleName
+        select ucm.module_id,sm.name as moduleName,sm.path
         from user_common_module ucm
                  left join sys_module sm on ucm.module_id = sm.id
         where user_id = #{userId} and company_id = #{companyId}

+ 21 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/VisitPlanMapper.xml

@@ -6,9 +6,9 @@
     <select id="getPageVisitPlan" resultType="com.management.platform.entity.vo.VisitPlanVO">
         select vs.id, vs.plan_name, vs.custom_id, vs.custom_name
              , vs.incharger_id, u.name as inchargerName
-             , vs.visit_goal,sd1.name as visitGoalText
+             , vs.visit_goal,sd1.name as visitGoalName
              , vs.visit_time, vs.remark
-             , vs.remind_type, sd2.name as remindTypeText
+             , vs.remind_type, case remind_type when -1 then '自定义时间' else sd2.name end as remindTypeName
              ,vs.remind_time, vs.remind_state, vs.finish_state
              , vs.create_by
         from visit_plan vs
@@ -20,15 +20,31 @@
     <select id="getListVisitPlan" resultType="com.management.platform.entity.vo.VisitPlanVO">
         select vs.id, vs.plan_name, vs.custom_id, vs.custom_name
              , vs.incharger_id, u.name as inchargerName
-             , vs.visit_goal,sd1.name as visitGoalText
+             , vs.visit_goal,sd1.name as visitGoalName
              , vs.visit_time, vs.remark
-             , vs.remind_type, sd2.name as remindTypeText
+             , vs.remind_type, case remind_type when -1 then '自定义时间' else sd2.name end as remindTypeName
              ,vs.remind_time, vs.remind_state, vs.finish_state
-             , vs.create_by
+             , vs.create_by,c.tel_phone
         from visit_plan vs
                  left join user u on vs.incharger_id = u.id
                  left join (select * from sys_dict where code = 'VisitGoal') sd1 on vs.visit_goal = sd1.id
                  left join (select * from sys_dict where code = 'RemindType') sd2 on vs.remind_type = sd2.id
+                 left join custom c on vs.custom_id = c.id
         where vs.create_by = #{query.userId} and date_format(vs.visit_time,'%Y-%m-%d') = #{query.calenderDate}
     </select>
+    <select id="getDetail" resultType="com.management.platform.entity.vo.VisitPlanDetailVO">
+        select vs.id, vs.plan_name, vs.custom_id, vs.custom_name
+             , vs.incharger_id, u.name as inchargerName
+             , vs.visit_goal,sd1.name as visitGoalName
+             , vs.visit_time, vs.remark
+             , vs.remind_type, case remind_type when -1 then '自定义时间' else sd2.name end as remindTypeName
+             ,vs.remind_time, vs.remind_state, vs.finish_state
+             , vs.create_by,c.tel_phone
+        from visit_plan vs
+                 left join user u on vs.incharger_id = u.id
+                 left join (select * from sys_dict where code = 'VisitGoal') sd1 on vs.visit_goal = sd1.id
+                 left join (select * from sys_dict where code = 'RemindType') sd2 on vs.remind_type = sd2.id
+                 left join custom c on vs.custom_id = c.id
+        where vs.id = #{planId}
+    </select>
 </mapper>