package com.nq.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.nq.common.ServerResponse; import com.nq.dao.SiteNewsMapper; import com.nq.pojo.SiteNews; import com.nq.service.ISiteNewsService; import com.nq.utils.DateTimeUtil; import com.nq.utils.HttpRequest; import com.nq.utils.PropertiesUtil; import com.nq.utils.StringUtils; import com.nq.utils.translate.GoogleTranslateUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.util.List; /** * 新闻资讯 * @author lr * @date 2020/07/24 */ @Service("ISiteNewsService") public class SiteNewsServiceImpl implements ISiteNewsService { private static final Logger log = LoggerFactory.getLogger(SiteNewsServiceImpl.class); @Resource private SiteNewsMapper siteNewsMapper; @Override public int insert(SiteNews model) { int ret = 0; if (model == null) { return 0; } ret = siteNewsMapper.insert(model); return ret; } @Override public int update(SiteNews model) { int ret = siteNewsMapper.update(model); return ret>0 ? ret: 0; } /** * 新闻资讯-保存 */ @Override public ServerResponse save(SiteNews model) { int ret = 0; if(model!=null && model.getId()>0){ ret = siteNewsMapper.update(model); } else{ ret = siteNewsMapper.insert(model); } if(ret>0){ return ServerResponse.createBySuccessMsg("操作成功"); } return ServerResponse.createByErrorMsg("操作失败"); } /*新闻资讯-查询列表*/ @Override public ServerResponse getList(int pageNum, int pageSize, Integer type, String sort, String keyword, HttpServletRequest request) { PageHelper.startPage(pageNum, pageSize); List listData = this.siteNewsMapper.pageList(pageNum, pageSize, type, sort, keyword); String lang = request.getHeader("lang"); // 处理每条数据 for (SiteNews siteNews : listData) { try { if (lang == null || lang.equals("") || lang.equals("zh-CN") || lang.equals("tww")) { // 如果是简体中文、繁体中文或空,将繁体转为简体返回 // 使用反射直接设置字段值,避免setter的转换逻辑 setFieldDirectly(siteNews, "title", convertTraditionalToSimplified(siteNews.getTitle())); setFieldDirectly(siteNews, "description", convertTraditionalToSimplified(siteNews.getDescription())); setFieldDirectly(siteNews, "content", convertTraditionalToSimplified(siteNews.getContent())); setFieldDirectly(siteNews, "sourceName", convertTraditionalToSimplified(siteNews.getSourceName())); } else { // 如果是其他语言,先将繁体转为简体,然后再翻译 GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); // 先将繁体转为简体(因为Google翻译假设源语言是简体) String titleSimplified = convertTraditionalToSimplified(siteNews.getTitle()); String descriptionSimplified = convertTraditionalToSimplified(siteNews.getDescription()); String contentSimplified = convertTraditionalToSimplified(siteNews.getContent()); String sourceNameSimplified = convertTraditionalToSimplified(siteNews.getSourceName()); // 然后翻译,使用反射设置避免setter转换 if (titleSimplified != null) { setFieldDirectly(siteNews, "title", googleTranslateUtil.translate(titleSimplified, lang)); } if (descriptionSimplified != null) { setFieldDirectly(siteNews, "description", googleTranslateUtil.translate(descriptionSimplified, lang)); } if (contentSimplified != null) { setFieldDirectly(siteNews, "content", googleTranslateUtil.translate(contentSimplified, lang)); } if (sourceNameSimplified != null) { setFieldDirectly(siteNews, "sourceName", googleTranslateUtil.translate(sourceNameSimplified, lang)); } } } catch (Exception e) { log.error("处理新闻数据失败", e); } } PageInfo pageInfo = new PageInfo(listData); pageInfo.setList(listData); return ServerResponse.createBySuccess(pageInfo); } /** * 使用反射直接设置字段值,避免触发setter的转换逻辑 */ private void setFieldDirectly(SiteNews siteNews, String fieldName, String value) { if (value == null) { return; } try { Field field = SiteNews.class.getDeclaredField(fieldName); field.setAccessible(true); field.set(siteNews, value); } catch (Exception e) { log.error("设置字段值失败: " + fieldName, e); } } /** * 将繁体转换为简体 * 使用Google翻译API将繁体(zh-TW)转换为简体(zh-CN) */ private String convertTraditionalToSimplified(String traditional) { if (traditional == null || traditional.isEmpty()) { return traditional; } try { // 使用Google翻译将繁体转为简体 GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); return googleTranslateUtil.translate("zh-TW", "zh-CN", traditional); } catch (Exception e) { log.error("繁体转简体失败,返回原值", e); return traditional; } } /*新闻资讯-查询详情*/ @Override public ServerResponse getDetail(int id, HttpServletRequest request) { SiteNews model = siteNewsMapper.load(id); if(model!=null){ String lang = request.getHeader("lang"); try { if (lang == null || lang.equals("") || lang.equals("zh-CN") || lang.equals("tww")) { // 如果是简体中文、繁体中文或空,将繁体转为简体返回 // 使用反射直接设置字段值,避免setter的转换逻辑 setFieldDirectly(model, "title", convertTraditionalToSimplified(model.getTitle())); setFieldDirectly(model, "description", convertTraditionalToSimplified(model.getDescription())); setFieldDirectly(model, "content", convertTraditionalToSimplified(model.getContent())); setFieldDirectly(model, "sourceName", convertTraditionalToSimplified(model.getSourceName())); } else { // 如果是其他语言,先将繁体转为简体,然后再翻译 GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); // 先将繁体转为简体(因为Google翻译假设源语言是简体) String titleSimplified = convertTraditionalToSimplified(model.getTitle()); String descriptionSimplified = convertTraditionalToSimplified(model.getDescription()); String contentSimplified = convertTraditionalToSimplified(model.getContent()); String sourceNameSimplified = convertTraditionalToSimplified(model.getSourceName()); // 然后翻译,使用反射设置避免setter转换 if (titleSimplified != null) { setFieldDirectly(model, "title", googleTranslateUtil.translate(titleSimplified, lang)); } if (descriptionSimplified != null) { setFieldDirectly(model, "description", googleTranslateUtil.translate(descriptionSimplified, lang)); } if (contentSimplified != null) { setFieldDirectly(model, "content", googleTranslateUtil.translate(contentSimplified, lang)); } if (sourceNameSimplified != null) { setFieldDirectly(model, "sourceName", googleTranslateUtil.translate(sourceNameSimplified, lang)); } } } catch (Exception e) { log.error("处理新闻详情数据失败", e); } return ServerResponse.createBySuccess(model); } return ServerResponse.createBySuccess(model); } /*新闻资讯-修改新闻浏览量*/ @Override public ServerResponse updateViews(Integer id) { return ServerResponse.createBySuccess(this.siteNewsMapper.updateViews(id)); } /*新闻资讯-top最新新闻资讯*/ @Override public ServerResponse getTopNewsList(int pageSize){ List listData = this.siteNewsMapper.getTopNewsList(pageSize); PageInfo pageInfo = new PageInfo(); pageInfo.setList(listData); return ServerResponse.createBySuccess(pageInfo); } /*新闻资讯-抓取*/ @Override public int grabNews() { int ret = 0; //新闻类型:1、财经要闻,2、经济数据,3、全球股市,4、7*24全球,5、商品资讯,6、上市公司,7、全球央行 ret = addNews(1, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetImportantNewsList"); log.info("财经要闻-抓取条数:" + ret); ret = addNews(2, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetInfoList?code=125&pageNumber=1&pagesize=20&condition=&r="); log.info("经济数据-抓取条数:" + ret); ret = addNews(3, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetInfoList?code=105&pageNumber=1&pagesize=20&condition=&r="); log.info("全球股市-抓取条数:" + ret); ret = addNews(4, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetInfoList?code=100&pageNumber=1&pagesize=20&condition=&r="); log.info("7*24全球-抓取条数:" + ret); ret = addNews(5, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetInfoList?code=106&pageNumber=1&pagesize=20&condition=&r="); log.info("商品资讯-抓取条数:" + ret); ret = addNews(6, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetInfoList?code=103&pageNumber=1&pagesize=20&condition=&r="); log.info("上市公司-抓取条数:" + ret); ret = addNews(7, PropertiesUtil.getProperty("news.main.url") + "/pc_news/FastNews/GetInfoList?code=118&pageNumber=1&pagesize=20&condition=&r="); log.info("全球央行-抓取条数:" + ret); return ret; } /* *抓取新闻专用 * type:新闻类型:1、财经要闻,2、经济数据,3、全球股市,4、7*24全球,5、商品资讯,6、上市公司,7、全球央行 * */ private int addNews(Integer type, String url){ int k = 0; try { String newlist = HttpRequest.doGrabGet(url); JSONObject json = JSONObject.fromObject(newlist); int size=json.getJSONArray("items").size()>8?8:json.getJSONArray("items").size(); if(json != null && json.getJSONArray("items") != null && json.getJSONArray("items").size() > 0){ for (int i = 0; i < size; i++){ JSONObject model = JSONObject.fromObject(json.getJSONArray("items").getString(i)); String newsId = model.getString("code"); String imgUrl = null; if(model.has("imgUrl")){ imgUrl = model.getString("imgUrl"); } //新闻不存在则添加 if(siteNewsMapper.getNewsBySourceIdCount(newsId) == 0){ //获取新闻详情 String newdata = HttpRequest.doGrabGet(PropertiesUtil.getProperty("news.main.url") + "/PC_News/Detail/GetDetailContent?id="+ newsId +"&type=1"); newdata = newdata.substring(1,newdata.length()-1).replace("\\\\\\\"","\""); //替换所有引号 newdata = newdata.replace("\\\"","\""); newdata = StringUtils.UnicodeToCN(newdata); newdata = StringUtils.delHTMLTag(newdata); JSONObject jsonnew = JSONObject.fromObject(newdata); if(jsonnew != null && jsonnew.get("data") != null){ JSONObject news = JSONObject.fromObject(jsonnew.get("data")); SiteNews siteNews = new SiteNews(); siteNews.setSourceId(newsId); siteNews.setSourceName(news.getString("source")); siteNews.setTitle(news.getString("title")); String showTime = news.getString("showTime"); siteNews.setShowTime(DateTimeUtil.strToDate(showTime)); siteNews.setImgurl(imgUrl); siteNews.setDescription(news.getString("description")); siteNews.setContent(news.getString("content")); siteNews.setStatus(1); siteNews.setType(type); siteNewsMapper.insert(siteNews); k++; } } } } } catch (Exception e) { e.printStackTrace(); } return k; } }