From cdc4b8b1f21239b0bd313f7214d0f8b444efce20 Mon Sep 17 00:00:00 2001
From: 唐耀东 <18861537@qq.com>
Date: 星期日, 05 十二月 2021 19:40:07 +0800
Subject: [PATCH] 编写依赖库,国内高校

---
 ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml                  |    9 
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsCityVo.java                          |  121 +++
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsCity.java                               |   82 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommonApiImpl.java          |   34 
 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsProvinceMapper.java                     |   14 
 pom.xml                                                                              |    8 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsSchoolController.java        |  118 +++
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsSchoolBo.java                        |  101 ++
 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Dict.java                     |   33 
 ruoyi-common/src/main/java/com/ruoyi/common/api/CommonAPI.java                       |   23 
 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataDictClass.java            |   11 
 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsSchoolMapper.java                       |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java |   33 
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsProvinceServiceImpl.java          |   26 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/OConvertUtils.java                 |  651 ++++++++++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstant.java              |   46 +
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsSchoolVo.java                        |   89 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsCityController.java          |   36 
 ruoyi-oa/src/main/resources/mapper/oa/BsProvinceMapper.xml                           |   23 
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsSchool.java                             |   74 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsProvinceController.java      |   36 
 ruoyi-admin/pom.xml                                                                  |    6 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonConstant.java                |   12 
 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java                         |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java            |    5 
 ruoyi-admin/src/main/resources/application.yml                                       |    4 
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsProvince.java                           |   78 ++
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsSchoolServiceImpl.java            |  109 ++
 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsProvinceVo.java                      |  114 ++
 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsCityMapper.java                         |   14 
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsProvinceService.java                  |   21 
 ruoyi-oa/pom.xml                                                                     |   30 
 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DictAspect.java            |  189 ++++
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsCityService.java                      |   20 
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsSchoolService.java                    |   56 +
 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsCityServiceImpl.java              |   26 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java         |   20 
 ruoyi-oa/src/main/resources/mapper/oa/BsSchoolMapper.xml                             |   26 
 ruoyi-admin/src/main/resources/application-dev.yml                                   |    4 
 39 files changed, 2,311 insertions(+), 11 deletions(-)

diff --git a/pom.xml b/pom.xml
index 4dd5166..ef4a0bd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -279,6 +279,13 @@
                 <version>${ruoyi-vue-plus.version}</version>
             </dependency>
 
+            <!-- oa妯″潡 -->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-oa</artifactId>
+                <version>${ruoyi-vue-plus.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -292,6 +299,7 @@
         <module>ruoyi-demo</module>
         <module>ruoyi-extend</module>
         <module>ruoyi-oss</module>
+        <module>ruoyi-oa</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 91aa013..8ac2c3d 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -63,6 +63,12 @@
             <artifactId>ruoyi-demo</artifactId>
         </dependency>
 
+        <!--  oa妯″潡  -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-oa</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsCityController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsCityController.java
new file mode 100644
index 0000000..244bb43
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsCityController.java
@@ -0,0 +1,36 @@
+package com.ruoyi.web.controller.oa;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.oa.service.IBsCityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 鍩庡競璁剧疆Controller
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Validated
+@Api(value = "鍩庡競璁剧疆鎺у埗鍣�", tags = {"鍩庡競璁剧疆绠$悊"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/oa/city")
+public class BsCityController extends BaseController {
+
+    private final IBsCityService iBsCityService;
+
+    /**
+     * 鏍规嵁鐪佷唤缂栫爜鏌ヨ鍩庡競璁剧疆鍒楄〃
+     */
+    @ApiOperation("鏍规嵁鐪佷唤缂栫爜鏌ヨ鍩庡競璁剧疆鍒楄〃")
+    @GetMapping
+    public AjaxResult list(@RequestParam String provinceCode) {
+        return AjaxResult.success(iBsCityService.queryList(provinceCode));
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsProvinceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsProvinceController.java
new file mode 100644
index 0000000..90b83ca
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsProvinceController.java
@@ -0,0 +1,36 @@
+package com.ruoyi.web.controller.oa;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.oa.service.IBsProvinceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 鐪佷唤璁剧疆Controller
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Validated
+@Api(value = "鐪佷唤璁剧疆鎺у埗鍣�", tags = {"鐪佷唤璁剧疆绠$悊"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/oa/province")
+public class BsProvinceController extends BaseController {
+
+    private final IBsProvinceService iBsProvinceService;
+
+    /**
+     * 鏌ヨ鐪佷唤璁剧疆鍒楄〃
+     */
+    @ApiOperation("鏌ヨ鐪佷唤璁剧疆鍒楄〃")
+    @GetMapping
+    public AjaxResult list() {
+        return AjaxResult.success(iBsProvinceService.queryList());
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsSchoolController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsSchoolController.java
new file mode 100644
index 0000000..eb87d3f
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/BsSchoolController.java
@@ -0,0 +1,118 @@
+package com.ruoyi.web.controller.oa;
+
+import com.ruoyi.common.annotation.DataDictClass;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.oa.domain.bo.BsSchoolBo;
+import com.ruoyi.oa.domain.vo.BsSchoolVo;
+import com.ruoyi.oa.service.IBsSchoolService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 瀛︽牎Controller
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Validated
+@Api(value = "瀛︽牎鎺у埗鍣�", tags = {"瀛︽牎绠$悊"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/oa/school")
+public class BsSchoolController extends BaseController {
+
+    private final IBsSchoolService iBsSchoolService;
+
+    /**
+     * 鏌ヨ瀛︽牎鍒楄〃
+     */
+    @ApiOperation("鏌ヨ瀛︽牎鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('oa:school:list')")
+    @GetMapping("/list")
+    @DataDictClass
+    public TableDataInfo<BsSchoolVo> list(@Validated(QueryGroup.class) BsSchoolBo bo) {
+        return iBsSchoolService.queryPageList(bo);
+    }
+
+    /**
+     * 瀵煎嚭瀛︽牎鍒楄〃
+     */
+    @ApiOperation("瀵煎嚭瀛︽牎鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('oa:school:export')")
+    @Log(title = "瀛︽牎", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(@Validated BsSchoolBo bo, HttpServletResponse response) {
+        List<BsSchoolVo> list = iBsSchoolService.queryList(bo);
+        ExcelUtil.exportExcel(list, "瀛︽牎", BsSchoolVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇瀛︽牎璇︾粏淇℃伅
+     */
+    @ApiOperation("鑾峰彇瀛︽牎璇︾粏淇℃伅")
+    @PreAuthorize("@ss.hasPermi('oa:school:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<BsSchoolVo> getInfo(@ApiParam("涓婚敭")
+                                                  @NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iBsSchoolService.queryById(id));
+    }
+
+    /**
+     * 鏂板瀛︽牎
+     */
+    @ApiOperation("鏂板瀛︽牎")
+    @PreAuthorize("@ss.hasPermi('oa:school:add')")
+    @Log(title = "瀛︽牎", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody BsSchoolBo bo) {
+        return toAjax(iBsSchoolService.insertByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 淇敼瀛︽牎
+     */
+    @ApiOperation("淇敼瀛︽牎")
+    @PreAuthorize("@ss.hasPermi('oa:school:edit')")
+    @Log(title = "瀛︽牎", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody BsSchoolBo bo) {
+        return toAjax(iBsSchoolService.updateByBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 鍒犻櫎瀛︽牎
+     */
+    @ApiOperation("鍒犻櫎瀛︽牎")
+    @PreAuthorize("@ss.hasPermi('oa:school:remove')")
+    @Log(title = "瀛︽牎" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@ApiParam("涓婚敭涓�")
+                                       @NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iBsSchoolService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 015b302..89dc978 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -51,9 +51,9 @@
         # 涓诲簱鏁版嵁婧�
         master:
           driverClassName: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+          url: jdbc:mysql://47.95.0.46:3307/ytsl_oa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
           username: root
-          password: root
+          password: test1214
         # 浠庡簱鏁版嵁婧�
         slave:
           lazy: true
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index f7ef633..c0d7d1e 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -16,9 +16,9 @@
 captcha:
   # 椤甸潰 <鍙傛暟璁剧疆> 鍙紑鍚叧闂� 楠岃瘉鐮佹牎楠�
   # 楠岃瘉鐮佺被鍨� math 鏁扮粍璁$畻 char 瀛楃楠岃瘉
-  type: MATH
+  type: CHAR
   # line 绾挎骞叉壈 circle 鍦嗗湀骞叉壈 shear 鎵洸骞叉壈
-  category: CIRCLE
+  category: LINE
   # 鏁板瓧楠岃瘉鐮佷綅鏁�
   numberLength: 1
   # 瀛楃楠岃瘉鐮侀暱搴�
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataDictClass.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataDictClass.java
new file mode 100644
index 0000000..80daf6f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataDictClass.java
@@ -0,0 +1,11 @@
+package com.ruoyi.common.annotation;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface DataDictClass {
+
+}
+
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Dict.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Dict.java
new file mode 100644
index 0000000..0d0373f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Dict.java
@@ -0,0 +1,33 @@
+package com.ruoyi.common.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: 瀛楀吀娉ㄨВ
+ * @Date:2021-11-17
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Dict {
+
+    /**
+     * @Description: 鏁版嵁code
+     * @Date:2021-11-17
+     */
+    String dicCode();
+
+    /**
+     * @Description: 鏁版嵁Text
+     * @Date:2021-11-17
+     */
+    String dicText() default "";
+
+    /**
+     * @Description: 鏁版嵁瀛楀吀琛�
+     * @Date:2021-11-17
+     */
+    String dictTable() default "";
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/api/CommonAPI.java b/ruoyi-common/src/main/java/com/ruoyi/common/api/CommonAPI.java
new file mode 100644
index 0000000..1c0155c
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/api/CommonAPI.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.api;
+
+public interface CommonAPI {
+
+    /**
+     * 瀛楀吀琛ㄧ殑 缈昏瘧
+     * @param table
+     * @param text
+     * @param code
+     * @param key
+     * @return
+     */
+    String translateDictFromTable(String table, String text, String code, String key);
+
+    /**
+     * 鏅�氬瓧鍏哥殑缈昏瘧
+     * @param code
+     * @param key
+     * @return
+     */
+    String translateDict(String code, String key);
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstant.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstant.java
new file mode 100644
index 0000000..10cb00a
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstant.java
@@ -0,0 +1,46 @@
+package com.ruoyi.common.constant;
+
+/**
+ * @date: 21-11-17
+ * @description: 缂撳瓨甯搁噺
+ */
+public interface CacheConstant {
+
+    /**
+     * 瀛楀吀淇℃伅缂撳瓨
+     */
+    public static final String SYS_DICT_CACHE = "sys:cache:dict";
+    /**
+     * 琛ㄥ瓧鍏镐俊鎭紦瀛�
+     */
+    public static final String SYS_DICT_TABLE_CACHE = "sys:cache:dictTable";
+    public static final String SYS_DICT_TABLE_BY_KEYS_CACHE = SYS_DICT_TABLE_CACHE + "ByKeys";
+
+    /**
+     * 鏁版嵁鏉冮檺閰嶇疆缂撳瓨
+     */
+    public static final String SYS_DATA_PERMISSIONS_CACHE = "sys:cache:permission:datarules";
+
+    /**
+     * 缂撳瓨鐢ㄦ埛淇℃伅
+     */
+    public static final String SYS_USERS_CACHE = "sys:cache:user";
+
+    /**
+     * 鍏ㄩ儴閮ㄩ棬淇℃伅缂撳瓨
+     */
+    public static final String SYS_DEPARTS_CACHE = "sys:cache:depart:alldata";
+
+
+    /**
+     * 鍏ㄩ儴閮ㄩ棬ids缂撳瓨
+     */
+    public static final String SYS_DEPART_IDS_CACHE = "sys:cache:depart:allids";
+
+
+    /**
+     * 瀛楀吀淇℃伅缂撳瓨
+     */
+    public static final String SYS_DYNAMICDB_CACHE = "sys:cache:dbconnect:dynamic:";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonConstant.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonConstant.java
new file mode 100644
index 0000000..150363d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CommonConstant.java
@@ -0,0 +1,12 @@
+package com.ruoyi.common.enums;
+
+public interface CommonConstant {
+
+    /**瀛楀吀缈昏瘧鏂囨湰鍚庣紑*/
+    public static final String DICT_TEXT_SUFFIX = "_dictText";
+
+    /**
+     * 绗笁鏂圭櫥褰� 楠岃瘉瀵嗙爜/鍒涘缓鐢ㄦ埛 閮介渶瑕佽缃竴涓搷浣滅爜 闃叉琚伓鎰忚皟鐢�
+     */
+    public final static String THIRD_LOGIN_CODE = "third_login_code";
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/OConvertUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/OConvertUtils.java
new file mode 100644
index 0000000..1b84930
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/OConvertUtils.java
@@ -0,0 +1,651 @@
+package com.ruoyi.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.sql.Date;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @Author  寮犱唬娴�
+ *
+ */
+@Slf4j
+public class OConvertUtils {
+	public static boolean isEmpty(Object object) {
+		if (object == null) {
+			return (true);
+		}
+		if ("".equals(object)) {
+			return (true);
+		}
+		if ("null".equals(object)) {
+			return (true);
+		}
+		return (false);
+	}
+
+	public static boolean isNotEmpty(Object object) {
+		if (object != null && !object.equals("") && !object.equals("null")) {
+			return (true);
+		}
+		return (false);
+	}
+
+	public static String decode(String strIn, String sourceCode, String targetCode) {
+		String temp = code2code(strIn, sourceCode, targetCode);
+		return temp;
+	}
+
+	public static String StrToUTF(String strIn, String sourceCode, String targetCode) {
+		strIn = "";
+		try {
+			strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK");
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return strIn;
+
+	}
+
+	private static String code2code(String strIn, String sourceCode, String targetCode) {
+		String strOut = null;
+		if (strIn == null || (strIn.trim()).equals("")) {
+			return strIn;
+		}
+		try {
+			byte[] b = strIn.getBytes(sourceCode);
+			for (int i = 0; i < b.length; i++) {
+				System.out.print(b[i] + "  ");
+			}
+			strOut = new String(b, targetCode);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+		return strOut;
+	}
+
+	public static int getInt(String s, int defval) {
+		if (s == null || s == "") {
+			return (defval);
+		}
+		try {
+			return (Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return (defval);
+		}
+	}
+
+	public static int getInt(String s) {
+		if (s == null || s == "") {
+			return 0;
+		}
+		try {
+			return (Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return 0;
+		}
+	}
+
+	public static int getInt(String s, Integer df) {
+		if (s == null || s == "") {
+			return df;
+		}
+		try {
+			return (Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return 0;
+		}
+	}
+
+	public static Integer[] getInts(String[] s) {
+		Integer[] integer = new Integer[s.length];
+		if (s == null) {
+			return null;
+		}
+		for (int i = 0; i < s.length; i++) {
+			integer[i] = Integer.parseInt(s[i]);
+		}
+		return integer;
+
+	}
+
+	public static double getDouble(String s, double defval) {
+		if (s == null || s == "") {
+			return (defval);
+		}
+		try {
+			return (Double.parseDouble(s));
+		} catch (NumberFormatException e) {
+			return (defval);
+		}
+	}
+
+	public static double getDou(Double s, double defval) {
+		if (s == null) {
+			return (defval);
+		}
+		return s;
+	}
+
+	/*public static Short getShort(String s) {
+		if (StringUtil.isNotEmpty(s)) {
+			return (Short.parseShort(s));
+		} else {
+			return null;
+		}
+	}*/
+
+	public static int getInt(Object object, int defval) {
+		if (isEmpty(object)) {
+			return (defval);
+		}
+		try {
+			return (Integer.parseInt(object.toString()));
+		} catch (NumberFormatException e) {
+			return (defval);
+		}
+	}
+
+	public static Integer getInt(Object object) {
+		if (isEmpty(object)) {
+			return null;
+		}
+		try {
+			return (Integer.parseInt(object.toString()));
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+	public static int getInt(BigDecimal s, int defval) {
+		if (s == null) {
+			return (defval);
+		}
+		return s.intValue();
+	}
+
+	public static Integer[] getIntegerArry(String[] object) {
+		int len = object.length;
+		Integer[] result = new Integer[len];
+		try {
+			for (int i = 0; i < len; i++) {
+				result[i] = new Integer(object[i].trim());
+			}
+			return result;
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+	public static String getString(String s) {
+		return (getString(s, ""));
+	}
+
+	/**
+	 * 杞箟鎴怳nicode缂栫爜
+	 * @param s
+	 * @return
+	 */
+	/*public static String escapeJava(Object s) {
+		return StringEscapeUtils.escapeJava(getString(s));
+	}*/
+
+	public static String getString(Object object) {
+		if (isEmpty(object)) {
+			return "";
+		}
+		return (object.toString().trim());
+	}
+
+	public static String getString(int i) {
+		return (String.valueOf(i));
+	}
+
+	public static String getString(float i) {
+		return (String.valueOf(i));
+	}
+
+	public static String getString(String s, String defval) {
+		if (isEmpty(s)) {
+			return (defval);
+		}
+		return (s.trim());
+	}
+
+	public static String getString(Object s, String defval) {
+		if (isEmpty(s)) {
+			return (defval);
+		}
+		return (s.toString().trim());
+	}
+
+	public static long stringToLong(String str) {
+		Long test = new Long(0);
+		try {
+			test = Long.valueOf(str);
+		} catch (Exception e) {
+		}
+		return test.longValue();
+	}
+
+	/**
+	 * 鑾峰彇鏈満IP
+	 */
+	public static String getIp() {
+		String ip = null;
+		try {
+			InetAddress address = InetAddress.getLocalHost();
+			ip = address.getHostAddress();
+
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+		return ip;
+	}
+
+	/**
+	 * 鍒ゆ柇涓�涓被鏄惁涓哄熀鏈暟鎹被鍨嬨��
+	 *
+	 * @param clazz
+	 *            瑕佸垽鏂殑绫汇��
+	 * @return true 琛ㄧず涓哄熀鏈暟鎹被鍨嬨��
+	 */
+	private static boolean isBaseDataType(Class clazz) throws Exception {
+		return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive());
+	}
+
+	/**
+	 * @param request
+	 *            IP
+	 * @return IP Address
+	 */
+	public static String getIpAddrByRequest(HttpServletRequest request) {
+		String ip = request.getHeader("x-forwarded-for");
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		return ip;
+	}
+
+	/**
+	 * @return 鏈満IP
+	 * @throws SocketException
+	 */
+	public static String getRealIp() throws SocketException {
+		String localip = null;// 鏈湴IP锛屽鏋滄病鏈夐厤缃缃慖P鍒欒繑鍥炲畠
+		String netip = null;// 澶栫綉IP
+
+		Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
+		InetAddress ip = null;
+		boolean finded = false;// 鏄惁鎵惧埌澶栫綉IP
+		while (netInterfaces.hasMoreElements() && !finded) {
+			NetworkInterface ni = netInterfaces.nextElement();
+			Enumeration<InetAddress> address = ni.getInetAddresses();
+			while (address.hasMoreElements()) {
+				ip = address.nextElement();
+				if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 澶栫綉IP
+					netip = ip.getHostAddress();
+					finded = true;
+					break;
+				} else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 鍐呯綉IP
+					localip = ip.getHostAddress();
+				}
+			}
+		}
+
+		if (netip != null && !"".equals(netip)) {
+			return netip;
+		} else {
+			return localip;
+		}
+	}
+
+	/**
+	 * java鍘婚櫎瀛楃涓蹭腑鐨勭┖鏍笺�佸洖杞︺�佹崲琛岀銆佸埗琛ㄧ
+	 *
+	 * @param str
+	 * @return
+	 */
+	public static String replaceBlank(String str) {
+		String dest = "";
+		if (str != null) {
+			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+			Matcher m = p.matcher(str);
+			dest = m.replaceAll("");
+		}
+		return dest;
+
+	}
+
+	/**
+	 * 鍒ゆ柇鍏冪礌鏄惁鍦ㄦ暟缁勫唴
+	 *
+	 * @param substring
+	 * @param source
+	 * @return
+	 */
+	public static boolean isIn(String substring, String[] source) {
+		if (source == null || source.length == 0) {
+			return false;
+		}
+		for (int i = 0; i < source.length; i++) {
+			String aSource = source[i];
+			if (aSource.equals(substring)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 鑾峰彇Map瀵硅薄
+	 */
+	public static Map<Object, Object> getHashMap() {
+		return new HashMap<Object, Object>();
+	}
+
+	/**
+	 * SET杞崲MAP
+	 *
+	 * @param str
+	 * @return
+	 */
+	public static Map<Object, Object> SetToMap(Set<Object> setobj) {
+		Map<Object, Object> map = getHashMap();
+		for (Iterator iterator = setobj.iterator(); iterator.hasNext();) {
+			Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) iterator.next();
+			map.put(entry.getKey().toString(), entry.getValue() == null ? "" : entry.getValue().toString().trim());
+		}
+		return map;
+
+	}
+
+	public static boolean isInnerIP(String ipAddress) {
+		boolean isInnerIp = false;
+		long ipNum = getIpNum(ipAddress);
+		/**
+		 * 绉佹湁IP锛欰绫� 10.0.0.0-10.255.255.255 B绫� 172.16.0.0-172.31.255.255 C绫� 192.168.0.0-192.168.255.255 褰撶劧锛岃繕鏈�127杩欎釜缃戞鏄幆鍥炲湴鍧�
+		 **/
+		long aBegin = getIpNum("10.0.0.0");
+		long aEnd = getIpNum("10.255.255.255");
+		long bBegin = getIpNum("172.16.0.0");
+		long bEnd = getIpNum("172.31.255.255");
+		long cBegin = getIpNum("192.168.0.0");
+		long cEnd = getIpNum("192.168.255.255");
+		isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1");
+		return isInnerIp;
+	}
+
+	private static long getIpNum(String ipAddress) {
+		String[] ip = ipAddress.split("\\.");
+		long a = Integer.parseInt(ip[0]);
+		long b = Integer.parseInt(ip[1]);
+		long c = Integer.parseInt(ip[2]);
+		long d = Integer.parseInt(ip[3]);
+
+		long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
+		return ipNum;
+	}
+
+	private static boolean isInner(long userIp, long begin, long end) {
+		return (userIp >= begin) && (userIp <= end);
+	}
+
+	/**
+	 * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆�
+	 * 濡傛灉杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓蹭负绌猴紝鍒欒繑鍥炵┖瀛楃涓层��</br>
+	 * 渚嬪锛歨ello_world->helloWorld
+	 *
+	 * @param name
+	 *            杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓�
+	 * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓�
+	 */
+	public static String camelName(String name) {
+		StringBuilder result = new StringBuilder();
+		// 蹇�熸鏌�
+		if (name == null || name.isEmpty()) {
+			// 娌″繀瑕佽浆鎹�
+			return "";
+		} else if (!name.contains("_")) {
+			// 涓嶅惈涓嬪垝绾匡紝浠呭皢棣栧瓧姣嶅皬鍐�
+			//update-begin--Author:zhoujf  Date:20180503 for锛歍ASK #2500 銆愪唬鐮佺敓鎴愬櫒銆戜唬鐮佺敓鎴愬櫒寮�鍙戜竴閫氱敤妯℃澘鐢熸垚鍔熻兘
+			//update-begin--Author:zhoujf  Date:20180503 for锛歍ASK #2500 銆愪唬鐮佺敓鎴愬櫒銆戜唬鐮佺敓鎴愬櫒寮�鍙戜竴閫氱敤妯℃澘鐢熸垚鍔熻兘
+			return name.substring(0, 1).toLowerCase() + name.substring(1).toLowerCase();
+			//update-end--Author:zhoujf  Date:20180503 for锛歍ASK #2500 銆愪唬鐮佺敓鎴愬櫒銆戜唬鐮佺敓鎴愬櫒寮�鍙戜竴閫氱敤妯℃澘鐢熸垚鍔熻兘
+		}
+		// 鐢ㄤ笅鍒掔嚎灏嗗師濮嬪瓧绗︿覆鍒嗗壊
+		String camels[] = name.split("_");
+		for (String camel : camels) {
+			// 璺宠繃鍘熷瀛楃涓蹭腑寮�澶淬�佺粨灏剧殑涓嬫崲绾挎垨鍙岄噸涓嬪垝绾�
+			if (camel.isEmpty()) {
+				continue;
+			}
+			// 澶勭悊鐪熸鐨勯┘宄扮墖娈�
+			if (result.length() == 0) {
+				// 绗竴涓┘宄扮墖娈碉紝鍏ㄩ儴瀛楁瘝閮藉皬鍐�
+				result.append(camel.toLowerCase());
+			} else {
+				// 鍏朵粬鐨勯┘宄扮墖娈碉紝棣栧瓧姣嶅ぇ鍐�
+				result.append(camel.substring(0, 1).toUpperCase());
+				result.append(camel.substring(1).toLowerCase());
+			}
+		}
+		return result.toString();
+	}
+
+	/**
+	 * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆�
+	 * 濡傛灉杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓蹭负绌猴紝鍒欒繑鍥炵┖瀛楃涓层��</br>
+	 * 渚嬪锛歨ello_world,test_id->helloWorld,testId
+	 *
+	 * @param name
+	 *            杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓�
+	 * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓�
+	 */
+	public static String camelNames(String names) {
+		if(names==null||names.equals("")){
+			return null;
+		}
+		StringBuffer sf = new StringBuffer();
+		String[] fs = names.split(",");
+		for (String field : fs) {
+			field = camelName(field);
+			sf.append(field + ",");
+		}
+		String result = sf.toString();
+		return result.substring(0, result.length() - 1);
+	}
+
+	//update-begin--Author:zhoujf  Date:20180503 for锛歍ASK #2500 銆愪唬鐮佺敓鎴愬櫒銆戜唬鐮佺敓鎴愬櫒寮�鍙戜竴閫氱敤妯℃澘鐢熸垚鍔熻兘
+	/**
+	 * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆�(棣栧瓧姣嶅啓)
+	 * 濡傛灉杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓蹭负绌猴紝鍒欒繑鍥炵┖瀛楃涓层��</br>
+	 * 渚嬪锛歨ello_world->HelloWorld
+	 *
+	 * @param name
+	 *            杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓�
+	 * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓�
+	 */
+	public static String camelNameCapFirst(String name) {
+		StringBuilder result = new StringBuilder();
+		// 蹇�熸鏌�
+		if (name == null || name.isEmpty()) {
+			// 娌″繀瑕佽浆鎹�
+			return "";
+		} else if (!name.contains("_")) {
+			// 涓嶅惈涓嬪垝绾匡紝浠呭皢棣栧瓧姣嶅皬鍐�
+			return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
+		}
+		// 鐢ㄤ笅鍒掔嚎灏嗗師濮嬪瓧绗︿覆鍒嗗壊
+		String camels[] = name.split("_");
+		for (String camel : camels) {
+			// 璺宠繃鍘熷瀛楃涓蹭腑寮�澶淬�佺粨灏剧殑涓嬫崲绾挎垨鍙岄噸涓嬪垝绾�
+			if (camel.isEmpty()) {
+				continue;
+			}
+			// 鍏朵粬鐨勯┘宄扮墖娈碉紝棣栧瓧姣嶅ぇ鍐�
+			result.append(camel.substring(0, 1).toUpperCase());
+			result.append(camel.substring(1).toLowerCase());
+		}
+		return result.toString();
+	}
+	//update-end--Author:zhoujf  Date:20180503 for锛歍ASK #2500 銆愪唬鐮佺敓鎴愬櫒銆戜唬鐮佺敓鎴愬櫒寮�鍙戜竴閫氱敤妯℃澘鐢熸垚鍔熻兘
+
+	/**
+	 * 灏嗛┘宄板懡鍚嶈浆鍖栨垚涓嬪垝绾�
+	 * @param para
+	 * @return
+	 */
+	public static String camelToUnderline(String para){
+        if(para.length()<3){
+        	return para.toLowerCase();
+        }
+        StringBuilder sb=new StringBuilder(para);
+        int temp=0;//瀹氫綅
+        //浠庣涓変釜瀛楃寮�濮� 閬垮厤鍛藉悕涓嶈鑼�
+        for(int i=2;i<para.length();i++){
+            if(Character.isUpperCase(para.charAt(i))){
+                sb.insert(i+temp, "_");
+                temp+=1;
+            }
+        }
+        return sb.toString().toLowerCase();
+	}
+
+	/**
+	 * 闅忔満鏁�
+	 * @param place 瀹氫箟闅忔満鏁扮殑浣嶆暟
+	 */
+	public static String randomGen(int place) {
+		String base = "qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789";
+		StringBuffer sb = new StringBuffer();
+		Random rd = new Random();
+		for(int i=0;i<place;i++) {
+			sb.append(base.charAt(rd.nextInt(base.length())));
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 鑾峰彇绫荤殑鎵�鏈夊睘鎬э紝鍖呮嫭鐖剁被
+	 *
+	 * @param object
+	 * @return
+	 */
+	public static Field[] getAllFields(Object object) {
+		Class<?> clazz = object.getClass();
+		List<Field> fieldList = new ArrayList<>();
+		while (clazz != null) {
+			fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
+			clazz = clazz.getSuperclass();
+		}
+		Field[] fields = new Field[fieldList.size()];
+		fieldList.toArray(fields);
+		return fields;
+	}
+
+	/**
+	  * 灏唌ap鐨刱ey鍏ㄩ儴杞垚灏忓啓
+	 * @param list
+	 * @return
+	 */
+	public static List<Map<String, Object>> toLowerCasePageList(List<Map<String, Object>> list){
+		List<Map<String, Object>> select = new ArrayList<>();
+		for (Map<String, Object> row : list) {
+			 Map<String, Object> resultMap = new HashMap<>();
+			 Set<String> keySet = row.keySet();
+			 for (String key : keySet) {
+				 String newKey = key.toLowerCase();
+				 resultMap.put(newKey, row.get(key));
+			 }
+			 select.add(resultMap);
+		}
+		return select;
+	}
+
+	/**
+	 * 灏唀ntityList杞崲鎴恗odelList
+	 * @param fromList
+	 * @param tClass
+	 * @param <F>
+	 * @param <T>
+	 * @return
+	 */
+	public static<F,T> List<T> entityListToModelList(List<F> fromList, Class<T> tClass){
+		if(fromList == null || fromList.isEmpty()){
+			return null;
+		}
+		List<T> tList = new ArrayList<>();
+		for(F f : fromList){
+			T t = entityToModel(f, tClass);
+			tList.add(t);
+		}
+		return tList;
+	}
+
+	public static<F,T> T entityToModel(F entity, Class<T> modelClass) {
+		log.debug("entityToModel : Entity灞炴�х殑鍊艰祴鍊煎埌Model");
+		Object model = null;
+		if (entity == null || modelClass ==null) {
+			return null;
+		}
+
+		try {
+			model = modelClass.newInstance();
+		} catch (InstantiationException e) {
+			log.error("entityToModel : 瀹炰緥鍖栧紓甯�", e);
+		} catch (IllegalAccessException e) {
+			log.error("entityToModel : 瀹夊叏鏉冮檺寮傚父", e);
+		}
+		BeanUtils.copyProperties(entity, model);
+		return (T)model;
+	}
+
+	/**
+	 * 鍒ゆ柇 list 鏄惁涓虹┖
+	 *
+	 * @param list
+	 * @return true or false
+	 * list == null		: true
+	 * list.size() == 0	: true
+	 */
+	public static boolean listIsEmpty(Collection list) {
+		return (list == null || list.size() == 0);
+	}
+
+	/**
+	 * 鍒ゆ柇 list 鏄惁涓嶄负绌�
+	 *
+	 * @param list
+	 * @return true or false
+	 * list == null		: false
+	 * list.size() == 0	: false
+	 */
+	public static boolean listIsNotEmpty(Collection list) {
+		return !listIsEmpty(list);
+	}
+
+}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java
index 74b57d9..8e0c8a1 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java
@@ -59,10 +59,4 @@
     @Version
     private Long version;
 
-    /**
-     * 鍒犻櫎鏍囧織
-     */
-    @TableLogic
-    private Long delFlag;
-
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DictAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DictAspect.java
new file mode 100644
index 0000000..f163281
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DictAspect.java
@@ -0,0 +1,189 @@
+package com.ruoyi.framework.aspectj;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.annotation.DataDictClass;
+import com.ruoyi.common.annotation.Dict;
+import com.ruoyi.common.api.CommonAPI;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.CommonConstant;
+import com.ruoyi.common.utils.OConvertUtils;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 瀛楀吀aop绫�
+ * @Date: 21-11-17
+ */
+@Aspect
+@Component
+@SuppressWarnings({"unused"})
+@Slf4j
+public class DictAspect {
+
+    @Autowired
+    private CommonAPI commonAPI;
+
+    // 瀹氫箟鍒囩偣Pointcut
+    @Pointcut("@annotation(dataDictClass)")
+    public void dataDictClass(DataDictClass dataDictClass) {
+    }
+
+    @Around("@annotation(dataDictClass)")
+    public Object doAround(ProceedingJoinPoint pjp, DataDictClass dataDictClass) throws Throwable {
+        long time1 = System.currentTimeMillis();
+        Object result = pjp.proceed();
+        long time2 = System.currentTimeMillis();
+        log.debug("鑾峰彇JSON鏁版嵁 鑰楁椂锛�" + (time2 - time1) + "ms");
+        long start = System.currentTimeMillis();
+        this.parseDictText(result);
+        long end = System.currentTimeMillis();
+        log.debug("瑙f瀽娉ㄥ叆JSON鏁版嵁  鑰楁椂" + (end - start) + "ms");
+        return result;
+    }
+
+    /**
+     * 鏈柟娉曢拡瀵硅繑鍥炲璞′负Result 鐨処Page鐨勫垎椤靛垪琛ㄦ暟鎹繘琛屽姩鎬佸瓧鍏告敞鍏�
+     * 瀛楀吀娉ㄥ叆瀹炵幇 閫氳繃瀵瑰疄浣撶被娣诲姞娉ㄨВ@dict 鏉ユ爣璇嗛渶瑕佺殑瀛楀吀鍐呭,瀛楀吀鍒嗕负鍗曞瓧鍏竎ode鍗冲彲 锛宼able瀛楀吀 code table text閰嶅悎浣跨敤涓庡師鏉eecg鐨勭敤娉曠浉鍚�
+     * 绀轰緥涓篠ysUser   瀛楁涓簊ex 娣诲姞浜嗘敞瑙Dict(dicCode = "sex") 浼氬湪瀛楀吀鏈嶅姟绔嬮┈鏌ュ嚭鏉ュ搴旂殑text 鐒跺悗鍦ㄨ姹俵ist鐨勬椂鍊欏皢杩欎釜瀛楀吀text锛屽凡瀛楁鍚嶇О鍔燺dictText褰㈠紡杩斿洖鍒板墠绔�
+     * 渚嬭緭鍏ュ綋鍓嶈繑鍥炲�肩殑灏变細澶氬嚭涓�涓猻ex_dictText瀛楁
+     * {
+     * sex:1,
+     * sex_dictText:"鐢�"
+     * }
+     * 鍓嶇鐩存帴鍙栧�約ext_dictText鍦╰able閲岄潰鏃犻渶鍐嶈繘琛屽墠绔殑瀛楀吀杞崲浜�
+     * customRender:function (text) {
+     * if(text==1){
+     * return "鐢�";
+     * }else if(text==2){
+     * return "濂�";
+     * }else{
+     * return text;
+     * }
+     * }
+     * 鐩墠vue鏄繖涔堣繘琛屽瓧鍏告覆鏌撳埌table涓婄殑澶氫簡灏卞緢楹荤儲浜� 杩欎釜鐩存帴鍦ㄦ湇鍔$娓叉煋瀹屾垚鍓嶇鍙互鐩存帴鐢�
+     *
+     * @param result
+     */
+    private void parseDictText(Object result) {
+        // TableDataInfo鍒嗛〉
+        if (result instanceof TableDataInfo) {
+            (((TableDataInfo) result)).setRows(transformation(((TableDataInfo<?>) result).getRows()));
+        }
+        if (result instanceof AjaxResult) {
+            // 鍒嗛〉
+            if (((AjaxResult) result).getData() instanceof IPage) {
+                ((IPage) ((AjaxResult) result).getData()).setRecords(transformation(((IPage) ((AjaxResult) result).getData()).getRecords()));
+            }
+            // 鏃犲垎椤�-list
+            if (((AjaxResult) result).getData() instanceof ArrayList) {
+                (((AjaxResult) result)).setData(transformation((List<?>) ((AjaxResult) result).getData()));
+            }
+            // object
+            if (((AjaxResult) result).getData() instanceof Object) {
+                (((AjaxResult) result)).setData(transformation(Arrays.asList(((AjaxResult<?>) result).getData())).get(0));
+            }
+        }
+    }
+
+    /**
+     * 缈昏瘧瀛楀吀鏂囨湰
+     *
+     * @param code
+     * @param text
+     * @param table
+     * @param key
+     * @return
+     */
+    private String translateDictValue(String code, String text, String table, String key) {
+        if (OConvertUtils.isEmpty(key)) {
+            return null;
+        }
+        StringBuffer textValue = new StringBuffer();
+        String[] keys = key.split(",");
+        for (String k : keys) {
+            String tmpValue = null;
+            log.debug(" 瀛楀吀 key : " + k);
+            if (k.trim().length() == 0) {
+                continue; //璺宠繃寰幆
+            }
+            if (!StringUtils.isEmpty(table)) {
+                log.debug("--DictAspect------dicTable=" + table + " ,dicText= " + text + " ,dicCode=" + code);
+                tmpValue = commonAPI.translateDictFromTable(table, text, code, k.trim());
+            } else {
+                tmpValue = commonAPI.translateDict(code, k.trim());
+            }
+            if (tmpValue != null) {
+                if (!"".equals(textValue.toString())) {
+                    textValue.append(",");
+                }
+                textValue.append(tmpValue);
+            }
+
+        }
+        return textValue.toString();
+    }
+
+    /**
+     * 鏁版嵁杞崲
+     *
+     * @param list
+     * @return
+     */
+    private List<JSONObject> transformation(List<?> list) {
+        List<JSONObject> items = new ArrayList<>();
+        for (Object record : list) {
+            ObjectMapper mapper = new ObjectMapper();
+            String json = "{}";
+            try {
+                //瑙e喅@JsonFormat娉ㄨВ瑙f瀽涓嶄簡鐨勯棶棰樿瑙丼ysAnnouncement绫荤殑@JsonFormat
+                json = mapper.writeValueAsString(record);
+            } catch (JsonProcessingException e) {
+                log.error("json瑙f瀽澶辫触" + e.getMessage(), e);
+            }
+            JSONObject item = JSONObject.parseObject(json);
+            //update-begin--Author:scott -- Date:20190603 ----for锛氳В鍐崇户鎵垮疄浣撳瓧娈垫棤娉曠炕璇戦棶棰�------
+            //for (Field field : record.getClass().getDeclaredFields()) {
+            for (Field field : OConvertUtils.getAllFields(record)) {
+                //update-end--Author:scott  -- Date:20190603 ----for锛氳В鍐崇户鎵垮疄浣撳瓧娈垫棤娉曠炕璇戦棶棰�------
+                if (field.getAnnotation(Dict.class) != null) {
+                    String code = field.getAnnotation(Dict.class).dicCode();
+                    String text = field.getAnnotation(Dict.class).dicText();
+                    String table = field.getAnnotation(Dict.class).dictTable();
+                    String key = String.valueOf(item.get(field.getName()));
+
+                    //缈昏瘧瀛楀吀鍊煎搴旂殑txt
+                    String textValue = translateDictValue(code, text, table, key);
+
+                    log.debug(" 瀛楀吀Val : " + textValue);
+                    log.debug(" __缈昏瘧瀛楀吀瀛楁__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + "锛� " + textValue);
+                    item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
+                }
+                //date绫诲瀷榛樿杞崲string鏍煎紡鍖栨棩鏈�
+                if (field.getType().getName().equals("java.util.Date") && field.getAnnotation(JsonFormat.class) == null && item.get(field.getName()) != null) {
+                    SimpleDateFormat aDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                    item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
+                }
+            }
+            items.add(item);
+        }
+        return items;
+    }
+}
diff --git a/ruoyi-oa/pom.xml b/ruoyi-oa/pom.xml
new file mode 100644
index 0000000..2c164bb
--- /dev/null
+++ b/ruoyi-oa/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi-vue-plus</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.4.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <packaging>jar</packaging>
+    <artifactId>ruoyi-oa</artifactId>
+
+    <description>
+        oa鏈嶅姟
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsCity.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsCity.java
new file mode 100644
index 0000000..40fd060
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsCity.java
@@ -0,0 +1,82 @@
+package com.ruoyi.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 鍩庡競璁剧疆瀵硅薄 bs_city
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Data
+@Accessors(chain = true)
+@TableName("bs_city")
+public class BsCity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 鑷鍒�
+     */
+    @TableId(value = "CITY_ID")
+    private Long cityId;
+    /**
+     * 甯備唬鐮�
+     */
+    private String cityCode;
+    /**
+     * 甯傚悕绉�
+     */
+    private String cityName;
+    /**
+     * 绠�绉�
+     */
+    private String shortName;
+    /**
+     * 鐪佷唬鐮�
+     */
+    private String provinceCode;
+    /**
+     * 缁忓害
+     */
+    private String lng;
+    /**
+     * 绾害
+     */
+    private String lat;
+    /**
+     * 鎺掑簭
+     */
+    private Integer sort;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date gmtCreate;
+    /**
+     * 淇敼鏃堕棿
+     */
+    private Date gmtModified;
+    /**
+     * 澶囨敞
+     */
+    private String memo;
+    /**
+     * 鐘舵��
+     */
+    private Long dataState;
+    /**
+     * 绉熸埛ID
+     */
+    private String tenantCode;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsProvince.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsProvince.java
new file mode 100644
index 0000000..5aac819
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsProvince.java
@@ -0,0 +1,78 @@
+package com.ruoyi.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 鐪佷唤璁剧疆瀵硅薄 bs_province
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Data
+@Accessors(chain = true)
+@TableName("bs_province")
+public class BsProvince {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 鑷鍒�
+     */
+    @TableId(value = "PROVINCE_ID")
+    private Long provinceId;
+    /**
+     * 鐪佷唤浠g爜
+     */
+    private String provinceCode;
+    /**
+     * 鐪佷唤鍚嶇О
+     */
+    private String provinceName;
+    /**
+     * 绠�绉�
+     */
+    private String shortName;
+    /**
+     * 缁忓害
+     */
+    private String lng;
+    /**
+     * 绾害
+     */
+    private String lat;
+    /**
+     * 鎺掑簭
+     */
+    private Integer sort;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date gmtCreate;
+    /**
+     * 淇敼鏃堕棿
+     */
+    private Date gmtModified;
+    /**
+     * 澶囨敞
+     */
+    private String memo;
+    /**
+     * 鐘舵��
+     */
+    private Long dataState;
+    /**
+     * 绉熸埛ID
+     */
+    private String tenantCode;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsSchool.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsSchool.java
new file mode 100644
index 0000000..0c0fb95
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/BsSchool.java
@@ -0,0 +1,74 @@
+package com.ruoyi.oa.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 瀛︽牎瀵硅薄 bas_school
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Data
+@Accessors(chain = true)
+@TableName("bs_school")
+public class BsSchool extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id")
+    private Long id;
+    /**
+     * 瀛︽牎浠g爜
+     */
+    private String code;
+    /**
+     * 瀛︽牎鍚嶇О
+     */
+    private String name;
+    /**
+     * 鐪佷唬鐮�
+     */
+    private String provinceCode;
+    /**
+     * 甯備唬鐮�
+     */
+    private String cityCode;
+    /**
+     * 鍖轰唬鐮�
+     */
+    private String areaCode;
+    /**
+     * 鍔炲灞傛
+     */
+    private String schoolRunLevel;
+    /**
+     * 瀛︾鑼冨洿
+     */
+    private String disciplineScope;
+    /**
+     * 澶囨敞
+     */
+    private String remarks;
+    /**
+     * 鍒犻櫎鏍囪瘑
+     */
+    @TableLogic
+    private String delFlag;
+    /**
+     * 涔愯閿�
+     */
+    @Version
+    private Integer version;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsSchoolBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsSchoolBo.java
new file mode 100644
index 0000000..51b5ae6
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/BsSchoolBo.java
@@ -0,0 +1,101 @@
+package com.ruoyi.oa.domain.bo;
+
+import com.ruoyi.common.core.validate.AddGroup;
+import com.ruoyi.common.core.validate.EditGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 瀛︽牎涓氬姟瀵硅薄 bas_school
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("瀛︽牎涓氬姟瀵硅薄")
+public class BsSchoolBo extends BaseEntity {
+
+    private Long id;
+    /**
+     * 瀛︽牎浠g爜
+     */
+    @ApiModelProperty(value = "瀛︽牎浠g爜", required = true)
+    @NotBlank(message = "瀛︽牎浠g爜涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String code;
+
+    /**
+     * 瀛︽牎鍚嶇О
+     */
+    @ApiModelProperty(value = "瀛︽牎鍚嶇О", required = true)
+    @NotBlank(message = "瀛︽牎鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 鐪佷唬鐮�
+     */
+    @ApiModelProperty(value = "鐪佷唬鐮�", required = true)
+//    @NotBlank(message = "鐪佷唬鐮佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String provinceCode;
+
+    /**
+     * 甯備唬鐮�
+     */
+    @ApiModelProperty(value = "甯備唬鐮�", required = true)
+//    @NotBlank(message = "甯備唬鐮佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String cityCode;
+
+    /**
+     * 鍔炲灞傛
+     */
+    @ApiModelProperty(value = "鍔炲灞傛", required = true)
+    @NotBlank(message = "鍔炲灞傛涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String schoolRunLevel;
+
+    /**
+     * 瀛︾鑼冨洿
+     */
+    @ApiModelProperty(value = "瀛︾鑼冨洿", required = true)
+    @NotBlank(message = "瀛︾鑼冨洿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String disciplineScope;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value = "澶囨敞")
+    private String remarks;
+
+
+    /**
+     * 鍒嗛〉澶у皬
+     */
+    @ApiModelProperty("鍒嗛〉澶у皬")
+    private Integer pageSize;
+
+    /**
+     * 褰撳墠椤垫暟
+     */
+    @ApiModelProperty("褰撳墠椤垫暟")
+    private Integer pageNum;
+
+    /**
+     * 鎺掑簭鍒�
+     */
+    @ApiModelProperty("鎺掑簭鍒�")
+    private String orderByColumn;
+
+    /**
+     * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc
+     */
+    @ApiModelProperty(value = "鎺掑簭鐨勬柟鍚�", example = "asc,desc")
+    private String isAsc;
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsCityVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsCityVo.java
new file mode 100644
index 0000000..b62a556
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsCityVo.java
@@ -0,0 +1,121 @@
+package com.ruoyi.oa.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 鍩庡競璁剧疆瑙嗗浘瀵硅薄 bs_city
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Data
+@ApiModel("鍩庡競璁剧疆瑙嗗浘瀵硅薄")
+@ExcelIgnoreUnannotated
+public class BsCityVo {
+
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 鑷鍒�
+     */
+	@ExcelProperty(value = "鑷鍒�")
+	@ApiModelProperty("鑷鍒�")
+	private Long cityId;
+
+    /**
+     * 甯備唬鐮�
+     */
+	@ExcelProperty(value = "甯備唬鐮�")
+	@ApiModelProperty("甯備唬鐮�")
+	private String cityCode;
+
+    /**
+     * 甯傚悕绉�
+     */
+	@ExcelProperty(value = "甯傚悕绉�")
+	@ApiModelProperty("甯傚悕绉�")
+	private String cityName;
+
+    /**
+     * 绠�绉�
+     */
+	@ExcelProperty(value = "绠�绉�")
+	@ApiModelProperty("绠�绉�")
+	private String shortName;
+
+    /**
+     * 鐪佷唬鐮�
+     */
+	@ExcelProperty(value = "鐪佷唬鐮�")
+	@ApiModelProperty("鐪佷唬鐮�")
+	private String provinceCode;
+
+    /**
+     * 缁忓害
+     */
+	@ExcelProperty(value = "缁忓害")
+	@ApiModelProperty("缁忓害")
+	private String LNG;
+
+    /**
+     * 绾害
+     */
+	@ExcelProperty(value = "绾害")
+	@ApiModelProperty("绾害")
+	private String LAT;
+
+    /**
+     * 鎺掑簭
+     */
+	@ExcelProperty(value = "鎺掑簭")
+	@ApiModelProperty("鎺掑簭")
+	private Integer SORT;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+	@ExcelProperty(value = "鍒涘缓鏃堕棿")
+	@ApiModelProperty("鍒涘缓鏃堕棿")
+	private Date gmtCreate;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+	@ExcelProperty(value = "淇敼鏃堕棿")
+	@ApiModelProperty("淇敼鏃堕棿")
+	private Date gmtModified;
+
+    /**
+     * 澶囨敞
+     */
+	@ExcelProperty(value = "澶囨敞")
+	@ApiModelProperty("澶囨敞")
+	private String MEMO;
+
+    /**
+     * 鐘舵��
+     */
+	@ExcelProperty(value = "鐘舵��")
+	@ApiModelProperty("鐘舵��")
+	private Long dataState;
+
+    /**
+     * 绉熸埛ID
+     */
+	@ExcelProperty(value = "绉熸埛ID")
+	@ApiModelProperty("绉熸埛ID")
+	private String tenantCode;
+
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsProvinceVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsProvinceVo.java
new file mode 100644
index 0000000..38d33be
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsProvinceVo.java
@@ -0,0 +1,114 @@
+package com.ruoyi.oa.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 鐪佷唤璁剧疆瑙嗗浘瀵硅薄 bs_province
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Data
+@ApiModel("鐪佷唤璁剧疆瑙嗗浘瀵硅薄")
+@ExcelIgnoreUnannotated
+public class BsProvinceVo {
+
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 鑷鍒�
+     */
+	@ExcelProperty(value = "鑷鍒�")
+	@ApiModelProperty("鑷鍒�")
+	private Long provinceId;
+
+    /**
+     * 鐪佷唤浠g爜
+     */
+	@ExcelProperty(value = "鐪佷唤浠g爜")
+	@ApiModelProperty("鐪佷唤浠g爜")
+	private String provinceCode;
+
+    /**
+     * 鐪佷唤鍚嶇О
+     */
+	@ExcelProperty(value = "鐪佷唤鍚嶇О")
+	@ApiModelProperty("鐪佷唤鍚嶇О")
+	private String provinceName;
+
+    /**
+     * 绠�绉�
+     */
+	@ExcelProperty(value = "绠�绉�")
+	@ApiModelProperty("绠�绉�")
+	private String shortName;
+
+    /**
+     * 缁忓害
+     */
+	@ExcelProperty(value = "缁忓害")
+	@ApiModelProperty("缁忓害")
+	private String LNG;
+
+    /**
+     * 绾害
+     */
+	@ExcelProperty(value = "绾害")
+	@ApiModelProperty("绾害")
+	private String LAT;
+
+    /**
+     * 鎺掑簭
+     */
+	@ExcelProperty(value = "鎺掑簭")
+	@ApiModelProperty("鎺掑簭")
+	private Integer SORT;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+	@ExcelProperty(value = "鍒涘缓鏃堕棿")
+	@ApiModelProperty("鍒涘缓鏃堕棿")
+	private Date gmtCreate;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+	@ExcelProperty(value = "淇敼鏃堕棿")
+	@ApiModelProperty("淇敼鏃堕棿")
+	private Date gmtModified;
+
+    /**
+     * 澶囨敞
+     */
+	@ExcelProperty(value = "澶囨敞")
+	@ApiModelProperty("澶囨敞")
+	private String MEMO;
+
+    /**
+     * 鐘舵��
+     */
+	@ExcelProperty(value = "鐘舵��")
+	@ApiModelProperty("鐘舵��")
+	private Long dataState;
+
+    /**
+     * 绉熸埛ID
+     */
+	@ExcelProperty(value = "绉熸埛ID")
+	@ApiModelProperty("绉熸埛ID")
+	private String tenantCode;
+
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsSchoolVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsSchoolVo.java
new file mode 100644
index 0000000..1ca5c09
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/BsSchoolVo.java
@@ -0,0 +1,89 @@
+package com.ruoyi.oa.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.Dict;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 瀛︽牎瑙嗗浘瀵硅薄 bas_school
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Data
+@ApiModel("瀛︽牎瑙嗗浘瀵硅薄")
+@ExcelIgnoreUnannotated
+public class BsSchoolVo {
+
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+	@ExcelProperty(value = "id")
+	@ApiModelProperty("id")
+	private Long id;
+
+    /**
+     * 瀛︽牎浠g爜
+     */
+	@ExcelProperty(value = "瀛︽牎浠g爜")
+	@ApiModelProperty("瀛︽牎浠g爜")
+	private String code;
+
+    /**
+     * 瀛︽牎鍚嶇О
+     */
+	@ExcelProperty(value = "瀛︽牎鍚嶇О")
+	@ApiModelProperty("瀛︽牎鍚嶇О")
+	private String name;
+
+    /**
+     * 鐪佷唬鐮�
+     */
+	@ExcelProperty(value = "鐪佷唬鐮�")
+	@ApiModelProperty("鐪佷唬鐮�")
+    @Dict(dictTable = "bs_province", dicCode = "PROVINCE_CODE", dicText = "PROVINCE_NAME")
+	private String provinceCode;
+
+    /**
+     * 甯備唬鐮�
+     */
+	@ExcelProperty(value = "甯備唬鐮�")
+	@ApiModelProperty("甯備唬鐮�")
+    @Dict(dictTable = "bs_city", dicCode = "CITY_CODE", dicText = "CITY_NAME")
+    private String cityCode;
+
+    /**
+     * 鍔炲灞傛
+     */
+    @ExcelProperty(value = "鍔炲灞傛", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "DICT105")
+	@ApiModelProperty("鍔炲灞傛")
+	private String schoolRunLevel;
+
+    /**
+     * 瀛︾鑼冨洿
+     */
+    @ExcelProperty(value = "瀛︾鑼冨洿", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "DICT106")
+	@ApiModelProperty("瀛︾鑼冨洿")
+	private String disciplineScope;
+
+    /**
+     * 澶囨敞
+     */
+	@ExcelProperty(value = "澶囨敞")
+	@ApiModelProperty("澶囨敞")
+	private String remarks;
+
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsCityMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsCityMapper.java
new file mode 100644
index 0000000..04cf152
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsCityMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.oa.mapper;
+
+import com.ruoyi.oa.domain.BsCity;
+import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
+
+/**
+ * 鍩庡競璁剧疆Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+public interface BsCityMapper extends BaseMapperPlus<BsCity> {
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsProvinceMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsProvinceMapper.java
new file mode 100644
index 0000000..7bd71f9
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsProvinceMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.oa.mapper;
+
+import com.ruoyi.oa.domain.BsProvince;
+import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
+
+/**
+ * 鐪佷唤璁剧疆Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+public interface BsProvinceMapper extends BaseMapperPlus<BsProvince> {
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsSchoolMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsSchoolMapper.java
new file mode 100644
index 0000000..8a8b4d9
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/BsSchoolMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.oa.mapper;
+
+import com.ruoyi.oa.domain.BsSchool;
+import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
+
+/**
+ * 瀛︽牎Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+public interface BsSchoolMapper extends BaseMapperPlus<BsSchool> {
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsCityService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsCityService.java
new file mode 100644
index 0000000..2cbb646
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsCityService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.oa.service;
+
+import com.ruoyi.oa.domain.BsCity;
+import com.ruoyi.oa.domain.vo.BsCityVo;
+import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
+import java.util.List;
+
+/**
+ * 鍩庡競璁剧疆Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+public interface IBsCityService extends IServicePlus<BsCity, BsCityVo> {
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+	List<BsCity> queryList(String provinceCode);
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsProvinceService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsProvinceService.java
new file mode 100644
index 0000000..e039304
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsProvinceService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.oa.service;
+
+import com.ruoyi.oa.domain.BsProvince;
+import com.ruoyi.oa.domain.vo.BsProvinceVo;
+import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
+import java.util.List;
+
+/**
+ * 鐪佷唤璁剧疆Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+public interface IBsProvinceService extends IServicePlus<BsProvince, BsProvinceVo> {
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+	List<BsProvince> queryList();
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsSchoolService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsSchoolService.java
new file mode 100644
index 0000000..4e68569
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IBsSchoolService.java
@@ -0,0 +1,56 @@
+package com.ruoyi.oa.service;
+
+import com.ruoyi.oa.domain.BsSchool;
+import com.ruoyi.oa.domain.bo.BsSchoolBo;
+import com.ruoyi.oa.domain.vo.BsSchoolVo;
+import com.ruoyi.common.core.mybatisplus.core.IServicePlus;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 瀛︽牎Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+public interface IBsSchoolService extends IServicePlus<BsSchool, BsSchoolVo> {
+	/**
+	 * 鏌ヨ鍗曚釜
+	 * @return
+	 */
+	BsSchoolVo queryById(Long id);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+    TableDataInfo<BsSchoolVo> queryPageList(BsSchoolBo bo);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 */
+	List<BsSchoolVo> queryList(BsSchoolBo bo);
+
+	/**
+	 * 鏍规嵁鏂板涓氬姟瀵硅薄鎻掑叆瀛︽牎
+	 * @param bo 瀛︽牎鏂板涓氬姟瀵硅薄
+	 * @return
+	 */
+	Boolean insertByBo(BsSchoolBo bo);
+
+	/**
+	 * 鏍规嵁缂栬緫涓氬姟瀵硅薄淇敼瀛︽牎
+	 * @param bo 瀛︽牎缂栬緫涓氬姟瀵硅薄
+	 * @return
+	 */
+	Boolean updateByBo(BsSchoolBo bo);
+
+	/**
+	 * 鏍¢獙骞跺垹闄ゆ暟鎹�
+	 * @param ids 涓婚敭闆嗗悎
+	 * @param isValid 鏄惁鏍¢獙,true-鍒犻櫎鍓嶆牎楠�,false-涓嶆牎楠�
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsCityServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsCityServiceImpl.java
new file mode 100644
index 0000000..e2c9b42
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsCityServiceImpl.java
@@ -0,0 +1,26 @@
+package com.ruoyi.oa.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.stereotype.Service;
+import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
+import com.ruoyi.oa.domain.vo.BsCityVo;
+import com.ruoyi.oa.domain.BsCity;
+import com.ruoyi.oa.mapper.BsCityMapper;
+import com.ruoyi.oa.service.IBsCityService;
+import java.util.List;
+
+/**
+ * 鍩庡競璁剧疆Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Service
+public class BsCityServiceImpl extends ServicePlusImpl<BsCityMapper, BsCity, BsCityVo> implements IBsCityService {
+
+    @Override
+    public List<BsCity> queryList(String provinceCode) {
+        return baseMapper.selectList(new QueryWrapper<BsCity>().lambda().eq(BsCity::getProvinceCode, provinceCode).orderByAsc(BsCity::getSort));
+    }
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsProvinceServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsProvinceServiceImpl.java
new file mode 100644
index 0000000..2a4a369
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsProvinceServiceImpl.java
@@ -0,0 +1,26 @@
+package com.ruoyi.oa.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.stereotype.Service;
+import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
+import com.ruoyi.oa.domain.vo.BsProvinceVo;
+import com.ruoyi.oa.domain.BsProvince;
+import com.ruoyi.oa.mapper.BsProvinceMapper;
+import com.ruoyi.oa.service.IBsProvinceService;
+import java.util.List;
+
+/**
+ * 鐪佷唤璁剧疆Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Service
+public class BsProvinceServiceImpl extends ServicePlusImpl<BsProvinceMapper, BsProvince, BsProvinceVo> implements IBsProvinceService {
+
+    @Override
+    public List<BsProvince> queryList() {
+        return baseMapper.selectList(new QueryWrapper<BsProvince>().lambda().orderByAsc(BsProvince::getSort));
+    }
+
+}
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsSchoolServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsSchoolServiceImpl.java
new file mode 100644
index 0000000..c4892a4
--- /dev/null
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/BsSchoolServiceImpl.java
@@ -0,0 +1,109 @@
+package com.ruoyi.oa.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.HttpStatus;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.core.page.PagePlus;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.oa.domain.bo.BsSchoolBo;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.oa.domain.vo.BsSchoolVo;
+import com.ruoyi.oa.domain.BsSchool;
+import com.ruoyi.oa.mapper.BsSchoolMapper;
+import com.ruoyi.oa.service.IBsSchoolService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 瀛︽牎Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2021-12-03
+ */
+@Service
+public class BsSchoolServiceImpl extends ServicePlusImpl<BsSchoolMapper, BsSchool, BsSchoolVo> implements IBsSchoolService {
+
+    @Value("${mybatis-plus.global-config.dbConfig.logicNotDeleteValue}")
+    private String logicNotDeleteValue;
+
+    @Override
+    public BsSchoolVo queryById(Long id){
+        return getVoById(id);
+    }
+
+    @Override
+    public TableDataInfo<BsSchoolVo> queryPageList(BsSchoolBo bo) {
+        PagePlus<BsSchool, BsSchoolVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo));
+        return PageUtils.buildDataInfo(result);
+    }
+
+    @Override
+    public List<BsSchoolVo> queryList(BsSchoolBo bo) {
+        return listVo(buildQueryWrapper(bo));
+    }
+
+    private LambdaQueryWrapper<BsSchool> buildQueryWrapper(BsSchoolBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<BsSchool> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getCode()), BsSchool::getCode, bo.getCode());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), BsSchool::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getProvinceCode()), BsSchool::getProvinceCode, bo.getProvinceCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getCityCode()), BsSchool::getCityCode, bo.getCityCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getSchoolRunLevel()), BsSchool::getSchoolRunLevel, bo.getSchoolRunLevel());
+        lqw.eq(StringUtils.isNotBlank(bo.getDisciplineScope()), BsSchool::getDisciplineScope, bo.getDisciplineScope());
+        return lqw;
+    }
+
+    @Override
+    public Boolean insertByBo(BsSchoolBo bo) {
+        List<BsSchool> list = baseMapper.selectList(new QueryWrapper<BsSchool>().lambda().eq(BsSchool::getCode, bo.getCode()));
+        if (list.size() > 0) {
+            throw new ServiceException("瀛︽牎浠g爜閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        BsSchool add = BeanUtil.toBean(bo, BsSchool.class);
+        add.setDelFlag(logicNotDeleteValue);
+        boolean flag = save(add);
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean updateByBo(BsSchoolBo bo) {
+        List<BsSchool> list = baseMapper.selectList(new QueryWrapper<BsSchool>().lambda()
+            .eq(BsSchool::getCode, bo.getCode()).ne(BsSchool::getId, bo.getId()));
+        if (list.size() > 0) {
+            throw new ServiceException("瀛︽牎浠g爜閲嶅", HttpStatus.HTTP_PARTIAL);
+        }
+        BsSchool update = BeanUtil.toBean(bo, BsSchool.class);
+        validEntityBeforeSave(update);
+        return updateById(update);
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     *
+     * @param entity 瀹炰綋绫绘暟鎹�
+     */
+    private void validEntityBeforeSave(BsSchool entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return removeByIds(ids);
+    }
+}
diff --git a/ruoyi-oa/src/main/resources/mapper/oa/BsProvinceMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/BsProvinceMapper.xml
new file mode 100644
index 0000000..3e62f41
--- /dev/null
+++ b/ruoyi-oa/src/main/resources/mapper/oa/BsProvinceMapper.xml
@@ -0,0 +1,23 @@
+<?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.oa.mapper.BsProvinceMapper">
+
+    <resultMap type="com.ruoyi.oa.domain.BsProvince" id="BsProvinceResult">
+        <result property="provinceId" column="PROVINCE_ID"/>
+        <result property="provinceCode" column="PROVINCE_CODE"/>
+        <result property="provinceName" column="PROVINCE_NAME"/>
+        <result property="shortName" column="SHORT_NAME"/>
+        <result property="LNG" column="LNG"/>
+        <result property="LAT" column="LAT"/>
+        <result property="SORT" column="SORT"/>
+        <result property="gmtCreate" column="GMT_CREATE"/>
+        <result property="gmtModified" column="GMT_MODIFIED"/>
+        <result property="MEMO" column="MEMO"/>
+        <result property="dataState" column="DATA_STATE"/>
+        <result property="tenantCode" column="TENANT_CODE"/>
+    </resultMap>
+
+
+</mapper>
diff --git a/ruoyi-oa/src/main/resources/mapper/oa/BsSchoolMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/BsSchoolMapper.xml
new file mode 100644
index 0000000..c5b1e9a
--- /dev/null
+++ b/ruoyi-oa/src/main/resources/mapper/oa/BsSchoolMapper.xml
@@ -0,0 +1,26 @@
+<?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.oa.mapper.BsSchoolMapper">
+
+    <resultMap type="com.ruoyi.oa.domain.BsSchool" id="BasSchoolResult">
+        <result property="id" column="id"/>
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="provinceCode" column="province_code"/>
+        <result property="cityCode" column="city_code"/>
+        <result property="areaCode" column="area_code"/>
+        <result property="schoolRunLevel" column="school_run_level"/>
+        <result property="disciplineScope" column="discipline_scope"/>
+        <result property="remarks" column="remarks"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="version" column="version"/>
+    </resultMap>
+
+
+</mapper>
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
index e45c198..30c477c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -20,4 +21,8 @@
                         .eq(SysDictData::getDictType, dictType)
                         .orderByAsc(SysDictData::getDictSort));
     }
+
+    String queryDictTextByKey(@Param("code") String code, @Param("key") String key);
+
+    String queryTableDictTextByKey(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("key") String key);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
index ce6898e..12a3df3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
@@ -64,4 +64,24 @@
      * @return 缁撴灉
      */
     int updateDictData(SysDictData dictData);
+
+    /**
+     * 閫氳繃瀛楀吀code鑾峰彇瀛楀吀鏁版嵁
+     *
+     * @param code 瀛楀吀code
+     * @param key  瀛楀吀鍊�
+     * @return 瀛楀吀text
+     */
+    String queryDictTextByKey(String code, String key);
+
+    /**
+     * 閫氳繃鏌ヨ鎸囧畾table鐨� text code 鑾峰彇瀛楀吀鍊紅ext
+     * dictTableCache閲囩敤redis缂撳瓨鏈夋晥鏈�10鍒嗛挓
+     * @param table
+     * @param text
+     * @param code
+     * @param key
+     * @return
+     */
+    String queryTableDictTextByKey(String table, String text, String code, String key);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommonApiImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommonApiImpl.java
new file mode 100644
index 0000000..60d6e2d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommonApiImpl.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.api.CommonAPI;
+import com.ruoyi.system.service.ISysDictDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: 搴曞眰鍏遍�氫笟鍔PI锛屾彁渚涘叾浠栫嫭绔嬫ā鍧楄皟鐢�
+ * @Date:2021-11-17
+ */
+@Slf4j
+@Service
+public class CommonApiImpl implements CommonAPI {
+    /**
+     * 褰撳墠绯荤粺鏁版嵁搴撶被鍨�
+     */
+    private static String DB_TYPE = "";
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @Override
+    public String translateDictFromTable(String table, String text, String code, String key) {
+		return dictDataService.queryTableDictTextByKey(table, text, code, key);
+    }
+
+    @Override
+    public String translateDict(String code, String key) {
+        return dictDataService.queryDictTextByKey(code, key);
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
index d2ac2a0..e001ad2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.constant.CacheConstant;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
@@ -10,6 +11,7 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.mapper.SysDictDataMapper;
 import com.ruoyi.system.service.ISysDictDataService;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -131,4 +133,35 @@
     String getCacheKey(String configKey) {
         return Constants.SYS_DICT_KEY + configKey;
     }
+
+    /**
+     * 閫氳繃鏌ヨ鎸囧畾code 鑾峰彇瀛楀吀鍊紅ext
+     *
+     * @param code
+     * @param key
+     * @return
+     */
+    @Override
+    @Cacheable(value = CacheConstant.SYS_DICT_CACHE, key = "#code+':'+#key")
+    public String queryDictTextByKey(String code, String key) {
+        System.out.println("鏃犵紦瀛榙ictText鐨勬椂鍊欒皟鐢ㄨ繖閲岋紒");
+        return baseMapper.queryDictTextByKey(code, key);
+    }
+
+    /**
+     * 閫氳繃鏌ヨ鎸囧畾table鐨� text code 鑾峰彇瀛楀吀鍊紅ext
+     * dictTableCache閲囩敤redis缂撳瓨鏈夋晥鏈�10鍒嗛挓
+     *
+     * @param table
+     * @param text
+     * @param code
+     * @param key
+     * @return
+     */
+    @Override
+    @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE)
+    public String queryTableDictTextByKey(String table, String text, String code, String key) {
+        System.out.println("鏃犵紦瀛榙ictTable鐨勬椂鍊欒皟鐢ㄨ繖閲岋紒");
+        return baseMapper.queryTableDictTextByKey(table, text, code, key);
+    }
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
index f17d593..663ff90 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
@@ -20,4 +20,11 @@
         <result property="updateTime" column="update_time"/>
     </resultMap>
 
-</mapper> 
\ No newline at end of file
+    <select id="queryDictTextByKey" resultType="java.lang.String">
+        select s.dict_label from sys_dict_data s where s.dict_type = #{code} and s.dict_value = #{key}
+    </select>
+
+    <select id="queryTableDictTextByKey" resultType="java.lang.String">
+        select ${text} as "text" from ${table} where ${code}= #{key}
+    </select>
+</mapper>

--
Gitblit v1.9.1