diff --git a/src/main/java/com/company/project/common/config/WebMvcConfigurer.java b/src/main/java/com/company/project/common/config/WebMvcConfigurer.java index 7c736e2..d48e962 100644 --- a/src/main/java/com/company/project/common/config/WebMvcConfigurer.java +++ b/src/main/java/com/company/project/common/config/WebMvcConfigurer.java @@ -62,7 +62,8 @@ public class WebMvcConfigurer extends WebMvcConfigurationSupport { registry.addInterceptor(new SaInterceptor(handler -> SaRouter.match("/**", r -> StpUtil.checkLogin())) .isAnnotation(true)) - .excludePathPatterns("/option/addOption") + .excludePathPatterns("/option/appUploadFile") + .excludePathPatterns("/option/getTaskDetails") // .excludePathPatterns("/swagger-resources/**") .excludePathPatterns("/webjars/**") .excludePathPatterns("/error") diff --git a/src/main/java/com/company/project/common/utils/PasswordValidator.java b/src/main/java/com/company/project/common/utils/PasswordValidator.java index 94f2178..b6ab3f7 100644 --- a/src/main/java/com/company/project/common/utils/PasswordValidator.java +++ b/src/main/java/com/company/project/common/utils/PasswordValidator.java @@ -37,7 +37,7 @@ public class PasswordValidator { } public static void main(String[] args) { - String password = "assword1@"; // 示例密码 + String password = "Bonus@admin123"; // 示例密码 if (isValidPassword(password)) { System.err.println("密码强度合格"); } else { diff --git a/src/main/java/com/company/project/controller/OptionController.java b/src/main/java/com/company/project/controller/OptionController.java index ccc5387..2ae9285 100644 --- a/src/main/java/com/company/project/controller/OptionController.java +++ b/src/main/java/com/company/project/controller/OptionController.java @@ -3,13 +3,18 @@ package com.company.project.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.company.project.common.utils.DataResult; import com.company.project.entity.*; import com.company.project.common.aop.annotation.LogAnnotation; import com.company.project.common.utils.ExportExcelUtil; import com.company.project.service.OptionService; import com.company.project.service.UserService; +import com.company.project.vo.req.UserRoleOperationReqVO; +import com.company.project.vo.resp.TaskOwnUserRespVo; import com.company.project.vo.resp.UserInfoRespVO; import com.company.project.vo.resp.UserOwnRoleRespVO; import io.swagger.annotations.Api; @@ -17,13 +22,19 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.internal.util.StringHelper; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 用户意见收集查询 @@ -71,7 +82,16 @@ public class OptionController { return optionService.listInfoByPage(vo); } - + @ApiOperation(value = "APP文件上传") + @PostMapping("appUploadFile") + public String addTaskInfoData(@RequestParam(value = "file",required = false) MultipartFile[] files, HttpServletRequest request){ + return optionService.addTaskInfoData(files,request); + } + @ApiOperation(value = "app 意见任务信息查询") + @PostMapping("getTaskDetails") + public Map getTaskDetails(@RequestBody TbTask vo){ + return optionService.getTaskDetails(vo); + } @PostMapping("/delete") @ApiOperation(value = "删除任务") @LogAnnotation(title = "意见收集", action = "删除任务") @@ -155,8 +175,20 @@ public class OptionController { + @GetMapping("/task/user/{taskId}") + @ApiOperation(value = "赋予任务-获取搜有点任务角色") + @LogAnnotation(title = "任务管理", action = "赋予任务-临时角色") + @SaCheckPermission("tb:option:user") + public TaskOwnUserRespVo getTaskUser(@PathVariable("taskId") String taskId) { + return optionService.getTaskUser(taskId); + } - - + @PutMapping("/task/user/{taskId}") + @ApiOperation(value = "赋予角色-用户赋予角色接口") + @LogAnnotation(title = "用户管理", action = "赋予角色-用户赋予角色接口") + @SaCheckPermission("tb:option:user") + public void setTaskUser(@PathVariable("taskId") String taskId, @RequestBody List userIds ) { + optionService.setTaskUser(taskId,userIds); + } } diff --git a/src/main/java/com/company/project/entity/SourceFileVo.java b/src/main/java/com/company/project/entity/SourceFileVo.java new file mode 100644 index 0000000..57fbdfd --- /dev/null +++ b/src/main/java/com/company/project/entity/SourceFileVo.java @@ -0,0 +1,35 @@ +package com.company.project.entity; + +import lombok.Data; + +/** + * @author 黑子 + */ +@Data +public class SourceFileVo { + + private String id; + /** + * 资源id + */ + private String sourceId; + /** + * 文件地址 + */ + private String filePath; + /** + * 文件名称 + */ + private String fileName; + /** + * 文件后缀 + */ + private String fileSuffix; + + private String createTime; + + private String fileType; + + + +} diff --git a/src/main/java/com/company/project/entity/TaskInfoVo.java b/src/main/java/com/company/project/entity/TaskInfoVo.java new file mode 100644 index 0000000..290a54d --- /dev/null +++ b/src/main/java/com/company/project/entity/TaskInfoVo.java @@ -0,0 +1,29 @@ +package com.company.project.entity; + +import lombok.Data; + +import java.util.List; + +/** + * @author 黑子 + */ +@Data +public class TaskInfoVo { + + private String id; + /** + * 任务id + */ + private String taskId; + + private String userName; + + private String userPhone; + + private String userOpinion; + + private String createTime; + + private List fileList; + +} diff --git a/src/main/java/com/company/project/mapper/OptionMapper.java b/src/main/java/com/company/project/mapper/OptionMapper.java index 5ee4ffb..afc4ee9 100644 --- a/src/main/java/com/company/project/mapper/OptionMapper.java +++ b/src/main/java/com/company/project/mapper/OptionMapper.java @@ -3,9 +3,8 @@ package com.company.project.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.company.project.entity.TbExportTask; -import com.company.project.entity.TbTask; -import com.company.project.entity.TbUserOption; +import com.company.project.entity.*; +import com.company.project.service.impl.SourceFileVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -87,5 +86,49 @@ public interface OptionMapper extends BaseMapper { */ List getUploadFile(TbTask vo); + /** + * 查询临时用户 + * @return + */ + List getUserList(); + + /** + * 查询让人物数据 + * @param taskId + * @return + */ + List getTaskUserByTaskId(@Param("taskId") String taskId); + + /** + * 删除 + * @param taskId + */ + void deleteTaskUser(@Param("taskId") String taskId); + + /** + * 新增任务角色 + * @param taskId + * @param userIds + */ + void addTaskUser(@Param("taskId") String taskId,@Param("list") List userIds); + + /** + * 添加任务数据 + * @param vo + */ + int addTaskInfoData(TaskInfoVo vo); + + /** + * 新增资源数据 + * @param vo1 + */ + void addFileSource(SourceFileVo vo1); + + /** + * 查询任务信息 + * @param vo + * @return + */ + TbTask getTaskDetails(TbTask vo); } diff --git a/src/main/java/com/company/project/service/OptionService.java b/src/main/java/com/company/project/service/OptionService.java index 80b0cd2..a178b1c 100644 --- a/src/main/java/com/company/project/service/OptionService.java +++ b/src/main/java/com/company/project/service/OptionService.java @@ -2,11 +2,17 @@ package com.company.project.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.company.project.entity.TaskInfoVo; import com.company.project.entity.TbExportTask; import com.company.project.entity.TbTask; import com.company.project.entity.TbUserOption; +import com.company.project.vo.resp.TaskOwnUserRespVo; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.List; +import java.util.Map; /** * @author 黑子 @@ -73,4 +79,33 @@ public interface OptionService extends IService { * @return */ List getExportList(TbExportTask vo); + + /** + * 查询 任务用户信息 + * @param taskId + * @return + */ + TaskOwnUserRespVo getTaskUser(String taskId); + + /** + * 设置任务用户 + * @param taskId + * @param userIds + */ + void setTaskUser(String taskId, List userIds); + + /** + * 新增人 + * @param vo + * @param + * @return + */ + String addTaskInfoData(MultipartFile[] files, HttpServletRequest request); + + /** + * 意见信息查询 + * @param vo + * @return + */ + Map getTaskDetails(TbTask vo); } diff --git a/src/main/java/com/company/project/service/UserService.java b/src/main/java/com/company/project/service/UserService.java index 1d5e821..b43d3ee 100644 --- a/src/main/java/com/company/project/service/UserService.java +++ b/src/main/java/com/company/project/service/UserService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.company.project.entity.SysUser; import com.company.project.vo.resp.LoginRespVO; +import com.company.project.vo.resp.TaskOwnUserRespVo; import com.company.project.vo.resp.UserOwnRoleRespVO; /** @@ -77,4 +78,6 @@ public interface UserService extends IService { * @param vo vo */ void updateUserInfoMy(SysUser vo); + + } diff --git a/src/main/java/com/company/project/service/impl/OptionServiceImpl.java b/src/main/java/com/company/project/service/impl/OptionServiceImpl.java index 3c4c21e..bbc0158 100644 --- a/src/main/java/com/company/project/service/impl/OptionServiceImpl.java +++ b/src/main/java/com/company/project/service/impl/OptionServiceImpl.java @@ -1,29 +1,33 @@ package com.company.project.service.impl; import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.company.project.common.utils.DateUtils; -import com.company.project.entity.TbExportTask; -import com.company.project.entity.TbTask; -import com.company.project.entity.TbUserOption; +import com.company.project.entity.*; import com.company.project.mapper.OptionMapper; import com.company.project.common.exception.BusinessException; import com.company.project.service.OptionService; +import com.company.project.utils.IDUtils; import com.company.project.utils.ZipExportUtils; +import com.company.project.vo.resp.TaskOwnUserRespVo; +import com.company.project.vo.resp.UserOwnRoleRespVO; +import com.google.common.collect.Maps; import com.google.zxing.WriterException; import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.internal.util.StringHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; /** * @author 黑子 @@ -66,6 +70,149 @@ public class OptionServiceImpl extends ServiceImpl implem } return mapper.getExportList(vo); } + + /** + * + * @param taskId + * @return + */ + @Override + public TaskOwnUserRespVo getTaskUser(String taskId) { + List taskList = mapper.getTaskUserByTaskId(taskId); + List list = mapper.getUserList(); + + TaskOwnUserRespVo vo = new TaskOwnUserRespVo(); + vo.setUserList(list); + vo.setOwnRoles(taskList); + return vo; + } + + /** + * + * @param taskId + * @param userIds + */ + @Override + public void setTaskUser(String taskId, List userIds) { + mapper.deleteTaskUser(taskId); + mapper.addTaskUser(taskId,userIds); + } + + + + @Override + public String addTaskInfoData(MultipartFile[] files, HttpServletRequest request) { + try{ + String param=request.getParameter("param"); + if (StringHelper.isNullOrEmptyString(param)){ + return "青上传参数"; + } + TaskInfoVo vo= JSON.parseObject(param,TaskInfoVo.class); + if (StringHelper.isNullOrEmptyString(vo.getTaskId())){ + return "请上传任务id"; + } + + if(!StringHelper.isNullOrEmptyString(vo.getUserPhone())){ + if(!isValidPhoneNumber(vo.getUserPhone())){ + return "请填写正确的手机号码"; + } + } + TbTask task=new TbTask() ; + task.setId(vo.getTaskId()); + TbTask voo=mapper.getTaskDetails(task); + if(voo==null){ + return "任务不存在/已被删除"; + }else{ + if(!"1".equals(voo.getTaskType())){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime startTime = LocalDateTime.parse(voo.getStartTime(), formatter); + LocalDateTime endTime = LocalDateTime.parse(voo.getEndTime(), formatter); + LocalDateTime now = LocalDateTime.now(); + if (now.isAfter(startTime) && now.isBefore(endTime)) { + + }else{ + return "任务已过期"; + } + } + } + String createTimes= DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN); + vo.setCreateTime(createTimes); + int num= mapper.addTaskInfoData(vo); + if(num>0){ + if(files != null){ + for (MultipartFile file : files) { + String fileName = file.getOriginalFilename(); + String suffix= IDUtils.getSuffix(fileName); + String name=IDUtils.createID()+suffix; + //创建 + String createTime = DateUtils.format(new Date(), DateUtils.DATEPATTERN); + String paths="app/" +createTime + "/"+name; + String newPath = filePath + paths; + File uploadFile = new File(newPath); + if (!uploadFile.getParentFile().exists()) { + uploadFile.getParentFile().mkdirs(); + } + file.transferTo(uploadFile); + SourceFileVo vo1=new SourceFileVo(); + vo1.setSourceId(vo.getId()); + vo1.setCreateTime(createTimes); + vo1.setFilePath(paths); + vo1.setFileName(fileName); + vo1.setFileSuffix(suffix); + vo1.setFileType("1"); + mapper.addFileSource(vo1); + } + } + } + return "添加成功"; + }catch (Exception e){ + log.error(e.toString(),e); + } + + return "添加失败"; + } + + @Override + public Map getTaskDetails(TbTask vo) { + Map map= Maps.newHashMap(); + String id=vo.getId(); + if(StringHelper.isNullOrEmptyString(id)){ + map.put("msg","任务id不能为空"); + map.put("data","任务id不能为空"); + map.put("code","201"); + }else{ + TbTask voo=mapper.getTaskDetails(vo); + if(voo==null){ + map.put("msg","任务不存在/已被删除"); + map.put("code","202"); + map.put("data","任务不存在/已被删除"); + }else{ + if("1".equals(voo.getTaskType())){ + map.put("msg","请求成功"); + map.put("data",voo); + map.put("code","200"); + }else{ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime startTime = LocalDateTime.parse(voo.getStartTime(), formatter); + LocalDateTime endTime = LocalDateTime.parse(voo.getEndTime(), formatter); + LocalDateTime now = LocalDateTime.now(); + if (now.isAfter(startTime) && now.isBefore(endTime)) { + map.put("msg","请求成功"); + map.put("data",voo); + map.put("code","200"); + }else{ + map.put("msg","任务已过期"); + map.put("data","任务已过期"); + map.put("code","203"); + } + } + } + } + + + return map; + } + @Override public void delete(TbTask vo) { mapper.deleteData(vo); @@ -123,12 +270,8 @@ public class OptionServiceImpl extends ServiceImpl implem } @Override public void addOption(TbUserOption vo) { - if(StringHelper.isNullOrEmptyString(vo.getUserName())){ - throw new BusinessException("请填写用户名"); - } - if(StringHelper.isNullOrEmptyString(vo.getUserPhone())){ - throw new BusinessException("请填写正确的手机号码!"); - }else{ + + if(!StringHelper.isNullOrEmptyString(vo.getUserPhone())){ if(!isValidPhoneNumber(vo.getUserPhone())){ throw new BusinessException("请填写正确的手机号码!"); } diff --git a/src/main/java/com/company/project/service/impl/UserServiceImpl.java b/src/main/java/com/company/project/service/impl/UserServiceImpl.java index b65efbf..862bd2b 100644 --- a/src/main/java/com/company/project/service/impl/UserServiceImpl.java +++ b/src/main/java/com/company/project/service/impl/UserServiceImpl.java @@ -21,6 +21,7 @@ import com.company.project.service.UserRoleService; import com.company.project.service.UserService; import com.company.project.vo.req.UserRoleOperationReqVO; import com.company.project.vo.resp.LoginRespVO; +import com.company.project.vo.resp.TaskOwnUserRespVo; import com.company.project.vo.resp.UserOwnRoleRespVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -185,6 +186,8 @@ public class UserServiceImpl extends ServiceImpl impleme } + + @Override public IPage pageInfo(SysUser vo) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); @@ -204,6 +207,7 @@ public class UserServiceImpl extends ServiceImpl impleme if (null != vo.getStatus()) { queryWrapper.eq(SysUser::getStatus, vo.getStatus()); } + queryWrapper.ne(SysUser::getCreateWhere, "4"); if (!StringUtils.isEmpty(vo.getDeptNo())) { LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery(); queryWrapperDept.select(SysDept::getId).like(SysDept::getRelationCode, vo.getDeptNo()); @@ -317,7 +321,7 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public void updatePwd(SysUser vo) { - if(!PasswordValidator.isValidPassword(vo.getPassword())){ + if(!PasswordValidator.isValidPassword(vo.getNewPwd())){ throw new BusinessException("密码必须包含字母、数字和特殊字符至少各一个"); } SysUser sysUser = sysUserMapper.selectById(vo.getId()); diff --git a/src/main/java/com/company/project/utils/IDUtils.java b/src/main/java/com/company/project/utils/IDUtils.java new file mode 100644 index 0000000..a2b1f7c --- /dev/null +++ b/src/main/java/com/company/project/utils/IDUtils.java @@ -0,0 +1,52 @@ +package com.company.project.utils; + +public class IDUtils { + private static byte[] lock = new byte[0]; + + // 位数,默认是8位 + private final static long w = 100000000; + + /** + * 传入文件 名称 + * @param fileName + * @return + */ + public static String getSuffix(String fileName){ + return fileName.substring(fileName.lastIndexOf('.')); + } + + public static void main(String[] args) { + System.err.println(createID()); + } + + /** + * 获取id + * @return + */ + public static String createID() { + long r = 0; + synchronized (lock) { + r = (long) ((Math.random() + 1) * w); + } + + return System.currentTimeMillis() + String.valueOf(r).substring(1); + } + + /** + * 是否是文件/图片 + * @param name + * @return + */ + public static String isImageFileExtension(String name) { + name=name.toLowerCase(); + String[] imageFormats = {"jpg", "jpeg", "png", "gif", "bmp", "tiff"}; + for (String format : imageFormats) { + if (format.equals(name)) { // 判断扩展名 + return "1"; + } + } + return "2"; // 不是支持的图片格式 + } + + +} diff --git a/src/main/java/com/company/project/vo/resp/TaskOwnUserRespVo.java b/src/main/java/com/company/project/vo/resp/TaskOwnUserRespVo.java new file mode 100644 index 0000000..00333a0 --- /dev/null +++ b/src/main/java/com/company/project/vo/resp/TaskOwnUserRespVo.java @@ -0,0 +1,22 @@ +package com.company.project.vo.resp; + +import com.company.project.entity.SysRole; +import com.company.project.entity.SysUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 任务分配的全部角色 + * @author 黑子 + */ +@Data +public class TaskOwnUserRespVo { + + @ApiModelProperty("所有的临时用户") + private List userList; + + @ApiModelProperty(value = "用户拥有的任务") + private List ownRoles; +} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 4d066f9..66f0761 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -24,9 +24,11 @@ spring: file: #文件上传目录 绝对路径 末尾请加 / - path: F:/files/ #windows - visitPath: http://192.168.0.38:21666/manager/files/ - #path: /data/files/ #linux + # path: F:/files/ #windows + # visitPath: http://192.168.0.38:21666/manager/files/ + visitPath: http://192.168.0.14:21666/manager/files/ + path: /home/options/file/ + #linux knife4j: production: true #生成环境禁用查看文档 diff --git a/src/main/resources/mapper/mysql/OptionMapper.xml b/src/main/resources/mapper/mysql/OptionMapper.xml index 7b660e6..c8a990b 100644 --- a/src/main/resources/mapper/mysql/OptionMapper.xml +++ b/src/main/resources/mapper/mysql/OptionMapper.xml @@ -19,12 +19,34 @@ )values (#{taskType},#{taskTitle},#{taskDescribe},#{startTime},#{endTime},#{createUser}, now(),0,#{taskTime}) + + insert into tb_task_user( + user_id,task_id + )values + + (#{item},#{taskId}) + + + + insert into tb_task_info (task_id, user_name, user_phone, user_opinion, create_time + )values (#{taskId},#{userName},#{userPhone},#{userOpinion},#{createTime}) + + + insert into tb_source_file( + source_id, file_path, file_name, create_time, file_suffix, file_type + )values (#{sourceId},#{filePath},#{fileName},#{createTime},#{fileSuffix},#{fileType}) + + update tb_task set del_flag=1 WHERE id=#{id} update tb_task_info set del_flag=1 WHERE id=#{id} + + delete from tb_task_user where task_id=#{taskId} + + update tb_task set file_path=#{filePath} where id=#{id} @@ -170,6 +192,23 @@ GROUP BY tti.id + + + diff --git a/src/main/resources/templates/options/option_list.html b/src/main/resources/templates/options/option_list.html index 3ab0420..dbbe196 100644 --- a/src/main/resources/templates/options/option_list.html +++ b/src/main/resources/templates/options/option_list.html @@ -124,45 +124,61 @@ + + + + + + +