diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java index ebf6fae9..71bb08e4 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ClueDto.java @@ -119,4 +119,8 @@ public class ClueDto implements Serializable { @ApiModelProperty(value = "线索标识") private String tag; + @ApiModelProperty(value = "表单线索录音地址") + private String audioUrl; + @ApiModelProperty(value = "成交金额") + private Double turnoverAmount; } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/DynamicTaskDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/DynamicTaskDto.java index db78a4a9..539d1eb0 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/DynamicTaskDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/DynamicTaskDto.java @@ -15,13 +15,16 @@ public class DynamicTaskDto { /** * 动态任务id */ - @NotNull private Long taskId; /** * 用户id */ @NotNull private Long userId; + /** + * 创建人 + */ + private Long whichUserId; /** * 上传类型 */ diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java index 22e973ad..5480a4b8 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/PublicCluePoolDto.java @@ -44,4 +44,6 @@ public class PublicCluePoolDto implements Serializable { private Date newestCallTime; @ApiModelProperty(value = "冷静期状态 0-否 1-true") private Integer status; + @ApiModelProperty(value = "表单录音") + private String audioUrl; } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java new file mode 100644 index 00000000..b2620b1f --- /dev/null +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/ReportStageAndTurnoverDto.java @@ -0,0 +1,24 @@ +package com.baiye.model.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author jt + */ +@Data +public class ReportStageAndTurnoverDto { + /** + * 开始时间 + */ + private String startTime; + /** + * 结束时间 + */ + private String endTime; + /** + * 人员id + */ + private List memberIds; +} diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/TaskQueryCriteria.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/TaskQueryCriteria.java index 24598cca..92c8dd12 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/TaskQueryCriteria.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/TaskQueryCriteria.java @@ -16,7 +16,7 @@ public class TaskQueryCriteria { @Query private Long id; - @ApiModelProperty(value = "任务类型: 0:正常任务 1:动态任务") + @ApiModelProperty(value = "任务类型: 0:正常任务 1:动态任务 2:动态表单任务") @Query private Integer taskType; @@ -28,11 +28,14 @@ public class TaskQueryCriteria { private Long createBy; @Query - private Long taskName; + private String taskName; @Query(blurry = "taskName") private String blurry; + @Query + private Integer isForm; + @Query(type = Query.Type.BETWEEN) private List createTime; } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java b/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java index 03982575..8e6a1ee1 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/dto/UserDto.java @@ -86,4 +86,6 @@ public class UserDto extends BaseDTO implements Serializable { private Integer onlineStatus; private Boolean addWeChatFlag; + + private Long whichUserId; } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java index 0c0f8edd..2fa0e8ba 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseClueMiddle.java @@ -28,7 +28,7 @@ public class BaseClueMiddle implements Serializable { private static final long serialVersionUID = -5485885423091953188L; - @ApiModelProperty(value = "线索阶段:0:新线索 1:待沟通 2:有意向 3:已加微信 4:无意向") + @ApiModelProperty(value = "线索阶段:0:新线索 1:待沟通 2:有意向 3:已加微信 4:无意向 5:邀约中 6:到场7:已成交") @Column(name = "clue_stage") private Integer clueStage; @ApiModelProperty(value = "线索阶段修改时间") @@ -50,7 +50,7 @@ public class BaseClueMiddle implements Serializable { @Column(name = "task_id") private Long taskId; - @ApiModelProperty(value = "组员跟进状态 0:无状态 1:进行中 2:已完成") + @ApiModelProperty(value = "组员跟进状态 0:无状态 1:未跟进 2:跟进中 3:已完成") @Column(name = "member_status") private Integer memberStatus; @@ -78,4 +78,8 @@ public class BaseClueMiddle implements Serializable { @ApiModelProperty(value = "是否移入到公海") @Column(name = "public_pool_status") private Integer publicPoolStatus; + + @ApiModelProperty(value = "成交金额") + @Column(name = "turnover_amount") + private Double turnoverAmount; } diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTask.java b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTask.java index 032e9310..aeb014e7 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTask.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTask.java @@ -75,4 +75,8 @@ public class BaseTask implements Serializable { @ApiModelProperty(value = "备注") @Column(name = "remark") private String remark; + + @ApiModelProperty(value = "特殊任务 1-动态表单任务 2-员工个人上传任务") + @Column(name = "is_form") + private Integer isForm; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java index 3e065637..b14d4989 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/QueryReportServiceImpl.java @@ -877,4 +877,12 @@ public class QueryReportServiceImpl implements QueryReportService { public User getMember(Long id) { return userRepository.findUserById(id); } + + public static void main(String[] args) { + Long createTime = 1661762157L; + DateTime date = DateUtil.date(createTime); + int compare = DateUtil.compare( DateUtil.date(),date); + System.out.println(compare>30); + + } } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/TaskController.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/TaskController.java index fbc49557..973c468a 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/TaskController.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/TaskController.java @@ -33,26 +33,26 @@ public class TaskController { @ApiOperation("新建任务") @PostMapping("/saveTask") - public ResponseEntity saveTask(@RequestBody Task task){ - return new ResponseEntity<>(taskService.saveTask(task),HttpStatus.CREATED); + public ResponseEntity saveTask(@RequestBody Task task) { + return new ResponseEntity<>(taskService.saveTask(task), HttpStatus.CREATED); } @ApiOperation("查询任务(分页)") @GetMapping("/queryAll") - public ResponseEntity queryAll(TaskQueryCriteria taskQueryCriteria, Pageable pageable){ - return new ResponseEntity<>(taskService.queryAll(taskQueryCriteria,pageable),HttpStatus.OK); + public ResponseEntity queryAll(TaskQueryCriteria taskQueryCriteria, Pageable pageable) { + return new ResponseEntity<>(taskService.queryAll(taskQueryCriteria, pageable), HttpStatus.OK); } @ApiOperation("查询任务") @PostMapping("/query") - public ResponseEntity query(@RequestBody TaskQueryCriteria taskQueryCriteria){ - return new ResponseEntity<>(taskService.query(taskQueryCriteria),HttpStatus.OK); + public ResponseEntity query(@RequestBody TaskQueryCriteria taskQueryCriteria) { + return new ResponseEntity<>(taskService.query(taskQueryCriteria), HttpStatus.OK); } @ApiOperation("查询任务详情") @GetMapping("/queryDetails") - public ResponseEntity queryDetails(@RequestParam("taskId") Long taskId){ - return new ResponseEntity<>(taskService.queryDetails(taskId),HttpStatus.OK); + public ResponseEntity queryDetails(@RequestParam("taskId") Long taskId) { + return new ResponseEntity<>(taskService.queryDetails(taskId), HttpStatus.OK); } @ApiOperation("修改任务信息") @@ -64,14 +64,14 @@ public class TaskController { @ApiOperation("未分配前删除任务") @GetMapping("/del") - public ResponseEntity delTask(@RequestParam("taskId") Long taskId){ + public ResponseEntity delTask(@RequestParam("taskId") Long taskId) { taskService.delTask(taskId); return new ResponseEntity<>(HttpStatus.OK); } @ApiOperation("删除动态任务") @GetMapping("/delDynamic") - public ResponseEntity delDynamicTask(@RequestParam("taskId") Long taskId){ + public ResponseEntity delDynamicTask(@RequestParam("taskId") Long taskId) { taskService.delDynamicTask(taskId); return new ResponseEntity<>(HttpStatus.OK); } @@ -85,8 +85,18 @@ public class TaskController { map.put("type", "source_error"); JSONObject jsonData = new JSONObject(); - jsonData.putOpt("data",map); + jsonData.putOpt("data", map); String message = JSONUtil.toJsonStr(jsonData); webSocketServer.sendMessage(message, userId); } + + /** + * @param taskId + * @return + */ + @GetMapping("/form/encryption") + public CommonResponse updateTaskEncryption(Long taskId) { + taskService.updateTaskEncryption(taskId); + return CommonResponse.createBySuccessMessage("操作成功"); + } } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/TaskService.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/TaskService.java index 6ebc312e..b7391df9 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/TaskService.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/TaskService.java @@ -65,4 +65,6 @@ public interface TaskService { * @param taskId */ void delDynamicTask(Long taskId); + + void updateTaskEncryption(Long taskId); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/TaskDto.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/TaskDto.java index 6f40400a..4ca28d52 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/TaskDto.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/TaskDto.java @@ -46,4 +46,5 @@ public class TaskDto implements Serializable { private List baseLabel; private String remark; + private Integer isForm; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/TaskServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/TaskServiceImpl.java index b4ee1a9b..ba45fae7 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/TaskServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/TaskServiceImpl.java @@ -62,23 +62,23 @@ public class TaskServiceImpl implements TaskService { @Transactional(rollbackOn = Exception.class) public ResponseEntity saveTask(Task task) { Long labelOrganizeId = task.getLabelOrganizeId(); - if (task.getId() == null){ + if (task.getId() == null) { Long taskId = IdUtil.getSnowflake(workerId, datacenterId).nextId(); task.setId(taskId); } if (CollUtil.isNotEmpty(task.getOrganizeList())) { task.setOrganizeList(task.getOrganizeList()); } - if (task.getTaskType() == null){ + if (task.getTaskType() == null) { throw new BadRequestException("任务状态不能为空"); } //设置默认值 task.setIsDistribution(DefaultNumberConstants.ZERO_NUMBER); - if (task.getCreateBy() == null){ + if (task.getCreateBy() == null) { task.setCreateBy(SecurityUtils.getCurrentUserId()); } List labelList = labelService.findLabelList(labelOrganizeId); - if (CollUtil.isNotEmpty(labelList)){ + if (CollUtil.isNotEmpty(labelList)) { task.setBaseLabel(labelList); } task.setLabelOrganizeId(null); @@ -130,19 +130,19 @@ public class TaskServiceImpl implements TaskService { @Override @Transactional(rollbackOn = Exception.class) public void updateTask(Task task) { - if (task.getId() != null){ + if (task.getId() != null) { Task updateTask = taskRepository.findById(task.getId()).orElseGet(Task::new); - if (task.getRemark() != null){ + if (task.getRemark() != null) { updateTask.setRemark(task.getRemark()); } - if (task.getTotalNumber() != null){ + if (task.getTotalNumber() != null) { updateTask.setTotalNumber(task.getTotalNumber()); } - if (task.getIsDistribution() != null){ + if (task.getIsDistribution() != null) { updateTask.setIsDistribution(task.getIsDistribution()); } taskRepository.save(updateTask); - }else { + } else { throw new BadRequestException("任务id不能为空"); } } @@ -156,7 +156,7 @@ public class TaskServiceImpl implements TaskService { @Transactional(rollbackOn = Exception.class) public void delTask(Long taskId) { List taskOrganizeList = taskOrganizeRepository.findByTaskId(taskId); - if (CollUtil.isNotEmpty(taskOrganizeList)){ + if (CollUtil.isNotEmpty(taskOrganizeList)) { throw new BadRequestException("任务已分配,无法删除"); } taskRepository.deleteById(taskId); @@ -168,13 +168,24 @@ public class TaskServiceImpl implements TaskService { @Override public void delDynamicTask(Long taskId) { Task task = taskRepository.findById(taskId).orElseGet(Task::new); - if (task.getTotalNumber() == null || task.getTotalNumber() == 0){ + if (task.getTotalNumber() == null || task.getTotalNumber() == 0) { taskRepository.deleteById(taskId); - }else{ + } else { throw new BadRequestException("任务已导入资源,无法删除"); } } + @Override + public void updateTaskEncryption(Long taskId) { + Task task = taskRepository.findById(taskId).orElseGet(Task::new); + if (task.getIsDistribution() == 0) { + task.setIsEncryption(1); + } else { + task.setIsEncryption(0); + } + taskRepository.save(task); + } + /** * 小组id查询 组长用户信息 */ @@ -194,7 +205,7 @@ public class TaskServiceImpl implements TaskService { } } taskDto.setTaskOrganizeList(taskOrganizeList); - }else { + } else { taskDto.setTaskOrganizeList(new ArrayList<>()); } } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java index a029b16f..2edb1eb9 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java @@ -21,6 +21,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.baiye.config.properties.FileProperties; @@ -34,10 +35,7 @@ import com.baiye.model.dto.UserFavorOfExcel; import com.baiye.model.enums.ResponseCode; import com.baiye.modules.security.service.OnlineUserService; import com.baiye.modules.system.domain.*; -import com.baiye.modules.system.repository.OrganizeRepository; -import com.baiye.modules.system.repository.OrganizeUserRepository; -import com.baiye.modules.system.repository.RoleRepository; -import com.baiye.modules.system.repository.UserRepository; +import com.baiye.modules.system.repository.*; import com.baiye.modules.system.service.*; import com.baiye.modules.system.service.dto.*; import com.baiye.modules.system.service.mapstruct.UserMapper; @@ -89,7 +87,7 @@ public class UserServiceImpl implements UserService { private final PayComboLogService payComboLogService; private final PayTemplateUserService payTemplateUserService; private final OrganizeUserRepository organizeUserRepository; - + private final TaskRepository taskRepository; @Override @Transactional(rollbackFor = Exception.class) @@ -190,6 +188,7 @@ public class UserServiceImpl implements UserService { companyDto.setTemplateId(userDTO.getTemplateId()); companyDto.setStatus(DefaultNumberConstants.ZERO_NUMBER); companyId = companyService.createCompany(companyDto).getId(); + } companyId = companyId != null ? companyId : SecurityUtils.getCompanyId(); @@ -202,6 +201,12 @@ public class UserServiceImpl implements UserService { user.setWhichUserId(userId); user.setIsReview(Boolean.FALSE); User userCreateResult = create(user); + + //todo 如果是管理员 则创建任务 + if (flag) { + createTask(userCreateResult.getId(), userCreateResult.getUsername(), DefaultNumberConstants.ONE_NUMBER); + createTask(userCreateResult.getId(), userCreateResult.getUsername() + "-员工上传", DefaultNumberConstants.TWO_NUMBER); + } MultipartFile file = userDTO.getFile(); if (file != null && !file.isEmpty()) { if (userId != DefaultNumberConstants.ONE_NUMBER) { @@ -215,6 +220,26 @@ public class UserServiceImpl implements UserService { } } + /** + * 在创建用户时 创建一个表单任动态务 + * + * @param username + */ + private void createTask(Long id, String username, Integer isForm) { + Long taskId = IdUtil.getSnowflake(9, 9).nextId(); + Task task = new Task(); + task.setId(taskId); + task.setTaskName(username); + task.setIsEncryption(DefaultNumberConstants.ONE_NUMBER); + //设置默认值 + task.setIsDistribution(DefaultNumberConstants.ZERO_NUMBER); + task.setTaskType(DefaultNumberConstants.ONE_NUMBER); + task.setIsForm(isForm); + task.setCreateBy(id); + task.setLabelOrganizeId(null); + taskRepository.save(task); + } + @Override public void updateUserExpirationTime(List orderDtoList) { if (CollUtil.isNotEmpty(orderDtoList)) { @@ -344,12 +369,15 @@ public class UserServiceImpl implements UserService { if (userRepository.findByPhone(resources.getPhone()) != null) { throw new EntityExistException(User.class, "phone", resources.getPhone()); } - return userRepository.save(resources); + User save = userRepository.save(resources); + + return save; } @Override @Transactional(rollbackFor = Exception.class) + public void update(User resources) throws Exception { User user = userRepository.findById(resources.getId()).orElseGet(User::new); ValidationUtil.isNull(user.getId(), "User", "id", resources.getId()); diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java index 90cce5b5..67f3ebec 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java @@ -212,30 +212,28 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { telephoneCallReqDTO.setTelB(body.getNid()); String reqId = rollCallReq.startReq(telephoneCallReqDTO); log.info("=============================reqId {}", reqId); - if (StrUtil.isNotBlank(reqId)) { - if (StrUtil.isNotBlank(reqId)) { - AllCallInfo allCallInfo = new AllCallInfo(); - allCallInfo.setSessionId(requestId); - allCallInfo.setRequestId(requestId); - allCallInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData())); - allCallInfo.setMemberId(telephoneCallReqDTO.getMemberId()); - allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); - allCallInfo.setType(DefaultNumberConstants.TWO_NUMBER); - allCallInfo.setRecordFlag(DefaultNumberConstants.ZERO_NUMBER); +// if (StrUtil.isNotBlank(reqId)) { + AllCallInfo allCallInfo = new AllCallInfo(); + allCallInfo.setSessionId(requestId); + allCallInfo.setRequestId(requestId); + allCallInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData())); + allCallInfo.setMemberId(telephoneCallReqDTO.getMemberId()); + allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); + allCallInfo.setType(DefaultNumberConstants.TWO_NUMBER); + allCallInfo.setRecordFlag(DefaultNumberConstants.ZERO_NUMBER); - CallClueInfo clueInfo = new CallClueInfo(); - clueInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData())); - clueInfo.setTeamId(telephoneCallReqDTO.getTeamId()); - clueInfo.setMemberId(telephoneCallReqDTO.getMemberId()); - clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); - clueInfo.setTaskId(telephoneCallReqDTO.getTaskId()); - clueInfo.setCompanyId(companyId); - allCallInfoRepository.save(allCallInfo); - callClueRepository.save(clueInfo); - } else { - return CommonResponse.createByError(); - } - } + CallClueInfo clueInfo = new CallClueInfo(); + clueInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData())); + clueInfo.setTeamId(telephoneCallReqDTO.getTeamId()); + clueInfo.setMemberId(telephoneCallReqDTO.getMemberId()); + clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); + clueInfo.setTaskId(telephoneCallReqDTO.getTaskId()); + clueInfo.setCompanyId(companyId); + allCallInfoRepository.save(allCallInfo); + callClueRepository.save(clueInfo); +// } else { +// return CommonResponse.createByError(); +// } return CommonResponse.createBySuccess(requestId); } @@ -251,7 +249,7 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { String otherLeg = rollCallBackDTO.getOtherLeg(); AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(otherLeg); - +// int status = DefaultNumberConstants.ONE_NUMBER; if (ObjectUtil.isNotEmpty(allCallInfo)) { //相同说明是分机号的回调 if (sessionId.equals(otherLeg) && StrUtil.isNotBlank(rollCallBackDTO.getRecord_file_url())) { diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/constant/SecretConstant.java b/services/ad-platform-source/src/main/java/com/baiye/module/constant/SecretConstant.java new file mode 100644 index 00000000..9c0aba5f --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/constant/SecretConstant.java @@ -0,0 +1,32 @@ +package com.baiye.module.constant; + +/** + * 有关加解密的常量类 + */ +public class SecretConstant { + + /** + * yuyou address + */ + public static final String SECRET_DECRYPT_YY_URL = "https://bd.hzdaba.cn:8085/v3/Accounts/yuyou_bd/BigData/DecryptTel"; + + /** + * yuyou sign + */ + public static final String SECRET_DECRYPT_YY_SIG = "7f49e3f9c17c0f3c8fca84168161ed37"; + + /** + * yuyou id + */ + public static final String SECRET_DECRYPT_YY_ID = "yuyou_bd"; + + /** + * 开发者账户授权令牌 + */ + public static final String SECRET_DECRYPT_YY_TOKEN ="7f49e3f9c17c0f3c8fca84168161ed37 "; + + /** + * 时间戳格式 + */ + public static final String SECRET_DECRYPT_TIME_FORMATE = "yyyyMMddHHmmss"; +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java index d67e1663..aa3b95ba 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java @@ -1,5 +1,9 @@ package com.baiye.module.controller; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; import com.baiye.http.CommonResponse; import com.baiye.http.ResponseCode; import com.baiye.model.dto.*; @@ -176,12 +180,21 @@ public class ClueController { } /** + * 表单上传动态任务 + * * @param dynamicTaskDto * @return */ @PostMapping("/dynamic/task") + @ApiOperation("表单上传动态任务") public CommonResponse insertDynamicTask(@Validated @RequestBody DynamicTaskDto dynamicTaskDto) { clueService.insertDynamicTask(dynamicTaskDto); return CommonResponse.createBySuccess(); } + + @PostMapping("/report/stage") + @ApiOperation("统计线索的跟进情况和成交金额") + public CommonResponse reportClueStageAndTurnover(@RequestBody ReportStageAndTurnoverDto reportStageAndTurnoverDto) { + return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto); + } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/FromTaskApi.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/FromTaskApi.java new file mode 100644 index 00000000..2f1a6cc0 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/FromTaskApi.java @@ -0,0 +1,33 @@ +package com.baiye.module.controller; + +import com.baiye.module.service.FormSourceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * @author jt + */ +@RequiredArgsConstructor +@RestController +@Api(tags = "资源管理") +@RequestMapping("/open/v1") +@Slf4j +public class FromTaskApi { + + private final FormSourceService formSourceService; + + @ApiOperation("接受表单任务资源") + @PostMapping("/form/add") + public Map acceptFormSource(@RequestBody String json) { + log.info("json======{}", json); + return formSourceService.acceptFormSource(json); + } +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java index c4de9ce4..408daa6b 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/PublicCluePoolController.java @@ -35,8 +35,10 @@ public class PublicCluePoolController { @ApiOperation("手动回收线索到公海") @GetMapping("/recycle") public ResponseEntity recyclePublicPool(@RequestParam(value = "clueId") Long clueId, - @RequestParam(value = "companyId") Long companyId) { - publicCluePoolService.recyclePublicPool(clueId, companyId); + @RequestParam(value = "companyId") Long companyId, + @RequestParam(value = "memberId") Long memberId + ) { + publicCluePoolService.recyclePublicPool(clueId, companyId,memberId); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java index e52acba8..e7b10180 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java @@ -56,9 +56,9 @@ public class ClueJpa { public List getClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) { StringBuilder sql = new StringBuilder(); sql.append("select c.id as id,c.name as name,c.nid as nid,c.wx as wx,c.origin as origin,c.collect_time as collectTime,c.address as address,c.record_id as recordId," + - "c.create_time as createTime,c.amount as amount,c.platform as platform,c.tag as tag,cm.remark as remark,cm.member_status as memberStatus,cm.organize_id as organizeId,cm.member_id as memberId," + + "c.create_time as createTime,c.amount as amount,c.platform as platform,c.tag as tag,c.audio_url as audioUrl, cm.remark as remark,cm.member_status as memberStatus,cm.organize_id as organizeId,cm.member_id as memberId," + "cm.optimistic_version as optimisticVersion,cm.source_label as sourceLabel,cm.task_id as taskId,cm.clue_stage as clueStage,cm.clue_call_status as clueCallStatus," + - "cm.newest_call_time as newestCallTime " + + "cm.newest_call_time as newestCallTime ,cm.turnover_amount as turnoverAmount " + "from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 "); List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, pageable); return getTradeInfo(confirmReceipt); @@ -179,6 +179,7 @@ public class ClueJpa { clueDto.setMemberStatus((Integer) row.get("memberStatus")); clueDto.setName((String) row.get("name")); clueDto.setCreateTime((Date) row.get("createTime")); + clueDto.setAudioUrl((String)row.get("audioUrl")); BigInteger taskId = (BigInteger) row.get("taskId"); clueDto.setTaskId(taskId.longValue()); String phone = (String) row.get("nid"); @@ -228,6 +229,7 @@ public class ClueJpa { clueDto.setAmount((String) row.get("amount")); clueDto.setPlatform((String) row.get("platform")); clueDtoList.add(clueDto); + clueDto.setTurnoverAmount((Double)row.get("turnoverAmount")); } return clueDtoList; } @@ -279,8 +281,8 @@ public class ClueJpa { Integer clueStage = clueQueryCriteria.getClueStage(); List userIdList = clueQueryCriteria.getUserIdList(); StringBuilder sql = new StringBuilder(); - sql.append("SELECT tc.id as id,tc.nid as nid,tc.create_time as createTime,tc.name as name,tc.origin as origin,tcm.task_id as taskId,tcm.member_status as memberStatus," + - "tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel " + + sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tcm.task_id as taskId,tcm.member_status as memberStatus," + + "tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " + "FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 "); if (CollUtil.isNotEmpty(taskIds)) { sql.append("AND tcm.task_id IN (:taskId) "); @@ -361,12 +363,14 @@ public class ClueJpa { clue.setOrigin((int) row.get("origin")); clue.setClueStage((Integer) row.get("clueStage")); clue.setClueCallStatus((Integer) row.get("clueCallStatus")); + clue.setAudioUrl((String)(row.get("audioUrl"))); BigInteger memberId = (BigInteger) row.get("memberId"); if (memberId != null) { clue.setMemberId(memberId.longValue()); } JSONArray sourceLabel = JSONUtil.parseArray(row.get("sourceLabel")); clue.setSourceLabel(sourceLabel); + clue.setTurnoverAmount((Double)row.get("turnoverAmount")); } arrayList.add(clue); } @@ -449,7 +453,7 @@ public class ClueJpa { */ public List getCluePoolList(PublicCluePoolQueryCriteria publicCluePoolQueryCriteria, Pageable pageable) { StringBuilder sql = new StringBuilder(); - sql.append("select p.clue_id as clueId,c.name as clueName,cm.clue_stage as clueStage ,cm.clue_call_status as clueCallStatus ," + + sql.append("select p.clue_id as clueId,c.name as clueName,c.audio_url as audioUrl ,cm.clue_stage as clueStage ,cm.clue_call_status as clueCallStatus ," + "p.member_id as memberId ,p.status as status, p.member_name as memberName ,cm.member_status as memberStatus ,cm.source_label as sourceLabel ," + "p.create_time as createTime ,cm.newest_call_time as newestCallTime from tb_public_clue_pool as p left join tb_clue_middle as cm on p.clue_id=cm.clue_id " + "left join tb_clue as c on c.id =p.clue_id where 1=1"); @@ -519,6 +523,7 @@ public class ClueJpa { clueDto.setStatus((Integer) row.get("status")); clueDto.setCreateTime((Date) row.get("createTime")); clueDto.setNewestCallTime((Date) row.get("newestCallTime")); + clueDto.setAudioUrl((String)row.get("audioUrl")); clueDtoList.add(clueDto); } return clueDtoList; diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java index 009d67cf..772c68ef 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java @@ -175,5 +175,9 @@ public interface ClueMiddleRepository extends JpaRepository, J "where m.id=?1 and cm.create_time < ?2 and cm.clue_stage not in ?3 and cm.public_pool_status =0 and cm.member_id is not null", nativeQuery = true) List queryClueMiddleByClueStage(Long companyId, String time, List clueStage); + @Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2", nativeQuery = true) + List queryAllByTime(String beginTime, String endTime); + @Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.member_id in ?3", nativeQuery = true) + List queryAllByTimeAndMemberIds(String beginTime, String endTime,List memberIds); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java index 94f33502..65d1f7d6 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/Clue.java @@ -58,4 +58,8 @@ public class Clue extends BaseClue { @Transient private Object sourceLabel; + @Transient + private Double turnoverAmount; + @ApiModelProperty(value = "表单录音") + private String audioUrl; } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/entity/ConductRecord.java b/services/ad-platform-source/src/main/java/com/baiye/module/entity/ConductRecord.java index ef5c1dc5..dbe83f3e 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/entity/ConductRecord.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/entity/ConductRecord.java @@ -55,4 +55,7 @@ public class ConductRecord implements Serializable { @Column(name = "create_time") @CreationTimestamp private Date createTime; + + @ApiModelProperty(value = "操作人id(对公海操作来说,就是之前操作的人)") + private Long operator; } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/listener/TaskZdyExcelListener.java b/services/ad-platform-source/src/main/java/com/baiye/module/listener/TaskZdyExcelListener.java index acaf926b..b829ac1d 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/listener/TaskZdyExcelListener.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/listener/TaskZdyExcelListener.java @@ -8,6 +8,7 @@ import com.baiye.module.entity.vo.BaseExcelVo; import com.baiye.module.entity.vo.TaskZdyVo; import com.baiye.module.entity.vo.ZdyVo; import com.baiye.module.service.ClueService; +import com.baiye.util.DecryptPnoUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; @@ -24,6 +25,7 @@ public class TaskZdyExcelListener extends AnalysisEventListener { * 监听类不被spring管理,选择手动注入service */ private static ClueService clueService; + public TaskZdyExcelListener(ClueService clueService, BaseExcelVo baseExcelVo) { this.clueService = clueService; this.baseExcelVo = baseExcelVo; @@ -31,13 +33,14 @@ public class TaskZdyExcelListener extends AnalysisEventListener { /** * 每条数据都会回调此函数,1000条处理一次 + * * @param taskZdyVo * @param analysisContext */ @Override public void invoke(TaskZdyVo taskZdyVo, AnalysisContext analysisContext) { rows.add(taskZdyVo); - if (rows.size() >= FileConstant.ONE_THOUSAND_NUMBER){ + if (rows.size() >= FileConstant.ONE_THOUSAND_NUMBER) { saveData(); rows.clear(); } @@ -45,6 +48,7 @@ public class TaskZdyExcelListener extends AnalysisEventListener { /** * 读取文件完成回调函数,清空集合剩余数据 + * * @param analysisContext */ @Override @@ -56,12 +60,17 @@ public class TaskZdyExcelListener extends AnalysisEventListener { /** * 插入数据库 */ - private void saveData(){ + private void saveData() { List clues = new ArrayList<>(); for (TaskZdyVo row : rows) { if (StringUtils.isNotBlank(row.getNid())) { Clue clue = new Clue(); + String nid = row.getNid(); + if (nid.length() == 24) { + nid = DecryptPnoUtil.decryptPno(nid); + } BeanUtils.copyProperties(row, clue); + clue.setNid(nid); clue.setOrigin(baseExcelVo.getOrigin()); clue.setRecordId(baseExcelVo.getClueRecordId()); clue.setCreateBy(baseExcelVo.getUserId()); @@ -69,7 +78,7 @@ public class TaskZdyExcelListener extends AnalysisEventListener { } } if (clues.size() > 0) { - clueService.saveClue(clues,baseExcelVo.getTaskId()); + clueService.saveClue(clues, baseExcelVo.getTaskId()); } } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java index 1c62e63a..f6efe75e 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java @@ -1,9 +1,7 @@ package com.baiye.module.service; -import com.baiye.model.dto.ClueDto; -import com.baiye.model.dto.ClueQueryCriteria; -import com.baiye.model.dto.DistributeResponseDTO; -import com.baiye.model.dto.DynamicTaskDto; +import com.baiye.http.CommonResponse; +import com.baiye.model.dto.*; import com.baiye.model.vo.ResSourceLabel; import com.baiye.module.entity.Clue; import com.baiye.module.entity.ClueMiddle; @@ -20,6 +18,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +/** + * @author jt + */ public interface ClueService { /** @@ -212,4 +213,12 @@ public interface ClueService { * @param dynamicTaskDto */ void insertDynamicTask(DynamicTaskDto dynamicTaskDto); + + /** + * 统计线索根进情况和成交金额 + * + * @param reportStageAndTurnoverDto + * @return + */ + CommonResponse reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/FormSourceService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/FormSourceService.java new file mode 100644 index 00000000..dc4f78ed --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/FormSourceService.java @@ -0,0 +1,10 @@ +package com.baiye.module.service; + +import java.util.Map; + +/** + * @author jt + */ +public interface FormSourceService { + Map acceptFormSource(String json); +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java index f55f5a77..6426ff24 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/PublicCluePoolService.java @@ -31,7 +31,7 @@ public interface PublicCluePoolService { * @param clueId * @param companyId */ - void recyclePublicPool(Long clueId, Long companyId); + void recyclePublicPool(Long clueId, Long companyId,Long memberId); void receiveClue(Long clueId, Long memberId); diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/dto/SecretResponseBean.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/dto/SecretResponseBean.java new file mode 100644 index 00000000..c314e5a6 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/dto/SecretResponseBean.java @@ -0,0 +1,43 @@ +package com.baiye.module.service.dto; + +public class SecretResponseBean { + + private String result; + + private String reason; + + private String tels; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getTels() { + return tels; + } + + public void setTels(String tels) { + this.tels = tels; + } + + @Override + public String toString() { + return "SecretResponseBean{" + + "result='" + result + '\'' + + ", reason='" + reason + '\'' + + ", tels='" + tels + '\'' + + '}'; + } +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java index 0ad4c54d..48cd47f4 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java @@ -1,6 +1,7 @@ package com.baiye.module.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -10,6 +11,7 @@ import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; import com.baiye.exception.BadRequestException; import com.baiye.feign.*; +import com.baiye.http.CommonResponse; import com.baiye.model.dto.*; import com.baiye.model.entity.BaseClue; import com.baiye.model.vo.ResSourceLabel; @@ -56,8 +58,6 @@ public class ClueServiceImpl implements ClueService { private final ConductRecordRepository conductRecordRepository; private final WeChatAddFriendClient weChatAddFriendClient; - - private static SimpleDateFormat timeOne = new SimpleDateFormat("yyyyMMddHHmmssSSS"); @Override @@ -171,7 +171,7 @@ public class ClueServiceImpl implements ClueService { String nid = clueQueryCriteria.getNid(); if (clueQueryCriteria.getMemberId() != null) { List clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable); - if (StringUtils.isNotBlank(nid)){ //手机号搜索 + if (StringUtils.isNotBlank(nid)) { //手机号搜索 clueDtoList = clueDtoList.stream().filter(ct -> ct.getNid().contains(nid)).collect(Collectors.toList()); } Long count = clueJpa.getCount(clueQueryCriteria); @@ -304,7 +304,7 @@ public class ClueServiceImpl implements ClueService { if (clueMiddle.getClueStage() != null) { clueMiddleOne.setClueStage(clueMiddle.getClueStage()); clueMiddleOne.setClueStageTime(DateUtil.date()); - if (clueMiddleOne.getMemberStatus() != DefaultNumberConstants.THREE_NUMBER){ + if (clueMiddleOne.getMemberStatus() != DefaultNumberConstants.THREE_NUMBER) { clueMiddleOne.setMemberStatus(DefaultNumberConstants.TWO_NUMBER); //线索跟进状态修改 } } @@ -314,6 +314,9 @@ public class ClueServiceImpl implements ClueService { if (clueMiddle.getNewestCallTime() != null) { clueMiddleOne.setNewestCallTime(clueMiddle.getNewestCallTime()); } + if (clueMiddle.getTurnoverAmount() != null) { + clueMiddleOne.setTurnoverAmount(clueMiddle.getTurnoverAmount()); + } clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1); clueMiddleRepository.save(clueMiddleOne); } @@ -526,21 +529,49 @@ public class ClueServiceImpl implements ClueService { @Override @Transactional(rollbackFor = Exception.class) public void insertDynamicTask(DynamicTaskDto dynamicTaskDto) { + + Long taskId = dynamicTaskDto.getTaskId(); + boolean flag = false; + if (taskId == null) { + if (dynamicTaskDto.getWhichUserId() == null) { + throw new BadRequestException("添加失败"); + } + TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria(); + taskQueryCriteria.setCreateBy(dynamicTaskDto.getWhichUserId()); + taskQueryCriteria.setIsForm(2); + Object body = taskClient.query(taskQueryCriteria).getBody(); + JSONArray taskList = JSONUtil.parseArray(body); + if (CollUtil.isNotEmpty(taskList) && taskList.size() == 1) { + taskId = taskList.getJSONObject(0).getLong("id"); + flag = true; + } else { + throw new BadRequestException("添加失败"); + } + } Clue clue = new Clue(); + String nid = dynamicTaskDto.getNid(); + //号码解密 + if (nid.length() == 24) { + nid = DecryptPnoUtil.decryptPno(nid); + } BeanUtils.copyProperties(dynamicTaskDto, clue); clue.setOrigin(5); + clue.setNid(nid); clue.setCreateBy(dynamicTaskDto.getUserId()); Clue save = clueRepository.save(clue); ClueMiddle clueMiddle = new ClueMiddle(); - Long taskId = dynamicTaskDto.getTaskId(); - + clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER); + if (flag) { + clueMiddle.setMemberId(dynamicTaskDto.getUserId()); + clueMiddle.setMemberStatus(DefaultNumberConstants.ONE_NUMBER); + } clueMiddle.setClueId(save.getId()); clueMiddle.setTaskId(taskId); - clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER); clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER); clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER); clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER); + clueMiddleRepository.save(clueMiddle); //动态任务 if (dynamicTaskDto.getType() == FileConstant.FIVE_NUMBER) { @@ -553,6 +584,125 @@ public class ClueServiceImpl implements ClueService { } } + @Override + public CommonResponse reportClueStageAndTurnover(ReportStageAndTurnoverDto reportDto) { + if (ObjectUtil.isNull(reportDto) || CollUtil.isEmpty(reportDto.getMemberIds())) { + return CommonResponse.createByErrorMessage("查询人员不能为空"); + } + String startTime = reportDto.getStartTime(); + String endTime = reportDto.getEndTime(); + if (StrUtil.isBlank(reportDto.getStartTime()) || StrUtil.isBlank(reportDto.getEndTime())) { + startTime = DateUtil.beginOfDay(DateUtil.date()).toString(); + endTime = DateUtil.date().toString(); + } + List clueMiddles = clueMiddleRepository.queryAllByTimeAndMemberIds(startTime, endTime, reportDto.getMemberIds()); + Set userIds = clueMiddles.stream().map(ClueMiddle::getMemberId).collect(Collectors.toSet()); + Map userNameList = userClient.findById(userIds); + //根据人员id分组 + HashMap> map = new HashMap<>(clueMiddles.stream().collect(Collectors.groupingBy(ClueMiddle::getMemberId, Collectors.toList()))); + List> list = new ArrayList<>(); + for (Long key : map.keySet()) { + List clueMiddles1 = map.get(key); + HashMap reportMap = getReportMap(clueMiddles1); + reportMap.put("memberId", key); + String name = getMemberName(userNameList.get(key)); + reportMap.put("memberName", name); + //处理金额 + List> timeMap = getTimeMap(startTime, endTime, clueMiddles1); + reportMap.put("turnoverAmount", timeMap); + list.add(reportMap); + } + + return CommonResponse.createBySuccess(list); + } + + private String getMemberName(String userName) { + String[] split = userName.split(":"); + if (split.length > 1) { + userName = split[split.length - 1]; + } + return userName; + } + + private HashMap getReportMap(List clueMiddles) { + int newClue = 0; + int communicat = 0; + int intention = 0; + int addWechat = 0; + int noIntention = 0; + int inviting = 0; + int interview = 0; + int deal = 0; + + HashMap hashMap = new HashMap<>(); + for (ClueMiddle clueMiddle : clueMiddles) { + int clueStage = clueMiddle.getClueStage(); + switch (clueStage) { + case 0: + newClue += 1; + break; + case 1: + communicat += 1; + break; + case 2: + intention += 1; + break; + case 3: + addWechat += 1; + break; + case 4: + noIntention += 1; + break; + case 5: + inviting += 1; + break; + case 6: + interview += 1; + break; + case 7: + deal += 1; + break; + default: + break; + } + + } + hashMap.put("newClue", newClue); + hashMap.put("communicat", communicat); + hashMap.put("intention", intention); + hashMap.put("addWechat", addWechat); + hashMap.put("noIntention", noIntention); + hashMap.put("inviting", inviting); + hashMap.put("interview", interview); + hashMap.put("deal", deal); + return hashMap; + } + + private List> getTimeMap(String startTime, String endTime, List clueMiddles) { + Date start = DateUtil.parseDate(startTime); + Date end = DateUtil.parseDate(endTime); + int between = (int) DateUtil.between(start, end, DateUnit.DAY); + List> list = new ArrayList<>(); + for (int i = 0; i <= between; i++) { + Date date = DateUtil.offsetDay(start, i); + double turnoverAmount = 0; + for (ClueMiddle clueMiddle : clueMiddles) { + Date clueStageTime = clueMiddle.getClueStageTime(); +// if (DateUtil.between(date, clueStageTime, DateUnit.DAY) == 0) { +// turnoverAmount += clueMiddle.getTurnoverAmount(); +// } + if (Objects.equals(DateUtil.formatDate(date), DateUtil.formatDate(clueStageTime))) { + turnoverAmount += clueMiddle.getTurnoverAmount(); + } + } + Map map = new HashMap<>(2); + map.put("time", DateUtil.formatDate(date)); + map.put("turnoverAmount", turnoverAmount); + list.add(map); + } + return list; + } + /** * 分页查询任务 * @@ -606,7 +756,7 @@ public class ClueServiceImpl implements ClueService { private String findTaskName(Long taskId) { String taskNameKey = "task:name:" + taskId; String str = (String) redisUtils.get(taskNameKey); - if (str == null || str.equals("null") || StringUtils.isBlank(str)) { + if (str == null || "null".equals(str) || StringUtils.isBlank(str)) { //设置空,取值判断空 ClueDto clueDto = new ClueDto(); clueDto.setIsRedis(1); diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/FormSourceServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/FormSourceServiceImpl.java new file mode 100644 index 00000000..6b23d5c5 --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/FormSourceServiceImpl.java @@ -0,0 +1,110 @@ +package com.baiye.module.service.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.file.FileReader; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.feign.TaskClient; +import com.baiye.model.dto.TaskQueryCriteria; +import com.baiye.module.dao.ClueMiddleRepository; +import com.baiye.module.dao.ClueRepository; +import com.baiye.module.entity.Clue; +import com.baiye.module.entity.ClueMiddle; +import com.baiye.module.entity.Task; +import com.baiye.module.service.FormSourceService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.Map; + +/** + * @author jt + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class FormSourceServiceImpl implements FormSourceService { + + private final TaskClient taskClient; + private final ClueRepository clueRepository; + private final ClueMiddleRepository clueMiddleRepository; + + + @Value("${storage.private-key}") + private String privatePath; + + @Override + @Transactional(rollbackFor = Exception.class) + public Map acceptFormSource(String json) { + + Map map = new HashMap<>(2); + + JSONObject object = JSONUtil.parseObj(json); + + String companyName = object.getStr("merchantName"); + String actName = Base64.decodeStr(object.getStr("actName")); + String calllog = object.getStr("calllog"); + String decry = decry(calllog); + JSONObject jsonObject = JSONUtil.parseObj(decry); + String audioUrl = jsonObject.getJSONObject("data").getStr("audioUrl"); + String mobile = jsonObject.getJSONObject("data").getStr("mobile"); +// String tels = DecryptPnoUtil.decryptPno(mobile); + + + TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria(); + taskQueryCriteria.setTaskType(DefaultNumberConstants.ONE_NUMBER); + taskQueryCriteria.setTaskName(companyName); + + Object body = taskClient.query(taskQueryCriteria).getBody(); + JSONArray taskList = JSONUtil.parseArray(body); + if (CollUtil.isEmpty(taskList) || taskList.size() != 1) { + log.error("未查询到该动态表单任务或查出多条 ======{}", companyName); + map.put("status", 500); + return map; + } + JSONObject taskJson = taskList.getJSONObject(0); + long taskId = Long.parseLong(String.valueOf(taskJson.get("id"))); + Clue clue = new Clue(); + clue.setName(actName); + clue.setNid(mobile); + clue.setAudioUrl(audioUrl); + clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER); + Long clueId = clueRepository.save(clue).getId(); + + ClueMiddle clueMiddle = new ClueMiddle(); + clueMiddle.setClueId(clueId); + clueMiddle.setTaskId(taskId); + clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER); + clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER); + clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER); + clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER); + clueMiddleRepository.save(clueMiddle); + + Integer taskNum = clueMiddleRepository.findTaskNum(taskId); + Task task = new Task(); + task.setId(taskId); + task.setTotalNumber(taskNum); + task.setIsDistribution(1); + taskClient.updateTask(task); + + map.put("status", 0); + map.put("msg", "推送成功"); + return map; + } + + private String decry(String data) { + FileReader fileReader = new FileReader(privatePath); +// FileReader fileReader = new FileReader("E:\\file\\source\\privatekey.txt"); + String privateKey = fileReader.readString(); + RSA rsa = new RSA(privateKey, null); + return rsa.decryptStr(data, KeyType.PrivateKey); + } +} diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java index 07189d97..3d57d9bf 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/PublicCluePoolServiceImpl.java @@ -53,7 +53,7 @@ public class PublicCluePoolServiceImpl implements PublicCluePoolService { @Override @Transactional(rollbackFor = Exception.class) - public void recyclePublicPool(Long clueId, Long companyId) { + public void recyclePublicPool(Long clueId, Long companyId, Long memberId) { ClueMiddle clueMiddle = clueMiddleRepository.findById(clueId).orElseGet(ClueMiddle::new); if (clueMiddle.getMemberId() == null) { throw new BadRequestException("未分配的线索不可以放入公海"); @@ -61,6 +61,10 @@ public class PublicCluePoolServiceImpl implements PublicCluePoolService { //加操作记录 Set memberIds = new HashSet<>(); memberIds.add(clueMiddle.getMemberId()); + if (!memberId.equals(clueMiddle.getMemberId())) { + memberIds.add(memberId); + } + memberIds.add(memberId); Map userNickNameMap = userClient.findById(memberIds); //放入公海 @@ -76,8 +80,9 @@ public class PublicCluePoolServiceImpl implements PublicCluePoolService { ConductRecord conductRecord = new ConductRecord(); conductRecord.setClueId(clueId); conductRecord.setRecordInfo("移入公海"); - conductRecord.setName(userNickNameMap.get(clueMiddle.getMemberId())); - conductRecord.setCreateBy(clueMiddle.getMemberId()); + conductRecord.setName(userNickNameMap.get(memberId)); + conductRecord.setCreateBy(memberId); + conductRecord.setOperator(clueMiddle.getMemberId()); conductRecordRepository.save(conductRecord); //重置线索的所属人 diff --git a/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java b/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java new file mode 100644 index 00000000..658dda6f --- /dev/null +++ b/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java @@ -0,0 +1,60 @@ +package com.baiye.util; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.baiye.exception.BadRequestException; +import com.baiye.module.constant.SecretConstant; +import com.baiye.module.service.dto.SecretResponseBean; +import com.mchange.v2.log.log4j2.Log4j2MLog; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.HashMap; + +/** + * @author jt + */ +@Slf4j +public class DecryptPnoUtil { + private static final String HTTP_RESPONSE_JSON_FORMATE = "application/x-www-form-urlencoded"; + + public static String decryptPno(String origins) { + HashMap paramMap = new HashMap<>(); + paramMap.put("sig", createSig()); + paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID); + paramMap.put("tels", origins); + + //链式构建请求 + String result = HttpRequest.post(SecretConstant.SECRET_DECRYPT_YY_URL) + .header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE) + .form(paramMap) + .timeout(2_000) + .execute().body(); + log.info("result======={}", JSONUtil.toJsonStr(result)); + SecretResponseBean secretResponseBean = JSONUtil.toBean(result, SecretResponseBean.class); + // 解析响应内容 + if (secretResponseBean.getTels() == null) { + throw new BadRequestException("nid 解密失败"); + } + return secretResponseBean.getTels(); + } +// { +// "reason": "auth failed", +// "result": "400" +// } + + /** + * 生成 sig 值 + * + * @return sig + */ + private static String createSig() { + return SecureUtil.md5( + SecretConstant.SECRET_DECRYPT_YY_ID + + SecretConstant.SECRET_DECRYPT_YY_SIG + + DateUtil.format(new Date(), SecretConstant.SECRET_DECRYPT_TIME_FORMATE)); + } +}