SysDictController.java 19.6 KB
Newer Older
1 2 3
package org.jeecg.modules.system.controller;


4 5 6 7 8 9
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
10
import org.apache.shiro.SecurityUtils;
11
import org.apache.shiro.authz.annotation.RequiresRoles;
12
import org.jeecg.common.api.vo.Result;
13 14
import org.jeecg.common.constant.CacheConstant;
import org.jeecg.common.constant.CommonConstant;
15
import org.jeecg.common.system.query.QueryGenerator;
16
import org.jeecg.common.system.vo.DictModel;
17
import org.jeecg.common.system.vo.DictQuery;
18
import org.jeecg.common.system.vo.LoginUser;
19
import org.jeecg.common.util.ImportExcelUtil;
20
import org.jeecg.common.util.SqlInjectionUtil;
21 22
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.system.entity.SysDict;
23
import org.jeecg.modules.system.entity.SysDictItem;
24
import org.jeecg.modules.system.model.SysDictTree;
25
import org.jeecg.modules.system.model.TreeSelectModel;
26
import org.jeecg.modules.system.service.ISysDictItemService;
27
import org.jeecg.modules.system.service.ISysDictService;
28
import org.jeecg.modules.system.vo.SysDictPage;
29
import org.jeecgframework.poi.excel.ExcelImportCheckUtil;
30 31 32 33 34 35
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.BeanUtils;
36
import org.springframework.beans.factory.annotation.Autowired;
37
import org.springframework.cache.annotation.CacheEvict;
38
import org.springframework.data.redis.core.RedisTemplate;
39
import org.springframework.web.bind.annotation.*;
40 41 42
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
43

44 45 46
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
47 48 49 50 51 52

/**
 * <p>
 * 字典表 前端控制器
 * </p>
 *
53
 * @Author zhangweijian
54 55 56 57 58 59
 * @since 2018-12-28
 */
@RestController
@RequestMapping("/sys/dict")
@Slf4j
public class SysDictController {
60

61 62
	@Autowired
	private ISysDictService sysDictService;
63 64
	@Autowired
	private ISysDictItemService sysDictItemService;
65 66
	@Autowired
	public RedisTemplate<String, Object> redisTemplate;
67

68
	@RequestMapping(value = "/list", method = RequestMethod.GET)
69 70
	public Result<IPage<SysDict>> queryPageList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) {
71
		Result<IPage<SysDict>> result = new Result<IPage<SysDict>>();
72 73
		QueryWrapper<SysDict> queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap());
		Page<SysDict> page = new Page<SysDict>(pageNo, pageSize);
74
		IPage<SysDict> pageList = sysDictService.page(page, queryWrapper);
75 76 77 78
		log.debug("查询当前页:"+pageList.getCurrent());
		log.debug("查询当前页数量:"+pageList.getSize());
		log.debug("查询结果数量:"+pageList.getRecords().size());
		log.debug("数据总数:"+pageList.getTotal());
79 80 81 82
		result.setSuccess(true);
		result.setResult(pageList);
		return result;
	}
83

84 85 86 87 88 89 90 91 92 93
	/**
	 * @功能:获取树形字典数据
	 * @param sysDict
	 * @param pageNo
	 * @param pageSize
	 * @param req
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/treeList", method = RequestMethod.GET)
94 95
	public Result<List<SysDictTree>> treeList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                              @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) {
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
		Result<List<SysDictTree>> result = new Result<>();
		LambdaQueryWrapper<SysDict> query = new LambdaQueryWrapper<>();
		// 构造查询条件
		String dictName = sysDict.getDictName();
		if(oConvertUtils.isNotEmpty(dictName)) {
			query.like(true, SysDict::getDictName, dictName);
		}
		query.orderByDesc(true, SysDict::getCreateTime);
		List<SysDict> list = sysDictService.list(query);
		List<SysDictTree> treeList = new ArrayList<>();
		for (SysDict node : list) {
			treeList.add(new SysDictTree(node));
		}
		result.setSuccess(true);
		result.setResult(treeList);
		return result;
	}
113

114 115
	/**
	 * 获取字典数据
116 117
	 * @param dictCode 字典code
	 * @param dictCode 表名,文本字段,code字段  | 举例:sys_user,realname,id
118 119 120
	 * @return
	 */
	@RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET)
121
	public Result<List<DictModel>> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) {
122
		log.info(" dictCode : "+ dictCode);
123 124
		Result<List<DictModel>> result = new Result<List<DictModel>>();
		List<DictModel> ls = null;
125
		try {
126 127 128
			if(dictCode.indexOf(",")!=-1) {
				//关联表字典(举例:sys_user,realname,id)
				String[] params = dictCode.split(",");
129

130 131 132 133 134 135 136
				if(params.length<3) {
					result.error500("字典Code格式不正确!");
					return result;
				}
				//SQL注入校验(只限制非法串改数据库)
				final String[] sqlInjCheck = {params[0],params[1],params[2]};
				SqlInjectionUtil.filterContent(sqlInjCheck);
137

138 139 140 141 142 143 144
				if(params.length==4) {
					//SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用)
					SqlInjectionUtil.specialFilterContent(params[3]);
					ls = sysDictService.queryTableDictItemsByCodeAndFilter(params[0],params[1],params[2],params[3]);
				}else if (params.length==3) {
					ls = sysDictService.queryTableDictItemsByCode(params[0],params[1],params[2]);
				}else{
145 146 147 148 149 150 151 152
					result.error500("字典Code格式不正确!");
					return result;
				}
			}else {
				//字典表
				 ls = sysDictService.queryDictItemsByCode(dictCode);
			}

153 154
			 result.setSuccess(true);
			 result.setResult(ls);
155
			 log.debug(result.toString());
156
		} catch (Exception e) {
157
			log.error(e.getMessage(),e);
158 159 160
			result.error500("操作失败");
			return result;
		}
161

162 163
		return result;
	}
164

165 166 167 168 169 170 171 172 173 174 175 176
	/**
	 * 获取全部字典数据
	 *
	 * @return
	 */
	@RequestMapping(value = "/queryAllDictItems", method = RequestMethod.GET)
	public Result<?> queryAllDictItems(HttpServletRequest request) {
		Map<String, List<DictModel>> res = new HashMap<String, List<DictModel>>();
		res = sysDictService.queryAllDictItems();
		return Result.ok(res);
	}

177 178 179 180 181 182
	/**
	 * 获取字典数据
	 * @param dictCode
	 * @return
	 */
	@RequestMapping(value = "/getDictText/{dictCode}/{key}", method = RequestMethod.GET)
183
	public Result<String> getDictText(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) {
184 185 186 187 188 189 190 191
		log.info(" dictCode : "+ dictCode);
		Result<String> result = new Result<String>();
		String text = null;
		try {
			text = sysDictService.queryDictTextByKey(dictCode, key);
			 result.setSuccess(true);
			 result.setResult(text);
		} catch (Exception e) {
192
			log.error(e.getMessage(),e);
193 194 195 196 197
			result.error500("操作失败");
			return result;
		}
		return result;
	}
198

199 200 201 202 203 204
	/**
	 * 大数据量的字典表 走异步加载  即前端输入内容过滤数据
	 * @param dictCode
	 * @return
	 */
	@RequestMapping(value = "/loadDict/{dictCode}", method = RequestMethod.GET)
205
	public Result<List<DictModel>> loadDict(@PathVariable String dictCode,
206 207 208
                                            @RequestParam(name="keyword") String keyword,
                                            @RequestParam(value = "sign",required = false) String sign,
                                            @RequestParam(value = "pageSize", required = false) Integer pageSize) {
209 210 211 212 213 214 215 216 217 218
		log.info(" 加载字典表数据,加载关键字: "+ keyword);
		Result<List<DictModel>> result = new Result<List<DictModel>>();
		List<DictModel> ls = null;
		try {
			if(dictCode.indexOf(",")!=-1) {
				String[] params = dictCode.split(",");
				if(params.length!=3) {
					result.error500("字典Code格式不正确!");
					return result;
				}
219 220 221 222 223
				if(pageSize!=null){
					ls = sysDictService.queryLittleTableDictItems(params[0],params[1],params[2],keyword, pageSize);
				}else{
					ls = sysDictService.queryTableDictItems(params[0],params[1],params[2],keyword);
				}
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
				result.setSuccess(true);
				result.setResult(ls);
				log.info(result.toString());
			}else {
				result.error500("字典Code格式不正确!");
			}
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			result.error500("操作失败");
			return result;
		}

		return result;
	}

	/**
	 * 根据字典code加载字典text 返回
	 */
	@RequestMapping(value = "/loadDictItem/{dictCode}", method = RequestMethod.GET)
243
	public Result<List<String>> loadDictItem(@PathVariable String dictCode, @RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) {
244 245 246 247 248 249 250 251
		Result<List<String>> result = new Result<>();
		try {
			if(dictCode.indexOf(",")!=-1) {
				String[] params = dictCode.split(",");
				if(params.length!=3) {
					result.error500("字典Code格式不正确!");
					return result;
				}
252
				List<String> texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys);
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273

				result.setSuccess(true);
				result.setResult(texts);
				log.info(result.toString());
			}else {
				result.error500("字典Code格式不正确!");
			}
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			result.error500("操作失败");
			return result;
		}

		return result;
	}

	/**
	 * 根据表名——显示字段-存储字段 pid 加载树形数据
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/loadTreeData", method = RequestMethod.GET)
274 275 276 277 278 279 280
	public Result<List<TreeSelectModel>> loadTreeData(@RequestParam(name="pid") String pid, @RequestParam(name="pidField") String pidField,
                                                      @RequestParam(name="tableName") String tbname,
                                                      @RequestParam(name="text") String text,
                                                      @RequestParam(name="code") String code,
                                                      @RequestParam(name="hasChildField") String hasChildField,
                                                      @RequestParam(name="condition") String condition,
                                                      @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) {
281 282 283 284 285 286 287
		Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();
		Map<String, String> query = null;
		if(oConvertUtils.isNotEmpty(condition)) {
			query = JSON.parseObject(condition, Map.class);
		}
		// SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件)
		String dictCode = tbname+","+text+","+code+","+condition;
288
        SqlInjectionUtil.filterContent(dictCode);
289 290 291 292 293 294 295
		List<TreeSelectModel> ls = sysDictService.queryTreeList(query,tbname, text, code, pidField, pid,hasChildField);
		result.setSuccess(true);
		result.setResult(ls);
		return result;
	}

	/**
296
	 * 【APP接口】根据字典配置查询表字典数据(目前暂未找到调用的地方)
297 298 299 300 301
	 * @param query
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
302
	@Deprecated
303 304
	@GetMapping("/queryTableData")
	public Result<List<DictModel>> queryTableData(DictQuery query,
305 306 307
                                                  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                  @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                  @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request){
308 309 310
		Result<List<DictModel>> res = new Result<List<DictModel>>();
		// SQL注入漏洞 sign签名校验
		String dictCode = query.getTable()+","+query.getText()+","+query.getCode();
311
        SqlInjectionUtil.filterContent(dictCode);
312 313 314 315 316 317
		List<DictModel> ls = this.sysDictService.queryDictTablePageList(query,pageSize,pageNo);
		res.setResult(ls);
		res.setSuccess(true);
		return res;
	}

318 319 320 321 322
	/**
	 * @功能:新增
	 * @param sysDict
	 * @return
	 */
323
	@RequiresRoles({"admin"})
324 325 326 327 328
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	public Result<SysDict> add(@RequestBody SysDict sysDict) {
		Result<SysDict> result = new Result<SysDict>();
		try {
			sysDict.setCreateTime(new Date());
329
			sysDict.setDelFlag(CommonConstant.DEL_FLAG_0);
330 331 332
			sysDictService.save(sysDict);
			result.success("保存成功!");
		} catch (Exception e) {
333
			log.error(e.getMessage(),e);
334 335 336 337
			result.error500("操作失败");
		}
		return result;
	}
338

339 340 341 342 343
	/**
	 * @功能:编辑
	 * @param sysDict
	 * @return
	 */
344
	@RequiresRoles({"admin"})
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
	public Result<SysDict> edit(@RequestBody SysDict sysDict) {
		Result<SysDict> result = new Result<SysDict>();
		SysDict sysdict = sysDictService.getById(sysDict.getId());
		if(sysdict==null) {
			result.error500("未找到对应实体");
		}else {
			sysDict.setUpdateTime(new Date());
			boolean ok = sysDictService.updateById(sysDict);
			if(ok) {
				result.success("编辑成功!");
			}
		}
		return result;
	}
360

361 362 363 364 365
	/**
	 * @功能:删除
	 * @param id
	 * @return
	 */
366
	@RequiresRoles({"admin"})
367
	@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
368
	@CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true)
369 370
	public Result<SysDict> delete(@RequestParam(name="id",required=true) String id) {
		Result<SysDict> result = new Result<SysDict>();
371 372 373 374 375
		boolean ok = sysDictService.removeById(id);
		if(ok) {
			result.success("删除成功!");
		}else{
			result.error500("删除失败!");
376 377 378
		}
		return result;
	}
379

380 381 382 383 384
	/**
	 * @功能:批量删除
	 * @param ids
	 * @return
	 */
385
	@RequiresRoles({"admin"})
386
	@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
387
	@CacheEvict(value= CacheConstant.SYS_DICT_CACHE, allEntries=true)
388 389
	public Result<SysDict> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
		Result<SysDict> result = new Result<SysDict>();
390
		if(oConvertUtils.isEmpty(ids)) {
391 392
			result.error500("参数不识别!");
		}else {
393
			sysDictService.removeByIds(Arrays.asList(ids.split(",")));
394 395 396 397
			result.success("删除成功!");
		}
		return result;
	}
398

399 400 401 402 403 404 405 406 407 408 409 410
	/**
	 * @功能:刷新缓存
	 * @return
	 */
	@RequestMapping(value = "/refleshCache")
	public Result<?> refleshCache() {
		Result<?> result = new Result<SysDict>();
		//清空字典缓存
		Set keys = redisTemplate.keys(CacheConstant.SYS_DICT_CACHE + "*");
		Set keys2 = redisTemplate.keys(CacheConstant.SYS_DICT_TABLE_CACHE + "*");
		Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*");
		Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
411 412
		Set keys5 = redisTemplate.keys( "jmreport:cache:dict*");
		Set keys6 = redisTemplate.keys( "jmreport:cache:dictTable*");
413 414 415 416
		redisTemplate.delete(keys);
		redisTemplate.delete(keys2);
		redisTemplate.delete(keys3);
		redisTemplate.delete(keys4);
417 418
		redisTemplate.delete(keys5);
		redisTemplate.delete(keys6);
419 420 421
		return result;
	}

422 423 424 425 426 427
	/**
	 * 导出excel
	 *
	 * @param request
	 */
	@RequestMapping(value = "/exportXls")
428
	public ModelAndView exportXls(SysDict sysDict, HttpServletRequest request) {
429
		// Step.1 组装查询条件
430
		QueryWrapper<SysDict> queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap());
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
		//Step.2 AutoPoi 导出Excel
		ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
		List<SysDictPage> pageList = new ArrayList<SysDictPage>();

		List<SysDict> sysDictList = sysDictService.list(queryWrapper);
		for (SysDict dictMain : sysDictList) {
			SysDictPage vo = new SysDictPage();
			BeanUtils.copyProperties(dictMain, vo);
			// 查询机票
			List<SysDictItem> sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId());
			vo.setSysDictItemList(sysDictItemList);
			pageList.add(vo);
		}

		// 导出文件名称
		mv.addObject(NormalExcelConstants.FILE_NAME, "数据字典");
		// 注解对象Class
		mv.addObject(NormalExcelConstants.CLASS, SysDictPage.class);
		// 自定义表格参数
450 451
		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
		mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典"));
452 453 454 455 456 457 458 459 460 461 462 463
		// 导出数据列表
		mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
		return mv;
	}

	/**
	 * 通过excel导入数据
	 *
	 * @param request
	 * @param
	 * @return
	 */
464
	@RequiresRoles({"admin"})
465 466
	@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
	public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
467
 		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
468 469 470 471 472 473 474 475
		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
			MultipartFile file = entity.getValue();// 获取上传文件对象
			ImportParams params = new ImportParams();
			params.setTitleRows(2);
			params.setHeadRows(2);
			params.setNeedSave(true);
			try {
476
				//导入Excel格式校验,看匹配的字段文本概率
477 478
				Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params);
				if(!t){
479
					throw new RuntimeException("导入Excel校验失败 !");
480
				}
481
				List<SysDictPage> list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params);
482 483 484 485
				// 错误信息
				List<String> errorMessage = new ArrayList<>();
				int successLines = 0, errorLines = 0;
				for (int i=0;i< list.size();i++) {
486
					SysDict po = new SysDict();
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
					BeanUtils.copyProperties(list.get(i), po);
					po.setDelFlag(CommonConstant.DEL_FLAG_0);
					try {
						Integer integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList());
						if(integer>0){
							successLines++;
						}else{
							errorLines++;
							int lineNumber = i + 1;
							errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。");
						}
					}  catch (Exception e) {
						errorLines++;
						int lineNumber = i + 1;
						errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。");
					}
503
				}
504
				return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage);
505
			} catch (Exception e) {
506 507
				log.error(e.getMessage(),e);
				return Result.error("文件导入失败:"+e.getMessage());
508 509 510 511 512 513 514 515
			} finally {
				try {
					file.getInputStream().close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
516
		return Result.error("文件导入失败!");
517
	}
518

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564

	/**
	 * 查询被删除的列表
	 * @return
	 */
	@RequestMapping(value = "/deleteList", method = RequestMethod.GET)
	public Result<List<SysDict>> deleteList() {
		Result<List<SysDict>> result = new Result<List<SysDict>>();
		List<SysDict> list = this.sysDictService.queryDeleteList();
		result.setSuccess(true);
		result.setResult(list);
		return result;
	}

	/**
	 * 物理删除
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/deletePhysic/{id}", method = RequestMethod.DELETE)
	public Result<?> deletePhysic(@PathVariable String id) {
		try {
			sysDictService.deleteOneDictPhysically(id);
			return Result.ok("删除成功!");
		} catch (Exception e) {
			e.printStackTrace();
			return Result.error("删除失败!");
		}
	}

	/**
	 * 取回
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/back/{id}", method = RequestMethod.PUT)
	public Result<?> back(@PathVariable String id) {
		try {
			sysDictService.updateDictDelFlag(0,id);
			return Result.ok("操作成功!");
		} catch (Exception e) {
			e.printStackTrace();
			return Result.error("操作失败!");
		}
	}

565
}