评论sop

master
wujingtao 2 years ago
parent 02284d6976
commit 6d6ef8c424

@ -21,4 +21,15 @@ public interface TiktokRequestConstants {
*
*/
String DY_PHONE_LOGIN = "/api/device/smsCodeLogin";
/**
*
*/
String SEARCH_VIDEO = "/api/search/searchVideo";
/**
*
*/
String AWEME_DETAIL = "/api/video/awemeDetail";
}

@ -0,0 +1,33 @@
package com.baiye.controller;
import com.baiye.core.base.api.Result;
import com.baiye.core.page.PageResult;
import com.baiye.dto.SopDto;
import com.baiye.query.SopQuery;
import com.baiye.service.TiktokSopService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author jt
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/tiktok/sop")
public class TiktokSopController {
@Resource
private TiktokSopService tiktokSopService;
@PostMapping("add")
public Result<Object> addSop(@RequestBody SopDto sopDto) {
tiktokSopService.addSop(sopDto);
return Result.success();
}
@GetMapping("query")
public PageResult querySop(SopQuery sopQuery, Pageable pageable){
return tiktokSopService.querySop(sopQuery, pageable);
}
}

@ -0,0 +1,88 @@
package com.baiye.job;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.core.base.api.Result;
import com.baiye.core.constant.TiktokRequestConstants;
import com.baiye.core.constant.TiktokResponse;
import com.baiye.core.util.StringUtils;
import com.baiye.dao.KeyWordMapper;
import com.baiye.dao.ReviewContentMapper;
import com.baiye.dao.SopMapper;
import com.baiye.dao.TiktokEquipmentMapper;
import com.baiye.entity.KeyWordEntity;
import com.baiye.entity.SopEntity;
import com.baiye.entity.TiktokEquipmentEntity;
import com.baiye.properties.TiktokProperties;
import com.baiye.service.TiktokEquipmentService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author jt
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class CommentSopJob {
private final SopMapper sopMapper;
private final ReviewContentMapper reviewContentMapper;
private final KeyWordMapper keyWordMapper;
private final TiktokEquipmentMapper tiktokEquipmentMapper;
private final TiktokProperties tiktokProperties;
@Scheduled(cron = "* * 0/1 * * ?")
public void commentSop() {
List<SopEntity> sopEntities = sopMapper.selectList(new QueryWrapper<>());
int hour = DateUtil.date().hour(true);
for (SopEntity sop : sopEntities) {
Integer executionStartTime = sop.getExecutionStartTime();
Integer executionEndTime = sop.getExecutionEndTime();
if (executionStartTime > hour || hour > executionEndTime) {
continue;
}
//所有的抖音设备号
List<String> dyIds = tiktokEquipmentMapper.findVendorIdByOrganizeId(sop.getOrganizeId());
//所有的搜索关键词
QueryWrapper<KeyWordEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type", 0);
queryWrapper.eq("sop_id", sop.getSopId());
List<KeyWordEntity> keyWordEntityList = keyWordMapper.selectList(queryWrapper);
for (String dyId : dyIds) {
for (KeyWordEntity keyWord : keyWordEntityList) {
JSONObject childrenJson = new JSONObject();
childrenJson.putOpt("vendorId", dyId);
childrenJson.putOpt("keyWord", keyWord.getWord());
childrenJson.putOpt("offset", 0);
childrenJson.putOpt("checkLogin", false);
childrenJson.putOpt("checkProxyInfo", false);
JSONObject json = new JSONObject();
json.putOpt("sessionKey", tiktokProperties.getSessionKey());
json.putOpt("data", childrenJson);
String post = HttpUtil.post(tiktokProperties.getGatewayHost().concat(TiktokRequestConstants.SEARCH_VIDEO), JSONUtil.toJsonStr(json));
if (StringUtils.isNotBlank(post)) {
TiktokResponse tiktokResponse = JSONUtil.toBean(post, TiktokResponse.class);
if (tiktokResponse.getStatus() == HttpStatus.HTTP_OK) {
JSONObject value = JSONUtil.parseObj(tiktokResponse.getData()) ;
JSONArray awemeList = value.getJSONArray("aweme_list");
//todo 保存到泛资源库
}
}
}
}
}
}
}

@ -0,0 +1,21 @@
package com.baiye.dao;
import com.baiye.entity.KeyWordEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author jt
*/
@Mapper
public interface KeyWordMapper extends BaseMapper<KeyWordEntity> {
/**
*
*
* @param list
*/
void insertAll(@Param("list") List<KeyWordEntity> list);
}

@ -0,0 +1,20 @@
package com.baiye.dao;
import com.baiye.entity.ReviewContentEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author jt
*/
@Mapper
public interface ReviewContentMapper extends BaseMapper<ReviewContentEntity> {
/**
*
* @param list
*/
void insertAll( @Param("list") List<ReviewContentEntity> list);
}

@ -0,0 +1,13 @@
package com.baiye.dao;
import com.baiye.entity.SopEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author jt
*/
@Mapper
public interface SopMapper extends BaseMapper<SopEntity> {
}

@ -15,7 +15,14 @@ public interface TiktokEquipmentMapper extends BaseMapper<TiktokEquipmentEntity>
List<TiktokEquipmentVo> getEquipmentList();
List<Map<Long,Object>> findOrganizeCount();
List<Map<Long, Object>> findOrganizeCount();
void updateByUserId(@Param("entities") List<TiktokEquipmentEntity> entities, @Param("userIds") Set<String> userIdList);
/**
* idid
* @param OrganizeId
* @return
*/
List<String> findVendorIdByOrganizeId(@Param("organizeId") Long OrganizeId);
}

@ -0,0 +1,100 @@
package com.baiye.dto;
import com.baiye.entity.KeyWordEntity;
import com.baiye.entity.ReviewContentEntity;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* @author jt
*/
@Data
public class SopDto {
/**
* id
*/
private Long sopId;
/**
* sop
*/
private String sopName;
/**
*
*/
private Long organizeId;
/**
*
*/
private String remake;
/**
* 0-
*/
private Integer likeNum;
/**
* 0-
*/
private Integer commentDay;
/**
*
*/
private Integer executionNum;
/**
*
*/
private Date executionStartTime;
/**
*
*/
private Date executionEndTime;
/**
*
*/
private List<KeyWordEntity> searchKeyWords;
/**
*
*/
private List<KeyWordEntity> filterKeyWords;
/**
*
*/
private List<PreciseResource> matchKeyWords;
public static class PreciseResource {
private Long id;
private String matchKeyWord;
private List<ReviewContentEntity> reviewContents;
public String getMatchKeyWord() {
return matchKeyWord;
}
public void setMatchKeyWord(String matchKeyWord) {
this.matchKeyWord = matchKeyWord;
}
public List<ReviewContentEntity> getReviewContents() {
return reviewContents;
}
public void setReviewContents(List<ReviewContentEntity> reviewContents) {
this.reviewContents = reviewContents;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
}

@ -0,0 +1,39 @@
package com.baiye.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
/**
* @author jt
*/
@Data
@TableName("tb_key_word")
public class KeyWordEntity implements Serializable {
/**
* id
*/
@TableId(type = IdType.INPUT)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
*
*/
private String word;
/**
* sopId
*/
private Long sopId;
/**
* 0- 1- 2-
*/
private Integer type;
}

@ -0,0 +1,31 @@
package com.baiye.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* @author jt
*/
@Data
@TableName("tb_review_content")
public class ReviewContentEntity {
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private String id;
/**
*
*/
private String content;
/**
* id
*/
private Long keyWordId;
}

@ -0,0 +1,73 @@
package com.baiye.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* @author jt
*/
@Data
@TableName("tb_sop")
public class SopEntity implements Serializable {
/**
* id
*/
@TableId(type = IdType.INPUT)
@JsonSerialize(using = ToStringSerializer.class)
private Long sopId;
/**
* sop
*/
private String sopName;
/**
*
*/
private Long organizeId;
/**
*
*/
private String remake;
/**
* 0-
*/
private Integer likeNum;
/**
* 0-
*/
private Integer commentDay;
/**
*
*/
private Integer executionNum;
/**
*
*/
private Integer executionStartTime;
/**
*
*/
private Integer executionEndTime;
@TableField(value = "create_time", fill = FieldFill.INSERT)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private Integer status;
}

@ -0,0 +1,15 @@
package com.baiye.query;
import com.baiye.annotation.Query;
import com.baiye.annotation.type.SelectType;
import lombok.Data;
/**
* @author jt
*/
@Data
public class SopQuery {
@Query(type = SelectType.INNER_LIKE)
private String sopName;
}

@ -0,0 +1,26 @@
package com.baiye.service;
import com.baiye.core.page.PageResult;
import com.baiye.dto.SopDto;
import com.baiye.query.SopQuery;
import org.springframework.data.domain.Pageable;
/**
* @author jt
*/
public interface TiktokSopService {
/**
* sop
* @param dto
*/
void addSop(SopDto dto);
/**
* sop
* @param sopQuery
* @param pageable
* @return
*/
PageResult querySop(SopQuery sopQuery, Pageable pageable);
}

@ -0,0 +1,162 @@
package com.baiye.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.core.page.PageResult;
import com.baiye.core.util.BeanUtils;
import com.baiye.dao.KeyWordMapper;
import com.baiye.dao.ReviewContentMapper;
import com.baiye.dao.SopMapper;
import com.baiye.dto.SopDto;
import com.baiye.entity.KeyWordEntity;
import com.baiye.entity.ReviewContentEntity;
import com.baiye.entity.SopEntity;
import com.baiye.query.SopQuery;
import com.baiye.service.TiktokSopService;
import com.baiye.util.PageUtils;
import com.baiye.util.QueryHelpUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author jt
*/
@Service
public class TiktokSopServiceImpl extends ServiceImpl<SopMapper, SopEntity> implements TiktokSopService {
@Resource
private SopMapper sopMapper;
@Resource
private ReviewContentMapper reviewContentMapper;
@Resource
private KeyWordMapper keyWordMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void addSop(SopDto dto) {
SopEntity sop;
Long id;
if (ObjectUtil.isNotEmpty(dto) && dto.getSopId() != null) {
//修改
sop = sopMapper.selectById(dto.getSopId());
id = dto.getSopId();
} else {
sop = new SopEntity();
id = IdUtil.getSnowflake(9, 9).nextId();
}
BeanUtils.copyProperties(dto, sop);
sop.setSopId(id);
List<KeyWordEntity> keyWordEntityList = new ArrayList<>();
//搜索关键词
List<KeyWordEntity> searchKeyWords = dto.getSearchKeyWords();
for (KeyWordEntity value : searchKeyWords) {
if (value.getId() != null) {
continue;
}
Long keyId = IdUtil.getSnowflake(9, 9).nextId();
value.setId(keyId);
value.setSopId(id);
value.setType(0);
keyWordEntityList.add(value);
}
//过滤关键词
List<KeyWordEntity> filterKeyWords = dto.getFilterKeyWords();
for (KeyWordEntity value : filterKeyWords) {
if (value.getId() != null) {
continue;
}
Long keyId = IdUtil.getSnowflake(9, 9).nextId();
value.setId(keyId);
value.setSopId(id);
value.setType(1);
keyWordEntityList.add(value);
}
List<SopDto.PreciseResource> matchKeyWords = dto.getMatchKeyWords();
List<ReviewContentEntity> contents = new ArrayList<>();
for (SopDto.PreciseResource resource : matchKeyWords) {
Long keyId = resource.getId();
if (resource.getId() == null) {
KeyWordEntity keyWord = new KeyWordEntity();
keyId = IdUtil.getSnowflake(9, 9).nextId();
keyWord.setId(keyId);
keyWord.setWord(resource.getMatchKeyWord());
keyWord.setSopId(id);
keyWord.setType(2);
keyWordEntityList.add(keyWord);
}
List<ReviewContentEntity> reviewContents = resource.getReviewContents();
for (ReviewContentEntity content : reviewContents) {
if (content.getId() != null) {
continue;
}
ReviewContentEntity reviewContent = new ReviewContentEntity();
reviewContent.setContent(content.getContent());
reviewContent.setKeyWordId(keyId);
contents.add(reviewContent);
}
}
sopMapper.insert(sop);
keyWordMapper.insertAll(keyWordEntityList);
reviewContentMapper.insertAll(contents);
}
@Override
public PageResult querySop(SopQuery sopQuery, Pageable pageable) {
Page<SopEntity> page = PageUtils.startPageAndSort(pageable);
QueryWrapper<SopEntity> queryWrapper = QueryHelpUtils.getWrapper(sopQuery, SopEntity.class);
Page<SopEntity> selectPage = sopMapper.selectPage(page, queryWrapper);
//当前在线情况
List<SopEntity> records = selectPage.getRecords();
List<SopDto> sopDtos = Convert.toList(SopDto.class, records);
for (SopDto sopDto : sopDtos) {
Long sopId = sopDto.getSopId();
//查寻关键词和回评
QueryWrapper<KeyWordEntity> wrapper = new QueryWrapper<>();
wrapper.eq("sop_id", sopId);
List<KeyWordEntity> keyWordEntityList = keyWordMapper.selectList(wrapper);
List<KeyWordEntity> keyWordBySearchKeys = new ArrayList<>();
List<KeyWordEntity> keyWordByFilterKeys = new ArrayList<>();
List<SopDto.PreciseResource> keyWordByMatchKeys = new ArrayList<>();
if (CollUtil.isNotEmpty(keyWordEntityList)) {
for (KeyWordEntity keyWord : keyWordEntityList) {
if (keyWord.getType() == 0) {
keyWordBySearchKeys.add(keyWord);
} else if (keyWord.getType() == 1) {
keyWordByFilterKeys.add(keyWord);
} else {
SopDto.PreciseResource preciseResource = new SopDto.PreciseResource();
preciseResource.setId(keyWord.getId());
preciseResource.setMatchKeyWord(keyWord.getWord());
QueryWrapper<ReviewContentEntity> wrapperContent = new QueryWrapper<>();
wrapperContent.eq("key_word_id", keyWord.getId());
List<ReviewContentEntity> contentEntities = reviewContentMapper.selectList(wrapperContent);
preciseResource.setReviewContents(contentEntities);
keyWordByMatchKeys.add(preciseResource);
}
}
}
sopDto.setSearchKeyWords(keyWordBySearchKeys);
sopDto.setFilterKeyWords(keyWordByFilterKeys);
sopDto.setMatchKeyWords(keyWordByMatchKeys);
}
return PageResult.success(selectPage.getTotal(), selectPage.getPages(), sopDtos);
}
}

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.dao.KeyWordMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.baiye.entity.KeyWordEntity">
<id column="id" property="id"/>
<result column="sop_id" property="sopId"/>
<result column="type" property="type"/>
<result column="word" property="word"/>
</resultMap>
<insert id="insertAll">
insert into tb_key_word (id,word,sop_id,type)
values
<foreach collection="list" item="item" index="index" separator=",">
( #{item.id}, #{item.word},#{item.sopId},#{item.type})
</foreach>
</insert>
</mapper>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.dao.ReviewContentMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.baiye.entity.ReviewContentEntity">
<id column="id" property="id"/>
<result column="content" property="content"/>
<result column="key_word_id" property="keyWordId"/>
</resultMap>
<insert id="insertAll">
insert into tb_review_content (content,key_word_id)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.content},#{item.keyWordId})
</foreach>
</insert>
</mapper>

@ -57,5 +57,9 @@
where dy_user_id = #{item.dyUserId}
</foreach>
</update>
<select id="findVendorIdByOrganizeId" resultType="string">
select dy_vendor_id
from tb_equipment
where organize_id = #{organizeId}
</select>
</mapper>
Loading…
Cancel
Save