省市区三级联动选择组件后端实现

54 篇文章 5 订阅

一 数据表结构

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"));
    }
}

五 测试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值