Explorar o código

新增商户入驻,政策类别,信用人员优化接口,新增h5对外接口

tjf %!s(int64=3) %!d(string=hai) anos
pai
achega
0469b654b7
Modificáronse 20 ficheiros con 927 adicións e 65 borrados
  1. 32 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/ChinaAreaController.java
  2. 57 10
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/PolicyMenuController.java
  3. 61 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/h5/H5Controller.java
  4. 47 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
  5. 134 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/ChinaArea.java
  6. 14 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
  7. 28 2
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/PolicyMenu.java
  8. 1 2
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  9. 21 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChinaAreaMapper.java
  10. 7 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/CreditUserMapper.java
  11. 43 1
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/PolicyMenuMapper.java
  12. 18 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IChinaAreaService.java
  13. 7 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ICreditUserService.java
  14. 33 1
      ruoyi-system/src/main/java/com/ruoyi/system/service/IPolicyMenuService.java
  15. 130 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ChinaAreaServiceImpl.java
  16. 26 21
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CreditUserServiceImpl.java
  17. 201 22
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PolicyMenuServiceImpl.java
  18. 17 0
      ruoyi-system/src/main/resources/mapper/system/ChinaAreaMapper.xml
  19. 9 1
      ruoyi-system/src/main/resources/mapper/system/CreditUserMapper.xml
  20. 41 5
      ruoyi-system/src/main/resources/mapper/system/PolicyMenuMapper.xml

+ 32 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/ChinaAreaController.java

@@ -0,0 +1,32 @@
+package com.ruoyi.web.controller.business;
+
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.ChinaArea;
+import com.ruoyi.system.service.IChinaAreaService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:39
+ */
+@RestController
+@RequestMapping("/system/chinaArea")
+public class ChinaAreaController {
+
+    @Resource
+    private IChinaAreaService chinaAreaService;
+    /**
+     * 获取行政区域规划下拉树列表
+     */
+    @PostMapping("/treeSelect")
+    public AjaxResult treeSelect(@RequestBody ChinaArea chinaArea)
+    {
+        return chinaAreaService.selectChinaAreaList(chinaArea);
+    }
+}

+ 57 - 10
ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/PolicyMenuController.java

@@ -1,9 +1,13 @@
 package com.ruoyi.web.controller.business;
 
+import java.util.Iterator;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
-import com.ruoyi.system.domain.SettledMerchants;
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.utils.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -18,7 +22,7 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.system.domain.PolicyMenu;
+import com.ruoyi.common.core.domain.entity.PolicyMenu;
 import com.ruoyi.system.service.IPolicyMenuService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -41,22 +45,35 @@ public class PolicyMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:menu:list')")
     @GetMapping("/list")
-    public TableDataInfo list(PolicyMenu policyMenu)
+    public AjaxResult list(PolicyMenu policyMenu)
     {
-        startPage();
         List<PolicyMenu> list = policyMenuService.selectPolicyMenuList(policyMenu);
-        return getDataTable(list);
+        return AjaxResult.success(list);
     }
 
     /**
-     * 查询入驻商家列表全部
+     * 查询类别列表(排除节点)
+     * @param menuId
+     * @return
      */
-    @GetMapping("/listAll")
-    public AjaxResult listAll(PolicyMenu policyMenu)
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
+    @GetMapping("/list/exclude/{menuId}")
+    public AjaxResult excludeChild(@PathVariable(value = "menuId", required = false) Long menuId)
     {
-        List<PolicyMenu> list = policyMenuService.selectPolicyMenuList(policyMenu);
-        return AjaxResult.success(list);
+        List<PolicyMenu> menus = policyMenuService.selectPolicyMenuList(new PolicyMenu());
+        Iterator<PolicyMenu> it = menus.iterator();
+        while (it.hasNext())
+        {
+            PolicyMenu d = (PolicyMenu) it.next();
+            if (d.getMenuId().intValue() == menuId
+                    || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), menuId + ""))
+            {
+                it.remove();
+            }
+        }
+        return AjaxResult.success(menus);
     }
+
     /**
      * 导出政策类别列表
      */
@@ -88,6 +105,11 @@ public class PolicyMenuController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody PolicyMenu policyMenu)
     {
+        if (UserConstants.NOT_UNIQUE.equals(policyMenuService.checkMenuNameUnique(policyMenu)))
+        {
+            return AjaxResult.error("新增类别'" + policyMenu.getMenuName() + "'失败,类别名称已存在");
+        }
+        policyMenu.setCreateBy(getUsername());
         return toAjax(policyMenuService.insertPolicyMenu(policyMenu));
     }
 
@@ -99,6 +121,20 @@ public class PolicyMenuController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody PolicyMenu policyMenu)
     {
+
+        Long menuId = policyMenu.getMenuId();
+        if (UserConstants.NOT_UNIQUE.equals(policyMenuService.checkMenuNameUnique(policyMenu)))
+        {
+            return AjaxResult.error("修改类别'" + policyMenu.getMenuName() + "'失败,类别名称已存在");
+        }
+        else if (policyMenu.getParentId().equals(menuId))
+        {
+            return AjaxResult.error("修改类别'" + policyMenu.getMenuName() + "'失败,上级类别不能是自己");
+        }
+        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, policyMenu.getStatus()) && policyMenuService.selectNormalChildrenMenuById(menuId) > 0)
+        {
+            return AjaxResult.error("该部门包含未停用的子部门!");
+        }
         return toAjax(policyMenuService.updatePolicyMenu(policyMenu));
     }
 
@@ -112,4 +148,15 @@ public class PolicyMenuController extends BaseController
     {
         return toAjax(policyMenuService.deletePolicyMenuByMenuIds(menuIds));
     }
+
+
+    /**
+     * 获取政策类别下拉树列表
+     */
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(PolicyMenu policyMenu)
+    {
+        List<PolicyMenu> menus = policyMenuService.selectMenusList(policyMenu);
+        return AjaxResult.success(policyMenuService.buildMenuTreeSelect(menus));
+    }
 }

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/h5/H5Controller.java

@@ -0,0 +1,61 @@
+package com.ruoyi.web.controller.h5;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.domain.CreditUser;
+import com.ruoyi.common.core.domain.entity.PolicyMenu;
+import com.ruoyi.system.service.ICreditUserService;
+import com.ruoyi.system.service.IPolicyMenuService;
+import com.ruoyi.system.service.ISettledMerchantsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+/**
+ * 入驻商家Controller
+ * 
+ * @author boman
+ * @date 2022-06-10
+ */
+@RestController
+@RequestMapping("/system/h5")
+public class H5Controller extends BaseController
+{
+    @Autowired
+    private ISettledMerchantsService settledMerchantsService;
+
+    @Autowired
+    private IPolicyMenuService policyMenuService;
+
+    @Autowired
+    private ICreditUserService creditUserService;
+
+    /**
+     * 根据政策类别获取入驻商家详细信息
+     */
+    @GetMapping(value = "/menu/{menuId}")
+    public AjaxResult getInfoByMenuId(@PathVariable("menuId") Long menuId)
+    {
+        return AjaxResult.success(settledMerchantsService.selectSettledMerchantsByMenuId(menuId));
+    }
+
+
+    /**
+     * 查询入驻商家列表全部
+     */
+    @GetMapping("/policy/list")
+    public AjaxResult policyList(PolicyMenu policyMenu)
+    {
+        List<PolicyMenu> list = policyMenuService.selectPolicyMenuList(policyMenu);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 获取信用人员详细信息
+     */
+    @PostMapping(value = "/user/info")
+    public AjaxResult getInfo(@RequestBody CreditUser creditUser)
+    {
+        return AjaxResult.success(creditUserService.selectCreditUser(creditUser));
+    }
+}

+ 47 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java

@@ -0,0 +1,47 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 缓存的key 常量
+ * 
+ * @author ruoyi
+ */
+public class CacheConstants
+{
+    /**
+     * 令牌自定义标识
+     */
+    public static final String HEADER = "Authorization";
+
+    /**
+     * 令牌前缀
+     */
+    public static final String TOKEN_PREFIX = "Bearer ";
+
+    /**
+     * 权限缓存前缀
+     */
+    public final static String LOGIN_TOKEN_KEY = "login_tokens:";
+
+    /**
+     * 用户ID字段
+     */
+    public static final String DETAILS_USER_ID = "user_id";
+
+    /**
+     * 用户名字段
+     */
+    public static final String DETAILS_USERNAME = "username";
+
+    /**
+     * 授权信息字段
+     */
+    public static final String AUTHORIZATION_HEADER = "authorization";
+    /**
+     * 人员信息查询部门集合
+     */
+    public static final String DEPT_LIST = "dept_list_query";
+    /**
+     * 行政区域规划树形集合
+     */
+    public static final String CHINA_AREA = "china_area_list:";
+}

+ 134 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/ChinaArea.java

@@ -0,0 +1,134 @@
+package com.ruoyi.common.core.domain;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:41
+ */
+public class ChinaArea extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * id
+     */
+
+    private Long id;
+
+    /**
+     * 数据库字段id
+     */
+    private String areaId;
+
+    /**
+     * 上级ID,一级为0
+     */
+
+    private String pid;
+
+    /**
+     * 名称
+     */
+
+    private String name;
+
+    /**
+     * 层级
+     */
+
+    private Integer treeLevel;
+
+    /**
+     * 是否叶子节点  0:否   1:是
+     */
+
+    private Integer leaf;
+
+    /**
+     * 排序
+     */
+
+    private Long sort;
+
+    /** 子区域 */
+    private List<ChinaArea> children = new ArrayList<ChinaArea>();
+
+    public List<ChinaArea> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<ChinaArea> children) {
+        this.children = children;
+    }
+
+    public String getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(String areaId) {
+        this.areaId = areaId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getTreeLevel() {
+        return treeLevel;
+    }
+
+    public void setTreeLevel(Integer treeLevel) {
+        this.treeLevel = treeLevel;
+    }
+
+    public Integer getLeaf() {
+        return leaf;
+    }
+
+    public void setLeaf(Integer leaf) {
+        this.leaf = leaf;
+    }
+
+    public Long getSort() {
+        return sort;
+    }
+
+    public void setSort(Long sort) {
+        this.sort = sort;
+    }
+
+    @Override
+    public String toString() {
+        return "SysRegion{" +
+                "id=" + id +
+                ", pid=" + pid +
+                ", name='" + name + '\'' +
+                ", treeLevel=" + treeLevel +
+                ", leaf=" + leaf +
+                ", sort=" + sort +
+                '}';
+    }
+}

+ 14 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.List;
 import java.util.stream.Collectors;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.common.core.domain.entity.PolicyMenu;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 
@@ -45,6 +46,19 @@ public class TreeSelect implements Serializable
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
+    public TreeSelect(PolicyMenu policyMenu)
+    {
+        this.id = policyMenu.getMenuId();
+        this.label = policyMenu.getMenuName();
+        this.children = policyMenu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    public TreeSelect(ChinaArea chinaArea)
+    {
+        this.id = chinaArea.getId();
+        this.label = chinaArea.getName();
+        this.children = chinaArea.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
     public Long getId()
     {
         return id;

+ 28 - 2
ruoyi-system/src/main/java/com/ruoyi/system/domain/PolicyMenu.java → ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/PolicyMenu.java

@@ -1,10 +1,13 @@
-package com.ruoyi.system.domain;
+package com.ruoyi.common.core.domain.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 政策类别对象 policy_menu
  * 
@@ -44,8 +47,31 @@ public class PolicyMenu extends BaseEntity
     /** 缩略图 */
     @Excel(name = "缩略图")
     private String photo;
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /** 子菜单 */
+    private List<PolicyMenu> children = new ArrayList<PolicyMenu>();
+
+    public String getAncestors() {
+        return ancestors;
+    }
+
+    public void setAncestors(String ancestors) {
+        this.ancestors = ancestors;
+    }
+
+    public List<PolicyMenu> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<PolicyMenu> children) {
+        this.children = children;
+    }
 
-    public void setMenuId(Long menuId) 
+    public void setMenuId(Long menuId)
     {
         this.menuId = menuId;
     }

+ 1 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -112,8 +112,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/webjars/**").anonymous()
                 .antMatchers("/*/api-docs").anonymous()
                 .antMatchers("/druid/**").anonymous()
-                .antMatchers("/system/creditUser/**").anonymous()
-                .antMatchers("/system/merchants/**").anonymous()
+                .antMatchers("/system/h5/**").anonymous()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 21 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ChinaAreaMapper.java

@@ -0,0 +1,21 @@
+package com.ruoyi.system.mapper;
+
+
+import com.ruoyi.common.core.domain.ChinaArea;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:40
+ */
+@Mapper
+public interface ChinaAreaMapper {
+
+    /**
+     * 查询行政区域规划列表
+     * @return
+     */
+    List<ChinaArea> selectChinaAreaList(ChinaArea chinaArea);
+}

+ 7 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/CreditUserMapper.java

@@ -19,6 +19,13 @@ public interface CreditUserMapper
      */
     public CreditUser selectCreditUserById(Long id);
 
+    /**
+     * 查询信用人员
+     * @param creditUser
+     * @return
+     */
+    public CreditUser selectCreditUser(CreditUser creditUser);
+
     /**
      * 查询信用人员列表
      * 

+ 43 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/PolicyMenuMapper.java

@@ -1,7 +1,9 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
-import com.ruoyi.system.domain.PolicyMenu;
+import com.ruoyi.common.core.domain.entity.PolicyMenu;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 政策类别Mapper接口
@@ -58,4 +60,44 @@ public interface PolicyMenuMapper
      * @return 结果
      */
     public int deletePolicyMenuByMenuIds(Long[] menuIds);
+
+    /**
+     * 校验政策类别名称
+     * @param menuName
+     * @param parentId
+     * @return
+     */
+    public PolicyMenu checkMenuNameUnique(@Param("menuName") String menuName,@Param("parentId") Long parentId);
+
+    /**
+     * 根据ID查询所有子部门(正常状态)
+     *
+     * @param menuId 部门ID
+     * @return 子部门数
+     */
+    public int selectNormalChildrenMenuById(@Param("menuId") Long menuId);
+
+    /**
+     * 根据ID查询所有子类别
+     *
+     * @param menuId 类别ID
+     * @return 类别列表
+     */
+    public List<PolicyMenu> selectChildrenMenuById(@Param("menuId") Long menuId);
+
+    /**
+     * 更新所有子类别
+     * @param menus
+     * @return
+     */
+    public int updateMenuChildren(@Param("menus") List<PolicyMenu> menus);
+
+
+    /**
+     * 修改所在类别正常状态
+     *
+     * @param menuIds 类别ID组
+     */
+    public void updateMenuStatusNormal(Long[] menuIds);
+
 }

+ 18 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IChinaAreaService.java

@@ -0,0 +1,18 @@
+package com.ruoyi.system.service;
+
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.ChinaArea;
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:39
+ */
+public interface IChinaAreaService {
+    /**
+     * 查询行政区域规划列表
+     * @param chinaArea
+     * @return
+     */
+    public AjaxResult selectChinaAreaList(ChinaArea chinaArea);
+}

+ 7 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ICreditUserService.java

@@ -19,6 +19,13 @@ public interface ICreditUserService
      */
     public CreditUser selectCreditUserById(Long id);
 
+    /**
+     * 查询信用人员
+     * @param creditUser
+     * @return
+     */
+    public CreditUser selectCreditUser(CreditUser creditUser);
+
     /**
      * 查询信用人员列表
      * 

+ 33 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/IPolicyMenuService.java

@@ -1,7 +1,9 @@
 package com.ruoyi.system.service;
 
 import java.util.List;
-import com.ruoyi.system.domain.PolicyMenu;
+
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.PolicyMenu;
 
 /**
  * 政策类别Service接口
@@ -58,4 +60,34 @@ public interface IPolicyMenuService
      * @return 结果
      */
     public int deletePolicyMenuByMenuId(Long menuId);
+
+    /**
+     * 查询政策类别管理数据
+     * @param policyMenu
+     * @return
+     */
+    List<PolicyMenu>selectMenusList(PolicyMenu policyMenu);
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param policyMenu 政策类别列表
+     * @return 下拉树结构列表
+     */
+    List<TreeSelect>buildMenuTreeSelect(List<PolicyMenu> policyMenu);
+
+    /**
+     * 校验政策类别名称
+     * @param policyMenu
+     * @return
+     */
+    String checkMenuNameUnique(PolicyMenu policyMenu);
+
+    /**
+     * 根据ID查询所有子部门(正常状态)
+     *
+     * @param menuId 部门ID
+     * @return 子部门数
+     */
+    int selectNormalChildrenMenuById(Long menuId);
 }

+ 130 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ChinaAreaServiceImpl.java

@@ -0,0 +1,130 @@
+package com.ruoyi.system.service.impl;
+
+
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.core.domain.ChinaArea;
+import com.ruoyi.system.mapper.ChinaAreaMapper;
+import com.ruoyi.system.service.IChinaAreaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+/**
+ * @author tjf
+ * @Date: 2022/03/25/9:39
+ */
+@Service
+public class ChinaAreaServiceImpl implements IChinaAreaService {
+
+    @Autowired
+    private RedisCache redisService;
+
+    @Resource
+    private ChinaAreaMapper chinaAreaMapper;
+    /**
+     * 获取行政区域规划下拉树列表
+     * @param chinaArea
+     * @return
+     */
+    @Override
+    public AjaxResult selectChinaAreaList(ChinaArea chinaArea) {
+
+        //先去从redis获取
+        List<TreeSelect> treeSelects = redisService.getCacheList(CacheConstants.CHINA_AREA+chinaArea.getPid());
+        if (treeSelects != null && treeSelects.size() > 0){
+            System.out.println("从缓存中获取到区域集合");;
+            return AjaxResult.success(treeSelects);
+        }
+        List<ChinaArea> chinaAreas = chinaAreaMapper.selectChinaAreaList(chinaArea);
+        if (chinaAreas != null && chinaAreas.size() > 0){
+            System.out.println("从数据库中获取到行政区域集合");
+            redisService.setCacheList(CacheConstants.CHINA_AREA+chinaArea.getPid(),chinaAreas);
+        }
+        return AjaxResult.success(chinaAreas);
+    }
+
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param chinaAreaList 行政区域列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildChinaAreaTreeSelect(List<ChinaArea> chinaAreaList) {
+        List<ChinaArea> chinaAreaTrees = buildChinaAreaTree(chinaAreaList);
+        return chinaAreaTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param chinaAreaList 行政区域列表
+     * @return 树结构列表
+     */
+    public List<ChinaArea> buildChinaAreaTree(List<ChinaArea> chinaAreaList) {
+        List<ChinaArea> returnList = new ArrayList<ChinaArea>();
+        List<String> tempList = new ArrayList<String>();
+        for (ChinaArea chinaArea : chinaAreaList) {
+            tempList.add(chinaArea.getAreaId());
+        }
+        for (Iterator<ChinaArea> iterator = chinaAreaList.iterator(); iterator.hasNext(); ) {
+            ChinaArea chinaArea = (ChinaArea) iterator.next();
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(chinaArea.getPid())) {
+                recursionFn(chinaAreaList, chinaArea);
+                returnList.add(chinaArea);
+            }
+        }
+        if (returnList.isEmpty()) {
+            returnList = chinaAreaList;
+        }
+        return returnList;
+    }
+
+
+    /**
+     * 递归列表
+     */
+    private void recursionFn(List<ChinaArea> chinaAreaList, ChinaArea c) {
+        // 得到子节点列表
+        List<ChinaArea> childList = getChildList(chinaAreaList, c);
+        c.setChildren(childList);
+        for (ChinaArea chinaArea : chinaAreaList) {
+            if (hasChild(chinaAreaList, chinaArea)) {
+                recursionFn(chinaAreaList, chinaArea);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<ChinaArea> getChildList(List<ChinaArea> chinaAreaList, ChinaArea c) {
+        List<ChinaArea> tlist = new ArrayList<ChinaArea>();
+        Iterator<ChinaArea> it = chinaAreaList.iterator();
+        while (it.hasNext()) {
+            ChinaArea n = (ChinaArea) it.next();
+            if (StringUtils.isNotNull(n.getPid()) && n.getPid().equals(c.getAreaId())) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<ChinaArea> list, ChinaArea c) {
+        return getChildList(list, c).size() > 0;
+    }
+}

+ 26 - 21
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CreditUserServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 import java.util.List;
+
 import com.ruoyi.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -10,87 +11,91 @@ import com.ruoyi.system.service.ICreditUserService;
 
 /**
  * 信用人员Service业务层处理
- * 
+ *
  * @author boman
  * @date 2022-06-10
  */
 @Service
-public class CreditUserServiceImpl implements ICreditUserService 
-{
+public class CreditUserServiceImpl implements ICreditUserService {
     @Autowired
     private CreditUserMapper creditUserMapper;
 
     /**
      * 查询信用人员
-     * 
+     *
      * @param id 信用人员主键
      * @return 信用人员
      */
     @Override
-    public CreditUser selectCreditUserById(Long id)
-    {
+    public CreditUser selectCreditUserById(Long id) {
         return creditUserMapper.selectCreditUserById(id);
     }
 
+    /**
+     * 查询信用人员
+     *
+     * @param creditUser
+     * @return
+     */
+    @Override
+    public CreditUser selectCreditUser(CreditUser creditUser) {
+        return creditUserMapper.selectCreditUser(creditUser);
+    }
+
     /**
      * 查询信用人员列表
-     * 
+     *
      * @param creditUser 信用人员
      * @return 信用人员
      */
     @Override
-    public List<CreditUser> selectCreditUserList(CreditUser creditUser)
-    {
+    public List<CreditUser> selectCreditUserList(CreditUser creditUser) {
         return creditUserMapper.selectCreditUserList(creditUser);
     }
 
     /**
      * 新增信用人员
-     * 
+     *
      * @param creditUser 信用人员
      * @return 结果
      */
     @Override
-    public int insertCreditUser(CreditUser creditUser)
-    {
+    public int insertCreditUser(CreditUser creditUser) {
         creditUser.setCreateTime(DateUtils.getNowDate());
         return creditUserMapper.insertCreditUser(creditUser);
     }
 
     /**
      * 修改信用人员
-     * 
+     *
      * @param creditUser 信用人员
      * @return 结果
      */
     @Override
-    public int updateCreditUser(CreditUser creditUser)
-    {
+    public int updateCreditUser(CreditUser creditUser) {
         creditUser.setUpdateTime(DateUtils.getNowDate());
         return creditUserMapper.updateCreditUser(creditUser);
     }
 
     /**
      * 批量删除信用人员
-     * 
+     *
      * @param ids 需要删除的信用人员主键
      * @return 结果
      */
     @Override
-    public int deleteCreditUserByIds(Long[] ids)
-    {
+    public int deleteCreditUserByIds(Long[] ids) {
         return creditUserMapper.deleteCreditUserByIds(ids);
     }
 
     /**
      * 删除信用人员信息
-     * 
+     *
      * @param id 信用人员主键
      * @return 结果
      */
     @Override
-    public int deleteCreditUserById(Long id)
-    {
+    public int deleteCreditUserById(Long id) {
         return creditUserMapper.deleteCreditUserById(id);
     }
 }

+ 201 - 22
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PolicyMenuServiceImpl.java

@@ -1,96 +1,275 @@
 package com.ruoyi.system.service.impl;
 
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
+
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.system.mapper.PolicyMenuMapper;
-import com.ruoyi.system.domain.PolicyMenu;
+import com.ruoyi.common.core.domain.entity.PolicyMenu;
 import com.ruoyi.system.service.IPolicyMenuService;
 
 /**
  * 政策类别Service业务层处理
- * 
+ *
  * @author boman
  * @date 2022-06-10
  */
 @Service
-public class PolicyMenuServiceImpl implements IPolicyMenuService 
-{
+public class PolicyMenuServiceImpl implements IPolicyMenuService {
     @Autowired
     private PolicyMenuMapper policyMenuMapper;
 
     /**
      * 查询政策类别
-     * 
+     *
      * @param menuId 政策类别主键
      * @return 政策类别
      */
     @Override
-    public PolicyMenu selectPolicyMenuByMenuId(Long menuId)
-    {
+    public PolicyMenu selectPolicyMenuByMenuId(Long menuId) {
         return policyMenuMapper.selectPolicyMenuByMenuId(menuId);
     }
 
     /**
      * 查询政策类别列表
-     * 
+     *
      * @param policyMenu 政策类别
      * @return 政策类别
      */
     @Override
-    public List<PolicyMenu> selectPolicyMenuList(PolicyMenu policyMenu)
-    {
+    public List<PolicyMenu> selectPolicyMenuList(PolicyMenu policyMenu) {
         return policyMenuMapper.selectPolicyMenuList(policyMenu);
     }
 
     /**
      * 新增政策类别
-     * 
+     *
      * @param policyMenu 政策类别
      * @return 结果
      */
     @Override
-    public int insertPolicyMenu(PolicyMenu policyMenu)
-    {
+    public int insertPolicyMenu(PolicyMenu policyMenu) {
+
+        //判断是否有上级类别
+        Long parentId = policyMenu.getParentId();
+        if (parentId != null && parentId > 0) {
+            PolicyMenu menu = policyMenuMapper.selectPolicyMenuByMenuId(policyMenu.getParentId());
+            // 如果父节点不为正常状态,则不允许新增子节点
+            if (!UserConstants.DEPT_NORMAL.equals(menu.getStatus())) {
+                throw new ServiceException("部门停用,不允许新增");
+            }
+            policyMenu.setAncestors(menu.getAncestors() + "," + menu.getParentId());
+        }else {
+            policyMenu.setAncestors("0");
+            policyMenu.setParentId(0L);
+        }
         policyMenu.setCreateTime(DateUtils.getNowDate());
         return policyMenuMapper.insertPolicyMenu(policyMenu);
     }
 
     /**
      * 修改政策类别
-     * 
+     *
      * @param policyMenu 政策类别
      * @return 结果
      */
     @Override
-    public int updatePolicyMenu(PolicyMenu policyMenu)
-    {
+    public int updatePolicyMenu(PolicyMenu policyMenu) {
+
+        PolicyMenu newPolicyMenu = policyMenuMapper.selectPolicyMenuByMenuId(policyMenu.getParentId());
+        PolicyMenu oldPolicyMenu = policyMenuMapper.selectPolicyMenuByMenuId(policyMenu.getMenuId());
+        if (StringUtils.isNotNull(newPolicyMenu) && StringUtils.isNotNull(oldPolicyMenu))
+        {
+            String newAncestors = newPolicyMenu.getAncestors() + "," + newPolicyMenu.getMenuId();
+            String oldAncestors = oldPolicyMenu.getAncestors();
+            policyMenu.setAncestors(newAncestors);
+            updateMenuChildren(policyMenu.getMenuId(), newAncestors, oldAncestors);
+        }
+        int result = policyMenuMapper.updatePolicyMenu(policyMenu);
+        if (UserConstants.DEPT_NORMAL.equals(policyMenu.getStatus()) && StringUtils.isNotEmpty(policyMenu.getAncestors())
+                && !StringUtils.equals("0", policyMenu.getAncestors()))
+        {
+            // 如果该类别是启用状态,则启用该类别的所有上级类别
+            updateParentMenuStatusNormal(policyMenu);
+        }
         policyMenu.setUpdateTime(DateUtils.getNowDate());
         return policyMenuMapper.updatePolicyMenu(policyMenu);
     }
 
+    /**
+     * 修改该类别的父级部门状态
+     *
+     * @param policyMenu 当前类别
+     */
+    private void updateParentMenuStatusNormal(PolicyMenu policyMenu)
+    {
+        String ancestors = policyMenu.getAncestors();
+        Long[] deptIds = Convert.toLongArray(ancestors);
+        policyMenuMapper.updateMenuStatusNormal(deptIds);
+    }
+
+    /**
+     * 修改子元素关系
+     *
+     * @param menuId 被修改的类别ID
+     * @param newAncestors 新的父ID集合
+     * @param oldAncestors 旧的父ID集合
+     */
+    public void updateMenuChildren(Long menuId, String newAncestors, String oldAncestors)
+    {
+        List<PolicyMenu> children = policyMenuMapper.selectChildrenMenuById(menuId);
+        for (PolicyMenu child : children)
+        {
+            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
+        }
+        if (children.size() > 0)
+        {
+            policyMenuMapper.updateMenuChildren(children);
+        }
+    }
+
     /**
      * 批量删除政策类别
-     * 
+     *
      * @param menuIds 需要删除的政策类别主键
      * @return 结果
      */
     @Override
-    public int deletePolicyMenuByMenuIds(Long[] menuIds)
-    {
+    public int deletePolicyMenuByMenuIds(Long[] menuIds) {
         return policyMenuMapper.deletePolicyMenuByMenuIds(menuIds);
     }
 
     /**
      * 删除政策类别信息
-     * 
+     *
      * @param menuId 政策类别主键
      * @return 结果
      */
     @Override
-    public int deletePolicyMenuByMenuId(Long menuId)
-    {
+    public int deletePolicyMenuByMenuId(Long menuId) {
         return policyMenuMapper.deletePolicyMenuByMenuId(menuId);
     }
+
+    /**
+     * 查询政策类别管理数据
+     *
+     * @param policyMenu
+     * @return
+     */
+    @Override
+    public List<PolicyMenu> selectMenusList(PolicyMenu policyMenu) {
+        return policyMenuMapper.selectPolicyMenuList(policyMenu);
+    }
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param policyMenu 政策类别列表
+     * @return 下拉树结构列表
+     */
+    @Override
+    public List<TreeSelect> buildMenuTreeSelect(List<PolicyMenu> policyMenu) {
+        List<PolicyMenu> menuTrees = buildDeptTree(policyMenu);
+        return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 校验政策类别名称
+     *
+     * @param policyMenu
+     * @return
+     */
+    @Override
+    public String checkMenuNameUnique(PolicyMenu policyMenu) {
+        Long menuId = StringUtils.isNull(policyMenu.getMenuId()) ? -1L : policyMenu.getMenuId();
+        PolicyMenu info = policyMenuMapper.checkMenuNameUnique(policyMenu.getMenuName(), policyMenu.getParentId());
+        if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 根据ID查询所有子部门(正常状态)
+     *
+     * @param menuId 部门ID
+     * @return 子部门数
+     */
+    @Override
+    public int selectNormalChildrenMenuById(Long menuId) {
+        return policyMenuMapper.selectNormalChildrenMenuById(menuId);
+    }
+
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param policyMenus 政策类别列表
+     * @return 树结构列表
+     */
+    public List<PolicyMenu> buildDeptTree(List<PolicyMenu> policyMenus) {
+        List<PolicyMenu> returnList = new ArrayList<PolicyMenu>();
+        List<Long> tempList = new ArrayList<Long>();
+        for (PolicyMenu menu : policyMenus) {
+            tempList.add(menu.getMenuId());
+        }
+        for (PolicyMenu menu : policyMenus) {
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(menu.getParentId())) {
+                recursionFn(policyMenus, menu);
+                returnList.add(menu);
+            }
+        }
+        if (returnList.isEmpty()) {
+            returnList = policyMenus;
+        }
+        return returnList;
+    }
+
+
+    /**
+     * 递归列表
+     */
+    private void recursionFn(List<PolicyMenu> list, PolicyMenu t) {
+        // 得到子节点列表
+        List<PolicyMenu> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (PolicyMenu tChild : childList) {
+            if (hasChild(list, tChild)) {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<PolicyMenu> getChildList(List<PolicyMenu> list, PolicyMenu t) {
+        List<PolicyMenu> tlist = new ArrayList<PolicyMenu>();
+        Iterator<PolicyMenu> it = list.iterator();
+        while (it.hasNext()) {
+            PolicyMenu n = (PolicyMenu) it.next();
+            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getMenuId().longValue()) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<PolicyMenu> list, PolicyMenu t) {
+        return getChildList(list, t).size() > 0;
+    }
 }

+ 17 - 0
ruoyi-system/src/main/resources/mapper/system/ChinaAreaMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.ChinaAreaMapper">
+
+    <resultMap type="com.ruoyi.common.core.domain.ChinaArea" id="ChinaAreaResult">
+        <result property="areaId"    column="area_id"    />
+        <result property="name"    column="name"    />
+        <result property="pid"    column="pid"    />
+        <result property="sort"    column="sort"    />
+    </resultMap>
+    <select id="selectChinaAreaList" resultMap="ChinaAreaResult">
+        select area_id,name,pid,sort from china_area where pid = #{pid} order by sort
+    </select>
+
+</mapper>

+ 9 - 1
ruoyi-system/src/main/resources/mapper/system/CreditUserMapper.xml

@@ -45,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="creditLevel != null  and creditLevel != ''"> and credit_level = #{creditLevel}</if>
             <if test="gender != null  and gender != ''"> and gender = #{gender}</if>
             <if test="age != null "> and age = #{age}</if>
-            <if test="idCard != null  and idCard != ''"> and id_card like concat('%', #{idCard}, '%')</if>
+            <if test="idCard != null  and idCard != ''"> and id_card like concat( #{idCard}, '%')</if>
             <if test="phoneNum != null  and phoneNum != ''"> and phone_num = #{phoneNum}</if>
         </where>
     </select>
@@ -54,6 +54,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectCreditUserVo"/>
         where id = #{id}
     </select>
+
+    <select id="selectCreditUser" parameterType="CreditUser" resultMap="CreditUserResult">
+        select user_name,credit_score,credit_level from credit_user
+        <where>
+            <if test="idCard != null  and idCard != ''"> and id_card = #{idCard}</if>
+            <if test="phoneNum != null  and phoneNum != ''"> and phone_num = #{phoneNum}</if>
+        </where>
+    </select>
         
     <insert id="insertCreditUser" parameterType="CreditUser" useGeneratedKeys="true" keyProperty="id">
         insert into credit_user

+ 41 - 5
ruoyi-system/src/main/resources/mapper/system/PolicyMenuMapper.xml

@@ -18,25 +18,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateBy"    column="update_by"    />
         <result property="updateTime"    column="update_time"    />
         <result property="remark"    column="remark"    />
+        <result property="ancestors"    column="ancestors"    />
     </resultMap>
 
     <sql id="selectPolicyMenuVo">
-        select menu_id, menu_name, menu_introduce, parent_id, order_num, visible, status, photo, create_by, create_time, update_by, update_time, remark from policy_menu
+        select menu_id, menu_name, menu_introduce, parent_id, order_num, visible, status, photo, create_by, create_time, update_by, update_time, remark,ancestors from policy_menu
     </sql>
 
     <select id="selectPolicyMenuList" parameterType="PolicyMenu" resultMap="PolicyMenuResult">
         <include refid="selectPolicyMenuVo"/>
-        <where>  
-            <if test="menuName != null  and menuName != ''"> and menu_name like concat('%', #{menuName}, '%')</if>
+        <where>
+            status = '0'
+            and visible = '0'
+            <if test="menuName != null  and menuName != ''"> and menu_name like concat(#{menuName}, '%')</if>
         </where>
-        order by order_num
+        order by parent_id,order_num
     </select>
     
     <select id="selectPolicyMenuByMenuId" parameterType="Long" resultMap="PolicyMenuResult">
         <include refid="selectPolicyMenuVo"/>
         where menu_id = #{menuId}
     </select>
-        
+
+    <select id="checkMenuNameUnique" resultType="com.ruoyi.common.core.domain.entity.PolicyMenu">
+        <include refid="selectPolicyMenuVo"/>
+        where menu_name=#{menuName} and parent_id = #{parentId} and status = '0' limit 1
+    </select>
+    <select id="selectNormalChildrenMenuById" resultType="java.lang.Integer">
+    select count(*) from policy_menu where status = '0'  and find_in_set(#{menuId}, ancestors)
+    </select>
+
+    <select id="selectChildrenMenuById" resultType="com.ruoyi.common.core.domain.entity.PolicyMenu">
+        select select menu_id, menu_name, menu_introduce, parent_id, order_num, visible, status, photo, create_by, create_time, update_by, update_time, remark,ancestors from policy_menu where find_in_set(#{menuId}, ancestors)
+    </select>
+
     <insert id="insertPolicyMenu" parameterType="PolicyMenu" useGeneratedKeys="true" keyProperty="menuId">
         insert into policy_menu
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -52,6 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">update_by,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="remark != null">remark,</if>
+            <if test="ancestors != null">ancestors,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="menuName != null and menuName != ''">#{menuName},</if>
@@ -66,6 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">#{updateBy},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="ancestors != null">#{ancestors},</if>
          </trim>
     </insert>
 
@@ -84,9 +101,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">update_by = #{updateBy},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="ancestors != null">ancestors = #{ancestors},</if>
         </trim>
         where menu_id = #{menuId}
     </update>
+    <update id="updateMenuChildren">
+        update policy_menu set ancestors =
+        <foreach collection="menus" item="item" index="index"
+                 separator=" " open="case menu_id" close="end">
+            when #{item.menuId} then #{item.ancestors}
+        </foreach>
+        where menu_id in
+        <foreach collection="menus" item="item" index="index"
+                 separator="," open="(" close=")">
+            #{item.menuId}
+        </foreach>
+    </update>
+    <update id="updateMenuStatusNormal" parameterType="Long">
+        update policy_menu set status = '0' where menu_id in
+        <foreach collection="array" item="menuId" open="(" separator="," close=")">
+            #{menuId}
+        </foreach>
+    </update>
 
     <delete id="deletePolicyMenuByMenuId" parameterType="Long">
         delete from policy_menu where menu_id = #{menuId}