diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/controller/InstitutionAreaController.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/controller/InstitutionAreaController.java
new file mode 100644
index 0000000..d3f6286
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/controller/InstitutionAreaController.java
@@ -0,0 +1,342 @@
+package com.nu.modules.institution.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.nu.modules.institution.entity.InstitutionArea;
+import com.nu.modules.institution.model.InstitutionAreaIdModel;
+import com.nu.modules.institution.model.InstitutionAreaTreeModel;
+import com.nu.modules.institution.service.IInstitutionAreaService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.config.TenantContext;
+import org.jeecg.common.constant.CacheConstant;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.ImportExcelUtil;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ *
+ * 机构表 前端控制器
+ *
+ *
+ * @Author: 曹磊 @Since: 2025-03-25
+ */
+@RestController
+@RequestMapping("/admin/institutionArea")
+@Slf4j
+public class InstitutionAreaController {
+
+ @Autowired
+ private IInstitutionAreaService service;
+
+ /**
+ * 查询数据 查出所有机构,并以树结构数据格式响应给前端
+ *
+ * @return
+ */
+ @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET)
+ public Result> queryTreeList(@RequestParam(name = "ids", required = false) String ids) {
+ Result> result = new Result<>();
+ try {
+ if(oConvertUtils.isNotEmpty(ids)){
+ List departList = service.queryTreeList(ids);
+ result.setResult(departList);
+ }else{
+ List list = service.queryTreeList();
+ result.setResult(list);
+ }
+ result.setSuccess(true);
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ }
+ return result;
+ }
+
+ /**
+ * 异步查询机构list
+ * @param parentId 父节点 异步加载时传递
+ * @param ids 前端回显是传递
+ * @param primaryKey 主键字段(id或者orgCode)
+ * @return
+ */
+ @RequestMapping(value = "/queryInstTreeSync", method = RequestMethod.GET)
+ public Result> queryInstTreeSync(@RequestParam(name = "pid", required = false) String parentId,@RequestParam(name = "ids", required = false) String ids, @RequestParam(name = "primaryKey", required = false) String primaryKey) {
+ Result> result = new Result<>();
+ try {
+ List list = service.queryTreeListByPid(parentId,ids, primaryKey);
+ result.setResult(list);
+ result.setSuccess(true);
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ result.setSuccess(false);
+ result.setMessage("查询失败");
+ }
+ return result;
+ }
+
+ /**
+ * 获取某个机构的所有父级机构的ID
+ *
+ * @param instId 根据instId查
+ * @param orgCode 根据orgCode查,instId和orgCode必须有一个不为空
+ */
+ @GetMapping("/queryAllParentId")
+ public Result queryParentIds(
+ @RequestParam(name = "instId", required = false) String instId,
+ @RequestParam(name = "orgCode", required = false) String orgCode) {
+ try {
+ JSONObject data;
+ if (oConvertUtils.isNotEmpty(instId)) {
+ data = service.queryAllParentIdByInstId(instId);
+ } else if (oConvertUtils.isNotEmpty(orgCode)) {
+ data = service.queryAllParentIdByOrgCode(orgCode);
+ } else {
+ return Result.error("departId 和 orgCode 不能都为空!");
+ }
+ return Result.OK(data);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return Result.error(e.getMessage());
+ }
+ }
+
+ /**
+ * 添加新数据 添加用户新建的机构对象数据,并保存到数据库
+ *
+ * @param InstitutionArea
+ * @return
+ */
+ @RequestMapping(value = "/add", method = RequestMethod.POST)
+ public Result add(@RequestBody InstitutionArea InstitutionArea, HttpServletRequest request) {
+ Result result = new Result();
+ String username = JwtUtil.getUserNameByToken(request);
+ try {
+ InstitutionArea.setCreateBy(username);
+ service.saveInstData(InstitutionArea, username);
+ result.success("添加成功!");
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ result.error500("操作失败");
+ }
+ return result;
+ }
+
+ /**
+ * 编辑数据 编辑机构的部分数据,并保存到数据库
+ *
+ * @param InstitutionArea
+ * @return
+ */
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody InstitutionArea InstitutionArea, HttpServletRequest request) {
+ String username = JwtUtil.getUserNameByToken(request);
+ InstitutionArea.setUpdateBy(username);
+ Result result = new Result();
+ InstitutionArea InstitutionAreaEntity = service.getById(InstitutionArea.getId());
+ if (InstitutionAreaEntity == null) {
+ result.error500("未找到对应实体");
+ } else {
+ boolean ok = service.updateInstDataById(InstitutionArea, username);
+ if (ok) {
+ result.success("修改成功!");
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 通过id删除
+ * @param id
+ * @return
+ */
+ @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ Result result = new Result();
+ InstitutionArea InstitutionArea = service.getById(id);
+ if(InstitutionArea==null) {
+ result.error500("未找到对应实体");
+ }else {
+ service.deleteInst(id);
+ result.success("删除成功!");
+ }
+ return result;
+ }
+
+
+ /**
+ * 批量删除 根据前端请求的多个ID,对数据库执行删除相关机构数据的操作
+ *
+ * @param ids
+ * @return
+ */
+ @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
+ public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+ Result result = new Result();
+ if (ids == null || "".equals(ids.trim())) {
+ result.error500("参数不识别!");
+ } else {
+ this.service.deleteBatchWithChildren(Arrays.asList(ids.split(",")));
+ result.success("删除成功!");
+ }
+ return result;
+ }
+
+ /**
+ * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有机构的名称,方便用户的操作
+ *
+ * @return
+ */
+ @RequestMapping(value = "/queryIdTree", method = RequestMethod.GET)
+ public Result> queryIdTree() {
+ Result> result = new Result<>();
+ try {
+ List list = service.queryInstIdTreeList();
+ result.setResult(list);
+ result.setSuccess(true);
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ }
+ return result;
+ }
+
+ /**
+ *
+ * 机构搜索功能方法,根据关键字模糊搜索相关机构
+ *
+ *
+ * @param keyWord
+ * @return
+ */
+ @RequestMapping(value = "/searchBy", method = RequestMethod.GET)
+ public Result> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord, @RequestParam(name = "myInstSearch", required = false) String myInstSearch) {
+ Result> result = new Result>();
+ //机构查询,myDeptSearch为1时为我的机构查询,登录用户为上级时查只查负责机构下数据
+ LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+ String instIds = null;
+ if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
+ instIds = user.getDepartIds();
+ }
+ List treeList = this.service.searchByKeyWord(keyWord,myInstSearch,instIds);
+ if (treeList == null || treeList.size() == 0) {
+ result.setSuccess(false);
+ result.setMessage("未查询匹配数据!");
+ return result;
+ }
+ result.setResult(treeList);
+ return result;
+ }
+
+ /**
+ * 查询所有机构信息
+ * @return
+ */
+ @GetMapping("listAll")
+ public Result> listAll(@RequestParam(name = "id", required = false) String id) {
+ Result> result = new Result<>();
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ query.orderByAsc(InstitutionArea::getOrgCode);
+ if(oConvertUtils.isNotEmpty(id)){
+ String[] arr = id.split(",");
+ query.in(InstitutionArea::getId,arr);
+ }
+ List ls = this.service.list(query);
+ result.setSuccess(true);
+ result.setResult(ls);
+ return result;
+ }
+
+ /**
+ * 根据机构编码获取机构信息
+ *
+ * @param orgCode
+ * @return
+ */
+ @GetMapping("/getInstName")
+ public Result getInstName(@RequestParam(name = "orgCode") String orgCode) {
+ Result result = new Result<>();
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ query.eq(InstitutionArea::getOrgCode, orgCode);
+ InstitutionArea InstitutionArea = service.getOne(query);
+ result.setSuccess(true);
+ result.setResult(InstitutionArea);
+ return result;
+ }
+
+
+ /**
+ * @功能:根据id 批量查询
+ * @param instIds
+ * @return
+ */
+ @RequestMapping(value = "/queryByIds", method = RequestMethod.GET)
+ public Result> queryByIds(@RequestParam(name = "instIds") String instIds) {
+ Result> result = new Result<>();
+ String[] ids = instIds.split(",");
+ Collection idList = Arrays.asList(ids);
+ Collection instList = service.listByIds(idList);
+ result.setSuccess(true);
+ result.setResult(instList);
+ return result;
+ }
+
+ /**
+ * 异步查询机构list
+ * @param parentId 父节点 异步加载时传递
+ * @return
+ */
+ @RequestMapping(value = "/queryBookInstTreeSync", method = RequestMethod.GET)
+ public Result> queryBookDepTreeSync(@RequestParam(name = "pid", required = false) String parentId,
+ @RequestParam(name = "tenantId") Integer tenantId,
+ @RequestParam(name = "instName",required = false) String instName) {
+ Result> result = new Result<>();
+ try {
+ List list = service.queryBookInstTreeSync(parentId, tenantId, instName);
+ result.setResult(list);
+ result.setSuccess(true);
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ }
+ return result;
+ }
+
+ /**
+ * 查询所有子区域信息
+ * @return
+ */
+ @GetMapping("queryChildrenByParentId")
+ public Result> queryChildrenByParentId(@RequestParam(name = "pid", required = false) String parentId) {
+ Result> result = new Result<>();
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ query.orderByAsc(InstitutionArea::getInstName);
+ query.eq(InstitutionArea::getParentId,parentId);
+ List ls = this.service.list(query);
+ result.setSuccess(true);
+ result.setResult(ls);
+ return result;
+ }
+
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/entity/InstitutionArea.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/entity/InstitutionArea.java
new file mode 100644
index 0000000..1b0dad1
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/entity/InstitutionArea.java
@@ -0,0 +1,86 @@
+package com.nu.modules.institution.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ *
+ * 机构区域表
+ *
+ *
+ * @Author 曹磊
+ * @Since 2025-03-25
+ */
+@Data
+@TableName("nu_admin_institution_area")
+public class InstitutionArea implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**ID*/
+ @TableId(type = IdType.ASSIGN_ID)
+ private String id;
+ /**父机构ID*/
+ private String parentId;
+ /**机构/部门名称*/
+ @Excel(name="机构/区域名称",width=15)
+ private String instName;
+ /**英文名*/
+ @Excel(name="英文名",width=15)
+ private String instNameEn;
+ /**缩写*/
+ private String instNameAbbr;
+ /**排序*/
+ @Excel(name="排序",width=15)
+ private Integer instOrder;
+ /**描述*/
+ @Excel(name="描述",width=15)
+ private String description;
+ /**机构类别 1=机构,2=区域*/
+ @Excel(name="机构区域类别",width=15,dicCode="inst_category")
+ private String orgCategory;
+ /**机构类型 1一级部门 2子部门*/
+ private String orgType;
+ /**机构编码*/
+ @Excel(name="机构编码",width=15)
+ private String orgCode;
+ /**手机号*/
+ @Excel(name="手机号",width=15)
+ private String mobile;
+ /**地址*/
+ @Excel(name="地址",width=15)
+ private String address;
+ /**状态(1启用,0不启用)*/
+ @Dict(dicCode = "depart_status")
+ private String status;
+ /**删除状态(0,正常,1已删除)*/
+ @Dict(dicCode = "del_flag")
+ private String delFlag;
+ /**创建人*/
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+ /**更新人*/
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+ /**租户ID*/
+ private Integer tenantId;
+ /**是否有叶子节点: 1是0否*/
+ private Integer izLeaf;
+
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/mapper/InstitutionAreaMapper.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/mapper/InstitutionAreaMapper.java
new file mode 100644
index 0000000..4a01d37
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/mapper/InstitutionAreaMapper.java
@@ -0,0 +1,124 @@
+package com.nu.modules.institution.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nu.modules.institution.entity.InstitutionArea;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 机构 Mapper 接口
+ *
+ *
+ * @Author: 曹磊
+ * @Since: 2025-03-25
+ */
+public interface InstitutionAreaMapper extends BaseMapper {
+
+ /**
+ * 通过机构编码获取机构id
+ * @param orgCode 机构编码
+ * @return String
+ */
+ @Select("select id from nu_admin_institution_area where org_code=#{orgCode}")
+ public String queryInstIdByOrgCode(@Param("orgCode") String orgCode);
+
+ /**
+ * 通过机构id 查询机构id,父id
+ * @param id 机构id
+ * @return
+ */
+ @Select("select id,parent_id from nu_admin_institution_area where id=#{id}")
+ public InstitutionArea getParentInstId(@Param("id") String id);
+
+ /**
+ * 根据机构Id查询,当前和下级所有机构IDS
+ * @param id
+ * @return
+ */
+ List getSubInstIdsByInstId(@Param("id") String id);
+
+ /**
+ * 根据机构编码获取机构下所有IDS
+ * @param orgCodes
+ * @return
+ */
+ List getSubInstIdsByOrgCodes(@org.apache.ibatis.annotations.Param("orgCodes") String[] orgCodes);
+
+ /**
+ * 根据parent_id查询下级区域
+ * @param parentId 父id
+ * @return List
+ */
+ List queryTreeListByPid(@Param("parentId") String parentId);
+ /**
+ * 根据id下级区域数量
+ * @param parentId
+ * @return
+ */
+ @Select("SELECT count(*) FROM nu_admin_institution_area where del_flag ='0' AND parent_id = #{parentId,jdbcType=VARCHAR}")
+ Integer queryCountByPid(@Param("parentId")String parentId);
+ /**
+ * 根据OrgCod查询所属机构信息
+ * @param orgCode
+ * @return
+ */
+ InstitutionArea queryInstByOrgCode(@Param("orgCode")String orgCode);
+ /**
+ * 根据id下级区域
+ * @param parentId
+ * @return
+ */
+ @Select("SELECT * FROM nu_admin_institution_area where del_flag ='0' AND parent_id = #{parentId,jdbcType=VARCHAR}")
+ List queryInstByPid(@Param("parentId")String parentId);
+
+ /**
+ * 通过父级id和租户id查询部门
+ * @param parentId
+ * @param tenantId
+ * @return
+ */
+ @InterceptorIgnore(tenantLine = "true")
+ List queryBookInstTreeSync(@Param("parentId") String parentId, @Param("tenantId") Integer tenantId, @Param("instName") String instName);
+
+ @InterceptorIgnore(tenantLine = "true")
+ @Select("SELECT * FROM nu_admin_institution_area where id = #{id,jdbcType=VARCHAR}")
+ InstitutionArea getInstById(@Param("id") String id);
+
+ @InterceptorIgnore(tenantLine = "true")
+ List getMaxCodeInst(@Param("page") Page page, @Param("parentId") String parentId);
+
+ /**
+ * 修改部门状态字段: 是否子节点
+ * @param id 部门id
+ * @param leaf 叶子节点
+ * @return int
+ */
+ @Update("UPDATE nu_admin_institution_area SET iz_leaf=#{leaf} WHERE id = #{id}")
+ int setMainLeaf(@Param("id") String id, @Param("leaf") Integer leaf);
+
+
+ /**
+ * 根据机构名称和租户id获取机构数据
+ * @param instName
+ * @param tenantId
+ * @return
+ */
+ List getInstByName(@Param("instName")String instName, @Param("tenantId")Integer tenantId,@Param("parentId") String parentId);
+
+ /**
+ * 根据机构名称和租户id获取分页机构数据
+ * @param page
+ * @param instName
+ * @param tenantId
+ * @param parentId
+ * @return
+ */
+ List getInstPageByName(@Param("page") Page page, @Param("instName") String instName, @Param("tenantId") Integer tenantId, @Param("parentId") String parentId);
+
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/mapper/xml/InstitutionAreaMapper.xml b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/mapper/xml/InstitutionAreaMapper.xml
new file mode 100644
index 0000000..c224958
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/mapper/xml/InstitutionAreaMapper.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/model/InstitutionAreaIdModel.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/model/InstitutionAreaIdModel.java
new file mode 100644
index 0000000..7d87514
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/model/InstitutionAreaIdModel.java
@@ -0,0 +1,98 @@
+package com.nu.modules.institution.model;
+
+import com.nu.modules.institution.entity.InstitutionArea;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * 机构表 封装树结构的机构的名称的实体类
+ *
+ *
+ * @Author Steve
+ * @Since 2019-01-22
+ *
+ */
+public class InstitutionAreaIdModel implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ private String key;
+
+ /**
+ * 主键ID
+ */
+ private String value;
+
+ /**
+ * 机构名称
+ */
+ private String title;
+
+ List children = new ArrayList<>();
+
+ /**
+ * 将SysDepartTreeModel的部分数据放在该对象当中
+ * @param treeModel
+ * @return
+ */
+ public InstitutionAreaIdModel convert(InstitutionAreaTreeModel treeModel) {
+ this.key = treeModel.getId();
+ this.value = treeModel.getId();
+ this.title = treeModel.getInstName();
+ return this;
+ }
+
+ /**
+ * 该方法为用户机构的实现类所使用
+ * @param inst
+ * @return
+ */
+ public InstitutionAreaIdModel convertByUserDepart(InstitutionArea inst) {
+ this.key = inst.getId();
+ this.value = inst.getId();
+ this.title = inst.getInstName();
+ return this;
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ this.children = children;
+ }
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/model/InstitutionAreaTreeModel.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/model/InstitutionAreaTreeModel.java
new file mode 100644
index 0000000..ca9de01
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/model/InstitutionAreaTreeModel.java
@@ -0,0 +1,357 @@
+package com.nu.modules.institution.model;
+
+import com.nu.modules.institution.entity.InstitutionArea;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *
+ * 机构表 存储树结构数据的实体类
+ *
+ *
+ * @Author 曹磊
+ * @Since 2025-03-25
+ */
+public class InstitutionAreaTreeModel implements Serializable{
+
+ private static final long serialVersionUID = 1L;
+
+ /** 对应InstitutionArea中的id字段,前端数据树中的key*/
+ private String key;
+
+ /** 对应InstitutionArea中的id字段,前端数据树中的value*/
+ private String value;
+
+ /** 对应inst_name字段,前端数据树中的title*/
+ private String title;
+
+
+ private boolean isLeaf;
+ // 以下所有字段均与InstitutionArea相同
+
+ private String id;
+
+ private String parentId;
+
+ private String instName;
+
+ private String instNameEn;
+
+ private String instNameAbbr;
+
+ private Integer instOrder;
+
+ private String description;
+
+ private String orgCategory;
+
+ private String orgType;
+
+ private String orgCode;
+
+ private String mobile;
+
+ private String address;
+
+ private String status;
+
+ private String delFlag;
+
+ private String createBy;
+
+ private Date createTime;
+
+ private String updateBy;
+
+ private Date updateTime;
+
+ //update-begin---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段部门负责人ids
+ /**部门负责人ids*/
+ private String directorUserIds;
+ //update-end---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段部门负责人ids
+
+ private List children = new ArrayList<>();
+
+
+ /**
+ * 将InstitutionArea对象转换成InstitutionAreaTreeModel对象
+ * @param inst
+ */
+ public InstitutionAreaTreeModel(InstitutionArea inst) {
+ this.key = inst.getId();
+ this.value = inst.getId();
+ this.title = inst.getInstName();
+ this.id = inst.getId();
+ this.parentId = inst.getParentId();
+ this.instName = inst.getInstName();
+ this.instNameEn = inst.getInstNameEn();
+ this.instNameAbbr = inst.getInstNameAbbr();
+ this.instOrder = inst.getInstOrder();
+ this.description = inst.getDescription();
+ this.orgCategory = inst.getOrgCategory();
+ this.orgType = inst.getOrgType();
+ this.orgCode = inst.getOrgCode();
+ this.mobile = inst.getMobile();
+ this.address = inst.getAddress();
+ this.status = inst.getStatus();
+ this.delFlag = inst.getDelFlag();
+ this.createBy = inst.getCreateBy();
+ this.createTime = inst.getCreateTime();
+ this.updateBy = inst.getUpdateBy();
+ this.updateTime = inst.getUpdateTime();
+ if(0 == inst.getIzLeaf()){
+ this.isLeaf = false;
+ }else{
+ this.isLeaf = true;
+ }
+ }
+
+ public boolean getIsLeaf() {
+ return isLeaf;
+ }
+
+ public void setIsLeaf(boolean isleaf) {
+ this.isLeaf = isleaf;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+
+ public String getValue() {
+ return value;
+ }
+
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+ public String getTitle() {
+ return title;
+ }
+
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ if (children==null){
+ this.isLeaf=true;
+ }
+ this.children = children;
+ }
+
+ public String getParentId() {
+ return parentId;
+ }
+
+ public void setParentId(String parentId) {
+ this.parentId = parentId;
+ }
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public String getInstName() {
+ return instName;
+ }
+
+ public void setInstName(String instName) {
+ this.instName = instName;
+ }
+
+ public String getOrgCategory() {
+ return orgCategory;
+ }
+
+ public void setOrgCategory(String orgCategory) {
+ this.orgCategory = orgCategory;
+ }
+
+ public String getOrgType() {
+ return orgType;
+ }
+
+ public void setOrgType(String orgType) {
+ this.orgType = orgType;
+ }
+
+ public String getOrgCode() {
+ return orgCode;
+ }
+
+ public void setOrgCode(String orgCode) {
+ this.orgCode = orgCode;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getInstNameEn() {
+ return instNameEn;
+ }
+
+ public void setInstNameEn(String instNameEn) {
+ this.instNameEn = instNameEn;
+ }
+
+ public String getInstNameAbbr() {
+ return instNameAbbr;
+ }
+
+ public void setInstNameAbbr(String instNameAbbr) {
+ this.instNameAbbr = instNameAbbr;
+ }
+
+ public Integer getInstOrder() {
+ return instOrder;
+ }
+
+ public void setInstOrder(Integer instOrder) {
+ this.instOrder = instOrder;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getDelFlag() {
+ return delFlag;
+ }
+
+ public void setDelFlag(String delFlag) {
+ this.delFlag = delFlag;
+ }
+
+ public String getCreateBy() {
+ return createBy;
+ }
+
+ public void setCreateBy(String createBy) {
+ this.createBy = createBy;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getUpdateBy() {
+ return updateBy;
+ }
+
+ public void setUpdateBy(String updateBy) {
+ this.updateBy = updateBy;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public InstitutionAreaTreeModel() { }
+
+ /**
+ * 重写equals方法
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ InstitutionAreaTreeModel model = (InstitutionAreaTreeModel) o;
+ return Objects.equals(id, model.id) &&
+ Objects.equals(parentId, model.parentId) &&
+ Objects.equals(instName, model.instName) &&
+ Objects.equals(instNameEn, model.instNameEn) &&
+ Objects.equals(instNameAbbr, model.instNameAbbr) &&
+ Objects.equals(instOrder, model.instOrder) &&
+ Objects.equals(description, model.description) &&
+ Objects.equals(orgCategory, model.orgCategory) &&
+ Objects.equals(orgType, model.orgType) &&
+ Objects.equals(orgCode, model.orgCode) &&
+ Objects.equals(mobile, model.mobile) &&
+ Objects.equals(address, model.address) &&
+ Objects.equals(status, model.status) &&
+ Objects.equals(delFlag, model.delFlag) &&
+ Objects.equals(createBy, model.createBy) &&
+ Objects.equals(createTime, model.createTime) &&
+ Objects.equals(updateBy, model.updateBy) &&
+ Objects.equals(updateTime, model.updateTime) &&
+ Objects.equals(children, model.children);
+ }
+
+ /**
+ * 重写hashCode方法
+ */
+ @Override
+ public int hashCode() {
+
+ return Objects.hash(id, parentId, instName, instNameEn, instNameAbbr,
+ instOrder, description, orgCategory, orgType, orgCode, mobile, address,
+ status, delFlag, createBy, createTime, updateBy, updateTime,
+ children);
+ }
+
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/service/IInstitutionAreaService.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/service/IInstitutionAreaService.java
new file mode 100644
index 0000000..acc81aa
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/service/IInstitutionAreaService.java
@@ -0,0 +1,168 @@
+package com.nu.modules.institution.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.nu.modules.institution.entity.InstitutionArea;
+import com.nu.modules.institution.model.InstitutionAreaIdModel;
+import com.nu.modules.institution.model.InstitutionAreaTreeModel;
+
+import java.util.List;
+
+/**
+ *
+ * 机构表 服务实现类
+ *
+ *
+ * @Author 曹磊
+ * @Since 2025-03-25
+ */
+public interface IInstitutionAreaService extends IService{
+
+ /**
+ * 查询所有机构信息,并分节点进行显示
+ * @return
+ */
+ List queryTreeList();
+
+
+ /**
+ * 查询所有机构信息,并分节点进行显示
+ * @param ids 多个机构id
+ * @return
+ */
+ List queryTreeList(String ids);
+
+ /**
+ * 查询所有机构instId信息,并分节点进行显示
+ * @return
+ */
+ public List queryInstIdTreeList();
+
+ /**
+ * 保存部门数据
+ * @param InstitutionArea
+ * @param username 用户名
+ */
+ void saveInstData(InstitutionArea InstitutionArea,String username);
+
+ /**
+ * 更新Inst数据
+ * @param InstitutionArea
+ * @param username 用户名
+ * @return
+ */
+ Boolean updateInstDataById(InstitutionArea InstitutionArea,String username);
+
+ /**
+ * 删除Inst数据
+ * @param id
+ * @return
+ */
+ /* boolean removeInstDataById(String id); */
+
+ /**
+ * 根据关键字搜索相关的部门数据
+ * @param keyWord
+ * @param myInstSearch
+ * @param instIds 多个部门id
+ * @return
+ */
+ List searchByKeyWord(String keyWord,String myInstSearch,String instIds);
+
+ /**
+ * 根据部门id删除并删除其可能存在的子级部门
+ * @param id
+ * @return
+ */
+ boolean delete(String id);
+
+ /**
+ * 根据部门id批量删除并删除其可能存在的子级部门
+ * @param ids 多个部门id
+ * @return
+ */
+ void deleteBatchWithChildren(List ids);
+
+ /**
+ * 根据部门Id查询,当前和下级所有部门IDS
+ * @param instId
+ * @return
+ */
+ List getSubInstIdsByInstId(String instId);
+
+ /**
+ * 获取我的部门下级所有部门
+ * @param parentId 父id
+ * @param ids 多个部门id
+ * @param primaryKey 主键字段(id或者orgCode)
+ * @return
+ */
+ List queryTreeListByPid(String parentId,String ids, String primaryKey);
+
+ /**
+ * 获取某个部门的所有父级部门的ID
+ *
+ * @param instId 根据instId查
+ * @return JSONObject
+ */
+ JSONObject queryAllParentIdByInstId(String instId);
+
+ /**
+ * 获取某个部门的所有父级部门的ID
+ *
+ * @param orgCode 根据orgCode查
+ * @return JSONObject
+ */
+ JSONObject queryAllParentIdByOrgCode(String orgCode);
+ /**
+ * 获取公司信息
+ * @param orgCode 部门编码
+ * @return
+ */
+ InstitutionArea queryInstByOrgCode(String orgCode);
+ /**
+ * 获取下级部门
+ * @param pid
+ * @return
+ */
+ List queryInstByPid(String pid);
+
+ /**
+ * 删除部门
+ * @param id
+ */
+ void deleteInst(String id);
+
+ /**
+ * 通讯录通过租户id查询部门数据
+ * @param parentId
+ * @param tenantId
+ * @param instName
+ * @return
+ */
+ List queryBookInstTreeSync(String parentId, Integer tenantId, String instName);
+
+ /**
+ * 根据id查询部门信息
+ * @param parentId
+ * @return
+ */
+ InstitutionArea getInstById(String parentId);
+
+ /**
+ * 根据id查询部门信息
+ * @param parentId
+ * @return
+ */
+ IPage getMaxCodeInst(Page page, String parentId);
+
+ /**
+ * 更新叶子节点
+ * @param id
+ * @param izLeaf
+ */
+ void updateIzLeaf(String id, Integer izLeaf);
+
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/service/impl/InstitutionAreaServiceImpl.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/service/impl/InstitutionAreaServiceImpl.java
new file mode 100644
index 0000000..7deb8fa
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/service/impl/InstitutionAreaServiceImpl.java
@@ -0,0 +1,575 @@
+package com.nu.modules.institution.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.nu.modules.institution.entity.InstitutionArea;
+import com.nu.modules.institution.mapper.InstitutionAreaMapper;
+import com.nu.modules.institution.model.InstitutionAreaIdModel;
+import com.nu.modules.institution.model.InstitutionAreaTreeModel;
+import com.nu.modules.institution.service.IInstitutionAreaService;
+import com.nu.modules.institution.utils.FindsInstChildrenUtil;
+import com.nu.modules.institution.utils.OrgCodeRule;
+import io.netty.util.internal.StringUtil;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.common.config.TenantContext;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.constant.FillRuleConstant;
+import org.jeecg.common.constant.SymbolConstant;
+import org.jeecg.common.util.FillRuleUtil;
+import org.jeecg.common.util.YouBianCodeUtil;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.function.Consumer;
+
+/**
+ *
+ * 机构表 服务实现类
+ *
+ *
+ * @Author 曹磊
+ * @Since 2025-03-25
+ */
+@Service
+public class InstitutionAreaServiceImpl extends ServiceImpl implements IInstitutionAreaService {
+
+ /**
+ * queryTreeList 对应 queryTreeList 查询所有的机构数据,以树结构形式响应给前端
+ */
+ @Override
+ public List queryTreeList() {
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ //------------------------------------------------------------------------------------------------
+ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】
+ if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
+ query.eq(InstitutionArea::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));
+ }
+ //------------------------------------------------------------------------------------------------
+ query.eq(InstitutionArea::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
+ query.orderByAsc(InstitutionArea::getInstOrder);
+ List list = this.list(query);
+ // 调用wrapTreeDataToTreeList方法生成树状数据
+ List listResult = FindsInstChildrenUtil.wrapTreeDataToTreeList(list);
+ return listResult;
+ }
+
+ /**
+ * queryTreeList 根据机构id查询,前端回显调用
+ */
+ @Override
+ public List queryTreeList(String ids) {
+ List listResult=new ArrayList<>();
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ query.eq(InstitutionArea::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
+ if(oConvertUtils.isNotEmpty(ids)){
+ query.in(true,InstitutionArea::getId,ids.split(","));
+ }
+ //------------------------------------------------------------------------------------------------
+ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】
+ if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
+ query.eq(InstitutionArea::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));
+ }
+ //------------------------------------------------------------------------------------------------
+ query.orderByAsc(InstitutionArea::getInstOrder);
+ List list= this.list(query);
+ for (InstitutionArea inst : list) {
+ listResult.add(new InstitutionAreaTreeModel(inst));
+ }
+ return listResult;
+
+ }
+
+ @Override
+ public List queryInstIdTreeList() {
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ query.eq(InstitutionArea::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
+ //------------------------------------------------------------------------------------------------
+ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】
+ if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
+ query.eq(InstitutionArea::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));
+ }
+ //------------------------------------------------------------------------------------------------
+ query.orderByAsc(InstitutionArea::getInstOrder);
+ List list = this.list(query);
+ // 调用wrapTreeDataToTreeList方法生成树状数据
+ List listResult = FindsInstChildrenUtil.wrapTreeDataToInstIdTreeList(list);
+ return listResult;
+ }
+
+ /**
+ * saveInstData 对应 add 保存用户在页面添加的新的机构对象数据
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void saveInstData(InstitutionArea institutionArea, String username) {
+ if (institutionArea != null && username != null) {
+ //update-begin---author:wangshuai ---date:20230216 for:[QQYUN-4163]给机构表加个是否有子节点------------
+ if (oConvertUtils.isEmpty(institutionArea.getParentId())) {
+ institutionArea.setParentId("");
+ }else{
+ //将父机构的设成不是叶子结点
+ baseMapper.setMainLeaf(institutionArea.getParentId(),CommonConstant.NOT_LEAF);
+ }
+ //update-end---author:wangshuai ---date:20230216 for:[QQYUN-4163]给机构表加个是否有子节点------------
+ //String s = UUID.randomUUID().toString().replace("-", "");
+ institutionArea.setId(IdWorker.getIdStr(institutionArea));
+ // 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级
+ // 获取父级ID
+ String parentId = institutionArea.getParentId();
+ //update-begin--Author:baihailong Date:20191209 for:机构编码规则生成器做成公用配置
+ JSONObject formData = new JSONObject();
+ formData.put("parentId",parentId);
+ String[] codeArray = OrgCodeRule.getOrgCode(formData);
+ //update-end--Author:baihailong Date:20191209 for:机构编码规则生成器做成公用配置
+ institutionArea.setOrgCode(codeArray[0]);
+ String orgType = codeArray[1];
+ institutionArea.setOrgType(String.valueOf(orgType));
+ institutionArea.setCreateTime(new Date());
+ institutionArea.setDelFlag(CommonConstant.DEL_FLAG_0.toString());
+ //新添加的机构是叶子节点
+ institutionArea.setIzLeaf(CommonConstant.IS_LEAF);
+ // 【QQYUN-7172】数据库默认值兼容
+ if (oConvertUtils.isEmpty(institutionArea.getOrgCategory())) {
+ if (oConvertUtils.isEmpty(institutionArea.getParentId())) {
+ institutionArea.setOrgCategory("1");
+ } else {
+ institutionArea.setOrgCategory("2");
+ }
+ }
+ this.save(institutionArea);
+ }
+
+ }
+
+ /**
+ * updateInstDataById 对应 edit 根据机构主键来更新对应的机构数据
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean updateInstDataById(InstitutionArea institutionArea, String username) {
+ if (institutionArea != null && username != null) {
+ institutionArea.setUpdateTime(new Date());
+ institutionArea.setUpdateBy(username);
+ this.updateById(institutionArea);
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteBatchWithChildren(List ids) {
+ //存放子级的id
+ List idList = new ArrayList();
+ //存放父级的id
+ List parentIdList = new ArrayList<>();
+ for(String id: ids) {
+ idList.add(id);
+ //此步骤是为了删除子级
+ this.checkChildrenExists(id, idList);
+ //update-begin---author:wangshuai ---date:20230712 for:【QQYUN-5757】批量删除机构时未正确置为叶子节点 ------------
+ InstitutionArea inst = this.getInstById(id);
+ if (oConvertUtils.isNotEmpty(inst.getParentId())) {
+ if (!parentIdList.contains(inst.getParentId())) {
+ parentIdList.add(inst.getParentId());
+ }
+ }
+ }
+ this.removeByIds(idList);
+ //再删除前需要获取父级id,不然会一直为空
+ this.setParentInstIzLeaf(parentIdList);
+ }
+
+ @Override
+ public List getSubInstIdsByInstId(String instId) {
+ return this.baseMapper.getSubInstIdsByInstId(instId);
+ }
+
+ /**
+ * 清空部门id
+ *
+ * @param parentIdList
+ */
+ private void setParentInstIzLeaf(List parentIdList) {
+ if (CollectionUtil.isNotEmpty(parentIdList)) {
+ for (String parentId : parentIdList) {
+ //查询父级id没有子级的时候跟新为叶子节点
+ LambdaQueryWrapper query = new LambdaQueryWrapper<>();
+ query.eq(InstitutionArea::getParentId, parentId);
+ Long count = baseMapper.selectCount(query);
+ //当子级都不存在时,设置当前部门为叶子节点
+ if (count == 0) {
+ baseMapper.setMainLeaf(parentId, CommonConstant.IS_LEAF);
+ }
+ }
+ }
+ }
+
+ /**
+ *
+ * 根据关键字搜索相关的机构数据
+ *
+ */
+ @Override
+ public List searchByKeyWord(String keyWord,String myDeptSearch,String instIds) {
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ List newList = new ArrayList<>();
+ //myDeptSearch不为空时为我的机构搜索,只搜索所负责机构
+ if(!StringUtil.isNullOrEmpty(myDeptSearch)){
+ //instIds 为空普通用户或没有管理机构
+ if(StringUtil.isNullOrEmpty(instIds)){
+ return newList;
+ }
+ //根据机构id获取所负责机构
+ String[] codeArr = this.getMyDeptParentOrgCode(instIds);
+ //update-begin-author:taoyan date:20220104 for:/issues/3311 当用户属于两个机构的时候,且这两个机构没有上下级关系,我的机构-机构名称查询条件模糊搜索失效!
+ if (codeArr != null && codeArr.length > 0) {
+ query.nested(i -> {
+ for (String s : codeArr) {
+ i.or().likeRight(InstitutionArea::getOrgCode, s);
+ }
+ });
+ }
+ //update-end-author:taoyan date:20220104 for:/issues/3311 当用户属于两个机构的时候,且这两个机构没有上下级关系,我的机构-机构名称查询条件模糊搜索失效!
+ query.eq(InstitutionArea::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
+ }
+ query.like(InstitutionArea::getInstName, keyWord);
+ //update-begin--Author:huangzhilin Date:20140417 for:[bugfree号]组织机构搜索回显优化--------------------
+ InstitutionAreaTreeModel model = new InstitutionAreaTreeModel();
+ List instList = this.list(query);
+ if(instList.size() > 0) {
+ for(InstitutionArea inst : instList) {
+ model = new InstitutionAreaTreeModel(inst);
+ model.setChildren(null);
+ //update-end--Author:huangzhilin Date:20140417 for:[bugfree号]组织机构搜索功回显优化----------------------
+ newList.add(model);
+ }
+ return newList;
+ }
+ return null;
+ }
+
+ /**
+ * 根据机构id删除并且删除其可能存在的子级任何机构
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean delete(String id) {
+ List idList = new ArrayList<>();
+ idList.add(id);
+ this.checkChildrenExists(id, idList);
+ //清空机构树内存
+ //FindsInstChildrenUtil.clearDepartIdModel();
+ boolean ok = this.removeByIds(idList);
+ return ok;
+ }
+
+ /**
+ * delete 方法调用
+ * @param id
+ * @param idList
+ */
+ private void checkChildrenExists(String id, List idList) {
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ query.eq(InstitutionArea::getParentId,id);
+ List departList = this.list(query);
+ if(departList != null && departList.size() > 0) {
+ for(InstitutionArea depart : departList) {
+ idList.add(depart.getId());
+ this.checkChildrenExists(depart.getId(), idList);
+ }
+ }
+ }
+
+ /**
+ * 根据用户所负责机构ids获取父级机构编码
+ * @param departIds
+ * @return
+ */
+ private String[] getMyDeptParentOrgCode(String departIds){
+ //根据机构id查询所负责机构
+ LambdaQueryWrapper query = new LambdaQueryWrapper();
+ query.eq(InstitutionArea::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
+ if(oConvertUtils.isNotEmpty(departIds)){
+ query.in(InstitutionArea::getId, Arrays.asList(departIds.split(",")));
+ }
+
+ //------------------------------------------------------------------------------------------------
+ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】
+ if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
+ query.eq(InstitutionArea::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));
+ }
+ //------------------------------------------------------------------------------------------------
+ query.orderByAsc(InstitutionArea::getOrgCode);
+ List list = this.list(query);
+ //查找根机构
+ if(list == null || list.size()==0){
+ return null;
+ }
+ String orgCode = this.getMyDeptParentNode(list);
+ String[] codeArr = orgCode.split(",");
+ return codeArr;
+ }
+
+ /**
+ * 获取负责机构父节点
+ * @param list
+ * @return
+ */
+ private String getMyDeptParentNode(List list){
+ Map map = new HashMap(5);
+ //1.先将同一公司归类
+ for(InstitutionArea dept : list){
+ String code = dept.getOrgCode().substring(0,3);
+ if(map.containsKey(code)){
+ String mapCode = map.get(code)+","+dept.getOrgCode();
+ map.put(code,mapCode);
+ }else{
+ map.put(code,dept.getOrgCode());
+ }
+ }
+ StringBuffer parentOrgCode = new StringBuffer();
+ //2.获取同一公司的根节点
+ for(String str : map.values()){
+ String[] arrStr = str.split(",");
+ parentOrgCode.append(",").append(this.getMinLengthNode(arrStr));
+ }
+ return parentOrgCode.substring(1);
+ }
+
+ /**
+ * 获取同一公司中机构编码长度最小的机构
+ * @param str
+ * @return
+ */
+ private String getMinLengthNode(String[] str){
+ int min =str[0].length();
+ StringBuilder orgCodeBuilder = new StringBuilder(str[0]);
+ for(int i =1;i queryTreeByKeyWord(String keyWord) {
+// LambdaQueryWrapper query = new LambdaQueryWrapper();
+// query.eq(InstitutionArea::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
+// query.orderByAsc(InstitutionArea::getInstOrder);
+// List list = this.list(query);
+// // 调用wrapTreeDataToTreeList方法生成树状数据
+// List listResult = FindsInstChildrenUtil.wrapTreeDataToTreeList(list);
+// List treelist =new ArrayList<>();
+// if(StringUtils.isNotBlank(keyWord)){
+// this.getTreeByKeyWord(keyWord,listResult,treelist);
+// }else{
+// return listResult;
+// }
+// return treelist;
+// }
+
+ /**
+ * 根据parentId查询机构树
+ * @param parentId
+ * @param ids 前端回显传递
+ * @param primaryKey 主键字段(id或者orgCode)
+ * @return
+ */
+ @Override
+ public List queryTreeListByPid(String parentId,String ids, String primaryKey) {
+ Consumer> square = i -> {
+ if (oConvertUtils.isNotEmpty(ids)) {
+ if (CommonConstant.DEPART_KEY_ORG_CODE.equals(primaryKey)) {
+ i.in(InstitutionArea::getOrgCode, ids.split(SymbolConstant.COMMA));
+ } else {
+ i.in(InstitutionArea::getId, ids.split(SymbolConstant.COMMA));
+ }
+ } else {
+ if(oConvertUtils.isEmpty(parentId)){
+ i.and(q->q.isNull(true,InstitutionArea::getParentId).or().eq(true,InstitutionArea::getParentId,""));
+ }else{
+ i.eq(true,InstitutionArea::getParentId,parentId);
+ }
+ }
+ };
+ LambdaQueryWrapper lqw=new LambdaQueryWrapper<>();
+ //------------------------------------------------------------------------------------------------
+ //是否开启系统管理模块的 SASS 控制
+ if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
+ lqw.eq(InstitutionArea::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));
+ }
+ //------------------------------------------------------------------------------------------------
+ lqw.eq(true,InstitutionArea::getDelFlag,CommonConstant.DEL_FLAG_0.toString());
+ lqw.func(square);
+ //update-begin---author:wangshuai ---date:20220527 for:[VUEN-1143]排序不对,vue3和2应该都有问题,应该按照升序排------------
+ lqw.orderByAsc(InstitutionArea::getInstOrder);
+ //update-end---author:wangshuai ---date:20220527 for:[VUEN-1143]排序不对,vue3和2应该都有问题,应该按照升序排--------------
+ List list = list(lqw);
+ //update-begin---author:wangshuai ---date:20220316 for:[JTC-119]在机构管理菜单下设置机构负责人 创建用户的时候不需要处理
+
+ //update-end---author:wangshuai ---date:20220316 for:[JTC-119]在机构管理菜单下设置机构负责人 创建用户的时候不需要处理
+ List records = new ArrayList<>();
+ for (int i = 0; i < list.size(); i++) {
+ InstitutionArea depart = list.get(i);
+ InstitutionAreaTreeModel treeModel = new InstitutionAreaTreeModel(depart);
+ //TODO 异步树加载key拼接__+时间戳,以便于每次展开节点会刷新数据
+ //treeModel.setKey(treeModel.getKey()+"__"+System.currentTimeMillis());
+ records.add(treeModel);
+ }
+ return records;
+ }
+
+ @Override
+ public JSONObject queryAllParentIdByInstId(String instId) {
+ JSONObject result = new JSONObject();
+ for (String id : instId.split(SymbolConstant.COMMA)) {
+ JSONObject all = this.queryAllParentId("id", id);
+ result.put(id, all);
+ }
+ return result;
+ }
+
+ @Override
+ public JSONObject queryAllParentIdByOrgCode(String orgCode) {
+ JSONObject result = new JSONObject();
+ for (String code : orgCode.split(SymbolConstant.COMMA)) {
+ JSONObject all = this.queryAllParentId("org_code", code);
+ result.put(code, all);
+ }
+ return result;
+ }
+
+ /**
+ * 查询某个机构的所有父ID信息
+ *
+ * @param fieldName 字段名
+ * @param value 值
+ */
+ private JSONObject queryAllParentId(String fieldName, String value) {
+ JSONObject data = new JSONObject();
+ // 父ID集合,有序
+ data.put("parentIds", new JSONArray());
+ // 父ID的机构数据,key是id,value是数据
+ data.put("parentMap", new JSONObject());
+ this.queryAllParentIdRecursion(fieldName, value, data);
+ return data;
+ }
+
+ /**
+ * 递归调用查询父机构接口
+ */
+ private void queryAllParentIdRecursion(String fieldName, String value, JSONObject data) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq(fieldName, value);
+ InstitutionArea depart = super.getOne(queryWrapper);
+ if (depart != null) {
+ data.getJSONArray("parentIds").add(0, depart.getId());
+ data.getJSONObject("parentMap").put(depart.getId(), depart);
+ if (oConvertUtils.isNotEmpty(depart.getParentId())) {
+ this.queryAllParentIdRecursion("id", depart.getParentId(), data);
+ }
+ }
+ }
+
+ @Override
+ public InstitutionArea queryInstByOrgCode(String orgCode) {
+ int length = YouBianCodeUtil.ZHANWEI_LENGTH;
+ String compyOrgCode = orgCode.substring(0,length);
+ return this.baseMapper.queryInstByOrgCode(compyOrgCode);
+ }
+ /**
+ * 根据id查询下级机构
+ * @param pid
+ * @return
+ */
+ @Override
+ public List queryInstByPid(String pid) {
+ return this.baseMapper.queryInstByPid(pid);
+ }
+ /**
+ * 根据关键字筛选机构信息
+ * @param keyWord
+ * @return
+ */
+ public void getTreeByKeyWord(String keyWord,List allResult,List newResult){
+ for (InstitutionAreaTreeModel model:allResult) {
+ if (model.getInstName().contains(keyWord)){
+ newResult.add(model);
+ continue;
+ }else if(model.getChildren()!=null){
+ getTreeByKeyWord(keyWord,model.getChildren(),newResult);
+ }
+ }
+ }
+
+ @Override
+ public void deleteInst(String id) {
+ //删除机构设置父级的叶子结点
+ this.setIzLeaf(id);
+ this.delete(id);
+ }
+
+ @Override
+ public List queryBookInstTreeSync(String parentId, Integer tenantId, String instName) {
+ List list = baseMapper.queryBookInstTreeSync(parentId,tenantId,instName);
+ List records = new ArrayList<>();
+ for (int i = 0; i < list.size(); i++) {
+ InstitutionArea depart = list.get(i);
+ InstitutionAreaTreeModel treeModel = new InstitutionAreaTreeModel(depart);
+ records.add(treeModel);
+ }
+ return records;
+ }
+
+ @Override
+ public InstitutionArea getInstById(String id) {
+ return baseMapper.getInstById(id);
+ }
+
+ @Override
+ public IPage getMaxCodeInst(Page page, String parentId) {
+ return page.setRecords(baseMapper.getMaxCodeInst(page,parentId));
+ }
+
+ @Override
+ public void updateIzLeaf(String id, Integer izLeaf) {
+ baseMapper.setMainLeaf(id,izLeaf);
+ }
+
+ /**
+ * 设置父级节点是否存在叶子结点
+ * @param id
+ */
+ private void setIzLeaf(String id) {
+ InstitutionArea inst = this.getInstById(id);
+ String parentId = inst.getParentId();
+ if(oConvertUtils.isNotEmpty(parentId)){
+ Long count = this.count(new QueryWrapper().lambda().eq(InstitutionArea::getParentId, parentId));
+ if(count == 1){
+ //若父节点无其他子节点,则该父节点是叶子节点
+ baseMapper.setMainLeaf(parentId, CommonConstant.IS_LEAF);
+ }
+ }
+ }
+
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/utils/FindOrgCodeUtil.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/utils/FindOrgCodeUtil.java
new file mode 100644
index 0000000..c8e68f3
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/utils/FindOrgCodeUtil.java
@@ -0,0 +1,180 @@
+package com.nu.modules.institution.utils;
+
+import io.netty.util.internal.StringUtil;
+import org.jeecg.common.util.oConvertUtils;
+
+/**
+ * 流水号生成规则(按默认规则递增,数字从1-999开始递增,数字到999,递增字母;位数不够增加位数)
+ * A001
+ * A001A002
+ * @Author 曹磊
+ *
+ */
+public class FindOrgCodeUtil {
+
+ // 数字位数(默认生成3位的数字)
+
+ /**代表数字位数*/
+ private static final int NUM_LENGTH = 3;
+
+ public static final int ZHANWEI_LENGTH = 1+ NUM_LENGTH;
+
+ public static final char LETTER= 'Z';
+
+ /**
+ * 根据前一个code,获取同级下一个code
+ * 例如:当前最大code为A001A004,下一个code为:A001A005
+ *
+ * @param code
+ * @return
+ */
+ public static synchronized String getNextOrgCode(String code) {
+ String newcode = "";
+ if (oConvertUtils.isEmpty(code)) {
+ String zimu = "A";
+ String num = getStrNum(1);
+ newcode = zimu + num;
+ } else {
+ String beforeCode = code.substring(0, code.length() - 1- NUM_LENGTH);
+ String afterCode = code.substring(code.length() - 1 - NUM_LENGTH,code.length());
+ char afterCodeZimu = afterCode.substring(0, 1).charAt(0);
+ Integer afterCodeNum = Integer.parseInt(afterCode.substring(1));
+
+ String nextNum = "";
+ char nextZimu = 'A';
+ // 先判断数字等于999*,则计数从1重新开始,递增
+ if (afterCodeNum == getMaxNumByLength(NUM_LENGTH)) {
+ nextNum = getNextStrNum(0);
+ } else {
+ nextNum = getNextStrNum(afterCodeNum);
+ }
+ // 先判断数字等于999*,则字母从A重新开始,递增
+ if(afterCodeNum == getMaxNumByLength(NUM_LENGTH)) {
+ nextZimu = getNextZiMu(afterCodeZimu);
+ }else{
+ nextZimu = afterCodeZimu;
+ }
+
+ // 例如Z99,下一个code就是Z99A01
+ if (LETTER == afterCodeZimu && getMaxNumByLength(NUM_LENGTH) == afterCodeNum) {
+ newcode = code + (nextZimu + nextNum);
+ } else {
+ newcode = beforeCode + (nextZimu + nextNum);
+ }
+ }
+ return newcode;
+ }
+
+ /**
+ * 根据父亲code,获取下级的下一个code
+ *
+ * 例如:父亲CODE:A001
+ * 当前CODE:A001B003
+ * 获取的code:A001B004
+ *
+ * @param parentCode 上级code
+ * @param localCode 同级code
+ * @return
+ */
+ public static synchronized String getSubOrgCode(String parentCode,String localCode) {
+ if(localCode!=null && localCode!=""){
+
+ return getNextOrgCode(localCode);
+
+ }else{
+ parentCode = parentCode + "A"+ getNextStrNum(0);
+ }
+ return parentCode;
+ }
+
+
+
+ /**
+ * 将数字前面位数补零
+ *
+ * @param num
+ * @return
+ */
+ private static String getNextStrNum(int num) {
+ return getStrNum(getNextNum(num));
+ }
+
+ /**
+ * 将数字前面位数补零
+ *
+ * @param num
+ * @return
+ */
+ private static String getStrNum(int num) {
+ String s = String.format("%0" + NUM_LENGTH + "d", num);
+ return s;
+ }
+
+ /**
+ * 递增获取下个数字
+ *
+ * @param num
+ * @return
+ */
+ private static int getNextNum(int num) {
+ num++;
+ return num;
+ }
+
+ /**
+ * 递增获取下个字母
+ *
+ * @param zimu
+ * @return
+ */
+ private static char getNextZiMu(char zimu) {
+ if (zimu == LETTER) {
+ return 'A';
+ }
+ zimu++;
+ return zimu;
+ }
+
+ /**
+ * 根据数字位数获取最大值
+ * @param length
+ * @return
+ */
+ private static int getMaxNumByLength(int length){
+ if(length==0){
+ return 0;
+ }
+ StringBuilder maxNum = new StringBuilder();
+ for (int i=0;i
+ * 对应机构的表,处理并查找树级数据
+ *
+ *
+ * @Author: 曹磊
+ * @Date: 2025-03-25
+ */
+public class FindsInstChildrenUtil {
+
+ /**
+ * queryTreeList的子方法 ====1=====
+ * 该方法是s将InstitutionArea类型的list集合转换成InstitutionAreaTreeModel类型的集合
+ */
+ public static List wrapTreeDataToTreeList(List recordList) {
+ List idList = new ArrayList();
+ List records = new ArrayList<>();
+ for (int i = 0; i < recordList.size(); i++) {
+ InstitutionArea inst = recordList.get(i);
+ records.add(new InstitutionAreaTreeModel(inst));
+ }
+ List tree = findChildren(records, idList);
+ setEmptyChildrenAsNull(tree);
+ return tree;
+ }
+
+ /**
+ * 获取 InstitutionAreaIdModel
+ * @param recordList
+ * @return
+ */
+ public static List wrapTreeDataToInstIdTreeList(List recordList) {
+ List idList = new ArrayList();
+ List records = new ArrayList<>();
+ for (int i = 0; i < recordList.size(); i++) {
+ InstitutionArea inst = recordList.get(i);
+ records.add(new InstitutionAreaTreeModel(inst));
+ }
+ findChildren(records, idList);
+ return idList;
+ }
+
+ /**
+ * queryTreeList的子方法 ====2=====
+ * 该方法是找到并封装顶级父类的节点到TreeList集合
+ */
+ private static List findChildren(List recordList, List instIdList) {
+ List treeList = new ArrayList<>();
+ for (int i = 0; i < recordList.size(); i++) {
+ InstitutionAreaTreeModel branch = recordList.get(i);
+ if (oConvertUtils.isEmpty(branch.getParentId())) {
+ treeList.add(branch);
+ InstitutionAreaIdModel InstitutionAreaIdModel = new InstitutionAreaIdModel().convert(branch);
+ instIdList.add(InstitutionAreaIdModel);
+ }
+ }
+ getGrandChildren(treeList,recordList,instIdList);
+ return treeList;
+ }
+
+ /**
+ * queryTreeList的子方法====3====
+ *该方法是找到顶级父类下的所有子节点集合并封装到TreeList集合
+ */
+ private static void getGrandChildren(List treeList,List recordList,List idList) {
+ for (int i = 0; i < treeList.size(); i++) {
+ InstitutionAreaTreeModel model = treeList.get(i);
+ InstitutionAreaIdModel idModel = idList.get(i);
+ for (int i1 = 0; i1 < recordList.size(); i1++) {
+ InstitutionAreaTreeModel m = recordList.get(i1);
+ if (m.getParentId()!=null && m.getParentId().equals(model.getId())) {
+ model.getChildren().add(m);
+ InstitutionAreaIdModel dim = new InstitutionAreaIdModel().convert(m);
+ idModel.getChildren().add(dim);
+ }
+ }
+ getGrandChildren(treeList.get(i).getChildren(), recordList, idList.get(i).getChildren());
+ }
+ }
+
+ /**
+ * queryTreeList的子方法 ====4====
+ * 该方法是将子节点为空的List集合设置为Null值
+ */
+ private static void setEmptyChildrenAsNull(List treeList) {
+
+ for (int i = 0; i < treeList.size(); i++) {
+ InstitutionAreaTreeModel model = treeList.get(i);
+ if (model.getChildren().size() == 0) {
+ model.setChildren(null);
+ model.setIsLeaf(true);
+ }else{
+ setEmptyChildrenAsNull(model.getChildren());
+ model.setIsLeaf(false);
+ }
+ }
+ }
+}
diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/utils/OrgCodeRule.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/utils/OrgCodeRule.java
new file mode 100644
index 0000000..b85f307
--- /dev/null
+++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/institution/utils/OrgCodeRule.java
@@ -0,0 +1,78 @@
+package com.nu.modules.institution.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nu.modules.institution.entity.InstitutionArea;
+import com.nu.modules.institution.service.impl.InstitutionAreaServiceImpl;
+import io.netty.util.internal.StringUtil;
+import org.jeecg.common.util.SpringContextUtils;
+import java.util.List;
+
+/**
+ * @Author scott
+ * @Date 2019/12/9 11:33
+ * @Description: 机构编码生成规则
+ */
+public class OrgCodeRule{
+
+ public static String[] getOrgCode(JSONObject params) {
+ InstitutionAreaServiceImpl institutionAreaService = (InstitutionAreaServiceImpl) SpringContextUtils.getBean("institutionAreaServiceImpl");
+
+ String[] strArray = new String[2];
+ //定义机构类型
+ String orgType = "";
+ // 定义新编码字符串
+ String newOrgCode = "";
+ // 定义旧编码字符串
+ String oldOrgCode = "";
+ String parentId = null;
+ Object obj = params.get("parentId");
+ if (obj != null) {
+ parentId = obj.toString();
+ }
+ //如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回
+ if (StringUtil.isNullOrEmpty(parentId)) {
+ // 线判断数据库中的表是否为空,空则直接返回初始编码
+ //获取最大值code的机构信息
+ Page page = new Page<>(1,1);
+ IPage pageList = institutionAreaService.getMaxCodeInst(page,"");
+ List records = pageList.getRecords();
+ if (null==records || records.size()==0) {
+ strArray[0] = FindOrgCodeUtil.getNextOrgCode(null);
+ strArray[1] = "1";
+ return strArray;
+ } else {
+ InstitutionArea depart = records.get(0);
+ oldOrgCode = depart.getOrgCode();
+ orgType = depart.getOrgType();
+ newOrgCode = FindOrgCodeUtil.getNextOrgCode(oldOrgCode);
+ }
+ } else {//反之则查询出所有同级的机构,获取结果后有两种情况,有同级和没有同级
+ //获取自己机构最大值orgCode机构信息
+ Page page = new Page<>(1,1);
+ IPage pageList = institutionAreaService.getMaxCodeInst(page,parentId);
+ List records = pageList.getRecords();
+ // 查询出父级机构
+ InstitutionArea depart = institutionAreaService.getInstById(parentId);
+ // 获取父级机构的Code
+ String parentCode = depart.getOrgCode();
+ // 根据父级机构类型算出当前机构的类型
+ orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1);
+ // 处理同级机构为null的情况
+ if (null == records || records.size()==0) {
+ // 直接生成当前的机构编码并返回
+ newOrgCode = FindOrgCodeUtil.getSubOrgCode(parentCode, null);
+ } else { //处理有同级机构的情况
+ // 获取同级机构的编码,利用工具类
+ String subCode = records.get(0).getOrgCode();
+ // 返回生成的当前机构编码
+ newOrgCode = FindOrgCodeUtil.getSubOrgCode(parentCode, subCode);
+ }
+ }
+ // 返回最终封装了机构编码和机构类型的数组
+ strArray[0] = newOrgCode;
+ strArray[1] = orgType;
+ return strArray;
+ }
+}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/enums/ApiEnum.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/enums/ApiEnum.java
index 7e99f87..3ec8a4c 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/enums/ApiEnum.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/enums/ApiEnum.java
@@ -50,6 +50,7 @@ public enum ApiEnum {
IPC_SEARCH_VIDEO("/tums/playback/v3/searchVideo","搜索当天的录像数据V3"),
IPC_ADD_PLAYBACK_CHN("/tums/playback/v2/addPlaybackChn","添加回放通道V2"),
IPC_GET_MULTITRANS_URL("/tums/playback/v1/getMultitransUrl","获取nvmp设备双向通信URL"),
+ /** =================>暂时无用 **/
IPC_GET_RECORD_CFGS("/tums/record/v1/getRecordCfgs","获取录像配置"),
IPC_SET_RECORD_CFGS("/tums/record/v1/setRecordCfgs","设置录像计划"),
IPC_GET_BATCH_PROGRESS("/tums/record/v1/getBatchProgress","获取批量操作录像计划进度"),
@@ -62,6 +63,7 @@ public enum ApiEnum {
IPC_MODIFY_TOUR("/tums/ptz/v1/modifyTour","修改高速球机的巡航点配置"),
IPC_EXECUTE_TOUR("/tums/ptz/v1/executeTour","操作高速球机的巡航点"),
IPC_DELETE_TOUR("/tums/ptz/v1/deleteTour","删除高速球机巡航点"),
+ /** <==================暂时无用 **/
IPC_UPLOAD_TO_SERVER("/tums/playback/v1/uploadToServer","回放视频转mp4上传"),
IPC_STOP_UPLOAD_TO_SERVER("/tums/preview/v1/stopUploadToServer","停止转存MP4上传任务"),
IPC_GET_UPLOAD_TO_SERVER_PROCESS("/tums/preview/v1/getUploadToServerProcess","获取转存MP4上传任务进度");
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/entity/ProjectInfo.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/entity/ProjectInfo.java
index 69358fc..2f9be9d 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/entity/ProjectInfo.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/entity/ProjectInfo.java
@@ -47,8 +47,8 @@ public class ProjectInfo implements Serializable {
/**机构ID*/
@Excel(name = "机构ID", width = 15)
@ApiModelProperty(value = "机构ID")
- @Dict(dicCode = "id" , dictTable = "sys_depart" , dicText = "depart_name")
- private String institutionalId;
+ @Dict(dicCode = "id" , dictTable = "nu_admin_institution_area" , dicText = "inst_name")
+ private String institutionId;
/**创建时间戳,单位秒*/
@ApiModelProperty(value = "创建时间戳,单位秒")
private String createTime;
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/mapper/xml/ProjectInfoMapper.xml b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/mapper/xml/ProjectInfoMapper.xml
index 182e51f..aeef443 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/mapper/xml/ProjectInfoMapper.xml
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/mapper/xml/ProjectInfoMapper.xml
@@ -7,7 +7,7 @@
select id,
project_id as projectId,
project_name as projectName,
- institutional_id as institutionalId,
+ institution_id as institutionId,
create_time as createTime,
device_num as deviceNum,
message_num as messageNum,
@@ -31,7 +31,7 @@
select id,
project_id as projectId,
project_name as projectName,
- institutional_id as institutionalId,
+ institution_id as institutionId,
create_time as createTime,
device_num as deviceNum,
message_num as messageNum,
@@ -60,7 +60,7 @@
select id,
project_id as projectId,
project_name as projectName,
- institutional_id as institutionalId,
+ institution_id as institutionId,
create_time as createTime,
DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d %H:%i:%s') as createTimeStr,
device_num as deviceNum,
@@ -85,7 +85,7 @@
insert into nu_iot_tplink_project(project_id,
project_name,
- institutional_id,
+ institution_id,
create_time,
device_num,
message_num,
@@ -104,7 +104,7 @@
iz_leaf)
values (#{projectId},
#{projectName},
- #{institutionalId},
+ #{institutionId},
#{createTime},
#{deviceNum},
#{messageNum},
@@ -129,8 +129,8 @@
project_name = #{projectName},
-
- institutional_id = #{institutionalId},
+
+ institution_id = #{institutionId},
create_time = #{createTime},
@@ -179,7 +179,7 @@
update nu_iot_tplink_project
set project_id = #{projectId},
project_name = #{projectName},
- institutional_id = #{institutionalId},
+ institution_id = #{institutionId},
create_time = #{createTime},
device_num = #{deviceNum},
message_num = #{messageNum},
@@ -214,7 +214,7 @@
select id,
project_id as projectId,
project_name as projectName,
- institutional_id as institutionalId,
+ institution_id as institutionId,
create_time as createTime,
DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d %H:%i:%s') as createTimeStr,
device_num as deviceNum,
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/model/ProjectTreeModel.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/model/ProjectTreeModel.java
index e64fb56..0ea043f 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/model/ProjectTreeModel.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/project/model/ProjectTreeModel.java
@@ -39,7 +39,7 @@ public class ProjectTreeModel implements Serializable{
private String projectName;
- private String institutionalId;
+ private String institutionId;
private String createTimeStr;
@@ -72,7 +72,7 @@ public class ProjectTreeModel implements Serializable{
this.id = "0";
this.projectId = projectInfo.getProjectId();
this.projectName = projectInfo.getProjectName();
- this.institutionalId = projectInfo.getInstitutionalId();
+ this.institutionId = projectInfo.getInstitutionId();
this.createTimeStr = projectInfo.getCreateTimeStr();
this.deviceNum = projectInfo.getDeviceNum();
this.offlineNum = projectInfo.getOfflineNum();
@@ -167,12 +167,12 @@ public class ProjectTreeModel implements Serializable{
this.projectName = projectName;
}
- public String getInstitutionalId() {
- return institutionalId;
+ public String getInstitutionId() {
+ return institutionId;
}
- public void setInstitutionalId(String institutionalId) {
- this.institutionalId = institutionalId;
+ public void setInstitutionId(String institutionId) {
+ this.institutionId = institutionId;
}
public String getCreateTimeStr() {
@@ -254,7 +254,7 @@ public class ProjectTreeModel implements Serializable{
return Objects.equals(id, model.id) &&
Objects.equals(projectId, model.projectId) &&
Objects.equals(projectName, model.projectName) &&
- Objects.equals(institutionalId, model.institutionalId) &&
+ Objects.equals(institutionId, model.institutionId) &&
Objects.equals(createTimeStr, model.createTimeStr) &&
Objects.equals(deviceNum, model.deviceNum) &&
Objects.equals(offlineNum, model.offlineNum) &&
@@ -271,7 +271,7 @@ public class ProjectTreeModel implements Serializable{
*/
@Override
public int hashCode() {
- return Objects.hash(id, projectId, projectName, institutionalId, createTimeStr, deviceNum ,offlineNum ,abnormalNum ,runningTimeStr ,status ,order, sort, children);
+ return Objects.hash(id, projectId, projectName, institutionId, createTimeStr, deviceNum ,offlineNum ,abnormalNum ,runningTimeStr ,status ,order, sort, children);
}
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/entity/RegionInfo.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/entity/RegionInfo.java
index fb7e516..f87abd7 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/entity/RegionInfo.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/entity/RegionInfo.java
@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.io.Serializable;
@@ -40,6 +41,15 @@ public class RegionInfo implements Serializable {
@Excel(name = "分组名称", width = 15)
@ApiModelProperty(value = "分组名称")
private String regionName;
+ /**机构ID*/
+ @Excel(name = "区域ID", width = 15)
+ @ApiModelProperty(value = "区域ID")
+ @Dict(dicCode = "id" , dictTable = "nu_admin_institution_area" , dicText = "inst_name")
+ private String areaId;
+ @Excel(name = "机构ID", width = 15)
+ @ApiModelProperty(value = "机构ID")
+ @Dict(dicCode = "id" , dictTable = "nu_admin_institution_area" , dicText = "inst_name")
+ private String institutionId;
/**分组层级*/
@Excel(name = "分组层级", width = 15)
@ApiModelProperty(value = "分组层级")
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/RegionInfoMapper.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/RegionInfoMapper.java
index e018a04..c170639 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/RegionInfoMapper.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/RegionInfoMapper.java
@@ -20,6 +20,8 @@ public interface RegionInfoMapper extends BaseMapper {
IPage findPage(Page page, @Param("params") RegionInfo regionInfo);
int add(Map map);
int updateById(Map map);
+ int updateByRegionId(Map map);
+ int findChildrenCount(String regionId);
int deleteByRegionId(String regionId);
List queryTreeListByPid(String parentId,String projectId);
}
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/xml/RegionInfoMapper.xml b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/xml/RegionInfoMapper.xml
index 9291754..23fcb8b 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/xml/RegionInfoMapper.xml
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/mapper/xml/RegionInfoMapper.xml
@@ -6,6 +6,7 @@
select a.id,
a.region_id as regionId,
a.region_name as regionName,
+ a.area_id as areaId,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
@@ -28,6 +29,8 @@
select a.id,
a.region_id as regionId,
a.region_name as regionName,
+ (case a.region_level when '1' then b.institution_id else p.area_id end) as institutionId,
+ a.area_id as areaId,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
@@ -56,6 +59,8 @@
select a.id,
a.region_id as regionId,
a.region_name as regionName,
+ (case a.region_level when '1' then b.institution_id else p.area_id end) as institutionId,
+ a.area_id as areaId,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
@@ -82,62 +87,171 @@
insert into nu_iot_tplink_region(
- region_id,
region_name,
+ area_id,
region_level,
sort,
parent_id,
project_id,
sys_type,
stream_way,
- has_children,
+
+ has_children,
+
region_type,
- update_time,
- media_server_id,
- backup_media_server_id,
- bind_type,
- iz_leaf
+
+ update_time,
+
+
+ media_server_id,
+
+
+ backup_media_server_id,
+
+
+ bind_type,
+
+
+ iz_leaf,
+
+ region_id
)
values(
- #{regionId},
#{regionName},
+ #{areaId},
#{regionLevel},
#{sort},
#{parentId},
#{projectId},
#{sysType},
#{streamWay},
- #{hasChildren},
+
+ #{hasChildren},
+
#{regionType},
- #{updateTime},
- #{mediaServerId},
- #{backupMediaServerId},
- #{bindType},
- #{izLeaf}
+
+ #{updateTime},
+
+
+ #{mediaServerId},
+
+
+ #{backupMediaServerId},
+
+
+ #{bindType},
+
+
+ #{izLeaf},
+
+ #{regionId}
)
update nu_iot_tplink_region
- set
- region_id = #{regionId},
- region_name = #{regionName},
- region_level = #{regionLevel},
- sort = #{sort},
- parent_id = #{parentId},
- project_id = #{projectId},
- sys_type = #{sysType},
- stream_way = #{streamWay},
- has_children = #{hasChildren},
- region_type = #{regionType},
- update_time = #{updateTime},
- media_server_id = #{mediaServerId},
- backup_media_server_id = #{backupMediaServerId},
- bind_type = #{bindType},
- iz_leaf = #{izLeaf}
+ set region_name = #{regionName},
+
+ area_id = #{areaId},
+
+
+ region_level = #{regionLevel},
+
+
+ sort = #{sort},
+
+
+ parent_id = #{parentId},
+
+
+ project_id = #{projectId},
+
+
+ sys_type = #{sysType},
+
+
+ stream_way = #{streamWay},
+
+
+ has_children = #{hasChildren},
+
+
+ region_type = #{regionType},
+
+
+ update_time = #{updateTime},
+
+
+ media_server_id = #{mediaServerId},
+
+
+ backup_media_server_id = #{backupMediaServerId},
+
+
+ bind_type = #{bindType},
+
+
+ iz_leaf = #{izLeaf},
+
+ region_id = #{regionId}
where id = #{id}
+
+ update nu_iot_tplink_region
+ set
+
+ area_id = #{areaId},
+
+
+ region_level = #{regionLevel},
+
+
+ sort = #{sort},
+
+
+ parent_id = #{parentId},
+
+
+ project_id = #{projectId},
+
+
+ sys_type = #{sysType},
+
+
+ stream_way = #{streamWay},
+
+
+ has_children = #{hasChildren},
+
+
+ region_type = #{regionType},
+
+
+ update_time = #{updateTime},
+
+
+ media_server_id = #{mediaServerId},
+
+
+ backup_media_server_id = #{backupMediaServerId},
+
+
+ bind_type = #{bindType},
+
+
+ iz_leaf = #{izLeaf},
+
+ region_name = #{regionName}
+ where region_id = #{regionId}
+
+
+
+
delete from nu_iot_tplink_region where region_id = #{regionId}
@@ -146,6 +260,8 @@
select a.id,
a.region_id as regionId,
a.region_name as regionName,
+ (case a.region_level when '1' then b.institution_id else p.area_id end) as institutionId,
+ a.area_id as areaId,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
@@ -156,7 +272,7 @@
a.stream_way as streamWay,
a.has_children as hasChildren,
a.region_type as regionType,
- a.update_time as updateTime,
+ DATE_FORMAT(FROM_UNIXTIME(a.update_time/1000),'%Y-%m-%d %H:%i:%s') as updateTime,
a.media_server_id as mediaServerId,
a.backup_media_server_id as backupMediaServerId,
a.bind_type as bindType,
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/model/RegionTreeModel.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/model/RegionTreeModel.java
index 739b7a6..51e3e4a 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/model/RegionTreeModel.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/model/RegionTreeModel.java
@@ -38,6 +38,10 @@ public class RegionTreeModel implements Serializable{
private String regionName;
+ private String areaId;
+
+ private String institutionId;
+
private String regionLevel;
private String order;
@@ -83,6 +87,8 @@ public class RegionTreeModel implements Serializable{
this.id = regionInfo.getRegionId();
this.regionId = regionInfo.getRegionId();
this.regionName = regionInfo.getRegionName();
+ this.areaId = regionInfo.getAreaId();
+ this.institutionId = regionInfo.getInstitutionId();
this.regionLevel = regionInfo.getRegionLevel();
this.order = regionInfo.getOrder();
this.sort = regionInfo.getSort();
@@ -184,6 +190,22 @@ public class RegionTreeModel implements Serializable{
this.regionName = regionName;
}
+ public String getAreaId() {
+ return areaId;
+ }
+
+ public void setAreaId(String areaId) {
+ this.areaId = areaId;
+ }
+
+ public String getInstitutionId() {
+ return institutionId;
+ }
+
+ public void setInstitutionId(String institutionId) {
+ this.institutionId = institutionId;
+ }
+
public String getRegionLevel() {
return regionLevel;
}
@@ -319,6 +341,8 @@ public class RegionTreeModel implements Serializable{
return Objects.equals(id, model.id) &&
Objects.equals(regionId, model.regionId) &&
Objects.equals(regionName, model.regionName) &&
+ Objects.equals(areaId, model.areaId) &&
+ Objects.equals(institutionId, model.institutionId) &&
Objects.equals(regionLevel, model.regionLevel) &&
Objects.equals(order, model.order) &&
Objects.equals(sort, model.sort) &&
@@ -343,7 +367,7 @@ public class RegionTreeModel implements Serializable{
@Override
public int hashCode() {
- return Objects.hash(id, regionId, regionName, regionLevel, order,
+ return Objects.hash(id, regionId, regionName, areaId, institutionId, regionLevel, order,
sort, parentId, parentName, projectId, projectName, sysType, streamWay, hasChildren,
regionType, updateTime, mediaServerId, backupMediaServerId, bindType,
children);
diff --git a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/service/impl/RegionInfoServiceImpl.java b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/service/impl/RegionInfoServiceImpl.java
index 3597403..397abea 100644
--- a/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/service/impl/RegionInfoServiceImpl.java
+++ b/nursing-unit-iot/nu-iot-biz/src/main/java/com/nu/modules/tplink/region/service/impl/RegionInfoServiceImpl.java
@@ -91,7 +91,6 @@ public class RegionInfoServiceImpl extends ServiceImpl projectMap = new HashMap<>();
@@ -217,6 +216,14 @@ public class RegionInfoServiceImpl extends ServiceImpl map = new HashMap<>();
+ for (String key : result.keySet()) {
+ map.put(key, result.getStr(key));
+ }
+ map.put("sort", map.get("order"));
+ map.put("areaId", regionInfo.getAreaId());
+ baseMapper.add(map);
sync(regionInfo);
return Result.OK("分组添加成功!");
}else{
@@ -239,7 +246,12 @@ public class RegionInfoServiceImpl extends ServiceImpl map = new HashMap<>();
+ map.put("regionId",regionInfo.getRegionId());
+ map.put("regionName",regionInfo.getRegionName());
+ map.put("areaId",regionInfo.getAreaId());
+ baseMapper.updateByRegionId(map);
+ this.sync(regionInfo);
return Result.OK("分组编辑成功!");
}else{
return Result.error(jsonObject.getStr("msg"));
@@ -252,6 +264,10 @@ public class RegionInfoServiceImpl extends ServiceImpl deleteRegion(RegionInfo regionInfo){
+ int childrenCount = baseMapper.findChildrenCount(regionInfo.getRegionId());
+ if(childrenCount>0){
+ return Result.error("此分组存在子分组,请将子分组全部删除后再来删除此分组!");
+ }
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"regionId\"").append(":").append("\"").append(regionInfo.getRegionId()).append("\"");
@@ -259,7 +275,7 @@ public class RegionInfoServiceImpl extends ServiceImpl