diff --git a/crm/src/main/java/com/kakarote/crm/controller/CrmGsdjxxController.java b/crm/src/main/java/com/kakarote/crm/controller/CrmGsdjxxController.java index d473ec0..15b7e17 100644 --- a/crm/src/main/java/com/kakarote/crm/controller/CrmGsdjxxController.java +++ b/crm/src/main/java/com/kakarote/crm/controller/CrmGsdjxxController.java @@ -39,8 +39,8 @@ public class CrmGsdjxxController { @PostMapping("/queryGsdjxxByDate/{date}") @ApiOperation("根据日期查询(默认是当天)") - public Result>> queryGsdjxxByDate(@PathVariable String date) { - BasePage> basePage = iCrmGsdjxxService.queryGsdjxxByDate(date); + public Result>> queryGsdjxxByDate(@RequestBody CrmQueryGsdjxxDTO crmQueryGsdjxxDTO) { + BasePage> basePage = iCrmGsdjxxService.queryGsdjxxByDate(crmQueryGsdjxxDTO); return R.ok(basePage); } } diff --git a/crm/src/main/java/com/kakarote/crm/controller/XzqhController.java b/crm/src/main/java/com/kakarote/crm/controller/XzqhController.java new file mode 100644 index 0000000..3830b17 --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/controller/XzqhController.java @@ -0,0 +1,99 @@ +package com.kakarote.crm.controller; + + +import com.kakarote.core.common.ParamAspect; +import com.kakarote.core.common.R; +import com.kakarote.core.common.Result; +import com.kakarote.crm.entity.PO.Xzqh; +import com.kakarote.crm.entity.VO.XzqhOptionVO; +import com.kakarote.crm.service.IXzqhService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 行政区划Controller + * + * @author natural + * @date 2023-08-21 + */ +@RestController +@RequestMapping("/crmXzqh") +public class XzqhController +{ + @Autowired + private IXzqhService xzqhService; + + /** + * 查询行政区划列表 + */ + @GetMapping("/list") + public Result> list(Xzqh xzqh) + { + List list = xzqhService.selectXzqhList(xzqh); + return R.ok(list); + } + + /** + * 查询行政区划列表 + */ + @GetMapping("/all") + @ParamAspect + public Result> all(Xzqh xzqh) + { + List list = xzqhService.selectXzqhList(xzqh); + return R.ok(list); + } + + + /** + * 获取嵌套结构的行政区划数据,用于前端多级选择组件 + * @return 嵌套结构的行政区划数据 + */ + @GetMapping("/treeOptions") + @ParamAspect + public Result> getTreeOptions() { + List options = xzqhService.buildXzqhTree(); + return R.ok(options); + } + + /** + * 导出行政区划列表 + */ +// @PostMapping("/export") +// public void export(HttpServletResponse response, Xzqh xzqh) +// { +// List list = xzqhService.selectXzqhList(xzqh); +// ExcelUtil util = new ExcelUtil(Xzqh.class); +// util.exportExcel(response, list, "行政区划数据"); +// } + + /** + * 获取行政区划详细信息 + */ + @GetMapping(value = "/{id}") + public Result getInfo(@PathVariable("id") String id) + { + return R.ok(xzqhService.selectXzqhById(id)); + } + + /** +// * 获取省行政区域 +// * @return +// */ +// @GetMapping("/getProvinceArea") +// public AjaxResult getProvinceArea(){ +// AjaxResult ajax = AjaxResult.success(); +// List provinceArea = xzqhService.getProvinceArea(); +// ajax.put("qyDm",provinceArea); +// return ajax; +// } +// @GetMapping("/syncXzqh") +// public AjaxResult syncXzqh(){ +// AjaxResult ajax = AjaxResult.success(); +// xzqhService.syncXzqhFromRpa(); +// return ajax; +// } +} diff --git a/crm/src/main/java/com/kakarote/crm/entity/PO/Xzqh.java b/crm/src/main/java/com/kakarote/crm/entity/PO/Xzqh.java new file mode 100644 index 0000000..cd854d0 --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/entity/PO/Xzqh.java @@ -0,0 +1,108 @@ +package com.kakarote.crm.entity.PO; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + + +/** + * 行政区划对象 xzqh + * + * @author natural + * @date 2023-08-21 + */ +@Data +@TableName(value = "xzqh") +public class Xzqh implements Serializable +{ + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** 行政区划字母代码 */ + @TableField("xzqhzm_dm") + private String xzqhzmDm; + + /** 行政区划名称 */ + @TableField("xzqhmc") + private String xzqhmc; + + /** 上级行政区划数字代码 */ + @TableField("sjxzqhsz_dm") + private String sjxzqhszDm; + + /** 行政区划级次(1省级 2市级 3区县) */ + private String xzqhjc; + + /** 有效标志 */ + @TableField("yxbz") + private String yxbz; + + /** 选用标志 */ + @TableField("xybz") + private String xybz; + + /** 行政区划罗马字母代码 */ + @TableField("xzqhlmzm_dm") + private String xzqhlmzmDm; + + /** 所属行政区名称||所属行政区 */ + @TableField("ssxzqmc") + private String ssxzqmc; + + /** 税务机关代码 */ + @TableField("swjg_dm") + private String swjgDm; + + /** 行政区划类型代码||行政区划类型代码 */ + @TableField("xzqhlx_dm") + private String xzqhlxDm; + + /** 行政区域代码 */ + @TableField("xzqh_dm") + private String xzqhDm; + + /** 有下级*/ + @TableField("yxj") + private String yxj; + + /** 总名称*/ + @TableField("xzqh_cj") + private String xzqhCj; + + /** + * 区划代码层级 + * */ + @TableField("dm_hierarchy") + private String dmHierarchy; + + /** + * 区划名称层级 + */ + @TableField("mc_hierarchy") + private String mcHierarchy; + + /** 创建者 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新者 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + +} diff --git a/crm/src/main/java/com/kakarote/crm/entity/VO/XzqhOptionVO.java b/crm/src/main/java/com/kakarote/crm/entity/VO/XzqhOptionVO.java new file mode 100644 index 0000000..907279a --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/entity/VO/XzqhOptionVO.java @@ -0,0 +1,46 @@ +package com.kakarote.crm.entity.VO; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 行政区划选项VO,用于前端多级选择组件 + * 提供符合前端组件要求的value-label-children嵌套结构 + */ +@Data +public class XzqhOptionVO { + /** + * 值,对应行政区划代码 + */ + private String value; + + /** + * 显示文本,对应行政区划名称 + */ + private String label; + + /** + * 子级行政区划列表,实现层级嵌套结构 + */ + private List children; + + /** + * 默认构造函数,初始化空的子级列表 + */ + public XzqhOptionVO() { + this.children = new ArrayList<>(); + } + + /** + * 带参构造函数,方便快速创建对象 + * @param value 行政区划代码 + * @param label 行政区划名称 + */ + public XzqhOptionVO(String value, String label) { + this.value = value; + this.label = label; + this.children = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/crm/src/main/java/com/kakarote/crm/mapper/XzqhMapper.java b/crm/src/main/java/com/kakarote/crm/mapper/XzqhMapper.java new file mode 100644 index 0000000..1aadde3 --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/mapper/XzqhMapper.java @@ -0,0 +1,37 @@ +package com.kakarote.crm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.kakarote.crm.entity.PO.Xzqh; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 行政区划Mapper接口 + * + * @author natural + * @date 2023-08-21 + */ +public interface XzqhMapper extends BaseMapper +{ + /** + * 查询行政区划列表 + * + * @param xzqh 行政区划 + * @return 行政区划集合 + */ + public List selectXzqhList(Xzqh xzqh); + + void clearTemp(); + + void updateXzqh(); + + void deleteDuplicate(); + + void insertSsbmFromTemp(); + + String getXzqhDm(String xzqhDm); + + String getXzqhName(String xzqhDm); + +} diff --git a/crm/src/main/java/com/kakarote/crm/mapper/xml/XzqhMapper.xml b/crm/src/main/java/com/kakarote/crm/mapper/xml/XzqhMapper.xml new file mode 100644 index 0000000..8036240 --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/mapper/xml/XzqhMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, + create_by, + create_time, + update_by, + update_time, + xzqhzm_dm, + xzqhmc, + sjxzqhsz_dm, + xzqhjc, + yxbz, + xybz, + xzqhlmzm_dm, + ssxzqmc, + swjg_dm, + xzqhlx_dm, + xzqh_dm, + yxj + from xzqh + + + + + + delete from sync_xzqh_temp + + + + insert into sync_xzqh_temp (id,sj_xzqh_dm,xzqh_dm,xzqh_mc,xzqh_jb,yxj,yxbz) + values + + (#{xzqh.id},#{xzqh.sjXzqhDm},#{xzqh.xzqhDm},#{xzqh.xzqhMc},#{xzqh.xzqhJb},#{xzqh.yxj},#{xzqh.yxbz}) + + + + + update xzqh qh ,sync_xzqh_temp temp + set qh.xzqh_dm = temp.xzqh_dm, + qh.xzqhmc = temp.xzqh_mc, + qh.sjxzqhsz_dm = temp.sj_xzqh_dm, + qh.xzqhjc = temp.xzqh_jb, + qh.yxj = temp.yxj, + qh.yxbz=temp.yxbz, + update_time=now() + where qh.id = temp.id + + + delete sync + from sync_xzqh_temp sync , xzqh qh + where qh.id = sync.id + + + insert into xzqh (id,sjxzqhsz_dm,xzqh_dm,xzqhmc,xzqhjc,yxj,yxbz,create_time) + select id, sj_xzqh_dm, xzqh_dm, xzqh_mc, xzqh_jb, yxj, yxbz,now() + from sync_xzqh_temp; + + + + + diff --git a/crm/src/main/java/com/kakarote/crm/service/ICrmGsdjxxService.java b/crm/src/main/java/com/kakarote/crm/service/ICrmGsdjxxService.java index 35a9211..37eada5 100644 --- a/crm/src/main/java/com/kakarote/crm/service/ICrmGsdjxxService.java +++ b/crm/src/main/java/com/kakarote/crm/service/ICrmGsdjxxService.java @@ -27,5 +27,5 @@ public interface ICrmGsdjxxService extends BaseService { /** * 根据日期查询(默认是当天) */ - BasePage> queryGsdjxxByDate(String date); + BasePage> queryGsdjxxByDate(CrmQueryGsdjxxDTO crmQueryGsdjxxDTO); } diff --git a/crm/src/main/java/com/kakarote/crm/service/IXzqhService.java b/crm/src/main/java/com/kakarote/crm/service/IXzqhService.java new file mode 100644 index 0000000..ab4701f --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/service/IXzqhService.java @@ -0,0 +1,104 @@ +package com.kakarote.crm.service; + + +import com.kakarote.crm.entity.PO.Xzqh; +import com.kakarote.crm.entity.VO.XzqhOptionVO; + +import java.util.List; + +/** + * 行政区划Service接口 + * + * @author natural + * @date 2023-08-21 + */ +public interface IXzqhService +{ + /** + * 查询行政区划 + * + * @param id 行政区划主键 + * @return 行政区划 + */ + public Xzqh selectXzqhById(String id); + +// AddVo addressCheck(String add); + /** + * 查询行政区划列表 + * + * @param xzqh 行政区划 + * @return 行政区划集合 + */ + public List selectXzqhList(Xzqh xzqh); + + /** + * 新增行政区划 + * + * @param xzqh 行政区划 + * @return 结果 + */ +// public int insertXzqh(Xzqh xzqh); + + /** + * 修改行政区划 + * + * @param xzqh 行政区划 + * @return 结果 + */ +// public int updateXzqh(Xzqh xzqh); + + /** + * 批量删除行政区划 + * + * @param ids 需要删除的行政区划主键集合 + * @return 结果 + */ + public int deleteXzqhByIds(String[] ids); + + /** + * 删除行政区划信息 + * + * @param id 行政区划主键 + * @return 结果 + */ + public int deleteXzqhById(String id); + + /** + * 通过级联行政区划代码来查询行政区划名 + * @param cascadeCodes 级别代码 + * @param separator 多个行政区划之间的分隔符,可为空。默认为 "/" + * @return 行政区划名 + */ +// String findByCascadeCode(String cascadeCodes,String separator); + + /** + * 获取省级行政区域 + * @return 返回行政区域列表 + */ + public List getProvinceArea(); + +// void syncXzqhFromRpa(); + + /** + * 根据行政区划的名称获取行政区划的代码 + * @param xzqhName + * @return + */ + public String getXzqhDm(String xzqhName); + + String getXzqhName(String xzqhDm); +// List getXzqhDmFromMcHierarchy(String join); + + /** + * 构建行政区划树形结构 + * @return 行政区划树形结构数据 + */ + public List buildXzqhTree(); + + /** + * 根据行政区划代码查询该区域及其所有下级区域的总名称(xzqhCj) + * @param xzqhDm 行政区划代码 + * @return 包含当前区域及其所有下级区域总名称的列表 + */ + public List getXzqhCjListByCode(String xzqhDm); +} diff --git a/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java b/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java index a5534c4..a0f7f97 100644 --- a/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java +++ b/crm/src/main/java/com/kakarote/crm/service/impl/CrmCustomerServiceImpl.java @@ -151,6 +151,9 @@ public class CrmCustomerServiceImpl extends BaseServiceImpl queryByMonthAndXzqhDm(CrmQueryGsdjxxDTO crmQueryGsdjxxDTO) throws Exception { //处理请求参数 @@ -154,11 +158,13 @@ public class CrmGsdjxxServiceImpl extends BaseServiceImpl> queryGsdjxxByDate(String date) { - System.out.println(date); + public BasePage> queryGsdjxxByDate(CrmQueryGsdjxxDTO crmQueryGsdjxxDTO) { + + //通过行政区划代码回去 + List xzqhCjListByCode = xzqhService.getXzqhCjListByCode(crmQueryGsdjxxDTO.getXzqhDm()); List values = new ArrayList<>(); - values.add(date); + values.add(crmQueryGsdjxxDTO.getRq()); CrmSearchBO.Search search = new CrmSearchBO.Search(); search.setFormType("text"); diff --git a/crm/src/main/java/com/kakarote/crm/service/impl/XzqhServiceImpl.java b/crm/src/main/java/com/kakarote/crm/service/impl/XzqhServiceImpl.java new file mode 100644 index 0000000..9b81d25 --- /dev/null +++ b/crm/src/main/java/com/kakarote/crm/service/impl/XzqhServiceImpl.java @@ -0,0 +1,389 @@ +package com.kakarote.crm.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.kakarote.crm.entity.PO.Xzqh; +import com.kakarote.crm.entity.VO.XzqhOptionVO; +import com.kakarote.crm.mapper.XzqhMapper; +import com.kakarote.crm.service.IXzqhService; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * 行政区划Service业务层处理 + * + * @author natural + * @date 2023-08-21 + */ +@Service +public class XzqhServiceImpl implements IXzqhService { + + @Autowired + private XzqhMapper xzqhMapper; + + @Resource + private RedisTemplate redisTemplate; + + + /** + * 查询行政区划 + * + * @param id 行政区划主键 + * @return 行政区划 + */ + @Override + public Xzqh selectXzqhById(String id) { + return xzqhMapper.selectById(id); + } + +// /** +// * 区分省级,市级.... +// * @param add +// * @return +// */ +// @Override +// public AddVo addressCheck(String add){ +// if (StringUtils.isNotNull(add)){ +// AddVo addVo =new AddVo(); +// Xzqh xhmc = new Xzqh(); +// xhmc.setXzqhCj(add); +// xhmc=selectXzqhList(xhmc).get(0); +// +// switch (xhmc.getXzqhjc()){ +// case "3": +// addVo.setXjmc(xhmc.getXzqhmc()); +// +// Xzqh dDjmc = new Xzqh(); +// dDjmc.setXzqhDm(xhmc.getSjxzqhszDm()); +// dDjmc = selectXzqhList(dDjmc).get(0); +// addVo.setDsjmc(dDjmc.getXzqhmc()); +// +// +// Xzqh sjmc = new Xzqh(); +// sjmc.setXzqhDm(dDjmc.getSjxzqhszDm()); +// sjmc = selectXzqhList(sjmc).get(0); +// addVo.setSjmc(sjmc.getXzqhmc()); +// break; +// +// case "2": +// addVo.setDsjmc(xhmc.getXzqhmc()); +// +// Xzqh sjmc2 = new Xzqh(); +// sjmc2.setXzqhDm(xhmc.getSjxzqhszDm()); +// sjmc2 = selectXzqhList(sjmc2).get(0); +// addVo.setSjmc(sjmc2.getXzqhmc()); +// break; +// +// case "1": +// addVo.setSjmc(add); +// break; +// default: +// return null; +// } +// return addVo; +// }else { +// return null; +// } +// +// } + /** + * 查询行政区划列表 + * + * @param xzqh 行政区划 + * @return 行政区划 + */ + @Override + public List selectXzqhList(Xzqh xzqh) { + return xzqhMapper.selectXzqhList(xzqh); + } + + /** + * 新增行政区划 + * + * @param xzqh 行政区划 + * @return 结果 + */ +// @Override +// public int insertXzqh(Xzqh xzqh) { +// xzqh.setCreateTime(LocalDateTime.now()); +// return xzqhMapper.insert(xzqh); +// } + + /** + * 修改行政区划 + * + * @param xzqh 行政区划 + * @return 结果 + */ +// @Override +// public int updateXzqh(Xzqh xzqh) { +// xzqh.setUpdateTime(LocalDateTime.now()); +// return xzqhMapper.updateById(xzqh); +// } + + /** + * 批量删除行政区划 + * + * @param ids 需要删除的行政区划主键 + * @return 结果 + */ + @Override + public int deleteXzqhByIds(String[] ids) { + return xzqhMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除行政区划信息 + * + * @param id 行政区划主键 + * @return 结果 + */ + @Override + public int deleteXzqhById(String id) { + return xzqhMapper.deleteById(id); + } + +// @Override +// public String findByCascadeCode(String cascadeCodes, String separator) { +// separator = StringUtils.isNotEmpty(separator) ? separator : "/"; +// List cascadeList = Arrays.asList(StringUtils.split(cascadeCodes, ",")); +// String keyPrefix = "xzqh:id:"; +// if (CollectionUtils.isNotEmpty(cascadeList)) { +// List nameList = new ArrayList<>(); +// for (String cascadeCode : cascadeList) { +// String key = keyPrefix + cascadeCode; +// if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) { +// String value = redisTemplate.boundValueOps(key).get(); +// nameList.add(value); +// } else { +// Xzqh xzqh = xzqhMapper.selectById(cascadeCode); +// nameList.add(xzqh.getXzqhmc()); +// redisTemplate.boundValueOps(key).set(xzqh.getXzqhmc(), 30, TimeUnit.MINUTES); +// } +// } +// return String.join(separator, nameList); +// } +// return ""; +// } + + @Override + public List getProvinceArea() { + //返回省级行政数据 + List list = new LambdaQueryChainWrapper<>(xzqhMapper) + .eq(Xzqh::getXzqhjc,"1") + .orderByAsc(Xzqh::getXzqhDm) + .list(); + return list; + } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// @Async +// public void syncXzqhFromRpa() { +// List xzqhList = new ArrayList<>(); +// sync("86", xzqhList); +// if (CollectionUtils.isNotEmpty(xzqhList)) { +// int size = xzqhList.size(); +// int batch = 800; +// int count = size / batch; +// if (size % batch != 0) { +// count++; +// } +// for (int i = 0; i < count; i++) { +// int from = i * batch; +// int to = (i + 1) * batch - 1; +// to = Math.min(to, xzqhList.size()); +// List ssmbList = xzqhList.subList(from, to); +// xzqhMapper.insertTempData(ssmbList); +// } +// +// } +// xzqhMapper.updateXzqh(); +// xzqhMapper.deleteDuplicate(); +// xzqhMapper.insertSsbmFromTemp(); +// } + + @Override + public String getXzqhDm(String xzqhName) { + return xzqhMapper.getXzqhDm(xzqhName); + } + + @Override + public String getXzqhName(String xzqhDm) { + return xzqhMapper.getXzqhName(xzqhDm); + } + +// @Override +// public List getXzqhDmFromMcHierarchy(String mcHierarchy) { +// if (StringUtils.isNotEmpty(mcHierarchy)) { +// Xzqh xzqh = new LambdaQueryChainWrapper<>(xzqhMapper) +// .eq(Xzqh::getMcHierarchy, mcHierarchy) +// .last("limit 1") +// .one(); +// if (Objects.nonNull(xzqh)) { +// return Arrays.asList(StringUtils.split(xzqh.getMcHierarchy(), ",")); +// } +// } +// return Collections.emptyList(); +// } +// +// private void sync(String sjxzbm, List respList) { +// QyTaxUser qyTaxUsers = qyTaxUserService.getRandomOnlineTaxUser(null); +// if (Objects.nonNull(qyTaxUsers)) { +// List xzqhList = foreseeInvoiceHandler.qgxzqhcx(sjxzbm, qyTaxUsers.getToken()); +// if (CollectionUtils.isNotEmpty(xzqhList)) { +// respList.addAll(xzqhList); +// for (ForeseeXzqh xzqh : xzqhList) { +// String xzqhDm = xzqh.getXzqhDm(); +// sync(xzqhDm, respList); +// } +// } +// } +// } + + /** + * 构建行政区划树形结构(优化版本) + * @return 行政区划树形结构数据 + */ + @Override + public List buildXzqhTree() { + // 先获取所有有效的行政区划数据 + List allXzqhList = selectXzqhList(null); + + if (CollectionUtils.isEmpty(allXzqhList)) { + return new ArrayList<>(); + } + // 使用Map优化构建过程 + List result = buildTreeWithMap(allXzqhList); + + return result; + } + + /** + * 使用Map优化构建树形结构 + * @param allXzqhList 所有行政区划数据 + * @return 树形结构数据 + */ + private List buildTreeWithMap(List allXzqhList) { + List result = new ArrayList<>(); + Map codeToOptionMap = new HashMap<>(); + + // 1. 先将所有行政区划转换为OptionVO并放入Map + for (Xzqh xzqh : allXzqhList) { + XzqhOptionVO option = new XzqhOptionVO(xzqh.getXzqhDm(), xzqh.getXzqhmc()); + codeToOptionMap.put(xzqh.getXzqhDm(), option); + } + + // 2. 构建父子关系 + for (Xzqh xzqh : allXzqhList) { + XzqhOptionVO currentOption = codeToOptionMap.get(xzqh.getXzqhDm()); + String parentCode = xzqh.getSjxzqhszDm(); + + // 如果没有父级代码或父级代码不存在于Map中,则为根节点 + if (parentCode == null || parentCode.isEmpty() || !codeToOptionMap.containsKey(parentCode)) { + // 省级行政区划通常没有父级或父级代码为特殊值 + if ("1".equals(xzqh.getXzqhjc())) { + result.add(currentOption); + } + } else { + // 有父级,则添加到父级的children中 + XzqhOptionVO parentOption = codeToOptionMap.get(parentCode); + parentOption.getChildren().add(currentOption); + } + } + // 3. 遍历所有节点,将空的children列表设置为null + for (XzqhOptionVO option : codeToOptionMap.values()) { + if (option.getChildren() != null && option.getChildren().isEmpty()) { + option.setChildren(null); + } + } + + return result; + } + + @Override + public List getXzqhCjListByCode(String xzqhDm) { + List resultList = new ArrayList<>(); + + // 参数校验 + if (xzqhDm == null || xzqhDm.isEmpty()) { + return resultList; + } + + try { + // 1. 先获取当前行政区划数据 + Xzqh currentXzqh = new Xzqh(); + currentXzqh.setXzqhDm(xzqhDm); + List currentList = selectXzqhList(currentXzqh); + + if (CollectionUtils.isEmpty(currentList)) { + return resultList; + } + + // 2. 获取所有行政区划数据,便于构建父子关系 + List allXzqhList = selectXzqhList(null); + if (CollectionUtils.isEmpty(allXzqhList)) { + // 如果查询到当前区域但没有其他数据,只返回当前区域的xzqhCj + Xzqh xzqh = currentList.get(0); + if (xzqh.getXzqhCj() != null && !xzqh.getXzqhCj().isEmpty()) { + resultList.add(xzqh.getXzqhCj()); + } + return resultList; + } + + // 3. 构建行政区划的父子关系映射 + Map> parentChildMap = new HashMap<>(); + Map codeToXzqhMap = new HashMap<>(); + + for (Xzqh xzqh : allXzqhList) { + codeToXzqhMap.put(xzqh.getXzqhDm(), xzqh); + + String parentCode = xzqh.getSjxzqhszDm(); + if (parentCode != null && !parentCode.isEmpty()) { + parentChildMap.computeIfAbsent(parentCode, k -> new ArrayList<>()).add(xzqh); + } + } + + // 4. 从当前行政区划开始,递归收集所有区域的xzqhCj + Xzqh startXzqh = currentList.get(0); + collectXzqhCj(resultList, startXzqh, parentChildMap, codeToXzqhMap); + + } catch (Exception e) { + // 实际应用中应使用日志框架记录异常 + e.printStackTrace(); + } + + return resultList; + } + + + /** + * 递归收集指定行政区划及其所有下级区域的xzqhCj + */ + private void collectXzqhCj(List resultList, Xzqh currentXzqh, + Map> parentChildMap, Map codeToXzqhMap) { + // 添加当前区域的xzqhCj + if (currentXzqh != null && currentXzqh.getXzqhCj() != null && !currentXzqh.getXzqhCj().isEmpty()) { + resultList.add(currentXzqh.getXzqhCj()); + } + + // 递归处理所有子区域 + String currentCode = currentXzqh.getXzqhDm(); + List children = parentChildMap.get(currentCode); + + if (CollectionUtils.isNotEmpty(children)) { + for (Xzqh child : children) { + collectXzqhCj(resultList, child, parentChildMap, codeToXzqhMap); + } + } + } +}