瀏覽代碼

feat: 实现地区相关接口

weijianghai 2 年之前
父節點
當前提交
a7c4c82eb1

+ 43 - 0
src/main/java/com/nokia/controller/web/WebAreaController.java

@@ -0,0 +1,43 @@
+package com.nokia.controller.web;
+
+import com.nokia.common.R;
+import com.nokia.service.AreaService;
+import com.nokia.vo.TreeAreaVo;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpSession;
+
+@Tag(name = "地区")
+@RestController
+@RequestMapping("api/web/area")
+public class WebAreaController {
+    private final AreaService areaService;
+
+    public WebAreaController(AreaService areaService) {
+        this.areaService = areaService;
+    }
+
+    /**
+     * 查询省市区树形接口(用户列表地区选择框)
+     *
+     */
+    @Operation(summary = "查询省市区树形接口(用户列表地区选择框)")
+    @PostMapping("tree")
+    public R<TreeAreaVo> tree(HttpSession session) {
+        return areaService.tree(session);
+    }
+
+    /**
+     * 查询省和地市树形接口(添加修改用户、操作日志地区选择框)
+     *
+     */
+    @Operation(summary = "查询省和地市树形接口(添加修改用户、操作日志地区选择框)")
+    @PostMapping("treeProvinceCity")
+    public R<TreeAreaVo> treeProvinceCity(HttpSession session) {
+        return areaService.treeProvinceCity(session);
+    }
+}

+ 4 - 4
src/main/java/com/nokia/dao/AreaDao.java

@@ -1,14 +1,14 @@
 package com.nokia.dao;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nokia.pojo.Area;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
 
-import com.nokia.pojo.Area;
+import java.util.List;
 
 @Mapper
-public interface AreaDao {
+public interface AreaDao extends BaseMapper<Area> {
 
     @Select("select * from sqmdb_rpt.acl_area order by type_code, area_id")
     List<Area> getAll();

+ 6 - 2
src/main/java/com/nokia/pojo/Area.java

@@ -1,15 +1,19 @@
 package com.nokia.pojo;
 
-import java.io.Serializable;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.io.Serializable;
+
 /*
  * 行政区划
  */
 @Data
+@TableName("sqmdb_rpt.acl_area")
 public class Area implements Serializable {
     // 每个区域会有1个唯一Id
+    @TableId
     private Integer areaId;
     // 行政区中文名
     private String areaName;

+ 121 - 0
src/main/java/com/nokia/service/AreaService.java

@@ -0,0 +1,121 @@
+package com.nokia.service;
+
+import com.nokia.common.R;
+import com.nokia.dao.AreaDao;
+import com.nokia.pojo.Area;
+import com.nokia.pojo.UserRoleCity;
+import com.nokia.vo.TreeAreaVo;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class AreaService {
+    private final AreaDao areaDao;
+    private final UserService userService;
+
+    public AreaService(AreaDao areaDao, UserService userService) {
+        this.areaDao = areaDao;
+        this.userService = userService;
+    }
+
+    public R<TreeAreaVo> tree(HttpSession session) {
+        UserRoleCity role = userService.getUserRoleCity(session);
+        Integer cityId = role.getCityId();
+        // 河北省用户返回省市区三级
+        if (cityId.equals(-1)) {
+            List<TreeAreaVo> secondVoList = new ArrayList<>();
+            TreeAreaVo vo = new TreeAreaVo();
+            vo.setLabel("河北省");
+            vo.setValue(-1);
+            vo.setChildren(secondVoList);
+            // 查询所有地区
+            List<Area> areas = areaDao.getAll();
+            Map<Integer, List<Area>> parentMap = getParentMap(areas);
+            // 地市列表
+            List<Area> secondList = parentMap.get(-1);
+            for (Area tt : secondList) {
+                List<TreeAreaVo> thirdVoList = new ArrayList<>();
+                TreeAreaVo secondVo = new TreeAreaVo();
+                secondVo.setLabel(tt.getAreaName());
+                secondVo.setValue(tt.getAreaId());
+                secondVo.setChildren(thirdVoList);
+                secondVoList.add(secondVo);
+                // 区县列表
+                List<Area> thirdList = parentMap.get(tt.getAreaId());
+                for (Area ttt : thirdList) {
+                    TreeAreaVo thirdVo = new TreeAreaVo();
+                    thirdVo.setLabel(ttt.getAreaName());
+                    thirdVo.setValue(ttt.getAreaId());
+                    thirdVoList.add(thirdVo);
+                }
+
+            }
+            return R.ok(vo);
+        }
+        // 地市用户返回市区两级
+        Area area = areaDao.selectById(cityId);
+        List<TreeAreaVo> thirdVoList = new ArrayList<>();
+        TreeAreaVo vo = new TreeAreaVo();
+        vo.setLabel(area.getAreaName());
+        vo.setValue(area.getAreaId());
+        vo.setChildren(thirdVoList);
+        // 查询区县列表
+        List<Area> areas = areaDao.getByParentId(cityId);
+        for (Area t : areas) {
+            TreeAreaVo thirdVo = new TreeAreaVo();
+            thirdVo.setLabel(t.getAreaName());
+            thirdVo.setValue(t.getAreaId());
+            thirdVoList.add(thirdVo);
+        }
+        return R.ok(vo);
+    }
+
+    public R<TreeAreaVo> treeProvinceCity(HttpSession session) {
+        UserRoleCity role = userService.getUserRoleCity(session);
+        Integer cityId = role.getCityId();
+        // 河北省用户返回省市两级
+        if (cityId.equals(-1)) {
+            List<TreeAreaVo> secondVoList = new ArrayList<>();
+            TreeAreaVo vo = new TreeAreaVo();
+            vo.setLabel("河北省");
+            vo.setValue(-1);
+            vo.setChildren(secondVoList);
+            // 查询地市列表
+            List<Area> areas = areaDao.getByParentId(-1);
+            for (Area t : areas) {
+                TreeAreaVo secondVo = new TreeAreaVo();
+                secondVo.setLabel(t.getAreaName());
+                secondVo.setValue(t.getAreaId());
+                secondVoList.add(secondVo);
+            }
+            return R.ok(vo);
+        }
+        // 地市用户返回地市一级
+        Area area = areaDao.selectById(cityId);
+        TreeAreaVo vo = new TreeAreaVo();
+        vo.setLabel(area.getAreaName());
+        vo.setValue(area.getAreaId());
+        return R.ok(vo);
+    }
+
+    /**
+     * 得到地区父地图
+     *
+     * @param areas 区域
+     * @return {@link Map}<{@link Integer}, {@link List}<{@link Area}>>
+     */
+    private Map<Integer, List<Area>> getParentMap(List<Area> areas) {
+        Map<Integer, List<Area>> parentMap = new HashMap<>();
+        for (Area t : areas)
+        {
+            parentMap.putIfAbsent(t.getParentId(), new ArrayList<>());
+            parentMap.get(t.getParentId()).add(t);
+        }
+        return parentMap;
+    }
+}

+ 20 - 0
src/main/java/com/nokia/vo/TreeAreaVo.java

@@ -0,0 +1,20 @@
+package com.nokia.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class TreeAreaVo {
+    @Schema(description = "地区名称", example = "河北省")
+    private String label;
+    @Schema(description = "地区id", example = "-1")
+    private Integer value;
+    @Schema(description = "子地区列表")
+    private List<TreeAreaVo> children;
+}

+ 96 - 2
src/test/java/com/nokia/OtherTest.java

@@ -1,20 +1,114 @@
 package com.nokia;
 
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.nokia.dao.RoleDao;
+import com.nokia.vo.TokenFlagVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
 
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+@ActiveProfiles("test")
 @SpringBootTest
-public class OtherTest {
+class OtherTest {
     
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private RoleDao roleDao;
 
     @Test
-    void test() {
+    void testSplitAddress() {
+        String inputPath = "test/org1.csv";
+        String outputFilePath = "test/org2.csv";
+        try (CSVParser parser = CSVFormat.DEFAULT.builder().build()
+                .parse(new InputStreamReader(Files.newInputStream(Paths.get(inputPath)), StandardCharsets.UTF_8));
+             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get(outputFilePath)),
+                     StandardCharsets.UTF_8);
+             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
+            printer.printRecord("org_id", "org_name", "province", "city", "district");
+            for (CSVRecord t : parser) {
+                String orgId = t.get(0);
+                String address = t.get(1);
+                log.info("{}: {}", t.getRecordNumber(), address);
+                Map<String, String> map = splitAddress(address);
+                printer.printRecord(orgId, address, "河北省", map.get("city"), map.get("county"));
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+    public Map<String, String> splitAddress(String s) {
+        Pattern pattern = Pattern.compile("(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县|.*?新区)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)");
+//        Pattern pattern = Pattern.compile("(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)");
+        Matcher m = pattern.matcher(s);
+        Map<String, String> map = new LinkedHashMap<>();
+        while (m.find()) {
+//            String province = m.group("province");
+//            map.put("province", province == null ? "" : province.trim());
+            String city = m.group("city");
+            map.put("city", city == null ? "" : city.trim());
+            String county = m.group("county");
+            map.put("county", county == null ? "" : county.trim());
+            String town = m.group("town");
+            map.put("town", town == null ? "" : town.trim());
+            String village = m.group("village");
+            map.put("village", village == null ? "" : village.trim());
+        }
+        return map;
+    }
+
+    @Test
+    void testRedis() {
         Object object = redisTemplate.opsForValue().get("abc");
         System.out.println(object);
         System.out.println("done!");
     }
+
+    @Test
+    void testWoyunwei() {
+        String token = "a";
+//        String token = "0A84CC79B2524D9AB032383444E31DC6";
+        String woyunweiUrl = "http://192.168.70.130:13000/PAOOS/aaaa/userservice/getUserInfo.do?method=findUserBySessionID&sessionID=";
+        String url = woyunweiUrl + token;
+        RestTemplate restTemplate = new RestTemplate();
+        String r = restTemplate.postForObject(url, new HashMap<>(), String.class);
+        log.info("沃运维获取用户信息响应: {}", r);
+        if (!StringUtils.hasText(r)) {
+            TokenFlagVo vo = new TokenFlagVo();
+            vo.setIsValid(1);
+            return;
+        }
+        JsonObject jsonObject = JsonParser.parseString(r).getAsJsonObject();
+        String userName = jsonObject.get("userName").getAsString();
+        TokenFlagVo vo = new TokenFlagVo();
+        vo.setIsValid(StringUtils.hasText(userName) ? 0 : 1);
+        vo.setLoginName(userName);
+        log.info("vo: {}", vo);
+    }
 }