个人表单上传和统计

master
wujingtao 2 years ago
parent fc8f56e8ee
commit 6eaac42472

@ -119,4 +119,8 @@ public class ClueDto implements Serializable {
@ApiModelProperty(value = "线索标识")
private String tag;
@ApiModelProperty(value = "表单线索录音地址")
private String audioUrl;
@ApiModelProperty(value = "成交金额")
private Double turnoverAmount;
}

@ -15,13 +15,16 @@ public class DynamicTaskDto {
/**
* id
*/
@NotNull
private Long taskId;
/**
* id
*/
@NotNull
private Long userId;
/**
*
*/
private Long whichUserId;
/**
*
*/

@ -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;
}

@ -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<Long> memberIds;
}

@ -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<Timestamp> createTime;
}

@ -86,4 +86,6 @@ public class UserDto extends BaseDTO implements Serializable {
private Integer onlineStatus;
private Boolean addWeChatFlag;
private Long whichUserId;
}

@ -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;
}

@ -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;
}

@ -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);
}
}

@ -89,4 +89,14 @@ public class TaskController {
String message = JSONUtil.toJsonStr(jsonData);
webSocketServer.sendMessage(message, userId);
}
/**
* @param taskId
* @return
*/
@GetMapping("/form/encryption")
public CommonResponse<Object> updateTaskEncryption(Long taskId) {
taskService.updateTaskEncryption(taskId);
return CommonResponse.createBySuccessMessage("操作成功");
}
}

@ -65,4 +65,6 @@ public interface TaskService {
* @param taskId
*/
void delDynamicTask(Long taskId);
void updateTaskEncryption(Long taskId);
}

@ -46,4 +46,5 @@ public class TaskDto implements Serializable {
private List<String> baseLabel;
private String remark;
private Integer isForm;
}

@ -175,6 +175,17 @@ public class TaskServiceImpl implements TaskService {
}
}
@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
*/

@ -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<UpdateOrderDto> 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());

@ -212,8 +212,7 @@ 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)) {
// if (StrUtil.isNotBlank(reqId)) {
AllCallInfo allCallInfo = new AllCallInfo();
allCallInfo.setSessionId(requestId);
allCallInfo.setRequestId(requestId);
@ -232,10 +231,9 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
clueInfo.setCompanyId(companyId);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
} else {
return CommonResponse.createByError();
}
}
// } 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())) {

@ -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";
}

@ -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<Object> insertDynamicTask(@Validated @RequestBody DynamicTaskDto dynamicTaskDto) {
clueService.insertDynamicTask(dynamicTaskDto);
return CommonResponse.createBySuccess();
}
@PostMapping("/report/stage")
@ApiOperation("统计线索的跟进情况和成交金额")
public CommonResponse<Object> reportClueStageAndTurnover(@RequestBody ReportStageAndTurnoverDto reportStageAndTurnoverDto) {
return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto);
}
}

@ -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<String, Object> acceptFormSource(@RequestBody String json) {
log.info("json======{}", json);
return formSourceService.acceptFormSource(json);
}
}

@ -35,8 +35,10 @@ public class PublicCluePoolController {
@ApiOperation("手动回收线索到公海")
@GetMapping("/recycle")
public ResponseEntity<Object> 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);
}

@ -56,9 +56,9 @@ public class ClueJpa {
public List<ClueDto> 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<Long> 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<PublicCluePoolDto> 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;

@ -175,5 +175,9 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, 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<ClueMiddle> queryClueMiddleByClueStage(Long companyId, String time, List<Integer> clueStage);
@Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2", nativeQuery = true)
List<ClueMiddle> 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<ClueMiddle> queryAllByTimeAndMemberIds(String beginTime, String endTime,List<Long> memberIds);
}

@ -58,4 +58,8 @@ public class Clue extends BaseClue {
@Transient
private Object sourceLabel;
@Transient
private Double turnoverAmount;
@ApiModelProperty(value = "表单录音")
private String audioUrl;
}

@ -55,4 +55,7 @@ public class ConductRecord implements Serializable {
@Column(name = "create_time")
@CreationTimestamp
private Date createTime;
@ApiModelProperty(value = "操作人id对公海操作来说就是之前操作的人")
private Long operator;
}

@ -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<TaskZdyVo> {
* springservice
*/
private static ClueService clueService;
public TaskZdyExcelListener(ClueService clueService, BaseExcelVo baseExcelVo) {
this.clueService = clueService;
this.baseExcelVo = baseExcelVo;
@ -31,6 +33,7 @@ public class TaskZdyExcelListener extends AnalysisEventListener<TaskZdyVo> {
/**
* 1000
*
* @param taskZdyVo
* @param analysisContext
*/
@ -45,6 +48,7 @@ public class TaskZdyExcelListener extends AnalysisEventListener<TaskZdyVo> {
/**
*
*
* @param analysisContext
*/
@Override
@ -61,7 +65,12 @@ public class TaskZdyExcelListener extends AnalysisEventListener<TaskZdyVo> {
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());

@ -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<Object> reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto);
}

@ -0,0 +1,10 @@
package com.baiye.module.service;
import java.util.Map;
/**
* @author jt
*/
public interface FormSourceService {
Map<String, Object> acceptFormSource(String json);
}

@ -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);

@ -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 + '\'' +
'}';
}
}

@ -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
@ -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<Object> 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<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndMemberIds(startTime, endTime, reportDto.getMemberIds());
Set<Long> userIds = clueMiddles.stream().map(ClueMiddle::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNameList = userClient.findById(userIds);
//根据人员id分组
HashMap<Long, List<ClueMiddle>> map = new HashMap<>(clueMiddles.stream().collect(Collectors.groupingBy(ClueMiddle::getMemberId, Collectors.toList())));
List<HashMap<String, Object>> list = new ArrayList<>();
for (Long key : map.keySet()) {
List<ClueMiddle> clueMiddles1 = map.get(key);
HashMap<String, Object> reportMap = getReportMap(clueMiddles1);
reportMap.put("memberId", key);
String name = getMemberName(userNameList.get(key));
reportMap.put("memberName", name);
//处理金额
List<Map<String, Object>> 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<String, Object> getReportMap(List<ClueMiddle> 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<String, Object> 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<Map<String, Object>> getTimeMap(String startTime, String endTime, List<ClueMiddle> clueMiddles) {
Date start = DateUtil.parseDate(startTime);
Date end = DateUtil.parseDate(endTime);
int between = (int) DateUtil.between(start, end, DateUnit.DAY);
List<Map<String, Object>> 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<String, Object> 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);

@ -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<String, Object> acceptFormSource(String json) {
Map<String, Object> 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);
}
}

@ -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<Long> memberIds = new HashSet<>();
memberIds.add(clueMiddle.getMemberId());
if (!memberId.equals(clueMiddle.getMemberId())) {
memberIds.add(memberId);
}
memberIds.add(memberId);
Map<Long, String> 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);
//重置线索的所属人

@ -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<String, Object> 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));
}
}
Loading…
Cancel
Save