浏览代码

Merge remote-tracking branch 'origin/master'

liuc 3 月之前
父节点
当前提交
ac4315974b
共有 43 个文件被更改,包括 1670 次插入9 次删除
  1. 111 3
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/controller/BlinkCustomerController.java
  2. 75 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerDecisionChainDO.java
  3. 37 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerFollowActionDO.java
  4. 42 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerFollowDO.java
  5. 35 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerMarketTeamDO.java
  6. 77 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerVisitPlanDO.java
  7. 66 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerDecisionChainVO.java
  8. 27 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerFollowActionVO.java
  9. 44 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerFollowVO.java
  10. 32 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerMarketTeamVO.java
  11. 18 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitPlanCalendarVO.java
  12. 18 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitPlanStatisticsVO.java
  13. 82 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitPlanVO.java
  14. 43 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/qry/BlinkCustomerVisitPlanQry.java
  15. 24 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/handler/CustomerRegisterProcessSubmitEventHandler.java
  16. 58 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerDecisionChainImpl.java
  17. 53 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerFollowActionImpl.java
  18. 58 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerFollowImpl.java
  19. 70 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerMarketTeamImpl.java
  20. 22 6
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerServiceImpl.java
  21. 127 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerVisitPlanImpl.java
  22. 24 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerDecisionChainMapper.java
  23. 24 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerFollowActionMapper.java
  24. 22 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerFollowMapper.java
  25. 24 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerMarketTeamMapper.java
  26. 22 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerVisitPlanMapper.java
  27. 23 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerDecisionChainRepository.java
  28. 23 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerFollowActionRepository.java
  29. 23 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerFollowRepository.java
  30. 21 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerMarketTeamRepository.java
  31. 31 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerVisitPlanRepository.java
  32. 33 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerDecisionChainService.java
  33. 26 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerFollowActionService.java
  34. 27 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerFollowService.java
  35. 39 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerMarketTeamService.java
  36. 69 0
      bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerVisitPlanService.java
  37. 10 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerDecisionChainRepositoryMapper.xml
  38. 10 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerFollowActionRepositoryMapper.xml
  39. 35 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerFollowRepositoryMapper.xml
  40. 10 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerMarketTeamRepositoryMapper.xml
  41. 47 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerVisitPlanRepositoryMapper.xml
  42. 3 0
      bound-link-api/blink-backend/src/main/resources/mapper/BlinkProjectRepositoryMapper.xml
  43. 5 0
      bound-link-api/blink-common-dto/src/main/java/com/wx/blink/common/qry/BlinkProjectQry.java

+ 111 - 3
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/controller/BlinkCustomerController.java

@@ -2,8 +2,8 @@ package com.wx.blink.backend.controller;
 
 import com.wx.blink.backend.domain.dto.*;
 import com.wx.blink.backend.domain.qry.BlinkBizFileQry;
-import com.wx.blink.backend.service.IBlinkCustomerService;
-import com.wx.blink.backend.service.IBlinkCustomerTagService;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitPlanQry;
+import com.wx.blink.backend.service.*;
 import com.wx.blink.base.common.domain.PageResult;
 import com.wx.blink.base.common.domain.ResponseDTO;
 import com.wx.blink.common.qry.BlinkCustomerQry;
@@ -34,6 +34,14 @@ public class BlinkCustomerController {
     private Configuration configuration;
     @Resource
     private IBlinkCustomerTagService customerTagService;
+    @Resource
+    private IBlinkCustomerMarketTeamService marketTeamService;
+    @Resource
+    private IBlinkCustomerFollowService followService;
+    @Resource
+    private IBlinkCustomerDecisionChainService decisionChainService;
+    @Resource
+    private IBlinkCustomerVisitPlanService visitPlanService;
 
     @Operation(summary = "新增客户")
     @PostMapping("/supports/customer/create")
@@ -145,10 +153,110 @@ public class BlinkCustomerController {
     public ResponseDTO<List<BlinkCustomerTagVO>> customerTagGetList(@PathVariable String customerId) {
         return ResponseDTO.ok(customerTagService.getCustomerTagList(customerId));
     }
-    //---------------------------------相关tab页查询-----------------------------------//
+    //---------------------------------相关tab页内容-----------------------------------//
     @Operation(summary = "获取客户关联公司列表")
     @GetMapping(value = "/supports/customer/relatedCompany/{customerId}")
     public ResponseDTO<List<BlinkCustomerVO>> getRelatedCompanyById(@PathVariable String customerId) {
         return ResponseDTO.ok(customerService.getRelatedCompanyById(customerId));
     }
+
+    @Operation(summary = "客户营销团队新增/修改")
+    @PostMapping(value = "/supports/customer/marketTeam/addOrUpdate")
+    public ResponseDTO customerTagAddOrUpdate(@RequestBody BlinkCustomerMarketTeamVO vo) {
+        marketTeamService.addOrUpdate(vo);
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "客户营销团队移除")
+    @PostMapping(value = "/supports/customer/marketTeam/deleteById")
+    public ResponseDTO deleteById(@RequestBody BlinkCustomerMarketTeamVO vo) {
+        marketTeamService.deleteById(vo.getId());
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "查询客户营销团队")
+    @GetMapping(value = "/supports/customer/getMarketTeamListByCustomerId/{customerId}")
+    public ResponseDTO<List<BlinkCustomerMarketTeamVO>> getMarketTeamListByCustomerId(@PathVariable String customerId) {
+        return ResponseDTO.ok(marketTeamService.getListByCustomerId(customerId));
+    }
+
+    @Operation(summary = "客户跟进情况新增/修改")
+    @PostMapping(value = "/supports/customer/follow/addOrUpdate")
+    public ResponseDTO customerfollowAddOrUpdate(@RequestBody BlinkCustomerFollowVO vo) {
+        followService.addOrUpdate(vo);
+        return ResponseDTO.ok();
+    }
+    @Operation(summary = "查询客户跟进情况团队")
+    @GetMapping(value = "/supports/customer/getFollowListByCustomerId/{customerId}")
+    public ResponseDTO<List<BlinkCustomerFollowVO>> getFollowListByCustomerId(@PathVariable String customerId) {
+        return ResponseDTO.ok(followService.getFollowListByCustomerId(customerId));
+    }
+
+    @Operation(summary = "客户决策链新增/修改")
+    @PostMapping(value = "/supports/customer/decisionChain/addOrUpdate")
+    public ResponseDTO customerDecisionChainAddOrUpdate(@RequestBody BlinkCustomerDecisionChainVO vo) {
+        decisionChainService.addOrUpdate(vo);
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "客户决策链移除")
+    @PostMapping(value = "/supports/customer/decisionChain/deleteByCustomerId")
+    public ResponseDTO deleteDecisionChain(@RequestBody BlinkCustomerDecisionChainVO vo) {
+        decisionChainService.delete(vo);
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "查询决策链列表")
+    @GetMapping(value = "/supports/customer/getDecisionChainListByCustomerId/{customerId}")
+    public ResponseDTO<List<BlinkCustomerDecisionChainVO>> getDecisionChainListByCusId(@PathVariable String customerId) {
+        return ResponseDTO.ok(decisionChainService.getDecisionChainListByCustomerId(customerId));
+    }
+
+    //---------------------------------------------拜访计划-------------------------------------------------------//
+
+    @Operation(summary = "创建拜访计划")
+    @PostMapping(value = "/supports/customer/visitPlan/add")
+    public ResponseDTO visitPlanAdd(@RequestBody BlinkCustomerVisitPlanVO vo) {
+        visitPlanService.addOrUpdate(vo);
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "取消拜访")
+    @PostMapping(value = "/supports/customer/visitPlan/cancel")
+    public ResponseDTO visitPlanCancel(@RequestBody BlinkCustomerVisitPlanVO vo) {
+        visitPlanService.visitCancel(vo);
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "拜访完成")
+    @PostMapping(value = "/supports/customer/visitPlan/completed")
+    public ResponseDTO visitPlanCompleted(@RequestBody BlinkCustomerVisitPlanVO vo) {
+        visitPlanService.visitCompleted(vo);
+        return ResponseDTO.ok();
+    }
+
+    @Operation(summary = "拜访计划日历数据个数查询")
+    @PostMapping(value = "/supports/customer/visitPlan/calendarNum")
+    public ResponseDTO<List<BlinkCustomerVisitPlanCalendarVO>> visitPlanCalendarNum() {
+        return ResponseDTO.ok(visitPlanService.getVisitPlanCalendarNum());
+    }
+
+    @Operation(summary = "拜访计划查询列表表头统计数据接口")
+    @PostMapping(value = "/supports/customer/visitPlan/statistics")
+    public ResponseDTO<BlinkCustomerVisitPlanStatisticsVO> visitPlanStatisticsInfo(@RequestBody BlinkCustomerVisitPlanQry qry) {
+        // BlinkCustomerVisitPlanQry qry = new BlinkCustomerVisitPlanQry();
+        return ResponseDTO.ok(visitPlanService.visitPlanStatisticsInfo(qry));
+    }
+
+    @Operation(summary = "查询拜访计划列表")
+    @PostMapping(value = "/supports/customer/visitPlan/queryPage")
+    public ResponseDTO<PageResult<BlinkCustomerVisitPlanVO>> visitPlanQueryPage(@RequestBody BlinkCustomerVisitPlanQry qry) {
+        return ResponseDTO.ok(visitPlanService.visitPlanQueryPage(qry));
+    }
+
+    @Operation(summary = "获取拜访计划详细信息")
+    @GetMapping(value = "/supports/customer/visitPlan/{id}")
+    public ResponseDTO<BlinkCustomerVisitPlanVO> visitPlanSingleQuery(@PathVariable String id) {
+        return ResponseDTO.ok(visitPlanService.visitPlanSingleQuery(id));
+    }
 }

+ 75 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerDecisionChainDO.java

@@ -0,0 +1,75 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+@TableName("blink_customer_decision_chain")
+public class BlinkCustomerDecisionChainDO extends BaseEntity {
+
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "客户id")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "姓名")
+    @TableField("name")
+    private String name;
+    @Schema(description = "性别")
+    @TableField("gender")
+    private String gender;
+    @Schema(description = "年龄")
+    @TableField("age")
+    private String age;
+    @Schema(description = "联系电话")
+    @TableField("contact_number")
+    private String contactNumber;
+    @Schema(description = "部门")
+    @TableField("department")
+    private String department;
+    @Schema(description = "职务")
+    @TableField("position")
+    private String position;
+    @Schema(description = "工作职责")
+    @TableField("job_responsibilities")
+    private String jobResponsibilities;
+    @Schema(description = "职位权重")
+    @TableField("position_weight")
+    private String positionWeight;
+    @Schema(description = "邮箱")
+    @TableField("email")
+    private String email;
+    @Schema(description = "上级")
+    @TableField("supervisor")
+    private String supervisor;
+    @Schema(description = "下级")
+    @TableField("subordinate")
+    private String subordinate;
+    @Schema(description = "关系深度")
+    @TableField("relationship_depth")
+    private String relationshipDepth;
+    @Schema(description = "爱好")
+    @TableField("hobbies")
+    private String hobbies;
+    @Schema(description = "家庭情况")
+    @TableField("family_situation")
+    private String familySituation;
+    @Schema(description = "家庭地址")
+    @TableField("home_address")
+    private String homeAddress;
+    @Schema(description = "备注")
+    @TableField("remarks")
+    private String remarks;
+
+}

+ 37 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerFollowActionDO.java

@@ -0,0 +1,37 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/*客户跟进动作表*/
+@Data
+@TableName("blink_customer_follow_action")
+public class BlinkCustomerFollowActionDO extends BaseEntity {
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "跟进情况id")
+    @TableField("pid")
+    private String pid;
+    @Schema(description = "跟进动作")
+    @TableField("follow_action")
+    private String followAction;
+    @Schema(description = "本次达到的效果")
+    @TableField("this_time_effect")
+    private String thisTimeEffect;
+    @Schema(description = "相关人员")
+    @TableField("relevant_man")
+    private String relevantMan;
+
+
+
+}

+ 42 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerFollowDO.java

@@ -0,0 +1,42 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/*客户跟进情况表*/
+@Data
+@TableName("blink_customer_follow")
+public class BlinkCustomerFollowDO extends BaseEntity {
+
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "客户id")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "跟进内容")
+    @TableField("follow_content")
+    private String followContent;
+    @Schema(description = "跟进方式")
+    @TableField("follow_method")
+    private String followMethod;
+    @Schema(description = "跟进类型")
+    @TableField("follow_type")
+    private String followType;
+    @Schema(description = "跟进项目")
+    @TableField("follow_project")
+    private String followProject;
+    @Schema(description = "附件")
+    @TableField("attachments")
+    private String attachments;
+    @Schema(description = "位置")
+    @TableField("position")
+    private String position;
+
+}

+ 35 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerMarketTeamDO.java

@@ -0,0 +1,35 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@TableName("blink_customer_market_team")
+public class BlinkCustomerMarketTeamDO extends BaseEntity {
+
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "客户id")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "归属区域")
+    @TableField("belong_region")
+    private String belongRegion;
+    @Schema(description = "营销人员")
+    @TableField("market_staff")
+    private String marketStaff;
+    @Schema(description = "权限")
+    @TableField("permission")
+    private String permission;
+    @Schema(description = "说明")
+    @TableField("description")
+    private String description;
+
+}

+ 77 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dataobject/BlinkCustomerVisitPlanDO.java

@@ -0,0 +1,77 @@
+package com.wx.blink.backend.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+/*客户拜访计划*/
+@Data
+@TableName("blink_customer_visit_plan")
+public class BlinkCustomerVisitPlanDO extends BaseEntity {
+
+    @Schema(description = "id")
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @Schema(description = "计划名称")
+    @TableField("plan_name")
+    private String planName;
+    @Schema(description = "预计时间")
+    @TableField("expected_time")
+    private Date expectedTime;
+    @Schema(description = "提前提醒时间")
+    @TableField("reminder_time")
+    private Double reminderTime;
+    @Schema(description = "时间类型")
+    @TableField("time_type")
+    private String timeType;
+    @Schema(description = "客户")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "项目名称")
+    @TableField("project_id")
+    private String projectId;
+    @Schema(description = "拜访目的")
+    @TableField("visit_purpose")
+    private String visitPurpose;
+    @Schema(description = "拜访省市区")
+    @TableField("visit_ssq")
+    private String visitSsq;
+    @Schema(description = "拜访地址")
+    @TableField("visit_address")
+    private String visitAddress;
+    @Schema(description = "拜访责任人")
+    @TableField("visit_responsible_man")
+    private String visitResponsibleMan;
+    @Schema(description = "完成客户名称")
+    @TableField("completed_customer_id")
+    private String completedCustomerId;
+    @Schema(description = "完成项目名称")
+    @TableField("completed_project_id")
+    private String completedProjectId;
+    @Schema(description = "完成拜访省市区")
+    @TableField("completed_visit_ssq")
+    private String completedVisitSsq;
+    @Schema(description = "完成拜访地址")
+    @TableField("completed_visit_address")
+    private String completedVisitAddress;
+    @Schema(description = "拜访结果")
+    @TableField("visit_result")
+    private String visitResult;
+    @Schema(description = "取消原因")
+    @TableField("cancel_reason")
+    private String cancelReason;
+    @Schema(description = "原因说明")
+    @TableField("reason_description")
+    private String reasonDescription;
+    @Schema(description = "状态(0新创建,1已完成,2已取消)")
+    @TableField("status")
+    private Integer status;
+
+}

+ 66 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerDecisionChainVO.java

@@ -0,0 +1,66 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class BlinkCustomerDecisionChainVO extends BaseEntity {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "客户id")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "姓名")
+    @TableField("name")
+    private String name;
+    @Schema(description = "性别")
+    @TableField("gender")
+    private String gender;
+    @Schema(description = "年龄")
+    @TableField("age")
+    private String age;
+    @Schema(description = "联系电话")
+    @TableField("contact_number")
+    private String contactNumber;
+    @Schema(description = "部门")
+    @TableField("department")
+    private String department;
+    @Schema(description = "职务")
+    @TableField("position")
+    private String position;
+    @Schema(description = "工作职责")
+    @TableField("job_responsibilities")
+    private String jobResponsibilities;
+    @Schema(description = "职位权重")
+    @TableField("position_weight")
+    private String positionWeight;
+    @Schema(description = "邮箱")
+    @TableField("email")
+    private String email;
+    @Schema(description = "上级")
+    @TableField("supervisor")
+    private String supervisor;
+    @Schema(description = "下级")
+    @TableField("subordinate")
+    private String subordinate;
+    @Schema(description = "关系深度")
+    @TableField("relationship_depth")
+    private String relationshipDepth;
+    @Schema(description = "爱好")
+    @TableField("hobbies")
+    private String hobbies;
+    @Schema(description = "家庭情况")
+    @TableField("family_situation")
+    private String familySituation;
+    @Schema(description = "家庭地址")
+    @TableField("home_address")
+    private String homeAddress;
+    @Schema(description = "备注")
+    @TableField("remarks")
+    private String remarks;
+
+}

+ 27 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerFollowActionVO.java

@@ -0,0 +1,27 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class BlinkCustomerFollowActionVO extends BaseEntity {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "跟进情况id")
+    @TableField("pid")
+    private String pid;
+    @Schema(description = "跟进动作")
+    @TableField("follow_action")
+    private String followAction;
+    @Schema(description = "本次达到的效果")
+    @TableField("this_time_effect")
+    private String thisTimeEffect;
+    @Schema(description = "相关人员")
+    @TableField("relevant_man")
+    private String relevantMan;
+
+}

+ 44 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerFollowVO.java

@@ -0,0 +1,44 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.wx.blink.base.common.annoation.DataAdaptorMapping;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BlinkCustomerFollowVO extends BaseEntity {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "客户id")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "跟进内容")
+    @TableField("follow_content")
+    private String followContent;
+    @Schema(description = "跟进方式")
+    @DataAdaptorMapping(type = "dict", value = "BLINK_CUSTOMER_FOLLOW_METHOD")
+    @TableField("follow_method")
+    private String followMethod;
+    @Schema(description = "跟进类型")
+    @DataAdaptorMapping(type = "dict", value = "BLINK_CUSTOMER_FOLLOW_TYPE")
+    @TableField("follow_type")
+    private String followType;
+    @Schema(description = "跟进项目")
+    @TableField("follow_project")
+    private String followProject;
+    @Schema(description = "附件")
+    @TableField("attachments")
+    private String attachments;
+    @Schema(description = "位置")
+    @TableField("position")
+    private String position;
+
+    @TableField(exist = false)
+    private List<BlinkCustomerFollowActionVO> followAction;
+
+}

+ 32 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerMarketTeamVO.java

@@ -0,0 +1,32 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.wx.blink.base.common.annoation.DataAdaptorMapping;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class BlinkCustomerMarketTeamVO extends BaseEntity {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "客户id")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "归属区域")
+    @TableField("belong_region")
+    private String belongRegion;
+    @Schema(description = "营销人员")
+    @TableField("market_staff")
+    private String marketStaff;
+    @Schema(description = "权限")
+    @DataAdaptorMapping(type = "dict", value = "BLINK_CUSTOMER_MARKET_PERM")
+    @TableField("permission")
+    private String permission;
+    @Schema(description = "说明")
+    @TableField("description")
+    private String description;
+
+}

+ 18 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitPlanCalendarVO.java

@@ -0,0 +1,18 @@
+package com.wx.blink.backend.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class BlinkCustomerVisitPlanCalendarVO {
+
+    /**
+     *  周几
+     */
+    private Integer dayOfMonth;
+
+    /**
+     * 数据数量
+     */
+    private Integer dailyCount;
+
+}

+ 18 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitPlanStatisticsVO.java

@@ -0,0 +1,18 @@
+package com.wx.blink.backend.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class BlinkCustomerVisitPlanStatisticsVO{
+
+    /**
+     *  待完成
+     */
+    private Integer toBeCompletedQty;
+
+    /**
+     * 已完成
+     */
+    private Integer completedQty;
+
+}

+ 82 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/dto/BlinkCustomerVisitPlanVO.java

@@ -0,0 +1,82 @@
+package com.wx.blink.backend.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.wx.blink.base.common.domain.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BlinkCustomerVisitPlanVO extends BaseEntity {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "计划名称")
+    @TableField("plan_name")
+    private String planName;
+    @Schema(description = "预计时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("expected_time")
+    private Date expectedTime;
+    @Schema(description = "提前提醒时间")
+    @TableField("reminder_time")
+    private Double reminderTime;
+    @Schema(description = "时间类型")
+    @TableField("time_type")
+    private String timeType;
+    @Schema(description = "客户")
+    @TableField("customer_id")
+    private String customerId;
+    @Schema(description = "项目名称")
+    @TableField("project_id")
+    private String projectId;
+    @Schema(description = "拜访目的")
+    @TableField("visit_purpose")
+    private String visitPurpose;
+    @Schema(description = "拜访省市区")
+    @TableField("visit_ssq")
+    private String visitSsq;
+    @Schema(description = "拜访地址")
+    @TableField("visit_address")
+    private String visitAddress;
+    @Schema(description = "拜访责任人")
+    @TableField("visit_responsible_man")
+    private String visitResponsibleMan;
+    @Schema(description = "完成客户名称")
+    @TableField("completed_customer_id")
+    private String completedCustomerId;
+    @Schema(description = "完成项目名称")
+    @TableField("completed_project_id")
+    private String completedProjectId;
+    @Schema(description = "完成拜访省市区")
+    @TableField("completed_visit_ssq")
+    private String completedVisitSsq;
+    @Schema(description = "完成拜访地址")
+    @TableField("completed_visit_address")
+    private String completedVisitAddress;
+    @Schema(description = "拜访结果")
+    @TableField("visit_result")
+    private String visitResult;
+    @Schema(description = "取消原因")
+    @TableField("cancel_reason")
+    private String cancelReason;
+    @Schema(description = "原因说明")
+    @TableField("reason_description")
+    private String reasonDescription;
+    @Schema(description = "状态(0新创建,1已完成,2已取消)")
+    @TableField("status")
+    private Integer status;
+
+
+    @Schema(description = "客户名称")
+    @TableField("customer_name")
+    private String customerName;
+    @Schema(description = "项目名称")
+    @TableField("project_name")
+    private String projectName;
+
+
+}

+ 43 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/domain/qry/BlinkCustomerVisitPlanQry.java

@@ -0,0 +1,43 @@
+package com.wx.blink.backend.domain.qry;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.wx.blink.base.common.domain.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BlinkCustomerVisitPlanQry extends PageParam {
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * 计划名称
+     */
+    private String planName;
+    /**
+     * 预计时间
+     */
+    private Date expectedTime;
+    /**
+     * 预计时间开始
+     */
+    private Date expectedTimeStart;
+    /**
+     * 预计时间结束
+     */
+    private Date expectedTimeEnd;
+    /**
+     * 拜访责任人
+     */
+    private String visitResponsibleMan;
+    /**
+     * 拜访省市区
+     */
+    private String visitSsq;
+
+}

+ 24 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/handler/CustomerRegisterProcessSubmitEventHandler.java

@@ -4,10 +4,12 @@ import com.alibaba.fastjson.JSONObject;
 import com.cloud.sa.flow.commom.domain.virentity.StInstanceEvent;
 import com.wx.blink.backend.domain.dataobject.BlinkCustomerDO;
 import com.wx.blink.backend.domain.dataobject.BlinkCustomerSeniorDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
 import com.wx.blink.backend.domain.dto.MBlinkCustomerSeniorVO;
 import com.wx.blink.backend.domain.dto.lBlinkCustomerRegisterVO;
 import com.wx.blink.backend.objectmapper.BlinkCustomerMapper;
 import com.wx.blink.backend.objectmapper.BlinkCustomerSeniorMapper;
+import com.wx.blink.backend.service.IBlinkCustomerMarketTeamService;
 import com.wx.blink.backend.service.IBlinkCustomerSeniorService;
 import com.wx.blink.backend.service.IBlinkCustomerService;
 import com.wx.blink.base.common.domain.ResponseDTO;
@@ -26,12 +28,14 @@ public class CustomerRegisterProcessSubmitEventHandler implements CustomizeProce
     private IBlinkCustomerService customerService;
     private BlinkCustomerSeniorMapper customerSeniorMapper;
     private IBlinkCustomerSeniorService seniorService;
+    private IBlinkCustomerMarketTeamService marketTeamService;
 
     public CustomerRegisterProcessSubmitEventHandler() {
         this.customerMapper = BlinkSpringUtil.getBean(BlinkCustomerMapper.class);
         this.customerService = BlinkSpringUtil.getBean(IBlinkCustomerService.class);
         this.customerSeniorMapper = BlinkSpringUtil.getBean(BlinkCustomerSeniorMapper.class);
         this.seniorService = BlinkSpringUtil.getBean(IBlinkCustomerSeniorService.class);
+        this.marketTeamService = BlinkSpringUtil.getBean(IBlinkCustomerMarketTeamService.class);
     }
     /**
      * 状态
@@ -85,6 +89,7 @@ public class CustomerRegisterProcessSubmitEventHandler implements CustomizeProce
             //取消时,状态为失效
             customerDO.setAuditStatus("03");
         }
+
         if (registerVo.getIsProviderSend() != null && registerVo.getIsProviderSend() == 1) {
             //数据来源为服务商列表发起的流程时,会同步获取到客户id
             if (registerVo.getProviderSendCusid() == null) {
@@ -98,6 +103,10 @@ public class CustomerRegisterProcessSubmitEventHandler implements CustomizeProce
             //如果是从服务商列表发起的,只进行更新操作
             customerDO.setUpdateTime(registerVo.getUpDate());
             customerDO.setUpdateUserId(registerVo.getUpdateBy());
+            if(state==4){
+                //流程结束时,插入营销团队的负责人
+                addMarketTeam(registerVo,registerVo.getProviderSendCusid());
+            }
             return customerService.supportsCustomerUpdate(customerDO, seniorDOs,true);
         } else {
             //用flow_id查询对应的客户
@@ -113,6 +122,10 @@ public class CustomerRegisterProcessSubmitEventHandler implements CustomizeProce
                 customerDO.setId(validateCustomer.getId());
                 customerDO.setUpdateTime(registerVo.getUpDate());
                 customerDO.setUpdateUserId(registerVo.getUpdateBy());
+                if(state==4){
+                    //流程结束时,插入营销团队的负责人
+                    addMarketTeam(registerVo,validateCustomer.getId());
+                }
                 return customerService.supportsCustomerUpdate(customerDO, seniorDOs,true);
             }
         }
@@ -134,4 +147,15 @@ public class CustomerRegisterProcessSubmitEventHandler implements CustomizeProce
 
         return provinceCityDistrict;
     }
+    /*添加营销团队*/
+    public void addMarketTeam (lBlinkCustomerRegisterVO registerVo,String customerId){
+        BlinkCustomerMarketTeamVO mtVo = new BlinkCustomerMarketTeamVO();
+        mtVo.setCreateUserId(registerVo.getCreateBy());
+        mtVo.setCreateTime(registerVo.getUpDate());
+        mtVo.setCustomerId(customerId);
+        mtVo.setBelongRegion(registerVo.getBelongRegion());
+        mtVo.setMarketStaff(registerVo.getMarketStaff());
+        mtVo.setPermission("01");
+        marketTeamService.addOrUpdate(mtVo);
+    }
 }

+ 58 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerDecisionChainImpl.java

@@ -0,0 +1,58 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerDecisionChainDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerTagDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerDecisionChainVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+import com.wx.blink.backend.objectmapper.BlinkCustomerDecisionChainMapper;
+import com.wx.blink.backend.objectmapper.BlinkCustomerTagMapper;
+import com.wx.blink.backend.repository.BlinkCustomerDecisionChainRepository;
+import com.wx.blink.backend.repository.BlinkCustomerTagRepository;
+import com.wx.blink.backend.service.IBlinkCustomerDecisionChainService;
+import com.wx.blink.backend.service.IBlinkCustomerTagService;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class BlinkCustomerDecisionChainImpl extends ServiceImpl<BlinkCustomerDecisionChainRepository, BlinkCustomerDecisionChainDO> implements IBlinkCustomerDecisionChainService {
+
+    @Resource
+    private BlinkCustomerDecisionChainRepository customerDecisionChainRepository;
+    @Resource
+    private BlinkCustomerDecisionChainMapper customerDecisionChainMapper;
+    @Override
+    public void addOrUpdate(BlinkCustomerDecisionChainVO vo) {
+        BlinkCustomerDecisionChainDO dcDo = customerDecisionChainMapper.customerDecisionChainVOtoDomain(vo);
+        if (dcDo != null) {
+            //有id更新,没有则新增
+            if (dcDo.getId() == null || dcDo.getId() == "") {
+                //创建人赋值
+                BlinkEntityUtil.setCreateInfo(dcDo);
+                this.save(dcDo);
+            } else {
+                //更新人赋值
+                BlinkEntityUtil.setUpdatedInfo(dcDo);
+                this.updateById(dcDo);
+            }
+        }
+    }
+
+    @Override
+    public void delete(BlinkCustomerDecisionChainVO vo) {
+        BlinkCustomerDecisionChainDO dcDo = customerDecisionChainMapper.customerDecisionChainVOtoDomain(vo);
+        this.removeById(dcDo);
+    }
+
+    @Override
+    public List<BlinkCustomerDecisionChainVO> getDecisionChainListByCustomerId(String customerId) {
+        List<BlinkCustomerDecisionChainVO> list = customerDecisionChainRepository.getDecisionChainListByCustomerId(customerId);
+        return list;
+    }
+
+
+}

+ 53 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerFollowActionImpl.java

@@ -0,0 +1,53 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowActionDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowVO;
+import com.wx.blink.backend.objectmapper.BlinkCustomerFollowActionMapper;
+import com.wx.blink.backend.objectmapper.BlinkCustomerFollowMapper;
+import com.wx.blink.backend.repository.BlinkCustomerFollowActionRepository;
+import com.wx.blink.backend.repository.BlinkCustomerFollowRepository;
+import com.wx.blink.backend.service.IBlinkCustomerFollowActionService;
+import com.wx.blink.backend.service.IBlinkCustomerFollowService;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class BlinkCustomerFollowActionImpl extends ServiceImpl<BlinkCustomerFollowActionRepository, BlinkCustomerFollowActionDO> implements IBlinkCustomerFollowActionService {
+
+    @Resource
+    private BlinkCustomerFollowActionRepository customerFollowActionRepository;
+    @Resource
+    private BlinkCustomerFollowActionMapper customerFollowActionMapper;
+
+    @Override
+    public void addOrUpdate(BlinkCustomerFollowActionVO vo) {
+        BlinkCustomerFollowActionDO actionDo = customerFollowActionMapper.customerFollowActionVOtoDomain(vo);
+        if (actionDo != null) {
+            //有id更新,没有则新增
+            if (actionDo.getId() == null || actionDo.getId() == "") {
+                //创建人赋值
+                BlinkEntityUtil.setCreateInfo(actionDo);
+                this.save(actionDo);
+            } else {
+                //更新人赋值
+                BlinkEntityUtil.setUpdatedInfo(actionDo);
+                this.updateById(actionDo);
+            }
+        }
+    }
+
+    @Override
+    public List<BlinkCustomerFollowActionVO> getFollowActionListByPid(String customerId) {
+        List<BlinkCustomerFollowActionVO> list = customerFollowActionRepository.getFollowActionListByPid(customerId);
+        return list;
+    }
+
+
+}

+ 58 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerFollowImpl.java

@@ -0,0 +1,58 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowVO;
+import com.wx.blink.backend.objectmapper.BlinkCustomerFollowMapper;
+import com.wx.blink.backend.repository.BlinkCustomerFollowRepository;
+import com.wx.blink.backend.service.IBlinkCustomerFollowActionService;
+import com.wx.blink.backend.service.IBlinkCustomerFollowService;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class BlinkCustomerFollowImpl extends ServiceImpl<BlinkCustomerFollowRepository, BlinkCustomerFollowDO> implements IBlinkCustomerFollowService {
+
+    @Resource
+    private BlinkCustomerFollowRepository customerFollowRepository;
+    @Resource
+    private BlinkCustomerFollowMapper customerFollowMapper;
+    @Resource
+    private IBlinkCustomerFollowActionService actionService;
+
+    @Override
+    public void addOrUpdate(BlinkCustomerFollowVO vo) {
+        BlinkCustomerFollowDO followDo = customerFollowMapper.customerFollowVOtoDomain(vo);
+        if (followDo != null) {
+            //有id更新,没有则新增
+            if (followDo.getId() == null || followDo.getId() == "") {
+                //创建人赋值
+                BlinkEntityUtil.setCreateInfo(followDo);
+                this.save(followDo);
+                if(vo.getFollowAction()!=null && !vo.getFollowAction().isEmpty()){
+                    for(BlinkCustomerFollowActionVO acrionVo : vo.getFollowAction()){
+                        acrionVo.setPid(followDo.getId());
+                        actionService.addOrUpdate(acrionVo);
+                    }
+                }
+            } else {
+                //更新人赋值
+                BlinkEntityUtil.setUpdatedInfo(followDo);
+                this.updateById(followDo);
+            }
+        }
+    }
+
+    @Override
+    public List<BlinkCustomerFollowVO> getFollowListByCustomerId(String customerId) {
+        List<BlinkCustomerFollowVO> list = customerFollowRepository.getFollowListByCustomerId(customerId);
+        return list;
+    }
+
+
+}

+ 70 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerMarketTeamImpl.java

@@ -0,0 +1,70 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+import com.wx.blink.backend.objectmapper.BlinkCustomerMarketTeamMapper;
+import com.wx.blink.backend.repository.BlinkCustomerMarketTeamRepository;
+import com.wx.blink.backend.service.IBlinkCustomerMarketTeamService;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Service
+public class BlinkCustomerMarketTeamImpl extends ServiceImpl<BlinkCustomerMarketTeamRepository, BlinkCustomerMarketTeamDO> implements IBlinkCustomerMarketTeamService {
+
+    @Resource
+    private BlinkCustomerMarketTeamRepository customerMarketTeamRepository;
+    @Resource
+    private BlinkCustomerMarketTeamMapper customerMarketTeamMapper;
+
+    @Override
+    public void addOrUpdate(BlinkCustomerMarketTeamVO vo) {
+        BlinkCustomerMarketTeamDO marketTeamDO = customerMarketTeamMapper.customerMarketTeamVOtoDomain(vo);
+        if (marketTeamDO != null) {
+            //有id更新,没有则新增
+            if (marketTeamDO.getId() == null || marketTeamDO.getId() == "") {
+                //创建人赋值
+                BlinkEntityUtil.setCreateInfo(marketTeamDO);
+                this.save(marketTeamDO);
+            } else {
+                //更新人赋值
+                BlinkEntityUtil.setUpdatedInfo(marketTeamDO);
+                this.updateById(marketTeamDO);
+            }
+        }
+    }
+
+    @Override
+    public void deleteByCustomerIdAndStaff(String customerId, String marketStaff) {
+        UpdateWrapper<BlinkCustomerMarketTeamDO> updateWrapper = new UpdateWrapper<>();
+        updateWrapper
+                // 设置更新条件(根据多个字段)
+                .eq("customer_id", customerId)
+                .eq("market_staff", marketStaff)
+                // 设置要更新的字段和值
+                .set("deleted_flag", 1);
+        this.update(null, updateWrapper);
+    }
+
+    @Override
+    public void deleteById(String id) {
+        UpdateWrapper<BlinkCustomerMarketTeamDO> updateWrapper = new UpdateWrapper<>();
+        updateWrapper
+                .eq("id", id)
+                .set("deleted_flag", 1);
+        this.update(null, updateWrapper);
+    }
+
+    @Override
+    public List<BlinkCustomerMarketTeamVO> getListByCustomerId(String customerId) {
+        List<BlinkCustomerMarketTeamVO> list = customerMarketTeamRepository.getListByCustomerId(customerId);
+        return list;
+    }
+
+
+}

+ 22 - 6
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerServiceImpl.java

@@ -1,25 +1,25 @@
 package com.wx.blink.backend.manager;
 
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.wx.blink.backend.domain.dataobject.BlinkBizFileDO;
 import com.wx.blink.backend.domain.dataobject.BlinkCustomerDO;
 import com.wx.blink.backend.domain.dataobject.BlinkCustomerSeniorDO;
 import com.wx.blink.backend.domain.dataobject.BlinkProviderDO;
-import com.wx.blink.backend.domain.dto.BlinkCustomerHeaderVO;
-import com.wx.blink.backend.domain.dto.BlinkCustomerReleaseVO;
-import com.wx.blink.backend.domain.dto.BlinkCustomerTransferVO;
-import com.wx.blink.backend.domain.dto.BlinkCustomerUsedNameVO;
+import com.wx.blink.backend.domain.dto.*;
 import com.wx.blink.backend.domain.qry.BlinkBizFileQry;
 import com.wx.blink.backend.objectmapper.BlinkCustomerMapper;
 import com.wx.blink.backend.repository.BlinkCustomerRepository;
 import com.wx.blink.backend.repository.BlinkProviderRepository;
 import com.wx.blink.backend.service.*;
 import com.wx.blink.base.common.domain.PageResult;
+import com.wx.blink.base.common.domain.RequestUser;
 import com.wx.blink.base.common.domain.ResponseDTO;
 import com.wx.blink.base.common.util.BlinkEntityUtil;
 import com.wx.blink.base.common.util.BlinkEnumUtil;
 import com.wx.blink.base.common.util.BlinkPageUtil;
+import com.wx.blink.base.common.util.BlinkRequestUtil;
 import com.wx.blink.base.module.support.datatracer.constant.DataTracerConst;
 import com.wx.blink.base.module.support.datatracer.constant.DataTracerTypeEnum;
 import com.wx.blink.base.module.support.datatracer.domain.form.DataTracerForm;
@@ -61,6 +61,8 @@ public class BlinkCustomerServiceImpl extends ServiceImpl<BlinkCustomerRepositor
     private IBlinkCustomerTransferService transferService;
     @Resource
     private IBlinkCustomerReleaseService releaseService;
+    @Resource
+    private IBlinkCustomerMarketTeamService marketTeamService;
 
     @Override
     public ResponseDTO<String> supportsCustomerCreate(BlinkCustomerCreateVO dto) {
@@ -289,8 +291,20 @@ public class BlinkCustomerServiceImpl extends ServiceImpl<BlinkCustomerRepositor
 
     @Override
     public ResponseDTO<String> customerTransfer(BlinkCustomerTransferVO vo) {
-        customerRepository.customerTransfer(vo);
-        transferService.addOrUpdate(vo);
+        customerRepository.customerTransfer(vo);//客户转移
+        transferService.addOrUpdate(vo);//数据保存
+        //删除营销团队中的归属营销人员
+        marketTeamService.deleteByCustomerIdAndStaff(vo.getCusid(),vo.getMarketStaff());
+        //新增新的营销负责人
+        BlinkCustomerMarketTeamVO mtVo = new BlinkCustomerMarketTeamVO();
+        RequestUser employee = BlinkRequestUtil.getRequestUser();
+        mtVo.setCreateUserId(employee.getUserCode());
+        mtVo.setCreateTime(DateUtil.date());
+        mtVo.setCustomerId(vo.getCusid());
+        mtVo.setBelongRegion(vo.getBelongRegion());
+        mtVo.setMarketStaff(vo.getMarketStaff());
+        mtVo.setPermission("01");
+        marketTeamService.addOrUpdate(mtVo);
         return ResponseDTO.ok();
     }
 
@@ -303,6 +317,8 @@ public class BlinkCustomerServiceImpl extends ServiceImpl<BlinkCustomerRepositor
         if(vo.getReason()!=null) reason = reason+vo.getReason();
         DataTracerForm form = DataTracerForm.builder().dataId(vo.getCusid()).type(DataTracerTypeEnum.CUSTOMER).content(reason).build();
         dataTracerService.addTrace(form);
+        //删除营销团队中的归属营销人员
+        marketTeamService.deleteByCustomerIdAndStaff(vo.getCusid(),vo.getMarketStaff());
         return ResponseDTO.ok();
     }
 

+ 127 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/manager/BlinkCustomerVisitPlanImpl.java

@@ -0,0 +1,127 @@
+package com.wx.blink.backend.manager;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitPlanDO;
+import com.wx.blink.backend.domain.dataobject.BlinkProviderDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanCalendarVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanStatisticsVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitPlanQry;
+import com.wx.blink.backend.objectmapper.BlinkCustomerVisitPlanMapper;
+import com.wx.blink.backend.repository.BlinkCustomerVisitPlanRepository;
+import com.wx.blink.backend.service.IBlinkCustomerVisitPlanService;
+import com.wx.blink.base.common.domain.PageResult;
+import com.wx.blink.base.common.domain.ResponseDTO;
+import com.wx.blink.base.common.util.BlinkEntityUtil;
+import com.wx.blink.base.common.util.BlinkPageUtil;
+import com.wx.blink.common.qry.BlinkCustomerQry;
+import com.wx.blink.common.vo.BlinkCustomerStatisticsVO;
+import com.wx.blink.common.vo.BlinkCustomerVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service
+public class BlinkCustomerVisitPlanImpl extends ServiceImpl<BlinkCustomerVisitPlanRepository, BlinkCustomerVisitPlanDO> implements IBlinkCustomerVisitPlanService {
+
+    @Resource
+    private BlinkCustomerVisitPlanRepository customerVisitPlanRepository;
+    @Resource
+    private BlinkCustomerVisitPlanMapper customerVisitPlanMapper;
+
+    @Override
+    public void addOrUpdate(BlinkCustomerVisitPlanVO vo) {
+        BlinkCustomerVisitPlanDO visitPlanDO = customerVisitPlanMapper.customerVisitPlanDVOtoDomain(vo);
+        if (visitPlanDO != null) {
+            //有id更新,没有则新增
+            if (visitPlanDO.getId() == null || visitPlanDO.getId() == "") {
+                //创建人赋值
+                BlinkEntityUtil.setCreateInfo(visitPlanDO);
+                this.save(visitPlanDO);
+            } else {
+                //更新人赋值
+                BlinkEntityUtil.setUpdatedInfo(visitPlanDO);
+                this.updateById(visitPlanDO);
+            }
+        }
+    }
+
+    @Override
+    public void visitCancel(BlinkCustomerVisitPlanVO vo) {
+        UpdateWrapper<BlinkCustomerVisitPlanDO> updateWrapper = new UpdateWrapper<>();
+        updateWrapper
+                .eq("id", vo.getId())
+                .set("status", 2)
+                .set("cancel_reason", vo.getCancelReason())
+                .set("reason_description", vo.getReasonDescription());
+        this.update(null, updateWrapper);
+    }
+
+    @Override
+    public void visitCompleted(BlinkCustomerVisitPlanVO vo) {
+        UpdateWrapper<BlinkCustomerVisitPlanDO> updateWrapper = new UpdateWrapper<>();
+        updateWrapper
+                .eq("id", vo.getId())
+                .set("status", 1)
+                .set("completed_customer_id", vo.getCompletedCustomerId())
+                .set("completed_project_id", vo.getCompletedProjectId())
+                .set("completed_visit_ssq", vo.getCompletedVisitSsq())
+                .set("completed_visit_address", vo.getCompletedVisitAddress())
+                .set("visit_result", vo.getVisitResult());
+        this.update(null, updateWrapper);
+    }
+
+    @Override
+    public PageResult<BlinkCustomerVisitPlanVO> visitPlanQueryPage(BlinkCustomerVisitPlanQry qry) {
+        Page<?> page = BlinkPageUtil.convert2PageQuery(qry);
+        List<BlinkCustomerVisitPlanVO> list = customerVisitPlanRepository.visitPlanQueryPage(page, qry);
+        PageResult<BlinkCustomerVisitPlanVO> pageResult = BlinkPageUtil.convert2PageResult(page, list);
+        return pageResult;
+    }
+
+    @Override
+    public BlinkCustomerVisitPlanStatisticsVO visitPlanStatisticsInfo(BlinkCustomerVisitPlanQry qry) {
+        List<BlinkCustomerVisitPlanVO> list = customerVisitPlanRepository.visitPlanQueryPage(null, qry);
+        return getVisitPlanStatisticsInfo(list);
+    }
+
+    @Override
+    public List<BlinkCustomerVisitPlanCalendarVO> getVisitPlanCalendarNum() {
+        List<BlinkCustomerVisitPlanCalendarVO> list = customerVisitPlanRepository.getVisitPlanCalendarNum();
+        return list;
+    }
+
+    @Override
+    public BlinkCustomerVisitPlanVO visitPlanSingleQuery(String id) {
+        BlinkCustomerVisitPlanQry qry = new BlinkCustomerVisitPlanQry();
+        qry.setId(id);
+        List<BlinkCustomerVisitPlanVO> list = customerVisitPlanRepository.visitPlanQueryPage(null, qry);
+        if(list!=null&&!list.isEmpty()) return list.get(0);
+        else return new BlinkCustomerVisitPlanVO();
+    }
+
+    public BlinkCustomerVisitPlanStatisticsVO getVisitPlanStatisticsInfo(List<BlinkCustomerVisitPlanVO> list){
+        Map<Integer, Integer> countTypes = list.stream()
+                .map(obj -> obj.getStatus() == null ? 0: obj.getStatus()) // 将null转为字符串"00",作为待审核的状态
+                .collect(Collectors.groupingBy(
+                        status -> status,
+                        Collectors.reducing(
+                                0,  // 初始值
+                                obj -> 1,  // 映射函数,每个元素计为1
+                                Integer::sum  // 归约操作,累加
+                        )
+                ));
+        BlinkCustomerVisitPlanStatisticsVO statisticsVO = new BlinkCustomerVisitPlanStatisticsVO();
+        statisticsVO.setToBeCompletedQty(countTypes.getOrDefault(0,0));
+        statisticsVO.setCompletedQty(countTypes.getOrDefault(1,0));
+        return statisticsVO;
+    }
+
+}

+ 24 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerDecisionChainMapper.java

@@ -0,0 +1,24 @@
+package com.wx.blink.backend.objectmapper;
+
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerDecisionChainDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerTagDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerDecisionChainVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+import com.wx.blink.base.common.util.BlinkStringUtil;
+import org.mapstruct.Mapper;
+
+
+@Mapper(componentModel = "spring", imports = {BlinkStringUtil.class})
+public interface BlinkCustomerDecisionChainMapper {
+
+    /**
+     * 客户决策链数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerDecisionChainDO customerDecisionChainVOtoDomain(BlinkCustomerDecisionChainVO vo);
+
+
+
+}

+ 24 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerFollowActionMapper.java

@@ -0,0 +1,24 @@
+package com.wx.blink.backend.objectmapper;
+
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowActionDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerTagDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+import com.wx.blink.base.common.util.BlinkStringUtil;
+import org.mapstruct.Mapper;
+
+
+@Mapper(componentModel = "spring", imports = {BlinkStringUtil.class})
+public interface BlinkCustomerFollowActionMapper {
+
+    /**
+     * 客户标签数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerFollowActionDO customerFollowActionVOtoDomain(BlinkCustomerFollowActionVO vo);
+
+
+
+}

+ 22 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerFollowMapper.java

@@ -0,0 +1,22 @@
+package com.wx.blink.backend.objectmapper;
+
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowVO;
+import com.wx.blink.base.common.util.BlinkStringUtil;
+import org.mapstruct.Mapper;
+
+
+@Mapper(componentModel = "spring", imports = {BlinkStringUtil.class})
+public interface BlinkCustomerFollowMapper {
+
+    /**
+     * 客户标签数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerFollowDO customerFollowVOtoDomain(BlinkCustomerFollowVO vo);
+
+
+
+}

+ 24 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerMarketTeamMapper.java

@@ -0,0 +1,24 @@
+package com.wx.blink.backend.objectmapper;
+
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerReleaseDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerReleaseVO;
+import com.wx.blink.base.common.util.BlinkStringUtil;
+import org.mapstruct.Mapper;
+
+
+@Mapper(componentModel = "spring", imports = {BlinkStringUtil.class})
+public interface BlinkCustomerMarketTeamMapper {
+
+    /**
+     * 客户转移数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerMarketTeamDO customerMarketTeamVOtoDomain(BlinkCustomerMarketTeamVO vo);
+
+
+
+}

+ 22 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/objectmapper/BlinkCustomerVisitPlanMapper.java

@@ -0,0 +1,22 @@
+package com.wx.blink.backend.objectmapper;
+
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitPlanDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanVO;
+import com.wx.blink.base.common.util.BlinkStringUtil;
+import org.mapstruct.Mapper;
+
+
+@Mapper(componentModel = "spring", imports = {BlinkStringUtil.class})
+public interface BlinkCustomerVisitPlanMapper {
+
+    /**
+     * 客户拜访计划数据VO转do
+     *
+     * @param vo
+     * @return
+     */
+    BlinkCustomerVisitPlanDO customerVisitPlanDVOtoDomain(BlinkCustomerVisitPlanVO vo);
+
+
+
+}

+ 23 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerDecisionChainRepository.java

@@ -0,0 +1,23 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerDecisionChainDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerTagDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerDecisionChainVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerDecisionChainRepository extends BaseMapper<BlinkCustomerDecisionChainDO> {
+
+    /**
+     * 客户决策链查询
+     *
+     * @param customerId
+     * @return
+     */
+    List<BlinkCustomerDecisionChainVO> getDecisionChainListByCustomerId(@Param("customerId") String customerId);
+}

+ 23 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerFollowActionRepository.java

@@ -0,0 +1,23 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowActionDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerTagDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerFollowActionRepository extends BaseMapper<BlinkCustomerFollowActionDO> {
+
+    /**
+     * 客户标签查询
+     *
+     * @param pid
+     * @return
+     */
+    List<BlinkCustomerFollowActionVO> getFollowActionListByPid(@Param("pid") String pid);
+}

+ 23 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerFollowRepository.java

@@ -0,0 +1,23 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowDO;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerTagDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerFollowRepository extends BaseMapper<BlinkCustomerFollowDO> {
+
+    /**
+     * 客户跟进情况查询
+     *
+     * @param customerId
+     * @return
+     */
+    List<BlinkCustomerFollowVO> getFollowListByCustomerId(@Param("customerId") String customerId);
+}

+ 21 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerMarketTeamRepository.java

@@ -0,0 +1,21 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerMarketTeamRepository extends BaseMapper<BlinkCustomerMarketTeamDO> {
+
+    /**
+     * 客户标签查询
+     *
+     * @param customerId
+     * @return
+     */
+    List<BlinkCustomerMarketTeamVO> getListByCustomerId(@Param("customerId") String customerId);
+}

+ 31 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/repository/BlinkCustomerVisitPlanRepository.java

@@ -0,0 +1,31 @@
+package com.wx.blink.backend.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitPlanDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanCalendarVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitPlanQry;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BlinkCustomerVisitPlanRepository extends BaseMapper<BlinkCustomerVisitPlanDO> {
+
+    /**
+     * 拜访查询
+     *
+     * @param page
+     * @param qry
+     * @return
+     */
+    List<BlinkCustomerVisitPlanVO> visitPlanQueryPage(Page<?> page, @Param("query") BlinkCustomerVisitPlanQry qry);
+    /**
+     * 拜访计划日历数据个数查询
+     *
+     * @return
+     */
+    List<BlinkCustomerVisitPlanCalendarVO> getVisitPlanCalendarNum();
+}

+ 33 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerDecisionChainService.java

@@ -0,0 +1,33 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerDecisionChainDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerDecisionChainVO;
+
+import java.util.List;
+
+
+public interface IBlinkCustomerDecisionChainService extends IService<BlinkCustomerDecisionChainDO> {
+    /**
+     * 客户决策链新增、更新
+     *
+     * @param vo
+     * @return
+     */
+    void addOrUpdate(BlinkCustomerDecisionChainVO vo);
+    /**
+     * 客户决策链删除
+     *
+     * @param vo
+     * @return
+     */
+    void delete(BlinkCustomerDecisionChainVO vo);
+
+    /**
+     * 客户决策链查询
+     *
+     * @param customerId
+     * @return
+     */
+    List<BlinkCustomerDecisionChainVO> getDecisionChainListByCustomerId(String customerId);
+}

+ 26 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerFollowActionService.java

@@ -0,0 +1,26 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowActionDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO;
+
+import java.util.List;
+
+
+public interface IBlinkCustomerFollowActionService extends IService<BlinkCustomerFollowActionDO> {
+    /**
+     * 客户跟进情况新增、更新
+     *
+     * @param vo
+     * @return
+     */
+    void addOrUpdate(BlinkCustomerFollowActionVO vo);
+
+    /**
+     * 客户跟进行动查询
+     *
+     * @param pid
+     * @return
+     */
+    List<BlinkCustomerFollowActionVO> getFollowActionListByPid(String pid);
+}

+ 27 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerFollowService.java

@@ -0,0 +1,27 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerFollowDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerFollowVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerTagVO;
+
+import java.util.List;
+
+
+public interface IBlinkCustomerFollowService extends IService<BlinkCustomerFollowDO> {
+    /**
+     * 客户跟进情况新增、更新
+     *
+     * @param vo
+     * @return
+     */
+    void addOrUpdate(BlinkCustomerFollowVO vo);
+
+    /**
+     * 客户跟进情况查询
+     *
+     * @param customerId
+     * @return
+     */
+    List<BlinkCustomerFollowVO> getFollowListByCustomerId(String customerId);
+}

+ 39 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerMarketTeamService.java

@@ -0,0 +1,39 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerMarketTeamDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO;
+
+import java.util.List;
+
+
+public interface IBlinkCustomerMarketTeamService extends IService<BlinkCustomerMarketTeamDO> {
+    /**
+     * 客户标签新增、更新
+     *
+     * @param vo
+     * @return
+     */
+    void addOrUpdate(BlinkCustomerMarketTeamVO vo);
+    /**
+     * 客户标签删除
+     *
+     * @param vo
+     * @return
+     */
+    void deleteByCustomerIdAndStaff(String customerId, String marketStaff);/**
+     * 客户标签删除
+     *
+     * @param vo
+     * @return
+     */
+    void deleteById(String id);
+
+    /**
+     * 客户标签查询
+     *
+     * @param customerId
+     * @return
+     */
+    List<BlinkCustomerMarketTeamVO> getListByCustomerId(String customerId);
+}

+ 69 - 0
bound-link-api/blink-backend/src/main/java/com/wx/blink/backend/service/IBlinkCustomerVisitPlanService.java

@@ -0,0 +1,69 @@
+package com.wx.blink.backend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.wx.blink.backend.domain.dataobject.BlinkCustomerVisitPlanDO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanCalendarVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanStatisticsVO;
+import com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanVO;
+import com.wx.blink.backend.domain.qry.BlinkCustomerVisitPlanQry;
+import com.wx.blink.base.common.domain.PageResult;
+import com.wx.blink.base.common.domain.ResponseDTO;
+import com.wx.blink.common.qry.BlinkCustomerQry;
+import com.wx.blink.common.vo.BlinkCustomerStatisticsVO;
+import com.wx.blink.common.vo.BlinkCustomerVO;
+
+import java.util.List;
+
+
+public interface IBlinkCustomerVisitPlanService extends IService<BlinkCustomerVisitPlanDO> {
+    /**
+     * 客户拜访新增、更新
+     *
+     * @param vo
+     * @return
+     */
+    void addOrUpdate(BlinkCustomerVisitPlanVO vo);
+    /**
+     * 取消拜访
+     *
+     * @param vo
+     * @return
+     */
+    void visitCancel(BlinkCustomerVisitPlanVO vo);
+    /**
+     * 完成拜访
+     *
+     * @param vo
+     * @return
+     */
+    void visitCompleted(BlinkCustomerVisitPlanVO vo);
+
+    /**
+     * 客户拜访查询
+     *
+     * @param qry
+     * @return
+     */
+    PageResult<BlinkCustomerVisitPlanVO> visitPlanQueryPage(BlinkCustomerVisitPlanQry qry);
+
+    /**
+     * 拜访计划查询列表表头统计数据接口
+     *
+     * @param qry
+     * @return
+     */
+    BlinkCustomerVisitPlanStatisticsVO visitPlanStatisticsInfo(BlinkCustomerVisitPlanQry qry);
+    /**
+     * 拜访计划日历数据个数查询
+     *
+     * @return
+     */
+    List<BlinkCustomerVisitPlanCalendarVO> getVisitPlanCalendarNum();
+    /**
+     * 获取拜访计划详细信息
+     *
+     * @param id
+     * @return
+     */
+    BlinkCustomerVisitPlanVO visitPlanSingleQuery(String id);
+}

+ 10 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerDecisionChainRepositoryMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wx.blink.backend.repository.BlinkCustomerDecisionChainRepository">
+    <select id="getDecisionChainListByCustomerId" resultType="com.wx.blink.backend.domain.dto.BlinkCustomerDecisionChainVO">
+        select *
+        from blink_customer_decision_chain
+        where deleted_flag = '0' and customer_id = #{customerId}
+        order by create_time asc
+    </select>
+</mapper>

+ 10 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerFollowActionRepositoryMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wx.blink.backend.repository.BlinkCustomerFollowActionRepository">
+    <select id="getFollowActionListByPid" resultType="com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO">
+        select *
+        from blink_customer_follow_action
+        where deleted_flag = '0' and pid = #{pid}
+        order by create_time desc
+    </select>
+</mapper>

+ 35 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerFollowRepositoryMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wx.blink.backend.repository.BlinkCustomerFollowRepository">
+    <resultMap id="followWithChildren" type="com.wx.blink.backend.domain.dto.BlinkCustomerFollowVO">
+        <id property="id" column="id"/>
+        <result property="deletedFlag" column="deleted_flag"/>
+        <result property="createUserId" column="create_user_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateUserId" column="update_user_id"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="customerId" column="customer_id"/>
+        <result property="followContent" column="follow_content"/>
+        <result property="followMethod" column="follow_method"/>
+        <result property="followType" column="follow_type"/>
+        <result property="followProject" column="follow_project"/>
+        <result property="attachments" column="attachments"/>
+        <result property="position" column="position"/>
+        <!-- 一对多关联 -->
+        <collection property="followAction" ofType="com.wx.blink.backend.domain.dto.BlinkCustomerFollowActionVO">
+            <id property="id" column="tid"/>
+            <result property="pid" column="pid"/>
+            <result property="followAction" column="follow_action"/>
+            <result property="thisTimeEffect" column="this_time_effect"/>
+            <result property="relevantMan" column="relevant_man"/>
+        </collection>
+    </resultMap>
+    <select id="getFollowListByCustomerId" resultMap="followWithChildren">
+        select a.*
+             ,b.id tid,b.pid,b.follow_action,b.this_time_effect,b.relevant_man
+        from blink_customer_follow a
+                 left join blink_customer_follow_action b on a.id=b.pid and b.deleted_flag = '0'
+        where a.deleted_flag = '0'  and a.customer_id = #{customerId}
+        order by a.create_time desc
+    </select>
+</mapper>

+ 10 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerMarketTeamRepositoryMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wx.blink.backend.repository.BlinkCustomerMarketTeamRepository">
+    <select id="getListByCustomerId" resultType="com.wx.blink.backend.domain.dto.BlinkCustomerMarketTeamVO">
+        select mt.*
+        from blink_customer_market_team mt
+        where mt.deleted_flag = '0' and mt.customer_id = #{customerId}
+        order by mt.permission asc,mt.create_time asc
+    </select>
+</mapper>

+ 47 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkCustomerVisitPlanRepositoryMapper.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wx.blink.backend.repository.BlinkCustomerVisitPlanRepository">
+    <select id="visitPlanQueryPage" resultType="com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanVO">
+        select a.*,b.customer_name,c.project_name
+        from blink_customer_visit_plan a
+        left join blink_customer b on a.customer_id=b.id
+        left join blink_project c on a.project_id=c.id
+        where a.deleted_flag = '0'
+        <if test="query.id != null and query.id !=''">
+            AND a.id = #{query.id}
+        </if>
+        <if test="query.planName != null and query.planName !=''">
+            AND a.plan_name like concat('%', #{query.planName}, '%')
+        </if>
+        <if test="query.visitResponsibleMan != null and query.visitResponsibleMan !=''">
+            AND a.visitResponsibleMan = #{query.visitResponsibleMan}
+        </if>
+        <if test="query.expectedTime != null and query.expectedTime !=''">
+            AND a.expected_time = #{query.expectedTime}
+        </if>
+        <if test="query.expectedTimeStart != null and query.expectedTimeStart !=''">
+            AND a.expected_time &gt;= #{query.expectedTimeStart}
+        </if>
+        <if test="query.expectedTimeEnd != null and query.expectedTimeEnd !=''">
+            AND a.expected_time &lt;= #{query.expectedTimeEnd}
+        </if>
+        <if test="query.visitSsq != null and query.visitSsq !=''">
+            AND a.visit_ssq = #{query.visitSsq}
+        </if>
+        order by a.create_time desc
+    </select>
+    <select id="getVisitPlanCalendarNum" resultType="com.wx.blink.backend.domain.dto.BlinkCustomerVisitPlanCalendarVO">
+        WITH RECURSIVE dates AS (
+            SELECT DATE(DATE_FORMAT(CURRENT_DATE(), '%Y-%m-01')) AS date
+            UNION ALL
+            SELECT date + INTERVAL 1 DAY
+            FROM dates
+            WHERE date &lt; LAST_DAY(CURRENT_DATE())
+        )
+        SELECT DAY(d.date) AS day_of_month,COUNT(t.id) AS daily_count
+        FROM dates d
+        LEFT JOIN blink_customer_visit_plan t ON DATE(t.expected_time) = d.date
+        GROUP BY d.date
+        ORDER BY day_of_month;
+    </select>
+</mapper>

+ 3 - 0
bound-link-api/blink-backend/src/main/resources/mapper/BlinkProjectRepositoryMapper.xml

@@ -18,6 +18,9 @@
         <if test="query.projectName != null and query.projectName !=''">
             AND project_name like concat('%', #{query.projectName}, '%')
         </if>
+        <if test="query.partAUnit != null and query.partAUnit !=''">
+            AND part_a_unit like concat('%', #{query.partAUnit}, '%')
+        </if>
         AND grade_code = 0
         AND create_user_id = #{query.createUserId}
         order by create_time desc

+ 5 - 0
bound-link-api/blink-common-dto/src/main/java/com/wx/blink/common/qry/BlinkProjectQry.java

@@ -28,4 +28,9 @@ public class BlinkProjectQry extends PageParam {
      */
     private String createUserId;
 
+    /**
+     * 甲方单位
+     */
+    private String partAUnit;
+
 }