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