diff --git a/huike-admin/src/main/java/com/huike/HuiKeApplication.java b/huike-admin/src/main/java/com/huike/HuiKeApplication.java index 8afcd6c37c44d5518b7ff00a7a6c08e9fc70fde2..1777485b42b090e274fad4be8536baac4902fedd 100644 --- a/huike-admin/src/main/java/com/huike/HuiKeApplication.java +++ b/huike-admin/src/main/java/com/huike/HuiKeApplication.java @@ -1,15 +1,12 @@ package com.huike; import com.huike.clues.service.ITbActivityService; -import com.huike.clues.service.impl.SysDictTypeServiceImpl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; /** * 启动程序 @@ -18,7 +15,8 @@ import org.springframework.scheduling.annotation.EnableScheduling; */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class}) @EnableScheduling -public class HuiKeApplication implements CommandLineRunner { +@EnableTransactionManagement +public class HuiKeApplication /*implements CommandLineRunner */{ @Autowired private ITbActivityService activityService; @@ -27,7 +25,7 @@ public class HuiKeApplication implements CommandLineRunner { SpringApplication.run(HuiKeApplication.class, args); } - @Override + /*@Override public void run(String... args) { try{ //加载所有活动code到缓存 @@ -35,6 +33,6 @@ public class HuiKeApplication implements CommandLineRunner { }catch (Exception ex){ ex.printStackTrace(); } - } + }*/ } diff --git a/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessController.java b/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessController.java index 735bbec1db59cea578293d302f8fb5208627cafd..8f5d0d47ca66d18fb296b671fd726ecb23362746 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessController.java @@ -1,20 +1,5 @@ package com.huike.web.controller.business; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.huike.business.domain.TbBusiness; import com.huike.business.service.ITbBusinessService; import com.huike.clues.domain.vo.AssignmentVo; @@ -25,6 +10,12 @@ import com.huike.common.core.domain.AjaxResult; import com.huike.common.core.page.TableDataInfo; import com.huike.common.enums.BusinessType; import com.huike.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; /** * 商机Controller @@ -133,12 +124,22 @@ public class TbBusinessController extends BaseController { /** * 批量捞取 */ - @PreAuthorize("@ss.hasPermi('business:business:gainbussiness')") + @PreAuthorize("@ss.hasPermi('business:business:gain')") @Log(title = "批量捞取", businessType = BusinessType.UPDATE) @PutMapping("/gain") public AjaxResult gain(@RequestBody AssignmentVo assignmentVo) { return AjaxResult.success(tbBusinessService.gain(assignmentVo.getIds(),assignmentVo.getUserId())); } + /** + * 退回公海 + */ + @PreAuthorize("@ss.hasPermi('business:business:back')") + @Log(title = "退回公海", businessType = BusinessType.UPDATE) + @PutMapping("/back/{id}/{reason}") + public AjaxResult back(@PathVariable Long id,@PathVariable String reason) { + tbBusinessService.back(id,reason); + return AjaxResult.success(); + } diff --git a/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessTrackRecordController.java b/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessTrackRecordController.java index cb0ea1e4876fad0e9562d1b5a8a95e608e2f98c3..f532194c9a2e9a0d6507797871a5ff926ce8060e 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessTrackRecordController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/business/TbBusinessTrackRecordController.java @@ -1,30 +1,17 @@ package com.huike.web.controller.business; -import java.util.List; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.huike.business.domain.TbBusiness; import com.huike.business.domain.TbBusinessTrackRecord; import com.huike.business.domain.vo.BusinessTrackVo; -import com.huike.business.service.ITbBusinessService; import com.huike.business.service.ITbBusinessTrackRecordService; import com.huike.clues.service.ISysDictDataService; import com.huike.common.annotation.Log; import com.huike.common.core.controller.BaseController; import com.huike.common.core.domain.AjaxResult; +import com.huike.common.core.page.TableDataInfo; import com.huike.common.enums.BusinessType; -import com.huike.common.utils.DateUtils; -import com.huike.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; /** * 商机跟进记录Controller @@ -45,9 +32,9 @@ public class TbBusinessTrackRecordController extends BaseController { */ @PreAuthorize("@ss.hasPermi('business:record:list')") @GetMapping("/list") - public AjaxResult list(@RequestParam("businessId")Long id){ - - return null; + public TableDataInfo list(@RequestParam("businessId")Long id){ + startPage(); + return getDataTable(tbBusinessTrackRecordService.select(id)); } /** @@ -57,6 +44,7 @@ public class TbBusinessTrackRecordController extends BaseController { @Log(title = "商机跟进记录", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody BusinessTrackVo businessTrackVo){ - return null; + tbBusinessTrackRecordService.add(businessTrackVo); + return AjaxResult.success(); } } \ No newline at end of file diff --git a/huike-admin/src/main/java/com/huike/web/controller/clues/TbActivityController.java b/huike-admin/src/main/java/com/huike/web/controller/clues/TbActivityController.java index 83da5c2b42a32de91d5a1c8bcaa25088e0b58e7a..4b4c024d977695722153c3f9ceb48cc94b037152 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/clues/TbActivityController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/clues/TbActivityController.java @@ -1,19 +1,5 @@ package com.huike.web.controller.clues; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.huike.clues.domain.TbActivity; import com.huike.clues.service.ITbActivityService; import com.huike.common.annotation.Log; @@ -21,6 +7,16 @@ import com.huike.common.core.controller.BaseController; import com.huike.common.core.domain.AjaxResult; import com.huike.common.core.page.TableDataInfo; import com.huike.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 活动管理Controller @@ -60,6 +56,12 @@ public class TbActivityController extends BaseController { TbActivity tbActivity =new TbActivity(); tbActivity.setChannel(channel); tbActivity.setStatus("2"); + HashMap params = new HashMap<>(); + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd").toFormatter(); + String format = now.format(formatter); + params.put("endTime", format); + tbActivity.setParams(params); return AjaxResult.success(tbActivityService.selectTbActivityList(tbActivity)); } diff --git a/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueController.java b/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueController.java index 8022845e64d252de539308191d76cb5bc0f7224d..65a596b702e9c8dd67c1d57355e1a15f4896f45e 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueController.java @@ -1,32 +1,26 @@ package com.huike.web.controller.clues; -import java.util.List; - -import com.huike.common.annotation.DataScope; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSONObject; import com.huike.business.service.ITbBusinessService; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.vo.AssignmentVo; import com.huike.clues.domain.vo.TbClueExcelVo; import com.huike.clues.service.ITbActivityService; import com.huike.clues.service.ITbClueService; +import com.huike.clues.service.ITbClueTrackRecordService; import com.huike.clues.utils.easyExcel.ExcelListener; import com.huike.common.annotation.Log; import com.huike.common.core.controller.BaseController; import com.huike.common.core.domain.AjaxResult; import com.huike.common.core.page.TableDataInfo; import com.huike.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; /** * 线索管理Controller @@ -41,6 +35,8 @@ public class TbClueController extends BaseController { @Autowired private ITbBusinessService tbBusinessService; + @Autowired + private ITbClueTrackRecordService clueTrackRecordService; @Autowired private ITbActivityService activityService; @@ -148,5 +144,18 @@ public class TbClueController extends BaseController { EasyExcel.read(file.getInputStream(), TbClueExcelVo.class, excelListener).sheet().doRead(); return AjaxResult.success(excelListener.getResult()); } + /** + * 伪线索 + * @param id + * @return + */ + @Log(title = "伪线索", businessType = BusinessType.UPDATE) + @PutMapping("/false/{id}") + public AjaxResult disable(@PathVariable Long id, @RequestBody JSONObject jsonObject) { + String reason = jsonObject.getString("reason"); + String remark = jsonObject.getString("remark"); + clueTrackRecordService.disable(id,reason,remark); + return AjaxResult.success(); + } } \ No newline at end of file diff --git a/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueTrackRecordController.java b/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueTrackRecordController.java index 7301862fb9b2817a524b9884816a0dda8630c37b..78217720c1e7a07f85feb1f0be595ab488768312 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueTrackRecordController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/clues/TbClueTrackRecordController.java @@ -4,35 +4,42 @@ package com.huike.web.controller.clues; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.TbClueTrackRecord; import com.huike.clues.domain.vo.ClueTrackRecordVo; +import com.huike.clues.service.ITbClueTrackRecordService; import com.huike.common.annotation.Log; import com.huike.common.core.controller.BaseController; import com.huike.common.core.domain.AjaxResult; import com.huike.common.core.page.TableDataInfo; import com.huike.common.enums.BusinessType; -import com.huike.common.utils.DateUtils; import com.huike.common.utils.SecurityUtils; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import java.util.List; +import java.util.Date; /** * 线索跟进记录Controller * @date 2021-04-22 */ + + @RestController @RequestMapping("/clues/record") public class TbClueTrackRecordController extends BaseController { + @Autowired + private ITbClueTrackRecordService iTbClueTrackRecordService; + /** * 查询线索跟进记录列表 */ @PreAuthorize("@ss.hasPermi('clues:record:list')") @GetMapping("/list") - public TableDataInfo list(@RequestParam("clueId")Long clueId) { - return null; + public TableDataInfo list(@RequestParam("clueId") Long clueId) { + startPage(); + return getDataTable(iTbClueTrackRecordService.getList(clueId)); } @@ -43,6 +50,21 @@ public class TbClueTrackRecordController extends BaseController { @Log(title = "线索跟进记录", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody ClueTrackRecordVo tbClueTrackRecord) { - return null; + try { + TbClueTrackRecord tbClueTrack = new TbClueTrackRecord(); + BeanUtils.copyProperties(tbClueTrackRecord, tbClueTrack); + tbClueTrack.setCreateTime(new Date()); + tbClueTrack.setCreateBy(SecurityUtils.getUsername()); + TbClue tbClue = new TbClue(); + BeanUtils.copyProperties(tbClueTrack, tbClue); + tbClue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue()); + iTbClueTrackRecordService.update(tbClue.getId()); + iTbClueTrackRecordService.add(tbClue); + return AjaxResult.success(); + } catch (Exception e) { + return AjaxResult.error(); + } + } + } diff --git a/huike-admin/src/main/java/com/huike/web/controller/report/IndexController.java b/huike-admin/src/main/java/com/huike/web/controller/report/IndexController.java index fdb5f43d80f9430984b6730b6652b15fc7651550..7f78804dceb610cf7d06413e1aa26786ce22252b 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/report/IndexController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/report/IndexController.java @@ -1,14 +1,17 @@ package com.huike.web.controller.report; +import com.huike.common.core.domain.AjaxResult; +import com.huike.report.domain.vo.IndexTodayInfoVO; +import com.huike.report.domain.vo.LongHuBangVO; +import com.huike.report.service.IReportService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.huike.common.core.domain.AjaxResult; -import com.huike.report.service.IReportService; +import java.util.List; @RestController @RequestMapping("/index") @@ -29,4 +32,36 @@ public class IndexController { @RequestParam("endCreateTime") String endCreateTime){ return AjaxResult.success(reportService.getBaseInfo(beginCreateTime,endCreateTime)); } + /** + * 首页--今日是数据简报统计 + * @return + */ + @GetMapping("/getTodayInfo") + public AjaxResult getTodayInfo(){ + IndexTodayInfoVO todayInfoVO=reportService.getTodayInfo(); + return AjaxResult.success(todayInfoVO); + } + /** + * 商机转化龙虎榜 + * @return + */ + @GetMapping("/businessChangeStatistics") + public AjaxResult businessChangeStatistics(@RequestParam("beginCreateTime") String beginCreateTime, + @RequestParam("endCreateTime") String endCreateTime){ + List longHuBangVOS=reportService.businessChangeStatistics(beginCreateTime,endCreateTime); + + return AjaxResult.success(longHuBangVOS); + } +/** + * 线索转化龙虎榜 + * @return + */ + @GetMapping("/salesStatistic") + public AjaxResult salesStatistic(@RequestParam("beginCreateTime") String beginCreateTime, + @RequestParam("endCreateTime") String endCreateTime){ + List longHuBangVOS=reportService.salesStatistic(beginCreateTime,endCreateTime); + + return AjaxResult.success(longHuBangVOS); + } + } \ No newline at end of file diff --git a/huike-admin/src/main/java/com/huike/web/controller/report/ReportController.java b/huike-admin/src/main/java/com/huike/web/controller/report/ReportController.java index 2943456e7a42678f49a03589016ea3ac6b786c44..96e7cf844c0e90295892eba8089bfa4282535a61 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/report/ReportController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/report/ReportController.java @@ -1,23 +1,25 @@ package com.huike.web.controller.report; -import java.util.List; -import java.util.Map; - -import com.huike.report.domain.vo.LineChartVO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import com.huike.clues.domain.TbActivity; import com.huike.clues.domain.TbClue; import com.huike.common.core.controller.BaseController; import com.huike.common.core.domain.AjaxResult; import com.huike.common.core.page.TableDataInfo; import com.huike.contract.domain.TbContract; +import com.huike.contract.domain.vo.TbContractVO; import com.huike.report.domain.vo.ActivityStatisticsVo; +import com.huike.report.domain.vo.LineChartVO; +import com.huike.report.domain.vo.VulnerabilityMapVo; import com.huike.report.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; @RestController @@ -117,7 +119,7 @@ public class ReportController extends BaseController { * @param endCreateTime * @return */ - @GetMapping("/ownerShipStatisticsList/{beginCreateTime}/{endCreateTime}") + @GetMapping("/ownerShipStatisticsList") public TableDataInfo ownerShipStatisticsList(@PathVariable String beginCreateTime, @PathVariable String endCreateTime){ startPage(); List> list = reportService.ownerShipStatisticsList(beginCreateTime,endCreateTime); @@ -147,6 +149,43 @@ public class ReportController extends BaseController { List list= reportService.activityStatisticsList(activity); return getDataTablePage(list); } + /** + * 报名统计 + * @param + * @return + */ + @GetMapping("/subjectStatistics/{beginCreateTime}/{endCreateTime}") + public AjaxResult subjectStatistics(@PathVariable String beginCreateTime, + @PathVariable String endCreateTime) { + List tbContract=reportService.subjectStatistics(beginCreateTime,endCreateTime); + + return AjaxResult.success(tbContract); + } + /** + * 线索统计 + * @param beginCreateTime + * @param endCreateTime + * @return + */ + @GetMapping("/cluesStatistics/{beginCreateTime}/{endCreateTime}") + public LineChartVO cluesStatistics(@PathVariable String beginCreateTime, + @PathVariable String endCreateTime) throws ParseException { + return reportService.cluesStatistics(beginCreateTime,endCreateTime); + } + + /** + * 线索转化率统计 + * + * @param beginCreateTime + * @param endCreateTime + * @return + */ + @GetMapping("/getVulnerabilityMap/{beginCreateTime}/{endCreateTime}") + public AjaxResult getVulnerabilityMap(@PathVariable String beginCreateTime, + @PathVariable String endCreateTime) { + VulnerabilityMapVo vulnerabilityMapVo=reportService.getVulnerabilityMap(beginCreateTime, endCreateTime); + return AjaxResult.success(vulnerabilityMapVo); + } } diff --git a/huike-admin/src/main/java/com/huike/web/controller/review/MybatisReviewController.java b/huike-admin/src/main/java/com/huike/web/controller/review/MybatisReviewController.java index 23bf229a6230093d7af719983a2d8d116fcaa5ad..7732c78ddd0ac4f6fd1060a296e5acd024b0bf54 100644 --- a/huike-admin/src/main/java/com/huike/web/controller/review/MybatisReviewController.java +++ b/huike-admin/src/main/java/com/huike/web/controller/review/MybatisReviewController.java @@ -2,10 +2,12 @@ package com.huike.web.controller.review; import com.huike.common.core.controller.BaseController; +import com.huike.common.core.domain.AjaxResult; +import com.huike.common.core.page.TableDataInfo; import com.huike.review.service.ReviewService; +import com.huike.review.vo.MybatisReviewVO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 该Controller主要是为了复习三层架构以及Mybatis使用的,该部分接口已经放开权限,可以直接访问 @@ -19,11 +21,39 @@ public class MybatisReviewController extends BaseController { private ReviewService reviewService; /**=========================================================新增数据============================================*/ - - /**=========================================================删除数据=============================================*/ - + @GetMapping("saveData/{name}/{age}/{sex}") + public AjaxResult save(@PathVariable String name,@PathVariable Integer age,@PathVariable String sex) { + MybatisReviewVO review = new MybatisReviewVO(); + review.setName(name); + review.setAge(age); + review.setSex(sex); + return reviewService.save(review); + } + @PostMapping("saveData") + public AjaxResult save(@RequestBody MybatisReviewVO reviewVO) { + return reviewService.save(reviewVO); + } + + /** + * =========================================================删除数据============================================= + */ + @PostMapping("update") + public AjaxResult update(@RequestBody MybatisReviewVO reviewVO) { + return reviewService.update(reviewVO); + } /**=========================================================修改数据=============================================*/ - + @DeleteMapping("remove/{id}") + public AjaxResult remove(@PathVariable Long id) { + return reviewService.remove(id); + } /**=========================================================查询数据=============================================*/ - + @GetMapping("getById") + public AjaxResult getById(@RequestParam Long id) { + return reviewService.getById(id); + } + @GetMapping("getDataByPage") + public TableDataInfo getByPage() { + startPage(); + return getDataTable(reviewService.getByPage()); + } } \ No newline at end of file diff --git a/huike-business/src/main/java/com/huike/business/mapper/TbBusinessTrackRecordMapper.java b/huike-business/src/main/java/com/huike/business/mapper/TbBusinessTrackRecordMapper.java index 500f87a285b711a79537b80fffbc367947bb7c91..795815800de0189839499b7a2ae540be752f3544 100644 --- a/huike-business/src/main/java/com/huike/business/mapper/TbBusinessTrackRecordMapper.java +++ b/huike-business/src/main/java/com/huike/business/mapper/TbBusinessTrackRecordMapper.java @@ -1,12 +1,16 @@ package com.huike.business.mapper; -import java.util.List; import com.huike.business.domain.TbBusinessTrackRecord; +import java.util.List; + /** * 商机跟进记录Mapper接口 * @date 2021-04-28 */ public interface TbBusinessTrackRecordMapper { + void saveBack(TbBusinessTrackRecord businessTrackRecord); + void save(TbBusinessTrackRecord businessTrackRecord); + List select(Long id); } \ No newline at end of file diff --git a/huike-business/src/main/java/com/huike/business/service/ITbBusinessService.java b/huike-business/src/main/java/com/huike/business/service/ITbBusinessService.java index f8a6f07343ea2e21e95d82bba32a37b09426bf84..91a8bff49597ea8be66bcea843ad4f2c02d5fab1 100644 --- a/huike-business/src/main/java/com/huike/business/service/ITbBusinessService.java +++ b/huike-business/src/main/java/com/huike/business/service/ITbBusinessService.java @@ -1,10 +1,9 @@ package com.huike.business.service; -import java.util.List; -import java.util.Map; - import com.huike.business.domain.TbBusiness; +import java.util.List; + /** * 商机Service接口 * @@ -73,4 +72,6 @@ public interface ITbBusinessService public int changeBusiness(Long clueId); public int updateStatus(Long id, String status); + + void back(Long id, String reason); } diff --git a/huike-business/src/main/java/com/huike/business/service/ITbBusinessTrackRecordService.java b/huike-business/src/main/java/com/huike/business/service/ITbBusinessTrackRecordService.java index 294168cbfa88704b004d962b6edcf77a7dc4217d..979fdd0ff0d2ace1de66b686624aa30ae18a34c8 100644 --- a/huike-business/src/main/java/com/huike/business/service/ITbBusinessTrackRecordService.java +++ b/huike-business/src/main/java/com/huike/business/service/ITbBusinessTrackRecordService.java @@ -1,5 +1,10 @@ package com.huike.business.service; +import com.huike.business.domain.TbBusinessTrackRecord; +import com.huike.business.domain.vo.BusinessTrackVo; + +import java.util.List; + /** * 商机跟进记录Service接口 * @date 2021-04-28 @@ -7,5 +12,6 @@ package com.huike.business.service; public interface ITbBusinessTrackRecordService { - + void add(BusinessTrackVo businessTrackVo); + List select(Long id); } diff --git a/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessServiceImpl.java b/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessServiceImpl.java index 18309494021f3ddbe5aebd85d941c51aba44e973..156dbee28ab56171a4aca9efdbf0bf1c3f3af52f 100644 --- a/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessServiceImpl.java +++ b/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessServiceImpl.java @@ -1,21 +1,15 @@ package com.huike.business.service.impl; -import java.util.Date; -import java.util.List; - -import com.huike.business.strategy.Rule; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.huike.business.domain.TbBusiness; +import com.huike.business.domain.TbBusinessTrackRecord; import com.huike.business.mapper.TbBusinessMapper; import com.huike.business.mapper.TbBusinessTrackRecordMapper; import com.huike.business.service.ITbBusinessService; +import com.huike.business.strategy.Rule; import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.TbRulePool; +import com.huike.clues.mapper.SysDictDataMapper; import com.huike.clues.mapper.SysUserMapper; import com.huike.clues.mapper.TbAssignRecordMapper; import com.huike.clues.mapper.TbClueMapper; @@ -29,6 +23,13 @@ import com.huike.common.core.domain.entity.SysUser; import com.huike.common.exception.CustomException; import com.huike.common.utils.DateUtils; import com.huike.common.utils.SecurityUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; /** * 商机Service业务层处理 @@ -63,6 +64,8 @@ public class TbBusinessServiceImpl implements ITbBusinessService { @Autowired TbAssignRecordMapper assignRecordMapper; + @Autowired + SysDictDataMapper sysDictDataMapper; /** * 查询商机 @@ -287,4 +290,27 @@ public class TbBusinessServiceImpl implements ITbBusinessService { public int updateStatus(Long clueId,String status){ return tbBusinessMapper.resetNextTimeAndStatus(clueId,status); } + + /** + * @date 2022/5/29 16:39 + * @param id 商机ID + * @param reason 回退原因 + */ + @Override + public void back(Long id, String reason) { + TbBusiness tbBusiness = new TbBusiness(); + tbBusiness.setId(id); + tbBusiness.setStatus(TbClue.StatusType.FALSE.getValue()); + tbBusinessMapper.updateTbBusiness(tbBusiness); + + TbBusinessTrackRecord businessTrackRecord = new TbBusinessTrackRecord(); + businessTrackRecord.setBusinessId(id); + businessTrackRecord.setCreateTime(new Date()); + businessTrackRecord.setCreateBy(SecurityUtils.getUsername()); + + String dictLabel = sysDictDataMapper.selectDictLabel("reasons_for_business_reporting",reason ); + businessTrackRecord.setRecord(dictLabel); + tbBusinessTrackRecordMapper.saveBack(businessTrackRecord); + + } } diff --git a/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessTrackRecordServiceImpl.java b/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessTrackRecordServiceImpl.java index 3f12eaa22c493fa497ad87f9b2b9d9418848a7ee..73937dc37a75adeb7588374946a3558756c8ef97 100644 --- a/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessTrackRecordServiceImpl.java +++ b/huike-business/src/main/java/com/huike/business/service/impl/TbBusinessTrackRecordServiceImpl.java @@ -1,8 +1,21 @@ package com.huike.business.service.impl; +import com.huike.business.domain.TbBusiness; +import com.huike.business.domain.TbBusinessTrackRecord; +import com.huike.business.domain.vo.BusinessTrackVo; +import com.huike.business.mapper.TbBusinessMapper; +import com.huike.business.mapper.TbBusinessTrackRecordMapper; import com.huike.business.service.ITbBusinessTrackRecordService; +import com.huike.clues.domain.TbClue; +import com.huike.common.utils.SecurityUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; /** * 商机跟进记录Service业务层处理 @@ -12,5 +25,37 @@ import org.springframework.stereotype.Service; */ @Service public class TbBusinessTrackRecordServiceImpl implements ITbBusinessTrackRecordService { + @Autowired(required = false) + private TbBusinessTrackRecordMapper businessTrackRecordMapper; + @Autowired(required = false) + private TbBusinessMapper businessMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void add(BusinessTrackVo businessTrackVo) { + TbBusinessTrackRecord businessTrackRecord = new TbBusinessTrackRecord(); + BeanUtils.copyProperties(businessTrackVo,businessTrackRecord); + //获取用户名,当前时间并设置 + String username = SecurityUtils.getUsername(); + businessTrackRecord.setCreateBy(username); + Date time = new Date(); + + businessTrackRecord.setCreateTime(time); + + TbBusiness tbBusiness = new TbBusiness(); + BeanUtils.copyProperties(businessTrackVo,tbBusiness); + //设置ID + tbBusiness.setId(businessTrackVo.getBusinessId()); + //设置为跟进 + tbBusiness.setStatus(TbClue.StatusType.FOLLOWING.getValue()); + + businessMapper.updateTbBusiness(tbBusiness); + businessTrackRecordMapper.save(businessTrackRecord); + } + @Override + @Transactional + public List select(Long id) { + return businessTrackRecordMapper.select(id); + } } diff --git a/huike-business/src/main/java/com/huike/business/strategy/impl/RuleStrategy.java b/huike-business/src/main/java/com/huike/business/strategy/impl/RuleStrategy.java index fcca5863d753de8e0d5a81e59beb472ebbc80a64..07e8f1343524dd4470872178eba7682deff6800b 100644 --- a/huike-business/src/main/java/com/huike/business/strategy/impl/RuleStrategy.java +++ b/huike-business/src/main/java/com/huike/business/strategy/impl/RuleStrategy.java @@ -6,18 +6,15 @@ import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.mapper.SysDictDataMapper; import com.huike.clues.mapper.SysUserMapper; import com.huike.clues.mapper.TbAssignRecordMapper; -import com.huike.clues.service.ITbCourseService; import com.huike.common.core.domain.entity.SysDictData; import com.huike.common.core.domain.entity.SysUser; import com.huike.common.utils.DateUtils; -import com.huike.common.utils.DictUtils; import com.huike.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; -import java.util.ArrayList; import java.util.List; /** @@ -32,14 +29,14 @@ public class RuleStrategy implements Rule { //这里能够成功注入吗? @Autowired - private static TbAssignRecordMapper assignRecordMapper; + private TbAssignRecordMapper assignRecordMapper; //这里能够成功注入吗? @Autowired - private static SysUserMapper userMapper; + private SysUserMapper userMapper; @Autowired - private static SysDictDataMapper dictDataMapper; + private SysDictDataMapper dictDataMapper; private static SysUser lisi = new SysUser(); @@ -56,7 +53,8 @@ public class RuleStrategy implements Rule { /** * 参考一下adminStrategy是怎么做的 */ - static{ + @PostConstruct + public void init() { try{ //空间换时间的方式将数据库中的学科读取到内存中 //预加载学科数据到内存中 @@ -74,6 +72,7 @@ public class RuleStrategy implements Rule { lisi = userMapper.selectUserByName("lisi"); lisi1 = userMapper.selectUserByName("lisi1"); }catch (Exception e){ + e.printStackTrace(); } } @@ -90,10 +89,10 @@ public class RuleStrategy implements Rule { @Override public Integer transforBusiness(TbBusiness tbBusiness) { //注意处理空指针的问题 - if(tbBusiness.getSubject().equals(subjectJAVA.getDictLabel())){ + if(tbBusiness.getSubject().equals(subjectJAVA.getDictValue())){ //如果意向学科是java--分配给lisi return distribute(tbBusiness,lisi); - }else if(tbBusiness.getSubject().equals(subjectHtml.getDictLabel())){ + }else if(tbBusiness.getSubject().equals(subjectHtml.getDictValue())){ //如果意向学科是前端--分配给lisi1 return distribute(tbBusiness,lisi1); }else{ diff --git a/huike-business/src/main/resources/mapper/business/TbBusinessMapper.xml b/huike-business/src/main/resources/mapper/business/TbBusinessMapper.xml index 895296805695c051ea628c73dcf05805a11b4311..ceb5526f515242e9cfbd3b1861e0b519c287c43a 100644 --- a/huike-business/src/main/resources/mapper/business/TbBusinessMapper.xml +++ b/huike-business/src/main/resources/mapper/business/TbBusinessMapper.xml @@ -117,6 +117,12 @@ and plan_time = #{planTime} and other_intention = #{otherIntention} and next_time = #{nextTime} + + and date_format(create_time,'%y%m%d') >= date_format(#{params.beginCreateTime},'%y%m%d') + + + and date_format(create_time,'%y%m%d') <= date_format(#{params.endCreateTime},'%y%m%d') + and status IN ('3','4') @@ -150,6 +156,11 @@ and b.other_intention = #{otherIntention} and b.next_time = #{nextTime} and DATE_FORMAT(b.create_time,'%Y-%m-%d') BETWEEN #{beginCreateTime} AND #{endCreateTime} + + + and b.status < '3' + and b.status = #{status} + AND (r.latest = '1' OR r.id IS NULL) AND (r.type = '1' OR r.id IS NULL) diff --git a/huike-business/src/main/resources/mapper/business/TbBusinessTrackRecordMapper.xml b/huike-business/src/main/resources/mapper/business/TbBusinessTrackRecordMapper.xml index 353e85f8690ea9ae10492d1e8d18c3ad62eb8d9a..6ab36962773b388171f113788b6da042596cc362 100644 --- a/huike-business/src/main/resources/mapper/business/TbBusinessTrackRecordMapper.xml +++ b/huike-business/src/main/resources/mapper/business/TbBusinessTrackRecordMapper.xml @@ -1,19 +1,31 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - + + + + + + + + + + insert into tb_business_track_record + (business_id, create_by, record, create_time) + values (#{businessId},#{createBy},#{record},#{createTime}); + + + insert into tb_business_track_record + values (null, #{businessId},#{createBy},#{keyItems},#{record},#{createTime},#{trackStatus},#{nextTime}); + + \ No newline at end of file diff --git a/huike-clues/src/main/java/com/huike/clues/domain/dto/ImportResultDTO.java b/huike-clues/src/main/java/com/huike/clues/domain/dto/ImportResultDTO.java index 069ab7905a50e92039c89b2d053517eea5304fff..a2f59ee5ad3b4d483400694eb3e4fddf8d6e3d1b 100644 --- a/huike-clues/src/main/java/com/huike/clues/domain/dto/ImportResultDTO.java +++ b/huike-clues/src/main/java/com/huike/clues/domain/dto/ImportResultDTO.java @@ -3,14 +3,12 @@ package com.huike.clues.domain.dto; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; /** * 线索导入结果集对象 */ @Data @AllArgsConstructor -@NoArgsConstructor public class ImportResultDTO { //成功数量 @@ -27,6 +25,11 @@ public class ImportResultDTO { return new ImportResultDTO(0,1); } + public ImportResultDTO() { + failureNum=0; + successNum=0; + } + /** * 提供静态方法,发生成功的时候记录数据 * @return diff --git a/huike-clues/src/main/java/com/huike/clues/domain/vo/TbClueExcelVo.java b/huike-clues/src/main/java/com/huike/clues/domain/vo/TbClueExcelVo.java index 3d058dc08db85226a250b81de743da0180ffd7e6..a8b7bd4770c393316673ebc56a15bf5346fd4a85 100644 --- a/huike-clues/src/main/java/com/huike/clues/domain/vo/TbClueExcelVo.java +++ b/huike-clues/src/main/java/com/huike/clues/domain/vo/TbClueExcelVo.java @@ -118,7 +118,15 @@ public class TbClueExcelVo{ this.qq = qq; } - @Override + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + @Override public String toString() { return "TbClueExcelVo [phone=" + phone + ", channel=" + channel + ", activityCode=" + activityCode + ", name=" + name + ", subject=" + subject + ", level=" + level + ", sex=" + sex + ", age=" + age + ", weixin=" diff --git a/huike-clues/src/main/java/com/huike/clues/mapper/TbAssignRecordMapper.java b/huike-clues/src/main/java/com/huike/clues/mapper/TbAssignRecordMapper.java index 352642b64af5bd7da62e132f63c3d258ec410cbd..f02b8e31afabe5d9fd2bfd9321b396d98dc42c64 100644 --- a/huike-clues/src/main/java/com/huike/clues/mapper/TbAssignRecordMapper.java +++ b/huike-clues/src/main/java/com/huike/clues/mapper/TbAssignRecordMapper.java @@ -1,9 +1,10 @@ package com.huike.clues.mapper; -import java.util.List; import com.huike.clues.domain.TbAssignRecord; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * 线索分配记录Mapper接口 * @date 2021-04-19 @@ -87,5 +88,6 @@ public interface TbAssignRecordMapper * @return */ public int countAssignBusinessByUser(@Param("userId") Long userId); - + + Integer batchSave(@Param("rs")List assignRecords); } diff --git a/huike-clues/src/main/java/com/huike/clues/mapper/TbClueMapper.java b/huike-clues/src/main/java/com/huike/clues/mapper/TbClueMapper.java index 0061710199a2319827bf07c906cff0969d291a7e..75409ee3f114e86e787965437b927677aee3c9a2 100644 --- a/huike-clues/src/main/java/com/huike/clues/mapper/TbClueMapper.java +++ b/huike-clues/src/main/java/com/huike/clues/mapper/TbClueMapper.java @@ -1,13 +1,13 @@ package com.huike.clues.mapper; -import java.util.Date; -import java.util.List; -import java.util.Map; - import com.huike.clues.domain.TbClue; import com.huike.clues.domain.vo.IndexStatisticsVo; import org.apache.ibatis.annotations.Param; +import java.util.Date; +import java.util.List; +import java.util.Map; + /** * 线索管理Mapper接口 @@ -113,4 +113,5 @@ public interface TbClueMapper { */ public int getCluesNum(@Param("indexVo")IndexStatisticsVo request,@Param("now")String now,@Param("username")String username); + Integer insertTbClues(@Param("cs") List tbClues); } \ No newline at end of file diff --git a/huike-clues/src/main/java/com/huike/clues/mapper/TbClueTrackRecordMapper.java b/huike-clues/src/main/java/com/huike/clues/mapper/TbClueTrackRecordMapper.java index 93570a7463fef892c8c852a5f526a4d35b275f3a..a14e6addc501c54eccace995139778c6858535a4 100644 --- a/huike-clues/src/main/java/com/huike/clues/mapper/TbClueTrackRecordMapper.java +++ b/huike-clues/src/main/java/com/huike/clues/mapper/TbClueTrackRecordMapper.java @@ -1,6 +1,15 @@ package com.huike.clues.mapper; +import com.huike.clues.domain.TbClueTrackRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +import com.huike.clues.domain.TbClue; + + /** * 线索跟进记录Mapper接口 * @date 2021-04-19 @@ -8,5 +17,14 @@ package com.huike.clues.mapper; public interface TbClueTrackRecordMapper { - + void deleteByClueId(@Param("clueId") Long id); + + void save(TbClueTrackRecord tbClueTrackRecord); + + void update(Long userId); + + void add(TbClue tbClue); + + + List getById(@Param("clueId") Long clueId); } diff --git a/huike-clues/src/main/java/com/huike/clues/service/ITbActivityService.java b/huike-clues/src/main/java/com/huike/clues/service/ITbActivityService.java index 713595f367c111ef64c999bd0fdb58b77a85abcf..59297aeb4e9cb6536827fb902c18e503e4d1dfab 100644 --- a/huike-clues/src/main/java/com/huike/clues/service/ITbActivityService.java +++ b/huike-clues/src/main/java/com/huike/clues/service/ITbActivityService.java @@ -1,10 +1,10 @@ package com.huike.clues.service; +import com.huike.clues.domain.TbActivity; + import java.util.List; import java.util.Map; -import com.huike.clues.domain.TbActivity; - /** * 活动管理Service接口 * @date 2021-04-01 @@ -65,5 +65,5 @@ public interface ITbActivityService public Map getCountByStatus(); - void loadAllActivityCode(); +// void loadAllActivityCode(); } diff --git a/huike-clues/src/main/java/com/huike/clues/service/ITbClueService.java b/huike-clues/src/main/java/com/huike/clues/service/ITbClueService.java index c19ab1f0f9066365ce5ef2f80345ac54e2f58de4..9ee379194b3cbbae1e5f7bdf6366dc629cb2926e 100644 --- a/huike-clues/src/main/java/com/huike/clues/service/ITbClueService.java +++ b/huike-clues/src/main/java/com/huike/clues/service/ITbClueService.java @@ -1,12 +1,12 @@ package com.huike.clues.service; -import java.util.List; -import java.util.Map; - +import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.dto.ImportResultDTO; import com.huike.clues.domain.vo.TbClueExcelVo; -import com.huike.common.core.domain.entity.SysUser; + +import java.util.List; +import java.util.Map; /** * 线索管理Service接口 @@ -111,4 +111,12 @@ public interface ITbClueService { * @return */ ImportResultDTO importCluesData(TbClueExcelVo data); + + TbClue getClue(TbClueExcelVo data); + + TbAssignRecord loadRule0(TbClue tbClue); + + Integer batchSaveRecord(List assignRecords); + + ImportResultDTO batchSaveClue(List tbClues); } diff --git a/huike-clues/src/main/java/com/huike/clues/service/ITbClueTrackRecordService.java b/huike-clues/src/main/java/com/huike/clues/service/ITbClueTrackRecordService.java index f1a4af1f36feccfb3157df2454518ebbd0cc8b82..342fe2e3d36c39255dfd3b7721937276596b902e 100644 --- a/huike-clues/src/main/java/com/huike/clues/service/ITbClueTrackRecordService.java +++ b/huike-clues/src/main/java/com/huike/clues/service/ITbClueTrackRecordService.java @@ -1,6 +1,11 @@ package com.huike.clues.service; +import com.huike.clues.domain.TbClue; +import com.huike.clues.domain.TbClueTrackRecord; + +import java.util.List; + /** * 线索跟进记录Service接口 * @@ -9,5 +14,10 @@ package com.huike.clues.service; */ public interface ITbClueTrackRecordService { + void add(TbClue tbClue); + + void disable(Long clueId, String reason, String remark); + void update(Long userId); + List getList(Long clueId); } diff --git a/huike-clues/src/main/java/com/huike/clues/service/impl/TbActivityServiceImpl.java b/huike-clues/src/main/java/com/huike/clues/service/impl/TbActivityServiceImpl.java index 60e8156b101e645d26a0b0b4ba4a370714da8a16..dcd3186cbd3c137ab00fc3cd6f1b49f99d476f55 100644 --- a/huike-clues/src/main/java/com/huike/clues/service/impl/TbActivityServiceImpl.java +++ b/huike-clues/src/main/java/com/huike/clues/service/impl/TbActivityServiceImpl.java @@ -1,22 +1,16 @@ package com.huike.clues.service.impl; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.huike.clues.domain.TbActivity; +import com.huike.clues.mapper.TbActivityMapper; +import com.huike.clues.service.ITbActivityService; +import com.huike.common.utils.DateUtils; import com.huike.common.utils.uuid.UUIDUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.huike.clues.domain.TbActivity; -import com.huike.clues.mapper.TbActivityMapper; -import com.huike.clues.service.ITbActivityService; -import com.huike.common.constant.Constants; -import com.huike.common.core.redis.RedisCache; -import com.huike.common.utils.DateUtils; -import com.huike.common.utils.StringUtils; +import java.util.List; +import java.util.Map; /** * 活动管理Service业务层处理 @@ -27,8 +21,8 @@ public class TbActivityServiceImpl implements ITbActivityService { @Autowired private TbActivityMapper tbActivityMapper; - @Autowired - private RedisCache redisCache; + /*@Autowired + private RedisCache redisCache;*/ /** @@ -72,10 +66,11 @@ public class TbActivityServiceImpl implements ITbActivityService { @Transactional public int insertTbActivity(TbActivity tbActivity){ tbActivity.setCreateTime(DateUtils.getNowDate()); - tbActivity.setCode(getCode()); + tbActivity.setCode(UUIDUtils.getUUID()); tbActivity.setStatus("2"); int rows= tbActivityMapper.insertTbActivity(tbActivity); - loadAllActivityCode(); +// loadAllActivityCode(); + return rows; } @@ -132,24 +127,24 @@ public class TbActivityServiceImpl implements ITbActivityService { /** * 加载活动编号到缓存中 */ - public void loadAllActivityCode() { + /*public void loadAllActivityCode() { List codeList= tbActivityMapper.selectAllCode(); Set set= new HashSet<>(codeList); redisCache.setCacheSet(Constants.ACT_CODE_KEY, set); - } + }*/ /** * 生成活动编号 * @return */ - private String getCode(){ - //随机8位编码 - String code= StringUtils.getRandom(8); + /*private String getCode(){ //店铺校验 Set codeSets = redisCache.getCacheSet(Constants.ACT_CODE_KEY); - if(codeSets.contains(code)){ - return getCode(); + //随机8位编码 + String code= UUIDUtils.getUUID(); + while (codeSets.contains(code)){ + code=UUIDUtils.getUUID(); } return code; - } + }*/ } diff --git a/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueServiceImpl.java b/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueServiceImpl.java index 24938725685caaaa76034b7aabf8cd5511f5840c..0f34a55c725cdae91539dd839c17aaa94b6489ab 100644 --- a/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueServiceImpl.java +++ b/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueServiceImpl.java @@ -1,32 +1,16 @@ package com.huike.clues.service.impl; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import com.huike.clues.domain.dto.ImportResultDTO; -import com.huike.clues.strategy.Rule; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.huike.clues.domain.TbActivity; import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; -import com.huike.clues.domain.TbClueTrackRecord; import com.huike.clues.domain.TbRulePool; +import com.huike.clues.domain.dto.ImportResultDTO; import com.huike.clues.domain.vo.TbClueExcelVo; -import com.huike.clues.mapper.SysDictDataMapper; -import com.huike.clues.mapper.SysUserMapper; -import com.huike.clues.mapper.TbActivityMapper; -import com.huike.clues.mapper.TbAssignRecordMapper; -import com.huike.clues.mapper.TbClueMapper; +import com.huike.clues.mapper.*; import com.huike.clues.service.ITbActivityService; import com.huike.clues.service.ITbClueService; import com.huike.clues.service.ITbRulePoolService; +import com.huike.clues.strategy.Rule; import com.huike.clues.utils.HuiKeCrmDateUtils; import com.huike.clues.utils.JobUtils; import com.huike.common.annotation.DataScope; @@ -37,411 +21,494 @@ import com.huike.common.utils.DateUtils; import com.huike.common.utils.SecurityUtils; import com.huike.common.utils.StringUtils; import com.huike.common.utils.bean.BeanUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; /** * 线索管理Service业务层处理 - * + * * @date 2021-04-02 */ @Service public class TbClueServiceImpl implements ITbClueService { - @Autowired - private Rule rule; - - @Autowired - private TbClueMapper tbClueMapper; - - @Autowired - private TbAssignRecordMapper assignRecordMapper; - - @Autowired - private SysUserMapper userMapper; - - @Autowired - ITbRulePoolService rulePoolService; - - @Autowired - SysDictDataMapper sysDictDataMapper; - - @Autowired - private TbActivityMapper tbActivityMapper; - - @Autowired - private ITbActivityService activityService; - - @Autowired - private ITbClueService tbClueService; - - /** - * 查询线索管理 - * - * @param id 线索管理ID - * @return 线索管理 - */ - @Override - public TbClue selectTbClueById(Long id) { - TbClue tbClue = tbClueMapper.selectTbClueById(id); - if (tbClue != null && tbClue.getActivityId() != null) { - TbActivity activity = tbActivityMapper.selectTbActivityById(tbClue.getActivityId()); - if (activity != null) { - tbClue.setActivityInfo(activity.getCode() + ":" + activity.getName() + ":" + activity.getInfo()); - } - } - // 查询专派遣信息 - TbAssignRecord assignRecord = assignRecordMapper.selectAssignRecordByAssignId(tbClue.getId(), "0"); - //证明是待分配数据 - if(assignRecord==null){ - return tbClue; - } - tbClue.setOwner(assignRecord.getUserName()); - tbClue.setOwnerTime(assignRecord.getCreateTime()); - return tbClue; - } - - /** - * 查询线索管理列表 - * - * @param tbClue 线索管理 - * @return 线索管理 - */ - @Override - @DataScope(deptAlias = "r", userAlias = "r") - public List selectTbClueList(TbClue tbClue) { - return tbClueMapper.selectTbClueList(tbClue); - } - - @Override - public List selectTbCluePool(TbClue tbClue) { - List clueList = tbClueMapper.selectTbCluePoll(tbClue); - clueList.forEach(d -> { - if (d.getActivityId() != null) { - TbActivity activity = tbActivityMapper.selectTbActivityById(d.getActivityId()); - if (activity != null) { - d.setActivityName(activity.getName()); - } - } - }); - return clueList; - } - - /** - * 新增线索管理 - * - * @param tbClue 线索管理 - * @return 结果 - */ - @Override - @Transactional - public int insertTbClue(TbClue tbClue) { - tbClue.setCreateBy(SecurityUtils.getUsername()); - Date now = DateUtils.getNowDate(); - tbClue.setCreateTime(now); - tbClueMapper.insertTbClue(tbClue); - TbAssignRecord tbAssignRecord = new TbAssignRecord(); - tbAssignRecord.setAssignId(tbClue.getId()); - tbAssignRecord.setUserId(SecurityUtils.getUserId()); - tbAssignRecord.setUserName(SecurityUtils.getUsername()); - tbAssignRecord.setDeptId(SecurityUtils.getDeptId()); - tbAssignRecord.setCreateBy(SecurityUtils.getUsername()); - tbAssignRecord.setCreateTime(now); - int rows = assignRecordMapper.insertAssignRecord(tbAssignRecord); - // 线索池规则支持 - Date endDate = HuiKeCrmDateUtils.getEndDateByRule(tbAssignRecord); - tbClueMapper.updateClueEndTimeById(tbClue.getId(), endDate); - return rows; - } - - /** - * 修改线索管理 - * - * @param tbClue 线索管理 - * @return 结果 - */ - @Override - public int updateTbClue(TbClue tbClue) { - return tbClueMapper.updateTbClue(tbClue); - } - - /** - * 批量删除线索管理 - * - * @param ids 需要删除的线索管理ID - * @return 结果 - */ - @Override - public int deleteTbClueByIds(Long[] ids) { - return tbClueMapper.deleteTbClueByIds(ids); - } - - /** - * 删除线索管理信息 - * - * @param id 线索管理ID - * @return 结果 - */ - @Override - public int deleteTbClueById(Long id) { - return tbClueMapper.deleteTbClueById(id); - } - - @Override - @Transactional - public Map importClues(List clueList) { - if (StringUtils.isNull(clueList) || clueList.size() == 0) { - throw new CustomException("导入用户数据不能为空!"); - } - Map map = new HashMap<>(); - List toAssignlist = new ArrayList<>(); - int successNum = 0; - int failureNum = 0; - for (TbClue clue : clueList) { - try { - if (StringUtils.isBlank(clue.getPhone())) { - failureNum++; - continue; - } - if (StringUtils.isBlank(clue.getChannel())) { - failureNum++; - continue; - } - - // 验证是否存在这个用户 - TbClue dbcule = tbClueMapper.selectTbClueByPhone(clue.getPhone()); - if (dbcule == null) { - // 特殊字段处理 - String channel = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.CHANNEL.getDictType(), - clue.getChannel()); - clue.setChannel(channel); - - if (StringUtils.isNoneBlank(clue.getSubject())) { - String subject = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.SUBJECT.getDictType(), - clue.getSubject()); - clue.setSubject(subject); - } - - if (StringUtils.isNoneBlank(clue.getLevel())) { - String level = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.LEVEL.getDictType(), - clue.getLevel()); - clue.setLevel(level); - } - - if (StringUtils.isNoneBlank(clue.getSex())) { - String sex = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.SEX.getDictType(), - clue.getSex()); - clue.setSex(sex); - } - - if (StringUtils.isNoneBlank(clue.getActivityName())) { - String sex = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.SEX.getDictType(), - clue.getSex()); - clue.setSex(sex); - } - clue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue()); - tbClueMapper.insertTbClue(clue); - // 默认分配超级管理员 - //如果线索添加成功,利用策略将线索分配给具体的人 - rule.loadRule(clue); - successNum++; - toAssignlist.add(clue); - } else { - failureNum++; - } - } catch (Exception e) { - e.printStackTrace(); - failureNum++; - } - } - - map.put("successNum", successNum); - map.put("failureNum", failureNum); - return map; - } - - @Override - public String assign(Long[] clueIds, Long userId) { - TbRulePool rulePool = rulePoolService.selectTbRulePoolByType(Constants.rule_type_clue); - // TbAssignRecord tbAssignRecord =new TbAssignRecord(); - // 统计当前分配人所有线索 - int assignRecords = assignRecordMapper.countAssignCluesByUser(userId); - if (assignRecords >= rulePool.getMaxNunmber()) { - throw new CustomException("分配失败!最大保有量(" + rulePool.getMaxNunmber() + "),剩余可以分配" - + (rulePool.getMaxNunmber() - assignRecords) + "条线索"); - } - for (int i = 0; i < clueIds.length; i++) { - Long clueId = clueIds[i]; - - // 超过最大保有量 - if (assignRecords + i >= rulePool.getMaxNunmber()) { - // return "超过当前用户最大保有量,部分分配成功"; - throw new CustomException("分配失败!保有量达到上线,最多选择" + rulePool.getMaxNunmber() + "条线索"); - } - - // 从新分配 - updateStatus(clueId, TbClue.StatusType.UNFOLLOWED.getValue()); - TbAssignRecord tbAssignRecord = addNewRecord(clueId, userId); - Date endDate = HuiKeCrmDateUtils.getEndDateByRule(tbAssignRecord); - tbClueMapper.updateClueEndTimeById(clueId, endDate); - } - return "全部分配"; - } - - @Override - public String gain(Long[] clueIds, Long userId) { - // 是否批量捞取 - boolean isBatch = clueIds.length > 1 ? true : false; - TbRulePool rulePool = rulePoolService.selectTbRulePoolByType(TbRulePool.RuleType.CLUES.getValue()); - // 统计当前分配人所有线索 - int asignRecords = assignRecordMapper.countAssignCluesByUser(userId); - if (asignRecords >= rulePool.getMaxNunmber()) { - throw new CustomException("捞取失败!最大保有量(" + rulePool.getMaxNunmber() + "),剩余可以捞取"+(rulePool.getMaxNunmber()-asignRecords)+"条线索"); - } - for (int i = 0; i < clueIds.length; i++) { - Long clueId = clueIds[i]; - - // 超过最大保有量 - if (asignRecords + i >= rulePool.getMaxNunmber()) { - throw new CustomException("捞取失败!保有量达到上线,最多选择" + rulePool.getMaxNunmber() + "条线索"); - } - // 最近捞取记录 - TbAssignRecord assignRecord = assignRecordMapper.selectAssignRecordByAssignId(clueId, - TbAssignRecord.RecordType.CLUES.getValue()); - if (assignRecord != null && assignRecord.getUserId().equals(userId)) { - Date repeatGetTime = JobUtils.getDate(rulePool.getRepeatGetTime().intValue(), rulePool.getRepeatType(), - assignRecord.getCreateTime()); - // 捞取限制时间内,不让捞取 - if (DateUtils.getNowDate().before(repeatGetTime)) { - // 批量捞取跳过 - if (isBatch) { - continue; - } else { - throw new CustomException("捞取失败!需要在 " + DateUtils.dateTimeHm(repeatGetTime) + " 后捞取"); - } - } - } - // 捞取后下次跟进时间,及状态重置 - tbClueMapper.resetNextTimeAndStatus(clueId, TbClue.StatusType.UNFOLLOWED.getValue()); - // 新建分配记录 - TbAssignRecord tbAssignRecord = addNewRecord(clueId, userId); - - Date endDate = HuiKeCrmDateUtils.getEndDateByRule(tbAssignRecord); - tbClueMapper.updateClueEndTimeById(clueId, endDate); - } - return "全部捞取成功"; - } - - public TbAssignRecord addNewRecord(Long id, Long userId) { - // 保留上一条分配记录 - assignRecordMapper.updateLatest(id, TbAssignRecord.RecordType.CLUES.getValue()); - // 新建分配记录 - TbAssignRecord tbAssignRecord = new TbAssignRecord(); - tbAssignRecord.setAssignId(id); - SysUser sysUser = userMapper.selectUserById(userId); - tbAssignRecord.setUserId(userId); - tbAssignRecord.setDeptId(sysUser.getDeptId()); - tbAssignRecord.setUserName(sysUser.getUserName()); - Date now = DateUtils.getNowDate(); - tbAssignRecord.setCreateTime(now); - tbAssignRecord.setCreateBy(SecurityUtils.getUsername()); - tbAssignRecord.setType(TbAssignRecord.RecordType.CLUES.getValue()); - assignRecordMapper.insertAssignRecord(tbAssignRecord); - return tbAssignRecord; - } - - - @Override - @Transactional - public int updateStatus(Long clueId, String status) { - return tbClueMapper.resetNextTimeAndStatus(clueId, status); - } - - /** - * 批量导入 - */ - @Override - public Map addTbClue(List cluevoList) { - List clueList = cluevoList.stream().map(vo -> { - TbClue tbClue = new TbClue(); - BeanUtils.copyProperties(vo, tbClue); - tbClue.setCreateBy(SecurityUtils.getUsername()); - tbClue.setCreateTime(DateUtils.getNowDate()); - String activityCode = vo.getActivityCode(); - // 关联活动 - if (StringUtils.isNoneBlank(activityCode)) { - TbActivity activity = activityService.selectTbActivityByCode(activityCode); - if (activity != null) { - tbClue.setActivityId(activity.getId()); - } - } - return tbClue; - }).collect(Collectors.toList()); - return tbClueService.importClues(clueList); - } - - /** - * 校验线索手机号是否存在 - */ - @Override - public boolean checkCluePhoneExis(String phone) { - // 验证是否存在这个用户 - TbClue dbcule = tbClueMapper.selectTbClueByPhone(phone); - if (dbcule == null) { - return true; - } else { - return false; - } - } - - /** - * 线索数据添加入库 - * - * @param data - * @return - */ - @Override - public ImportResultDTO importCluesData(TbClueExcelVo data) { - //===============校验线索数据,封装属性,插入数据库,根据规则进行分配====================== - /** - * 1 判断活动编号对应的活动是否存在 - * 1.1 如果活动编号不存在 即错误数据,不进行添加操作,返回错误 ImportResultDTO.error() - * 1.2 如果活动编号存在 设置活动id - */ - //TODO 补全上述逻辑代码 - /** - * 校验手机号和渠道是否为空 - * 如果为空证明是错误数据,不进行添加 返回error - * return ImportResultDTO.error(); - */ - //TODO 补全上述逻辑代码 - /** - * 字典值的替换 - * 因为excel里传入的是中文名,需要替换成对应的字典值 - * 需要处理 学科 性别 意向级别 - */ - //TODO 补全上述逻辑代码 - /** - * 设置数据状态为待跟进 - * clue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue()); - */ - //TODO 补全上述逻辑代码 - /** - * 将线索数据入库 - * 参考添加线索接口调用的mapper - * 仅仅只插入到线索表中 - */ - //TODO 补全上述逻辑代码 - /** - * 根据规则动态分配线索给具体的销售人员 - * 利用策略模式来进行实现 - * rule.loadRule(clue); - */ - //TODO 补全上述逻辑代码 - - /** - *分配完成 返回成功 - * 这个方法免费提供 - */ - return ImportResultDTO.success(); - - } + @Autowired + private Rule rule; + + @Autowired + private TbClueMapper tbClueMapper; + + @Autowired + private TbAssignRecordMapper assignRecordMapper; + + @Autowired + private SysUserMapper userMapper; + + @Autowired + ITbRulePoolService rulePoolService; + + @Autowired + SysDictDataMapper sysDictDataMapper; + + @Autowired + private TbActivityMapper tbActivityMapper; + + @Autowired + private ITbActivityService activityService; + + @Autowired + private ITbClueService tbClueService; + + /** + * 查询线索管理 + * + * @param id 线索管理ID + * @return 线索管理 + */ + @Override + public TbClue selectTbClueById(Long id) { + TbClue tbClue = tbClueMapper.selectTbClueById(id); + if (tbClue != null && tbClue.getActivityId() != null) { + TbActivity activity = tbActivityMapper.selectTbActivityById(tbClue.getActivityId()); + if (activity != null) { + tbClue.setActivityInfo(activity.getCode() + ":" + activity.getName() + ":" + activity.getInfo()); + } + } + // 查询专派遣信息 + TbAssignRecord assignRecord = assignRecordMapper.selectAssignRecordByAssignId(tbClue.getId(), "0"); + //证明是待分配数据 + if (assignRecord == null) { + return tbClue; + } + tbClue.setOwner(assignRecord.getUserName()); + tbClue.setOwnerTime(assignRecord.getCreateTime()); + return tbClue; + } + + /** + * 查询线索管理列表 + * + * @param tbClue 线索管理 + * @return 线索管理 + */ + @Override + @DataScope(deptAlias = "r", userAlias = "r") + public List selectTbClueList(TbClue tbClue) { + return tbClueMapper.selectTbClueList(tbClue); + } + + @Override + public List selectTbCluePool(TbClue tbClue) { + List clueList = tbClueMapper.selectTbCluePoll(tbClue); + clueList.forEach(d -> { + if (d.getActivityId() != null) { + TbActivity activity = tbActivityMapper.selectTbActivityById(d.getActivityId()); + if (activity != null) { + d.setActivityName(activity.getName()); + } + } + }); + return clueList; + } + + /** + * 新增线索管理 + * + * @param tbClue 线索管理 + * @return 结果 + */ + @Override + @Transactional + public int insertTbClue(TbClue tbClue) { + tbClue.setCreateBy(SecurityUtils.getUsername()); + Date now = DateUtils.getNowDate(); + tbClue.setCreateTime(now); + tbClueMapper.insertTbClue(tbClue); + TbAssignRecord tbAssignRecord = new TbAssignRecord(); + tbAssignRecord.setAssignId(tbClue.getId()); + tbAssignRecord.setUserId(SecurityUtils.getUserId()); + tbAssignRecord.setUserName(SecurityUtils.getUsername()); + tbAssignRecord.setDeptId(SecurityUtils.getDeptId()); + tbAssignRecord.setCreateBy(SecurityUtils.getUsername()); + tbAssignRecord.setCreateTime(now); + int rows = assignRecordMapper.insertAssignRecord(tbAssignRecord); + // 线索池规则支持 + Date endDate = HuiKeCrmDateUtils.getEndDateByRule(tbAssignRecord); + tbClueMapper.updateClueEndTimeById(tbClue.getId(), endDate); + return rows; + } + + /** + * 修改线索管理 + * + * @param tbClue 线索管理 + * @return 结果 + */ + @Override + public int updateTbClue(TbClue tbClue) { + return tbClueMapper.updateTbClue(tbClue); + } + + /** + * 批量删除线索管理 + * + * @param ids 需要删除的线索管理ID + * @return 结果 + */ + @Override + public int deleteTbClueByIds(Long[] ids) { + return tbClueMapper.deleteTbClueByIds(ids); + } + + /** + * 删除线索管理信息 + * + * @param id 线索管理ID + * @return 结果 + */ + @Override + public int deleteTbClueById(Long id) { + return tbClueMapper.deleteTbClueById(id); + } + + @Override + @Transactional + public Map importClues(List clueList) { + if (StringUtils.isNull(clueList) || clueList.size() == 0) { + throw new CustomException("导入用户数据不能为空!"); + } + Map map = new HashMap<>(); + List toAssignlist = new ArrayList<>(); + int successNum = 0; + int failureNum = 0; + for (TbClue clue : clueList) { + try { + if (StringUtils.isBlank(clue.getPhone())) { + failureNum++; + continue; + } + if (StringUtils.isBlank(clue.getChannel())) { + failureNum++; + continue; + } + + // 验证是否存在这个用户 + TbClue dbcule = tbClueMapper.selectTbClueByPhone(clue.getPhone()); + if (dbcule == null) { + // 特殊字段处理 + String channel = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.CHANNEL.getDictType(), clue.getChannel()); + clue.setChannel(channel); + + if (StringUtils.isNoneBlank(clue.getSubject())) { + String subject = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.SUBJECT.getDictType(), clue.getSubject()); + clue.setSubject(subject); + } + + if (StringUtils.isNoneBlank(clue.getLevel())) { + String level = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.LEVEL.getDictType(), clue.getLevel()); + clue.setLevel(level); + } + + if (StringUtils.isNoneBlank(clue.getSex())) { + String sex = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.SEX.getDictType(), clue.getSex()); + clue.setSex(sex); + } + + if (StringUtils.isNoneBlank(clue.getActivityName())) { + String sex = sysDictDataMapper.selectDictValue(TbClue.ImportDictType.SEX.getDictType(), clue.getSex()); + clue.setSex(sex); + } + clue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue()); + tbClueMapper.insertTbClue(clue); + // 默认分配超级管理员 + //如果线索添加成功,利用策略将线索分配给具体的人 + rule.loadRule(clue); + successNum++; + toAssignlist.add(clue); + } else { + failureNum++; + } + } catch (Exception e) { + e.printStackTrace(); + failureNum++; + } + } + + map.put("successNum", successNum); + map.put("failureNum", failureNum); + return map; + } + + @Override + public String assign(Long[] clueIds, Long userId) { + TbRulePool rulePool = rulePoolService.selectTbRulePoolByType(Constants.rule_type_clue); + // TbAssignRecord tbAssignRecord =new TbAssignRecord(); + // 统计当前分配人所有线索 + int assignRecords = assignRecordMapper.countAssignCluesByUser(userId); + if (assignRecords >= rulePool.getMaxNunmber()) { + throw new CustomException("分配失败!最大保有量(" + rulePool.getMaxNunmber() + "),剩余可以分配" + (rulePool.getMaxNunmber() - assignRecords) + "条线索"); + } + for (int i = 0; i < clueIds.length; i++) { + Long clueId = clueIds[i]; + + // 超过最大保有量 + if (assignRecords + i >= rulePool.getMaxNunmber()) { + // return "超过当前用户最大保有量,部分分配成功"; + throw new CustomException("分配失败!保有量达到上线,最多选择" + rulePool.getMaxNunmber() + "条线索"); + } + + // 从新分配 + updateStatus(clueId, TbClue.StatusType.UNFOLLOWED.getValue()); + TbAssignRecord tbAssignRecord = addNewRecord(clueId, userId); + Date endDate = HuiKeCrmDateUtils.getEndDateByRule(tbAssignRecord); + tbClueMapper.updateClueEndTimeById(clueId, endDate); + } + return "全部分配"; + } + + @Override + public String gain(Long[] clueIds, Long userId) { + // 是否批量捞取 + boolean isBatch = clueIds.length > 1 ? true : false; + TbRulePool rulePool = rulePoolService.selectTbRulePoolByType(TbRulePool.RuleType.CLUES.getValue()); + // 统计当前分配人所有线索 + int asignRecords = assignRecordMapper.countAssignCluesByUser(userId); + if (asignRecords >= rulePool.getMaxNunmber()) { + throw new CustomException("捞取失败!最大保有量(" + rulePool.getMaxNunmber() + "),剩余可以捞取" + (rulePool.getMaxNunmber() - asignRecords) + "条线索"); + } + for (int i = 0; i < clueIds.length; i++) { + Long clueId = clueIds[i]; + + // 超过最大保有量 + if (asignRecords + i >= rulePool.getMaxNunmber()) { + throw new CustomException("捞取失败!保有量达到上线,最多选择" + rulePool.getMaxNunmber() + "条线索"); + } + // 最近捞取记录 + TbAssignRecord assignRecord = assignRecordMapper.selectAssignRecordByAssignId(clueId, TbAssignRecord.RecordType.CLUES.getValue()); + if (assignRecord != null && assignRecord.getUserId().equals(userId)) { + Date repeatGetTime = JobUtils.getDate(rulePool.getRepeatGetTime().intValue(), rulePool.getRepeatType(), assignRecord.getCreateTime()); + // 捞取限制时间内,不让捞取 + if (DateUtils.getNowDate().before(repeatGetTime)) { + // 批量捞取跳过 + if (isBatch) { + continue; + } else { + throw new CustomException("捞取失败!需要在 " + DateUtils.dateTimeHm(repeatGetTime) + " 后捞取"); + } + } + } + // 捞取后下次跟进时间,及状态重置 + tbClueMapper.resetNextTimeAndStatus(clueId, TbClue.StatusType.UNFOLLOWED.getValue()); + // 新建分配记录 + TbAssignRecord tbAssignRecord = addNewRecord(clueId, userId); + + Date endDate = HuiKeCrmDateUtils.getEndDateByRule(tbAssignRecord); + tbClueMapper.updateClueEndTimeById(clueId, endDate); + } + return "全部捞取成功"; + } + + public TbAssignRecord addNewRecord(Long id, Long userId) { + // 保留上一条分配记录 + assignRecordMapper.updateLatest(id, TbAssignRecord.RecordType.CLUES.getValue()); + // 新建分配记录 + TbAssignRecord tbAssignRecord = new TbAssignRecord(); + tbAssignRecord.setAssignId(id); + SysUser sysUser = userMapper.selectUserById(userId); + tbAssignRecord.setUserId(userId); + tbAssignRecord.setDeptId(sysUser.getDeptId()); + tbAssignRecord.setUserName(sysUser.getUserName()); + Date now = DateUtils.getNowDate(); + tbAssignRecord.setCreateTime(now); + tbAssignRecord.setCreateBy(SecurityUtils.getUsername()); + tbAssignRecord.setType(TbAssignRecord.RecordType.CLUES.getValue()); + assignRecordMapper.insertAssignRecord(tbAssignRecord); + return tbAssignRecord; + } + + + @Override + @Transactional + public int updateStatus(Long clueId, String status) { + return tbClueMapper.resetNextTimeAndStatus(clueId, status); + } + + /** + * 批量导入 + */ + @Override + public Map addTbClue(List cluevoList) { + List clueList = cluevoList.stream().map(vo -> { + TbClue tbClue = new TbClue(); + BeanUtils.copyProperties(vo, tbClue); + tbClue.setCreateBy(SecurityUtils.getUsername()); + tbClue.setCreateTime(DateUtils.getNowDate()); + String activityCode = vo.getActivityCode(); + // 关联活动 + if (StringUtils.isNoneBlank(activityCode)) { + TbActivity activity = activityService.selectTbActivityByCode(activityCode); + if (activity != null) { + tbClue.setActivityId(activity.getId()); + } + } + return tbClue; + }).collect(Collectors.toList()); + return tbClueService.importClues(clueList); + } + + /** + * 校验线索手机号是否存在 + */ + @Override + public boolean checkCluePhoneExis(String phone) { + // 验证是否存在这个用户 + TbClue dbcule = tbClueMapper.selectTbClueByPhone(phone); + if (dbcule == null) { + return true; + } else { + return false; + } + } + + /** + * 线索数据添加入库 + * + * @param data + * @return + */ + @Override + public ImportResultDTO importCluesData(TbClueExcelVo data) { + return importCluesData0(data); + } + /** + * 返回非空则对象满足插入条件 + * @date 2022/5/30 20:04 + * @param data + * @return com.huike.clues.domain.vo.TbClueExcelVo + */ + @Override + public TbClue getClue(TbClueExcelVo data) { + //校验数据 + Long activityId = check(data); + if (activityId == null) return null; + //填充数据 + TbClue tbClue = fillTbClue(data, activityId); + return tbClue; + } + /** + *返回null则校验失败 + * @date 2022/5/31 10:50 + * @param data + * @return java.lang.Long 活动Id + */ + @Nullable + private Long check(TbClueExcelVo data) { + TbActivity activity = tbActivityMapper.selectTbActivityByCode(data.getActivityCode()); + String channel = data.getChannel(); +// 1.1 如果活动编号不存在 或校验手机号或渠道是否为空即错误数据,不进行添加操作,返回错误 ImportResultDTO.error() + if (Objects.isNull(activity)||Objects.isNull(data.getPhone()) || Objects.isNull(channel)) { + return null; + } + return activity.getId(); + } + /** + * 构建一个待插入库的线索对象 + * @date 2022/5/31 10:51 + * @param data + * @param activityId + * @return com.huike.clues.domain.TbClue 线索对象 + */ + @NotNull + private TbClue fillTbClue(TbClueExcelVo data, Long activityId) { + TbClue tbClue = new TbClue(); + org.springframework.beans.BeanUtils.copyProperties(data, tbClue); +// 1.2 如果活动编号存在 设置活动id + tbClue.setActivityId(activityId); + /** + * + * 如果为空证明是错误数据,不进行添加 返回error + * return ImportResultDTO.error(); + */ + + String channel_value = sysDictDataMapper + .selectDictValue(TbClue.ImportDictType.CHANNEL.getDictType(), data.getChannel()); + tbClue.setChannel(channel_value); + /** + * 字典值的替换 + * 因为excel里传入的是中文名,需要替换成对应的字典值 + * 需要处理 学科 性别 意向级别 + */ + String subject = sysDictDataMapper + .selectDictValue(TbClue.ImportDictType.SUBJECT.getDictType(), data.getSubject()); + String sex = sysDictDataMapper + .selectDictValue(TbClue.ImportDictType.SEX.getDictType(), data.getSex()); + String level = sysDictDataMapper + .selectDictValue(TbClue.ImportDictType.LEVEL.getDictType(), data.getLevel()); + tbClue.setSubject(subject); + tbClue.setSex(sex); + tbClue.setLevel(level); + /** + * 根据规则动态分配线索给具体的销售人员 + * 利用策略模式来进行实现 + * rule.loadRule(clue); + */ + tbClue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue()); + tbClue.setCreateTime(new Date()); + tbClue.setCreateBy(SecurityUtils.getUsername()); + return tbClue; + } + + @Override + public TbAssignRecord loadRule0(TbClue tbClue) { + return rule.loadRule0(tbClue); + } + + @Override + public Integer batchSaveRecord(List assignRecords) { + return assignRecordMapper.batchSave(assignRecords); + } + + @Override + public ImportResultDTO batchSaveClue(List tbClues) { + Integer integer = tbClueMapper.insertTbClues(tbClues); + return new ImportResultDTO(integer,tbClues.size()-integer); + } + + private ImportResultDTO importCluesData0(TbClueExcelVo data) { + Long activityId = check(data); + if (Objects.isNull(activityId)) { + return ImportResultDTO.error(); + } + TbClue tbClue = fillTbClue(data, activityId); + /** + * 根据规则动态分配线索给具体的销售人员 + * 利用策略模式来进行实现 + * rule.loadRule(clue); + */ + Boolean result = rule.loadRule(tbClue); + /** + * 设置数据状态为待跟进 + * clue.setStatus(TbClue.StatusType.UNFOLLOWED.getValue()); + */ + if (Objects.nonNull(result)&&result) { + tbClue.setStatus(TbClue.StatusType.FOLLOWING.getValue()); + } + /** + * 将线索数据入库 + * 参考添加线索接口调用的mapper + * 仅仅只插入到线索表中 + */ + tbClueMapper.insertTbClue(tbClue); + /** + *分配完成 返回成功 + * 这个方法免费提供 + */ + return ImportResultDTO.success(); + } } diff --git a/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueTrackRecordServiceImpl.java b/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueTrackRecordServiceImpl.java index bbfae9de274601c86768fae1a8b4015593cd3914..7a10bf0708a9fc3b3bcc704c7f2b3952b02af3d7 100644 --- a/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueTrackRecordServiceImpl.java +++ b/huike-clues/src/main/java/com/huike/clues/service/impl/TbClueTrackRecordServiceImpl.java @@ -1,8 +1,24 @@ package com.huike.clues.service.impl; +import com.huike.clues.domain.TbClueTrackRecord; +import com.huike.clues.mapper.TbClueTrackRecordMapper; + +import com.huike.clues.domain.TbClue; +import com.huike.clues.domain.TbClue; +import com.huike.clues.domain.TbClueTrackRecord; +import com.huike.clues.mapper.TbClueMapper; +import com.huike.clues.mapper.TbClueTrackRecordMapper; import com.huike.clues.service.ITbClueTrackRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import com.huike.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import java.util.Date; /** * 线索跟进记录Service业务层处理 @@ -10,5 +26,51 @@ import org.springframework.stereotype.Service; */ @Service public class TbClueTrackRecordServiceImpl implements ITbClueTrackRecordService { + @Autowired + private TbClueMapper clueMapper; + @Autowired + private TbClueTrackRecordMapper clueTrackRecordMapper; + @Override + @Transactional + public void disable(Long id, String reason, String remark) { + TbClue tbClue = clueMapper.selectTbClueById(id); + int falseCount = tbClue.getFalseCount(); + if (falseCount >= 2) {//删除线索 + clueMapper.deleteTbClueById(id); + clueTrackRecordMapper.deleteByClueId(id); + } else {//伪线索数+1 + falseCount+=1; + tbClue=new TbClue(); + tbClue.setFalseCount(falseCount); + tbClue.setId(id); + clueMapper.updateTbClue(tbClue); + //添加跟进记录 + TbClueTrackRecord tbClueTrackRecord = new TbClueTrackRecord(); + tbClueTrackRecord.setClueId(id); + tbClueTrackRecord.setCreateBy(SecurityUtils.getUsername()); + tbClueTrackRecord.setCreateTime(new Date()); + tbClueTrackRecord.setFalseReason(reason); + tbClueTrackRecord.setRecord(remark); + + + clueTrackRecordMapper.save(tbClueTrackRecord); + } + } + + + @Transactional + @Override + public void add(TbClue tbClue) { + clueTrackRecordMapper.add(tbClue); + } + + @Transactional + @Override + public void update(Long userId) { + clueTrackRecordMapper.update(userId); + } + public List getList(Long clueId) { + return clueTrackRecordMapper.getById(clueId); + } } diff --git a/huike-clues/src/main/java/com/huike/clues/strategy/Rule.java b/huike-clues/src/main/java/com/huike/clues/strategy/Rule.java index f99ebabbd33289ac2f4916c0721df4fb1cdb310b..341bdaa77b7a907509ffd153299fb540850fc6f6 100644 --- a/huike-clues/src/main/java/com/huike/clues/strategy/Rule.java +++ b/huike-clues/src/main/java/com/huike/clues/strategy/Rule.java @@ -1,9 +1,7 @@ package com.huike.clues.strategy; +import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; -import com.huike.clues.domain.TbRuleAssign; - -import java.util.List; /** @@ -18,4 +16,13 @@ public interface Rule { * 单条线索添加的规则 */ public Boolean loadRule(TbClue clue); + /** + * 构建分配记录对象,不插入数据库,null则未分配 + * @date 2022/5/31 10:57 + * @param clue + * @return com.huike.clues.domain.TbAssignRecord + */ + default TbAssignRecord loadRule0(TbClue clue) { + return null; + } } diff --git a/huike-clues/src/main/java/com/huike/clues/strategy/impl/RuleStrategy.java b/huike-clues/src/main/java/com/huike/clues/strategy/impl/RuleStrategy.java index 15e0eff3ed43a007d5192fbb22a5e42ab0ae85e0..ea5e25ca5bf8569405bb60bc49fbdd3f9d68e302 100644 --- a/huike-clues/src/main/java/com/huike/clues/strategy/impl/RuleStrategy.java +++ b/huike-clues/src/main/java/com/huike/clues/strategy/impl/RuleStrategy.java @@ -1,5 +1,6 @@ package com.huike.clues.strategy.impl; +import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; import com.huike.clues.mapper.SysDictDataMapper; import com.huike.clues.mapper.SysUserMapper; @@ -7,6 +8,7 @@ import com.huike.clues.mapper.TbAssignRecordMapper; import com.huike.clues.strategy.Rule; import com.huike.common.core.domain.entity.SysDictData; import com.huike.common.core.domain.entity.SysUser; +import com.huike.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; @@ -78,7 +80,54 @@ public class RuleStrategy implements Rule { * * 3.不满足规则的不进行分配,由管理员或主管来进行分配 * 将该线索数据添加到线索表中,但不往分配记录表里添加数据 */ - return null; + SysUser user=null; + if (clue.getSubject().equals(subjectJAVA.getDictValue())) { + user=zhangsan; + + } else if (clue.getSubject().equals(subjectHtml.getDictValue())) { + user=zhangsan1; + }else { + return false; + } + TbAssignRecord tbAssignRecord = fillRecord(clue, user); + + assignRecordMapper.insertAssignRecord(tbAssignRecord); + return true; + } + + private TbAssignRecord fillRecord(TbClue clue, SysUser user) { + TbAssignRecord tbAssignRecord = new TbAssignRecord(); + + tbAssignRecord.setAssignId(clue.getId()); + tbAssignRecord.setUserId(user.getUserId()); + tbAssignRecord.setUserName(user.getUserName()); + tbAssignRecord.setDeptId(user.getDeptId()); + tbAssignRecord.setCreateBy(SecurityUtils.getUsername()); + tbAssignRecord.setCreateTime(clue.getCreateTime()); + return tbAssignRecord; } + @Override + public TbAssignRecord loadRule0(TbClue clue) { + /** + * 规则: + * * 1.将想要学java的分配给zhangsan + * * 2.将想要学前端的分配给zhangsan1 + * * 3.不满足规则的不进行分配,由管理员或主管来进行分配 + * 将该线索数据添加到线索表中,但不往分配记录表里添加数据 + */ + SysUser user=null; + if (clue.getSubject().equals(subjectJAVA.getDictValue())) { + user=zhangsan; + + } else if (clue.getSubject().equals(subjectHtml.getDictValue())) { + user=zhangsan1; + }else { + return null; + } + clue.setStatus(TbClue.StatusType.FOLLOWING.getValue()); + return fillRecord(clue, user); + } + + } \ No newline at end of file diff --git a/huike-clues/src/main/java/com/huike/clues/utils/easyExcel/ExcelListener.java b/huike-clues/src/main/java/com/huike/clues/utils/easyExcel/ExcelListener.java index fbdce19763e1ea23503a12a400954beb06e97dd9..3e20beadd78fb96428249d8b81c9da761eaa504f 100644 --- a/huike-clues/src/main/java/com/huike/clues/utils/easyExcel/ExcelListener.java +++ b/huike-clues/src/main/java/com/huike/clues/utils/easyExcel/ExcelListener.java @@ -1,66 +1,100 @@ package com.huike.clues.utils.easyExcel; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; +import com.huike.clues.domain.TbAssignRecord; +import com.huike.clues.domain.TbClue; import com.huike.clues.domain.dto.ImportResultDTO; import com.huike.clues.domain.vo.TbClueExcelVo; import com.huike.clues.service.ITbClueService; +import java.util.*; +import java.util.stream.Collectors; + /** * EasyExcel监听器,用于解析数据并执行操作 */ public class ExcelListener extends AnalysisEventListener { - /** - * 利用构造方法获取对应的service - */ - public ITbClueService clueService; + /** + * 利用构造方法获取对应的service + */ + public ITbClueService clueService; + + private ImportResultDTO resultDTO; + + private static final int COUNT = 20; + + private Map map; + + /** + * 提供带参构造方法,在这里需要通过构造方法的方式获取对应的service层 + * 谁调用这个监听器谁提供需要的service + * + * @param clueService + */ + public ExcelListener(ITbClueService clueService) { + this.clueService = clueService; + this.resultDTO = new ImportResultDTO(); + this.map=new HashMap<>(COUNT); + } - private ImportResultDTO resultDTO; + /** + * 每解析一行数据都要执行一次 + * 每条都执行一次插入操作 + * + * @param data + * @param context + */ + @Override + public void invoke(TbClueExcelVo data, AnalysisContext context) { + Objects.requireNonNull(data); + TbClue tbClue = clueService.getClue(data); - /** - * 提供带参构造方法,在这里需要通过构造方法的方式获取对应的service层 - * 谁调用这个监听器谁提供需要的service - * @param clueService - */ - public ExcelListener(ITbClueService clueService) { - this.clueService = clueService; - this.resultDTO = new ImportResultDTO(); - } + if (Objects.isNull(tbClue)) { + return; + } - /** - * 每解析一行数据都要执行一次 - * 每条都执行一次插入操作 - * @param data - * @param context - */ - @Override - public void invoke(TbClueExcelVo data, AnalysisContext context) { - ImportResultDTO addTbClue = clueService.importCluesData(data); - resultDTO.addAll(addTbClue); - } + TbAssignRecord assignRecord = clueService.loadRule0(tbClue); + map.put(tbClue,assignRecord); + if (map.size() == COUNT) { + batchSave(); + } + } + /** + * 将缓存保存到数据库 + * @date 2022/5/31 10:54 + */ + private void batchSave() { + //保存到数据库 + List tbClues = map.keySet().stream().collect(Collectors.toList()); + ImportResultDTO importResultDTO = clueService.batchSaveClue(tbClues); + List assignRecords = map.values().stream().filter(a -> a != null).collect(Collectors.toList()); + clueService.batchSaveRecord(assignRecords); + //记录添加成功失败条数 + resultDTO.addAll(importResultDTO); + //清空缓存 + map.clear(); + } - /** - * 当所有数据都解析完成后会执行 - * @param context - */ - @Override - public void doAfterAllAnalysed(AnalysisContext context) { - } + /** + * 当所有数据都解析完成后会执行 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + //结束后将缓存数据存到数据库 + batchSave(); + } - /** - * 返回结果集对象 - * @return - */ - public ImportResultDTO getResult(){ - return resultDTO; - } + /** + * 返回结果集对象 + * + * @return + */ + public ImportResultDTO getResult() { + return resultDTO; + } } \ No newline at end of file diff --git a/huike-clues/src/main/resources/mapper/clues/TbActivityMapper.xml b/huike-clues/src/main/resources/mapper/clues/TbActivityMapper.xml index 3641134d3ebd4381af7c5e4edd25baee71898b68..99aba7d55949109f95dcb092ce72448465279811 100644 --- a/huike-clues/src/main/resources/mapper/clues/TbActivityMapper.xml +++ b/huike-clues/src/main/resources/mapper/clues/TbActivityMapper.xml @@ -41,10 +41,10 @@ and date_format(create_time,'%y%m%d') <= date_format(#{params.endCreateTime},'%y%m%d') - and date_format(begin_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + and date_format(begin_time,'%y%m%d') <= date_format(#{params.beginTime},'%y%m%d') - and date_format(end_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + and date_format(end_time,'%y%m%d') >= date_format(#{params.endTime},'%y%m%d') ORDER BY `create_time` DESC diff --git a/huike-clues/src/main/resources/mapper/clues/TbAssignRecordMapper.xml b/huike-clues/src/main/resources/mapper/clues/TbAssignRecordMapper.xml index db9ebcb1294cc849ff428dc6594a69911f24d5b2..cb46366c2151e20b4347df7baa2c90a3ced24d5e 100644 --- a/huike-clues/src/main/resources/mapper/clues/TbAssignRecordMapper.xml +++ b/huike-clues/src/main/resources/mapper/clues/TbAssignRecordMapper.xml @@ -1,34 +1,43 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - + + + + + + + + + - select id, assign_id, user_id, user_name, dept_id, create_time, create_by,latest, type from tb_assign_record + select id, + assign_id, + user_id, + user_name, + dept_id, + create_time, + create_by, + latest, + type + from tb_assign_record - + - insert into tb_assign_record @@ -62,7 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_by, latest, type, - + #{assignId}, #{userId}, @@ -72,7 +80,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createBy}, #{latest}, #{type}, - + + + + insert into tb_assign_record + (assign_id, + user_id, + user_name, + dept_id, + create_time, + create_by, + latest, + type) + values + + (#{r.assignId}, + #{r.userId}, + #{r.userName}, + #{r.deptId}, + #{r.createTime}, + #{r.createBy}, + #{r.latest}, + #{r.type}) + @@ -91,7 +121,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from tb_assign_record where id = #{id} + delete + from tb_assign_record + where id = #{id} @@ -102,30 +134,41 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - update tb_assign_record - set latest='0' - where assign_id = #{assignId} and type = #{type} - + + update tb_assign_record + set latest='0' + where assign_id = #{assignId} + and type = #{type} + - update tb_assign_record set status=#{status} - where assign_id = #{assignId} and type = #{type} + update tb_assign_record + set status=#{status} + where assign_id = #{assignId} + and type = #{type} \ No newline at end of file diff --git a/huike-clues/src/main/resources/mapper/clues/TbClueMapper.xml b/huike-clues/src/main/resources/mapper/clues/TbClueMapper.xml index 10a54f42249f3d307814f2adaf3ffdd56817563d..3ca566994a83948265c7682bd2acf76bfaa30873 100644 --- a/huike-clues/src/main/resources/mapper/clues/TbClueMapper.xml +++ b/huike-clues/src/main/resources/mapper/clues/TbClueMapper.xml @@ -5,51 +5,67 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - select id, name, phone, channel, activity_id, sex, age, weixin, qq, level, subject, status, create_time, - create_by,false_count, next_time,transfer from tb_clue + select id, + name, + phone, + channel, + activity_id, + sex, + age, + weixin, + qq, + level, + subject, + status, + create_time, + create_by, + false_count, + next_time, + transfer + from tb_clue - and clue.id = #{id} - and clue.name like concat('%', #{name}, '%') - and clue.phone = #{phone} - and clue.channel = #{channel} - and clue.activity_id = #{activityId} - and clue.sex = #{sex} - and clue.age = #{age} - and clue.weixin = #{weixin} - and clue.qq = #{qq} - and clue.level = #{level} - and clue.subject = #{subject} + and clue.id like concat('%', #{id}, '%') + and clue.name like concat('%', #{name}, '%') + and clue.phone = like concat('%', #{phone}, '%') + and clue.channel = #{channel} + and clue.activity_id = #{activityId} + and clue.sex = #{sex} + and clue.age = #{age} + and clue.weixin = #{weixin} + and clue.qq = #{qq} + and clue.level = #{level} + and clue.subject = #{subject} and date_format(clue.create_time,'%y%m%d') >= date_format(#{params.beginCreateTime},'%y%m%d') and date_format(clue.create_time,'%y%m%d') <= date_format(#{params.endCreateTime},'%y%m%d') - and clue.next_time = #{nextTime} - and r.user_name like concat('%', #{owner}, '%') + and clue.next_time = #{nextTime} + and r.user_name like concat('%', #{owner}, '%') - and clue.status = #{status} - and clue.status in ('1','2') + and clue.status = #{status} + and clue.status in ('1','2') AND (r.latest = '1' OR r.id IS NULL) AND (r.type = '0' OR r.id IS NULL) @@ -123,60 +155,58 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - @@ -244,6 +274,42 @@ #{nextTime}, + + insert into tb_clue + (name, + phone, + channel, + activity_id, + sex, + age, + weixin, + qq, + level, + subject, + status, + create_time, + create_by, + false_count, + next_time) + values + + (#{c.name}, + #{c.phone}, + #{c.channel}, + #{c.activityId}, + #{c.sex}, + #{c.age}, + #{c.weixin}, + #{c.qq}, + #{c.level}, + #{c.subject}, + #{c.status}, + #{c.createTime}, + #{c.createBy}, + #{c.falseCount}, + #{c.nextTime}) + + update tb_clue @@ -271,15 +337,24 @@ - update tb_clue set next_time=null, status=#{status} where id = #{id} + update tb_clue + set next_time=null, + status=#{status} + where id = #{id} - update tb_clue set next_time=null, status=#{status}, transfer='1' where id = #{id} + update tb_clue + set next_time=null, + status=#{status}, + transfer='1' + where id = #{id} - delete from tb_clue where id = #{id} + delete + from tb_clue + where id = #{id} @@ -290,12 +365,11 @@ - - - SELECT sum(case when t.`status`='4' THEN 1 ELSE 0 END ) AS falseClues, - (SELECT COUNT(b.id) AS total FROM `tb_clue` a LEFT JOIN `tb_business` b ON a.phone = b.phone WHERE a.activity_id=#{activityId} ) AS toBusiness, + (SELECT COUNT(b.id) AS total FROM `tb_clue` a LEFT JOIN `tb_business` b ON a.phone = b.phone WHERE + a.activity_id=#{activityId} ) AS toBusiness, count(1) AS total from tb_clue t where channel=#{channel} and t.activity_id=#{activityId} @@ -308,7 +382,8 @@ - select clue.create_by, r.dept_id, count(clue.id) as num from tb_clue clue left join tb_assign_record r on r.assign_id = clue.id @@ -320,20 +395,19 @@ - update tb_clue set end_time=#{endTime},next_time = null where id = #{id} + update tb_clue + set end_time=#{endTime}, + next_time = null + where id = #{id} - SELECT IFNULL(COUNT(id), 0) AS cluesNum, IFNULL( diff --git a/huike-clues/src/main/resources/mapper/clues/TbClueTrackRecordMapper.xml b/huike-clues/src/main/resources/mapper/clues/TbClueTrackRecordMapper.xml index b79005d187eb6512ef602f3eb8a40da10932db39..9b613cd930a21f14cd44fdfb5958f37cc67cd79f 100644 --- a/huike-clues/src/main/resources/mapper/clues/TbClueTrackRecordMapper.xml +++ b/huike-clues/src/main/resources/mapper/clues/TbClueTrackRecordMapper.xml @@ -1,20 +1,88 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - - + + + + + + + + + + + + + + insert into `tb_clue_track_record` + values (null, #{clueId}, #{createBy}, #{subject}, #{record}, #{level}, #{type}, #{falseReason}, #{nextTime}) + + + + update `tb_clue_track_record` + + + clueId = #{clueId} + + + createBy = #{createBy} + + + subject = #{subject} + + + clueId = #{record} + + + level = #{level} + + + type = #{type} + + + falseReason = #{falseReason} + + + nextTime = #{nextTime} + + + where id = #{id} + + + + insert into tb_clue_track_record + + clue_id, + create_by, + subject, + record, + `level`, + create_time, + `type`, + false_reason, + next_time, + + + #{clueId}, + #{createBy}, + #{subject}, + #{record}, + #{level}, + #{createTime}, + #{type}, + #{falseReason}, + #{nextTime}, + + + + delete from tb_clue_track_record where clue_id=#{clueId}; + \ No newline at end of file diff --git a/huike-common/src/main/java/com/huike/common/core/domain/AjaxResult.java b/huike-common/src/main/java/com/huike/common/core/domain/AjaxResult.java index 837cce437cd61d0fc5e0781cac17fe0195625f68..2732e14c1d4e2b966f33fe0c37bb2736faeb3c37 100644 --- a/huike-common/src/main/java/com/huike/common/core/domain/AjaxResult.java +++ b/huike-common/src/main/java/com/huike/common/core/domain/AjaxResult.java @@ -9,7 +9,7 @@ import com.huike.common.utils.StringUtils; * * */ -public class AjaxResult extends HashMap +public class AjaxResult extends HashMap { private static final long serialVersionUID = 1L; diff --git a/huike-common/src/main/java/com/huike/common/utils/bean/BeanUtils.java b/huike-common/src/main/java/com/huike/common/utils/bean/BeanUtils.java index f573af4d3b2913bb568406bc55364adc3de654a1..07d79d391a5e1cbb07f13b60034708f0823add9e 100644 --- a/huike-common/src/main/java/com/huike/common/utils/bean/BeanUtils.java +++ b/huike-common/src/main/java/com/huike/common/utils/bean/BeanUtils.java @@ -107,4 +107,6 @@ public class BeanUtils extends org.springframework.beans.BeanUtils { return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); } + + } diff --git a/huike-contract/src/main/java/com/huike/contract/domain/vo/TbContractVO.java b/huike-contract/src/main/java/com/huike/contract/domain/vo/TbContractVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ebb3b996290397b9963a094cae5bf4c469f8c838 --- /dev/null +++ b/huike-contract/src/main/java/com/huike/contract/domain/vo/TbContractVO.java @@ -0,0 +1,14 @@ +package com.huike.contract.domain.vo; + +import lombok.Data; + +/** + * @author light + * @date 2022年05月27日 15:09 + * @description + */ +@Data +public class TbContractVO { + private String subject; + private Integer num; +} diff --git a/huike-mybatis-review/src/main/java/com/huike/review/mapper/MybatisReviewMapper.java b/huike-mybatis-review/src/main/java/com/huike/review/mapper/MybatisReviewMapper.java index 77c3a7ef490577a2232995626f5818b78d66003d..75e9449852903c526297a078a8d25f4d86525f39 100644 --- a/huike-mybatis-review/src/main/java/com/huike/review/mapper/MybatisReviewMapper.java +++ b/huike-mybatis-review/src/main/java/com/huike/review/mapper/MybatisReviewMapper.java @@ -1,11 +1,9 @@ package com.huike.review.mapper; -import com.huike.review.pojo.Review; import com.huike.review.vo.MybatisReviewVO; import org.apache.ibatis.annotations.Param; import java.util.List; -import java.util.Map; /** * Mybatis复习的Mapper层 @@ -14,11 +12,20 @@ public interface MybatisReviewMapper { /**======================================================新增======================================================**/ + void insert(MybatisReviewVO review); /**======================================================删除======================================================**/ + void delete(@Param("id") Long id); /**======================================================修改======================================================**/ + void update(MybatisReviewVO reviewVO); /**======================================================简单查询===================================================**/ + MybatisReviewVO getById(@Param("id")Long id); + + List findAll(); + + + } diff --git a/huike-mybatis-review/src/main/java/com/huike/review/service/ReviewService.java b/huike-mybatis-review/src/main/java/com/huike/review/service/ReviewService.java index 5d7ea9eeb89ace24fa22cfecc3779a7184dc42c1..43e100b8ae93d1af44525f06f4d1fdfaf02e00b3 100644 --- a/huike-mybatis-review/src/main/java/com/huike/review/service/ReviewService.java +++ b/huike-mybatis-review/src/main/java/com/huike/review/service/ReviewService.java @@ -1,6 +1,6 @@ package com.huike.review.service; -import com.huike.review.pojo.Review; +import com.huike.common.core.domain.AjaxResult; import com.huike.review.vo.MybatisReviewVO; import java.util.List; @@ -11,4 +11,13 @@ import java.util.List; public interface ReviewService { + AjaxResult save(MybatisReviewVO review); + + AjaxResult update(MybatisReviewVO reviewVO); + + AjaxResult remove(Long id); + + AjaxResult getById(Long id); + + List getByPage(); } diff --git a/huike-mybatis-review/src/main/java/com/huike/review/service/impl/ReviewServiceImpl.java b/huike-mybatis-review/src/main/java/com/huike/review/service/impl/ReviewServiceImpl.java index 283324ff65c76bbbceb1bade9fc0ad7887cf8478..59f53904f4072d36d18f6db5cd29ac4e9a70908c 100644 --- a/huike-mybatis-review/src/main/java/com/huike/review/service/impl/ReviewServiceImpl.java +++ b/huike-mybatis-review/src/main/java/com/huike/review/service/impl/ReviewServiceImpl.java @@ -1,11 +1,8 @@ package com.huike.review.service.impl; import com.huike.common.core.domain.AjaxResult; -import com.huike.common.exception.CustomException; -import com.huike.common.utils.bean.BeanUtils; -import com.huike.review.pojo.Review; -import com.huike.review.service.ReviewService; import com.huike.review.mapper.MybatisReviewMapper; +import com.huike.review.service.ReviewService; import com.huike.review.vo.MybatisReviewVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,14 +21,33 @@ public class ReviewServiceImpl implements ReviewService { private MybatisReviewMapper reviewMapper; /**=========================================================保存数据的方法=============================================*/ - - + @Override + public AjaxResult save(MybatisReviewVO review) { + reviewMapper.insert(review); + return AjaxResult.success("成功插入:1条数据"); + } /**=========================================================删除数据=============================================*/ - - - /**=========================================================修改数据=============================================*/ - - - /**=========================================================查询数据的方法=============================================*/ - + @Override + public AjaxResult remove(Long id) { + reviewMapper.delete(id); + return AjaxResult.success("成功删除:1条数据"); + } +/**=========================================================修改数据=============================================*/ + @Override + public AjaxResult update(MybatisReviewVO reviewVO) { + reviewMapper.update(reviewVO); + return AjaxResult.success("修改成功"); + } +/**=========================================================查询数据的方法=============================================*/ + @Override + public AjaxResult getById(Long id) { + MybatisReviewVO reviewVO=reviewMapper.getById(id); + return AjaxResult.success(reviewVO); + } + + @Override + public List getByPage() { + ListreviewVOs=reviewMapper.findAll(); + return reviewVOs; + } } diff --git a/huike-mybatis-review/src/main/resources/mapper/review/ReviewMapper.xml b/huike-mybatis-review/src/main/resources/mapper/review/ReviewMapper.xml index 0f452130ae90a0bda4a5b970a4e6bbfef703c90d..6fe4372ceeae59760329b0d89ca4e1edff4d0b16 100644 --- a/huike-mybatis-review/src/main/resources/mapper/review/ReviewMapper.xml +++ b/huike-mybatis-review/src/main/resources/mapper/review/ReviewMapper.xml @@ -3,6 +3,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + select id, name, age, sex, create_by, create_time, update_user, update_time from mybatis_review + - + + insert into mybatis_review (name, age,sex) values (#{name},#{age},#{sex}) + + + update mybatis_review set name=#{name},age=#{age},sex=#{sex} where id=#{id}; + + + delete from mybatis_review where id=#{id}; + + + \ No newline at end of file diff --git a/huike-report/src/main/java/com/huike/report/domain/vo/LongHuBangVO.java b/huike-report/src/main/java/com/huike/report/domain/vo/LongHuBangVO.java new file mode 100644 index 0000000000000000000000000000000000000000..307acf891c2f43bfdc52fd4582d9e1fda7dfbc57 --- /dev/null +++ b/huike-report/src/main/java/com/huike/report/domain/vo/LongHuBangVO.java @@ -0,0 +1,49 @@ +package com.huike.report.domain.vo; + +import java.math.BigDecimal; + +/** + * @author light + * @date 2022年05月28日 11:07 + * @description + */ + +public class LongHuBangVO { + private String create_by; + private String deptName; + private Long num; + private BigDecimal radio; + + + public String getCreate_by() { + return create_by; + } + + public void setCreate_by(String create_by) { + this.create_by = create_by; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public Long getNum() { + return num; + } + + public void setNum(Long num) { + this.num = num; + } + + public BigDecimal getRadio() { + return radio; + } + + public void setRadio(BigDecimal radio) { + this.radio = radio; + } +} diff --git a/huike-report/src/main/java/com/huike/report/mapper/ReportMapper.java b/huike-report/src/main/java/com/huike/report/mapper/ReportMapper.java index e57e24e784c09d2b02ba07248356961d9c055dab..a020fc0c0fabe51f6e84a3d0695e3c4ef703a699 100644 --- a/huike-report/src/main/java/com/huike/report/mapper/ReportMapper.java +++ b/huike-report/src/main/java/com/huike/report/mapper/ReportMapper.java @@ -1,10 +1,15 @@ package com.huike.report.mapper; -import java.util.Map; - +import com.huike.contract.domain.vo.TbContractVO; +import com.huike.report.domain.vo.IndexTodayInfoVO; +import com.huike.report.domain.vo.IndexTodoInfoVO; +import com.huike.report.domain.vo.LongHuBangVO; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.session.ResultHandler; -import com.huike.clues.domain.vo.IndexStatisticsVo; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; /** * 首页统计分析的Mapper @@ -57,10 +62,66 @@ public interface ReportMapper { @Param("endTime") String endCreateTime, @Param("username") String username); + /**=========================================今日简报========================================*/ + Integer getTodayClueNum(@Param("username") String username, @Param("now") LocalDateTime now); + + Integer getTodayBusinessNum(@Param("username") String username, @Param("now") LocalDateTime now); + + Integer getTodayContractNum(@Param("username") String username, @Param("now") LocalDateTime now); + + Double getTodayAmount(@Param("username") String username, @Param("now") LocalDateTime now); + + IndexTodayInfoVO getTodayInfo(@Param("username") String username, @Param("now") LocalDateTime now); /**=========================================待办========================================*/ + IndexTodoInfoVO getTodoInfo(@Param("beginCreateTime")String beginCreateTime,@Param("endCreateTime") String endCreateTime); + + Integer getTodoClueNum(@Param("username") String username,@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getTodoBusinessNum(@Param("username") String username,@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getToallocatedCluesNum(@Param("username") String username,@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getToallocatedBusinessNum(@Param("username") String username,@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + List subjectStatistics(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + + + List> cluesStatistics(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + void cluesStatistics1(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime, ResultHandler handler); + + Integer getAllCluesNum(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getEffectiveCluesNum(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getBusinessNums(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getContractNums(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + List businessChangeStatistics(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getBusinessNumsB(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + + Integer getAllCluesNumS(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); + List salesStatistic(@Param("beginCreateTime")String beginCreateTime, + @Param("endCreateTime") String endCreateTime); } diff --git a/huike-report/src/main/java/com/huike/report/service/IReportService.java b/huike-report/src/main/java/com/huike/report/service/IReportService.java index c6c0b6ac52900d88d71f73749e4c0bd7fb07dbf5..168d435765dea81ebc9eedfcdda12be6e6fd07a0 100644 --- a/huike-report/src/main/java/com/huike/report/service/IReportService.java +++ b/huike-report/src/main/java/com/huike/report/service/IReportService.java @@ -1,15 +1,15 @@ package com.huike.report.service; -import java.util.List; -import java.util.Map; - -import com.huike.report.domain.vo.*; -import org.apache.ibatis.annotations.Param; - import com.huike.clues.domain.TbActivity; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.vo.IndexStatisticsVo; import com.huike.contract.domain.TbContract; +import com.huike.contract.domain.vo.TbContractVO; +import com.huike.report.domain.vo.*; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; public interface IReportService { @@ -108,4 +108,17 @@ public interface IReportService { IndexBaseInfoVO getBaseInfo(String beginCreateTime, String endCreateTime); + IndexTodayInfoVO getTodayInfo(); + + IndexTodoInfoVO getTodoInfo(String beginCreateTime, String endCreateTime); + + List subjectStatistics(String beginCreateTime, String endCreateTime); + + LineChartVO cluesStatistics(String beginCreateTime, String endCreateTime) throws ParseException; + + VulnerabilityMapVo getVulnerabilityMap(String beginCreateTime, String endCreateTime); + + List businessChangeStatistics(String beginCreateTime, String endCreateTime); + + List salesStatistic(String beginCreateTime, String endCreateTime); } diff --git a/huike-report/src/main/java/com/huike/report/service/impl/ReportServiceImpl.java b/huike-report/src/main/java/com/huike/report/service/impl/ReportServiceImpl.java index 699e6d450c773a24855b3662eb30985d2c562bbc..2fb74a71c36a3057a368482a76f804f0975de7df 100644 --- a/huike-report/src/main/java/com/huike/report/service/impl/ReportServiceImpl.java +++ b/huike-report/src/main/java/com/huike/report/service/impl/ReportServiceImpl.java @@ -1,41 +1,31 @@ package com.huike.report.service.impl; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -import com.huike.report.domain.vo.*; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.huike.business.mapper.TbBusinessMapper; import com.huike.clues.domain.TbActivity; import com.huike.clues.domain.TbAssignRecord; import com.huike.clues.domain.TbClue; import com.huike.clues.domain.vo.IndexStatisticsVo; -import com.huike.clues.mapper.SysDeptMapper; -import com.huike.clues.mapper.SysDictDataMapper; -import com.huike.clues.mapper.TbActivityMapper; -import com.huike.clues.mapper.TbAssignRecordMapper; -import com.huike.clues.mapper.TbClueMapper; +import com.huike.clues.mapper.*; import com.huike.common.core.domain.entity.SysDept; import com.huike.common.utils.SecurityUtils; import com.huike.contract.domain.TbContract; +import com.huike.contract.domain.vo.TbContractVO; import com.huike.contract.mapper.TbContractMapper; +import com.huike.report.domain.vo.*; import com.huike.report.mapper.ReportMapper; import com.huike.report.service.IReportService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; @Service -public class ReportServiceImpl implements IReportService { +public class ReportServiceImpl implements IReportService { @Autowired private TbContractMapper contractMapper; @@ -65,24 +55,24 @@ public class ReportServiceImpl implements IReportService { @Override public LineChartVO contractStatistics(String beginCreateTime, String endCreateTime) { - LineChartVO lineChartVo =new LineChartVO(); + LineChartVO lineChartVo = new LineChartVO(); try { - List timeList= findDates(beginCreateTime,endCreateTime); + List timeList = findDates(beginCreateTime, endCreateTime); lineChartVo.setxAxis(timeList); List series = new ArrayList<>(); - List> statistics = contractMapper.contractStatistics(beginCreateTime,endCreateTime); - LineSeriesVO lineSeriesDTO1=new LineSeriesVO(); + List> statistics = contractMapper.contractStatistics(beginCreateTime, endCreateTime); + LineSeriesVO lineSeriesDTO1 = new LineSeriesVO(); lineSeriesDTO1.setName("新增客户数"); - LineSeriesVO lineSeriesDTO2=new LineSeriesVO(); + LineSeriesVO lineSeriesDTO2 = new LineSeriesVO(); lineSeriesDTO2.setName("客户总数"); int sum = 0; for (String s : timeList) { - Optional optional= statistics.stream().filter(d->d.get("dd").equals(s)).findFirst(); - if(optional.isPresent()){ - Map cuurentData= (Map)optional.get(); + Optional optional = statistics.stream().filter(d -> d.get("dd").equals(s)).findFirst(); + if (optional.isPresent()) { + Map cuurentData = (Map) optional.get(); lineSeriesDTO1.getData().add(cuurentData.get("num")); sum += Integer.parseInt(cuurentData.get("num").toString()); - }else{ + } else { lineSeriesDTO1.getData().add(0); } lineSeriesDTO2.getData().add(sum); @@ -93,26 +83,26 @@ public class ReportServiceImpl implements IReportService { } catch (ParseException e) { // e.printStackTrace(); } - return lineChartVo; + return lineChartVo; } @Override public LineChartVO salesStatistics(String beginCreateTime, String endCreateTime) { - LineChartVO lineChartVo =new LineChartVO(); + LineChartVO lineChartVo = new LineChartVO(); try { - List timeList= findDates(beginCreateTime,endCreateTime); + List timeList = findDates(beginCreateTime, endCreateTime); lineChartVo.setxAxis(timeList); List series = new ArrayList<>(); - List> statistics = contractMapper.salesStatistics(beginCreateTime,endCreateTime); - LineSeriesVO lineSeriesVo=new LineSeriesVO(); + List> statistics = contractMapper.salesStatistics(beginCreateTime, endCreateTime); + LineSeriesVO lineSeriesVo = new LineSeriesVO(); lineSeriesVo.setName("销售统计"); - int sum=0; + int sum = 0; for (String s : timeList) { - Optional optional= statistics.stream().filter(d->d.get("dd").equals(s)).findFirst(); - if(optional.isPresent()){ - Map cuurentData= (Map)optional.get(); + Optional optional = statistics.stream().filter(d -> d.get("dd").equals(s)).findFirst(); + if (optional.isPresent()) { + Map cuurentData = (Map) optional.get(); lineSeriesVo.getData().add(cuurentData.get("sales")); - }else{ + } else { lineSeriesVo.getData().add(0); } } @@ -121,22 +111,20 @@ public class ReportServiceImpl implements IReportService { } catch (ParseException e) { // e.printStackTrace(); } - return lineChartVo; + return lineChartVo; } - - /** * 渠道统计 */ @Override public List> chanelStatistics(String beginCreateTime, String endCreateTime) { - List> data= contractMapper.chanelStatistics(beginCreateTime,endCreateTime); + List> data = contractMapper.chanelStatistics(beginCreateTime, endCreateTime); for (Map datum : data) { - String subjectValue= (String) datum.get("channel"); - String lable= sysDictDataMapper.selectDictLabel("clues_item",subjectValue); - datum.put("channel",lable); + String subjectValue = (String) datum.get("channel"); + String lable = sysDictDataMapper.selectDictLabel("clues_item", subjectValue); + datum.put("channel", lable); } return data; } @@ -149,13 +137,13 @@ public class ReportServiceImpl implements IReportService { @Override public List> activityStatistics(String beginCreateTime, String endCreateTime) { - List> data= contractMapper.activityStatistics(beginCreateTime,endCreateTime); + List> data = contractMapper.activityStatistics(beginCreateTime, endCreateTime); for (Map datum : data) { - Long activityId= (Long) datum.get("activity_id"); + Long activityId = (Long) datum.get("activity_id"); TbActivity tbActivity = activityMapper.selectTbActivityById(activityId); - if(tbActivity==null){ + if (tbActivity == null) { datum.put("activity", "其他"); - }else{ + } else { datum.put("activity", tbActivity.getName()); } } @@ -164,17 +152,18 @@ public class ReportServiceImpl implements IReportService { /** * 按照部门统计销售 + * * @param beginCreateTime * @param endCreateTime * @return */ @Override public List> deptStatisticsList(String beginCreateTime, String endCreateTime) { - List> data= contractMapper.deptStatistics(beginCreateTime,endCreateTime); + List> data = contractMapper.deptStatistics(beginCreateTime, endCreateTime); for (Map datum : data) { - Long deptId= (Long) datum.get("dept_id"); - if(deptId!=null){ - SysDept dept= deptMapper.selectDeptById(deptId); + Long deptId = (Long) datum.get("dept_id"); + if (deptId != null) { + SysDept dept = deptMapper.selectDeptById(deptId); datum.put("deptName", dept.getDeptName()); } } @@ -184,18 +173,19 @@ public class ReportServiceImpl implements IReportService { /** * 按照渠道统计销售 + * * @param beginCreateTime * @param endCreateTime * @return */ @Override public List> channelStatisticsList(String beginCreateTime, String endCreateTime) { - List> data= contractMapper.channelStatistics(beginCreateTime,endCreateTime); + List> data = contractMapper.channelStatistics(beginCreateTime, endCreateTime); for (Map datum : data) { - String subjectValue= (String) datum.get("channel"); - if(subjectValue!=null){ - String lable= sysDictDataMapper.selectDictLabel("clues_item",subjectValue); - datum.put("channel",lable); + String subjectValue = (String) datum.get("channel"); + if (subjectValue != null) { + String lable = sysDictDataMapper.selectDictLabel("clues_item", subjectValue); + datum.put("channel", lable); } } return data; @@ -204,13 +194,14 @@ public class ReportServiceImpl implements IReportService { /** * 按照归属人统计销售 + * * @param beginCreateTime * @param endCreateTime * @return */ @Override public List> ownerShipStatisticsList(String beginCreateTime, String endCreateTime) { - return contractMapper.ownerShipStatistics(beginCreateTime,endCreateTime); + return contractMapper.ownerShipStatistics(beginCreateTime, endCreateTime); } @@ -222,9 +213,9 @@ public class ReportServiceImpl implements IReportService { @Override public List activityStatisticsList(TbActivity query) { query.setStatus("2"); - List activities= activityMapper.selectTbActivityList(query); + List activities = activityMapper.selectTbActivityList(query); Map timeMap = query.getParams(); - List list=new ArrayList<>(); + List list = new ArrayList<>(); for (TbActivity activity : activities) { ActivityStatisticsVo dto = new ActivityStatisticsVo(); BeanUtils.copyProperties(activity, dto); @@ -235,7 +226,7 @@ public class ReportServiceImpl implements IReportService { Map clueCount = clueMapper.countByActivity(tbClue); if (clueCount != null) { dto.setCluesNum(Integer.parseInt(clueCount.get("total").toString())); - if(clueCount.get("falseClues")!=null){ + if (clueCount.get("falseClues") != null) { dto.setFalseCluesNum(Integer.parseInt(clueCount.get("falseClues").toString())); } if (clueCount.get("toBusiness") != null) { @@ -249,14 +240,14 @@ public class ReportServiceImpl implements IReportService { Map contractCount = contractMapper.countByActivity(tbContract); if (contractCount != null) { dto.setCustomersNum(Integer.parseInt(contractCount.get("customersNum").toString())); - if(contractCount.get("amount")==null) { + if (contractCount.get("amount") == null) { dto.setAmount(0d); - }else { + } else { dto.setAmount((Double) contractCount.get("amount")); } - if(contractCount.get("cost")==null) { + if (contractCount.get("cost") == null) { dto.setCost(0d); - }else { + } else { dto.setCost((Double) contractCount.get("cost")); } @@ -269,6 +260,7 @@ public class ReportServiceImpl implements IReportService { /** * *************看我看我************** * 传入两个时间范围,返回这两个时间范围内的所有时间,并保存在一个集合中 + * * @param beginTime * @param endTime * @return @@ -301,8 +293,8 @@ public class ReportServiceImpl implements IReportService { @Override public IndexVo getIndex(IndexStatisticsVo request) { - Long deptId= request.getDeptId(); - TbAssignRecord tbAssignRecord=new TbAssignRecord(); + Long deptId = request.getDeptId(); + TbAssignRecord tbAssignRecord = new TbAssignRecord(); tbAssignRecord.setLatest("1"); assignRecordMapper.selectAssignRecordList(tbAssignRecord); return null; @@ -310,11 +302,11 @@ public class ReportServiceImpl implements IReportService { @Override public List> salesStatisticsForIndex(IndexStatisticsVo request) { - List> list= contractMapper.contractStatisticsByUser(request); + List> list = contractMapper.contractStatisticsByUser(request); for (Map datum : list) { - Long deptId= (Long) datum.get("dept_id"); - if(deptId!=null){ - SysDept dept= deptMapper.selectDeptById(deptId); + Long deptId = (Long) datum.get("dept_id"); + if (deptId != null) { + SysDept dept = deptMapper.selectDeptById(deptId); datum.put("deptName", dept.getDeptName()); } } @@ -326,23 +318,25 @@ public class ReportServiceImpl implements IReportService { * ************看我看我*********** * 用我能少走很多路 * 我是用来机选百分比的方法 - * @param all + * + * @param all * @param num * @return */ - private BigDecimal getRadio(Integer all,Long num) { - if(all.intValue()==0){ + private BigDecimal getRadio(Integer all, Long num) { + if (all.intValue() == 0) { return new BigDecimal(0); } BigDecimal numBigDecimal = new BigDecimal(num); BigDecimal allBigDecimal = new BigDecimal(all); - BigDecimal divide = numBigDecimal.divide(allBigDecimal,4,BigDecimal.ROUND_HALF_UP); + BigDecimal divide = numBigDecimal.divide(allBigDecimal, 4, BigDecimal.ROUND_HALF_UP); return divide.multiply(new BigDecimal(100)); } /** * 获取首页基本数据 + * * @param beginCreateTime * @param endCreateTime * @return @@ -360,7 +354,7 @@ public class ReportServiceImpl implements IReportService { result.setBusinessNum(reportMpper.getBusinessNum(beginCreateTime, endCreateTime, username)); result.setContractNum(reportMpper.getContractNum(beginCreateTime, endCreateTime, username)); result.setSalesAmount(reportMpper.getSalesAmount(beginCreateTime, endCreateTime, username)); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; } @@ -368,4 +362,153 @@ public class ReportServiceImpl implements IReportService { return result; } + /** + * 需求: + * + * **当前用户**在**当天的线索数量**,**商机数量**,**合同数量**,**成交的金额** + * + * @return IndexTodayInfoVO + * @date 2022/5/27 9:12 + */ + @Override + public IndexTodayInfoVO getTodayInfo() { + String username = SecurityUtils.getUsername(); + LocalDateTime now = LocalDateTime.now().plusDays(-2); + +// //线索数量 +// Integer clueNum=reportMpper.getTodayClueNum(username, now); +// //商机数量 +// Integer businessNum=reportMpper.getTodayBusinessNum(username, now); +// //合同数量 +// Integer contractNum=reportMpper.getTodayContractNum(username, now); +// //成交的金额 +// Double amount=reportMpper.getTodayAmount(username, now); +// IndexTodayInfoVO todayInfo = new IndexTodayInfoVO(); +// todayInfo.setTodayCluesNum(clueNum); +// todayInfo.setTodayBusinessNum(businessNum); +// todayInfo.setTodayContractNum(contractNum); +// todayInfo.setTodaySalesAmount(amount); + IndexTodayInfoVO todayInfo = reportMpper.getTodayInfo(username, now); + return todayInfo; + } + + @Override + public IndexTodoInfoVO getTodoInfo(String beginCreateTime, String endCreateTime) { + String username = SecurityUtils.getUsername(); +// IndexTodoInfoVO todoInfoVO=reportMpper.getTodoInfo(beginCreateTime,endCreateTime); + IndexTodoInfoVO todoInfoVO=new IndexTodoInfoVO(); + Integer clueNum=reportMpper.getTodoClueNum(username,beginCreateTime,endCreateTime); + Integer businessNum=reportMpper.getTodoBusinessNum(username,beginCreateTime,endCreateTime); + Integer allocatedCluesNum=reportMpper.getToallocatedCluesNum(username,beginCreateTime,endCreateTime); + Integer allocatedBusinessNum=reportMpper.getToallocatedBusinessNum(username,beginCreateTime,endCreateTime); + todoInfoVO.setTofollowedCluesNum(clueNum); + todoInfoVO.setTofollowedBusinessNum(businessNum); + todoInfoVO.setToallocatedCluesNum(allocatedCluesNum); + todoInfoVO.setToallocatedBusinessNum(allocatedBusinessNum); + + return todoInfoVO; + } + + @Override + public List subjectStatistics(String beginCreateTime, String endCreateTime) { + return reportMpper.subjectStatistics(beginCreateTime,endCreateTime); + } + + @Override + public LineChartVO cluesStatistics(String beginCreateTime, String endCreateTime) throws ParseException { + //获取日期数组 + List dates = findDates(beginCreateTime, endCreateTime); + + ArrayList lineSeriesVOS = new ArrayList<>(); + + /*HashMap map = new HashMap<>(); + reportMpper.cluesStatistics(beginCreateTime, endCreateTime) + .forEach(m->{ + String d = (String) m.get("dd"); + Long num = (Long) m.get("num"); + map.put(d,num); + });*/ + HashMap map = new HashMap<>(); + reportMpper.cluesStatistics1(beginCreateTime,endCreateTime,resultContext -> { + Map o = (Map) resultContext.getResultObject(); + map.put((String) o.get("key"), (Long) o.get("value")); + }); + ArrayList integers = new ArrayList<>(); + Long num=0l; + ArrayList new_clues = new ArrayList<>(); + for (String date : dates) { + Long l = map.get(date); + l=l==null?0:l; + new_clues.add(l); + //累加总数 + num+=l; + integers.add(num); + } + map.clear(); +// //new结果对象 + LineChartVO lineChartVO = new LineChartVO(); + //填充日期数据 + lineChartVO.setxAxis(dates); + // 创建 新增线索数量 对象 + LineSeriesVO lineSeries_new = new LineSeriesVO(); + lineSeries_new.setName("新增线索数量"); + //填充新增clue数据 + lineSeries_new.setData(new_clues); + //填充结果对象的新增clue数组数据 + lineSeriesVOS.add(lineSeries_new); + + //创建 线索总数量 + LineSeriesVO lineSeries_grete = new LineSeriesVO(); + lineSeries_grete.setName("线索总数量"); + //填充总数量数据 + lineSeries_grete.setData(integers); + //填充结果对象的新增总数量数据 + lineSeriesVOS.add(lineSeries_grete); + + lineChartVO.setSeries(lineSeriesVOS); + return lineChartVO; + } + + @Override + public VulnerabilityMapVo getVulnerabilityMap(String beginCreateTime, String endCreateTime) { + VulnerabilityMapVo mapVo = new VulnerabilityMapVo(); + //线索数 + mapVo.setCluesNums(reportMpper.getAllCluesNum(beginCreateTime, endCreateTime)); + //有效线索数 + mapVo.setEffectiveCluesNums(reportMpper.getEffectiveCluesNum(beginCreateTime, endCreateTime)); + //商机数 + mapVo.setBusinessNums(reportMpper.getBusinessNums(beginCreateTime, endCreateTime)); + //合同数 + mapVo.setContractNums(reportMpper.getContractNums(beginCreateTime, endCreateTime)); + return mapVo; + } + + @Override + public List businessChangeStatistics(String beginCreateTime, String endCreateTime) { + //获取总商机数量 + Integer businessNums = reportMpper.getBusinessNumsB(beginCreateTime, endCreateTime); + //获取龙虎榜前十名 和数量 + List longHuBangVOS = reportMpper.businessChangeStatistics(beginCreateTime, endCreateTime); + //计算转化率 + longHuBangVOS + .forEach(l->{ + l.setRadio(getRadio(businessNums, l.getNum())); + }); + + return longHuBangVOS; + } + + @Override + public List salesStatistic(String beginCreateTime, String endCreateTime) { + Integer businessNums = reportMpper.getAllCluesNumS(beginCreateTime, endCreateTime); + + List longHuBangVOS = reportMpper.salesStatistic(beginCreateTime, endCreateTime); + longHuBangVOS + .forEach(l->{ + l.setRadio(getRadio(businessNums, l.getNum())); + }); + + return longHuBangVOS; + } + } \ No newline at end of file diff --git a/huike-report/src/main/resources/mapper/report/ReportMapper.xml b/huike-report/src/main/resources/mapper/report/ReportMapper.xml index dd7675c890c255372fcacdd2e04b390239ecfc39..cc1348aafe9a747df4d670420919d58f8dea21bc 100644 --- a/huike-report/src/main/resources/mapper/report/ReportMapper.xml +++ b/huike-report/src/main/resources/mapper/report/ReportMapper.xml @@ -1,68 +1,253 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/huike-system/src/main/java/com/huike/clues/mapper/SysDictDataMapper.java b/huike-system/src/main/java/com/huike/clues/mapper/SysDictDataMapper.java index a9cfd23fd430bb86ba50819696ed155d4502008a..1f679a712fab288bc9f3bef9c16c06922b3a97ae 100644 --- a/huike-system/src/main/java/com/huike/clues/mapper/SysDictDataMapper.java +++ b/huike-system/src/main/java/com/huike/clues/mapper/SysDictDataMapper.java @@ -1,8 +1,9 @@ package com.huike.clues.mapper; -import java.util.List; -import org.apache.ibatis.annotations.Param; import com.huike.common.core.domain.entity.SysDictData; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 字典表 数据层 @@ -94,4 +95,5 @@ public interface SysDictDataMapper{ * @return 结果 */ public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType); + } diff --git a/huike-system/src/main/java/com/huike/clues/service/impl/SysFileServiceImpl.java b/huike-system/src/main/java/com/huike/clues/service/impl/SysFileServiceImpl.java index 130c507d47aa45cd77f60b84a7704c1a86970992..d9edf2dbd603e2f152586ad0579225fd20bade1c 100644 --- a/huike-system/src/main/java/com/huike/clues/service/impl/SysFileServiceImpl.java +++ b/huike-system/src/main/java/com/huike/clues/service/impl/SysFileServiceImpl.java @@ -1,24 +1,23 @@ package com.huike.clues.service.impl; -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.UUID; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; - -import io.minio.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - import com.huike.clues.service.ISysFileService; import com.huike.common.config.MinioConfig; import com.huike.common.core.domain.AjaxResult; - +import com.huike.common.utils.DateUtils; +import com.huike.common.utils.file.FileUploadUtils; +import io.minio.BucketExistsArgs; +import io.minio.MakeBucketArgs; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.UUID; @Service @Slf4j @@ -41,7 +40,11 @@ public class SysFileServiceImpl implements ISysFileService{ try { inputStream = file.getInputStream(); //基于官网的内容,判断文件存储的桶是否存在 如果桶不存在就创建桶 - //TODO 补全这部分代码 + + if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } + /** * ================================操作文件================================ * 思路:我们上传的文件是:合同.pdf @@ -57,11 +60,20 @@ public class SysFileServiceImpl implements ISysFileService{ * 如果上述思路你无法理解,那么就直接存放在桶内生成uuid+.pdf即可 * 即:huike-crm/uuid.pdf */ - //TODO 基于上述逻辑补全代码 + + String extension = FileUploadUtils.getExtension(file); + String filename = bucketName+DateUtils.parseDateToStr("/yyyy/MM/dd/", new Date()) + + UUID.randomUUID() +"."+extension; + minioClient.putObject(PutObjectArgs.builder() + .stream(inputStream, file.getSize(), file.getSize()) + .object(filename) + .bucket(bucketName).build()); /** * 构建返回结果集 */ AjaxResult ajax = AjaxResult.success(); + ajax.put("filename",filename); + ajax.put("url",minioConfig.getEndpoint()+":"+minioConfig.getPort()+filename); /** * 封装需要的数据进行返回 */ diff --git a/huike-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/huike-system/src/main/resources/mapper/system/SysDictDataMapper.xml index 81bd20c264800589f747aee40b0bfe8278dbcc31..6b52d69b6bcbcd06d939219778b979cadb1a8534 100644 --- a/huike-system/src/main/resources/mapper/system/SysDictDataMapper.xml +++ b/huike-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -97,8 +97,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} - - + + + + + insert into sys_dict_data( dict_sort, dict_label, diff --git a/huike-system/src/main/resources/mapper/system/SysUserMapper.xml b/huike-system/src/main/resources/mapper/system/SysUserMapper.xml index 97bf2b2c874f4a83b321b4e13cb76c2f04c3cc1f..c0470c3eab88b32a611c183c9b0bc1d533912952 100644 --- a/huike-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/huike-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -62,9 +62,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND u.user_name like concat('%', #{userName}, '%') - - AND u.status = #{status} - + AND date_format(u.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') @@ -74,6 +72,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )) + + AND u.phonenumber like concat('%',#{phonenumber},'%') + diff --git a/pom.xml b/pom.xml index 1d71d9813c5c03a3e76a945f7320716c38fac7e1..8328ef2cd7d34e2b4864de7e61ee3cf1d869ee7e 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,7 @@ ${oshi.version} + net.java.dev.jna jna