commit cd11e20b1cdd6917ff03f62411a478079d0194e7
Author: zhouyuan777/zhouyuan777 <1069065057@qq.com>
Date: Mon Jul 5 16:26:11 2021 +0800
transfer
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..9e2c97b
Binary files /dev/null and b/.DS_Store differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d8835fb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,28 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+*.iml
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+.idea
+target/
+upload
diff --git a/bin/run-web.sh b/bin/run-web.sh
new file mode 100644
index 0000000..567d2b5
--- /dev/null
+++ b/bin/run-web.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+cd $PWD
+pid=$(ps -ef | grep rddb.jar | grep -v grep | awk '{print $2}')
+if [ -n "$pid" ]; then
+ kill -9 $pid
+fi
+
+# 优化JVM参数
+JAVA_OPTS="$MAVEN_OPTS -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
+
+# 方式一、配置外部自定义的属性文件(建议)
+# JAVA_OPTS="$JAVA_OPTS -Dspring.config.location=$PWD\application.properties"
+
+# 方式二、配置环境名称,加载不同的属性文件
+# JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"
+
+if [ -z "$JAVA_HOME" ]; then
+ RUN_JAVA=java
+else
+ RUN_JAVA="$JAVA_HOME"/bin/java
+fi
+
+# 根据情况修改 web.war 为您的 war 包名称
+nohup $RUN_JAVA $JAVA_OPTS -jar rddb.jar > system.log 2>&1 &
+
+sleep 1
+pid=$(ps -ef | grep rddb.jar | grep -v grep | awk '{print $2}')
+echo $pid
\ No newline at end of file
diff --git a/bin/update.sh b/bin/update.sh
new file mode 100644
index 0000000..1afd64d
--- /dev/null
+++ b/bin/update.sh
@@ -0,0 +1,8 @@
+_pwd=/mnt/rd.ydool.org
+_ip=122.112.240.73
+
+cd ../
+mvn clean package
+scp target/build/*.jar root@${_ip}:${_pwd}
+#scp target/build/lib/*.* root@${_ip}:${_pwd}/lib
+ssh root@${_ip} "cd ${_pwd}; sh ./start.sh"
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..47faa3a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,268 @@
+
+
+ 4.0.0
+
+ com.ydool.boot.modules.rddb
+ ydool-rddb
+ 1.0-SNAPSHOT
+
+
+ com.ydool.boot
+ ydool-boot
+ 1.0.0-SNAPSHOT
+
+
+
+ ${project.artifactId}-${project.version}
+ target/build
+
+
+
+
+ com.ydool.boot
+ ydool-boot-module
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ com.baomidou
+ mybatis-plus-generator
+ 3.3.2
+
+
+ com.alibaba
+ fastjson
+ 1.2.58
+
+
+ cn.hutool
+ hutool-extra
+ ${hutool.version}
+
+
+
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+ 2.0.5
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.0.6
+
+
+ com.aliyun
+ aliyun-java-sdk-dysmsapi
+ 1.1.0
+
+
+
+
+ org.springframework.data
+ spring-data-redis
+ 2.3.4.RELEASE
+
+
+ redis.clients
+ jedis
+ 3.3.0
+
+
+
+ org.jsoup
+ jsoup
+ 1.11.2
+
+
+
+ com.alibaba.platform.shared
+ xxpt.gateway.shared.client
+ 1.0
+
+
+
+ joda-time
+ joda-time
+ 2.10
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+
+ lib/
+
+ false
+
+ com.ydool.boot.Application
+
+
+
+ ./resources/
+
+
+ ${project.build.directory}
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/lib/
+
+
+
+
+
+
+ maven-resources-plugin
+
+
+
+ copy-resources
+ package
+
+ copy-resources
+
+
+
+
+ src/main/resources
+
+ *.properties
+ *.xml
+ *.yml
+
+
+ *.jar
+
+
+
+ ${project.build.directory}/resources
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.1.7.RELEASE
+
+
+
+
+ null
+ null
+
+
+ ZIP
+
+ true
+ ${project.build.directory}/resources
+
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ package
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ aliyun-repos
+ https://maven.aliyun.com/repository/public
+ true
+ false
+
+
+ ydool-repos
+ https://devrepo.devcloud.cn-east-3.huaweicloud.com/04/nexus/content/repositories/9c507cc7f48c41b886f10a07a3b5fe45_1_0/
+
+
+
+
+ aliyun-repos
+ https://maven.aliyun.com/repository/public
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/ydool/boot/Application.java b/src/main/java/com/ydool/boot/Application.java
new file mode 100644
index 0000000..4eafc72
--- /dev/null
+++ b/src/main/java/com/ydool/boot/Application.java
@@ -0,0 +1,13 @@
+package com.ydool.boot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/config/SwaggerConfig.java b/src/main/java/com/ydool/boot/api/config/SwaggerConfig.java
new file mode 100644
index 0000000..62fa2c8
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/config/SwaggerConfig.java
@@ -0,0 +1,63 @@
+package com.ydool.boot.api.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import com.google.common.collect.Lists;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.List;
+
+
+@Configuration
+@EnableSwagger2
+@EnableKnife4j
+public class SwaggerConfig {
+
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.ydool.boot.api"))
+ .paths(PathSelectors.any())
+ .build().securityContexts(Lists.newArrayList(securityContext())).securitySchemes(Lists.newArrayList(apiKey()));
+ }
+
+ /**
+ * 添加摘要信息
+ */
+ private ApiInfo apiInfo() {
+ // 用ApiInfoBuilder进行定制
+ return new ApiInfoBuilder()
+ // 设置标题
+ .title("api")
+ .build();
+ }
+
+ private ApiKey apiKey() {
+ return new ApiKey("XToken", "x-token", "header");
+ }
+
+ private SecurityContext securityContext() {
+ return SecurityContext.builder()
+ .securityReferences(defaultAuth())
+ .forPaths(PathSelectors.regex("/.*"))
+ .build();
+ }
+
+ List defaultAuth() {
+ AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+ AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+ authorizationScopes[0] = authorizationScope;
+ return Lists.newArrayList(new SecurityReference("BearerToken", authorizationScopes));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/config/WebMvcConfig.java b/src/main/java/com/ydool/boot/api/config/WebMvcConfig.java
new file mode 100644
index 0000000..a3b6bcd
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/config/WebMvcConfig.java
@@ -0,0 +1,15 @@
+package com.ydool.boot.api.config;
+
+import com.ydool.boot.api.filter.ReferInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new ReferInterceptor()).addPathPatterns("/api/**");
+ }
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiActivityController.java b/src/main/java/com/ydool/boot/api/controller/ApiActivityController.java
new file mode 100644
index 0000000..c6f42d1
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiActivityController.java
@@ -0,0 +1,626 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.mybatis.Condition;
+import com.ydool.boot.modules.rddb.entity.*;
+import com.ydool.boot.modules.rddb.service.*;
+import com.ydool.boot.modules.rddb.vo.ActivityCommentVO;
+import com.ydool.boot.modules.rddb.vo.ActivityUserVO;
+import com.ydool.boot.modules.rddb.vo.ActivityVO;
+import com.ydool.boot.modules.rddb.wrapper.ActivityAuditUserWrapper;
+import com.ydool.boot.modules.rddb.wrapper.ActivityCommentWrapper;
+import com.ydool.boot.modules.rddb.wrapper.ActivityUserWrapper;
+import com.ydool.boot.modules.rddb.wrapper.ActivityWrapper;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 活动
+ *
+ * @author chenchen
+ * @date 2020/10/12
+ */
+@Controller
+@RequestMapping("/api/activity")
+@Api(value = "活动", tags = "活动")
+public class ApiActivityController extends ApiBaseController {
+
+ @Autowired
+ private ActivityService activityService;
+
+ @Autowired
+ private ActivityCommentService activityCommentService;
+
+ @Resource
+ private ActivityUserService activityUserService;
+
+ @Resource
+ private ActivityAuditUserService activityAuditUserService;
+
+ @Resource
+ private UserService userService;
+
+ @Resource
+ private MessageService messageService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称"),
+ @ApiImplicitParam(name = "status", value = "审核状态0待审核、1审核通过、2审核拒绝;不传查所有"),
+ @ApiImplicitParam(name = "end", value = "活动结束标记 0未结束 1结束;不传查所有"),
+ @ApiImplicitParam(name = "category", value = "活动类别 字典 activity_category中的数字值"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = ActivityVO.class)
+ })
+ @ApiOperation("所有活动")
+ @GetMapping("/list")
+ public void activityList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityName, String status, Integer end,String category) {
+ QueryWrapper qw = getQueryWrapper(activityName, status, end,category);
+ IPage paged = activityService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(ActivityWrapper.build().pageVO(paged)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = ActivityVO.class)
+ })
+ @ApiOperation("我发布的")
+ @GetMapping("/list/my")
+ public void activityListMy(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityName) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(activityName, "activity_name#like", qw);
+ qw.eq("created_id", getApiUserId());
+ qw.orderByDesc("activity_date");
+ IPage paged = activityService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(ActivityWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperationSupport(
+ responses = @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = ActivityVO.class)
+ })
+ )
+ @ApiOperation("活动详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void activity(@PathVariable("id") String id) {
+ Activity bean = activityService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该活动"));
+ return;
+ }
+ ActivityVO vo = ActivityWrapper.build().entityVO(bean);
+ ActivityUser auditUser = activityUserService.getOne(new QueryWrapper().eq("activity_id", id).eq("user_id", getApiUserId()));
+ if (auditUser != null) {
+ vo.setIsApply(auditUser.getIsApply());
+ vo.setApplyTime(auditUser.getApplyTime());
+ vo.setIsLeave(auditUser.getIsLeave());
+ vo.setLeaveTime(auditUser.getLeaveTime());
+ vo.setIsSign(auditUser.getIsSign());
+ vo.setSignTime(auditUser.getSignTime());
+ }
+ //报名人数
+ int applyCount = activityUserService.count(new QueryWrapper().eq("activity_id", id).eq("is_apply", 1));
+ vo.setApplyCount(applyCount);
+ render(Ret.ok().data(vo));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "activityName", value = "活动名称", required = true),
+ @ApiImplicitParam(name = "activityDate", value = "活动时间", required = true),
+ @ApiImplicitParam(name = "activityAddress", value = "活动地点", required = true),
+ @ApiImplicitParam(name = "activityContent", value = "活动内容", required = true),
+ @ApiImplicitParam(name = "activityArea", value = "活动接取区域"),
+ @ApiImplicitParam(name = "uploadPersonnel", value = "上传人员"),
+ @ApiImplicitParam(name = "photo", value = "图片"),
+ @ApiImplicitParam(name = "userIds", value = "审核人员,多个以英文逗号间隔"),
+ @ApiImplicitParam(name = "attachment", value = "附件")
+ })
+ @ApiOperation("发布")
+ @PostMapping("/save")
+ public void save(String activityName, String activityDate, String activityAddress, String activityContent,
+ String activityArea, String uploadPersonnel, String photo,
+ @RequestParam(name = "userIds", defaultValue = "") String userIds,String attachment) {
+ Activity bean = new Activity();
+ bean.setActivityName(activityName);
+ bean.setActivityDate(activityDate);
+ bean.setActivityAddress(activityAddress);
+ bean.setActivityContent(activityContent);
+ bean.setActivityArea(activityArea);
+ bean.setUploadPersonnel(uploadPersonnel);
+ bean.setPhoto(photo);
+ bean.setEnd(0);
+ bean.setCreatedId(getApiUserId());
+ bean.setCreatedType(getApiUser().getAccountType());
+ bean.setAttachment(attachment);
+
+ boolean flag;
+
+ if ("admin".equals(getApiUser().getAccountType())) {
+ bean.setStatus("1");
+ flag = activityService.saveOrUpdate(bean);
+ } else {
+ bean.setStatus("0");
+ flag = activityService.saveOrUpdate(bean);
+ if (flag) {
+ //保存审核人员
+ if (StrUtil.isNotBlank(userIds)) {
+ //之前指定的全删掉
+ activityAuditUserService.remove(new QueryWrapper().eq("activity_id", bean.getId()));
+ String[] uIds = userIds.split(",");
+ int count = 1;
+ for (String uId : uIds) {
+ ActivityAuditUser activityAuditUser = new ActivityAuditUser();
+ User user = userService.getById(uId);
+ if (user == null) {
+ continue;
+ }
+ activityAuditUser.setActivityId(bean.getId());
+ activityAuditUser.setActivityName(bean.getActivityName());
+ activityAuditUser.setUserId(user.getId());
+ activityAuditUser.setUserName(user.getUserName());
+ activityAuditUser.setStatus(0);
+ activityAuditUser.setSortNo(count++);
+ activityAuditUser.setCreatedId(getApiUserId());
+ boolean flaA = activityAuditUserService.saveOrUpdate(activityAuditUser);
+ //添加消息
+ if (flaA) {
+ Message message = new Message();
+ message.setActionId(bean.getId());
+ message.setTitle("您有一个活动审批,请前往查看!");
+ message.setContent(activityName);
+ message.setType(Message.TYPE_ACTIVITY);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(uId);
+ messageService.save(message);
+ }
+ }
+ }
+ }
+ }
+
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityId", value = "活动id", required = true)
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = ActivityCommentVO.class)
+ })
+ @ApiOperation("活动评论列表")
+ @GetMapping("/comment/list")
+ public void commentA(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("activity_id", activityId);
+// wrapper.eq("status", "1");
+ wrapper.orderByDesc("created_at");
+ IPage paged = activityCommentService.page(new Page<>(pageNo, pageSize), wrapper);
+ render(Ret.ok().paged(ActivityCommentWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperation("评论活动")
+ @PostMapping("/comment/save")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "activityId", value = "活动id", required = true),
+ @ApiImplicitParam(name = "content", value = "评论内容", required = true)
+ })
+ public void commentA(String activityId, String content) {
+ ActivityComment bean = new ActivityComment();
+ bean.setContent(content);
+ bean.setActivityId(activityId);
+ bean.setCreatedId(getApiUserId());
+ bean.setName(getApiUser().getUserName());
+ bean.setStatus(1);
+ boolean flag = activityCommentService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "activityId", value = "活动id", required = true)
+ })
+ @ApiOperation("报名")
+ @PostMapping("/apply")
+ public void apply(String activityId) {
+ ActivityUser bean = activityUserService.getOne(new QueryWrapper().
+ eq("activity_id", activityId).eq("user_id", getApiUserId()));
+ if (bean != null) {
+ render(Ret.fail("已报名,无需重复报名"));
+ return;
+ }
+
+ Activity activity = activityService.getById(activityId);
+
+ bean = new ActivityUser();
+ bean.setActivityId(activityId);
+ bean.setActivityName(activity.getActivityName());
+ bean.setActivityDate(activity.getActivityDate());
+ bean.setUserId(getApiUserId());
+ bean.setIsApply(1);
+ bean.setIsSign(0);
+ bean.setIsLeave(0);
+ bean.setIsPublishPerform(0);
+ bean.setCreatedId(getApiUserId());
+ bean.setApplyTime(LocalDateTime.now());
+ bean.setEnd(0);
+ boolean flag = activityUserService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "activityId", value = "活动id", required = true)
+ })
+ @ApiOperation("签到")
+ @PostMapping("/sign")
+ public void sign(String activityId) {
+ ActivityUser bean = activityUserService.getOne(new QueryWrapper().
+ eq("activity_id", activityId).eq("user_id", getApiUserId()));
+ if (bean == null) {
+ render(Ret.fail("未报名该活动,或该活动不存在"));
+ return;
+ }
+ if (bean.getIsSign().equals(1)) {
+ render(Ret.fail("已签到,无需重复签到"));
+ return;
+ }
+
+ bean.setIsSign(1);
+ bean.setUpdatedId(getApiUserId());
+ bean.setSignTime(LocalDateTime.now());
+ boolean flag = activityUserService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "activityId", value = "活动id", required = true)
+ })
+ @ApiOperation("请假")
+ @PostMapping("/leave")
+ public void leave(String activityId) {
+ ActivityUser bean = activityUserService.getOne(new QueryWrapper().
+ eq("activity_id", activityId).eq("user_id", getApiUserId()));
+ if (bean == null) {
+ render(Ret.fail("未请假该活动,或该活动不存在"));
+ return;
+ }
+ if (bean.getIsLeave().equals(1)) {
+ render(Ret.fail("已请假,无需重复请假"));
+ return;
+ }
+
+ bean.setIsLeave(1);
+ bean.setUpdatedId(getApiUserId());
+ bean.setLeaveTime(LocalDateTime.now());
+ boolean flag = activityUserService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称"),
+ @ApiImplicitParam(name = "createdType", value = "发布者账号类型 不传查全部 admin县级人大工作人员 street乡镇负责人 contact联络站负责人" +
+ "多个用 , 号分开,如:admin,street")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = ActivityUserVO.class)
+ })
+ @ApiOperation("已报名")
+ @GetMapping("/have_apply")
+ public void haveApply(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityName, String createdType) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id", getApiUserId());
+ wrapper.eq("end", 0);
+ Condition.appendIfNotEmpty(activityName, "activity_name#like", wrapper);
+ wrapper.orderByDesc("activity_date");
+
+ IPage paged = activityUserService.page(new Page<>(pageNo, pageSize), wrapper);
+ if (CollUtil.isNotEmpty(paged.getRecords())) {
+ for (ActivityUser item : paged.getRecords()) {
+ QueryWrapper qw = new QueryWrapper().eq("id", item.getActivityId());
+ if (StrUtil.isNotBlank(createdType)) {
+ String[] split = createdType.split(",");
+ qw.in("created_type", Arrays.asList(split));
+ }
+ Activity activity = activityService.getOne(qw);
+// if (activity != null) {
+// DateTime activityDate = DateUtil.parse(activity.getActivityDate(), "yyyy-MM-dd");
+// int compare = DateUtil.compare(activityDate, DateTime.now());
+// if (compare < 0) {
+// compare = 1;
+// } else {
+// compare = 0;
+// }
+// item.setIsFinish(compare + "");
+// }
+ item.setActivity(activity);
+ }
+ }
+
+ render(Ret.ok().paged(ActivityUserWrapper.build().pageVO(paged)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称"),
+ @ApiImplicitParam(name = "createdType", value = "发布者账号类型 不传查全部 admin县级人大工作人员 street乡镇负责人 contact联络站负责人" +
+ "多个用 , 号分开,如:admin,street")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = ActivityUserVO.class)
+ })
+ @ApiOperation("已结束")
+ @GetMapping("/finish")
+ public void finish(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityName, String createdType) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id", getApiUserId());
+ wrapper.eq("end", 1);
+ Condition.appendIfNotEmpty(activityName, "activity_name#like", wrapper);
+ wrapper.orderByDesc("activity_date");
+
+ IPage activityUserPage = activityUserService.page(new Page<>(pageNo, pageSize), wrapper);
+ if (CollUtil.isNotEmpty(activityUserPage.getRecords())) {
+ for (ActivityUser item : activityUserPage.getRecords()) {
+ QueryWrapper qw = new QueryWrapper().eq("id", item.getActivityId());
+ if (StrUtil.isNotBlank(createdType)) {
+ String[] split = createdType.split(",");
+ qw.in("created_type", Arrays.asList(split));
+ }
+ Activity activity = activityService.getOne(qw);
+ item.setActivity(activity);
+ }
+ }
+
+ render(Ret.ok().paged(ActivityUserWrapper.build().pageVO(activityUserPage)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称"),
+ @ApiImplicitParam(name = "createdType", value = "发布者账号类型 不传查全部 admin县级人大工作人员 street乡镇负责人 contact联络站负责人" +
+ "多个用 , 号分开,如:admin,street"),
+ @ApiImplicitParam(name = "category", value = "栏目类型 activity_category字典中的数字值 ")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = ActivityVO.class)
+ })
+ @ApiOperation("最新活动")
+ @GetMapping("/newest")
+ public void newest(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityName, String createdType,String category) {
+ //已报名的活动
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id", getApiUserId());
+ List activityUsers = activityUserService.list(wrapper);
+ List activityIds = new ArrayList<>();
+ for (ActivityUser item : activityUsers) {
+ activityIds.add(item.getActivityId());
+ }
+
+ //未结束、已审核的活动
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.eq("end", 0);
+ qw.eq("status", "1");
+ if(StrUtil.isNotBlank(category)) qw.eq("category",category);
+ Condition.appendIfNotEmpty(activityName, "activity_name#like", qw);
+ if (CollUtil.isNotEmpty(activityIds)) {
+ qw.notIn("id", activityIds);
+ }
+ if (StrUtil.isNotBlank(createdType)) {
+ String[] split = createdType.split(",");
+ qw.in("created_type", Arrays.asList(split));
+ }
+ qw.orderByDesc("activity_date");
+
+ IPage paged = activityService.page(new Page<>(pageNo, pageSize), qw);
+
+ render(Ret.ok().paged(ActivityWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperation("审批列表")
+ @GetMapping("/audit")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "type", value = "wait待审批 end已审批"),
+ @ApiImplicitParam(name = "title", value = "活动名称")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "活动审批", dataTypeClass = ActivityAuditUser.class)
+ })
+ public void audit(String type, String title) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.orderByAsc("sort_no");
+ Page paged = new Page<>();
+ if (StringUtils.isNotBlank(title)) {
+ title = "%" + title + "%";
+ wrapper.like("activity_name", title);
+ }
+ //不是按审批总状态筛选,而是按照我对该审批做出的操作状态筛选
+ //待审批就是轮到我审批的,已审批就是我审批过的
+ if ("wait".equals(type)) {
+ //我待审批 t_activity_audit_user的status=待审批,userId=自己 t_activity总状态是待审批的(说明前面未被拒绝) t_activity_audit_user的sort_no是最小的(说明正轮到自己)
+ paged = activityAuditUserService.getMyWaitList(new Page<>(getPageNum(), getPageSize()), getApiUserId(), title);
+ }
+ if ("end".equals(type)) {
+ //我已审批
+ wrapper.eq("user_id", getApiUserId()).and(consumer -> {
+ //通过的或拒绝的
+ consumer.or().eq("status", 1);
+ consumer.or().eq("status", 2);
+ });
+ paged = activityAuditUserService.page(new Page<>(getPageNum(), getPageSize()), wrapper);
+ }
+ paged.getRecords().forEach(item -> {
+ item.setActivity(activityService.getById(item.getActivityId()));
+ toStr(item);
+ });
+ render(Ret.ok().paged(ActivityAuditUserWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperation("活动审批人员列表")
+ @GetMapping("/audit_users")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "活动id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "活动审批", dataTypeClass = ActivityAuditUser.class)
+ })
+ public void auditUserList(String id) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("activity_id", id);
+ wrapper.orderByAsc("sort_no");
+ List list = activityAuditUserService.list(wrapper);
+ list.forEach(this::toStr);
+ render(Ret.ok().data(list));
+ }
+
+ //通过 拒绝 需要同步总审批的状态和原因
+ @PostMapping(value = "/refuse")
+ @ApiOperation("拒绝")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "活动id", required = true),
+ @ApiImplicitParam(name = "comment", value = "拒绝原因")
+ })
+ public void refuseA(String id, String comment) {
+ ActivityAuditUser bean = activityAuditUserService.getOne(new QueryWrapper()
+ .eq("activity_id", id).eq("user_id", getApiUserId()));
+ if (bean == null) {
+ render(Ret.fail("未找到该活动,或你不是审核人员"));
+ return;
+ }
+ bean.setStatus(2);
+ bean.setReason(comment);
+ boolean flag = activityAuditUserService.saveOrUpdate(bean);
+ if (flag) {
+ Activity activity = activityService.getById(bean.getActivityId());
+ activity.setStatus("2");
+ activity.setReason(comment);
+ activityService.saveOrUpdate(activity);
+
+ //添加消息
+ Message message = new Message();
+ message.setActionId(activity.getId());
+ message.setTitle("您有一个活动被拒绝,请前往查看!");
+ message.setContent(activity.getActivityName());
+ message.setType(Message.TYPE_ACTIVITY_REFUSE);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(activity.getCreatedId());
+ messageService.save(message);
+ }
+
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiOperation("通过")
+ @PostMapping("/pass")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "活动id", required = true)
+ })
+ public void passA(String id) {
+ ActivityAuditUser bean = activityAuditUserService.getOne(new QueryWrapper()
+ .eq("activity_id", id).eq("user_id", getApiUserId()));
+ if (bean == null) {
+ render(Ret.fail("未找到该活动,或你不是审核人员"));
+ return;
+ }
+ bean.setStatus(1);
+ boolean flag = activityAuditUserService.saveOrUpdate(bean);
+ if (flag) {
+ //判断是否是该审批最后一道审批
+ QueryWrapper countWrapper = new QueryWrapper().eq("activity_id", id).eq("status", "0");
+ int count = activityAuditUserService.count(countWrapper);
+ if (count == 0) {
+ Activity activity = activityService.getById(bean.getActivityId());
+ activity.setStatus("1");
+ activityService.saveOrUpdate(activity);
+
+ //添加消息
+ Message message = new Message();
+ message.setActionId(activity.getId());
+ message.setTitle("您有一个活动已通过,请前往查看!");
+ message.setContent(activity.getActivityName());
+ message.setType(Message.TYPE_ACTIVITY_PASS);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(activity.getCreatedId());
+ messageService.save(message);
+ }
+ }
+
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ //活动接取区域,使用FIND_IN_SET 加 OR查,ApiVoterSuggestController
+ public void one() {
+ String streetId = getApiUser().getStreetId();
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.apply("FIND_IN_SET ('" + streetId + "',activity_area)").or().isNull("activity_area");
+ }
+
+ private void toStr(ActivityAuditUser item) {
+ User user = userService.getById(item.getUserId());
+ if (user != null) {
+ item.setUserName(user.getUserName());
+ }
+ Activity activity = activityService.getById(item.getActivityId());
+ if (activity != null) {
+ item.setActivityName(activity.getActivityName());
+ }
+ }
+
+ private QueryWrapper getQueryWrapper(String title, String status, Integer end,String category) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(title, "activity_name#like", qw);
+ Condition.appendIfNotEmpty(status, "status", qw);
+ Condition.appendIfNotEmpty(end, "end", qw);
+ Condition.appendIfNotEmpty(category, "category", qw);
+ qw.orderByDesc("activity_date");
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiAuditController.java b/src/main/java/com/ydool/boot/api/controller/ApiAuditController.java
new file mode 100644
index 0000000..6fa69c3
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiAuditController.java
@@ -0,0 +1,178 @@
+package com.ydool.boot.api.controller;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.Audit;
+import com.ydool.boot.modules.rddb.entity.AuditUser;
+import com.ydool.boot.modules.rddb.service.AuditService;
+import com.ydool.boot.modules.rddb.service.AuditUserService;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/15
+ */
+@Controller
+@RequestMapping("/api/audit")
+@Api(value = "文件审批", tags = "文件审批")
+public class ApiAuditController extends ApiBaseController {
+
+ @Autowired
+ private AuditService auditService;
+ @Autowired
+ private AuditUserService auditUserService;
+ @Autowired
+ private UserService userService;
+
+ @ApiOperation("审批列表")
+ @GetMapping("")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "type", value = "wait待审批 end已审批"),
+ @ApiImplicitParam(name = "title", value = "标题"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "文件审批", dataTypeClass = AuditUser.class)
+ })
+ public void auditList(String type, String title) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.orderByDesc("updated_at");
+ Page page = null;
+ //不是按审批总状态筛选,而是按照我对该审批做出的操作状态筛选
+ //待审批就是轮到我审批的,已审批就是我审批过的
+ if ("wait".equals(type)) {
+ //我待审批 t_audit_user的status=待审批,userId=自己 t_audit总状态是待审批的(说明前面未被拒绝) t_audit_user的sort_no是最小的(说明正轮到自己)
+ if (StringUtils.isNotBlank(title)) title = "%" + title + "%";
+ page = auditUserService.getMyWaitList(new Page(getPageNum(), getPageSize()), getApiUserId(), title);
+ }
+ if ("end".equals(type)) {
+ //我已审批
+ if (StrUtil.isNotBlank(title)) wrapper.like("title", title);
+ wrapper.eq("user_id", getApiUserId()).and(consumer -> {
+ //通过的或拒绝的
+ consumer.or().eq("status", 1);
+ consumer.or().eq("status", 2);
+ });
+ page = auditUserService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ }
+ page.getRecords().forEach(item -> {
+ AuditUser auditUser = (AuditUser) item;
+ Audit audit = auditService.getById(auditUser.getAuditId());
+
+ //审批对象的创建人姓名
+ User user = userService.getById(audit.getCreatedId());
+ audit.setUserName(user != null ? user.getUserName() : "");
+ auditUser.setAudit(audit);
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("我的上报列表")
+ @GetMapping("mine")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "title", value = "标题"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "审批", dataTypeClass = Audit.class)
+ })
+ public void auditMineList(String title) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.orderByDesc("created_at");
+ wrapper.eq("created_id", getApiUserId());
+ if (StrUtil.isNotBlank(title)) wrapper.like("title", title);
+ Page page = auditService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("审批详情")
+ @GetMapping("detail")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "审批id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "审批", dataTypeClass = Audit.class)
+ })
+ public void auditDetail(String id) {
+ Audit audit = auditService.getById(id);
+ render(Ret.ok().data(audit));
+ }
+
+ @ApiOperation("该审批的审批人列表")
+ @GetMapping("audit_users")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "审批id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "审批", dataTypeClass = AuditUser.class)
+ })
+ public void auditUsers(String id) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("audit_id", id);
+ wrapper.orderByAsc("sort_no");
+ List list = auditUserService.list(wrapper);
+ render(Ret.ok().data(list));
+ }
+
+ @ApiOperation("添加审批")
+ @PostMapping("save")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "conference", value = "会议对象"),
+ @ApiImplicitParam(name = "userIds", value = "选择的用户id,多个以英文逗号间隔")
+ })
+ public void auditSave(@Validated Audit audit, @RequestParam(name = "userIds", defaultValue = "") String userIds) {
+ render(auditService.insertOrUpdate(audit, getApiUser(), userIds));
+ }
+
+ //通过 拒绝 需要同步总审批的状态和原因
+ @PostMapping(value = "refuse")
+ @ApiOperation("拒绝")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "审批id"),
+ @ApiImplicitParam(name = "comment", value = "拒绝原因"),
+ @ApiImplicitParam(name = "signature", value = "签名")
+ })
+ public void auditRefuse(String id, String comment, String signature) {
+ AuditUser auditUser = auditUserService.getOne(new QueryWrapper().eq("audit_id", id).eq("user_id", getApiUserId()));
+ if (auditUser == null) render(Ret.fail("未找到该审批"));
+ auditUser.setReason(comment);
+ auditUser.setSignature(signature);
+ render(auditUserService.refuse(auditUser));
+ }
+
+ @ApiOperation("通过")
+ @PostMapping("pass")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "审批id"),
+ @ApiImplicitParam(name = "signature", value = "签名"),
+ })
+ public void auditPass(String id, String signature) {
+ AuditUser auditUser = auditUserService.getOne(new QueryWrapper().eq("audit_id", id).eq("user_id", getApiUserId()));
+ if (auditUser == null) render(Ret.fail("未找到该审批"));
+ auditUser.setSignature(signature);
+ render(auditUserService.pass(auditUser));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiAuthController.java b/src/main/java/com/ydool/boot/api/controller/ApiAuthController.java
new file mode 100644
index 0000000..dce3dfe
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiAuthController.java
@@ -0,0 +1,364 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
+import com.alibaba.xxpt.gateway.shared.client.http.GetClient;
+import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.api.util.Kv;
+import com.ydool.boot.api.util.SmsUtil;
+import com.ydool.boot.api.util.TokenUtil;
+import com.ydool.boot.common.Ydool;
+import com.ydool.boot.common.cache.ConfigUtils;
+import com.ydool.boot.common.cache.DictUtils;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.common.utils.WebUtils;
+import com.ydool.boot.core.validator.NumberLetter;
+import com.ydool.boot.core.validator.Password;
+import com.ydool.boot.modules.rddb.entity.Db;
+import com.ydool.boot.modules.rddb.entity.Office;
+import com.ydool.boot.modules.rddb.service.DbService;
+import com.ydool.boot.modules.rddb.service.OfficeService;
+import com.ydool.boot.modules.sys.entity.Role;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.entity.UserRole;
+import com.ydool.boot.modules.sys.service.RoleService;
+import com.ydool.boot.modules.sys.service.UserRoleService;
+import com.ydool.boot.modules.sys.service.UserService;
+import io.jsonwebtoken.Claims;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/10
+ */
+@Slf4j
+@RestController
+@RequestMapping(value = "/api/auth")
+@Api(value = "授权接口", tags = "授权接口")
+public class ApiAuthController extends ApiBaseController {
+
+ @Autowired
+ private UserService userService;
+ @Autowired
+ private RedisTemplate redisTemplate;
+ @Autowired
+ private UserRoleService userRoleService;
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private DbService dbService;
+ @Autowired
+ private OfficeService officeService;
+
+ @Value("${sys.dingding.appId}")
+ private String appId;
+ @Value("${sys.dingding.appSecret}")
+ private String appSecret;
+
+// public static void main(String[] args) {
+// String result = Base64.decodeStr("MTM2MDY3ODc2OTk=");
+// //13606787699
+// System.out.println(result);
+// }
+
+// public static void main(String[] args) {
+// String token="eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZmYxYzI3MGFjMzQxOTY5MzA2ZDRkNzM5YjI4ZTE0MzMiLCJleHAiOjE2MzMyMjM4MTMsIm5iZiI6MTYyNTQ0NzgxM30.y2xmIsDO5hn5xO2z4Apo3K2kPqvsKRVwRZQ3a-0fpXw";
+// Claims claims = TokenUtil.parseJWT(token);
+// Date date = claims.getExpiration();
+// System.out.println(date);
+// }
+
+ @GetMapping("reg_login")
+ @ApiOperation(value = "有该手机号和身份的账号则直接登录,否则创建一个账号并登录")
+ @ApiImplicitParams(value = {
+ @ApiImplicitParam(name = "phone", value = "手机号", required = true),
+ @ApiImplicitParam(name = "type", required = true, value = "身份类型 admin县级人大工作人员 street乡镇负责人 contact联络站负责人 rddb各级人大代表 voter选民用户 "),
+ })
+ public void regLogin(String phone, String type) {
+ if (StrUtil.isBlank(phone)) fail("手机号不能为空");
+ phone = Base64.decodeStr(phone);
+ if (StrUtil.isBlank(type)) fail("身份类型不能为空");
+ if ((!"admin".equals(type)) && (!"admin".equals(type)) && (!"street".equals(type)) && (!"contact".equals(type)) && (!"rddb".equals(type)) && (!"voter".equals(type)))
+ fail("请检查身份类型");
+ User user = userService.getOne(new LambdaQueryWrapper().eq(User::getLoginName, phone).eq(User::getAccountType, type));
+ if (user != null) {
+ //直接登录
+ login(user);
+ } else {
+ user = new User();
+ user.setLoginName(phone);
+ user.setSalt(RandomUtil.randomString(6));
+ user.setPassword(Ydool.password(user.getSalt(), ConfigUtils.getStr("sys.user.initPassword", "888888")));
+ user.setInitPwd(false);
+ user.setAccountType(type);
+ userService.save(user);
+
+ //分配用户默认角色
+ Role role = roleService.getOne(new QueryWrapper().eq("code", "default"));
+ if (role != null) userRoleService.save(new UserRole(user.getId(), role.getId()));
+
+ //选民则只有基础信息
+ //县级人大工作人员、乡镇管理员、联络站管理员 需创建机关人员信息
+ if ("admin".equals(type) || "street".equals(type) || "contact".equals(type)) {
+ Office office = new Office();
+ office.setUserId(user.getId());
+ office.setPhone(user.getPhone());
+ office.setDuty(DictUtils.getDictValue(type, "office_duty"));
+ officeService.save(office);
+ }
+ //人大代表 需创建代表信息
+ if ("rddb".equals(type)) {
+ Db db = new Db();
+ db.setUserId(user.getId());
+ db.setPhone(user.getPhone());
+ dbService.save(db);
+ }
+ login(user);
+ }
+ Kv authInfo = TokenUtil.createAuthInfo(user);
+
+ //跳转
+ String url = "/front/#/authorize";
+ String param = "?type=" + type + "&access_token=" + authInfo.getString("access_token");
+ WebUtils.redirect(url + param, true);
+ }
+
+ private void login(User user) {
+ user.setLoginDate(LocalDateTime.now());
+ user.setLoginIp(WebUtils.getRemoteAddress());
+ boolean flag = userService.updateById(user);
+ if (flag) {
+ WebUtils.getSession().setAttribute(Ydool.LOGIN_NAME, user.getId());
+ WebUtils.getSession().setAttribute(Ydool.LOGIN_DATA_SCOPE, userService.getUserMaxRoleDataScope(user.getId()));
+ }
+ }
+
+ @GetMapping("")
+ @ResponseBody
+ @ApiOperation(value = "获取认证token")
+ @ApiImplicitParams(value = {
+ @ApiImplicitParam(name = "login", value = "用户名"),
+ @ApiImplicitParam(name = "pwd", value = "密码"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "type", value = "身份 admin县级人大工作人员 street乡镇负责人 contact联络站负责人 rddb各级人大代表 voter选民用户")
+ })
+ public void auth(String login, String pwd) {
+ Ret ret = userService.login(login, pwd);
+ if (ret.isFail()) {
+ render(Ret.fail(ret.get("msg").toString()));
+ }
+ User user = userService.getOne((Wrapper) (new QueryWrapper()).eq("login_name", login));
+ Kv authInfo = TokenUtil.createAuthInfo(user);
+ //身份 admin县级人大工作人员 street乡镇负责人 contact联络站负责人 rddb各级人大代表 voter选民用户
+ authInfo.set("type", user.getAccountType());
+ render(Ret.ok().data(authInfo));
+ }
+
+ @PostMapping("sendCode")
+ @ResponseBody
+ @ApiOperation(value = "发送验证码")
+ @ApiImplicitParam(name = "phone", value = "手机号", required = true)
+ public void sendCode(String phone) {
+ //一分钟可重发
+ if (redisTemplate.hasKey(phone) && redisTemplate.getExpire(phone) > (9 * 60)) {
+ render(Ret.fail("发送验证码过于频繁,请稍后重试"));
+ }
+
+ //作为loginName的手机号不能重复
+ User repeatUser = checkPhoneRepeat(phone);
+ if (repeatUser != null) render(Ret.fail("该手机号已被占用"));
+
+ //存储验证码
+ String code = RandomUtil.randomNumbers(6);
+ redisTemplate.opsForValue().set(phone, code, 10 * 60, TimeUnit.SECONDS);
+ SmsUtil.sendMsg(phone, code);
+ render(Ret.ok());
+ }
+
+ @PostMapping("register")
+ @ResponseBody
+ @ApiOperation(value = "注册")
+ @ApiImplicitParams(value = {
+ @ApiImplicitParam(name = "phone", value = "手机号", required = true),
+ @ApiImplicitParam(name = "code", value = "验证码", required = true),
+ @ApiImplicitParam(name = "password", value = "密码", required = true),
+ @ApiImplicitParam(name = "type", value = "注册类型 admin县级人大工作人员 street乡镇负责人 contact联络站负责人 rddb各级人大代表 voter选民用户", required = true),
+ })
+ public void register(String phone, String code, @NumberLetter(message = "密码需带有英文,数字") String password, String type) {
+ if (StringUtils.isNotBlank(phone) && StringUtils.isNotBlank(code) && StringUtils.isNotBlank(password)) {
+
+ //作为loginName的手机号不能重复
+ User repeatUser = checkPhoneRepeat(phone);
+ if (repeatUser != null) render(Ret.fail("该手机号已被占用"));
+
+ if (redisTemplate.hasKey(phone)) {
+ String redisCode = (String) redisTemplate.opsForValue().get(phone);
+ if (code.equals(redisCode)) {
+ User user = new User();
+ user.setLoginName(phone);
+ user.setSalt(RandomUtil.randomString(6));
+ user.setPassword(Ydool.password(user.getSalt(), password));
+ user.setInitPwd(false);
+ user.setAccountType(type);
+ userService.save(user);
+
+ //分配用户默认角色
+ Role role = roleService.getOne(new QueryWrapper().eq("code", "default"));
+ if (role != null) {
+ userRoleService.save(new UserRole(user.getId(), role.getId()));
+ }
+
+ //县级人大工作人员、乡镇管理员、联络站管理员 需创建机关人员信息
+ if ("admin".equals(type) || "street".equals(type) || "contact".equals(type)) {
+ Office office = new Office();
+ office.setUserId(user.getId());
+ office.setPhone(user.getPhone());
+ office.setDuty(DictUtils.getDictValue(type, "office_duty"));
+ officeService.save(office);
+ }
+ //人大代表 需创建代表信息
+ if ("rddb".equals(type)) {
+ Db db = new Db();
+ db.setUserId(user.getId());
+ db.setPhone(user.getPhone());
+ dbService.save(db);
+ }
+ //选民只有基础信息
+ render(Ret.ok());
+ }
+ render(Ret.fail("验证码错误"));
+ }
+ render(Ret.fail("验证码超时,请重新获取"));
+ }
+ render(Ret.fail("参数不完整"));
+ }
+
+
+ @PostMapping("/check_ding_binding")
+ @ApiOperation(value = "用户是否绑定钉钉接口")
+ @ApiImplicitParam(name = "authCode", value = "免登码")
+ public Ret checkBinding(String authCode) {
+ System.out.println("authCode:"+authCode);
+ String accessToken = getAccessToken();
+ String dingOpenid = getDingOpenid(accessToken, authCode);
+ if (accessToken != null && dingOpenid == null) return Ret.fail("免登授权码错误");
+ User user = userService.getUserByOpenId(dingOpenid);
+ if (user != null) {
+ login(user);
+ Kv authInfo = TokenUtil.createAuthInfo(user);
+ authInfo.set("type", user.getAccountType());
+ return Ret.ok().data(authInfo);
+ } else {
+ return Ret.fail("请绑定账号").data(dingOpenid);
+ }
+ }
+
+ @PostMapping("/ding_binding")
+ @ApiOperation(value = "绑定钉钉接口")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "login", value = "账号"),
+ @ApiImplicitParam(name = "password", value = "密码"),
+ @ApiImplicitParam(name = "dingOpenid", value = "dingOpenid")
+ })
+ public Ret binding(String login, String password, String dingOpenid) {
+ System.out.println("login:"+login);
+ System.out.println("password:"+password);
+ System.out.println("dingOpenid:"+dingOpenid);
+
+ User user = userService.getOne(new QueryWrapper().eq("login_name", login));
+ if (user!=null) {
+ user.setOpenId(dingOpenid);
+ userService.updateById(user);
+
+ login(user);
+ Kv authInfo = TokenUtil.createAuthInfo(user);
+ authInfo.set("type", user.getAccountType());
+ return Ret.ok().data(authInfo);
+ } else {
+ return Ret.fail("绑定失败");
+ }
+ }
+
+ private String getAccessToken() {
+ String accessKey = appId;
+ String secretKey = appSecret;
+ ExecutableClient executableClient = ExecutableClient.getInstance();
+ executableClient.setAccessKey(accessKey);
+ executableClient.setSecretKey(secretKey);
+ executableClient.setDomainName("openplatform.dg-work.cn");
+ executableClient.setProtocal("https");
+ executableClient.init();
+ //executableClient要单例,并且使用前要初始化,只需要初始化一次
+ String api = "/gettoken.json";
+ GetClient getClient = executableClient.newGetClient(api);
+ //设置参数
+ getClient.addParameter("appkey", accessKey);
+ getClient.addParameter("appsecret", secretKey);
+ //调用API
+ String apiResult = getClient.get();
+ executableClient.destroy();
+ try {
+ JSONObject jsonObject = JSON.parseObject(apiResult);
+ JSONObject content = jsonObject.getJSONObject("content");
+ if (content.getBoolean("success")) {
+ return content.getJSONObject("data").getString("accessToken");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return null;
+ }
+
+ private String getDingOpenid(String accessToken, String authCode) {
+ ExecutableClient executableClient = ExecutableClient.getInstance();
+ executableClient.setDomainName("openplatform.dg-work.cn");
+ executableClient.setProtocal("https");
+ executableClient.init();
+ //executableClient要单例,并且使用前要初始化,只需要初始化一次
+ String api = "/rpc/oauth2/dingtalk_app_user.json";
+ PostClient postClient = executableClient.newPostClient(api);
+ //设置参数
+ postClient.addParameter("access_token", accessToken);
+ postClient.addParameter("auth_code", authCode);
+ //调用API
+ String apiResult = postClient.post();
+ executableClient.destroy();
+ try {
+ JSONObject jsonObject = JSON.parseObject(apiResult);
+ JSONObject content = jsonObject.getJSONObject("content");
+ if (content.getBoolean("success")) {
+ return content.getJSONObject("data").getString("openid");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return null;
+ }
+
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiBaseController.java b/src/main/java/com/ydool/boot/api/controller/ApiBaseController.java
new file mode 100644
index 0000000..f3eeb39
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiBaseController.java
@@ -0,0 +1,74 @@
+package com.ydool.boot.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ydool.boot.api.util.TokenUtil;
+import com.ydool.boot.api.util.UserInfo;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.exception.ResultException;
+import com.ydool.boot.core.web.BaseController;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.service.RoleService;
+import com.ydool.boot.modules.sys.service.UserRoleService;
+import com.ydool.boot.modules.sys.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/10
+ */
+public class ApiBaseController extends BaseController {
+
+ @Autowired
+ private UserService userService;
+
+ /**
+ * 获取当前登录用户id
+ *
+ * @return
+ */
+ public static String getApiUserId() {
+ UserInfo userInfo = TokenUtil.getUserInfo();
+ if (userInfo == null) {
+ throw new ResultException(Ret.fail("请登录后再操作"));
+ }
+ return userInfo.getId();
+ }
+
+ /**
+ * 获取当前登录用户id
+ *
+ * @return
+ */
+ public User getApiUser() {
+ UserInfo userInfo = TokenUtil.getUserInfo();
+ if (userInfo == null) {
+ throw new ResultException(Ret.fail("请登录后再操作"));
+ }
+ return userService.getById(userInfo.getId());
+ }
+
+ public boolean isStreet() {
+ return "street".equals(getApiUser().getAccountType());
+ }
+
+ public boolean isContact() {
+ return "contact".equals(getApiUser().getAccountType());
+ }
+
+ public boolean isAdmin() {
+ return "admin".equals(getApiUser().getAccountType());
+ }
+
+ public boolean isRddb() {
+ return "rddb".equals(getApiUser().getAccountType());
+ }
+
+ public boolean isVoter() {
+ return "office".equals(getApiUser().getAccountType());
+ }
+
+ public User checkPhoneRepeat(String phone) {
+ return userService.getOne(new QueryWrapper().eq("login_name", phone));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiBaseDataController.java b/src/main/java/com/ydool/boot/api/controller/ApiBaseDataController.java
new file mode 100644
index 0000000..15d7dc1
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiBaseDataController.java
@@ -0,0 +1,133 @@
+package com.ydool.boot.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ydool.boot.api.util.Kv;
+import com.ydool.boot.common.cache.DictUtils;
+import com.ydool.boot.common.cache.StreetUtils;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.*;
+import com.ydool.boot.modules.rddb.service.*;
+import com.ydool.boot.modules.sys.entity.DictData;
+import com.ydool.boot.modules.sys.entity.Street;
+import com.ydool.boot.modules.sys.service.StreetService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+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.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/10
+ */
+@RestController
+@RequestMapping(value = "/api/user")
+@Api(value = "基础数据接口", tags = "基础数据接口")
+public class ApiBaseDataController extends ApiBaseController {
+
+ @Autowired
+ private DataBankService dataBankService;
+ @Autowired
+ private ConferenceAttachmentService conferenceAttachmentService;
+ @Autowired
+ private NoticeService noticeService;
+ @Autowired
+ private ConferenceService conferenceService;
+ @Autowired
+ private AuditService auditService;
+ @Autowired
+ private ActivityService activityService;
+ @Autowired
+ private VoterSuggestService voterSuggestService;
+ @Autowired
+ private SuperviseThingService superviseThingService;
+ @Autowired
+ private StreetService streetService;
+ @Autowired
+ private OfficeService officeService;
+
+ @GetMapping("street")
+ @ResponseBody
+ @ApiOperation(value = "获取街道列表")
+ public void street() {
+ List streetList = StreetUtils.getStreetList();
+ render(Ret.ok().data(streetList));
+ }
+
+ @GetMapping("street_detail")
+ @ResponseBody
+ @ApiOperation(value = "获取街道详情")
+ @ApiImplicitParam(name = "id", value = "街道id")
+ public void getStreetDetail(String id) {
+ render(Ret.ok().data(streetService.getById(id)));
+ }
+
+ @GetMapping("street_contacts")
+ @ResponseBody
+ @ApiOperation(value = "该街道下的联络站列表 无分页")
+ @ApiImplicitParam(name = "id", value = "街道id")
+ public void street(String id) {
+ List list = officeService.list(new QueryWrapper().eq("street", id).eq("duty", "contact"));
+ render(Ret.ok().data(list));
+ }
+
+ @GetMapping("contact_detail")
+ @ResponseBody
+ @ApiOperation(value = "联络站详情")
+ @ApiImplicitParam(name = "id", value = "联络站id")
+ public void contactDetail(String id) {
+ Office office = officeService.getById(id);
+ if (office != null) office.fullInfo();
+ render(Ret.ok().data(office));
+ }
+
+ @GetMapping("dict")
+ @ResponseBody
+ @ApiOperation(value = "根据字典类型拿字典列表")
+ @ApiImplicitParam(name = "type", value = "字典类型 例如:sys_yes_no")
+ public void dict(String type) {
+ List dictList = DictUtils.getDictList(type, null);
+ render(Ret.ok().data(dictList));
+ }
+
+ @GetMapping("now")
+ @ResponseBody
+ @ApiOperation(value = "获取当前时间")
+ public void now() {
+ render(Ret.ok().data(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
+ }
+
+ @GetMapping("statistics")
+ @ResponseBody
+ @ApiOperation(value = "统计数量 自己创建的")
+ public void statistics() {
+ //上传资料库文件数
+ int dataBankFileCount = dataBankService.count(new QueryWrapper());
+ //上传会议文件数
+ int conferenceFileCount = conferenceAttachmentService.count(new QueryWrapper());
+ // 文件审批数
+ int auditCount = auditService.count(new QueryWrapper());
+ // 发布活动数
+ int activityCount = activityService.count(new QueryWrapper());
+ //发布公告数
+ int noticeCount = noticeService.count(new QueryWrapper());
+ // 选民反馈数量
+ int voterSuggestCount = voterSuggestService.count(new QueryWrapper());
+ //发布会议数
+ int conferenceCount = conferenceService.count(new QueryWrapper());
+ //督事数
+ int superviseThingCount = superviseThingService.count(new QueryWrapper().eq("created_id", getApiUserId()));
+ Kv kv = Kv.create().set("dataBankFileCount", dataBankFileCount).set("conferenceFileCount", conferenceFileCount).set("auditCount", auditCount)
+ .set("activityCount", activityCount).set("noticeCount", noticeCount).set("voterSuggestCount", voterSuggestCount).set("conferenceCount", conferenceCount)
+ .set("superviseThingCount", superviseThingCount);
+ render(Ret.ok().data(kv));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiBasicDynamicController.java b/src/main/java/com/ydool/boot/api/controller/ApiBasicDynamicController.java
new file mode 100644
index 0000000..fa3cb4a
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiBasicDynamicController.java
@@ -0,0 +1,93 @@
+package com.ydool.boot.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.BasicDynamic;
+import com.ydool.boot.modules.rddb.service.BasicDynamicService;
+import com.ydool.boot.modules.rddb.vo.BasicDynamicVO;
+import com.ydool.boot.modules.rddb.wrapper.BasicDynamicWrapper;
+import com.ydool.boot.modules.sys.entity.User;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 动态信息
+ *
+ * @author zhouyuan
+ * @date 2021年3月15日13:09:49
+ */
+@Controller
+@RequestMapping("/api/basic_dynamic")
+@Api(value = "动态信息", tags = "动态信息")
+public class ApiBasicDynamicController extends ApiBaseController {
+
+ @Autowired
+ private BasicDynamicService basicDynamicService;
+
+ @ApiOperation("列表")
+ @GetMapping("list")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "动态信息对象", dataTypeClass = BasicDynamicVO.class)
+ })
+ public void basicDynamicList() {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ // 0待审核 1已通过 2拒绝
+ wrapper.eq(BasicDynamic::getStatus,"1");
+ wrapper.orderByDesc(BasicDynamic::getCreatedAt);
+ Page page = basicDynamicService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ List list = BasicDynamicWrapper.build().listVO(page.getRecords());
+ page.setRecords(list);
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("新增 (街道管理员或联络站管理员)")
+ @PostMapping("save")
+ @ResponseBody
+ @ApiImplicitParam(name = "basicDynamic", value = "动态信息对象", dataTypeClass = BasicDynamic.class)
+ public void basicDynamicSave(@Validated BasicDynamic basicDynamic) {
+ //街道管理员或联络站管理员
+ if (isStreet() || isContact()) {
+ User user = getApiUser();
+ basicDynamic.setStreetId(user.getStreetId());
+ }
+ //0待审核 1已通过 2拒绝
+ basicDynamic.setStatus("0");
+ boolean flag = basicDynamicService.saveOrUpdate(basicDynamic);
+ renderJson(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+
+ @ApiOperation("督事详情")
+ @GetMapping("detail")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "动态信息对象", dataTypeClass = BasicDynamicVO.class)
+ })
+ public void basicDynamicDetail(String id) {
+ BasicDynamic basicDynamic = basicDynamicService.getById(id);
+ if (basicDynamic == null) fail("未找到该对象");
+ BasicDynamicVO basicDynamicVO = BasicDynamicWrapper.build().entityVO(basicDynamic);
+ render(Ret.ok().data(basicDynamicVO));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiConferenceController.java b/src/main/java/com/ydool/boot/api/controller/ApiConferenceController.java
new file mode 100644
index 0000000..8936a68
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiConferenceController.java
@@ -0,0 +1,240 @@
+package com.ydool.boot.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.Conference;
+import com.ydool.boot.modules.rddb.entity.ConferenceAttachment;
+import com.ydool.boot.modules.rddb.entity.ConferenceUser;
+import com.ydool.boot.modules.rddb.service.ConferenceAttachmentService;
+import com.ydool.boot.modules.rddb.service.ConferenceService;
+import com.ydool.boot.modules.rddb.service.ConferenceUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/15
+ */
+@Controller
+@RequestMapping("/api/conference")
+@Api(value = "会议", tags = "会议")
+public class ApiConferenceController extends ApiBaseController {
+
+ @Autowired
+ private ConferenceService conferenceService;
+ @Autowired
+ private ConferenceAttachmentService conferenceAttachmentService;
+ @Autowired
+ private ConferenceUserService conferenceUserService;
+
+ @ApiOperation("会议列表")
+ @GetMapping("")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "title", value = "会议名称"),
+ @ApiImplicitParam(name = "type", value = "mine我创建的会议 all全部会议 un_end未结束会议 end已结束会议"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "会议", dataTypeClass = Conference.class)
+ })
+ public void conferenceList(String title, String type) {
+ QueryWrapper wrapper = getQueryWrapper(title);
+ if (StringUtils.isBlank(type) || "all".equals(type)) {
+ //全部的就是看全部的,不是看有我参加的
+ // wrapper.inSql("id", "select conference_id from t_conference_user where user_id='" + getApiUserId() + "'");
+ }
+ if ("mine".equals(type)) wrapper.eq("created_id", getApiUserId());
+ if ("end".equals(type)) wrapper.eq("end", Conference.END_TAG);
+ //未结束查有我参加的,未结束的
+ if ("un_end".equals(type)) {
+ wrapper.eq("end", Conference.UN_END_TAG);
+ wrapper.inSql("id", "select conference_id from t_conference_user where user_id='" + getApiUserId() + "'");
+ }
+
+ Page page = conferenceService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ Conference conference = (Conference) item;
+ //会议议题列表
+ List conferenceIssueList = conferenceAttachmentService.list(new QueryWrapper().eq("pid", "").eq("conference_id", (conference.getId())));
+ //议题列表里装会议附件列表
+ conferenceIssueList.forEach(conferenceIssue -> {
+ List conferenceAttachmentList = conferenceAttachmentService.list(new QueryWrapper().eq("pid", conferenceIssue.getId()).eq("conference_id", (conference.getId())));
+ //处理文件前缀
+ conferenceAttachmentList.forEach(ConferenceAttachment::full);
+ conferenceIssue.setConferenceAttachmentList(conferenceAttachmentList);
+ });
+ conference.setConferenceIssueList(conferenceIssueList);
+ //当前登录用户是否已签到
+ ConferenceUser conferenceUser = conferenceUserService.getOne(new QueryWrapper().eq("conference_id", conference.getId()).eq("user_id", getApiUserId()));
+ conference.setSign(conferenceUser != null ? conferenceUser.getStatus() : null);
+ conference.setSignTime(conferenceUser != null ? conferenceUser.getUpdatedAt() : null);
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("添加会议")
+ @PostMapping("save")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "conference", value = "会议对象"),
+ @ApiImplicitParam(name = "userIds", value = "选择的用户id,多个以英文逗号间隔 按顺序排")
+ })
+ public void conferenceSave(@Validated Conference conference, @RequestParam(name = "userIds", defaultValue = "") String userIds) {
+ //手机端不上传附件 null
+ render(conferenceService.insertOrUpdate(conference, getApiUser(), userIds, null));
+ }
+
+ @ApiOperation("会议文件列表 不显示议题")
+ @GetMapping("attachments")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "conferenceTitle", value = "会议名称"),
+ @ApiImplicitParam(name = "attachmentTitle", value = "附件名称"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "会议", dataTypeClass = ConferenceAttachment.class)
+ })
+ public void conferenceAttachments(String conferenceTitle, String attachmentTitle) {
+ if (StringUtils.isNotBlank(conferenceTitle)) conferenceTitle = "%" + conferenceTitle + "%";
+ if (StringUtils.isNotBlank(attachmentTitle)) attachmentTitle = "%" + attachmentTitle + "%";
+ Page page = conferenceAttachmentService.page(new Page(getPageNum(), getPageSize()), conferenceTitle, attachmentTitle);
+ page.getRecords().forEach(item -> {
+ ConferenceAttachment conferenceAttachment = (ConferenceAttachment) item;
+ conferenceAttachment.full();
+ Conference conference = conferenceService.getById(conferenceAttachment.getConferenceId());
+ conferenceAttachment.setConference(conference);
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("上传了会议文件的会议列表")
+ @GetMapping("have_attachment")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "title", value = "会议名称"),
+ @ApiImplicitParam(name = "category", value = "附件分类"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "会议", dataTypeClass = Conference.class)
+ })
+ public void conferenceHaveAttachmentList(String title, String category) {
+ QueryWrapper wrapper = getQueryWrapper(title);
+ //上传文件数>=1
+ wrapper.ge("attachment_num", 1);
+ wrapper.eq("category", category);
+ Page page = conferenceService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ Conference conference = (Conference) item;
+ //会议议题列表
+ List conferenceIssueList = conferenceAttachmentService.list(new QueryWrapper().orderByAsc("sort_no").eq("pid", "").eq("conference_id", (conference.getId())));
+ //议题列表里装会议附件列表
+ conferenceIssueList.forEach(conferenceIssue -> {
+ List conferenceAttachmentList = conferenceAttachmentService.list(new QueryWrapper().orderByAsc("sort_no").eq("pid", conferenceIssue.getId()).eq("conference_id", (conference.getId())));
+ //处理文件前缀
+ conferenceAttachmentList.forEach(ConferenceAttachment::full);
+ conferenceIssue.setConferenceAttachmentList(conferenceAttachmentList);
+ });
+ conference.setConferenceIssueList(conferenceIssueList);
+ //当前登录用户是否已签到
+ ConferenceUser conferenceUser = conferenceUserService.getOne(new QueryWrapper().eq("conference_id", conference.getId()).eq("user_id", getApiUserId()));
+ conference.setSign(conferenceUser != null ? conferenceUser.getStatus() : null);
+ conference.setSignTime(conferenceUser != null ? conferenceUser.getUpdatedAt() : null);
+ });
+ render(Ret.ok().paged(page));
+ }
+
+
+ @ApiOperation("获取会议详情")
+ @GetMapping("detail")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "会议", dataTypeClass = Conference.class)
+ })
+ public void conferenceDetail(String id) {
+ Conference conference = conferenceService.getById(id);
+ if (conference != null) {
+ //会议议题列表
+ List conferenceIssueList = conferenceAttachmentService.list(new QueryWrapper().orderByAsc("sort_no").eq("pid", "").eq("conference_id", (conference.getId())));
+ //议题列表里装会议附件列表
+ conferenceIssueList.forEach(conferenceIssue -> {
+ List conferenceAttachmentList = conferenceAttachmentService.list(new QueryWrapper().orderByAsc("sort_no").eq("pid", conferenceIssue.getId()).eq("conference_id", (conference.getId())));
+ //处理文件前缀
+ conferenceAttachmentList.forEach(ConferenceAttachment::full);
+ conferenceIssue.setConferenceAttachmentList(conferenceAttachmentList);
+ });
+ conference.setConferenceIssueList(conferenceIssueList);
+ //当前登录用户是否已签到
+ ConferenceUser conferenceUser = conferenceUserService.getOne(new QueryWrapper().eq("conference_id", conference.getId()).eq("user_id", getApiUserId()));
+ conference.setSign(conferenceUser != null ? conferenceUser.getStatus() : null);
+ conference.setSignTime(conferenceUser != null ? conferenceUser.getUpdatedAt() : null);
+
+ //该会议应签到人数和现签到人数
+ int allSignCount = conferenceUserService.count(new QueryWrapper().eq("conference_Id", conference.getId()));
+ int unSignCount = conferenceUserService.count(new QueryWrapper().eq("conference_Id", conference.getId()).eq("status", ConferenceUser.STATUS_UN_SIGN));
+ conference.setAllSignCount(allSignCount);
+ conference.setSignedCount(allSignCount - unSignCount);
+ render(Ret.ok().data(conference));
+ }
+ render(Ret.fail("未找到该会议"));
+ }
+
+ @ApiOperation("会议签到")
+ @GetMapping("sign_in")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "会议id")
+ public void conferenceSignIn(String id) {
+ Conference conference = conferenceService.getById(id);
+ if (conference != null) {
+ if (Conference.END_TAG == conference.getEnd()) render(Ret.fail("该会议已结束,不能签到"));
+ ConferenceUser conferenceUser = conferenceUserService.getOne(new QueryWrapper().eq("conference_id", id).eq("user_id", getApiUserId()).eq("status", ConferenceUser.STATUS_UN_SIGN));
+ if (conferenceUser != null) {
+ conferenceUser.setStatus(ConferenceUser.STATUS_SIGN);
+ conferenceUserService.updateById(conferenceUser);
+ render(Ret.ok());
+ }
+ render(Ret.fail("签到失败"));
+ }
+ render(Ret.fail("未找到该会议,无法签到"));
+ }
+
+ @ApiOperation("删除会议文件")
+ @GetMapping("conference_file_del")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "会议文件id")
+ public void conferenceFileDel(String id) {
+ ConferenceAttachment conferenceAttachment = conferenceAttachmentService.getById(id);
+ if (conferenceAttachment != null) {
+ if (!conferenceAttachment.getCreatedId().equals(getApiUserId())) render(Ret.fail("您不能删除他人创建的会议的文件"));
+ boolean flag = conferenceAttachmentService.removeById(id);
+ render(flag ? Ret.ok() : Ret.fail("操作失败"));
+ }
+ render(Ret.fail("未找到该会议文件"));
+ }
+
+ private QueryWrapper getQueryWrapper(String title) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(title)) wrapper.like("title", title);
+ wrapper.orderByDesc("created_at");
+ return wrapper;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiContactActivityController.java b/src/main/java/com/ydool/boot/api/controller/ApiContactActivityController.java
new file mode 100644
index 0000000..e60f07d
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiContactActivityController.java
@@ -0,0 +1,191 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.api.util.SensitiveFilterService;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.mybatis.Condition;
+import com.ydool.boot.modules.rddb.entity.ContactActivity;
+import com.ydool.boot.modules.rddb.entity.ContactActivityComment;
+import com.ydool.boot.modules.rddb.entity.Office;
+import com.ydool.boot.modules.rddb.service.ContactActivityCommentService;
+import com.ydool.boot.modules.rddb.service.ContactActivityService;
+import com.ydool.boot.modules.rddb.service.OfficeService;
+import com.ydool.boot.modules.rddb.vo.ContactActivityCommentVO;
+import com.ydool.boot.modules.rddb.vo.ContactActivityVO;
+import com.ydool.boot.modules.rddb.wrapper.ContactActivityCommentWrapper;
+import com.ydool.boot.modules.rddb.wrapper.ContactActivityWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Set;
+
+/**
+ * 联络站活动
+ *
+ * @author chenchen
+ * @date 2020/10/12
+ */
+@Controller
+@RequestMapping("/api/contact_activity")
+@Api(value = "联络站活动", tags = "联络站活动")
+public class ApiContactActivityController extends ApiBaseController {
+
+ @Autowired
+ private ContactActivityService contactActivityService;
+
+ @Autowired
+ private ContactActivityCommentService contactActivityCommentService;
+
+ @Resource
+ private OfficeService officeService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "officeId", value = "联络站id")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = ContactActivityVO.class)
+ })
+ @ApiOperation("联络站活动列表")
+ @GetMapping("/list")
+ public void contactActivityList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ ContactActivityVO vo, String officeId) {
+ QueryWrapper qw = getQueryWrapper(vo.getActivityTheme());
+ if (StrUtil.isNotBlank(officeId)) {
+ Office office = officeService.getById(officeId);
+ if (office != null) {
+ qw.eq("created_id", office.getUserId());
+ }
+ }
+ IPage paged = contactActivityService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(ContactActivityWrapper.build().pageVO(paged)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "activityTheme", value = "活动名称", required = true),
+ @ApiImplicitParam(name = "activityDate", value = "活动时间", required = true),
+ @ApiImplicitParam(name = "activityAddress", value = "活动地点", required = true),
+ @ApiImplicitParam(name = "activityContent", value = "活动内容", required = true),
+ @ApiImplicitParam(name = "uploadPersonnel", value = "上传人员"),
+// @ApiImplicitParam(name = "photo", value = "图片")
+ })
+ @ApiOperation("发布")
+ @PostMapping("/save")
+ public void save(String activityTheme, String activityDate, String activityAddress, String activityContent,
+ String uploadPersonnel) {
+ ContactActivity bean = new ContactActivity();
+ bean.setActivityTheme(activityTheme);
+ bean.setActivityDate(activityDate);
+ bean.setActivityAddress(activityAddress);
+ bean.setActivityContent(activityContent);
+ bean.setActivityUpload(uploadPersonnel);
+ bean.setCreatedId(getApiUserId());
+
+ boolean flag = contactActivityService.saveOrUpdate(bean);
+
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiOperationSupport(
+ responses = @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = ContactActivityVO.class)
+ })
+ )
+ @ApiOperation("联络站活动详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void contactActivity(@PathVariable("id") String id) {
+ ContactActivity bean = contactActivityService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该活动"));
+ return;
+ }
+ ContactActivityVO vo = ContactActivityWrapper.build().entityVO(bean);
+ render(Ret.ok().data(vo));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "contactActivityId", value = "联络站活动id", required = true)
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = ContactActivityCommentVO.class)
+ })
+ @ApiOperation("联络站活动评论列表")
+ @GetMapping("/comment/list")
+ public void comment(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String contactActivityId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("contact_activity_id", contactActivityId);
+ wrapper.eq("status", "1");
+ wrapper.orderByDesc("created_at");
+ IPage paged = contactActivityCommentService.page(new Page<>(pageNo, pageSize), wrapper);
+ render(Ret.ok().paged(ContactActivityCommentWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperation("评论联络站活动")
+ @PostMapping("/comment/save")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "contactActivityId", value = "联络站活动id", required = true),
+ @ApiImplicitParam(name = "content", value = "评论内容", required = true)
+ })
+ public void comment(String contactActivityId, String content) {
+ if (StrUtil.isBlank(content)) render(Ret.fail("请输入内容"));
+ SensitiveFilterService instance = SensitiveFilterService.getInstance();
+ Set sensitiveContents = instance.getSensitiveWord(content, 1);
+ if (sensitiveContents.size() > 0) render(Ret.fail("您输入的内容含有非法词汇"));
+
+ ContactActivityComment bean = new ContactActivityComment();
+ bean.setContactActivityId(contactActivityId);
+ bean.setContent(content);
+ bean.setCreatedId(getApiUserId());
+ bean.setName(getApiUser().getUserName());
+ bean.setStatus(1);
+ boolean flag = contactActivityCommentService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiOperation("回复评论")
+ @PostMapping("/comment/reply")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "commentId", value = "评论id", required = true),
+ @ApiImplicitParam(name = "replyContent", value = "回复内容", required = true)
+ })
+ public void commentReply(String commentId, String content) {
+ ContactActivityComment bean = contactActivityCommentService.getById(commentId);
+ if (bean == null) {
+ render(Ret.fail("未找到该评论"));
+ return;
+ }
+ bean.setReplyContent(content);
+ bean.setReplyName(getApiUser().getUserName());
+ bean.setReplyDate(LocalDateTime.now());
+ boolean flag = contactActivityCommentService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ private QueryWrapper getQueryWrapper(String title) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(title, "activity_theme#like", qw);
+ qw.orderByDesc("created_at");
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiDataBankController.java b/src/main/java/com/ydool/boot/api/controller/ApiDataBankController.java
new file mode 100644
index 0000000..99f2594
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiDataBankController.java
@@ -0,0 +1,87 @@
+package com.ydool.boot.api.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.DataBank;
+import com.ydool.boot.modules.rddb.service.DataBankService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/21
+ */
+@Controller
+@RequestMapping("/api/data_bank")
+@Api(value = "资料库", tags = "资料库")
+public class ApiDataBankController extends ApiBaseController {
+
+ @Autowired
+ DataBankService dataBankService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "dataBank", value = "资料库", dataTypeClass = DataBank.class),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "资料库", name = "data", dataTypeClass = DataBank.class)
+ })
+ @ApiOperation("资料库列表")
+ @GetMapping("")
+ public void dataBankList(DataBank dataBank) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(dataBank.getFileName())) queryWrapper.like("file_name", dataBank.getFileName());
+ if (StringUtils.isNotBlank(dataBank.getUploadUser()))
+ queryWrapper.like("upload_user", dataBank.getUploadUser());
+ if (StringUtils.isNotBlank(dataBank.getFileType())) queryWrapper.eq("file_type", dataBank.getFileType());
+ IPage paged = dataBankService.page(new Page<>(getPageNum(), getPageSize()), queryWrapper);
+ paged.getRecords().forEach(DataBank::full);
+ render(Ret.ok().paged(paged));
+ }
+
+
+ @ApiImplicitParam(name = "id", value = "id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "资料库", dataTypeClass = DataBank.class)
+ })
+ @ApiOperation("资料详情")
+ @GetMapping("detail")
+ //方法名跟ApiSuperviseThingController一样叫detail竟然响应说明会错乱
+ public void dataBankDetail(String id) {
+ DataBank dataBank = dataBankService.getById(id);
+ if (dataBank != null) {
+ dataBank.full();
+ render(Ret.ok().data(dataBank));
+ }
+ render(Ret.fail("未找到该资料"));
+ }
+
+ @ApiImplicitParam(name = "id", value = "id")
+ @ApiOperation("删除")
+ @DeleteMapping("del")
+ public void dataBankDel(String id) {
+ DataBank dataBank = dataBankService.getById(id);
+ if (dataBank != null) {
+ if (!dataBank.getCreatedId().equals(getApiUserId())) render(Ret.fail("您不能删除他人上传的文件"));
+ boolean flag = dataBankService.removeById(dataBank);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+ render(Ret.fail("未找到该资料"));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiDbController.java b/src/main/java/com/ydool/boot/api/controller/ApiDbController.java
new file mode 100644
index 0000000..a82f5be
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiDbController.java
@@ -0,0 +1,108 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.Db;
+import com.ydool.boot.modules.rddb.service.DbService;
+import com.ydool.boot.modules.rddb.vo.DbVO;
+import com.ydool.boot.modules.rddb.wrapper.DbWrapper;
+import com.ydool.boot.modules.sys.entity.Street;
+import com.ydool.boot.modules.sys.service.StreetService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * @author chenchen
+ * @date 2020/10/12
+ */
+@Controller
+@RequestMapping("/api/db")
+@Api(value = "代表", tags = "代表")
+public class ApiDbController extends ApiBaseController {
+
+ @Autowired
+ private DbService dbService;
+ @Autowired
+ private StreetService streetService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = DbVO.class)
+ })
+ @ApiOperation("代表列表")
+ @GetMapping("/list")
+ public void dbList( String pageNo, String pageSize, DbVO dbVO) {
+ LambdaQueryWrapper qw = getQueryWrapper(dbVO.getName(), dbVO.getPhone(), dbVO.getSex(),
+ dbVO.getPrecinctAddress(), dbVO.getDbIdentity(), dbVO.getOfficeId());
+ if (StrUtil.isNotBlank(pageNo) || StrUtil.isNotBlank(pageSize)) {
+ IPage paged = dbService.page(new Page<>(Convert.toInt(pageNo), Convert.toInt(pageSize)), qw);
+ render(Ret.ok().paged(DbWrapper.build().pageVO(paged)));
+ } else {
+ List list = dbService.list(qw);
+ render(Ret.ok().data(list));
+ }
+ }
+
+ @ApiOperationSupport(
+ responses = @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = DbVO.class)
+ })
+ )
+ @ApiOperation("代表详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void notice(@PathVariable("id") String id) {
+ Db bean = dbService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该代表"));
+ return;
+ }
+ DbVO dbVO = DbWrapper.build().entityVO(bean);
+ dbVO.full();
+ render(Ret.ok().data(dbVO));
+ }
+
+ private LambdaQueryWrapper getQueryWrapper(String name, String phone, String sex, String precinctAddress, String dbIdentity, String officeId) {
+ LambdaQueryWrapper qw = new LambdaQueryWrapper<>();
+
+ //name可能是人名,也可能是地名
+ if (StrUtil.isNotBlank(name)) {
+ Street street = streetService.getOne(new LambdaQueryWrapper().like(Street::getName, name));
+ if (street != null) {
+ name = street.getId();
+ qw.eq(Db::getPrecinctAddress, name);
+ } else {
+ qw.like(StrUtil.isNotBlank(name), Db::getName, name);
+ }
+ }
+
+ qw.like(StrUtil.isNotBlank(phone), Db::getPhone, phone);
+ qw.eq(StrUtil.isNotBlank(sex), Db::getSex, sex);
+ qw.eq(StrUtil.isNotBlank(precinctAddress), Db::getPrecinctAddress, precinctAddress);
+ qw.eq(StrUtil.isNotBlank(dbIdentity), Db::getDbIdentity, dbIdentity);
+ qw.eq(StrUtil.isNotBlank(officeId), Db::getOfficeId, officeId);
+ qw.orderByDesc(Db::getSortNo);
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiMessageController.java b/src/main/java/com/ydool/boot/api/controller/ApiMessageController.java
new file mode 100644
index 0000000..51ae4ee
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiMessageController.java
@@ -0,0 +1,93 @@
+package com.ydool.boot.api.controller;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.Message;
+import com.ydool.boot.modules.rddb.service.MessageService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/15
+ */
+@Controller
+@RequestMapping("/api/message")
+@Api(value = "消息", tags = "消息")
+public class ApiMessageController extends ApiBaseController {
+
+ @Autowired
+ private MessageService messageService;
+
+
+ @ApiOperation("未读消息数")
+ @GetMapping("unread_count")
+ @ResponseBody
+ public void messageUnreadCount() {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("status", Message.STATUS_UNREAD).eq("user_id", getApiUserId());
+ render(Ret.ok().data(messageService.count(wrapper)));
+ }
+
+
+ @ApiOperation("已读")
+ @PostMapping("read")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "id")
+ public void messageRead(String id) {
+ Message message = messageService.getById(id);
+ if (message != null) {
+ message.setStatus(Message.STATUS_READ);
+ messageService.updateById(message);
+ }
+ render(Ret.ok());
+ }
+
+ @ApiOperation("消息列表")
+ @GetMapping("")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "type", value = "消息类型 不传查全部 1通知文件轮阅 2通知会议 3通知督事 4通知文件审批 5选民建议 6联系人大 7乡镇选民建议 8活动审核 9活动拒绝 10活动通过 11所有人的通知公告;" +
+ "多个用 , 号分开 如 5,6"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "消息", dataTypeClass = Message.class)
+ })
+ public void messageList(String type) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("user_id", getApiUserId());
+ wrapper.orderByDesc("created_at");
+ if (StrUtil.isNotBlank(type)) {
+ type = type + ",11";
+ } else {
+ type = "11";
+ }
+ String[] split = type.split(",");
+ List integers = new ArrayList<>();
+ for (String s : split) {
+ integers.add(Integer.parseInt(s));
+ }
+ wrapper.in("type", integers);
+ Page page = messageService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ render(Ret.ok().paged(page));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiNoticeController.java b/src/main/java/com/ydool/boot/api/controller/ApiNoticeController.java
new file mode 100644
index 0000000..dc13ab1
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiNoticeController.java
@@ -0,0 +1,101 @@
+package com.ydool.boot.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.mybatis.Condition;
+import com.ydool.boot.modules.rddb.entity.Notice;
+import com.ydool.boot.modules.rddb.service.NoticeService;
+import com.ydool.boot.modules.rddb.vo.NoticeVO;
+import com.ydool.boot.modules.rddb.wrapper.NoticeWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author chenchen
+ * @date 2020/10/12
+ */
+@Controller
+@RequestMapping("/api/notice")
+@Api(value = "通知公告", tags = "通知公告")
+public class ApiNoticeController extends ApiBaseController {
+
+ @Autowired
+ private NoticeService noticeService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "title", value = "标题"),
+ @ApiImplicitParam(name = "top", value = "是否置顶0:不置顶;1:置顶", dataType = "int")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = NoticeVO.class)
+ })
+ @ApiOperation("通知公告列表")
+ @GetMapping("/list")
+ public void noticeList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String title, Integer top) {
+ QueryWrapper qw = getQueryWrapper(title, top);
+ IPage paged = noticeService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(NoticeWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperationSupport(
+ responses = @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = NoticeVO.class)
+ })
+ )
+ @ApiOperation("通知公告详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void notice(@PathVariable("id") String id) {
+ Notice bean = noticeService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该通知"));
+ return;
+ }
+ NoticeVO noticeVO = NoticeWrapper.build().entityVO(bean);
+ render(Ret.ok().data(noticeVO));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "title", value = "标题", required = true),
+ @ApiImplicitParam(name = "content", value = "内容", required = true),
+ @ApiImplicitParam(name = "noticeDate", value = "通知日期"),
+ @ApiImplicitParam(name = "top", value = "是否置顶0:不置顶;1:置顶"),
+ @ApiImplicitParam(name = "uploadPersonnel", value = "上传人员")
+ })
+ @ApiOperation("发布公告")
+ @PostMapping("/save")
+ public void save(String title, String content, String noticeDate, Integer top, String uploadPersonnel) {
+ Notice bean = new Notice();
+ bean.setTitle(title);
+ bean.setContent(content);
+ bean.setNoticeDate(noticeDate);
+ bean.setTop(top);
+ bean.setUploadPersonnel(uploadPersonnel);
+ bean.setCreatedId(getApiUserId());
+
+ boolean flag = noticeService.saveOrUpdate(bean);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ private QueryWrapper getQueryWrapper(String title, Integer top) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(title, "title#like", qw);
+ qw.orderByDesc("top", "created_at");
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiPerformController.java b/src/main/java/com/ydool/boot/api/controller/ApiPerformController.java
new file mode 100644
index 0000000..112f52d
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiPerformController.java
@@ -0,0 +1,125 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.mybatis.Condition;
+import com.ydool.boot.modules.rddb.entity.ActivityUser;
+import com.ydool.boot.modules.rddb.entity.Perform;
+import com.ydool.boot.modules.rddb.service.ActivityUserService;
+import com.ydool.boot.modules.rddb.service.PerformService;
+import com.ydool.boot.modules.rddb.vo.ActivityVO;
+import com.ydool.boot.modules.rddb.vo.PerformVO;
+import com.ydool.boot.modules.rddb.wrapper.PerformWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author chenchen
+ * @date 2020/10/21
+ */
+@Controller
+@RequestMapping("/api/perform")
+@Api(value = "履职", tags = "履职")
+public class ApiPerformController extends ApiBaseController {
+
+ @Autowired
+ private PerformService performService;
+
+ @Resource
+ private ActivityUserService activityUserService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = PerformVO.class)
+ })
+ @ApiOperation("我的履职")
+ @GetMapping("/list/my")
+ public void performListMy(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String activityName) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(activityName, "activity_name#like", qw);
+ qw.eq("created_id", getApiUserId());
+ qw.orderByDesc("activity_date");
+ IPage paged = performService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(PerformWrapper.build().pageVO(paged)));
+ }
+
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = ActivityVO.class)
+ })
+ @ApiOperation("履职详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void activity(@PathVariable("id") String id) {
+ Perform bean = performService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该履职"));
+ return;
+ }
+ PerformVO vo = PerformWrapper.build().entityVO(bean);
+ render(Ret.ok().data(vo));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "id 不是activity里面的id"),
+ @ApiImplicitParam(name = "activityName", value = "活动名称", required = true),
+ @ApiImplicitParam(name = "activityDate", value = "活动时间", required = true),
+ @ApiImplicitParam(name = "activityAddress", value = "活动地点", required = true),
+ @ApiImplicitParam(name = "activityContent", value = "活动内容", required = true),
+ @ApiImplicitParam(name = "uploadPersonnel", value = "上传人员"),
+ @ApiImplicitParam(name = "photo", value = "图片")
+ })
+ @ApiOperation("发布")
+ @PostMapping("/save")
+ public void save(String id, String activityName, String activityDate, String activityAddress, String activityContent,
+ String uploadPersonnel, String photo) {
+ Perform bean = new Perform();
+ bean.setActivityName(activityName);
+ bean.setActivityDate(activityDate);
+ bean.setActivityAddress(activityAddress);
+ bean.setActivityContent(activityContent);
+ bean.setUploadPersonnel(uploadPersonnel);
+ bean.setPhoto(photo);
+ bean.setStatus("0");
+ bean.setCreatedId(getApiUserId());
+
+ boolean flag = performService.saveOrUpdate(bean);
+
+ if (flag) {
+ if (StrUtil.isNotBlank(id)) {
+ ActivityUser activityUser = activityUserService.getById(id);
+ if (activityUser != null) {
+ activityUser.setIsPublishPerform(1);
+ activityUserService.saveOrUpdate(activityUser);
+ }
+ }
+ }
+
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ private QueryWrapper getQueryWrapper(String activityName) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(activityName, "activity_name#like", qw);
+ qw.orderByDesc("created_at");
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiReadFileController.java b/src/main/java/com/ydool/boot/api/controller/ApiReadFileController.java
new file mode 100644
index 0000000..73f8d33
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiReadFileController.java
@@ -0,0 +1,165 @@
+package com.ydool.boot.api.controller;
+
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.ReadFile;
+import com.ydool.boot.modules.rddb.entity.ReadFileUser;
+import com.ydool.boot.modules.rddb.service.ReadFileService;
+import com.ydool.boot.modules.rddb.service.ReadFileUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ *
+ * 文件 前端控制器
+ *
+ *
+ * @author zhouyuan
+ * @since 2020-09-30
+ */
+@Controller
+@RequestMapping("/api/readfile")
+@Api(value = "文件轮阅", tags = "文件轮阅")
+public class ApiReadFileController extends ApiBaseController {
+
+ @Autowired
+ private ReadFileService readFileService;
+ @Autowired
+ private ReadFileUserService readFileUserService;
+
+ @ApiOperation("轮阅文件列表")
+ @GetMapping("")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "fileName", value = "文件名称"),
+ @ApiImplicitParam(name = "type", value = "all所有 read已读 unread未读"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "轮阅", dataTypeClass = ReadFile.class)
+ })
+ public void readFileList(String fileName, String type) {
+ QueryWrapper wrapper = getQueryWrapper(fileName);
+ if (StringUtils.isBlank(type) || "all".equals(type))
+ wrapper.inSql("id", "select file_id from t_read_file_user where user_id='" + getApiUserId() + "'");
+ if ("read".equals(type))
+ wrapper.inSql("id", "select file_id from t_read_file_user where status=" + ReadFileUser.STATUS_READ + " and user_id='" + getApiUserId() + "'");
+ if ("unread".equals(type))
+ wrapper.inSql("id", "select file_id from t_read_file_user where status=" + ReadFileUser.STATUS_UNREAD + " and user_id='" + getApiUserId() + "'");
+ Page page = readFileService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ ReadFile readFile = (ReadFile) item;
+ readFile.full();
+ //已读未读
+ ReadFileUser readFileUser = readFileUserService.getOne(new QueryWrapper().eq("file_id", readFile.getId()).eq("user_id", getApiUserId()));
+ if (readFileUser != null) readFile.setReadStatus(readFileUser.getStatus());
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("我发布的列表")
+ @GetMapping("mine")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "fileName", value = "文件名称"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "轮阅", dataTypeClass = ReadFile.class)
+ })
+ public void readFileMineList(String fileName) {
+ QueryWrapper wrapper = getQueryWrapper(fileName);
+ wrapper.eq("created_id", getApiUserId());
+ Page page = readFileService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ ReadFile readFile = (ReadFile) item;
+ readFile.full();
+ //已读数,未读数
+ readFile.setUnReadCount(readFileUserService.count(new QueryWrapper().eq("file_id", readFile.getId()).eq("status", ReadFileUser.STATUS_UNREAD)));
+ readFile.setReadCount(readFileUserService.count(new QueryWrapper().eq("file_id", readFile.getId()).eq("status", ReadFileUser.STATUS_READ)));
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("文件详情")
+ @GetMapping("detail")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "文件id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = ReadFile.class)
+ })
+ public void readFileDetail(String id) {
+ String apiUserId = getApiUserId();
+ List list = readFileUserService.list(new LambdaQueryWrapper().eq(ReadFileUser::getUserId, apiUserId).eq(ReadFileUser::getFileId, id));
+ if (CollectionUtil.isNotEmpty(list)) {
+ ReadFile readFile = readFileService.getById(id);
+ readFile.full();
+ render(Ret.ok().data(readFile));
+ }
+ fail("您没有查看记录的权限");
+
+ }
+
+ @ApiOperation("已读")
+ @PostMapping("read")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "文件id"),
+ })
+ public void readFileRead(String id) {
+ QueryWrapper wrapper = new QueryWrapper();
+ wrapper.eq("file_id", id).eq("user_id", getApiUserId());
+ ReadFileUser readFileUser = readFileUserService.getOne(wrapper);
+ if (readFileUser != null) {
+ readFileUser.setStatus(ReadFileUser.STATUS_READ);
+ boolean flag = readFileUserService.updateById(readFileUser);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+ render(Ret.fail("未找到该文件"));
+ }
+
+ @ApiOperation("已读人员/未读人员列表")
+ @GetMapping("users")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "文件id"),
+ @ApiImplicitParam(name = "type", value = "read已读人员 unread未读人员"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "轮阅阅读情况", dataTypeClass = ReadFileUser.class)
+ })
+ public void readFileUsers(String id, String type) {
+ QueryWrapper wrapper = new QueryWrapper();
+ wrapper.eq("file_id", id);
+ if ("read".equals(type)) wrapper.eq("status", ReadFileUser.STATUS_READ);
+ if ("unread".equals(type)) wrapper.eq("status", ReadFileUser.STATUS_UNREAD);
+ List list = readFileUserService.list(wrapper);
+ render(Ret.ok().data(list));
+ }
+
+ private QueryWrapper getQueryWrapper(String fileName) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(fileName)) wrapper.like("file_name", fileName);
+ wrapper.orderByDesc("created_at");
+ return wrapper;
+ }
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiResearchArticleController.java b/src/main/java/com/ydool/boot/api/controller/ApiResearchArticleController.java
new file mode 100644
index 0000000..9fcd929
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiResearchArticleController.java
@@ -0,0 +1,74 @@
+package com.ydool.boot.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.ResearchArticle;
+import com.ydool.boot.modules.rddb.entity.ResearchArticleAttachment;
+import com.ydool.boot.modules.rddb.service.ResearchArticleAttachmentService;
+import com.ydool.boot.modules.rddb.service.ResearchArticleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * @author: zhouyuan
+ * @date: 2021/3/6
+ */
+@Controller
+@RequestMapping("/api/research_article")
+@Api(value = "调研文章", tags = "调研文章")
+public class ApiResearchArticleController extends ApiBaseController {
+
+ @Autowired
+ private ResearchArticleService researchArticleService;
+ @Autowired
+ private ResearchArticleAttachmentService researchArticleAttachmentService;
+
+ @ApiOperation("列表")
+ @GetMapping
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "title", value = "会议名称"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "对象", dataTypeClass = ResearchArticle.class)
+ })
+ public void list(String title) {
+ QueryWrapper wrapper = getQueryWrapper(title);
+ Page page = researchArticleService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ ResearchArticle researchArticle = (ResearchArticle) item;
+ //栏目列表
+ List issueList = researchArticleAttachmentService.list(new QueryWrapper().eq("pid", "").eq("research_article_id", (researchArticle.getId())));
+ //议栏目列表装附件列表
+ issueList.forEach(issue -> {
+ List conferenceAttachmentList = researchArticleAttachmentService.list(new QueryWrapper().eq("pid", issue.getId()).eq("research_article_id", (researchArticle.getId())));
+ issue.setAttachmentList(conferenceAttachmentList);
+ });
+ researchArticle.setIssueList(issueList);
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ private QueryWrapper getQueryWrapper(String title) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(title)) wrapper.like("title", title);
+ wrapper.orderByDesc("created_at");
+ return wrapper;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiStreetController.java b/src/main/java/com/ydool/boot/api/controller/ApiStreetController.java
new file mode 100644
index 0000000..50cd917
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiStreetController.java
@@ -0,0 +1,33 @@
+//package com.ydool.boot.api.controller;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.ydool.boot.common.result.Ret;
+//import com.ydool.boot.core.web.BaseController;
+//import com.ydool.boot.modules.sys.entity.Street;
+//import com.ydool.boot.modules.sys.service.StreetService;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Controller;
+//import org.springframework.web.bind.annotation.GetMapping;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//
+///**
+// * @author chenchen
+// * @date 2020/10/12
+// */
+//@Controller
+//@RequestMapping("/api/street")
+//@Api(value = "街道", tags = "街道")
+//public class ApiStreetController extends BaseController {
+//
+// @Autowired
+// private StreetService streetService;
+//
+// @ApiOperation("街道列表")
+// @GetMapping("")
+// public void list() {
+// render(Ret.ok().data(streetService.list(new QueryWrapper().orderByAsc("sort_no"))));
+// }
+//
+//}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiSuperviseThingController.java b/src/main/java/com/ydool/boot/api/controller/ApiSuperviseThingController.java
new file mode 100644
index 0000000..756fb41
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiSuperviseThingController.java
@@ -0,0 +1,407 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.api.util.SensitiveFilterService;
+import com.ydool.boot.common.cache.StreetUtils;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.*;
+import com.ydool.boot.modules.rddb.service.SuperviseThingAttachmentService;
+import com.ydool.boot.modules.rddb.service.SuperviseThingCommentService;
+import com.ydool.boot.modules.rddb.service.SuperviseThingService;
+import com.ydool.boot.modules.rddb.service.SuperviseThingUserService;
+import com.ydool.boot.modules.sys.entity.Street;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/15
+ */
+@Controller
+@RequestMapping("/api/supervise_thing")
+@Api(value = "督事", tags = "督事")
+public class ApiSuperviseThingController extends ApiBaseController {
+
+ @Autowired
+ private SuperviseThingService superviseThingService;
+ @Autowired
+ private SuperviseThingCommentService superviseThingCommentService;
+ @Autowired
+ private SuperviseThingUserService superviseThingUserService;
+ @Autowired
+ private UserService userService;
+ @Autowired
+ private SuperviseThingAttachmentService superviseThingAttachmentService;
+
+ @ApiOperation("现有督事统计")
+ @GetMapping("statistics")
+ public void thingStatistics() {
+ List streetList = StreetUtils.getStreetList();
+ streetList.forEach(item -> {
+ Integer count = superviseThingService.count(new LambdaQueryWrapper().eq(SuperviseThing::getStreet, item.getId()));
+ item.setRemarks(count.toString());
+ item.setContent(null);
+ });
+ render(Ret.ok().data(streetList));
+ }
+
+ @ApiOperation("统计的根据街道的督事列表")
+ @GetMapping("statistic_list/{streetId}")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "streetId", value = "街道id"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "督事", dataTypeClass = SuperviseThing.class)
+ })
+ public void thingStatisticsList(@PathVariable String streetId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("street",streetId).orderByDesc("start_time");
+ Page page = superviseThingService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ SuperviseThing superviseThing = (SuperviseThing) item;
+ superviseThing.full();
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("公开完成督事列表")
+ @GetMapping("list")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "督事", dataTypeClass = SuperviseThing.class)
+ })
+ public void thingPublicList() {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("status", SuperviseThing.STATUS_PING);
+ wrapper.eq("is_public", SuperviseThing.PUBLIC);
+ wrapper.orderByDesc("start_time");
+ Page page = superviseThingService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ SuperviseThing superviseThing = (SuperviseThing) item;
+ superviseThing.full();
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("参加的或本人创建的督事列表 ")
+ @GetMapping("private_list")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "type", value = "join参加 create创建"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "督事", dataTypeClass = SuperviseThing.class)
+ })
+ public void thingPrivateList(String type) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ if ("join".equals(type))
+ wrapper.inSql("id", "select supervise_thing_id from t_supervise_thing_user where user_id='" + getApiUserId() + "'");
+ if ("create".equals(type))
+ wrapper.eq("created_id", getApiUserId());
+ wrapper.orderByDesc("start_time");
+ Page page = superviseThingService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ SuperviseThing superviseThing = (SuperviseThing) item;
+ superviseThing.full();
+
+ if ("join".equals(type)) {
+ //当前登录用户是否已签到
+ SuperviseThingUser superviseThingUser = superviseThingUserService.getOne(new QueryWrapper().eq("supervise_thing_id", ((SuperviseThing) item).getId()).eq("user_id", getApiUserId()));
+ superviseThing.setSign(superviseThingUser != null ? superviseThingUser.getStatus() : null);
+ superviseThing.setSignTime(superviseThingUser != null ? superviseThingUser.getUpdatedAt() : null);
+ }
+
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("督事详情")
+ @GetMapping("detail")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "督事", dataTypeClass = SuperviseThing.class)
+ })
+ public void thingDetail(String id) {
+ SuperviseThing superviseThing = superviseThingService.getById(id);
+ if (superviseThing != null) {
+ superviseThing.full();
+
+ //当前登录用户是否已签到
+ SuperviseThingUser superviseThingUser = superviseThingUserService.getOne(new QueryWrapper().eq("supervise_thing_id", id).eq("user_id", getApiUserId()));
+ superviseThing.setSign(superviseThingUser != null ? superviseThingUser.getStatus() : null);
+ superviseThing.setSignTime(superviseThingUser != null ? superviseThingUser.getUpdatedAt() : null);
+
+ //该会议应签到人数和现签到人数
+ int allSignCount = superviseThingUserService.count(new QueryWrapper().eq("supervise_thing_id", id));
+ int unSignCount = superviseThingUserService.count(new QueryWrapper().eq("supervise_thing_id", id).eq("status", ConferenceUser.STATUS_UN_SIGN));
+ superviseThing.setAllSignCount(allSignCount);
+ superviseThing.setSignedCount(allSignCount - unSignCount);
+
+ render(Ret.ok().data(superviseThing));
+ }
+ render(Ret.fail("未找到该督事"));
+ }
+
+ @ApiOperation("督事已签到/未签到 人员列表")
+ @GetMapping("sign_user")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "督事id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "督事", dataTypeClass = SuperviseThingUser.class)
+ })
+ public void thingSignUser(String id) {
+ List superviseThingUsers = superviseThingUserService.list(new QueryWrapper().eq("supervise_thing_id", id));
+ render(Ret.ok().data(superviseThingUsers));
+ }
+
+ @ApiOperation("督事评论列表")
+ @GetMapping("comments")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ @ApiImplicitParam(name = "id", value = "督事id")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "督事评论信息", dataTypeClass = SuperviseThingComment.class)
+ })
+ public void thingComments(String id) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("supervise_thing_id", id);
+ wrapper.eq("status", SuperviseThingComment.STATUS_PASS);
+ wrapper.orderByDesc("created_at");
+ Page page = superviseThingCommentService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ page.getRecords().forEach(item -> {
+ SuperviseThingComment superviseThingComment = (SuperviseThingComment) item;
+ //回复人的信息
+ User user = userService.getById(superviseThingComment.getReplyUserId());
+ if (user != null) {
+ if (StrUtil.isNotBlank(user.getAvatar())) user.setAvatar(Const.URL_PREFIX + user.getAvatar());
+ superviseThingComment.setUser(user);
+ }
+ //评论人的信息
+ User createUser = userService.getById(superviseThingComment.getCreatedId());
+ if (createUser != null) {
+ if (StrUtil.isNotBlank(createUser.getAvatar()))
+ createUser.setAvatar(Const.URL_PREFIX + createUser.getAvatar());
+ superviseThingComment.setCreateUser(createUser);
+ }
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("评论督事")
+ @PostMapping("comment")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ @ApiImplicitParam(name = "content", value = "评论")
+ })
+ public void thingComment(String id, String content) {
+ if (StrUtil.isBlank(content)) render(Ret.fail("请输入内容"));
+ SensitiveFilterService instance = SensitiveFilterService.getInstance();
+ Set sensitiveContents = instance.getSensitiveWord(content, 1);
+ if (sensitiveContents.size() > 0) render(Ret.fail("您输入的内容含有非法词汇"));
+
+ SuperviseThingComment superviseThingComment = new SuperviseThingComment();
+ superviseThingComment.setSuperviseThingId(id);
+ superviseThingComment.setContent(content);
+ superviseThingComment.setCreatedId(getApiUserId());
+ superviseThingComment.setName(getApiUser().getUserName());
+ //改为默认通过 由后台进行删除
+ superviseThingComment.setStatus(SuperviseThingComment.STATUS_PASS);
+ boolean flag = superviseThingCommentService.saveOrUpdate(superviseThingComment);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+
+ @ApiOperation("回复")
+ @PostMapping("replay_comment")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事评论id"),
+ @ApiImplicitParam(name = "content", value = "评论")
+ })
+ public void replayThingComment(String id, String content) {
+ if (StrUtil.isBlank(content)) render(Ret.fail("请输入内容"));
+ SensitiveFilterService instance = SensitiveFilterService.getInstance();
+ Set sensitiveContents = instance.getSensitiveWord(content, 1);
+ if (sensitiveContents.size() > 0) render(Ret.fail("您输入的内容含有非法词汇"));
+ SuperviseThingComment superviseThingComment = superviseThingCommentService.getById(id);
+ if (superviseThingComment != null) {
+ superviseThingComment.setReplyUserId(getApiUserId());
+ superviseThingComment.setReplyContent(content);
+ superviseThingComment.setReplyTime(LocalDateTime.now());
+ superviseThingCommentService.updateById(superviseThingComment);
+ boolean flag = superviseThingCommentService.saveOrUpdate(superviseThingComment);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+ render(Ret.fail("未找到该评论"));
+ }
+
+ @ApiOperation("新增督事 //督事新增后进入议状态")
+ @PostMapping("save")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "superviseThing", value = "督事对象", dataTypeClass = SuperviseThing.class),
+ @ApiImplicitParam(name = "userIds", value = "选择的用户id,多个以英文逗号间隔")
+ })
+ public void thingSave(@Validated SuperviseThing superviseThing, @RequestParam(name = "userIds", defaultValue = "") String userIds) {
+ render(superviseThingService.insertOrUpdate(superviseThing, getApiUser(), userIds, null));
+ }
+
+ @ApiOperation("上传督事资料")
+ @PostMapping("upload_data")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ @ApiImplicitParam(name = "record", value = "会议纪要"),
+ @ApiImplicitParam(name = "deptReply", value = "会议部门回复"),
+ @ApiImplicitParam(name = "picture", value = "会议图片,多张逗号间隔"),
+ })
+ public void thingUploadData(String id, String record, String deptReply, String picture) {
+ SuperviseThing superviseThing = superviseThingService.getById(id);
+ superviseThing.setRecord(record);
+ superviseThing.setDeptReply(deptReply);
+
+ superviseThingService.uploadFile(id, picture, "督", getApiUserId());
+
+ //需要至少上传过一次督事文件的才能进入评环节
+ int count = superviseThingAttachmentService.count(new LambdaQueryWrapper().eq(SuperviseThingAttachment::getSuperviseThingId, id));
+ //默认我们给了问 议 督 评 四个议题
+ if (count > 4) {
+ //进入评状态
+ superviseThing.setStatus(SuperviseThing.STATUS_PING);
+ }
+
+ boolean flag = superviseThingService.updateById(superviseThing);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiOperation("上传督事文件")
+ @PostMapping("upload_file")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ @ApiImplicitParam(name = "picture", value = "会议图片,多张逗号间隔"),
+ @ApiImplicitParam(name = "status", value = "问/议/督/评"),
+ })
+ public void thingUploadFile(String id, String picture, String status) {
+ render(superviseThingService.uploadFile(id, picture, status, getApiUserId()));
+ }
+
+
+ @ApiOperation("手动进入督环节")
+ @PostMapping("to_do")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ })
+ public void thingToDo(String id) {
+ SuperviseThing superviseThing = this.superviseThingService.getById(id);
+ if (superviseThing != null) {
+ superviseThing.setStatus(SuperviseThing.STATUS_DU);
+ boolean flag = superviseThingService.updateById(superviseThing);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+ render(Ret.fail("未找到该督事"));
+ }
+
+ @ApiOperation("签到/请假 //全部人员签到后由议进入督状态")
+ @PostMapping("sign_in")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ @ApiImplicitParam(name = "type", value = "sign签到 leave请假"),
+ })
+ public void thingSignIn(String id, String type) {
+ SuperviseThingUser superviseThingUser = superviseThingUserService.getOne(new QueryWrapper().eq("supervise_thing_id", id).eq("user_id", getApiUserId()));
+ if (superviseThingUser != null) {
+ if ("sign".equals(type))
+ superviseThingUser.setStatus(SuperviseThingUser.STATUS_SIGN);
+ if ("leave".equals(type))
+ superviseThingUser.setStatus(SuperviseThingUser.STATUS_LEAVE);
+ //签到 及检查是否全部签到完成更新督事状态
+ render(superviseThingUserService.signIn(superviseThingUser));
+ }
+ render(Ret.fail("未找到该督事"));
+ }
+
+
+ @ApiOperation("获取签到状态")
+ @GetMapping("sign_status")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "督事id")
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", value = "签到信息", dataTypeClass = SuperviseThingUser.class)
+ })
+ public void thingSignStatus(String id) {
+ SuperviseThingUser superviseThingUser = superviseThingUserService.getOne(new QueryWrapper().eq("supervise_thing_id", id).eq("user_id", getApiUserId()));
+ render(Ret.ok().data(superviseThingUser));
+ }
+
+
+ @ApiOperation("公开/不公开")
+ @PostMapping("change_isPublic")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "督事id"),
+ @ApiImplicitParam(name = "type", value = "public公开 private不公开"),
+ })
+ public void thingChangePublic(String id, String type) {
+ SuperviseThing superviseThing = superviseThingService.getById(id);
+ if (superviseThing != null) {
+ if ("public".equals(type))
+ superviseThing.setIsPublic(SuperviseThing.PUBLIC);
+ if ("private".equals(type))
+ superviseThing.setIsPublic(SuperviseThing.NO_PUBLIC);
+ boolean flag = superviseThingService.updateById(superviseThing);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+ render(Ret.fail("未找到该督事"));
+ }
+
+ @ApiOperation("删除督事")
+ @GetMapping("del")
+ @ResponseBody
+ @ApiImplicitParam(name = "id", value = "id")
+ public void thingDel(String id) {
+ SuperviseThing superviseThing = superviseThingService.getById(id);
+ if (superviseThing != null) {
+ if (!superviseThing.getCreatedId().equals(getApiUserId())) render(Ret.fail("您不能删除他人创建的会议的文件"));
+ boolean flag = superviseThingService.removeById(id);
+ render(flag ? Ret.ok() : Ret.fail("操作失败"));
+ }
+ render(Ret.fail("未找到该督事"));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiTemporaryController.java b/src/main/java/com/ydool/boot/api/controller/ApiTemporaryController.java
new file mode 100644
index 0000000..b9632ba
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiTemporaryController.java
@@ -0,0 +1,132 @@
+package com.ydool.boot.api.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydool.boot.api.util.Kv;
+import com.ydool.boot.common.cache.DictUtils;
+import com.ydool.boot.common.cache.StreetUtils;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.modules.rddb.entity.Temporary;
+import com.ydool.boot.modules.rddb.service.TemporaryService;
+import com.ydool.boot.modules.sys.entity.Street;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/21
+ */
+@Controller
+@RequestMapping("/api/temporary")
+@Api(value = "临时文件", tags = "临时文件")
+public class ApiTemporaryController extends ApiBaseController {
+
+ @Autowired
+ TemporaryService temporaryService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "fileName", value = "名称"),
+ @ApiImplicitParam(name = "type", value = "1 或2 1决议决定 2议案建议"),
+ @ApiImplicitParam(name = "category", value = "字典temporary_category"),
+ @ApiImplicitParam(name = "page", value = "当前页"),
+ @ApiImplicitParam(name = "size", value = "显示条数"),
+ })
+ @ApiOperation("临时功能 列表")
+ @GetMapping("")
+ public void temporaryList(String fileName, String type, String category) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(fileName)) queryWrapper.like("file_name", fileName);
+ if (StringUtils.isNotBlank(type)) {
+ queryWrapper.eq("type", type);
+ if ("1".equals(type)) {
+ queryWrapper.orderByDesc("created_at");
+ } else {
+ queryWrapper.orderByAsc("sort_no", "created_at");
+ }
+ }
+ if (StringUtils.isNotBlank(category)) queryWrapper.eq("category", category);
+
+ Page page = temporaryService.page(new Page(getPageNum(), getPageSize()), queryWrapper);
+
+ page.getRecords().forEach(item -> {
+ Temporary temporary = (Temporary) item;
+ temporary.setFullRate(DictUtils.getDictLabel("temporary_full_rate", temporary.getFullRate()));
+ temporary.setSatisfactoryRate(DictUtils.getDictLabel("temporary_satisfactory_rate", temporary.getSatisfactoryRate()));
+ });
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("议案建议统计")
+ @GetMapping("statistics")
+ public void statistics() {
+ List list = new ArrayList();
+ List streetList = StreetUtils.getStreetList();
+ streetList.forEach(item -> {
+ //完成度是
+ Integer finishCount = temporaryService.count(new LambdaQueryWrapper().eq(Temporary::getType, 2).eq(Temporary::getStreet,item.getId()).eq(Temporary::getFullRate, 1));
+ //完成度否
+ Integer unFinishCount = temporaryService.count(new LambdaQueryWrapper().eq(Temporary::getType, 2).eq(Temporary::getStreet,item.getId()).eq(Temporary::getFullRate, 2));
+ //满意度满意
+ Integer satisfactionCount = temporaryService.count(new LambdaQueryWrapper().eq(Temporary::getType, 2).eq(Temporary::getStreet,item.getId()).eq(Temporary::getSatisfactoryRate, 1));
+ //满意度不满意
+ Integer unSatisfaction = temporaryService.count(new LambdaQueryWrapper().eq(Temporary::getType, 2).eq(Temporary::getStreet,item.getId()).eq(Temporary::getSatisfactoryRate, 2));
+
+ Kv kv = Kv.create();
+ kv.put("streetName", item.getName());
+ kv.put("finishCount", finishCount);
+ kv.put("unFinishCount", unFinishCount);
+ kv.put("satisfactionCount", satisfactionCount);
+ kv.put("unSatisfaction", unSatisfaction);
+ list.add(kv);
+ });
+
+ //各乡镇街道,完成度、满意度的统计
+ render(Ret.ok().data(list));
+ }
+
+// @ApiImplicitParams({
+// @ApiImplicitParam(name = "fileName", value = "名称"),
+// @ApiImplicitParam(name = "type", value = "1 或2 1决议决定 2议案建议"),
+// @ApiImplicitParam(name = "file", value = "文件路径 单文件"),
+// })
+// @ApiOperation("添加")
+// @PostMapping("save")
+// public void save(String fileName, String type, String file) {
+// Temporary temporary = new Temporary();
+// temporary.setFileName(fileName);
+// temporary.setType(type);
+// temporary.setFile(file);
+// temporary.setCreatedId(getApiUserId());
+// temporary.setUploadUser(getApiUser().getUserName());
+// boolean flag = temporaryService.saveOrUpdate(temporary);
+// render(!flag ? Ret.fail("操作失败") : Ret.ok());
+// }
+
+ @ApiImplicitParam(name = "id", value = "id")
+ @ApiOperation("删除")
+ @DeleteMapping("del")
+ public void temporaryDel(String id) {
+ Temporary temporary = temporaryService.getById(id);
+ if (temporary != null) {
+ if (!temporary.getCreatedId().equals(getApiUserId())) render(Ret.fail("您不能删除他人上传的文件"));
+ boolean flag = temporaryService.removeById(temporary);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+ render(Ret.fail("未找到该资料"));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiUploadController.java b/src/main/java/com/ydool/boot/api/controller/ApiUploadController.java
new file mode 100644
index 0000000..59d23e4
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiUploadController.java
@@ -0,0 +1,54 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.web.BaseController;
+import com.ydool.boot.modules.sys.service.FileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @author chenchen
+ * @date 2020/10/13
+ */
+@Controller
+@RequestMapping("/api/upload")
+@Api(value = "上传文件", tags = "上传文件")
+public class ApiUploadController extends BaseController {
+
+ @Resource
+ private FileService fileService;
+
+ @ApiOperation("上传文件")
+ @PostMapping(value = "/upload_json")
+ public void uploadJson(@NotNull(message = "file is null") @RequestParam("files") MultipartFile[] files) {
+ List pathList = new ArrayList<>();
+ for (MultipartFile file : files) {
+ String reg = ".+(.exe|.bat|.sh|.java|.php|.js|.py)$";
+ String suffix = FileUtil.getSuffix(file.getOriginalFilename());
+ if(Pattern.matches(reg,file.getOriginalFilename())){
+ render(Ret.fail("不能上传后缀为"+suffix+"的文件"));
+ }
+ String str = fileService.uploadFile(file);
+ if (StrUtil.isNotBlank(str)) {
+ pathList.add(str);
+ }
+ }
+ boolean flag = CollUtil.isNotEmpty(pathList);
+ render(flag ? Ret.ok().data(pathList) : Ret.fail("操作失败"));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiUserController.java b/src/main/java/com/ydool/boot/api/controller/ApiUserController.java
new file mode 100644
index 0000000..e98b5ae
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiUserController.java
@@ -0,0 +1,205 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.api.util.Kv;
+import com.ydool.boot.common.Ydool;
+import com.ydool.boot.common.cache.ConfigUtils;
+import com.ydool.boot.common.config.Global;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.validator.NumberLetter;
+import com.ydool.boot.core.validator.Password;
+import com.ydool.boot.modules.rddb.entity.Const;
+import com.ydool.boot.modules.rddb.entity.Db;
+import com.ydool.boot.modules.rddb.entity.Office;
+import com.ydool.boot.modules.rddb.entity.UserType;
+import com.ydool.boot.modules.rddb.service.DbService;
+import com.ydool.boot.modules.rddb.service.OfficeService;
+import com.ydool.boot.modules.rddb.service.SyncNameService;
+import com.ydool.boot.modules.rddb.service.UserTypeService;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotBlank;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/10
+ */
+@RestController
+@RequestMapping(value = "/api/user")
+@Api(value = "用户信息接口", tags = "用户信息")
+public class ApiUserController extends ApiBaseController {
+
+ @Autowired
+ private OfficeService officeService;
+ @Autowired
+ private DbService dbService;
+ @Autowired
+ private UserService userService;
+ @Autowired
+ private SyncNameService syncNameService;
+ @Autowired
+ private UserTypeService userTypeService;
+
+ @GetMapping("")
+ @ResponseBody
+ @ApiOperation(value = "获取当前登录用户的信息")
+ public void info() {
+ User user = getApiUser();
+ if (StringUtils.isNotBlank(user.getAvatar())) user.setAvatar(Const.URL_PREFIX + user.getAvatar());
+ Kv kv = Kv.create().set("user", user);
+ //机关干部
+ if (isAdmin() || isStreet() || isContact()) {
+ Office office = officeService.getOne(new QueryWrapper().eq("user_id", user.getId()));
+ if (office != null) {
+ office.fullInfo();
+ }
+ kv.set("office", office);
+ }
+ //人大代表
+ if (isRddb()) {
+ Db rddb = dbService.getOne(new QueryWrapper().eq("user_id", user.getId()));
+ kv.set("rddb", rddb);
+ }
+ //选民没有其他信息
+ render(Ret.ok().data(kv));
+ }
+
+ @PostMapping("")
+ @ResponseBody
+ @ApiOperation(value = "修改用户信息")
+ @ApiImplicitParams(value = {
+ @ApiImplicitParam(name = "name", value = "名字"),
+ @ApiImplicitParam(name = "portrait", value = "头像"),
+ @ApiImplicitParam(name = "street", value = "辖区")
+ })
+ public void info(@RequestParam("portrait") String portrait, @RequestParam("name") String name, @RequestParam("street") String street) {
+ if (StrUtil.isNotBlank(portrait) && portrait.contains(Const.URL_PREFIX))
+ portrait = portrait.replace(Const.URL_PREFIX, "");
+
+ User user = getApiUser();
+ user.setUserName(name);
+ user.setAvatar(portrait);
+ user.setStreetId(street);
+ //机关干部
+ if (isAdmin() || isStreet() || isContact()) {
+ Office office = officeService.getOne(new QueryWrapper().eq("user_id", user.getId()));
+ if (office != null) {
+ office.setStreet(street);
+
+ if (!office.getName().equals(name)) {
+ //改了用户名,需要同步
+ office.setName(name);
+ syncNameService.sync(user);
+ }
+ officeService.update(user, office);
+ }
+ }
+ //人大代表
+ if (isRddb()) {
+ Db rddb = dbService.getOne(new QueryWrapper().eq("user_id", user.getId()));
+ rddb.setName(name);
+ rddb.setPrecinctAddress(street);
+ dbService.update(user, rddb);
+ }
+ //选民只有基本信息
+ //都需要更新user
+ userService.saveOrUpdate(user);
+
+ render(Ret.ok());
+ }
+
+ @ApiOperation("用户列表")
+ @GetMapping("users")
+ @ResponseBody
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "type", value = "不传为全部,传多个以英文逗号分隔 admin县级人大工作人员 street乡镇负责人 contact联络站负责人 rddb各级人大代表 voter选民用户"),
+ @ApiImplicitParam(name = "userName", value = "用户名")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = User.class)
+ })
+ public void users(String type, String userName) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(type)) {
+ wrapper.and(consumer -> {
+ if (type.contains("admin")) consumer.or().eq("account_type", "admin");
+ if (type.contains("rddb")) consumer.or().eq("account_type", "rddb");
+ if (type.contains("voter")) consumer.or().eq("account_type", "voter");
+ if (type.contains("street")) consumer.or().eq("account_type", "street");
+ if (type.contains("contact")) consumer.or().eq("account_type", "contact");
+ });
+ }
+ if (StringUtils.isNotBlank(userName)) wrapper.like("user_name", userName);
+ Page page = userService.page(new Page(getPageNum(), getPageSize()), wrapper);
+ render(Ret.ok().paged(page));
+ }
+
+ @ApiOperation("重置密码")
+ @PostMapping(value = "reset_pwd")
+ public void resetPwd() {
+ User user = getApiUser();
+ user.setSalt(RandomUtil.randomString(6));
+ user.setPassword(Ydool.password(user.getSalt(), Global.getConfig(ConfigUtils.USER_INIT_PASSWORD)));
+ user.setInitPwd(true);
+ renderJson(userService.updateById(user) ? Ret.ok().msg("用户密码已被初始化,初始后的密码是:" + Global.getConfig(ConfigUtils.USER_INIT_PASSWORD)) : Ret.fail("重置用户密码失败"));
+ }
+
+
+ @ApiOperation("修改密码")
+ @PostMapping(value = "edit_pwd")
+ public void editPwd(
+ @NotBlank(message = "请输入旧密码") String oldPassword,
+ @NumberLetter(message = "密码需带有英文,数字") String newPassword,
+ @NotBlank(message = "请输入确认密码") String confirmNewPassword) {
+ User user = getApiUser();
+ if (!(Ydool.password(user.getSalt(), oldPassword)).equals(user.getPassword())) renderJson(Ret.fail("旧密码不正确"));
+ if ((Ydool.password(user.getSalt(), newPassword)).equals(user.getPassword()))
+ renderJson(Ret.fail("新密码不可与旧密码相同"));
+ if (!confirmNewPassword.equals(newPassword)) renderJson(Ret.fail("两次密码不相同"));
+ user.setPassword(Ydool.password(user.getSalt(), newPassword));
+ user.setInitPwd(false);
+ user.setLastUpdatePwd(LocalDateTime.now());
+ boolean flag = userService.saveOrUpdate(user);
+ renderJson(flag ? Ret.ok().msg("密码修改成功") : Ret.fail("密码修改失败"));
+ }
+
+ @ApiOperation("当前登录用户的身份列表")
+ @GetMapping("types")
+ @ResponseBody
+ public void types() {
+ User user = getApiUser();
+ List typeList = userTypeService.list(new LambdaQueryWrapper().ne(UserType::getType, user.getAccountType()).eq(UserType::getUserId, user.getId())).stream().map(UserType::getType).collect(Collectors.toList());
+ render(Ret.ok().data(typeList));
+ }
+
+ @ApiOperation("切换身份")
+ @PostMapping(value = "change_type")
+ public void changeType(String type) {
+ User user = getApiUser();
+ List typeList = userTypeService.list(new LambdaQueryWrapper().eq(UserType::getUserId, user.getId())).stream().map(UserType::getType).collect(Collectors.toList());
+ if (typeList.contains(type)) {
+ user.setAccountType(type);
+ boolean flag = userService.updateById(user);
+ renderJson(flag ? Ret.ok().msg("修改成功") : Ret.fail("修改失败"));
+ }
+ renderJson(Ret.fail("该用户没有此身份"));
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiVoterSuggestController.java b/src/main/java/com/ydool/boot/api/controller/ApiVoterSuggestController.java
new file mode 100644
index 0000000..6f3aa1c
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiVoterSuggestController.java
@@ -0,0 +1,377 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.mybatis.Condition;
+import com.ydool.boot.modules.rddb.entity.Message;
+import com.ydool.boot.modules.rddb.entity.Office;
+import com.ydool.boot.modules.rddb.entity.VoterSuggest;
+import com.ydool.boot.modules.rddb.entity.VoterSuggestSolve;
+import com.ydool.boot.modules.rddb.service.MessageService;
+import com.ydool.boot.modules.rddb.service.OfficeService;
+import com.ydool.boot.modules.rddb.service.VoterSuggestService;
+import com.ydool.boot.modules.rddb.service.VoterSuggestSolveService;
+import com.ydool.boot.modules.rddb.vo.VoterSuggestSolveVO;
+import com.ydool.boot.modules.rddb.vo.VoterSuggestVO;
+import com.ydool.boot.modules.rddb.wrapper.VoterSuggestSolveWrapper;
+import com.ydool.boot.modules.rddb.wrapper.VoterSuggestWrapper;
+import com.ydool.boot.modules.sys.entity.User;
+import com.ydool.boot.modules.sys.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 选民建议
+ *
+ * @author chenchen
+ * @date 2020/10/12
+ */
+@Controller
+@RequestMapping("/api/voter_suggest")
+@Api(value = "选民建议", tags = "选民建议")
+public class ApiVoterSuggestController extends ApiBaseController {
+
+ @Autowired
+ private VoterSuggestService voterSuggestService;
+
+ @Autowired
+ private VoterSuggestSolveService voterSuggestSolveService;
+
+ @Autowired
+ private MessageService messageService;
+
+ @Autowired
+ private UserService userService;
+
+ @Autowired
+ private OfficeService officeService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "suggestTitle", value = "建议名称")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestVO.class)
+ })
+ @ApiOperation("选民建议列表")
+ @GetMapping("/list/all")
+ public void voterSuggestListAll(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String suggestTitle) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(suggestTitle, "suggest_title#like", qw);
+ qw.eq("street_id", getApiUser().getStreetId());
+ qw.orderByDesc("created_at");
+ IPage paged = voterSuggestService.page(new Page<>(pageNo, pageSize), qw);
+ for (VoterSuggest record : paged.getRecords()) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("voter_suggest_id", record.getId());
+// wrapper.eq("status", "1");
+ wrapper.orderByDesc("created_at");
+ List voterSuggestSolves = voterSuggestSolveService.list(wrapper);
+ List voterSuggestSolveVoS = new ArrayList<>();
+ for (VoterSuggestSolve item : voterSuggestSolves) {
+ VoterSuggestSolveVO solveVO = VoterSuggestSolveWrapper.build().entityVO(item);
+ voterSuggestSolveVoS.add(solveVO);
+ }
+ record.setVoterSuggestSolveList(voterSuggestSolveVoS);
+ }
+ render(Ret.ok().paged(VoterSuggestWrapper.build().pageVO(paged)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestVO.class)
+ })
+ @ApiOperation("我的建议")
+ @GetMapping("/list")
+ public void voterSuggestList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+ QueryWrapper qw = getQueryWrapper(getApiUserId());
+ IPage paged = voterSuggestService.page(new Page<>(pageNo, pageSize), qw);
+// for (VoterSuggest record : paged.getRecords()) {
+// QueryWrapper wrapper = new QueryWrapper<>();
+// wrapper.eq("voter_suggest_id", record.getId());
+// wrapper.eq("status", "1");
+// wrapper.orderByDesc("created_at");
+// List voterSuggestSolves = voterSuggestSolveService.list(wrapper);
+// List voterSuggestSolveVoS = new ArrayList<>();
+// for (VoterSuggestSolve item : voterSuggestSolves) {
+// VoterSuggestSolveVO solveVO = VoterSuggestSolveWrapper.build().entityVO(item);
+// voterSuggestSolveVoS.add(solveVO);
+// }
+// record.setVoterSuggestSolveList(voterSuggestSolveVoS);
+// }
+ render(Ret.ok().paged(VoterSuggestWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperationSupport(
+ responses = @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestVO.class)
+ })
+ )
+ @ApiOperation("建议详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void voterSuggest(@PathVariable("id") String id) {
+ VoterSuggest bean = voterSuggestService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该建议"));
+ return;
+ }
+
+ //建议回复已读状态
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("voter_suggest_id", id);
+ wrapper.eq("status", "1");
+ List voterSuggestSolves = voterSuggestSolveService.list(wrapper);
+ for (VoterSuggestSolve item : voterSuggestSolves) {
+ item.setIsRead(1);
+ voterSuggestSolveService.saveOrUpdate(item);
+ }
+
+ VoterSuggestVO vo = VoterSuggestWrapper.build().entityVO(bean);
+ render(Ret.ok().data(vo));
+ }
+
+ @ApiImplicitParams({
+// @ApiImplicitParam(name = "voterName", value = "选民姓名", required = true),
+ @ApiImplicitParam(name = "suggestTitle", value = "建议标题", required = true),
+ @ApiImplicitParam(name = "suggestContent", value = "建议内容", required = true),
+ @ApiImplicitParam(name = "streetId", value = "街道"),
+ @ApiImplicitParam(name = "liaisonStationId", value = "联络站"),
+ @ApiImplicitParam(name = "photo", value = "图片")
+ })
+ @ApiOperation("提交选民建议")
+ @PostMapping("/save")
+ public void save(String suggestTitle, String suggestContent, String streetId, String liaisonStationId, String photo) {
+ VoterSuggest entity = new VoterSuggest();
+ entity.setSuggestTitle(suggestTitle);
+ entity.setSuggestContent(suggestContent);
+ entity.setStreetId(streetId);
+ entity.setPhoto(photo);
+ entity.setCreatedId(getApiUserId());
+ entity.setVoterName(getApiUser().getUserName());
+ boolean flag = voterSuggestService.saveOrUpdate(entity);
+ //添加消息
+ if (flag) {
+ List users = userService.list(new QueryWrapper().eq("street_id", streetId));
+ for (User user : users) {
+ Message message = new Message();
+ message.setActionId(entity.getId());
+ message.setTitle("收到一条选民建议,请前往查看!");
+ message.setContent(suggestTitle);
+ message.setType(Message.TYPE_VOTER_STREET);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(user.getId());
+ messageService.save(message);
+ }
+ if (StrUtil.isNotBlank(liaisonStationId)) {
+ Office office = officeService.getById(liaisonStationId);
+ if (office != null) {
+ Message message = new Message();
+ message.setActionId(entity.getId());
+ message.setTitle("收到一条选民建议,请前往查看!");
+ message.setContent(suggestTitle);
+ message.setType(Message.TYPE_VOTER_STREET);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(office.getUserId());
+ messageService.save(message);
+ }
+ }
+
+ }
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiOperation("回复选民建议")
+ @PostMapping("/solve/save")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "voterSuggestId", value = "选民建议id", required = true),
+ @ApiImplicitParam(name = "replyContent", value = "回复内容", required = true)
+ })
+ public void solve(String voterSuggestId, String replyContent) {
+ VoterSuggestSolve bean = voterSuggestSolveService.getOne(new QueryWrapper()
+ .eq("voter_suggest_id", voterSuggestId).eq("user_id", getApiUserId()));
+ if (bean == null) {
+ //该建议未分配人员解决或你不是解决人员的时候,联络站和乡镇管理员可以回复
+ bean = new VoterSuggestSolve();
+ bean.setVoterSuggestId(voterSuggestId);
+ bean.setUserId(getApiUserId());
+ bean.setCreatedId(getApiUserId());
+// render(Ret.fail("该建议无法回复"));
+// return;
+ }
+ bean.setReplyContent(replyContent);
+ bean.setUpdatedId(getApiUserId());
+ bean.setStatus("1");
+ bean.setIsRead(0);
+ boolean flag = voterSuggestSolveService.saveOrUpdate(bean);
+ //添加消息
+ if (flag) {
+ VoterSuggest voterSuggest = voterSuggestService.getById(voterSuggestId);
+ Message message = new Message();
+ message.setActionId(voterSuggestId);
+ message.setTitle(getApiUser().getUserName() + "回复了您的建议");
+ message.setContent(replyContent);
+ message.setType(Message.TYPE_VOTER);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(voterSuggest.getCreatedId());
+ messageService.save(message);
+ }
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "voterSuggestId", value = "选民建议id", required = true)
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(name = "data", dataTypeClass = VoterSuggestSolveVO.class)
+ })
+ @ApiOperation("建议 回复列表")
+ @GetMapping("/solve/list")
+ public void solve(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String voterSuggestId) {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("voter_suggest_id", voterSuggestId);
+// wrapper.eq("status", "1");
+ wrapper.orderByDesc("created_at");
+ IPage paged = voterSuggestSolveService.page(new Page<>(pageNo, pageSize), wrapper);
+ render(Ret.ok().paged(VoterSuggestSolveWrapper.build().pageVO(paged)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ @ApiImplicitParam(name = "suggestTitle", value = "建议名称")
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestVO.class)
+ })
+ @ApiOperation("待回复建议列表")
+ @GetMapping("/wait_reply")
+ public void waitReplyList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+ String suggestTitle) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(suggestTitle, "suggest_title#like", qw);
+ qw.apply("FIND_IN_SET ('" + getApiUserId() + "',allot_obj)");
+ IPage paged = voterSuggestService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(VoterSuggestWrapper.build().pageVO(paged)));
+ }
+
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "我的建议-未读", name = "count")
+ })
+ @ApiOperation("我的建议-未读")
+ @GetMapping("/unread")
+ public void unRead() {
+ int count = voterSuggestService.unRead(getApiUserId());
+ render(Ret.ok().set("count", count));
+ }
+
+ @ApiOperation("我的建议-已读")
+ @GetMapping("/read")
+ public void read() {
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("created_id", getApiUserId());
+ List list = voterSuggestService.list(wrapper);
+ list.forEach(item -> {
+ List list1 = voterSuggestSolveService.list(new QueryWrapper()
+ .eq("voter_suggest_id", item.getId()).eq("status", "1").eq("is_read", 0));
+ list1.forEach(item1 -> {
+ item1.setIsRead(1);
+ voterSuggestSolveService.saveOrUpdate(item1);
+ });
+ });
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "建议id", required = true)
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestSolveVO.class)
+ })
+ @ApiOperation("已分配人员")
+ @GetMapping("/yet_allocation")
+ public void yetAllocation(String id) {
+ if (StrUtil.isBlank(id)) {
+ render(Ret.fail("id is null"));
+ return;
+ }
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq("voter_suggest_id", id);
+ List voterSuggestSolves = voterSuggestSolveService.list(wrapper);
+ renderJson(Ret.ok().data(voterSuggestSolves));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "建议id", required = true),
+ @ApiImplicitParam(name = "userIds", value = "用户id 用','号分开", required = true)
+ })
+ @ApiOperation("分配")
+ @PostMapping("/allocation")
+ public void allocation(String id, String userIds) {
+ if (StrUtil.isBlank(id) || StrUtil.isBlank(userIds)) {
+ render(Ret.fail("操作失败"));
+ return;
+ }
+
+ VoterSuggest voterSuggest = voterSuggestService.getById(id);
+ if (voterSuggest == null) {
+ render(Ret.fail("操作失败"));
+ return;
+ }
+ voterSuggest.setAllotObj(userIds);
+ boolean flag = voterSuggestService.saveOrUpdate(voterSuggest);
+
+ voterSuggestSolveService.remove(new QueryWrapper().eq("voter_suggest_id", id));
+ if (StrUtil.isNotBlank(userIds)) {
+ String[] split = userIds.split(",");
+ for (String userId : split) {
+ VoterSuggestSolve entity = new VoterSuggestSolve();
+ entity.setVoterSuggestId(id);
+ entity.setUserId(userId);
+ entity.setStatus("0");
+ entity.setIsRead(0);
+ entity.setCreatedId(getApiUserId());
+ voterSuggestSolveService.saveOrUpdate(entity);
+ }
+ }
+
+ renderJson(flag ? Ret.ok() : Ret.fail("操作失败"));
+ }
+
+ private QueryWrapper getQueryWrapper(String createdId) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(createdId, "created_id", qw);
+ qw.orderByDesc("created_at");
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/controller/ApiVoterSuggestDbController.java b/src/main/java/com/ydool/boot/api/controller/ApiVoterSuggestDbController.java
new file mode 100644
index 0000000..8187fbf
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/controller/ApiVoterSuggestDbController.java
@@ -0,0 +1,247 @@
+package com.ydool.boot.api.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.mybatis.Condition;
+import com.ydool.boot.modules.rddb.entity.Db;
+import com.ydool.boot.modules.rddb.entity.Message;
+import com.ydool.boot.modules.rddb.entity.VoterSuggestDb;
+import com.ydool.boot.modules.rddb.service.DbService;
+import com.ydool.boot.modules.rddb.service.MessageService;
+import com.ydool.boot.modules.rddb.service.VoterSuggestDbService;
+import com.ydool.boot.modules.rddb.vo.VoterSuggestDbVO;
+import com.ydool.boot.modules.rddb.wrapper.VoterSuggestDbWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 联系人大
+ *
+ * @author chenchen
+ * @date 2020/10/12
+ */
+@Controller
+@RequestMapping("/api/voter_suggest_db")
+@Api(value = "联系人大", tags = "联系人大")
+public class ApiVoterSuggestDbController extends ApiBaseController {
+
+ @Autowired
+ private VoterSuggestDbService voterSuggestDbService;
+
+ @Resource
+ private DbService dbService;
+
+ @Autowired
+ private MessageService messageService;
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestDbVO.class)
+ })
+ @ApiOperation("联系人大列表")
+ @GetMapping("/list/all")
+ public void voterSuggestDbListAll(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.orderByDesc("created_at");
+ IPage paged = voterSuggestDbService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(VoterSuggestDbWrapper.build().pageVO(paged)));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestDbVO.class)
+ })
+ @ApiOperation("我提交的")
+ @GetMapping("/list")
+ public void voterSuggestDbList(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+ QueryWrapper qw = getQueryWrapper(getApiUserId());
+ IPage paged = voterSuggestDbService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(VoterSuggestDbWrapper.build().pageVO(paged)));
+ }
+
+ @ApiOperationSupport(
+ responses = @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestDb.class)
+ })
+ )
+ @ApiOperation("联系人大详情")
+ @ApiImplicitParam(name = "id", value = "id", paramType = "path", required = true)
+ @GetMapping("/{id}")
+ public void voterSuggestDb(@PathVariable("id") String id) {
+ VoterSuggestDb bean = voterSuggestDbService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该联系人大"));
+ return;
+ }
+
+ if (StrUtil.isNotBlank(bean.getStatus())) {
+ if ("1".equals(bean.getStatus()) && bean.getIsRead() == 0) {
+ bean.setIsRead(1);
+ voterSuggestDbService.saveOrUpdate(bean);
+ }
+ }
+
+ VoterSuggestDbVO vo = VoterSuggestDbWrapper.build().entityVO(bean);
+ render(Ret.ok().data(vo));
+ }
+
+ @ApiOperation("提交联系人大")
+ @PostMapping("/save")
+ public void save(@Validated VoterSuggestDb entity) {
+ entity.setStatus("0");
+ entity.setIsRead(0);
+ entity.setCreatedId(getApiUserId());
+ boolean flag = voterSuggestDbService.saveOrUpdate(entity);
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiOperation("回复联系人大")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "联系人大id", required = true),
+ @ApiImplicitParam(name = "replyContent", value = "回复内容", required = true)
+ })
+ @PostMapping("/reply")
+ public void reply(String id, String replyContent) {
+ VoterSuggestDb bean = voterSuggestDbService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该联系人大"));
+ return;
+ }
+
+ bean.setReplyContent(replyContent);
+ bean.setStatus("1");
+ bean.setIsRead(0);
+ bean.setUpdatedId(getApiUserId());
+ boolean flag = voterSuggestDbService.saveOrUpdate(bean);
+ //添加消息
+ if (flag) {
+ Message message = new Message();
+ message.setActionId(id);
+ message.setTitle(getApiUser().getUserName() + "回复了您");
+ message.setContent(replyContent);
+ message.setType(Message.TYPE_VOTER_DB);
+ message.setCreatedId(getApiUserId());
+ message.setStatus(Message.STATUS_UNREAD);
+ message.setUserId(bean.getCreatedId());
+ messageService.save(message);
+ }
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNo", value = "当前页", dataType = "int", defaultValue = "1"),
+ @ApiImplicitParam(name = "pageSize", value = "显示条数", dataType = "int", defaultValue = "10"),
+ })
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "数据", name = "data", dataTypeClass = VoterSuggestDbVO.class)
+ })
+ @ApiOperation("联系我的")
+ @GetMapping("/list/my")
+ public void voterSuggestDbListMy(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+ Db db = dbService.getOne(new QueryWrapper().eq("user_id", getApiUserId()));
+ if (db == null) {
+ render(Ret.fail("暂无数据"));
+ return;
+ }
+ QueryWrapper qw = new QueryWrapper().eq("db", db.getId());
+ qw.orderByDesc("created_at");
+ IPage paged = voterSuggestDbService.page(new Page<>(pageNo, pageSize), qw);
+ render(Ret.ok().paged(VoterSuggestDbWrapper.build().pageVO(paged)));
+ }
+
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "联系我的-未读数量", name = "count")
+ })
+ @ApiOperation("联系我的-未读数量")
+ @GetMapping("/count/my")
+ public void voterSuggestDbCountMy() {
+ Db db = dbService.getOne(new QueryWrapper().eq("user_id", getApiUserId()));
+ if (db == null) {
+ render(Ret.fail("暂无数据"));
+ return;
+ }
+ QueryWrapper qw = new QueryWrapper().eq("db", db.getId());
+ qw.eq("status", 0);
+ qw.eq("is_read", 0);
+ int count = voterSuggestDbService.count(qw);
+
+ render(Ret.ok().set("count", count));
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "联系人大id", required = true)
+ })
+ @ApiOperation("联系我的-已读")
+ @PostMapping("/read/my")
+ public void readMy(String id) {
+ VoterSuggestDb bean = voterSuggestDbService.getById(id);
+ if (bean == null) {
+ render(Ret.fail("未找到该联系人大"));
+ return;
+ }
+
+ bean.setIsRead(1);
+ boolean flag = voterSuggestDbService.saveOrUpdate(bean);
+
+ render(!flag ? Ret.fail("操作失败") : Ret.ok());
+ }
+
+ @DynamicResponseParameters(properties = {
+ @DynamicParameter(value = "我的消息-未读", name = "count")
+ })
+ @ApiOperation("我的消息-未读")
+ @GetMapping("/unread")
+ public void unRead() {
+ QueryWrapper qw = getQueryWrapper(getApiUserId());
+ qw.eq("status", 1);
+ qw.eq("is_read", 0);
+ int count = voterSuggestDbService.count(qw);
+ render(Ret.ok().set("count", count));
+ }
+
+ @ApiOperation("我的消息-已读")
+ @PostMapping("/read")
+ public void read() {
+ QueryWrapper qw = getQueryWrapper(getApiUserId());
+ qw.eq("status", 1);
+ qw.eq("is_read", 0);
+ List list = voterSuggestDbService.list(qw);
+ list.forEach(item -> {
+ item.setIsRead(1);
+ voterSuggestDbService.saveOrUpdate(item);
+ });
+ render(Ret.ok());
+ }
+
+ private QueryWrapper getQueryWrapper(String createdId) {
+ QueryWrapper qw = new QueryWrapper<>();
+ Condition.appendIfNotEmpty(createdId, "created_id", qw);
+ qw.orderByDesc("created_at");
+ return qw;
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/filter/CorsFilter.java b/src/main/java/com/ydool/boot/api/filter/CorsFilter.java
new file mode 100644
index 0000000..7a8e040
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/filter/CorsFilter.java
@@ -0,0 +1,34 @@
+package com.ydool.boot.api.filter;
+
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 解决跨域
+ *
+ * @author zhouyuan
+ * @created 2021年3月16日18:08:23
+ */
+@Component
+public class CorsFilter implements Filter {
+
+ @Override
+ public void init(FilterConfig filterConfig) {
+ }
+
+ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
+ HttpServletResponse response = (HttpServletResponse) res;
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
+ response.setHeader("Access-Control-Max-Age", "3600");
+ response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
+ chain.doFilter(req, res);
+ }
+
+ @Override
+ public void destroy() {
+ }
+}
diff --git a/src/main/java/com/ydool/boot/api/filter/ReferInterceptor.java b/src/main/java/com/ydool/boot/api/filter/ReferInterceptor.java
new file mode 100644
index 0000000..0619686
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/filter/ReferInterceptor.java
@@ -0,0 +1,44 @@
+package com.ydool.boot.api.filter;
+
+import cn.hutool.core.util.StrUtil;
+import com.ydool.boot.common.result.Ret;
+import com.ydool.boot.core.exception.ResultException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Enumeration;
+
+/**
+ * @author zhouyuan
+ * @date: 2020/6/2 21:45
+ */
+@Component
+public class ReferInterceptor implements HandlerInterceptor {
+
+ private static String refer;
+
+ @Value("${refer}")
+ public void setRefer(String refer) {
+ ReferInterceptor.refer = refer;
+ }
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+ Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String name = headerNames.nextElement();
+ System.out.println("------------------------------>name:" + name + "。 value:" + request.getHeader(name));
+ }
+
+ String requestRefer = request.getHeader("Referer");
+ System.out.println("------------------------------>refer:" + requestRefer);
+ if (requestRefer == null || (StrUtil.isNotBlank(refer) && !requestRefer.contains(refer))) {
+ throw new ResultException(Ret.fail("非法访问!"));
+ }
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ydool/boot/api/job/ConferenceJob.java b/src/main/java/com/ydool/boot/api/job/ConferenceJob.java
new file mode 100644
index 0000000..c6b3837
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/job/ConferenceJob.java
@@ -0,0 +1,61 @@
+package com.ydool.boot.api.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ydool.boot.modules.rddb.entity.Activity;
+import com.ydool.boot.modules.rddb.entity.ActivityUser;
+import com.ydool.boot.modules.rddb.entity.Conference;
+import com.ydool.boot.modules.rddb.service.ActivityService;
+import com.ydool.boot.modules.rddb.service.ActivityUserService;
+import com.ydool.boot.modules.rddb.service.ConferenceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.util.List;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/8/11
+ */
+@Configuration
+@EnableScheduling
+public class ConferenceJob {
+
+ @Autowired
+ private ConferenceService conferenceService;
+ @Autowired
+ private ActivityService activityService;
+ @Autowired
+ private ActivityUserService activityUserService;
+
+ /**
+ * 每一小时检查一次 间隔开始时间24小时的会议、活动,自动结束
+ */
+ @Scheduled(cron = "0 0 * * * ?")
+ private void distributeCompany() {
+ System.out.println("检查开始------------------------------->");
+ List conferenceList = conferenceService.getOverTimeList();
+ conferenceList.forEach(conference -> {
+ conference.setEnd(1);
+ conferenceService.updateById(conference);
+ });
+
+ List activityList = activityService.getOverTimeList();
+ activityList.forEach(activity -> {
+ activity.setEnd(1);
+ activityService.updateById(activity);
+
+ //参加活动人员里面的end
+ List activityUsers = activityUserService.list(new QueryWrapper().eq("activity_id", activity.getId()));
+ activityUsers.forEach(item -> {
+ item.setEnd(1);
+ activityUserService.updateById(item);
+ });
+ });
+
+ System.out.println("检查结束------------------------------->");
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ydool/boot/api/util/DateUtils.java b/src/main/java/com/ydool/boot/api/util/DateUtils.java
new file mode 100644
index 0000000..0ac81e8
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/util/DateUtils.java
@@ -0,0 +1,232 @@
+package com.ydool.boot.api.util;
+
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+import java.lang.management.ManagementFactory;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.temporal.ChronoField;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 时间工具类
+ */
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
+
+ public static String YYYY = "yyyy";
+
+ public static String YYYY_MM = "yyyy-MM";
+
+ public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+ public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+ public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
+ private static final long ONE_MINUTE = 60;
+ private static final long ONE_HOUR = 3600;
+ private static final long ONE_DAY = 86400;
+ private static final long ONE_MONTH = 2592000;
+ private static final long ONE_YEAR = 31104000;
+
+ private static String[] parsePatterns = {
+ "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+ "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+ "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+
+ /**
+ * 获取当前Date型日期
+ *
+ * @return Date() 当前日期
+ */
+ public static Date getNowDate() {
+ return new Date();
+ }
+
+ /**
+ * 获取当前日期, 默认格式为yyyy-MM-dd
+ *
+ * @return String
+ */
+ public static String getDate() {
+ return dateTimeNow(YYYY_MM_DD);
+ }
+
+ public static final String getTime() {
+ return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+ }
+
+ public static final String dateTimeNow() {
+ return dateTimeNow(YYYYMMDDHHMMSS);
+ }
+
+ public static final String dateTimeNow(final String format) {
+ return parseDateToStr(format, new Date());
+ }
+
+ public static final String dateTime(final Date date) {
+ return parseDateToStr(YYYY_MM_DD, date);
+ }
+
+ public static final String parseDateToStr(final String format, final Date date) {
+ return new SimpleDateFormat(format).format(date);
+ }
+
+ public static final Date dateTime(final String format, final String ts) {
+ try {
+ return new SimpleDateFormat(format).parse(ts);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 日期路径 即年/月/日 如2018/08/08
+ */
+ public static final String datePath() {
+ Date now = new Date();
+ return DateFormatUtils.format(now, "yyyy/MM/dd");
+ }
+
+ /**
+ * 日期路径 即年/月/日 如20180808
+ */
+ public static final String dateTime() {
+ Date now = new Date();
+ return DateFormatUtils.format(now, "yyyyMMdd");
+ }
+
+ /**
+ * 日期型字符串转化为日期 格式
+ */
+ public static Date parseDate(Object str) {
+ if (str == null) {
+ return null;
+ }
+ try {
+ return parseDate(str.toString(), parsePatterns);
+ } catch (ParseException e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获取服务器启动时间
+ */
+ public static Date getServerStartDate() {
+ long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+ return new Date(time);
+ }
+
+ /**
+ * 计算两个时间差
+ */
+ public static String getDatePoor(Date endDate, Date nowDate) {
+ long nd = 1000 * 24 * 60 * 60;
+ long nh = 1000 * 60 * 60;
+ long nm = 1000 * 60;
+ // long ns = 1000;
+ // 获得两个时间的毫秒时间差异
+ long diff = endDate.getTime() - nowDate.getTime();
+ // 计算差多少天
+ long day = diff / nd;
+ // 计算差多少小时
+ long hour = diff % nd / nh;
+ // 计算差多少分钟
+ long min = diff % nd % nh / nm;
+ // 计算差多少秒//输出结果
+ // long sec = diff % nd % nh % nm / ns;
+ return day + "天" + hour + "小时" + min + "分钟";
+ }
+
+ /**
+ * 格式化时间 **天前
+ *
+ * @param date
+ * @return
+ */
+ public static String fromToday(Date date, Boolean hasSpace) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ String space = hasSpace ? " " : "";
+ long time = date.getTime() / 1000;
+ long now = System.currentTimeMillis() / 1000;
+ long ago = now - time;
+ if (ago <= ONE_HOUR) {
+ return ago / ONE_MINUTE + space + "分钟前";
+ } else if (ago <= ONE_DAY) {
+ return ago / ONE_HOUR + space + "小时前";
+ } else if (ago <= ONE_DAY * 2) {
+ return "昨天";
+ } else if (ago <= ONE_DAY * 3) {
+ return "前天";
+ } else if (ago <= ONE_MONTH) {
+ long day = ago / ONE_DAY;
+ return day + space + "天前";
+ } else if (ago <= ONE_YEAR) {
+ long month = ago / ONE_MONTH;
+ return month + space + "个月前";
+ } else {
+ long year = ago / ONE_YEAR;
+ return year + space + "年前";
+ }
+ }
+
+ /**
+ * 获取月份的开始时间
+ *
+ * @param yearMonth 月份字符串,形如: yyyy-MM
+ * @return
+ */
+ public static Date atStartOfYearMonth(String yearMonth) {
+ DateTimeFormatter fmt = new DateTimeFormatterBuilder()
+ .appendPattern(YYYY_MM)
+ .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
+ .toFormatter();
+ LocalDate date = LocalDate.parse(yearMonth, fmt);
+ LocalDateTime dateTime = date.atTime(LocalTime.MIN);
+ return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+ /**
+ * 获取月份的结束时间
+ *
+ * @param yearMonth 月份字符串,形如: yyyy-MM
+ * @return
+ */
+ public static Date atEndOfYearMonth(String yearMonth) {
+ DateTimeFormatter fmt = DateTimeFormatter.ofPattern(YYYY_MM);
+ YearMonth ym = YearMonth.parse(yearMonth, fmt);
+ LocalDateTime dateTime = ym.atEndOfMonth().atTime(LocalTime.MAX);
+ return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+ /**
+ * 获取日期的开始时间
+ *
+ * @param date 月份字符串,形如: yyyy-MM-dd
+ * @return
+ */
+ public static Date atStartOfDate(String date) {
+ LocalDateTime start = LocalDate.parse(date, DateTimeFormatter.ofPattern(YYYY_MM_DD)).atTime(LocalTime.MIN);
+ return Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+ /**
+ * 获取日期的结束时间
+ *
+ * @param date 月份字符串,形如: yyyy-MM-dd
+ * @return
+ */
+ public static Date atEndOfDate(String date) {
+ LocalDateTime end = LocalDate.parse(date, DateTimeFormatter.ofPattern(YYYY_MM_DD)).atTime(LocalTime.MAX);
+ return Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+
+}
diff --git a/src/main/java/com/ydool/boot/api/util/JwtUtil.java b/src/main/java/com/ydool/boot/api/util/JwtUtil.java
new file mode 100644
index 0000000..1b04b6d
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/util/JwtUtil.java
@@ -0,0 +1,49 @@
+package com.ydool.boot.api.util;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+
+public class JwtUtil {
+
+ public static String BEARER = "bearer";
+ public static Integer AUTH_LENGTH = 7;
+ public static String BASE64_SECURITY = Base64.getEncoder().encodeToString(TokenConstant.SIGN_KEY.getBytes(StandardCharsets.UTF_8));
+
+ /**
+ * 获取token串
+ *
+ * @param auth token
+ * @return String
+ */
+ public static String getToken(String auth) {
+ if ((auth != null) && (auth.length() > AUTH_LENGTH)) {
+ String headStr = auth.substring(0, 6).toLowerCase();
+ if (headStr.compareTo(BEARER) == 0) {
+ auth = auth.substring(7);
+ return auth;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 解析jsonWebToken
+ *
+ * @param jsonWebToken token串
+ * @return Claims
+ */
+ public static Claims parseJWT(String jsonWebToken) {
+ try {
+ return Jwts.parser()
+ .setSigningKey(Base64.getDecoder().decode(JwtUtil.BASE64_SECURITY))
+ .parseClaimsJws(jsonWebToken).getBody();
+ } catch (Exception ex) {
+ return null;
+ }
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/util/Kv.java b/src/main/java/com/ydool/boot/api/util/Kv.java
new file mode 100644
index 0000000..c706443
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/util/Kv.java
@@ -0,0 +1,28 @@
+package com.ydool.boot.api.util;
+
+import org.springframework.util.LinkedCaseInsensitiveMap;
+
+
+public class Kv extends LinkedCaseInsensitiveMap {
+
+ private Kv() {
+ }
+
+ public static Kv create() {
+ return new Kv();
+ }
+
+ public Kv set(String attr, Object value) {
+ this.put(attr, value);
+ return this;
+ }
+
+ public String getString(String attr) {
+ Object object = this.get(attr);
+ if (object == null) {
+ return "";
+ }
+ return object.toString();
+ }
+
+}
diff --git a/src/main/java/com/ydool/boot/api/util/RedisConfig.java b/src/main/java/com/ydool/boot/api/util/RedisConfig.java
new file mode 100644
index 0000000..9c34d64
--- /dev/null
+++ b/src/main/java/com/ydool/boot/api/util/RedisConfig.java
@@ -0,0 +1,43 @@
+package com.ydool.boot.api.util;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+
+import java.net.UnknownHostException;
+
+/**
+ * @author: zhouyuan
+ * @date: 2020/10/15
+ */
+@Configuration
+public class RedisConfig {
+
+ @Bean
+ public RedisTemplate