Procházet zdrojové kódy

增加公告管理

hlf před 1 rokem
rodič
revize
afe2b78da1
19 změnil soubory, kde provedl 1075 přidání a 57 odebrání
  1. 65 33
      ims-service/ims-eval/src/main/java/com/ims/eval/controller/DepartmentPerformanceAppraisalRatingController.java
  2. 3 16
      ims-service/ims-eval/src/main/java/com/ims/eval/controller/DepartmentalPerformanceIndicatorAssessmentController.java
  3. 2 8
      ims-service/ims-eval/src/main/java/com/ims/eval/controller/DepartmentalPerformanceIndicatorPlanController.java
  4. 118 0
      ims-service/ims-eval/src/main/java/com/ims/eval/controller/NoticeManagementController.java
  5. 17 0
      ims-service/ims-eval/src/main/java/com/ims/eval/dao/EvaluationNoticeMapper.java
  6. 58 0
      ims-service/ims-eval/src/main/java/com/ims/eval/entity/EvaluationNotice.java
  7. 45 0
      ims-service/ims-eval/src/main/java/com/ims/eval/entity/custom/Path.java
  8. 17 0
      ims-service/ims-eval/src/main/java/com/ims/eval/exception/FileException.java
  9. 16 0
      ims-service/ims-eval/src/main/java/com/ims/eval/exception/FileNameLengthLimitExceededException.java
  10. 16 0
      ims-service/ims-eval/src/main/java/com/ims/eval/exception/FileSizeLimitExceededException.java
  11. 69 0
      ims-service/ims-eval/src/main/java/com/ims/eval/exception/InvalidExtensionException.java
  12. 84 0
      ims-service/ims-eval/src/main/java/com/ims/eval/exception/base/BaseException.java
  13. 21 0
      ims-service/ims-eval/src/main/java/com/ims/eval/service/IEvaluationNoticeService.java
  14. 71 0
      ims-service/ims-eval/src/main/java/com/ims/eval/service/impl/EvaluationNoticeServiceImpl.java
  15. 203 0
      ims-service/ims-eval/src/main/java/com/ims/eval/util/FileUploadUtil.java
  16. 23 0
      ims-service/ims-eval/src/main/java/com/ims/eval/util/MessageUtil.java
  17. 56 0
      ims-service/ims-eval/src/main/java/com/ims/eval/util/MimeTypeUtil.java
  18. 131 0
      ims-service/ims-eval/src/main/java/com/ims/eval/util/SpringUtil.java
  19. 60 0
      ims-service/ims-eval/src/main/resources/mappers/EvaluationNoticeMapper.xml

+ 65 - 33
ims-service/ims-eval/src/main/java/com/ims/eval/controller/DepartmentPerformanceAppraisalRatingController.java

@@ -1,14 +1,22 @@
 package com.ims.eval.controller;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ims.common.utils.StringUtils;
 import com.ims.eval.config.CustomException;
+import com.ims.eval.entity.DataDictionary;
 import com.ims.eval.entity.EvaluationDeptBusinessContent;
 import com.ims.eval.entity.EvaluationDeptRating;
+import com.ims.eval.entity.YearOperatingCoefficient;
 import com.ims.eval.entity.dto.result.R;
+import com.ims.eval.service.IDataDictionaryService;
 import com.ims.eval.service.IEvaluationDeptRatingService;
 import com.ims.eval.util.ExcelUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -34,13 +42,16 @@ public class DepartmentPerformanceAppraisalRatingController {
 	@Autowired
 	private IEvaluationDeptRatingService evaluationDeptRatingService;
 
+	@Autowired
+	private IDataDictionaryService dataDictionaryService;
+
 	/**
 	 * 部门绩效考核评级列表信息(分页)
 	 *
-	 * @param pageNum            当前记录起始索引
-	 * @param pageSize           每页显示记录数
-	 * @param deptName           部门名称
-	 * @param annual             月度
+	 * @param pageNum  当前记录起始索引
+	 * @param pageSize 每页显示记录数
+	 * @param deptName 部门名称
+	 * @param annual   月度
 	 * @return 结果
 	 */
 	@GetMapping(value = "/list")
@@ -127,40 +138,61 @@ public class DepartmentPerformanceAppraisalRatingController {
 				for (String[] str : strings) {
 					EvaluationDeptRating evaluationDeptRating = new EvaluationDeptRating();
 					evaluationDeptRating.setId(str[0]);
-					evaluationDeptRating.setDeptId(str[1]);
-					evaluationDeptRating.setDeptName(str[2]);
-					evaluationDeptRating.setAnnual(str[3]);
-					evaluationDeptRating.setJan(str[4]);
-					evaluationDeptRating.setJanContent(str[5]);
-					evaluationDeptRating.setFeb(str[6]);
-					evaluationDeptRating.setFebContent(str[7]);
-					evaluationDeptRating.setMar(str[8]);
-					evaluationDeptRating.setMarContent(str[9]);
-					evaluationDeptRating.setApr(str[10]);
-					evaluationDeptRating.setAprContent(str[11]);
-					evaluationDeptRating.setMay(str[12]);
-					evaluationDeptRating.setMayContent(str[13]);
-					evaluationDeptRating.setJun(str[14]);
-					evaluationDeptRating.setJunContent(str[15]);
-					evaluationDeptRating.setJul(str[16]);
-					evaluationDeptRating.setJulContent(str[17]);
-					evaluationDeptRating.setAug(str[18]);
-					evaluationDeptRating.setAugContent(str[19]);
-					evaluationDeptRating.setSep(str[20]);
-					evaluationDeptRating.setSepContent(str[21]);
-					evaluationDeptRating.setOct(str[22]);
-					evaluationDeptRating.setOctContent(str[23]);
-					evaluationDeptRating.setNov(str[24]);
-					evaluationDeptRating.setNovContent(str[25]);
-					evaluationDeptRating.setDece(str[26]);
-					evaluationDeptRating.setDeceContent(str[27]);
-					evaluationDeptRating.setAcount(str[28]);
+					QueryWrapper<DataDictionary> qw = new QueryWrapper<>();
+					if (StringUtils.isNotEmpty(str[1])) {
+						qw.lambda().eq(DataDictionary::getKeyName, str[1]);
+					}
+					DataDictionary dataDictionary = dataDictionaryService.getOne(qw);
+					if (null != dataDictionary) {
+						evaluationDeptRating.setDeptId(dataDictionary.getId());
+					}
+					evaluationDeptRating.setDeptName(str[1]);
+					evaluationDeptRating.setAnnual(str[2]);
+					evaluationDeptRating.setJan(str[3]);
+					evaluationDeptRating.setJanContent(str[4]);
+					evaluationDeptRating.setFeb(str[5]);
+					evaluationDeptRating.setFebContent(str[6]);
+					evaluationDeptRating.setMar(str[7]);
+					evaluationDeptRating.setMarContent(str[8]);
+					evaluationDeptRating.setApr(str[9]);
+					evaluationDeptRating.setAprContent(str[10]);
+					evaluationDeptRating.setMay(str[11]);
+					evaluationDeptRating.setMayContent(str[12]);
+					evaluationDeptRating.setJun(str[13]);
+					evaluationDeptRating.setJunContent(str[14]);
+					evaluationDeptRating.setJul(str[15]);
+					evaluationDeptRating.setJulContent(str[16]);
+					evaluationDeptRating.setAug(str[17]);
+					evaluationDeptRating.setAugContent(str[18]);
+					evaluationDeptRating.setSep(str[19]);
+					evaluationDeptRating.setSepContent(str[20]);
+					evaluationDeptRating.setOct(str[21]);
+					evaluationDeptRating.setOctContent(str[22]);
+					evaluationDeptRating.setNov(str[23]);
+					evaluationDeptRating.setNovContent(str[24]);
+					evaluationDeptRating.setDece(str[25]);
+					evaluationDeptRating.setDeceContent(str[26]);
+					evaluationDeptRating.setAcount(str[27]);
 					if (null == str[0] || "".equals(str[0])) {
 						evaluationDeptRating.setCreateTime(DateUtil.date());
 					} else {
 						evaluationDeptRating.setUpdateTime(DateUtil.date());
 					}
-					evaluationDeptRatingList.add(evaluationDeptRating);
+					if (StringUtils.isEmpty(evaluationDeptRating.getId())) {
+						QueryWrapper<EvaluationDeptRating> qw1 = new QueryWrapper<>();
+						if (StringUtils.isNotEmpty(evaluationDeptRating.getDeptId())) {
+							qw1.lambda().eq(EvaluationDeptRating::getDeptId, evaluationDeptRating.getDeptId());
+						}
+						if (StringUtils.isNotEmpty(evaluationDeptRating.getAnnual())) {
+							qw1.lambda().eq(EvaluationDeptRating::getAnnual, evaluationDeptRating.getAnnual());
+						}
+						EvaluationDeptRating deptRating = evaluationDeptRatingService.getOne(qw1);
+						if (ObjectUtil.isNull(deptRating)) {
+							evaluationDeptRatingList.add(evaluationDeptRating);
+						}
+					} else {
+						evaluationDeptRatingList.add(evaluationDeptRating);
+					}
 				}
 				boolean b = evaluationDeptRatingService.saveOrUpdateBatch(evaluationDeptRatingList);
 				if (b) {

+ 3 - 16
ims-service/ims-eval/src/main/java/com/ims/eval/controller/DepartmentalPerformanceIndicatorAssessmentController.java

@@ -6,6 +6,7 @@ import com.ims.eval.entity.EvaluationDept;
 import com.ims.eval.entity.EvaluationDeptBusinessAssessment;
 import com.ims.eval.entity.EvaluationDeptBusinessContent;
 import com.ims.eval.entity.EvaluationDeptBusinessPlan;
+import com.ims.eval.entity.custom.Path;
 import com.ims.eval.entity.dto.result.R;
 import com.ims.eval.service.IEvaluationDeptBusinessAssessmentService;
 import com.ims.eval.service.IEvaluationDeptBusinessContentService;
@@ -94,15 +95,8 @@ public class DepartmentalPerformanceIndicatorAssessmentController {
 		}
 		dataMap.put("appraisalYear", evaluationDeptBusinessAssessment.getAppraisalYear());
 		dataMap.put("list", evaluationDeptList);
-		String os = System.getProperty("os.name");
-		String path;
-		if (os.toLowerCase().startsWith("win")) {  //如果是Windows系统
-			path = "D:/home/statement/";
-		} else {  //linux和mac
-			path = "/home/dbkp/statement/";
-		}
 		String fileName = evaluationDeptBusinessAssessment.getAppraisalYear() + "年度经营业绩完成情况.doc";
-		WordUtil.generateWord(dataMap, "template_dbkp_wcqk.ftl", path, fileName);
+		WordUtil.generateWord(dataMap, "template_dbkp_wcqk.ftl", Path.getStatementPath(), fileName);
 		return R.ok().data(fileName);
 	}
 
@@ -116,17 +110,10 @@ public class DepartmentalPerformanceIndicatorAssessmentController {
 	 */
 	@GetMapping(value = "/downloadReport/{reportName}")
 	public void downloadReport(HttpServletRequest request, HttpServletResponse response, @PathVariable("reportName") String reportName) throws IOException {
-		String os = System.getProperty("os.name");
-		String path;
-		if (os.toLowerCase().startsWith("win")) { //如果是Windows系统
-			path = "D:/home/statement/";
-		} else { //linux和mac
-			path = "/home/dbkp/statement/";
-		}
 		InputStream inputStream = null;
 		ServletOutputStream outputStream = null;
 		try {
-			File file = new File(path + reportName);
+			File file = new File(Path.getStatementPath() + reportName);
 			inputStream = Files.newInputStream(file.toPath());
 			response.setCharacterEncoding("UTF-8");
 			response.setContentType("application/msword");

+ 2 - 8
ims-service/ims-eval/src/main/java/com/ims/eval/controller/DepartmentalPerformanceIndicatorPlanController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ims.eval.config.CustomException;
 import com.ims.eval.entity.*;
+import com.ims.eval.entity.custom.Path;
 import com.ims.eval.entity.dto.result.R;
 import com.ims.eval.service.*;
 import com.ims.eval.util.ExcelUtil;
@@ -279,15 +280,8 @@ public class DepartmentalPerformanceIndicatorPlanController {
 		}
 		dataMap.put("appraisalYear", evaluationDeptBusinessPlan.getAppraisalYear());
 		dataMap.put("list", evaluationDeptList);
-		String os = System.getProperty("os.name");
-		String path;
-		if (os.toLowerCase().startsWith("win")) {  //如果是Windows系统
-			path = "D:/home/statement/";
-		} else {  //linux和mac
-			path = "/home/dbkp/statement/";
-		}
 		String fileName = evaluationDeptBusinessPlan.getAppraisalYear() + "年度经营业绩指标计划.doc";
-		WordUtil.generateWord(dataMap, "template_dbkp_zbjh.ftl", path, fileName);
+		WordUtil.generateWord(dataMap, "template_dbkp_zbjh.ftl", Path.getStatementPath(), fileName);
 		return R.ok().data(fileName);
 	}
 }

+ 118 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/controller/NoticeManagementController.java

@@ -0,0 +1,118 @@
+package com.ims.eval.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ims.eval.config.CustomException;
+import com.ims.eval.entity.EvaluationDeptRating;
+import com.ims.eval.entity.EvaluationNotice;
+import com.ims.eval.entity.dto.result.R;
+import com.ims.eval.service.IEvaluationNoticeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 通告管理
+ *
+ * @author hlf
+ * @date 2023/5/17 14:48
+ * 文件说明:
+ */
+@Slf4j
+@RestController
+@RequestMapping("//evaluation-dept-notice")
+public class NoticeManagementController {
+
+	@Autowired
+	private IEvaluationNoticeService evaluationNoticeService;
+
+	/**
+	 * 通告管理列表信息(分页)
+	 *
+	 * @param pageNum     当前记录起始索引
+	 * @param pageSize    每页显示记录数
+	 * @param noticeTitle 通告标题
+	 * @return 结果
+	 */
+	@GetMapping(value = "/list")
+	public R list(
+		@RequestParam(value = "pageNum") Integer pageNum,
+		@RequestParam(value = "pageSize") Integer pageSize,
+		@RequestParam(value = "noticeTitle", required = false) String noticeTitle) {
+		IPage<EvaluationNotice> list = evaluationNoticeService.listPage(pageNum, pageSize, noticeTitle);
+		return R.ok().data(list);
+	}
+
+	/**
+	 * 通告管理信息
+	 *
+	 * @return 结果
+	 */
+	@GetMapping(value = "/listAll")
+	public R listAll() {
+		List<EvaluationNotice> list = evaluationNoticeService.list();
+		return R.ok().data(list);
+	}
+
+	/**
+	 * 新增/修改通告管理信息
+	 *
+	 * @param evaluationNotice 通告管理实体
+	 * @return 结果
+	 */
+	@PostMapping(value = "/save")
+	public R addAll(EvaluationNotice evaluationNotice, @RequestParam(value ="files", required = false) MultipartFile[] files) throws IOException {
+		try {
+			boolean b = evaluationNoticeService.saveOrUpdate(evaluationNotice, files);
+			if (b) {
+				return R.ok().data(b);
+			} else {
+				return R.error().data("保存失败!");
+			}
+		} catch (CustomException e) {
+			return R.customError(e.getMessage()).data("失败!");
+		}
+	}
+
+	/**
+	 * 批量删除通告管理信息
+	 *
+	 * @param ids
+	 * @return 结果
+	 */
+	@PostMapping(value = "/removeAll/{ids}")
+	public R deleteAll(@PathVariable("ids") String ids) {
+		String[] strings = ids.split(",");
+		boolean b = evaluationNoticeService.removeByIds(Arrays.asList(strings));
+		if (b) {
+			return R.ok().data(b);
+		} else {
+			return R.error().data("删除失败!");
+		}
+	}
+
+	/**
+	 * 发布通告
+	 *
+	 * @param id           主键
+	 * @param releaseState 发布状态
+	 * @return 结果
+	 */
+	@PostMapping(value = "/issueNotice")
+	public R issueNotice(@RequestParam(value = "id") String id,
+						 @RequestParam(value = "releaseState") String releaseState) {
+		EvaluationNotice evaluationNotice = new EvaluationNotice();
+		evaluationNotice.setId(id);
+		evaluationNotice.setReleaseState(releaseState);
+		boolean b = evaluationNoticeService.updateById(evaluationNotice);
+		if (b) {
+			return R.ok().data(b);
+		} else {
+			return R.error().data("发布失败!");
+		}
+	}
+}

+ 17 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/dao/EvaluationNoticeMapper.java

@@ -0,0 +1,17 @@
+package com.ims.eval.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ims.eval.entity.EvaluationNotice;
+
+/**
+ * @author hlf
+ * @date 2023/5/17 14:39
+ * 文件说明:
+ */
+public interface EvaluationNoticeMapper extends BaseMapper<EvaluationNotice> {
+
+	IPage<EvaluationNotice> selectListPage(Page<EvaluationNotice> page, String noticeTitle);
+
+}

+ 58 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/entity/EvaluationNotice.java

@@ -0,0 +1,58 @@
+package com.ims.eval.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+
+/**
+ * @author hlf
+ * @date 2023/5/17 14:33
+ * 文件说明:通告管理
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class EvaluationNotice extends Model {
+
+	private static final long serialVersionUID = 1L;
+
+	//主键
+	private String id;
+	//序号
+	private String serialNumber;
+	//通告标题
+	private String noticeTitle;
+	//通告内容
+	private String noticeContent;
+	//通告对象
+	private String sendTo;
+	//个别部门
+	private String sendToContent;
+	//发布部门主键
+	private String releaseDeptId;
+	//发布部门名称
+	private String releaseDeptName;
+	//发布部门编码
+	private String releaseDeptCode;
+	//发布人
+	private String releasePeople;
+	//发布时间
+	private String releaseDate;
+	//发布状态
+	private String releaseState;
+	//上传附件
+	private String noticeAnnex;
+	//创建时间
+	private Date createTime;
+	//创建者
+	private String createBy;
+	//创建者名称
+	private String createName;
+	//更新时间
+	private Date updateTime;
+	//更新者
+	private String updateBy;
+}

+ 45 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/entity/custom/Path.java

@@ -0,0 +1,45 @@
+package com.ims.eval.entity.custom;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author hlf
+ * @date 2023/5/18 10:08
+ * 文件说明:
+ */
+@Component
+public class Path {
+
+	/**
+	 * 路径
+	 */
+	private static String prefix;
+
+	public static String getPrefix() {
+		String os = System.getProperty("os.name");
+		if (os.toLowerCase().startsWith("win")) {
+			prefix = "D:/home";
+		} else {
+			prefix = "/home/dbkp";
+		}
+		return prefix;
+	}
+
+	public void setPrefix(String profile) {
+		Path.prefix = profile;
+	}
+
+	/**
+	 * 获取报表路径
+	 */
+	public static String getStatementPath() {
+		return getPrefix() + "/statement/";
+	}
+
+	/**
+	 * 获取通告路径
+	 */
+	public static String getNoticePath() {
+		return getPrefix() + "/attachment/";
+	}
+}

+ 17 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/exception/FileException.java

@@ -0,0 +1,17 @@
+package com.ims.eval.exception;
+
+import com.ims.eval.exception.base.BaseException;
+
+/**
+ * 文件信息异常类
+ *
+ * @author hlf
+ */
+public class FileException extends BaseException {
+	private static final long serialVersionUID = 1L;
+
+	public FileException(String code, Object[] args) {
+		super("file", code, args, null);
+	}
+
+}

+ 16 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/exception/FileNameLengthLimitExceededException.java

@@ -0,0 +1,16 @@
+package com.ims.eval.exception;
+
+import com.ims.eval.exception.base.BaseException;
+
+/**
+ * 文件名称超长限制异常类
+ *
+ * @author hlf
+ */
+public class FileNameLengthLimitExceededException extends BaseException {
+	private static final long serialVersionUID = 1L;
+
+	public FileNameLengthLimitExceededException(int defaultFileNameLength) {
+		super("upload.filename.exceed.length", new Object[]{defaultFileNameLength});
+	}
+}

+ 16 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/exception/FileSizeLimitExceededException.java

@@ -0,0 +1,16 @@
+package com.ims.eval.exception;
+
+import com.ims.eval.exception.base.BaseException;
+
+/**
+ * 文件名大小限制异常类
+ *
+ * @author hlf
+ */
+public class FileSizeLimitExceededException extends BaseException {
+	private static final long serialVersionUID = 1L;
+
+	public FileSizeLimitExceededException(long defaultMaxSize) {
+		super("upload.exceed.maxSize", new Object[]{defaultMaxSize});
+	}
+}

+ 69 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/exception/InvalidExtensionException.java

@@ -0,0 +1,69 @@
+package com.ims.eval.exception;
+
+import org.apache.commons.fileupload.FileUploadException;
+
+import java.util.Arrays;
+
+/**
+ * 文件上传 误异常类
+ *
+ * @author hlf
+ */
+public class InvalidExtensionException extends FileUploadException {
+	private static final long serialVersionUID = 1L;
+
+	private String[] allowedExtension;
+	private String extension;
+	private String filename;
+
+	public InvalidExtensionException(String[] allowedExtension, String extension, String filename) {
+		super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
+		this.allowedExtension = allowedExtension;
+		this.extension = extension;
+		this.filename = filename;
+	}
+
+	public String[] getAllowedExtension() {
+		return allowedExtension;
+	}
+
+	public String getExtension() {
+		return extension;
+	}
+
+	public String getFilename() {
+		return filename;
+	}
+
+	public static class InvalidImageExtensionException extends InvalidExtensionException {
+		private static final long serialVersionUID = 1L;
+
+		public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) {
+			super(allowedExtension, extension, filename);
+		}
+	}
+
+	public static class InvalidFlashExtensionException extends InvalidExtensionException {
+		private static final long serialVersionUID = 1L;
+
+		public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) {
+			super(allowedExtension, extension, filename);
+		}
+	}
+
+	public static class InvalidMediaExtensionException extends InvalidExtensionException {
+		private static final long serialVersionUID = 1L;
+
+		public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) {
+			super(allowedExtension, extension, filename);
+		}
+	}
+
+	public static class InvalidVideoExtensionException extends InvalidExtensionException {
+		private static final long serialVersionUID = 1L;
+
+		public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) {
+			super(allowedExtension, extension, filename);
+		}
+	}
+}

+ 84 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/exception/base/BaseException.java

@@ -0,0 +1,84 @@
+package com.ims.eval.exception.base;
+
+import com.ims.common.utils.StringUtils;
+import com.ims.eval.util.MessageUtil;
+
+/**
+ * 基础异常
+ *
+ * @author hlf
+ */
+public class BaseException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 所属模块
+	 */
+	private String module;
+
+	/**
+	 * 错误码
+	 */
+	private String code;
+
+	/**
+	 * 错误码对应的参数
+	 */
+	private Object[] args;
+
+	/**
+	 * 错误消息
+	 */
+	private String defaultMessage;
+
+	public BaseException(String module, String code, Object[] args, String defaultMessage) {
+		this.module = module;
+		this.code = code;
+		this.args = args;
+		this.defaultMessage = defaultMessage;
+	}
+
+	public BaseException(String module, String code, Object[] args) {
+		this(module, code, args, null);
+	}
+
+	public BaseException(String module, String defaultMessage) {
+		this(module, null, null, defaultMessage);
+	}
+
+	public BaseException(String code, Object[] args) {
+		this(null, code, args, null);
+	}
+
+	public BaseException(String defaultMessage) {
+		this(null, null, null, defaultMessage);
+	}
+
+	@Override
+	public String getMessage() {
+		String message = null;
+		if (!StringUtils.isEmpty(code)) {
+			message = MessageUtil.message(code, args);
+		}
+		if (message == null) {
+			message = defaultMessage;
+		}
+		return message;
+	}
+
+	public String getModule() {
+		return module;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public Object[] getArgs() {
+		return args;
+	}
+
+	public String getDefaultMessage() {
+		return defaultMessage;
+	}
+}

+ 21 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/service/IEvaluationNoticeService.java

@@ -0,0 +1,21 @@
+package com.ims.eval.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ims.eval.entity.EvaluationNotice;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author hlf
+ * @date 2023/5/17 14:38
+ * 文件说明:
+ */
+public interface IEvaluationNoticeService extends IService<EvaluationNotice> {
+
+	IPage<EvaluationNotice> listPage(Integer pageNum, Integer pageSize, String noticeTitle);
+
+	boolean saveOrUpdate(EvaluationNotice evaluationNotice, MultipartFile[] files) throws IOException;
+
+}

+ 71 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/service/impl/EvaluationNoticeServiceImpl.java

@@ -0,0 +1,71 @@
+package com.ims.eval.service.impl;
+
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ims.common.utils.StringUtils;
+import com.ims.eval.dao.EvaluationNoticeMapper;
+import com.ims.eval.entity.DataDictionary;
+import com.ims.eval.entity.EvaluationNotice;
+import com.ims.eval.entity.custom.Path;
+import com.ims.eval.service.IDataDictionaryService;
+import com.ims.eval.service.IEvaluationNoticeService;
+import com.ims.eval.util.FileUploadUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Date;
+
+/**
+ * @author hlf
+ * @date 2023/5/17 14:39
+ * 文件说明:
+ */
+@Service
+public class EvaluationNoticeServiceImpl extends ServiceImpl<EvaluationNoticeMapper, EvaluationNotice> implements IEvaluationNoticeService {
+
+	@Autowired
+	private IDataDictionaryService dataDictionaryService;
+
+	@Override
+	public IPage<EvaluationNotice> listPage(Integer pageNum, Integer pageSize, String noticeTitle) {
+		if (null == pageNum || null == pageSize) {
+			throw new RuntimeException("分页参数为空");
+		}
+		//构造分页构造器
+		Page<EvaluationNotice> page = new Page<>(pageNum, pageSize);
+		return baseMapper.selectListPage(page, noticeTitle);
+	}
+
+	@Override
+	public boolean saveOrUpdate(EvaluationNotice evaluationNotice, MultipartFile[] files) throws IOException {
+		StringBuilder fileNames = new StringBuilder();
+		if (files.length > 0) {
+			for (MultipartFile file : files) {
+				// 上传文件路径
+				String filePath = Path.getNoticePath();
+				// 上传并返回新文件名称
+				String fileName = null;
+				fileName = FileUploadUtil.upload(filePath, file);
+				fileNames.append(fileName).append(",");
+			}
+		}
+		if (fileNames.toString().length() > 0) {
+			evaluationNotice.setNoticeAnnex(fileNames.toString().substring(0, fileNames.toString().length() - 1));
+		}
+		DataDictionary dataDictionary = dataDictionaryService.getById(evaluationNotice.getReleaseDeptId());
+		if (null != dataDictionary) {
+			evaluationNotice.setReleaseDeptName(dataDictionary.getKeyName());
+			evaluationNotice.setReleaseDeptCode(dataDictionary.getDataKey());
+		}
+		if ("".equals(evaluationNotice.getId()) || null == evaluationNotice.getId()) {
+			evaluationNotice.setCreateTime(new Date());
+		} else {
+			evaluationNotice.setUpdateTime(new Date());
+		}
+		return super.saveOrUpdate(evaluationNotice);
+	}
+}

+ 203 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/util/FileUploadUtil.java

@@ -0,0 +1,203 @@
+package com.ims.eval.util;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.UUID;
+import com.ims.common.utils.StringUtils;
+import com.ims.eval.entity.custom.Path;
+import com.ims.eval.exception.FileNameLengthLimitExceededException;
+import com.ims.eval.exception.FileSizeLimitExceededException;
+import com.ims.eval.exception.InvalidExtensionException;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+
+/**
+ * 文件上传工具类
+ *
+ * @author hlf
+ */
+public class FileUploadUtil {
+	/**
+	 * 默认大小 50M
+	 */
+	public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
+
+	/**
+	 * 默认的文件名最大长度 100
+	 */
+	public static final int DEFAULT_FILE_NAME_LENGTH = 100;
+
+	/**
+	 * 默认上传的地址
+	 */
+	private static String defaultBaseDir = Path.getPrefix();
+
+	public static void setDefaultBaseDir(String defaultBaseDir) {
+		FileUploadUtil.defaultBaseDir = defaultBaseDir;
+	}
+
+	public static String getDefaultBaseDir() {
+		return defaultBaseDir;
+	}
+
+	/**
+	 * 以默认配置进行文件上传
+	 *
+	 * @param file 上传的文件
+	 * @return 文件名称
+	 * @throws Exception
+	 */
+	public static final String upload(MultipartFile file) throws IOException {
+		try {
+			return upload(getDefaultBaseDir(), file, MimeTypeUtil.DEFAULT_ALLOWED_EXTENSION);
+		} catch (Exception e) {
+			throw new IOException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 根据文件路径上传
+	 *
+	 * @param baseDir 相对应用的基目录
+	 * @param file    上传的文件
+	 * @return 文件名称
+	 * @throws IOException
+	 */
+	public static final String upload(String baseDir, MultipartFile file) throws IOException {
+		try {
+			return upload(baseDir, file, MimeTypeUtil.DEFAULT_ALLOWED_EXTENSION);
+		} catch (Exception e) {
+			throw new IOException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 文件上传
+	 *
+	 * @param baseDir          相对应用的基目录
+	 * @param file             上传的文件
+	 * @param allowedExtension 上传文件类型
+	 * @return 返回上传成功的文件名
+	 * @throws FileSizeLimitExceededException       如果超出最大大小
+	 * @throws FileNameLengthLimitExceededException 文件名太长
+	 * @throws IOException                          比如读写文件出错时
+	 * @throws InvalidExtensionException            文件校验异常
+	 */
+	public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
+		throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+		InvalidExtensionException {
+		int fileNamelength = file.getOriginalFilename().length();
+		if (fileNamelength > FileUploadUtil.DEFAULT_FILE_NAME_LENGTH) {
+			throw new FileNameLengthLimitExceededException(FileUploadUtil.DEFAULT_FILE_NAME_LENGTH);
+		}
+
+		assertAllowed(file, allowedExtension);
+
+		String fileName = extractFilename(file);
+
+		File desc = getAbsoluteFile(baseDir, fileName);
+		file.transferTo(desc);
+		String pathFileName = getPathFileName(baseDir, fileName);
+		return pathFileName;
+	}
+
+	/**
+	 * 编码文件名
+	 */
+	public static final String extractFilename(MultipartFile file) {
+		String fileName = file.getOriginalFilename();
+		String fileNameNow = fileName.substring(0, fileName.lastIndexOf("."));
+		String extension = getExtension(file);
+		fileName = DateFormatUtils.format(new Date(), "yyyy/MM/dd") + "/" + fileNameNow + "_" + DateUtil.format(new Date(), "HHmmssSSS") + "." + extension;
+		return fileName;
+	}
+
+	private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
+		File desc = new File(uploadDir + File.separator + fileName);
+
+		if (!desc.exists()) {
+			if (!desc.getParentFile().exists()) {
+				desc.getParentFile().mkdirs();
+			}
+		}
+		return desc;
+	}
+
+	private static final String getPathFileName(String uploadDir, String fileName) throws IOException {
+		int dirLastIndex = Path.getPrefix().length() + 1;
+		String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
+		String pathFileName = "/prefix" + "/" + currentDir + "/" + fileName;
+		return pathFileName;
+	}
+
+	/**
+	 * 文件大小校验
+	 *
+	 * @param file 上传的文件
+	 * @return
+	 * @throws FileSizeLimitExceededException 如果超出最大大小
+	 * @throws InvalidExtensionException
+	 */
+	public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
+		throws FileSizeLimitExceededException, InvalidExtensionException {
+		long size = file.getSize();
+		if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {
+			throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
+		}
+
+		String fileName = file.getOriginalFilename();
+		String extension = getExtension(file);
+		if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {
+			if (allowedExtension == MimeTypeUtil.IMAGE_EXTENSION) {
+				throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
+					fileName);
+			} else if (allowedExtension == MimeTypeUtil.FLASH_EXTENSION) {
+				throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
+					fileName);
+			} else if (allowedExtension == MimeTypeUtil.MEDIA_EXTENSION) {
+				throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
+					fileName);
+			} else if (allowedExtension == MimeTypeUtil.VIDEO_EXTENSION) {
+				throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
+					fileName);
+			} else {
+				throw new InvalidExtensionException(allowedExtension, extension, fileName);
+			}
+		}
+
+	}
+
+	/**
+	 * 判断MIME类型是否是允许的MIME类型
+	 *
+	 * @param extension
+	 * @param allowedExtension
+	 * @return
+	 */
+	public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {
+		for (String str : allowedExtension) {
+			if (str.equalsIgnoreCase(extension)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 获取文件名的后缀
+	 *
+	 * @param file 表单文件
+	 * @return 后缀名
+	 */
+	public static final String getExtension(MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringUtils.isEmpty(extension)) {
+			extension = MimeTypeUtil.getExtension(file.getContentType());
+		}
+		return extension;
+	}
+}

+ 23 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/util/MessageUtil.java

@@ -0,0 +1,23 @@
+package com.ims.eval.util;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+/**
+ * 获取i18n资源文件
+ *
+ * @author hlf
+ */
+public class MessageUtil {
+	/**
+	 * 根据消息键和参数 获取消息 委托给spring messageSource
+	 *
+	 * @param code 消息键
+	 * @param args 参数
+	 * @return 获取国际化翻译值
+	 */
+	public static String message(String code, Object... args) {
+		MessageSource messageSource = SpringUtil.getBean(MessageSource.class);
+		return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
+	}
+}

+ 56 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/util/MimeTypeUtil.java

@@ -0,0 +1,56 @@
+package com.ims.eval.util;
+
+/**
+ * 媒体类型工具类
+ *
+ * @author hlf
+ */
+public class MimeTypeUtil {
+	public static final String IMAGE_PNG = "image/png";
+
+	public static final String IMAGE_JPG = "image/jpg";
+
+	public static final String IMAGE_JPEG = "image/jpeg";
+
+	public static final String IMAGE_BMP = "image/bmp";
+
+	public static final String IMAGE_GIF = "image/gif";
+
+	public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"};
+
+	public static final String[] FLASH_EXTENSION = {"swf", "flv"};
+
+	public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
+		"asf", "rm", "rmvb"};
+
+	public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"};
+
+	public static final String[] DEFAULT_ALLOWED_EXTENSION = {
+		// 图片
+		"bmp", "gif", "jpg", "jpeg", "png",
+		// word excel powerpoint
+		"doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
+		// 压缩文件
+		"rar", "zip", "gz", "bz2",
+		// 视频格式
+		"mp4", "avi", "rmvb",
+		// pdf
+		"pdf"};
+
+	public static String getExtension(String prefix) {
+		switch (prefix) {
+			case IMAGE_PNG:
+				return "png";
+			case IMAGE_JPG:
+				return "jpg";
+			case IMAGE_JPEG:
+				return "jpeg";
+			case IMAGE_BMP:
+				return "bmp";
+			case IMAGE_GIF:
+				return "gif";
+			default:
+				return "";
+		}
+	}
+}

+ 131 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/util/SpringUtil.java

@@ -0,0 +1,131 @@
+package com.ims.eval.util;
+
+import com.ims.common.utils.StringUtils;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring工具类 方便在非spring管理环境中获取bean
+ *
+ * @author hlf
+ */
+@Component
+public final class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextAware {
+	/**
+	 * Spring应用上下文环境
+	 */
+	private static ConfigurableListableBeanFactory beanFactory;
+
+	private static ApplicationContext applicationContext;
+
+	@Override
+	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+		SpringUtil.beanFactory = beanFactory;
+	}
+
+	@Override
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+		SpringUtil.applicationContext = applicationContext;
+	}
+
+	/**
+	 * 获取对象
+	 *
+	 * @param name
+	 * @return Object 一个以所给名字注册的bean的实例
+	 * @throws BeansException
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T getBean(String name) throws BeansException {
+		return (T) beanFactory.getBean(name);
+	}
+
+	/**
+	 * 获取类型为requiredType的对象
+	 *
+	 * @param clz
+	 * @return
+	 * @throws BeansException
+	 */
+	public static <T> T getBean(Class<T> clz) throws BeansException {
+		T result = (T) beanFactory.getBean(clz);
+		return result;
+	}
+
+	/**
+	 * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+	 *
+	 * @param name
+	 * @return boolean
+	 */
+	public static boolean containsBean(String name) {
+		return beanFactory.containsBean(name);
+	}
+
+	/**
+	 * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+	 *
+	 * @param name
+	 * @return boolean
+	 * @throws NoSuchBeanDefinitionException
+	 */
+	public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
+		return beanFactory.isSingleton(name);
+	}
+
+	/**
+	 * @param name
+	 * @return Class 注册对象的类型
+	 * @throws NoSuchBeanDefinitionException
+	 */
+	public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
+		return beanFactory.getType(name);
+	}
+
+	/**
+	 * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+	 *
+	 * @param name
+	 * @return
+	 * @throws NoSuchBeanDefinitionException
+	 */
+	public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
+		return beanFactory.getAliases(name);
+	}
+
+	/**
+	 * 获取aop代理对象
+	 *
+	 * @param invoker
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T getAopProxy(T invoker) {
+		return (T) AopContext.currentProxy();
+	}
+
+	/**
+	 * 获取当前的环境配置,无配置返回null
+	 *
+	 * @return 当前的环境配置
+	 */
+	public static String[] getActiveProfiles() {
+		return applicationContext.getEnvironment().getActiveProfiles();
+	}
+
+	/**
+	 * 获取当前的环境配置,当有多个环境配置时,只获取第一个
+	 *
+	 * @return 当前的环境配置
+	 */
+	public static String getActiveProfile() {
+		final String[] activeProfiles = getActiveProfiles();
+		return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
+	}
+}

+ 60 - 0
ims-service/ims-eval/src/main/resources/mappers/EvaluationNoticeMapper.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ims.eval.dao.EvaluationNoticeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ims.eval.entity.EvaluationNotice">
+        <id column="id" property="id"/>
+        <result column="serial_number" property="serialNumber"/>
+        <result column="notice_title" property="noticeTitle"/>
+        <result column="notice_content" property="noticeContent"/>
+        <result column="send_to" property="sendTo"/>
+        <result column="send_to_content" property="sendToContent"/>
+        <result column="release_dept_id" property="releaseDeptId"/>
+        <result column="release_dept_name" property="releaseDeptName"/>
+        <result column="release_dept_code" property="releaseDeptCode"/>
+        <result column="release_people" property="releasePeople"/>
+        <result column="release_date" property="releaseDate"/>
+        <result column="release_state" property="releaseState"/>
+        <result column="notice_annex" property="noticeAnnex"/>
+        <result column="create_time" property="createTime"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_name" property="createName"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="update_by" property="updateBy"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="selectEvaluationNoticeVo">
+        select id,
+               serial_number,
+               notice_title,
+               notice_content,
+               send_to,
+               send_to_content,
+               release_dept_id,
+               release_dept_name,
+               release_dept_code,
+               release_people,
+               release_date,
+               release_state,
+               notice_annex,
+               create_time,
+               create_by,
+               create_name,
+               update_time,
+               update_by
+        from evaluation_notice
+    </sql>
+
+    <select id="selectListPage" resultType="com.ims.eval.entity.EvaluationNotice">
+        <include refid="selectEvaluationNoticeVo"/>
+        <where>
+            <if test="noticeTitle != null and noticeTitle != ''">
+                AND notice_title like CONCAT('%',#{noticeTitle},'%')
+            </if>
+        </where>
+        order by serial_number asc
+    </select>
+
+</mapper>