柯桥增值式服务
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

410 行
18KB

  1. package com.ningdatech.kqapi.zzsfw.manage;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.date.StopWatch;
  5. import cn.hutool.core.lang.Assert;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.ningdatech.kqapi.common.enumeration.CommonEnum;
  8. import com.ningdatech.kqapi.common.helper.MatterCacheHelper;
  9. import com.ningdatech.kqapi.zzsfw.constants.ZzsfwMenuConstant;
  10. import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO;
  11. import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO;
  12. import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMattersDeduplicate;
  13. import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu;
  14. import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO;
  15. import com.ningdatech.kqapi.zzsfw.entity.vo.MattersVO;
  16. import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO;
  17. import com.ningdatech.kqapi.zzsfw.enumeration.ItemTypeEnum;
  18. import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMatterDeduplicateService;
  19. import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.apache.poi.ss.usermodel.CellType;
  24. import org.apache.poi.ss.usermodel.Row;
  25. import org.apache.poi.ss.usermodel.Sheet;
  26. import org.apache.poi.ss.usermodel.Workbook;
  27. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.stereotype.Component;
  30. import org.springframework.web.multipart.MultipartFile;
  31. import java.io.IOException;
  32. import java.io.InputStream;
  33. import java.sql.Connection;
  34. import java.sql.DriverManager;
  35. import java.sql.Statement;
  36. import java.text.DecimalFormat;
  37. import java.time.LocalDateTime;
  38. import java.util.*;
  39. import java.util.stream.Collectors;
  40. /**
  41. * @Classname MatterManage
  42. * @Description
  43. * @Date 2023/10/25 14:55
  44. * @Author PoffyZhang
  45. */
  46. @Component
  47. @Slf4j
  48. @RequiredArgsConstructor
  49. public class MatterManage {
  50. @Value("${spring.datasource.url}")
  51. public String url;
  52. @Value("${spring.datasource.username}")
  53. public String username;
  54. @Value("${spring.datasource.password}")
  55. public String password;
  56. private final INdKqZzsfwMenuService menuService;
  57. private final INdKqZzsfwMatterDeduplicateService matterDeduplicateService;
  58. public List<TreeVO> getMatters() {
  59. List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class)
  60. .orderByAsc(NdKqZzsfwMenu::getSort));
  61. if(CollUtil.isEmpty(matters)){
  62. return Collections.emptyList();
  63. }
  64. //如果是政府类型的 就隐藏 没有链接的
  65. List<NdKqZzsfwMenu> finalMatters = matters.stream().filter(m -> Objects.nonNull(m.getType()) &&
  66. (!m.getType().equals(ItemTypeEnum.GOV.getCode()) || Objects.nonNull(m.getWebapplyurl())))
  67. .collect(Collectors.toList());
  68. Set<String> zoneSet = new HashSet<>();
  69. List<TreeVO> res = finalMatters.stream().filter(m -> zoneSet.add(m.getZoneName())).map(m -> {
  70. TreeVO zone = new TreeVO();
  71. zone.setName(m.getZoneName());
  72. zone.setChilren(generateWindows(m, finalMatters));
  73. zone.setType(ZzsfwMenuConstant.MENU_TYPE_ZONE);
  74. return zone;
  75. }).collect(Collectors.toList());
  76. return res;
  77. }
  78. /**
  79. * 查询社区
  80. * @return
  81. */
  82. public List<TreeVO> getZones() {
  83. List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class)
  84. .orderByAsc(NdKqZzsfwMenu::getSort));
  85. if(CollUtil.isEmpty(matters)){
  86. return Collections.emptyList();
  87. }
  88. //如果是政府类型的 就隐藏 没有链接的
  89. List<NdKqZzsfwMenu> finalMatters = matters.stream().filter(m -> Objects.nonNull(m.getType()) &&
  90. (!m.getType().equals(ItemTypeEnum.GOV.getCode()) || Objects.nonNull(m.getWebapplyurl())))
  91. .collect(Collectors.toList());
  92. Set<String> zoneSet = new HashSet<>();
  93. List<TreeVO> res = finalMatters.stream().filter(m -> zoneSet.add(m.getZoneName())).map(m -> {
  94. TreeVO zone = new TreeVO();
  95. zone.setName(m.getZoneName());
  96. zone.setType(ZzsfwMenuConstant.MENU_TYPE_ZONE);
  97. return zone;
  98. }).collect(Collectors.toList());
  99. return res;
  100. }
  101. public List<TreeVO> getWindows(String zoneName) {
  102. List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class)
  103. .eq(StringUtils.isNotBlank(zoneName),NdKqZzsfwMenu::getZoneName,zoneName)
  104. .orderByAsc(NdKqZzsfwMenu::getSort));
  105. if(CollUtil.isEmpty(matters)){
  106. return Collections.emptyList();
  107. }
  108. //如果是政府类型的 就隐藏 没有链接的
  109. List<NdKqZzsfwMenu> finalMatters = matters.stream().filter(m -> Objects.nonNull(m.getType()) &&
  110. (!m.getType().equals(ItemTypeEnum.GOV.getCode()) || Objects.nonNull(m.getWebapplyurl())))
  111. .collect(Collectors.toList());
  112. Set<String> windowSet = new HashSet<>();
  113. return finalMatters.stream().filter(m -> windowSet.add(m.getWindow()))
  114. .map(m -> {
  115. TreeVO window = new TreeVO();
  116. window.setName(m.getWindow());
  117. window.setType(ZzsfwMenuConstant.MENU_TYPE_WINDOW);
  118. return window;
  119. }).collect(Collectors.toList());
  120. }
  121. public List<TreeVO> getDepartments(String zoneName,String windowName) {
  122. List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class)
  123. .eq(StringUtils.isNotBlank(windowName),NdKqZzsfwMenu::getWindow,windowName)
  124. .eq(StringUtils.isNotBlank(zoneName),NdKqZzsfwMenu::getZoneName,zoneName)
  125. .orderByAsc(NdKqZzsfwMenu::getSort));
  126. if(CollUtil.isEmpty(matters)){
  127. return Collections.emptyList();
  128. }
  129. List<NdKqZzsfwMenu> finalMatters = matters.stream().filter(m -> Objects.nonNull(m.getType()) &&
  130. (!m.getType().equals(ItemTypeEnum.GOV.getCode()) || Objects.nonNull(m.getWebapplyurl())))
  131. .collect(Collectors.toList());
  132. Set<String> departMentSet = new HashSet<>();
  133. return finalMatters.stream().filter(m -> departMentSet.add(m.getDepartment()))
  134. .map(m -> {
  135. TreeVO department = new TreeVO();
  136. department.setName(m.getDepartment());
  137. department.setType(ZzsfwMenuConstant.MENU_TYPE_DEPARTMENT);
  138. return department;
  139. }).collect(Collectors.toList());
  140. }
  141. public List<MattersVO> matterList(String zoneName, String windowName, String department, Integer type) {
  142. List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class)
  143. .eq(StringUtils.isNotBlank(windowName),NdKqZzsfwMenu::getWindow,windowName)
  144. .eq(StringUtils.isNotBlank(zoneName),NdKqZzsfwMenu::getZoneName,zoneName)
  145. .eq(StringUtils.isNotBlank(department),NdKqZzsfwMenu::getDepartment,department)
  146. .eq(Objects.nonNull(type),NdKqZzsfwMenu::getType,type)
  147. .orderByAsc(NdKqZzsfwMenu::getSort));
  148. if(CollUtil.isEmpty(matters)){
  149. return Collections.emptyList();
  150. }
  151. //如果是政府类型的 就隐藏 没有链接的
  152. List<NdKqZzsfwMenu> finalMatters = matters.stream().filter(m -> Objects.nonNull(m.getType()) &&
  153. (!m.getType().equals(ItemTypeEnum.GOV.getCode()) || Objects.nonNull(m.getWebapplyurl())))
  154. .collect(Collectors.toList());
  155. return finalMatters.stream()
  156. .map(m -> {
  157. MattersVO mattersVO = BeanUtil.copyProperties(m, MattersVO.class);
  158. mattersVO.setMatterName(m.getItemName());
  159. mattersVO.setId(m.getId());
  160. return mattersVO;
  161. })
  162. .collect(Collectors.toList());
  163. }
  164. public MattersVO matter(Long id) {
  165. NdKqZzsfwMenu matter = menuService.getById(id);
  166. if(Objects.isNull(matter)){
  167. return null;
  168. }
  169. MattersVO mattersVO = BeanUtil.copyProperties(matter, MattersVO.class);
  170. mattersVO.setMatterName(matter.getItemName());
  171. mattersVO.setId(matter.getId());
  172. return mattersVO;
  173. }
  174. private List<TreeVO> generateWindows(NdKqZzsfwMenu menu, List<NdKqZzsfwMenu> matters) {
  175. Set<String> windowSet = new HashSet<>();
  176. return matters.stream().filter(m -> StringUtils.isNotBlank(m.getZoneName()) && m.getZoneName().equals(menu.getZoneName())
  177. && windowSet.add(m.getWindow()))
  178. .map(m -> {
  179. TreeVO window = new TreeVO();
  180. window.setName(m.getWindow());
  181. window.setChilren(generateDepartment(m,matters));
  182. window.setType(ZzsfwMenuConstant.MENU_TYPE_WINDOW);
  183. return window;
  184. }).collect(Collectors.toList());
  185. }
  186. private List<TreeVO> generateDepartment(NdKqZzsfwMenu menu, List<NdKqZzsfwMenu> matters) {
  187. Set<String> departmentSet = new HashSet<>();
  188. return matters.stream().filter( m -> StringUtils.isNotBlank(m.getWindow()) && m.getWindow().equals(menu.getWindow()) &&
  189. m.getZoneName().equals(menu.getZoneName()) && departmentSet.add(m.getDepartment()))
  190. .map(m -> {
  191. TreeVO department = new TreeVO();
  192. department.setName(m.getDepartment());
  193. department.setChilren(generateItemType(m,matters));
  194. department.setType(ZzsfwMenuConstant.MENU_TYPE_DEPARTMENT);
  195. return department;
  196. }).collect(Collectors.toList());
  197. }
  198. private List<TreeVO> generateItemType(NdKqZzsfwMenu menu, List<NdKqZzsfwMenu> matters) {
  199. Set<Integer> typeSet = new HashSet<>();
  200. return matters.stream().filter(m -> StringUtils.isNotBlank(m.getWindow()) && m.getWindow().equals(menu.getWindow()) &&
  201. m.getZoneName().equals(menu.getZoneName()) && Objects.nonNull(m.getType()) && typeSet.add(m.getType()))
  202. .map(m -> {
  203. TreeVO menuType = new TreeVO();
  204. ItemTypeEnum itemTypeEnum = ItemTypeEnum.match(m.getType());
  205. if(Objects.nonNull(itemTypeEnum)){
  206. menuType.setName(itemTypeEnum.getDesc());
  207. menuType.setChilren(generateMatters(m,matters));
  208. menuType.setType(ZzsfwMenuConstant.MENU_ITEM_TYPE);
  209. return menuType;
  210. }
  211. return null;
  212. })
  213. .filter(Objects::nonNull)
  214. .collect(Collectors.toList());
  215. }
  216. private List<TreeVO> generateMatters(NdKqZzsfwMenu menu, List<NdKqZzsfwMenu> matters) {
  217. return matters.stream().filter(m -> Objects.nonNull(m.getType()) && m.getType().equals(menu.getType()) &&
  218. (!m.getType().equals(ItemTypeEnum.GOV.getCode()) || Objects.nonNull(m.getHasUrl()) && m.getHasUrl() == 1) &&
  219. StringUtils.isNotBlank(m.getDepartment()) &&
  220. m.getDepartment().equals(menu.getDepartment()) && m.getWindow().equals(menu.getWindow()) &&
  221. m.getZoneName().equals(menu.getZoneName()))
  222. .map(m -> {
  223. TreeVO matter = new TreeVO();
  224. matter.setName(m.getItemName());
  225. matter.setUrl(m.getWebapplyurl());
  226. matter.setId(m.getItemRowid());
  227. matter.setSort(m.getSort());
  228. matter.setType(ZzsfwMenuConstant.MENU_TYPE_MATTER);
  229. matter.setServiceContent(m.getServiceContent());
  230. matter.setServiceProcess(m.getServiceProcess());
  231. matter.setTelephone(m.getTelephone());
  232. return matter;
  233. }).collect(Collectors.toList());
  234. }
  235. public List<MatterTopVO> topTen() {
  236. List<NdKqZzsfwMattersDeduplicate> topTen = matterDeduplicateService.list(Wrappers.lambdaQuery(NdKqZzsfwMattersDeduplicate.class)
  237. .orderByDesc(NdKqZzsfwMattersDeduplicate::getCountNum)
  238. .last("limit 10"));
  239. return topTen.stream().map(m -> {
  240. MatterTopVO vo = new MatterTopVO();
  241. vo.setMatterName(m.getQlName());
  242. vo.setWebapplyurl(m.getWebapplyurl());
  243. vo.setCount(m.getCountNum());
  244. return vo;
  245. }).collect(Collectors.toList());
  246. }
  247. public String save(NdKqZzsfwMenuDTO dto) {
  248. if(Objects.isNull(dto)){
  249. return "保存失败 传入为空";
  250. }
  251. NdKqZzsfwMenu entity = BeanUtil.copyProperties(dto,NdKqZzsfwMenu.class);
  252. if(menuService.save(entity)){
  253. return "保存成功 :" + entity;
  254. }else{
  255. return "保存失败";
  256. }
  257. }
  258. public String saveDup(NdKqZzsfwMattersDeduplicateDTO dto) {
  259. if(Objects.isNull(dto)){
  260. return "保存失败 传入为空";
  261. }
  262. NdKqZzsfwMattersDeduplicate entity = BeanUtil.copyProperties(dto,NdKqZzsfwMattersDeduplicate.class);
  263. if(matterDeduplicateService.save(entity)){
  264. return "保存成功 :" + entity;
  265. }else{
  266. return "保存失败";
  267. }
  268. }
  269. public String removeAll() {
  270. menuService.remove(Wrappers.lambdaQuery(NdKqZzsfwMenu.class));
  271. return "删除成功";
  272. }
  273. public String removeAllDup() {
  274. matterDeduplicateService.remove(Wrappers.lambdaQuery(NdKqZzsfwMattersDeduplicate.class));
  275. return "删除成功";
  276. }
  277. public String uploadMenu(MultipartFile file) throws IOException {
  278. InputStream inputStream = file.getInputStream();
  279. Workbook workbook = new XSSFWorkbook(inputStream);
  280. Assert.notNull(workbook);
  281. Row row;
  282. //获取最大行数
  283. Sheet sheet = workbook.getSheetAt(0);
  284. int rownum = sheet.getPhysicalNumberOfRows();
  285. //获取最大列数
  286. Integer num = 1;
  287. for (int i = 2; i < rownum; i++) {
  288. row = sheet.getRow(i);
  289. if (row.getZeroHeight()) {
  290. continue;
  291. }
  292. System.out.println("记数:" + (num++));
  293. String zoneName = row.getCell(0).getStringCellValue();
  294. System.out.println(zoneName);
  295. DecimalFormat decimalFormat = new DecimalFormat("#");
  296. Integer sort = Integer.valueOf(decimalFormat.format(row.getCell(1).getNumericCellValue()));
  297. System.out.println(sort);
  298. String windowName = row.getCell(2).getStringCellValue();
  299. System.out.println(windowName);
  300. String department = row.getCell(3).getStringCellValue();
  301. System.out.println(department);
  302. String itemName = row.getCell(4).getStringCellValue();
  303. System.out.println(itemName);
  304. String serviceContent = row.getCell(5).getStringCellValue();
  305. System.out.println(serviceContent);
  306. String serviceProcess = row.getCell(6).getStringCellValue();
  307. System.out.println(serviceProcess);
  308. String telephone = "";
  309. CellType cellType = row.getCell(7).getCellType();
  310. if (cellType.equals(CellType.STRING)) {
  311. telephone = row.getCell(7).getStringCellValue();
  312. System.out.println(telephone);
  313. } else if (cellType.equals(CellType.NUMERIC)) {
  314. DecimalFormat decimalFormat2 = new DecimalFormat("#.#######");
  315. telephone = decimalFormat2.format(row.getCell(7).getNumericCellValue());
  316. System.out.println(telephone);
  317. }
  318. NdKqZzsfwMenu menu = new NdKqZzsfwMenu();
  319. menu.setItemName(itemName);
  320. menu.setZoneName(zoneName);
  321. menu.setWindow(windowName);
  322. menu.setDepartment(department);
  323. menu.setServiceContent(serviceContent);
  324. menu.setServiceProcess(serviceProcess);
  325. menu.setTelephone(telephone);
  326. menu.setType(ItemTypeEnum.ADDED.getCode());
  327. menu.setCreateOn(LocalDateTime.now());
  328. menu.setSort(sort);
  329. menuService.save(menu);
  330. }
  331. return "upload success!";
  332. }
  333. public String ddl(String sql) {
  334. try {
  335. // 1. 加载数据库驱动
  336. Class.forName("com.mysql.cj.jdbc.Driver");
  337. // 2. 建立数据库连接
  338. Connection connection = DriverManager.getConnection(url, username, password);
  339. // 3. 创建Statement对象
  340. Statement statement = connection.createStatement();
  341. // 4. 编写并执行DDL语句(创建一个名为`users`的表)
  342. statement.executeUpdate(sql);
  343. System.out.println(" Table updated successfully.");
  344. // 5. 关闭资源
  345. statement.close();
  346. connection.close();
  347. } catch (Exception e) {
  348. e.printStackTrace();
  349. }
  350. return "success!";
  351. }
  352. /**
  353. * 4-10 数据问题
  354. * @return
  355. */
  356. public String update4_10() {
  357. //1.窗口后缀不是服务的 都加个服务
  358. List<NdKqZzsfwMenu> list = menuService.list();
  359. for (NdKqZzsfwMenu menu : list) {
  360. if(StringUtils.isNotBlank(menu.getWindow()) && !menu.getWindow().endsWith("服务")){
  361. menu.setWindow(menu.getWindow() + "服务");
  362. menuService.updateById(menu);
  363. }
  364. }
  365. return "success!";
  366. }
  367. }