提交 a48c2806 authored 作者: chaoyanjun's avatar chaoyanjun

--no commit message

上级 a7e3cff3
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.zrqx.works</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
</projectDescription>
eclipse.preferences.version=1
encoding/<project>=UTF-8
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.8
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zrqx</groupId>
<artifactId>com.zrqx.pom</artifactId>
<version>1.0.0</version>
<relativePath>../com.zrqx.pom</relativePath>
</parent>
<groupId>com.zrqx</groupId>
<artifactId>com.zrqx.works</artifactId>
<dependencies>
<dependency>
<groupId>com.zrqx</groupId>
<artifactId>com.zrqx.core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--表示为web工程 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 用于健康监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--熔断器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<!-- <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency> -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入solrj -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
<!--分布式事务 -->
<!-- <dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId>
<exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId>
</exclusion> </exclusions> </dependency> <dependency> <groupId>com.codingapi</groupId>
<artifactId>tx-plugins-db</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId>
<artifactId>*</artifactId> </exclusion> </exclusions> </dependency> -->
<!--swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!-- Springsecurity给服务端提供安全访问 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--用于测试的 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 热部署工具 -->
<!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId>
</dependency> -->
</dependencies>
</project>
\ No newline at end of file
package com.zrqx.works;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import com.alibaba.druid.pool.DruidDataSource;
import tk.mybatis.spring.annotation.MapperScan;
@EnableScheduling
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication // 系统会去入口类的同级包以及下级包中去扫描实体类,因此我们建议入口类的位置在groupId+arctifactID组合的包名下。
@MapperScan(basePackages = {"com.zrqx.works.bg.mapper.*"})
public class WorksStart {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
private final static Logger logger = LoggerFactory.getLogger(WorksStart.class);
public static void main(String[] args) {
// 下面两行代码都可以用来启动
SpringApplication.run(WorksStart.class, args);
// new SpringApplicationBuilder(AppStart.class).web(true).run(args);
logger.info("works服务已启动.....");
// test serversion
}
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);// 用户名
dataSource.setPassword(password);// 密码
dataSource.setInitialSize(2);
dataSource.setMaxActive(20);
dataSource.setMinIdle(0);
dataSource.setMaxWait(60000);
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(false);
dataSource.setTestWhileIdle(true);
dataSource.setPoolPreparedStatements(false);
return dataSource;
}
}
package com.zrqx.works.bg.client.content;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import com.zrqx.core.constant.content.ContentRequestPath;
import com.zrqx.core.util.CallBack;
@FeignClient(name = "content", fallback = ContentClientHystrix.class)
public interface ContentClient {
/** 资讯总量 */
@GetMapping(ContentRequestPath.BG + ContentRequestPath.CONTENT + ContentRequestPath.COUNT)
CallBack<Integer> total();
}
package com.zrqx.works.bg.client.content;
import org.springframework.stereotype.Component;
import com.zrqx.core.util.CallBack;
@Component
public class ContentClientHystrix implements ContentClient{
@Override
public CallBack<Integer> total() {
return CallBack.fail();
}
}
package com.zrqx.works.bg.client.file;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.works.solr.SolrDownVo;
@FeignClient(name="file", fallback = FileClientHystric.class)
public interface FileClient {
/** 查找用户,用户所属部门,用户角色*/
@PostMapping("/ftp/download/selectdirectory")
public CallBack<String> downSelect(List<SolrDownVo> sdvList);
}
\ No newline at end of file
package com.zrqx.works.bg.client.file;
import java.util.List;
import org.springframework.stereotype.Component;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.works.solr.SolrDownVo;
/**
* @author Tujide.lv
*
*/
@Component
public class FileClientHystric implements FileClient {
@Override
public CallBack<String> downSelect(List<SolrDownVo> sdvList) {
return CallBack.fail();
}
}
package com.zrqx.works.bg.client.statistics;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import com.zrqx.core.constant.statistics.StatisticsRequestPath;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.works.door.WaitExamineVo;
@FeignClient(name = "statistics", fallback = StatisticsClientHystrix.class)
public interface StatisticsClient {
/** 资源总量 */
@GetMapping(StatisticsRequestPath.BG + StatisticsRequestPath.NUMSTATISTICS + StatisticsRequestPath.TOTAL)
CallBack<Integer> total();
/** 产品种类 */
@GetMapping(StatisticsRequestPath.BG + StatisticsRequestPath.NUMSTATISTICS + StatisticsRequestPath.PRODUCT)
CallBack<Integer> product();
/** 待审核事物*/
@GetMapping(StatisticsRequestPath.BG + StatisticsRequestPath.NUMSTATISTICS + StatisticsRequestPath.WAITEXAMINE)
CallBack<List<WaitExamineVo>> waitExamine();
}
package com.zrqx.works.bg.client.statistics;
import java.util.List;
import org.springframework.stereotype.Component;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.works.door.WaitExamineVo;
@Component
public class StatisticsClientHystrix implements StatisticsClient{
@Override
public CallBack<Integer> total() {
return CallBack.success(-1);
}
@Override
public CallBack<Integer> product() {
return CallBack.success(-1);
}
@Override
public CallBack<List<WaitExamineVo>> waitExamine() {
// TODO Auto-generated method stub
return CallBack.fail();
}
}
package com.zrqx.works.bg.client.sysuser;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.zrqx.core.constant.sysuser.SysUserRequestPath;
import com.zrqx.core.model.sysuser.message.Message;
import com.zrqx.core.util.CallBack;
@FeignClient(name="sysuser", fallback = MessageClientHystric.class)
public interface MessageClient {
/**
* 保存日志
* @param log
* @return
* @author yzg
* @date: 2018年8月16日 下午2:37:59
*/
@PostMapping(SysUserRequestPath.BG + SysUserRequestPath.MESSAGE + SysUserRequestPath.SAVE)
CallBack<Boolean> saveMessage(@RequestBody Message message);
}
\ No newline at end of file
package com.zrqx.works.bg.client.sysuser;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.zrqx.core.model.sysuser.message.Message;
import com.zrqx.core.util.CallBack;
/**
* @author Tujide.lv
*
*/
@Component
public class MessageClientHystric implements MessageClient{
private static final Logger log = Logger.getLogger(MessageClientHystric.class);
/**
* @see com.zrqx.order.client.SysuserClient#saveLog(com.zrqx.core.model.sysuser.log.Log)
* @param log
* @return
* @author ray
* @date: 2018年7月27日 上午10:59:35
*/
@Override
public CallBack<Boolean> saveMessage(Message message) {
return CallBack.fail();
}
}
package com.zrqx.works.bg.client.sysuser;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import com.zrqx.core.constant.sysuser.SysUserRequestPath;
import com.zrqx.core.model.sysuser.log.Log;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
@FeignClient(name="sysuser", fallback = SysuserClientHystric.class)
public interface SysuserClient {
/**
* 保存日志
* @param log
* @return
* @author yzg
* @date: 2018年8月16日 下午2:37:59
*/
@PostMapping(SysUserRequestPath.BG + SysUserRequestPath.LOG + SysUserRequestPath.SAVE)
CallBack<Boolean> saveLog(@RequestBody Log log);
/** 查找用户,用户所属部门,用户角色*/
@GetMapping(SysUserRequestPath.BG + SysUserRequestPath.USER + SysUserRequestPath.BASICS)
CallBack<UserVO> getUserById(@RequestParam("userId") String userId);
}
\ No newline at end of file
package com.zrqx.works.bg.client.sysuser;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.zrqx.core.model.sysuser.log.Log;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
/**
* @author Tujide.lv
*
*/
@Component
public class SysuserClientHystric implements SysuserClient{
private static final Logger log = Logger.getLogger(SysuserClientHystric.class);
/**
* @see com.zrqx.order.client.SysuserClient#saveLog(com.zrqx.core.model.sysuser.log.Log)
* @param log
* @return
* @author ray
* @date: 2018年7月27日 上午10:59:35
*/
@Override
public CallBack<Boolean> saveLog(Log log) {
SysuserClientHystric.log.info("保存操作日志失败");
return CallBack.fail();
}
@Override
public CallBack<UserVO> getUserById(String userId) {
// TODO Auto-generated method stub
return CallBack.fail();
}
}
package com.zrqx.works.bg.controller.advancedsearch;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zrqx.core.constant.BaseRequestPath;
import com.zrqx.core.constant.resource.ResourceRequestPath;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.form.works.bg.solr.AdvancedQueryForm;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.util.PageInfo;
import com.zrqx.core.util.PageParam;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
import com.zrqx.core.vo.works.solr.SolrListVo;
import com.zrqx.works.bg.client.sysuser.SysuserClient;
import com.zrqx.works.bg.service.apply.ApplyService;
import com.zrqx.works.commons.Redis;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* ClassName: AdvancedSearchController
*
* @Description: TODO
* @author lizhuo
* @date 2019年2月11日
*/
@RestController
@RequestMapping(ResourceRequestPath.BG + ResourceRequestPath.ADVANCEDSEARCH)
@Api(description = "工作台-高级检索")
public class AdvancedSearchController {
@Autowired
private Redis redis;
@Autowired
private SolrClient client;
@Autowired
private ApplyService applyService;
@Autowired
private SysuserClient sysuserClient;
@ApiOperation(value = "分页查询", notes = "查询列表")
@GetMapping(value = BaseRequestPath.PAGE)
public CallBack<PageInfo<SolrListVo>> page(AdvancedQueryForm form, PageParam pageParam) {
// 获取用户部门
String userid = redis.getUser().getUserId();
CallBack<UserVO> userVo = sysuserClient.getUserById(userid);
List<Integer> deptIdList = userVo.getData().getDeptList().stream().map(a -> {
return a.getDeptId();
}).collect(Collectors.toList());
StringBuffer sb = new StringBuffer();
SolrQuery sq = new SolrQuery();
if (form.getKeyword() == null) {
sb.append("*:*");
} else {
sb.append("(" + form.getKeyword() + ")");
}
if (StringUtils.isNotBlank(form.getResourceType())) {
sb.append(" && resourceType:" + form.getResourceType());
}
if (StringUtils.isNotBlank(form.getCode())) {
sb.append(" && code:" + form.getCode());
}
if (form.getDataSources() != null) {
sb.append(" && dataSources:" + form.getDataSources());
}
if (form.getStartTime() != null && form.getEndTime() != null) {
sb.append(" && publishTime:[" + solrTime(form.getStartTime()) + " TO " + form.getEndTime() + "T23:59:59Z" + "]");
}
if (StringUtils.isNotBlank(form.getMachiningList())) {
if("已加工".equals(form.getMachiningList())) {
sb.append(" && path: *");
}else {
sb.append(" && !path: *");
}
}
if (StringUtils.isNotBlank(form.getTypesettingList())) {
if("有".equals(form.getTypesettingList())) {
sb.append(" && typesettingList: *");
}else {
sb.append(" && !typesettingList: *");
}
}
if (form.getNumberCopyright() != null) {
sb.append(" && numberCopyright:" + form.getNumberCopyright());
}
if (form.getStatus() != null) {
sb.append(" && goodsStatus:" + form.getStatus());
}
if (form.getIsPaintBook() != null) {
sb.append(" && isPaintBook:" + form.getIsPaintBook());
}
if (form.getIsCooperationBook() != null) {
sb.append(" && isCooperationBook:" + form.getIsCooperationBook());
}
if (form.getDepartmentId() != null) {
sb.append(" && departmentId:" + form.getDepartmentId());
}
if (form.getDownload() != null) {
sb.append(" && ( download:" + form.getDownload());
deptIdList.forEach(item -> {
sb.append(" || departmentId:" + item);
});
sb.append(" )");
}
/*
* if (form.getFinish()!=null) { sb.append(" && finish:" + form.getFinish()); }
* if (form.getShowFinished()!=null) { sb.append(" && showFinished:" +
* form.getShowFinished()); }
*/
sq.addFilterQuery("isDelete:0 && status:1");
sq.set("q", sb.toString());
// 排序
sq.set("sort", pageParam.getOrderBy());
// 分页
int start = (int) ((pageParam.getPageNum() - 1) * pageParam.getPageSize());
sq.setStart(start);
sq.setRows(pageParam.getPageSize());
try {
QueryResponse queryResponse = client.query(sq);
SolrDocumentList results = queryResponse.getResults();
List<SolrListVo> list = new ArrayList<SolrListVo>();
for (SolrDocument result : results) {
SolrListVo slv = new SolrListVo();
String id = (String) result.get("id");
slv.setId(id);
slv.setName((String) result.get("name"));
slv.setAuthor((String) result.get("author"));
slv.setPublishTime((String) result.get("publishTime"));
slv.setEdition((String) result.get("edition"));
if ((String) result.get("intro") != null) {
Document d = Jsoup.parse((String) result.get("intro"));
slv.setIntro(d.text());
} else {
slv.setIntro((String) result.get("intro"));
}
slv.setBookName((String) result.get("bookName"));
slv.setUpdateTime((Date) result.get("updateTime"));
slv.setStatus((Integer) result.get("status"));
slv.setResourceType((Integer) result.get("resourceType"));
slv.setCover((String) result.get("cover"));
slv.setCode((String) result.get("code"));
//20190816新增展示字段
slv.setIsbn((String) result.get("isbn"));
slv.setDataSources((Integer) result.get("dataSources"));
slv.setProcessingState((Integer) result.get("processingState"));
if (result.get("numberCopyright") != null) {
slv.setNumberCopyright(result.get("numberCopyright").toString());
}
slv.setIsPaintBook((Integer) result.get("isPaintBook"));
slv.setIsCooperationBook((Integer) result.get("isCooperationBook"));
// 判断是否能下载
if (result.get("departmentId") != null) {
slv.setDepartment((Integer) result.get("departmentId"));
}
List<String> applyUserIds = (List) result.get("userId");
if (applyUserIds != null) {
for (int i = 0; i < applyUserIds.size(); i++) {
if (userid.equals(applyUserIds.get(i))) {
// 判断是否能下载
slv.setDownload(Integer.parseInt(((List<String>) result.get("download")).get(i)));
}
}
}
// 判断是否能下载
if (slv.getDownload() == null || slv.getDownload() != 1) {
if (deptIdList.contains(slv.getDepartment())) {
slv.setDownload(1);
} else {
slv.setDownload(0);
}
}
list.add(slv);
}
PageInfo<SolrListVo> page = new PageInfo<SolrListVo>();
page.setList(list);
page.setPageNum(pageParam.getPageNum());
page.setPageSize(pageParam.getPageSize());
page.setTotal(results.getNumFound());
return CallBack.success(page);
} catch (Exception e) {
e.printStackTrace();
throw new BaseException("查询失败");
}
}
private String solrTime(String date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date time = new Date();
try {
time = format.parse(date);
} catch (Exception e) {
e.printStackTrace();
}
long ss = time.getTime();
ss = ss - 1000;
Date time2 = new Date();
time2.setTime(ss);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String solrformat = sdf.format(time2);
return solrformat;
}
}
package com.zrqx.works.bg.controller.door;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zrqx.core.constant.works.WorksRequestPath;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.works.door.DoorDataVo;
import com.zrqx.works.bg.client.content.ContentClient;
import com.zrqx.works.bg.client.statistics.StatisticsClient;
@RestController
@RequestMapping(WorksRequestPath.BG + WorksRequestPath.DOOR)
@Api(description = "工作台-系统门户")
public class DoorController {
@Autowired
private ContentClient contentClient;
@Autowired
private StatisticsClient statisticsClient;
@ApiOperation(value = "数量统计", notes = "数量统计")
@GetMapping(value = WorksRequestPath.COUNT)
public CallBack<DoorDataVo> count() {
DoorDataVo vo = new DoorDataVo();
vo.setResource(statisticsClient.total().getData());
vo.setClassNum(statisticsClient.product().getData());
vo.setContent(contentClient.total().getData());
return CallBack.success(vo);
}
}
package com.zrqx.works.bg.controller.examine;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tk.mybatis.mapper.entity.Example.Criteria;
import com.zrqx.core.constant.works.WorksRequestPath;
import com.zrqx.core.enums.ResourceTypeEnum;
import com.zrqx.core.enums.works.apply.StatusEnum;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.form.works.bg.apply.ExamineStatusForm;
import com.zrqx.core.model.sysuser.message.Message;
import com.zrqx.core.model.works.apply.Apply;
import com.zrqx.core.model.works.apply.ApplyResource;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.util.Copy;
import com.zrqx.core.util.PageInfo;
import com.zrqx.core.util.PageMap;
import com.zrqx.core.util.PageParam;
import com.zrqx.core.vo.sysuser.bg.dept.DeptVO;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
import com.zrqx.core.vo.works.apply.ApplyDetailsVo;
import com.zrqx.core.vo.works.apply.QueryApplyVo;
import com.zrqx.core.vo.works.apply.QueryResourceVo;
import com.zrqx.works.bg.client.sysuser.MessageClient;
import com.zrqx.works.bg.client.sysuser.SysuserClient;
import com.zrqx.works.bg.service.apply.ApplyResourceService;
import com.zrqx.works.bg.service.apply.ApplyService;
import com.zrqx.works.commons.Redis;
@RestController
@RequestMapping(WorksRequestPath.BG + WorksRequestPath.EXAMINE)
@Api(description = "工作台-我的审核")
public class ExamineController {
@Autowired
private ApplyService service;
@Autowired
private ApplyResourceService resourceService;
@Autowired
private Redis redis;
@Autowired
private SysuserClient sysuserClient;
@Autowired
private MessageClient messageClient;
@ApiOperation(value = "根据ID查看申请详情", notes = "根据ID查看申请详情-申请id")
@GetMapping(value = WorksRequestPath.OID)
public CallBack<ApplyDetailsVo> selectById(@PathVariable Integer oid) {
return CallBack.success(service.selectById(oid));
}
@ApiOperation(value = "批量审核", notes = "批量审核 ")
@PostMapping(value = WorksRequestPath.BATCH_UPDATE_REVIEW)
public CallBack<String> updateById(@RequestBody ExamineStatusForm form) {
// 数据验证
if (form.getIds().length == 0) {
throw new BaseException(7, "没有选中任何数据,请重新选择");
}
Criteria cr = service.createCriteria();
Integer[] arr = form.getIds();
cr.andIn("id", Arrays.asList(arr));
List<Apply> applyList = service.selectByCriteria();
for (Apply apply : applyList) {
if (apply.getStatus() != StatusEnum.TOBEAUDITED.getCode()) {
throw new BaseException(7, "请选择未审核数据");
}
}
if (form.getStatus() == StatusEnum.NOT_AUDITPASS.getCode() && StringUtils.isBlank(form.getOpinion())) {
throw new BaseException(7, "驳回需要填写审核意见");
}
// 数据保存
Date date = new Date();
String userId = redis.getUser().getUserId();
// String userId = "11";
String opinion = form.getOpinion();
Integer status = form.getStatus();
for (Apply updateApply : applyList) {
updateApply.setExamineTime(date);
updateApply.setOpinion(opinion);
updateApply.setExamineId(userId);
updateApply.setStatus(status);
service.updateByPrimaryKeySelective(updateApply);
// 申请信息录入到消息中
Message message = new Message();
message.setUserId(userId);
message.setCreateTime(new Date());
message.setApplyId(updateApply.getId());
message.setTitle("您提交的资源下载申请状态发生改变!");
List<QueryResourceVo> qrVo = resourceService.page(updateApply.getId());
StringBuffer sb = new StringBuffer();
qrVo.forEach(qv -> {
sb.append("[" + ResourceTypeEnum.getName(qv.getResourceType()) + "]" + qv.getName() + ";");
});
sb.append(qrVo.size() + "条资源");
message.setContent(sb.toString());
message.setStatus(0);
message.setType(1);
messageClient.saveMessage(message);
}
// 保存审核信息
Criteria resourceCr = resourceService.createCriteria();
resourceCr.andIn("applyId", Arrays.asList(arr));
if(status.equals("1")) {
List<ApplyResource> arList = resourceService.selectByCriteria();
arList.forEach(item ->{
item.getResourceId();
item.getResourceType();
});
}
// 修改资源状态
ApplyResource ar = new ApplyResource();
ar.setStatus(status);
if (!resourceService.updateByCriteriaSelective(ar)) {
throw new BaseException(7, "资源状态修改失败");
}
return CallBack.success();
}
@ApiOperation(value = "分页查询", notes = "分页查询")
@GetMapping(value = WorksRequestPath.PAGE)
public CallBack<PageMap<String, List<QueryApplyVo>>> page(Integer status, PageParam pageParam) {
pageParam.setOrderBy("applyTime desc");
Criteria cr = service.createCriteria();
String userId = redis.getUser().getUserId();
// String userId = "11";
CallBack<UserVO> user = sysuserClient.getUserById(userId);
List<DeptVO> deptList = user.getData().getDeptList();
List<Integer> deptId = new ArrayList<Integer>();
for (DeptVO deptVO : deptList) {
deptId.add(deptVO.getDeptId());
}
if (deptId.size() == 0) {
throw new BaseException(7, "您还没有被分配部门");
}
cr.andIn("deptId", deptId);
if (status != null) {
cr.andEqualTo("status", status);
}
PageInfo<Apply> applyPage = service.queryCriteria(pageParam);
List<QueryApplyVo> qaVo = Copy.copyList(applyPage.getList(), QueryApplyVo.class, (apply, vo) -> {
List<QueryResourceVo> qrVo = resourceService.page(apply.getId());
vo.setResourceList(qrVo);
UserVO uservo = sysuserClient.getUserById(apply.getUserId()).getData();
vo.setDepa(uservo.getDeptList());
vo.setTopImg(uservo.getTopImg());
vo.setUserName(uservo.getUserName());
});
Map<String, List<QueryApplyVo>> map = qaVo.stream().collect(Collectors.groupingBy(QueryApplyVo::getTime));
PageMap<String, List<QueryApplyVo>> pageMap = new PageMap<>();
BeanUtils.copyProperties(applyPage, pageMap);
pageMap.setMap(map);
return CallBack.success(pageMap);
}
}
package com.zrqx.works.bg.controller.solr;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zrqx.core.constant.BaseRequestPath;
import com.zrqx.core.constant.works.WorksRequestPath;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.form.works.bg.solr.SolrQueryForm;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.util.PageInfo;
import com.zrqx.core.util.PageParam;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
import com.zrqx.core.vo.works.solr.SolrListVo;
import com.zrqx.works.bg.client.sysuser.SysuserClient;
import com.zrqx.works.bg.service.apply.ApplyService;
import com.zrqx.works.commons.Redis;
@RestController
@RequestMapping(WorksRequestPath.BG + WorksRequestPath.SOLR)
@Api(description = "工作台-资源广场-全文检索")
public class SolrController {
@Autowired
private Redis redis;
@Autowired
private SolrClient client;
@Autowired
private ApplyService applyService;
@Autowired
private SysuserClient sysuserClient;
@ApiOperation(value = "分页查询", notes = "查询列表")
@GetMapping(value = BaseRequestPath.PAGE)
public CallBack<PageInfo<SolrListVo>> page(SolrQueryForm form, PageParam pageParam) {
// 获取用户部门
String userid = redis.getUser().getUserId();
CallBack<UserVO> userVo = sysuserClient.getUserById(userid);
List<Integer> deptIdList = userVo.getData().getDeptList().stream().map(a -> {
return a.getDeptId();
}).collect(Collectors.toList());
StringBuffer sb = new StringBuffer();
SolrQuery sq = new SolrQuery();
if (StringUtils.isBlank(form.getKeyword())) {
form.setKeyword("*");
}
sb.append("keywords_li:" + form.getKeyword());
if (form.getDataSources()!=null) {
sb.append(" && dataSources:" + form.getDataSources());
}
if (StringUtils.isNotBlank(form.getResourceType())) {
sb.append(" && resourceType:" + form.getResourceType());
}
if (StringUtils.isNotBlank(form.getCode())) {
sb.append(" && code:" + form.getCode());
}
if (form.getDownload() != null) {
sb.append(" && ( download:" + form.getDownload());
deptIdList.forEach(item -> {
sb.append(" || departmentId:" + item);
});
sb.append(" )");
}
sq.addFilterQuery("isDelete:0 && status:1");
sq.set("q", sb.toString());
// 排序
sq.set("sort", pageParam.getOrderBy());
// 分页
int start = (int) ((pageParam.getPageNum() - 1) * pageParam.getPageSize());
sq.setStart(start);
sq.setRows(pageParam.getPageSize());
// 高亮
// 打开开关
sq.setHighlight(true);
// 指定高亮域
sq.addHighlightField("name");
// 设置前缀
sq.setHighlightSimplePre("<span style='color:red'>");
// 设置后缀
sq.setHighlightSimplePost("</span>");
try {
QueryResponse queryResponse = client.query(sq);
SolrDocumentList results = queryResponse.getResults();
// 获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的
Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
List<SolrListVo> list = new ArrayList<SolrListVo>();
// 赋值
for (SolrDocument result : results) {
SolrListVo slv = new SolrListVo();
String id = (String) result.get("id");
slv.setId(id);
slv.setName((String) result.get("name"));
slv.setAuthor((String) result.get("author"));
slv.setPublishTime((String) result.get("publishTime"));
slv.setEdition((String) result.get("edition"));
if((String)result.get("intro")!=null){
Document d = Jsoup.parse((String)result.get("intro"));
slv.setIntro(d.text());
}else{
slv.setIntro((String)result.get("intro"));
}
slv.setBookName((String) result.get("bookName"));
slv.setUpdateTime((Date) result.get("updateTime"));
slv.setStatus((Integer) result.get("status"));
slv.setResourceType((Integer) result.get("resourceType"));
slv.setCover((String) result.get("cover"));
slv.setCode((String) result.get("code"));
slv.setUploadTime((Date)result.get("uploadTime"));
//20190816新增展示字段
slv.setIsbn((String) result.get("isbn"));
slv.setDataSources((Integer) result.get("dataSources"));
slv.setProcessingState((Integer) result.get("processingState"));
if (result.get("numberCopyright") != null) {
slv.setNumberCopyright(result.get("numberCopyright").toString());
}
slv.setIsPaintBook((Integer) result.get("isPaintBook"));
slv.setIsCooperationBook((Integer) result.get("isCooperationBook"));
if (result.get("departmentId") != null) {
slv.setDepartment((Integer) result.get("departmentId"));
}
List<String> applyUserIds =(List)result.get("userId");
if(applyUserIds!=null) {
for(int i=0;i<applyUserIds.size();i++) {
if(userid.equals(applyUserIds.get(i))) {
// 判断是否能下载
slv.setDownload(Integer.parseInt(((List<String>)result.get("download")).get(i)));
}
}
}
// 判断是否能下载
if (slv.getDownload() == null || slv.getDownload() != 1) {
if (deptIdList.contains(slv.getDepartment())) {
slv.setDownload(1);
}else {
slv.setDownload(0);
}
}
// 高亮
Map<String, List<String>> map = highlight.get(result.get("id"));
List<String> namelist = map.get("name");
if (namelist != null && namelist.size() > 0) {
slv.setName(namelist.get(0));
}
list.add(slv);
}
PageInfo<SolrListVo> page = new PageInfo<SolrListVo>();
page.setList(list);
page.setPageNum(pageParam.getPageNum());
page.setPageSize(pageParam.getPageSize());
page.setTotal(results.getNumFound());
return CallBack.success(page);
} catch (Exception e) {
e.printStackTrace();
throw new BaseException("查询失败");
}
}
@ApiOperation(value = "全文更新索引", notes = "全文更新索引")
@GetMapping(value = WorksRequestPath.ADDALL)
public CallBack<String> commandIndex() {
String result = "0";
SolrQuery sq = new SolrQuery();
sq.set("qt", "/dataimport");
sq.set("command", "full-import");
try {
client.query(sq);
client.commit();
result = "1";
} catch (Exception e) {
throw new BaseException("索引创建失败...");
}
return CallBack.success(result);
}
@ApiOperation(value = "增量更新索引", notes = "增量更新索引")
@GetMapping(value = WorksRequestPath.ADDSOME)
public CallBack<String> updateDeltaIndex() {
String result = "0";
SolrQuery sq = new SolrQuery();
sq.set("qt", "/dataimport");
sq.set("command", "delta-import");
try {
client.query(sq);
client.commit();
result = "1";
} catch (Exception e) {
throw new BaseException("增量更新索引失败");
}
return CallBack.success(result);
}
}
/**
* @author niguanghui
* @date 2019年1月11日 下午3:44:46
*/
package com.zrqx.works.bg.mapper.apply;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.model.works.apply.Apply;
/**
* @author niguanghui
* @date 2019年1月11日下午3:44:46
*/
@Mapper
public interface ApplyMapper extends BaseMapper<Apply>{
/** 通过状态没有过期的数据*/
@Select("<script>"
+ "select * from wor_apply "
+ "where id = #{id} and examineTime > DATE_SUB(NOW(), INTERVAL 2 DAY)"
+ "</script>")
List<Apply> selectValid(Integer id);
}
/**
* @author niguanghui
* @date 2019年1月11日 下午4:45:48
*/
package com.zrqx.works.bg.mapper.apply;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.zrqx.core.form.works.bg.apply.ApplyRecordForm;
import com.zrqx.core.form.works.bg.apply.ApplyResourceForm;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.model.works.apply.ApplyResource;
import com.zrqx.core.util.PageParam;
import com.zrqx.core.vo.works.apply.ApplyRecordVo;
/**
* @author niguanghui
* @date 2019年1月11日下午4:45:48
*/
@Mapper
public interface ApplyResourceMapper extends BaseMapper<ApplyResource>{
/** 获得资源id和资源类型*/
@Select("<script>"
+ "select resourceId,resourceType "
+ "from wor_apply_resource "
+ "where applyId = #{applyId} and resourceId is not null and resourceType is not null "
+ "</script>")
List<ApplyResourceForm> getIdAndType(Integer applyId);
/** 同一用户和资源,没有被驳回的资源状态和申请id*/
@Select("<script>"
+ "select status,applyId from wor_apply_resource "
+ "where userId = #{userId} and resourceId = #{resourceId} and (status = 0 or status = 1)"
+ "</script>")
List<ApplyResource> selectReject(@Param("userId")String userId, @Param("resourceId") String resourceId);
/** 获取下载记录列表*/
@Select("<script>"
+"select war.id,wa.userId as applyId,wa.applyTime,wa.examineId,wa.examineTime,"
+ "war.resourceName,file,war.download from wor_apply_resource war inner join wor_apply wa "
+ "on war.applyId=wa.id "
+ "<if test = '" + NOTBLANK + "(startTime)'>"
+ "and wa.applyTime &gt;= concat(#{startTime}, ' 00:00:00' )"
+ "</if>"
+ "<if test = '" + NOTBLANK + "(endTime)'>"
+ "and wa.applyTime &lt;= concat(#{endTime}, ' 23:59:59')"
+ "</if>"
+ "</script>")
List<ApplyRecordVo> queryByForm(ApplyRecordForm arf);
}
/**
* @author niguanghui
* @date 2019年1月11日 下午4:46:21
*/
package com.zrqx.works.bg.service.apply;
import java.util.List;
import org.springframework.data.domain.Page;
import com.zrqx.core.form.works.bg.apply.ApplyRecordForm;
import com.zrqx.core.model.works.apply.ApplyResource;
import com.zrqx.core.service.BaseService;
import com.zrqx.core.util.PageInfo;
import com.zrqx.core.util.PageParam;
import com.zrqx.core.vo.works.apply.ApplyRecordVo;
import com.zrqx.core.vo.works.apply.QueryResourceVo;
/**
* @author niguanghui
* @date 2019年1月11日下午4:46:21
*/
public interface ApplyResourceService extends BaseService<ApplyResource, Integer> {
/** 查询申请Id下的申请资源-类型和名称 */
List<QueryResourceVo> page(Integer applyId);
/** 同一用户和资源,没有被驳回的资源状态和申请id*/
List<ApplyResource> selectReject(String userId, String resourceId);
/** 获取下载记录列表*/
PageInfo<ApplyRecordVo> queryByForm(ApplyRecordForm arf, PageParam pageParam);
}
/**
* @author niguanghui
* @date 2019年1月11日 下午4:46:57
*/
package com.zrqx.works.bg.service.apply;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.form.works.bg.apply.ApplyRecordForm;
import com.zrqx.core.form.works.bg.apply.ApplyResourceForm;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.model.works.apply.ApplyResource;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.util.PageInfo;
import com.zrqx.core.util.PageParam;
import com.zrqx.core.vo.resource.animationlibrary.AnimationLibraryListVO;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
import com.zrqx.core.vo.works.apply.ApplyRecordVo;
import com.zrqx.core.vo.works.apply.QueryResourceVo;
import com.zrqx.works.bg.client.sysuser.SysuserClient;
import com.zrqx.works.bg.mapper.apply.ApplyResourceMapper;
/**
* @author niguanghui
* @date 2019年1月11日下午4:46:57
*/
@Service
public class ApplyResourceServiceImpl extends BaseServiceImpl<ApplyResource, Integer> implements ApplyResourceService {
@Autowired
private SolrClient client;
@Autowired
private ApplyResourceMapper mapper;
@Autowired
private ApplyResourceService resourceMapper;
@Autowired
private SysuserClient sysuserClient;
@Override
public BaseMapper<ApplyResource> getMapper() {
return mapper;
}
/** 查询申请Id下的申请资源-类型和名称 */
@Override
public List<QueryResourceVo> page(Integer applyId) {
List<ApplyResourceForm> list = mapper.getIdAndType(applyId);
List<QueryResourceVo> voList = new ArrayList<QueryResourceVo>();
for (ApplyResourceForm ar : list) {
SolrQuery sq = new SolrQuery();
StringBuffer sb = new StringBuffer();
QueryResourceVo arVo = new QueryResourceVo();
sb.append("id:" + ar.getResourceId());
sq.setQuery(sb.toString());
sq.set("sq", "resourceType:" + ar.getResourceType());
QueryResponse queryResponse;
try {
queryResponse = client.query(sq);
} catch (Exception e) {
e.printStackTrace();
throw new BaseException(7, "查询内容失败");
}
SolrDocumentList results = queryResponse.getResults();
for (SolrDocument result : results) {
arVo.setName((String) result.get("name"));
arVo.setResourceType((Integer) result.get("resourceType"));
}
arVo.setResourceId(ar.getResourceId());
voList.add(arVo);
}
return voList;
}
/** 同一用户和资源,没有被驳回的资源状态和申请id */
@Override
public List<ApplyResource> selectReject(String userId, String resourceId) {
return mapper.selectReject(userId, resourceId);
}
@Override
public PageInfo<ApplyRecordVo> queryByForm(ApplyRecordForm arf, PageParam pageParam) {
pageParam.setOrderBy("applyTime desc");
startPage(pageParam);
List<ApplyRecordVo> arvList = mapper.queryByForm(arf);
arvList.forEach(item ->{
UserVO applyUser = sysuserClient.getUserById(item.getApplyId()).getData();
UserVO examineUser = sysuserClient.getUserById(item.getExamineId()).getData();
if(applyUser!=null) {
item.setApplyName(applyUser.getUserName());
if(applyUser.getDeptList().size()>0) {
item.setApplyDept(applyUser.getDeptList().get(0).getDeptName());
}
}
if(examineUser!=null) {
item.setExamineName(examineUser.getUserName());
if(examineUser.getDeptList().size()>0) {
item.setExamineDept(examineUser.getDeptList().get(0).getDeptName());
}
}
});
return new PageInfo<ApplyRecordVo>(arvList);
}
}
/**
* @author niguanghui
* @date 2019年1月11日 下午3:45:32
*/
package com.zrqx.works.bg.service.apply;
import java.util.List;
import com.zrqx.core.model.works.apply.Apply;
import com.zrqx.core.service.BaseService;
import com.zrqx.core.vo.works.apply.ApplyDetailsVo;
/**
* @author niguanghui
* @date 2019年1月11日下午3:45:32
*/
public interface ApplyService extends BaseService<Apply, Integer> {
/** 根据ID查看申请详情-申请id */
ApplyDetailsVo selectById(Integer oid);
/** 是否可以下载资源 --1:可以*/
Integer examine(String resourceId, String userId);
/** 通过状态没有过期的数据*/
List<Apply> selectValid(Integer applyId);
}
/**
* @author niguanghui
* @date 2019年1月11日 下午3:46:16
*/
package com.zrqx.works.bg.service.apply;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example.Criteria;
import com.zrqx.core.enums.works.apply.StatusEnum;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.model.works.apply.Apply;
import com.zrqx.core.model.works.apply.ApplyResource;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.core.util.CallBack;
import com.zrqx.core.vo.sysuser.bg.user.UserVO;
import com.zrqx.core.vo.works.apply.ApplyDetailsVo;
import com.zrqx.core.vo.works.apply.ApplyResourceVo;
import com.zrqx.core.vo.works.apply.ApplyVo;
import com.zrqx.core.vo.works.apply.ExamineVo;
import com.zrqx.works.bg.client.sysuser.SysuserClient;
import com.zrqx.works.bg.mapper.apply.ApplyMapper;
/**
* @author niguanghui
* @date 2019年1月11日下午3:46:16
*/
@Service
public class ApplyServiceImpl extends BaseServiceImpl<Apply, Integer> implements ApplyService {
@Autowired
private SolrClient client;
@Autowired
private ApplyMapper mapper;
@Autowired
private ApplyResourceService resourceMapper;
@Autowired
private SysuserClient sysuserClient;
@Override
public BaseMapper<Apply> getMapper() {
return mapper;
}
@Override
public ApplyDetailsVo selectById(Integer oid) {
// 申请
ApplyDetailsVo vo = new ApplyDetailsVo();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Apply apply = mapper.selectByPrimaryKey(oid);
CallBack<UserVO> applyUser = sysuserClient.getUserById(apply.getUserId());
ApplyVo applyVo = new ApplyVo();
applyVo.setId(oid);
applyVo.setTopImg(applyUser.getData().getTopImg());
applyVo.setUserName(applyUser.getData().getUserName());
applyVo.setDept(applyUser.getData().getDeptList());
applyVo.setApplyTime(sdf.format(apply.getApplyTime()));
applyVo.setReason(apply.getReason());
applyVo.setStatus(apply.getStatus());
vo.setApply(applyVo);
if (apply.getStatus() == StatusEnum.AUDITPASS.getCode()
|| apply.getStatus() == StatusEnum.NOT_AUDITPASS.getCode()) {
String examineId = apply.getExamineId();
ExamineVo examineVo = new ExamineVo();
if (null != examineId) {
CallBack<UserVO> examineUser = sysuserClient.getUserById(examineId);
if (examineUser != null && examineUser.getData() != null) {
examineVo.setUserName(examineUser.getData().getName());
examineVo.setExamineTime(sdf.format(apply.getExamineTime()));
examineVo.setDept(examineUser.getData().getDeptList());
examineVo.setOpinion(apply.getOpinion());
}
}
vo.setExamine(examineVo);
}
// 资源
Criteria rs = resourceMapper.createCriteria();
rs.andEqualTo("applyId", oid);
List<ApplyResource> list = resourceMapper.selectByCriteria();
List<ApplyResourceVo> voList = new ArrayList<ApplyResourceVo>();
for (ApplyResource ar : list) {
SolrQuery sq = new SolrQuery();
StringBuffer sb = new StringBuffer();
ApplyResourceVo arVo = new ApplyResourceVo();
sb.append("id:" + ar.getResourceId());
sq.setQuery(sb.toString());
sq.set("sq", "resourceType:" + ar.getResourceType());
QueryResponse queryResponse;
try {
queryResponse = client.query(sq);
} catch (Exception e) {
e.printStackTrace();
throw new BaseException(7, "查询内容失败");
}
SolrDocumentList results = queryResponse.getResults();
for (SolrDocument result : results) {
arVo.setName((String) result.get("name"));
arVo.setResourceType((Integer) result.get("resourceType"));
arVo.setIsbn((String) result.get("isbn"));
arVo.setEditionNum((String) result.get("edition"));
arVo.setUploadTime((Date) result.get("uploadTime"));
arVo.setResourceId((String)result.get("id"));
arVo.setFile(apply.getFile());
}
voList.add(arVo);
}
vo.setList(voList);
return vo;
}
@Override
public Integer examine(String resourceId, String userId) {
Integer status = 0;
Criteria cr = resourceMapper.createCriteria();
cr.andEqualTo("resourceId", resourceId);
cr.andEqualTo("userId", userId);
List<ApplyResource> arList = resourceMapper.selectByCriteria();
if (null != arList && !arList.isEmpty()) {
for (ApplyResource ar : arList) {
if (ar.getStatus() == StatusEnum.AUDITPASS.getCode()) {
List<Apply> eList = mapper.selectValid(ar.getApplyId());
if (null != eList && !eList.isEmpty()) {
status = StatusEnum.AUDITPASS.getCode();
}
}
}
}
return status;
}
@Override
public List<Apply> selectValid(Integer id) {
return mapper.selectValid(id);
}
}
package com.zrqx.works.commons;
import java.io.IOException;
import java.util.Enumeration;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.zrqx.core.enums.ResponseCodeEnum;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.model.sysuser.user.User;
import com.zrqx.core.util.JsonUtil.JsonUtil;
/**
* Redis消息管理 ,调用时不能用多线程调用
* @author lpf
* @date 2018年6月5日上午10:03:01
*/
@Component
public class Redis {
private static final String FG_TOKEN = "y-token";
private static final String BG_TOKEN = "x-token";
@Autowired
StringRedisTemplate stringRedisTemplate;
public void updateDatebase(int num) {
JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) stringRedisTemplate.getConnectionFactory();
jedisConnectionFactory.setDatabase(num);
stringRedisTemplate.setConnectionFactory(jedisConnectionFactory);
}
/**
* 获取后台登录用户信息
*
* @return
*/
public User getUser() {
return getInfoObjectRedis(getToken(BG_TOKEN), User.class);
}
public String fmtObj(Object obj) throws IOException {
return obj instanceof String ? obj.toString():JsonUtil.bean2Json(obj);
}
/**
* 添加到redis
* @param token
* Key
* @param obj
* Value
* @param timeout
* 过期时间
* @param unit
* TimeUnitEnum 时间格式
* @throws IOException
*/
public void set(String token, Object obj, long timeout,TimeUnit unit) throws IOException {
stringRedisTemplate.opsForValue().set(token,fmtObj(obj),timeout,unit);
}
public void set(String token, Object obj, long timeout) throws IOException {
stringRedisTemplate.opsForValue().set(token,fmtObj(obj),timeout,TimeUnit.SECONDS);
}
/**
* 添加到redis
* @param token Key
* @param obj Value
* @throws IOException
*/
public void set(String token,Object obj) throws IOException{
stringRedisTemplate.opsForValue().set(token,fmtObj(obj));
}
/**
* 根据key删除redis中的数据
* @param key
* @throws IOException
*/
public void delete(String key) throws IOException{
stringRedisTemplate.delete(key);
}
/**
* 根据key查询redis中的数据
*
* @param token
* @return
*/
public String get(String token) {
return stringRedisTemplate.opsForValue().get(token);
}
public <T> T getInfoObjectRedis(String key,Class<T> objClass){
try {
String userInfo = get(key);
if(StringUtils.isEmpty(userInfo)) {
throw new BaseException(ResponseCodeEnum.NO_LOGIN);
}
return JsonUtil.json2Bean(userInfo, objClass);
} catch (Exception e) {
throw new BaseException("获取用户信息错误!"+e.getMessage());
}
}
public static String getToken(String tokenName){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
String token = null;
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
//TODO--前台获取token
if(key.toLowerCase().equals(tokenName)){
token=request.getHeader(key);
}
}
if (token == null) {
throw new BaseException(ResponseCodeEnum.NO_LOGIN);
}
return token;
}
public static String getBgToken(){
return getToken(BG_TOKEN);
}
public static String getFgToken(){
return getToken(FG_TOKEN);
}
}
package com.zrqx.works.commons.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.CrossOrigin;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* 访问地址
* http://ip:port/swagger-ui.html
最常用的5个注解
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
其它若干
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiClass
@ApiError
@ApiErrors
@ApiParamImplicit
@ApiParamsImplicit
*/
@EnableSwagger2
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
//添加head参数start
ParameterBuilder tokenPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<Parameter>();
tokenPar.name("y-token").description("y令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
pars.add(tokenPar.build());
tokenPar.name("x-token").description("x令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
pars.add(tokenPar.build());
//添加head参数end
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包路径
.apis(RequestHandlerSelectors.basePackage("com.zrqx"))
.paths(PathSelectors.any())
.build()
.globalOperationParameters(pars);
}
//构建 api文档的详细信息函数
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("sysUser 测试使用 Swagger2 构建RESTful API")
//描述
.description("sysUser服务 API 描述")
//创建人
.contact(new Contact("陈新昌", "www.baidu.com", "cxinchang@126.com"))
//版本号
.version("3.0")
.build();
}
}
\ No newline at end of file
package com.zrqx.works.commons.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.zrqx.core.constant.sysuser.SysUserRequestPath;
import com.zrqx.works.commons.interceptor.InterceptorConfig;
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
/**
* 跨域支持
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowCredentials(false).maxAge(3600);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new InterceptorConfig()).addPathPatterns(SysUserRequestPath.BG + "/**")
.excludePathPatterns(SysUserRequestPath.BG+SysUserRequestPath.PERMISSIONS+SysUserRequestPath.LOGIN);
}
}
\ No newline at end of file
package com.zrqx.works.commons.interceptor;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.CallBack;
/**
*controller 异常处理
* @ClassName: CustomExceptionHandler
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 杨振广
* @date 2016-7-14 上午9:45:40
*
*/
@ControllerAdvice
public class CustomExceptionHandler {
private static Logger logger = Logger.getLogger(CustomExceptionHandler.class);
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request,HttpServletResponse response,Exception e){
e.printStackTrace();
StackTraceElement[] s = e.getStackTrace();
StringBuffer stes = new StringBuffer(s.length*2);
for (StackTraceElement stackTraceElement : s) {
stes.append(stackTraceElement.toString());
stes.append("<br/>");
}
String info = "异常时间:"+new Date().toLocaleString()+"\n请求地址:"+request.getRequestURI()+"\n参数:"+request.getQueryString()+"\n"+e.getMessage();
logger.error(info+"\n"+stes.toString());
request.setAttribute("error",info);
request.setAttribute("errorInfo",e.getStackTrace());
return CallBack.exception(e.getMessage());
}
/**
* 参数验证异常处理
* @Title: handlerException
* @Description:
* @param request
* @param response
* @param e BindException
* @return
* @author lpf
* @date: 2018年5月9日 下午5:01:58
*/
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object handlerException(HttpServletRequest request,HttpServletResponse response,BindException e) {
List<ObjectError> errors = e.getAllErrors();
StringBuffer msg = new StringBuffer();
for (ObjectError objectError : errors) {
msg.append(objectError.getDefaultMessage());
msg.append(",");
}
msg.deleteCharAt(msg.length()-1);
return CallBack.validate(msg.toString());
}
/**
* 执行异常处理
* @Description:
* @param e BaseException
* @return
* @date: 2018年5月9日 下午5:01:58
*
*/
@ExceptionHandler(BaseException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object myException(BaseException e) {
return CallBack.exception(e.getCode(),null,e.getMessage());
}
}
\ No newline at end of file
package com.zrqx.works.commons.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* Feign配置
* 使用FeignClient进行服务间调用,传递headers信息
* @author lw
* @date 2018年10月17日下午2:48:44
*/
@Component
@Configuration
public class FeignHeaderInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
// 前台token
if(request.getHeader("Y-Token") != null){
requestTemplate.header("Y-Token", request.getHeader("Y-Token"));
}
// 后台token
if(request.getHeader("X-Token") != null){
requestTemplate.header("X-Token", request.getHeader("X-Token"));
}
}
}
}
package com.zrqx.works.commons.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class InterceptorConfig implements HandlerInterceptor{
private static final Logger log = LoggerFactory.getLogger(InterceptorConfig.class);
/**
* 进入controller层之前拦截请求
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
HttpSession session = httpServletRequest.getSession();
if(session.getAttribute("user") != null){
return true;
}
else{
// PrintWriter printWriter = httpServletResponse.getWriter();
// printWriter.write(JsonUtil.bean2Json(CallBack.create(ResponseCodeEnum.NO_LOGIN)));
// return false;
return true;
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
log.info("--------------处理请求完成后视图渲染之前的处理操作---------------");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
log.info("---------------视图渲染之后的操作--------------------------");
}
}
\ No newline at end of file
package com.zrqx.works.commons.interceptor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.zrqx.core.model.sysuser.log.Log;
import com.zrqx.core.util.LogUtils;
import com.zrqx.works.bg.client.sysuser.SysuserClient;
import com.zrqx.works.commons.Redis;
import io.swagger.annotations.ApiOperation;
@Aspect
@Component
public class LogAspect {
@Autowired
private SysuserClient logService;
@Autowired
private Redis redis;
// 环绕通知,环绕增强,相当于MethodInterceptor
@Around(value = "execution(* com.zrqx.works.bg.controller..*(..)) and @annotation(annotation) and @annotation(org.springframework.web.bind.annotation.PostMapping)", argNames="annotation")
public Object arround(ProceedingJoinPoint pjp, ApiOperation annotation) throws Throwable {
Log log = LogUtils.getLog(pjp, annotation, this.getClass(), redis.getUser().getName(), redis.getUser().getIp());
logService.saveLog(log);
return log.getResult();
}
}
\ No newline at end of file
package com.zrqx.works.commons.interceptor;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
/**
* Created by guozp on 2017/8/28.
*/
@Aspect
//@Component 事务依然生效
@Configuration
public class TxAdviceInterceptor {
private static final int TX_METHOD_TIMEOUT = 5;
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.zrqx..service..*Impl.*(..))";
@Autowired
private PlatformTransactionManager transactionManager;
// 其中 dataSource 框架会自动为我们注入
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionInterceptor txAdvice() {
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
/*只读事务,不做更新操作*/
RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
readOnlyTx.setReadOnly(true);
readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED );
/*当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务*/
RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
requiredTx.setRollbackRules(
Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
requiredTx.setTimeout(TX_METHOD_TIMEOUT);
Map<String, TransactionAttribute> txMap = new HashMap<>();
txMap.put("add*", requiredTx);
txMap.put("save*", requiredTx);
txMap.put("insert*", requiredTx);
txMap.put("update*", requiredTx);
txMap.put("delete*", requiredTx);
txMap.put("get*", readOnlyTx);
txMap.put("query*", readOnlyTx);
source.setNameMap( txMap );
TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
return txAdvice;
}
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
//return new DefaultPointcutAdvisor(pointcut, txAdvice);
}
}
\ No newline at end of file
package com.zrqx.works.commons.util;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.springframework.beans.BeanUtils;
import com.zrqx.core.exception.BaseException;
public class Copy {
/**
* 批量复制对象
*
* @param list
* @param clazz
* @return
*/
public static <VO, R> List<VO> copyList(List<R> list, Class<VO> clazz) {
return list.stream().map(obj -> {
VO vo = null;
try {
vo = clazz.newInstance();
BeanUtils.copyProperties(obj, vo);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new BaseException("批量复制对象时创建对象失败。");
}
return vo;
}).collect(Collectors.toList());
}
/**
* 过滤批量复制对象
*
* @param list
* @param clazz
* @param filter
* @return
*/
public static <VO, R> List<VO> copyList(List<R> list, Class<VO> clazz, Predicate<R> filter) {
return list.stream().filter(filter).map(obj -> {
VO vo = null;
try {
vo = clazz.newInstance();
BeanUtils.copyProperties(obj, vo);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new BaseException("批量复制对象时创建对象失败。");
}
return vo;
}).collect(Collectors.toList());
}
}
package com.zrqx.works.commons.util;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Stream;
public class MapSort {
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map, boolean asc) {
Map<K, V> result = new LinkedHashMap<>();
Stream<Entry<K, V>> stream = map.entrySet().stream();
if (asc) // 升序
{
// stream.sorted(Comparator.comparing(e -> e.getValue()))
stream.sorted(Map.Entry.<K, V> comparingByValue())
.forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
} else // 降序
{
// stream.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
stream.sorted(Map.Entry.<K, V> comparingByValue().reversed()).forEachOrdered(
e -> result.put(e.getKey(), e.getValue()));
}
return result;
}
public static <K extends Comparable<? super K>, V> Map<K, V> sortByKey(Map<K, V> map, boolean asc) {
Map<K, V> result = new LinkedHashMap<>();
Stream<Entry<K, V>> stream = map.entrySet().stream();
if (asc) {
stream.sorted(Map.Entry.<K, V> comparingByKey()).forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
} else {
stream.sorted(Map.Entry.<K, V> comparingByKey().reversed()).forEachOrdered(
e -> result.put(e.getKey(), e.getValue()));
}
return result;
}
}
package com.zrqx.works.commons.util;
public class SysuserUtil {
/**
* 获取当前登录的系统管理员账号
*/
public static String getSysuserAccount(){
return "test";
}
/**
* 获取当前登录的系统管理员的ip
*/
public static String getSysuserIP(){
return "127.0.0.1";
}
}
package com.zrqx.works.commons.util;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.zrqx.core.exception.BaseException;
@Component
public class Task {
@Autowired
private SolrClient client;
//全文更新索引
@Scheduled(cron = "0 0 1 * * ?")
public void commandIndex() {
SolrQuery sq = new SolrQuery();
sq.set("qt", "/dataimport");
sq.set("command", "full-import");
try {
client.query(sq);
client.commit();
System.out.println("全文索引更新成功");
} catch (Exception e) {
throw new BaseException("索引创建失败...");
}
}
//增量更新索引
@Scheduled(cron = "0 0 */1 * * ?")
public void updateDeltaIndex() {
SolrQuery sq = new SolrQuery();
sq.set("qt", "/dataimport");
sq.set("command", "delta-import");
try {
client.query(sq);
client.commit();
System.out.println("增量索引更新成功");
} catch (Exception e) {
throw new BaseException("增量更新索引失败");
}
}
}
security:
sessions: always #always设置保存用户状态(内存可能会被占满) stateless设置不保存用户状态
basic:
enabled: false #开启认证
user:
name: user
password: 123456
feign:
hystrix:
enabled: true
logging:
level:
com.zrqx.works.bg.mapper: DEBUG
mybatis:
type-aliases-package: com.zrqx.core.model
mapper:
mappers:
- com.zrqx.core.mapper.BaseMapper
not-empty: false
i-d-e-n-t-i-t-y: MYSQL
style: normal
b-e-f-o-r-e: true
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
http:
multipart:
maxFileSize: 20Mb
maxRequestSize: 20Mb
ribbon:
connectionRequestTimeout: 600000
ConnectTimeout: 600000
ReadTimeout: 600000
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 1200000
\ No newline at end of file
server:
port: 8314
spring:
cloud:
config:
uri: http://localhost:8318 #配置中心地址
name: works
profile: prod
label: master
data:
solr:
#host: http://admin:admin@192.168.0.210:8983/solr/hxnrgl
host: http://admin:admin@192.168.2.234:8983/solr/hxnrgl
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
debug="false" scan="true" scanPeriod="30 second">
<!--读取配置中心的属性-->
<springProperty scope="context" name="name" source="spring.application.name"/>
<property name="ROOT" value="/opt/logs/nrgl/${name}/" />
<property name="FILESIZE" value="50MB" />
<property name="MAXHISTORY" value="100" />
<property name="DATETIME" value="yyyy-MM-dd HH:mm:ss" />
<!-- 控制台打印 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
</appender>
<!-- ERROR 输入到文件,按日期和文件大小 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- WARN 输入到文件,按日期和文件大小 -->
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- INFO 输入到文件,按日期和文件大小 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- DEBUG 输入到文件,按日期和文件大小 -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- TRACE 输入到文件,按日期和文件大小 -->
<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- SQL相关日志输出-->
<logger name="org.mybatis.spring" level="DEBUG" additivity="true" />
<logger name="com.zrqx.works" level="DEBUG" additivity="true" />
<!-- Logger 根目录 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="DEBUG" />
<appender-ref ref="ERROR" />
<appender-ref ref="WARN" />
<appender-ref ref="INFO" />
<appender-ref ref="TRACE" />
</root>
</configuration>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论