一 数据表结构
CREATE TABLE `administrative_division` (
`ID` varchar(32) NOT NULL DEFAULT '' COMMENT '主键ID',
`PROVINCE` varchar(255) DEFAULT NULL COMMENT '省',
`CITY` varchar(255) DEFAULT NULL COMMENT '市',
`DISTRICT` varchar(255) DEFAULT NULL COMMENT '区/县',
`CODE` varchar(255) DEFAULT NULL COMMENT '行政代码',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二 控制器
package com.project.controller.oms;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.project.common.annotation.SysLog;
import com.project.common.util.RestResponse;
import com.project.domain.AdministrativeDivision;
import com.project.domain.vo.AddressTree;
import com.project.service.AdministrativeDivisionService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Controller
*
* @author 程秋明
* @date 2023-02-14 11:07:29
*/
@RestController
@RequestMapping("/base/division")
@Slf4j
public class AdministrativeDivisionController extends AbstractController {
@Autowired
private AdministrativeDivisionService administrativeDivisionService;
/**
* 查看所有列表
*
* @param params 查询参数
* @return RestResponse
*/
@RequestMapping("/queryAll")
@RequiresPermissions("administrative:division:list")
public RestResponse queryAll(@RequestParam Map<String, Object> params) {
List<AdministrativeDivision> list = administrativeDivisionService.queryAll(params);
return RestResponse.success().put("list", list);
}
/**
* 分页查询
*
* @param params 查询参数
* @return RestResponse
*/
@GetMapping("/list")
@RequiresPermissions("administrative:division:list")
public RestResponse list(@RequestParam Map<String, Object> params) {
Page page = administrativeDivisionService.queryPage(params);
return RestResponse.success().put("page", page);
}
/**
* 根据主键查询详情
*
* @param id 主键
* @return RestResponse
*/
@RequestMapping("/info/{id}")
@RequiresPermissions("administrative:division:info")
public RestResponse info(@PathVariable("id") String id) {
AdministrativeDivision administrativeDivision = administrativeDivisionService.getById(id);
return RestResponse.success().put("division", administrativeDivision);
}
/**
* 新增
*
* @param administrativeDivision administrativeDivision
* @return RestResponse
*/
@SysLog("新增")
@RequestMapping("/save")
@RequiresPermissions("administrative:division:save")
public RestResponse save(@RequestBody AdministrativeDivision administrativeDivision) {
administrativeDivisionService.add(administrativeDivision);
return RestResponse.success();
}
/**
* 修改
*
* @param administrativeDivision administrativeDivision
* @return RestResponse
*/
@SysLog("修改")
@RequestMapping("/update")
@RequiresPermissions("administrative:division:update")
public RestResponse update(@RequestBody AdministrativeDivision administrativeDivision) {
administrativeDivisionService.update(administrativeDivision);
return RestResponse.success();
}
/**
* 根据主键删除
*
* @param ids ids
* @return RestResponse
*/
@SysLog("删除")
@RequestMapping("/delete")
@RequiresPermissions("administrative:division:delete")
public RestResponse delete(@RequestBody String[] ids) {
administrativeDivisionService.deleteBatch(ids);
return RestResponse.success();
}
/**
* 获取省市区树形结构
*
* @return JSONObject
*/
@RequestMapping(value = "/pcd", method = RequestMethod.GET)
@ResponseBody
public RestResponse findList() {
list = administrativeDivisionService.dataAssembly();
return RestResponse.success().put("options", list);
}
}
三 接口
package com.project.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.project.domain.AdministrativeDivision;
import com.project.domain.vo.AddressTree;
import java.util.List;
import java.util.Map;
/**
* Service接口
*
* @author 程秋明
* @date 2023-02-14 11:07:29
*/
public interface AdministrativeDivisionService extends IService<AdministrativeDivision> {
/**
* 查询所有列表
*
* @param params 查询参数
* @return List
*/
List<AdministrativeDivision> queryAll(Map<String, Object> params);
/**
* 分页查询
*
* @param params 查询参数
* @return Page
*/
Page queryPage(Map<String, Object> params);
/**
* 新增
*
* @param administrativeDivision
* @return 新增结果
*/
boolean add(AdministrativeDivision administrativeDivision);
/**
* 根据主键更新
*
* @param administrativeDivision
* @return 更新结果
*/
boolean update(AdministrativeDivision administrativeDivision);
/**
* 根据主键删除
*
* @param id id
* @return 删除结果
*/
boolean delete(String id);
/**
* 根据主键批量删除
*
* @param ids ids
* @return 删除结果
*/
boolean deleteBatch(String[] ids);
/**
* 功能描述:省市区数据装配
*
* @author chengqiuming
* @date 2023/2/14
*
* @return 省市区数据数据
*/
List<AddressTree> dataAssembly();
/**
* 查询所有数据
*/
List<AdministrativeDivision> findAdministrativeDivisionAll();
}
四 实现
package com.project.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project.common.util.Query;
import com.project.dao.AdministrativeDivisionDao;
import com.project.domain.AccountInfo;
import com.project.domain.AdministrativeDivision;
import com.project.domain.vo.AddressTree;
import com.project.service.AccountInfoService;
import com.project.service.AdministrativeDivisionService;
import com.project.service.SysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* Service实现类
*
* @author 程秋明
* @date 2023-02-14 11:07:29
*/
@Service("administrativeDivisionService")
@Slf4j
public class AdministrativeDivisionServiceImpl extends ServiceImpl<AdministrativeDivisionDao, AdministrativeDivision> implements AdministrativeDivisionService {
@Override
public List<AdministrativeDivision> queryAll(Map<String, Object> params) {
return baseMapper.queryAll(params);
}
@Override
public Page queryPage(Map<String, Object> params) {
// 排序
params.put("sidx", "T.id");
params.put("asc", false);
Page<AdministrativeDivision> page = new Query<AdministrativeDivision>(params).getPage();
return page.setRecords(baseMapper.selectAdministrativeDivisionPage(page, params));
}
@Override
public boolean add(AdministrativeDivision administrativeDivision) {
return this.save(administrativeDivision);
}
@Override
public boolean update(AdministrativeDivision administrativeDivision) {
return this.updateById(administrativeDivision);
}
@Override
public boolean delete(String id) {
return this.removeById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deleteBatch(String[] ids) {
return this.removeByIds(Arrays.asList(ids));
}
@Override
public boolean getRegionalControlFlag(String accountId) {
try {
AccountInfo accountInfo = accountInfoService.getById(accountId);
Integer regionalControl = accountInfo.getRegionalControl();
String regionalControlOfMedicalRepresentatives = sysConfigService.getValue("REGIONAL_CONTROL_OF_MEDICAL_REPRESENTATIVES", "1");
Integer controlSwitch = 0;
if (regionalControlOfMedicalRepresentatives != null) {
controlSwitch = Integer.parseInt(regionalControlOfMedicalRepresentatives);
}
return regionalControl == 1 && controlSwitch == 1;
} catch (NumberFormatException e) {
return false;
}
}
@Override
public List<AddressTree> dataAssembly() {
List<AdministrativeDivision> list = this.findAdministrativeDivisionAll();
List<AddressTree> treeList = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
list.forEach(v -> {
String province = v.getProvince();
String provinceCode = v.getCode().substring(0, 2);
Integer provinceIndex = map.get(province);
// provinceIndex 不是 null,说明已在list里
if (provinceIndex == null) {
AddressTree tree = new AddressTree(province, provinceCode);
treeList.add(tree);
provinceIndex = treeList.size() - 1;
map.put(province, provinceIndex);
}
String city = v.getCity();
String cityCode = v.getCode().substring(0, 4);
String cityKey = province + "_" + city;
Integer cityIndex = map.get(cityKey);
if (cityIndex == null) {
List<AddressTree> children = treeList.get(provinceIndex).getChildren();
AddressTree tree = new AddressTree(city, cityCode);
children.add(tree);
cityIndex = children.size() - 1;
map.put(cityKey, cityIndex);
}
String district = v.getDistrict();
String zoneKey = v.getCode();
Integer zoneIndex = map.get(zoneKey);
if (zoneIndex == null) {
List<AddressTree> children = treeList.get(provinceIndex).getChildren().get(cityIndex).getChildren();
AddressTree tree = new AddressTree(district, zoneKey);
children.add(tree);
zoneIndex = children.size() - 1;
map.put(zoneKey, zoneIndex);
}
});
log.info(JSONArray.toJSONString(treeList));
return treeList;
}
/**
* 功能描述:查询省市区表所有的数据,并按照 code 升序
*
* @author chengqiuming
* @date 2023/2/15
*/
public List<AdministrativeDivision> findAdministrativeDivisionAll() {
return baseMapper.selectList(Wrappers.<AdministrativeDivision>query().orderByAsc("code"));
}
}
五 测试