1a04530d86dc12308e7ca87780426e140e90c846.svn-base 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. package org.jeecg.modules.system.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.jeecg.common.constant.CacheConstant;
  8. import org.jeecg.common.constant.CommonConstant;
  9. import org.jeecg.common.system.vo.DictModel;
  10. import org.jeecg.common.system.vo.DictModelMany;
  11. import org.jeecg.common.system.vo.DictQuery;
  12. import org.jeecg.common.util.SqlInjectionUtil;
  13. import org.jeecg.common.util.oConvertUtils;
  14. import org.jeecg.modules.system.entity.SysDict;
  15. import org.jeecg.modules.system.entity.SysDictItem;
  16. import org.jeecg.modules.system.mapper.SysDictItemMapper;
  17. import org.jeecg.modules.system.mapper.SysDictMapper;
  18. import org.jeecg.modules.system.model.TreeSelectModel;
  19. import org.jeecg.modules.system.service.ISysDictService;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.cache.annotation.Cacheable;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import java.util.ArrayList;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.stream.Collectors;
  29. /**
  30. * <p>
  31. * 字典表 服务实现类
  32. * </p>
  33. *
  34. * @Author zhangweijian
  35. * @since 2018-12-28
  36. */
  37. @Service
  38. @Slf4j
  39. public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements ISysDictService {
  40. @Autowired
  41. private SysDictMapper sysDictMapper;
  42. @Autowired
  43. private SysDictItemMapper sysDictItemMapper;
  44. /**
  45. * 通过查询指定code 获取字典
  46. * @param code
  47. * @return
  48. */
  49. @Override
  50. @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code", unless = "#result == null ")
  51. public List<DictModel> queryDictItemsByCode(String code) {
  52. log.debug("无缓存dictCache的时候调用这里!");
  53. return sysDictMapper.queryDictItemsByCode(code);
  54. }
  55. @Override
  56. @Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE,key = "#code", unless = "#result == null ")
  57. public List<DictModel> queryEnableDictItemsByCode(String code) {
  58. log.debug("无缓存dictCache的时候调用这里!");
  59. return sysDictMapper.queryEnableDictItemsByCode(code);
  60. }
  61. @Override
  62. public Map<String, List<DictModel>> queryDictItemsByCodeList(List<String> dictCodeList) {
  63. List<DictModelMany> list = sysDictMapper.queryDictItemsByCodeList(dictCodeList);
  64. Map<String, List<DictModel>> dictMap = new HashMap<>();
  65. for (DictModelMany dict : list) {
  66. List<DictModel> dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>());
  67. dict.setDictCode(null);
  68. dictItemList.add(new DictModel(dict.getValue(), dict.getText()));
  69. }
  70. return dictMap;
  71. }
  72. @Override
  73. public Map<String, List<DictModel>> queryAllDictItems() {
  74. Map<String, List<DictModel>> res = new HashMap<String, List<DictModel>>();
  75. List<SysDict> ls = sysDictMapper.selectList(null);
  76. LambdaQueryWrapper<SysDictItem> queryWrapper = new LambdaQueryWrapper<SysDictItem>();
  77. queryWrapper.eq(SysDictItem::getStatus, 1);
  78. queryWrapper.orderByAsc(SysDictItem::getSortOrder);
  79. List<SysDictItem> sysDictItemList = sysDictItemMapper.selectList(queryWrapper);
  80. for (SysDict d : ls) {
  81. List<DictModel> dictModelList = sysDictItemList.stream().filter(s -> d.getId().equals(s.getDictId())).map(item -> {
  82. DictModel dictModel = new DictModel();
  83. dictModel.setText(item.getItemText());
  84. dictModel.setValue(item.getItemValue());
  85. return dictModel;
  86. }).collect(Collectors.toList());
  87. res.put(d.getDictCode(), dictModelList);
  88. }
  89. log.debug("-------登录加载系统字典-----" + res.toString());
  90. return res;
  91. }
  92. /**
  93. * 通过查询指定code 获取字典值text
  94. * @param code
  95. * @param key
  96. * @return
  97. */
  98. @Override
  99. @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code+':'+#key", unless = "#result == null ")
  100. public String queryDictTextByKey(String code, String key) {
  101. log.debug("无缓存dictText的时候调用这里!");
  102. return sysDictMapper.queryDictTextByKey(code, key);
  103. }
  104. @Override
  105. public Map<String, List<DictModel>> queryManyDictByKeys(List<String> dictCodeList, List<String> keys) {
  106. List<DictModelMany> list = sysDictMapper.queryManyDictByKeys(dictCodeList, keys);
  107. Map<String, List<DictModel>> dictMap = new HashMap<>();
  108. for (DictModelMany dict : list) {
  109. List<DictModel> dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>());
  110. dictItemList.add(new DictModel(dict.getValue(), dict.getText()));
  111. }
  112. return dictMap;
  113. }
  114. /**
  115. * 通过查询指定table的 text code 获取字典
  116. * dictTableCache采用redis缓存有效期10分钟
  117. * @param table
  118. * @param text
  119. * @param code
  120. * @return
  121. */
  122. @Override
  123. //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE)
  124. public List<DictModel> queryTableDictItemsByCode(String table, String text, String code) {
  125. log.debug("无缓存dictTableList的时候调用这里!");
  126. return sysDictMapper.queryTableDictItemsByCode(table,text,code);
  127. }
  128. @Override
  129. public List<DictModel> queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) {
  130. log.debug("无缓存dictTableList的时候调用这里!");
  131. return sysDictMapper.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql);
  132. }
  133. /**
  134. * 通过查询指定table的 text code 获取字典值text
  135. * dictTableCache采用redis缓存有效期10分钟
  136. * @param table
  137. * @param text
  138. * @param code
  139. * @param key
  140. * @return
  141. */
  142. @Override
  143. @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE, unless = "#result == null ")
  144. public String queryTableDictTextByKey(String table,String text,String code, String key) {
  145. log.debug("无缓存dictTable的时候调用这里!");
  146. return sysDictMapper.queryTableDictTextByKey(table,text,code,key);
  147. }
  148. @Override
  149. public List<DictModel> queryTableDictTextByKeys(String table, String text, String code, List<String> keys) {
  150. return sysDictMapper.queryTableDictTextByKeys(table, text, code, keys);
  151. }
  152. @Override
  153. public List<String> queryTableDictByKeys(String table, String text, String code, String keys) {
  154. return this.queryTableDictByKeys(table, text, code, keys, true);
  155. }
  156. /**
  157. * 通过查询指定table的 text code 获取字典,包含text和value
  158. * dictTableCache采用redis缓存有效期10分钟
  159. * @param table
  160. * @param text
  161. * @param code
  162. * @param keys (逗号分隔)
  163. * @param delNotExist 是否移除不存在的项,默认为true,设为false如果某个key不存在数据库中,则直接返回key本身
  164. * @return
  165. */
  166. @Override
  167. //update-begin--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存
  168. //@Cacheable(value = CacheConstant.SYS_DICT_TABLE_BY_KEYS_CACHE)
  169. //update-end--Author:lvdandan Date:20201204 for:JT-36【online】树形列表bug修改后,还是显示原来值 暂时去掉缓存
  170. public List<String> queryTableDictByKeys(String table, String text, String code, String keys, boolean delNotExist) {
  171. if(oConvertUtils.isEmpty(keys)){
  172. return null;
  173. }
  174. String[] keyArray = keys.split(",");
  175. List<DictModel> dicts = sysDictMapper.queryTableDictByKeys(table, text, code, keyArray);
  176. List<String> texts = new ArrayList<>(dicts.size());
  177. // update-begin--author:sunjianlei--date:20210514--for:新增delNotExist参数,设为false不删除数据库里不存在的key ----
  178. // 查询出来的顺序可能是乱的,需要排个序
  179. for (String key : keyArray) {
  180. List<DictModel> res = dicts.stream().filter(i -> key.equals(i.getValue())).collect(Collectors.toList());
  181. if (res.size() > 0) {
  182. texts.add(res.get(0).getText());
  183. } else if (!delNotExist) {
  184. texts.add(key);
  185. }
  186. }
  187. // update-end--author:sunjianlei--date:20210514--for:新增delNotExist参数,设为false不删除数据库里不存在的key ----
  188. return texts;
  189. }
  190. /**
  191. * 根据字典类型id删除关联表中其对应的数据
  192. */
  193. @Override
  194. public boolean deleteByDictId(SysDict sysDict) {
  195. sysDict.setDelFlag(CommonConstant.DEL_FLAG_1);
  196. return this.updateById(sysDict);
  197. }
  198. @Override
  199. @Transactional
  200. public Integer saveMain(SysDict sysDict, List<SysDictItem> sysDictItemList) {
  201. int insert=0;
  202. try{
  203. insert = sysDictMapper.insert(sysDict);
  204. if (sysDictItemList != null) {
  205. for (SysDictItem entity : sysDictItemList) {
  206. entity.setDictId(sysDict.getId());
  207. entity.setStatus(1);
  208. sysDictItemMapper.insert(entity);
  209. }
  210. }
  211. }catch(Exception e){
  212. return insert;
  213. }
  214. return insert;
  215. }
  216. @Override
  217. public List<DictModel> queryAllDepartBackDictModel() {
  218. return baseMapper.queryAllDepartBackDictModel();
  219. }
  220. @Override
  221. public List<DictModel> queryAllUserBackDictModel() {
  222. return baseMapper.queryAllUserBackDictModel();
  223. }
  224. @Override
  225. public List<DictModel> queryTableDictItems(String table, String text, String code, String keyword) {
  226. return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%");
  227. }
  228. @Override
  229. public List<DictModel> queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageSize) {
  230. Page<DictModel> page = new Page<DictModel>(1, pageSize);
  231. page.setSearchCount(false);
  232. String filterSql = getFilterSql(text, code, condition, keyword);
  233. IPage<DictModel> pageList = baseMapper.queryTableDictWithFilter(page, table, text, code, filterSql);
  234. return pageList.getRecords();
  235. }
  236. /**
  237. * 获取条件语句
  238. * @param text
  239. * @param code
  240. * @param condition
  241. * @param keyword
  242. * @return
  243. */
  244. private String getFilterSql(String text, String code, String condition, String keyword){
  245. String keywordSql = null, filterSql = "", sql_where = " where ";
  246. if(oConvertUtils.isNotEmpty(keyword)){
  247. // 判断是否是多选
  248. if (keyword.contains(",")) {
  249. String inKeywords = "\"" + keyword.replaceAll(",", "\",\"") + "\"";
  250. keywordSql = "(" + text + " in (" + inKeywords + ") or " + code + " in (" + inKeywords + "))";
  251. } else {
  252. keywordSql = "("+text + " like '%"+keyword+"%' or "+ code + " like '%"+keyword+"%')";
  253. }
  254. }
  255. if(oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)){
  256. filterSql+= sql_where + condition + " and " + keywordSql;
  257. }else if(oConvertUtils.isNotEmpty(condition)){
  258. filterSql+= sql_where + condition;
  259. }else if(oConvertUtils.isNotEmpty(keywordSql)){
  260. filterSql+= sql_where + keywordSql;
  261. }
  262. return filterSql;
  263. }
  264. @Override
  265. public List<DictModel> queryAllTableDictItems(String table, String text, String code, String condition, String keyword) {
  266. String filterSql = getFilterSql(text, code, condition, keyword);
  267. List<DictModel> ls = baseMapper.queryAllTableDictItems(table, text, code, filterSql);
  268. return ls;
  269. }
  270. @Override
  271. public List<TreeSelectModel> queryTreeList(Map<String, String> query,String table, String text, String code, String pidField,String pid,String hasChildField) {
  272. return baseMapper.queryTreeList(query,table, text, code, pidField, pid,hasChildField);
  273. }
  274. @Override
  275. public void deleteOneDictPhysically(String id) {
  276. this.baseMapper.deleteOneById(id);
  277. this.sysDictItemMapper.delete(new LambdaQueryWrapper<SysDictItem>().eq(SysDictItem::getDictId,id));
  278. }
  279. @Override
  280. public void updateDictDelFlag(int delFlag, String id) {
  281. baseMapper.updateDictDelFlag(delFlag,id);
  282. }
  283. @Override
  284. public List<SysDict> queryDeleteList() {
  285. return baseMapper.queryDeleteList();
  286. }
  287. @Override
  288. public List<DictModel> queryDictTablePageList(DictQuery query, int pageSize, int pageNo) {
  289. Page page = new Page(pageNo,pageSize,false);
  290. Page<DictModel> pageList = baseMapper.queryDictTablePageList(page, query);
  291. return pageList.getRecords();
  292. }
  293. @Override
  294. public List<DictModel> getDictItems(String dictCode) {
  295. List<DictModel> ls;
  296. if (dictCode.contains(",")) {
  297. //关联表字典(举例:sys_user,realname,id)
  298. String[] params = dictCode.split(",");
  299. if (params.length < 3) {
  300. // 字典Code格式不正确
  301. return null;
  302. }
  303. //SQL注入校验(只限制非法串改数据库)
  304. final String[] sqlInjCheck = {params[0], params[1], params[2]};
  305. SqlInjectionUtil.filterContent(sqlInjCheck);
  306. if (params.length == 4) {
  307. // SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用)
  308. SqlInjectionUtil.specialFilterContent(params[3]);
  309. ls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]);
  310. } else if (params.length == 3) {
  311. ls = this.queryTableDictItemsByCode(params[0], params[1], params[2]);
  312. } else {
  313. // 字典Code格式不正确
  314. return null;
  315. }
  316. } else {
  317. //字典表
  318. ls = this.queryDictItemsByCode(dictCode);
  319. }
  320. return ls;
  321. }
  322. @Override
  323. public List<DictModel> loadDict(String dictCode, String keyword, Integer pageSize) {
  324. if (dictCode.contains(",")) {
  325. //update-begin-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件
  326. String[] params = dictCode.split(",");
  327. String condition = null;
  328. if (params.length != 3 && params.length != 4) {
  329. // 字典Code格式不正确
  330. return null;
  331. } else if (params.length == 4) {
  332. condition = params[3];
  333. }
  334. List<DictModel> ls;
  335. if (pageSize != null) {
  336. ls = this.queryLittleTableDictItems(params[0], params[1], params[2], condition, keyword, pageSize);
  337. } else {
  338. ls = this.queryAllTableDictItems(params[0], params[1], params[2], condition, keyword);
  339. }
  340. //update-end-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件
  341. return ls;
  342. } else {
  343. // 字典Code格式不正确
  344. return null;
  345. }
  346. }
  347. }