mojinxia пре 1 месец
родитељ
комит
fcc5054b15
23 измењених фајлова са 2263 додато и 382 уклоњено
  1. 18 9
      back-ui/src/api/dz/classes.js
  2. 8 0
      back-ui/src/api/dz/school.js
  3. 51 0
      back-ui/src/api/system/area.js
  4. 39 0
      back-ui/src/components/AddressSelect/index.vue
  5. 259 181
      back-ui/src/views/dz/classes/index.vue
  6. 50 39
      back-ui/src/views/dz/school/index.vue
  7. 523 0
      back-ui/src/views/system/area/index.vue
  8. 20 20
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzClassesController.java
  9. 8 1
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzSchoolController.java
  10. 112 0
      ie-admin/src/main/java/com/ruoyi/web/controller/system/SysAreaController.java
  11. 26 0
      ie-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
  12. 71 24
      ie-system/src/main/java/com/ruoyi/dz/domain/DzClasses.java
  13. 28 17
      ie-system/src/main/java/com/ruoyi/dz/domain/DzSchool.java
  14. 19 19
      ie-system/src/main/java/com/ruoyi/dz/mapper/DzClassesMapper.java
  15. 19 19
      ie-system/src/main/java/com/ruoyi/dz/service/IDzClassesService.java
  16. 25 22
      ie-system/src/main/java/com/ruoyi/dz/service/impl/DzClassesServiceImpl.java
  17. 469 0
      ie-system/src/main/java/com/ruoyi/system/domain/SysArea.java
  18. 61 0
      ie-system/src/main/java/com/ruoyi/system/mapper/SysAreaMapper.java
  19. 61 0
      ie-system/src/main/java/com/ruoyi/system/service/ISysAreaService.java
  20. 146 0
      ie-system/src/main/java/com/ruoyi/system/service/impl/SysAreaServiceImpl.java
  21. 40 17
      ie-system/src/main/resources/mapper/dz/DzClassesMapper.xml
  22. 28 14
      ie-system/src/main/resources/mapper/dz/DzSchoolMapper.xml
  23. 182 0
      ie-system/src/main/resources/mapper/system/SysAreaMapper.xml

+ 18 - 9
back-ui/src/api/dz/classes.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-// 查询机构班级列表
+// 查询学生班级列表
 export function listClasses(query) {
   return request({
     url: '/dz/classes/list',
@@ -9,15 +9,24 @@ export function listClasses(query) {
   })
 }
 
-// 查询机构班级详细
-export function getClasses(id) {
+// 查询学生班级列表
+export function listAllSchool(query) {
   return request({
-    url: '/dz/classes/' + id,
+    url: '/dz/classes/getSchoolList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询学生班级详细
+export function getClasses(classId) {
+  return request({
+    url: '/dz/classes/' + classId,
     method: 'get'
   })
 }
 
-// 新增机构班级
+// 新增学生班级
 export function addClasses(data) {
   return request({
     url: '/dz/classes',
@@ -26,7 +35,7 @@ export function addClasses(data) {
   })
 }
 
-// 修改机构班级
+// 修改学生班级
 export function updateClasses(data) {
   return request({
     url: '/dz/classes',
@@ -35,10 +44,10 @@ export function updateClasses(data) {
   })
 }
 
-// 删除机构班级
-export function delClasses(id) {
+// 删除学生班级
+export function delClasses(classId) {
   return request({
-    url: '/dz/classes/' + id,
+    url: '/dz/classes/' + classId,
     method: 'delete'
   })
 }

+ 8 - 0
back-ui/src/api/dz/school.js

@@ -1,5 +1,13 @@
 import request from '@/utils/request'
 
+// 查询机构校区列表
+export function listAllSchool(query) {
+  return request({
+    url: '/dz/school/getSchoolList',
+    method: 'get',
+    params: query
+  })
+}
 // 查询机构校区列表
 export function listSchool(query) {
   return request({

+ 51 - 0
back-ui/src/api/system/area.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+// 查询区域-省市区县列表
+export function listArea(query) {
+  return request({
+    url: '/system/area/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询区域-省市区县详细
+export function getArea(areaId) {
+  return request({
+    url: '/system/area/' + areaId,
+    method: 'get'
+  })
+}
+
+// 新增区域-省市区县
+export function addArea(data) {
+  return request({
+    url: '/system/area',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改区域-省市区县
+export function updateArea(data) {
+  return request({
+    url: '/system/area',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除区域-省市区县
+export function delArea(areaId) {
+  return request({
+    url: '/system/area/' + areaId,
+    method: 'delete'
+  })
+}
+
+/***下拉选择 */
+export async function cascaderAreaList(parentId) {
+  let query = { columns: 'id,full_name,parent_id,has_children', parentId };
+  let res = await request.get('/system/area/list/tree', { params: query });
+  return (res.rows || []).map(item => ({ ...item, leaf: !item.hasChildren }));
+}

+ 39 - 0
back-ui/src/components/AddressSelect/index.vue

@@ -0,0 +1,39 @@
+<template>
+  <el-cascader :options="data" :props="props" v-model="ids" clearable @change="handleChange" />
+</template>
+<script setup>
+import { cascaderAreaList } from "@/api/system/area";
+const data = ref([]);
+const ids = ref('');
+const opts = defineProps({
+  value: String
+});
+watch(opts, (val) => {
+  ids.value = val;
+});
+const emit = defineEmits(['update:value', 'change']);
+const props = {
+  multiple: false,
+  checkStrictly: true,
+  label: 'areaName',
+  value: 'areaId',
+  lazy: true,
+  async lazyLoad(node, resolve) {
+    const { level, value } = node;
+    if (level === 0) {
+      // resolve(await getAreaList(100000));
+      resolve(await getAreaList());
+    } else {
+      resolve(await getAreaList(value));
+    }
+  },
+};
+async function getAreaList(parentId) {
+  return cascaderAreaList(parentId);
+}
+function handleChange() {
+  emit('update:value', ids.value || []);
+  emit('change', ids.value || []);
+}
+</script>
+<style lang="scss" scoped></style>

+ 259 - 181
back-ui/src/views/dz/classes/index.vue

@@ -1,32 +1,64 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="班级名称" prop="name">
+<!--      <el-form-item label="学校" prop="schoolId">-->
+<!--        <el-input-->
+<!--                v-model="queryParams.schoolId"-->
+<!--                placeholder="请输入学校"-->
+<!--                clearable-->
+<!--                @keyup.enter="handleQuery"-->
+<!--        />-->
+<!--      </el-form-item>-->
+      <el-form-item label="所在校区" prop="schoolId">
+        <el-select
+                v-model="queryParams.schoolId"
+                placeholder="请选择所在校区"
+                clearable
+                style="width: 240px"
+                @keyup.enter="handleQuery"
+        >
+          <el-option
+                  v-for="item in schoolOptions"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="开班年份" prop="year">
         <el-input
-          v-model="queryParams.name"
-          placeholder="请输入班级名称"
-          clearable
-          @keyup.enter="handleQuery"
+                v-model="queryParams.year"
+                placeholder="请输入开班年份"
+                clearable
+                @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="所在校区" prop="schoolId">
+      <el-form-item label="名称" prop="name">
         <el-input
-          v-model="queryParams.schoolId"
-          placeholder="请输入所在校区"
-          clearable
-          @keyup.enter="handleQuery"
+                v-model="queryParams.name"
+                placeholder="请输入名称"
+                clearable
+                @keyup.enter="handleQuery"
         />
       </el-form-item>
       <el-form-item label="是否线上" prop="online">
-        <el-select v-model="queryParams.online" placeholder="请选择是否线上" clearable style="width: 170px">
+        <el-select v-model="queryParams.online" placeholder="请选择是否线上" clearable style="width: 170px;">
           <el-option
-            v-for="dict in sys_yes_no"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
+                  v-for="dict in bool_values"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-input
+                v-model="queryParams.status"
+                placeholder="请输入状态"
+                clearable
+                @keyup.enter="handleQuery"
+        />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -36,40 +68,40 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-          v-hasPermi="['dz:classes:add']"
+                type="primary"
+                plain
+                icon="Plus"
+                @click="handleAdd"
+                v-hasPermi="['dz:classes:add']"
         >新增</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['dz:classes:edit']"
+                type="success"
+                plain
+                icon="Edit"
+                :disabled="single"
+                @click="handleUpdate"
+                v-hasPermi="['dz:classes:edit']"
         >修改</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['dz:classes:remove']"
+                type="danger"
+                plain
+                icon="Delete"
+                :disabled="multiple"
+                @click="handleDelete"
+                v-hasPermi="['dz:classes:remove']"
         >删除</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-          type="warning"
-          plain
-          icon="Download"
-          @click="handleExport"
-          v-hasPermi="['dz:classes:export']"
+                type="warning"
+                plain
+                icon="Download"
+                @click="handleExport"
+                v-hasPermi="['dz:classes:export']"
         >导出</el-button>
       </el-col>
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
@@ -77,14 +109,21 @@
 
     <el-table v-loading="loading" :data="classesList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="班级id" align="center" prop="id" />
-      <el-table-column label="班级名称" align="center" prop="name" />
-      <el-table-column label="所在校区" align="center" prop="schoolId" />
+      <el-table-column label="ID" align="center" prop="classId" />
+      <el-table-column label="名称" align="center" prop="name" />
+      <el-table-column label="学校" align="center" prop="schoolId" />
+      <el-table-column label="开班年份" align="center" prop="year" />
       <el-table-column label="是否线上" align="center" prop="online">
         <template #default="scope">
-          <dict-tag :options="sys_yes_no" :value="scope.row.online"/>
+          <dict-tag :options="bool_values" :value="scope.row.online"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :options="bool_values" :value="scope.row.status"/>
         </template>
       </el-table-column>
+      <el-table-column label="统计数据" align="center" prop="stats" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dz:classes:edit']">修改</el-button>
@@ -94,30 +133,48 @@
     </el-table>
 
     <pagination
-      v-show="total>0"
-      :total="total"
-      v-model:page="queryParams.pageNum"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
+            v-show="total>0"
+            :total="total"
+            v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize"
+            @pagination="getList"
     />
 
-    <!-- 添加或修改机构班级对话框 -->
+    <!-- 添加或修改学生班级对话框 -->
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
       <el-form ref="classesRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="班级名称" prop="name">
-          <el-input v-model="form.name" placeholder="请输入班级名称" />
+<!--        <el-form-item label="学校" prop="schoolId">-->
+<!--          <el-input v-model="form.schoolId" placeholder="请输入学校" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入名称" />
         </el-form-item>
         <el-form-item label="所在校区" prop="schoolId">
-          <el-input v-model="form.schoolId" placeholder="请输入所在校区" />
+          <el-select v-model="form.schoolId" placeholder="请选择所在校区" style="width: 100%">
+            <el-option
+                    v-for="item in schoolOptions"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="开班年份" prop="year">
+          <el-input v-model="form.year" placeholder="请输入开班年份" />
         </el-form-item>
+
         <el-form-item label="是否线上" prop="online">
-          <el-radio-group v-model="form.online">
-            <el-radio
-              v-for="dict in sys_yes_no"
-              :key="dict.value"
-              :label="parseInt(dict.value)"
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
+          <el-select v-model="form.online" placeholder="请选择是否线上">
+            <el-option
+                    v-for="dict in bool_values"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-input v-model="form.status" placeholder="请输入状态" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -131,147 +188,168 @@
 </template>
 
 <script setup name="Classes">
-import { listClasses, getClasses, delClasses, addClasses, updateClasses } from "@/api/dz/classes"
+  import { listClasses, getClasses, delClasses, addClasses, updateClasses } from "@/api/dz/classes"
+  import { listAllSchool } from "@/api/dz/school"
 
-const { proxy } = getCurrentInstance()
-const { sys_yes_no } = proxy.useDict('sys_yes_no')
+  const { proxy } = getCurrentInstance()
+  const { bool_values } = proxy.useDict('bool_values')
 
-const classesList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
 
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    name: null,
-    schoolId: null,
-    online: null
-  },
-  rules: {
-    name: [
-      { required: true, message: "班级名称不能为空", trigger: "blur" }
-    ],
-    schoolId: [
-      { required: true, message: "所在校区不能为空", trigger: "blur" }
-    ],
-    online: [
-      { required: true, message: "是否线上不能为空", trigger: "change" }
-    ]
-  }
-})
-
-const { queryParams, form, rules } = toRefs(data)
+  const classesList = ref([])
+  const schoolOptions = ref([])
+  const open = ref(false)
+  const loading = ref(true)
+  const showSearch = ref(true)
+  const ids = ref([])
+  const single = ref(true)
+  const multiple = ref(true)
+  const total = ref(0)
+  const title = ref("")
 
-/** 查询机构班级列表 */
-function getList() {
-  loading.value = true
-  listClasses(queryParams.value).then(response => {
-    classesList.value = response.rows
-    total.value = response.total
-    loading.value = false
+  const data = reactive({
+    form: {},
+    queryParams: {
+      pageNum: 1,
+      pageSize: 10,
+      schoolId: null,
+      year: null,
+      name: null,
+      online: null,
+      status: null,
+      stats: null,
+    },
+    rules: {
+      name: [
+        { required: true, message: "名称不能为空", trigger: "blur" }
+      ],
+      schoolId: [
+        { required: true, message: "所在校区不能为空", trigger: "blur" }
+      ],
+      online: [
+        { required: true, message: "是否线上不能为空", trigger: "change" }
+      ],
+    }
   })
-}
 
-// 取消按钮
-function cancel() {
-  open.value = false
-  reset()
-}
+  const { queryParams, form, rules } = toRefs(data)
+
+  /** 查询学生班级列表 */
+  function getList() {
+    loading.value = true
+    listClasses(queryParams.value).then(response => {
+      classesList.value = response.rows
+      total.value = response.total
+      loading.value = false
+    })
+  }
+
+  /** 查询校区列表 */
+  function getSchoolList() {
+    listAllSchool().then(response => {
+      schoolOptions.value = response.data || []
+    })
+  }
 
-// 表单重置
-function reset() {
-  form.value = {
-    id: null,
-    name: null,
-    schoolId: null,
-    online: null
+  // 取消按钮
+  function cancel() {
+    open.value = false
+    reset()
   }
-  proxy.resetForm("classesRef")
-}
 
-/** 搜索按钮操作 */
-function handleQuery() {
-  queryParams.value.pageNum = 1
-  getList()
-}
+  // 表单重置
+  function reset() {
+    form.value = {
+      classId: null,
+      schoolId: null,
+      year: null,
+      name: null,
+      online: null,
+      status: null,
+      stats: null,
+      createTime: null,
+      updateTime: null
+    }
+    proxy.resetForm("classesRef")
+  }
 
-/** 重置按钮操作 */
-function resetQuery() {
-  proxy.resetForm("queryRef")
-  handleQuery()
-}
+  /** 搜索按钮操作 */
+  function handleQuery() {
+    queryParams.value.pageNum = 1
+    getList()
+  }
 
-// 多选框选中数据
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.id)
-  single.value = selection.length != 1
-  multiple.value = !selection.length
-}
+  /** 重置按钮操作 */
+  function resetQuery() {
+    proxy.resetForm("queryRef")
+    handleQuery()
+  }
 
-/** 新增按钮操作 */
-function handleAdd() {
-  reset()
-  open.value = true
-  title.value = "添加机构班级"
-}
+  // 多选框选中数据
+  function handleSelectionChange(selection) {
+    ids.value = selection.map(item => item.classId)
+    single.value = selection.length != 1
+    multiple.value = !selection.length
+  }
 
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset()
-  const _id = row.id || ids.value
-  getClasses(_id).then(response => {
-    form.value = response.data
+  /** 新增按钮操作 */
+  function handleAdd() {
+    reset()
     open.value = true
-    title.value = "修改机构班级"
-  })
-}
+    title.value = "添加学生班级"
+  }
 
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["classesRef"].validate(valid => {
-    if (valid) {
-      if (form.value.id != null) {
-        updateClasses(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功")
-          open.value = false
-          getList()
-        })
-      } else {
-        addClasses(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功")
-          open.value = false
-          getList()
-        })
+  /** 修改按钮操作 */
+  function handleUpdate(row) {
+    reset()
+    const _classId = row.classId || ids.value
+    getClasses(_classId).then(response => {
+      form.value = response.data
+      open.value = true
+      title.value = "修改学生班级"
+    })
+  }
+
+  /** 提交按钮 */
+  function submitForm() {
+    proxy.$refs["classesRef"].validate(valid => {
+      if (valid) {
+        if (form.value.classId != null) {
+          updateClasses(form.value).then(response => {
+            proxy.$modal.msgSuccess("修改成功")
+            open.value = false
+            getList()
+          })
+        } else {
+          addClasses(form.value).then(response => {
+            proxy.$modal.msgSuccess("新增成功")
+            open.value = false
+            getList()
+          })
+        }
       }
-    }
-  })
-}
+    })
+  }
 
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _ids = row.id || ids.value
-  proxy.$modal.confirm('是否确认删除机构班级编号为"' + _ids + '"的数据项?').then(function() {
-    return delClasses(_ids)
-  }).then(() => {
-    getList()
-    proxy.$modal.msgSuccess("删除成功")
-  }).catch(() => {})
-}
+  /** 删除按钮操作 */
+  function handleDelete(row) {
+    const _classIds = row.classId || ids.value
+    proxy.$modal.confirm('是否确认删除学生班级编号为"' + _classIds + '"的数据项?').then(function() {
+      return delClasses(_classIds)
+    }).then(() => {
+      getList()
+      proxy.$modal.msgSuccess("删除成功")
+    }).catch(() => {})
+  }
 
-/** 导出按钮操作 */
-function handleExport() {
-  proxy.download('dz/classes/export', {
-    ...queryParams.value
-  }, `classes_${new Date().getTime()}.xlsx`)
-}
+  /** 导出按钮操作 */
+  function handleExport() {
+    proxy.download('dz/classes/export', {
+      ...queryParams.value
+    }, `classes_${new Date().getTime()}.xlsx`)
+  }
 
-getList()
+  onMounted(() => {
+    getSchoolList()
+    getList()
+  })
 </script>

+ 50 - 39
back-ui/src/views/dz/school/index.vue

@@ -32,30 +32,10 @@
                         @keyup.enter="handleQuery"
                 />
               </el-form-item>
-              <el-form-item label="省" prop="pro">
-                <el-input
-                        v-model="queryParams.pro"
-                        placeholder="请输入省"
-                        clearable
-                        @keyup.enter="handleQuery"
-                />
-              </el-form-item>
-              <el-form-item label="市" prop="city">
-                <el-input
-                        v-model="queryParams.city"
-                        placeholder="请输入市"
-                        clearable
-                        @keyup.enter="handleQuery"
-                />
-              </el-form-item>
-              <el-form-item label="区" prop="area">
-                <el-input
-                        v-model="queryParams.area"
-                        placeholder="请输入区"
-                        clearable
-                        @keyup.enter="handleQuery"
-                />
+              <el-form-item label="省市区" prop="areaIds">
+                <AddressSelect class="w-[198px]" v-model="areaIds" />
               </el-form-item>
+
               <el-form-item label="状态" prop="status">
                 <el-select v-model="queryParams.status" placeholder="请选择状态" clearable style="width: 170px">
                   <el-option
@@ -118,9 +98,10 @@
               <el-table-column type="selection" width="55" align="center" />
               <el-table-column label="ID" align="center" prop="id" />
               <el-table-column label="名称" align="center" prop="name" />
-              <el-table-column label="机构ID" align="center" prop="deptId" />
+<!--              <el-table-column label="机构ID" align="center" prop="deptId" />-->
+              <el-table-column label="归属机构" align="center" key="deptName" prop="dept.deptName" :show-overflow-tooltip="true" />
               <el-table-column label="省份" align="center" prop="location" />
-              <el-table-column label="备注" align="center" prop="remark" />
+
               <el-table-column label="省" align="center" prop="pro" />
               <el-table-column label="市" align="center" prop="city" />
               <el-table-column label="区" align="center" prop="area" />
@@ -129,6 +110,7 @@
                   <dict-tag :options="bool_values" :value="scope.row.status"/>
                 </template>
               </el-table-column>
+              <el-table-column label="备注" align="center" prop="remark" />
               <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
                 <template #default="scope">
                   <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dz:school:edit']">修改</el-button>
@@ -164,18 +146,18 @@
         <el-form-item label="省份" prop="location">
           <el-input v-model="form.location" placeholder="请输入省份" />
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" placeholder="请输入备注" />
-        </el-form-item>
-        <el-form-item label="省" prop="pro">
-          <el-input v-model="form.pro" placeholder="请输入省" />
-        </el-form-item>
-        <el-form-item label="市" prop="city">
-          <el-input v-model="form.city" placeholder="请输入市" />
-        </el-form-item>
-        <el-form-item label="区" prop="area">
-          <el-input v-model="form.area" placeholder="请输入区" />
+        <el-form-item label="省市区" prop="areaIds" style="width: 220px;">
+          <AddressSelect class="w-[198px]" v-model="areaIds" />
         </el-form-item>
+<!--        <el-form-item label="省" prop="pro">-->
+<!--          <el-input v-model="form.pro" placeholder="请输入省" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="市" prop="city">-->
+<!--          <el-input v-model="form.city" placeholder="请输入市" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="区" prop="area">-->
+<!--          <el-input v-model="form.area" placeholder="请输入区" />-->
+<!--        </el-form-item>-->
         <el-form-item label="状态" prop="status">
           <el-select v-model="form.status" placeholder="请选择状态">
             <el-option
@@ -186,6 +168,9 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -203,6 +188,7 @@
   import useAppStore from '@/store/modules/app'
   import { Splitpanes, Pane } from "splitpanes"
   import "splitpanes/dist/splitpanes.css"
+  import AddressSelect from '@/components/AddressSelect';
 
   const { proxy } = getCurrentInstance()
   const appStore = useAppStore()
@@ -221,6 +207,10 @@
   const total = ref(0)
   const title = ref("")
 
+  const dataList = ref([]);
+  const areaIds = ref([]);
+  let selectedIds = [];
+
   const data = reactive({
     form: {},
     queryParams: {
@@ -236,17 +226,23 @@
     },
     rules: {
       status: [
-        { required: true, message: "状态(0:无效,1:有效)不能为空", trigger: "change" }
+        { required: true, message: "状态(0:无效,1:有效)不能为空", trigger: "change" },
+        { required: true, message: "机构不能为空", trigger: "change" }
       ],
     }
   })
 
   const { queryParams, form, rules } = toRefs(data)
+  const queryRef = ref(null);
+  const dateRange = ref([]);
 
   /** 查询机构校区列表 */
   function getList() {
     loading.value = true
-    listSchool(queryParams.value).then(response => {
+    let areaObj = { pro: areaIds.value?.[0] || '', city: areaIds.value?.[1] || '', area: areaIds.value?.[2] || '' };
+    let params = { ...proxy.addDateRange(queryParams.value), ...areaObj }
+    // listSchool(queryParams.value).then(response => {
+    listSchool(params).then(response => {
       schoolList.value = response.rows
       total.value = response.total
       loading.value = false
@@ -339,8 +335,10 @@
     deptName.value = ""
     // 取消树节点的选中状态
     proxy.$refs.deptTreeRef.setCurrentKey(null)
-
     proxy.resetForm("queryRef")
+    // 清空省市区选择
+    areaIds.value = []
+
     handleQuery()
   }
 
@@ -373,6 +371,19 @@
   function submitForm() {
     proxy.$refs["schoolRef"].validate(valid => {
       if (valid) {
+        // 构建省市区对象
+        let areaObj = {
+          pro: areaIds.value?.[0] || '',
+          city: areaIds.value?.[1] || '',
+          area: areaIds.value?.[2] || ''
+        };
+
+        // 合并表单数据和省市区数据
+        const submitData = {
+          ...form.value,
+          ...areaObj
+        };
+
         if (form.value.id != null) {
           updateSchool(form.value).then(response => {
             proxy.$modal.msgSuccess("修改成功")

+ 523 - 0
back-ui/src/views/system/area/index.vue

@@ -0,0 +1,523 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="ID" prop="areaId">
+        <el-input
+          v-model="queryParams.areaId"
+          placeholder="请输入ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="父ID" prop="parentId">
+        <el-input
+          v-model="queryParams.parentId"
+          placeholder="请输入父ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="祖级列表" prop="ancestors">
+        <el-input
+          v-model="queryParams.ancestors"
+          placeholder="请输入祖级列表"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="名称" prop="areaName">
+        <el-input
+          v-model="queryParams.areaName"
+          placeholder="请输入名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="简称" prop="shortName">
+        <el-input
+          v-model="queryParams.shortName"
+          placeholder="请输入简称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="拼音" prop="pinyin">
+        <el-input
+          v-model="queryParams.pinyin"
+          placeholder="请输入拼音"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="省份" prop="provinceName">
+        <el-input
+          v-model="queryParams.provinceName"
+          placeholder="请输入省份"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="省份简称" prop="provinceShortname">
+        <el-input
+          v-model="queryParams.provinceShortname"
+          placeholder="请输入省份简称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="省份拼音" prop="provincePinyin">
+        <el-input
+          v-model="queryParams.provincePinyin"
+          placeholder="请输入省份拼音"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="城市" prop="cityName">
+        <el-input
+          v-model="queryParams.cityName"
+          placeholder="请输入城市"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="城市简称" prop="cityShortname">
+        <el-input
+          v-model="queryParams.cityShortname"
+          placeholder="请输入城市简称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="城市拼音" prop="cityPinyin">
+        <el-input
+          v-model="queryParams.cityPinyin"
+          placeholder="请输入城市拼音"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="区县" prop="districtName">
+        <el-input
+          v-model="queryParams.districtName"
+          placeholder="请输入区县"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="区县简称" prop="districtShortname">
+        <el-input
+          v-model="queryParams.districtShortname"
+          placeholder="请输入区县简称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="区县拼音" prop="districtPinyin">
+        <el-input
+          v-model="queryParams.districtPinyin"
+          placeholder="请输入区县拼音"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="简拼" prop="jianpin">
+        <el-input
+          v-model="queryParams.jianpin"
+          placeholder="请输入简拼"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="首字母" prop="firstChar">
+        <el-input
+          v-model="queryParams.firstChar"
+          placeholder="请输入首字母"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="区号" prop="areaCode">
+        <el-input
+          v-model="queryParams.areaCode"
+          placeholder="请输入区号"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="邮编" prop="zipCode">
+        <el-input
+          v-model="queryParams.zipCode"
+          placeholder="请输入邮编"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="经度" prop="lontitude">
+        <el-input
+          v-model="queryParams.lontitude"
+          placeholder="请输入经度"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="纬度" prop="latitude">
+        <el-input
+          v-model="queryParams.latitude"
+          placeholder="请输入纬度"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="显示顺序" prop="orderNum">
+        <el-input
+          v-model="queryParams.orderNum"
+          placeholder="请输入显示顺序"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+          v-hasPermi="['system:area:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="Sort"
+          @click="toggleExpandAll"
+        >展开/折叠</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-if="refreshTable"
+      v-loading="loading"
+      :data="areaList"
+      row-key=""
+      :default-expand-all="isExpandAll"
+      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+    >
+      <el-table-column label="ID" align="center" prop="areaId" />
+      <el-table-column label="父ID" prop="parentId" />
+      <el-table-column label="祖级列表" align="center" prop="ancestors" />
+      <el-table-column label="级别" align="center" prop="levelType" />
+      <el-table-column label="名称" align="center" prop="areaName" />
+      <el-table-column label="简称" align="center" prop="shortName" />
+      <el-table-column label="拼音" align="center" prop="pinyin" />
+      <el-table-column label="省份" align="center" prop="provinceName" />
+      <el-table-column label="省份简称" align="center" prop="provinceShortname" />
+      <el-table-column label="省份拼音" align="center" prop="provincePinyin" />
+      <el-table-column label="城市" align="center" prop="cityName" />
+      <el-table-column label="城市简称" align="center" prop="cityShortname" />
+      <el-table-column label="城市拼音" align="center" prop="cityPinyin" />
+      <el-table-column label="区县" align="center" prop="districtName" />
+      <el-table-column label="区县简称" align="center" prop="districtShortname" />
+      <el-table-column label="区县拼音" align="center" prop="districtPinyin" />
+      <el-table-column label="简拼" align="center" prop="jianpin" />
+      <el-table-column label="首字母" align="center" prop="firstChar" />
+      <el-table-column label="区号" align="center" prop="areaCode" />
+      <el-table-column label="邮编" align="center" prop="zipCode" />
+      <el-table-column label="经度" align="center" prop="lontitude" />
+      <el-table-column label="纬度" align="center" prop="latitude" />
+      <el-table-column label="类型" align="center" prop="type" />
+      <el-table-column label="特别提示" align="center" prop="remark" />
+      <el-table-column label="显示顺序" align="center" prop="orderNum" />
+      <el-table-column label="区域状态" align="center" prop="status" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:area:edit']">修改</el-button>
+          <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:area:add']">新增</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:area:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 添加或修改区域-省市区县对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="areaRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="ID" prop="areaId">
+          <el-input v-model="form.areaId" placeholder="请输入ID" />
+        </el-form-item>
+        <el-form-item label="父ID" prop="parentId">
+          <el-input v-model="form.parentId" placeholder="请输入父ID" />
+        </el-form-item>
+        <el-form-item label="名称" prop="areaName">
+          <el-input v-model="form.areaName" placeholder="请输入名称" />
+        </el-form-item>
+        <el-form-item label="简称" prop="shortName">
+          <el-input v-model="form.shortName" placeholder="请输入简称" />
+        </el-form-item>
+        <el-form-item label="拼音" prop="pinyin">
+          <el-input v-model="form.pinyin" placeholder="请输入拼音" />
+        </el-form-item>
+        <el-form-item label="省份" prop="provinceName">
+          <el-input v-model="form.provinceName" placeholder="请输入省份" />
+        </el-form-item>
+        <el-form-item label="省份简称" prop="provinceShortname">
+          <el-input v-model="form.provinceShortname" placeholder="请输入省份简称" />
+        </el-form-item>
+        <el-form-item label="省份拼音" prop="provincePinyin">
+          <el-input v-model="form.provincePinyin" placeholder="请输入省份拼音" />
+        </el-form-item>
+        <el-form-item label="城市" prop="cityName">
+          <el-input v-model="form.cityName" placeholder="请输入城市" />
+        </el-form-item>
+        <el-form-item label="城市简称" prop="cityShortname">
+          <el-input v-model="form.cityShortname" placeholder="请输入城市简称" />
+        </el-form-item>
+        <el-form-item label="城市拼音" prop="cityPinyin">
+          <el-input v-model="form.cityPinyin" placeholder="请输入城市拼音" />
+        </el-form-item>
+        <el-form-item label="区县" prop="districtName">
+          <el-input v-model="form.districtName" placeholder="请输入区县" />
+        </el-form-item>
+        <el-form-item label="区县简称" prop="districtShortname">
+          <el-input v-model="form.districtShortname" placeholder="请输入区县简称" />
+        </el-form-item>
+        <el-form-item label="区县拼音" prop="districtPinyin">
+          <el-input v-model="form.districtPinyin" placeholder="请输入区县拼音" />
+        </el-form-item>
+        <el-form-item label="简拼" prop="jianpin">
+          <el-input v-model="form.jianpin" placeholder="请输入简拼" />
+        </el-form-item>
+        <el-form-item label="首字母" prop="firstChar">
+          <el-input v-model="form.firstChar" placeholder="请输入首字母" />
+        </el-form-item>
+        <el-form-item label="区号" prop="areaCode">
+          <el-input v-model="form.areaCode" placeholder="请输入区号" />
+        </el-form-item>
+        <el-form-item label="邮编" prop="zipCode">
+          <el-input v-model="form.zipCode" placeholder="请输入邮编" />
+        </el-form-item>
+        <el-form-item label="经度" prop="lontitude">
+          <el-input v-model="form.lontitude" placeholder="请输入经度" />
+        </el-form-item>
+        <el-form-item label="纬度" prop="latitude">
+          <el-input v-model="form.latitude" placeholder="请输入纬度" />
+        </el-form-item>
+        <el-form-item label="特别提示" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入特别提示" />
+        </el-form-item>
+        <el-form-item label="显示顺序" prop="orderNum">
+          <el-input v-model="form.orderNum" placeholder="请输入显示顺序" />
+        </el-form-item>
+        <el-form-item label="删除标志" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Area">
+import { listArea, getArea, delArea, addArea, updateArea } from "@/api/system/area"
+
+const { proxy } = getCurrentInstance()
+
+const areaList = ref([])
+const areaOptions = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const title = ref("")
+const isExpandAll = ref(true)
+const refreshTable = ref(true)
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    areaId: null,
+    parentId: null,
+    ancestors: null,
+    levelType: null,
+    areaName: null,
+    shortName: null,
+    pinyin: null,
+    provinceName: null,
+    provinceShortname: null,
+    provincePinyin: null,
+    cityName: null,
+    cityShortname: null,
+    cityPinyin: null,
+    districtName: null,
+    districtShortname: null,
+    districtPinyin: null,
+    jianpin: null,
+    firstChar: null,
+    areaCode: null,
+    zipCode: null,
+    lontitude: null,
+    latitude: null,
+    type: null,
+    orderNum: null,
+    status: null
+  },
+  rules: {
+    areaId: [
+      { required: true, message: "ID不能为空", trigger: "blur" }
+    ],
+  }
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 查询区域-省市区县列表 */
+function getList() {
+  loading.value = true
+  listArea(queryParams.value).then(response => {
+    areaList.value = proxy.handleTree(response.data, "", "")
+    loading.value = false
+  })
+}
+
+/** 查询区域-省市区县下拉树结构 */
+function getTreeselect() {
+  listArea().then(response => {
+    areaOptions.value = []
+    const data = { area_id: 0, name : '顶级节点', children: [] }
+    data.children = proxy.handleTree(response.data, "", "")
+    areaOptions.value.push(data)
+  })
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false
+  reset()
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    areaId: null,
+    parentId: null,
+    ancestors: null,
+    levelType: null,
+    areaName: null,
+    shortName: null,
+    pinyin: null,
+    provinceName: null,
+    provinceShortname: null,
+    provincePinyin: null,
+    cityName: null,
+    cityShortname: null,
+    cityPinyin: null,
+    districtName: null,
+    districtShortname: null,
+    districtPinyin: null,
+    jianpin: null,
+    firstChar: null,
+    areaCode: null,
+    zipCode: null,
+    lontitude: null,
+    latitude: null,
+    type: null,
+    remark: null,
+    orderNum: null,
+    delFlag: null,
+    status: null
+  }
+  proxy.resetForm("areaRef")
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+/** 新增按钮操作 */
+function handleAdd(row) {
+  reset()
+  getTreeselect()
+  if (row != null && row.areaId) {
+    form.value.parentId = row.areaId
+  } else {
+    form.value.parentId = 0
+  }
+  open.value = true
+  title.value = "添加区域-省市区县"
+}
+
+/** 展开/折叠操作 */
+function toggleExpandAll() {
+  refreshTable.value = false
+  isExpandAll.value = !isExpandAll.value
+  nextTick(() => {
+    refreshTable.value = true
+  })
+}
+
+/** 修改按钮操作 */
+async function handleUpdate(row) {
+  reset()
+  await getTreeselect()
+  if (row != null) {
+    form.value.parentId = row.parentId
+  }
+  getArea(row.areaId).then(response => {
+    form.value = response.data
+    open.value = true
+    title.value = "修改区域-省市区县"
+  })
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["areaRef"].validate(valid => {
+    if (valid) {
+      if (form.value.areaId != null) {
+        updateArea(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功")
+          open.value = false
+          getList()
+        })
+      } else {
+        addArea(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功")
+          open.value = false
+          getList()
+        })
+      }
+    }
+  })
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  proxy.$modal.confirm('是否确认删除区域-省市区县编号为"' + row.areaId + '"的数据项?').then(function() {
+    return delArea(row.areaId)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+getList()
+</script>

+ 20 - 20
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzClassesController.java

@@ -22,10 +22,10 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
 
 /**
- * 机构班级Controller
- * 
+ * 学生班级Controller
+ *
  * @author ruoyi
- * @date 2025-09-12
+ * @date 2025-09-29
  */
 @RestController
 @RequestMapping("/dz/classes")
@@ -35,7 +35,7 @@ public class DzClassesController extends BaseController
     private IDzClassesService dzClassesService;
 
     /**
-     * 查询机构班级列表
+     * 查询学生班级列表
      */
     @PreAuthorize("@ss.hasPermi('dz:classes:list')")
     @GetMapping("/list")
@@ -47,33 +47,33 @@ public class DzClassesController extends BaseController
     }
 
     /**
-     * 导出机构班级列表
+     * 导出学生班级列表
      */
     @PreAuthorize("@ss.hasPermi('dz:classes:export')")
-    @Log(title = "机构班级", businessType = BusinessType.EXPORT)
+    @Log(title = "学生班级", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, DzClasses dzClasses)
     {
         List<DzClasses> list = dzClassesService.selectDzClassesList(dzClasses);
         ExcelUtil<DzClasses> util = new ExcelUtil<DzClasses>(DzClasses.class);
-        util.exportExcel(response, list, "机构班级数据");
+        util.exportExcel(response, list, "学生班级数据");
     }
 
     /**
-     * 获取机构班级详细信息
+     * 获取学生班级详细信息
      */
     @PreAuthorize("@ss.hasPermi('dz:classes:query')")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
+    @GetMapping(value = "/{classId}")
+    public AjaxResult getInfo(@PathVariable("classId") Long classId)
     {
-        return success(dzClassesService.selectDzClassesById(id));
+        return success(dzClassesService.selectDzClassesByClassId(classId));
     }
 
     /**
-     * 新增机构班级
+     * 新增学生班级
      */
     @PreAuthorize("@ss.hasPermi('dz:classes:add')")
-    @Log(title = "机构班级", businessType = BusinessType.INSERT)
+    @Log(title = "学生班级", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody DzClasses dzClasses)
     {
@@ -81,10 +81,10 @@ public class DzClassesController extends BaseController
     }
 
     /**
-     * 修改机构班级
+     * 修改学生班级
      */
     @PreAuthorize("@ss.hasPermi('dz:classes:edit')")
-    @Log(title = "机构班级", businessType = BusinessType.UPDATE)
+    @Log(title = "学生班级", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody DzClasses dzClasses)
     {
@@ -92,13 +92,13 @@ public class DzClassesController extends BaseController
     }
 
     /**
-     * 删除机构班级
+     * 删除学生班级
      */
     @PreAuthorize("@ss.hasPermi('dz:classes:remove')")
-    @Log(title = "机构班级", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
+    @Log(title = "学生班级", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{classIds}")
+    public AjaxResult remove(@PathVariable Long[] classIds)
     {
-        return toAjax(dzClassesService.deleteDzClassesByIds(ids));
+        return toAjax(dzClassesService.deleteDzClassesByClassIds(classIds));
     }
 }

+ 8 - 1
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzSchoolController.java

@@ -23,7 +23,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 
 /**
  * 机构校区Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
@@ -46,6 +46,13 @@ public class DzSchoolController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/getSchoolList")
+    public AjaxResult getSchoolList(DzSchool dzSchool)
+    {
+        List<DzSchool> list = dzSchoolService.selectDzSchoolList(dzSchool);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 导出机构校区列表
      */

+ 112 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/system/SysAreaController.java

@@ -0,0 +1,112 @@
+package com.ruoyi.web.controller.system;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.core.page.TableDataInfo;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+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.SysArea;
+import com.ruoyi.system.service.ISysAreaService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+
+/**
+ * 区域-省市区县Controller
+ *
+ * @author ruoyi
+ * @date 2025-09-29
+ */
+@RestController
+@RequestMapping("/system/area")
+public class SysAreaController extends BaseController
+{
+    @Autowired
+    private ISysAreaService sysAreaService;
+
+    /**
+     * 查询区域-省市区县列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:area:list')")
+    @GetMapping("/list")
+    public AjaxResult list(SysArea sysArea)
+    {
+        List<SysArea> list = sysAreaService.selectSysAreaList(sysArea);
+        return success(list);
+    }
+
+    @GetMapping("list/tree")
+    @Operation(summary = "树形结构")
+    public TableDataInfo listTree(SysArea criteria) {
+        List<SysArea> data = sysAreaService.listTree(criteria);
+        return getDataTable(data);
+    }
+
+    /**
+     * 导出区域-省市区县列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:area:export')")
+    @Log(title = "区域-省市区县", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysArea sysArea)
+    {
+        List<SysArea> list = sysAreaService.selectSysAreaList(sysArea);
+        ExcelUtil<SysArea> util = new ExcelUtil<SysArea>(SysArea.class);
+        util.exportExcel(response, list, "区域-省市区县数据");
+    }
+
+    /**
+     * 获取区域-省市区县详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:area:query')")
+    @GetMapping(value = "/{areaId}")
+    public AjaxResult getInfo(@PathVariable("areaId") Long areaId)
+    {
+        return success(sysAreaService.selectSysAreaByAreaId(areaId));
+    }
+
+    /**
+     * 新增区域-省市区县
+     */
+    @PreAuthorize("@ss.hasPermi('system:area:add')")
+    @Log(title = "区域-省市区县", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysArea sysArea)
+    {
+        return toAjax(sysAreaService.insertSysArea(sysArea));
+    }
+
+    /**
+     * 修改区域-省市区县
+     */
+    @PreAuthorize("@ss.hasPermi('system:area:edit')")
+    @Log(title = "区域-省市区县", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysArea sysArea)
+    {
+        return toAjax(sysAreaService.updateSysArea(sysArea));
+    }
+
+    /**
+     * 删除区域-省市区县
+     */
+    @PreAuthorize("@ss.hasPermi('system:area:remove')")
+    @Log(title = "区域-省市区县", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{areaIds}")
+    public AjaxResult remove(@PathVariable Long[] areaIds)
+    {
+        return toAjax(sysAreaService.deleteSysAreaByAreaIds(areaIds));
+    }
+}

+ 26 - 0
ie-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java

@@ -13,6 +13,9 @@ import com.ruoyi.common.filter.RefererFilter;
 import com.ruoyi.common.filter.RepeatableFilter;
 import com.ruoyi.common.filter.XssFilter;
 import com.ruoyi.common.utils.StringUtils;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
 
 /**
  * Filter配置
@@ -77,4 +80,27 @@ public class FilterConfig
         return registration;
     }
 
+    /**
+     * 跨域配置
+     */
+//    @Bean
+//    public CorsFilter corsFilter() {
+//        CorsConfiguration config = new CorsConfiguration();
+//        config.setAllowCredentials(true);
+//        // 设置访问源地址
+//        config.addAllowedOrigin("*");
+////        config.addAllowedOriginPattern("*");
+//        // 设置访问源请求头
+//        config.addAllowedHeader("*");
+//        // 设置访问源请求方法
+//        config.addAllowedMethod("*");
+//        // 有效期 1800秒
+//        config.setMaxAge(1800L);
+//        // 添加映射路径,拦截一切请求
+//        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+//        source.registerCorsConfiguration("/**", config);
+//        // 返回新的CorsFilter
+//        return new CorsFilter(source);
+//    }
+
 }

+ 71 - 24
ie-system/src/main/java/com/ruoyi/dz/domain/DzClasses.java

@@ -6,48 +6,50 @@ import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
- * 机构班级对象 dz_classes
+ * 学生班级对象 dz_classes
  * 
  * @author ruoyi
- * @date 2025-09-12
+ * @date 2025-09-29
  */
 public class DzClasses extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
 
-    /** 班级id */
-    private Long id;
+    /** ID */
+    private Long classId;
 
-    /** 班级名称 */
-    @Excel(name = "班级名称")
-    private String name;
-
-    /** 所在校区 */
-    @Excel(name = "所在校区")
+    /** 学校 */
+    @Excel(name = "学校")
     private Long schoolId;
 
+    /** 开班年份 */
+    @Excel(name = "开班年份")
+    private Long year;
+
+    /** 名称 */
+    @Excel(name = "名称")
+    private String name;
+
     /** 是否线上 */
     @Excel(name = "是否线上")
     private Long online;
 
-    public void setId(Long id) 
-    {
-        this.id = id;
-    }
+    /** 状态 */
+    @Excel(name = "状态")
+    private Long status;
 
-    public Long getId() 
-    {
-        return id;
-    }
+    /** 统计数据 */
+    @Excel(name = "统计数据")
+    private String stats;
 
-    public void setName(String name) 
+    public void setClassId(Long classId) 
     {
-        this.name = name;
+        this.classId = classId;
     }
 
-    public String getName() 
+    public Long getClassId() 
     {
-        return name;
+        return classId;
     }
 
     public void setSchoolId(Long schoolId) 
@@ -60,6 +62,26 @@ public class DzClasses extends BaseEntity
         return schoolId;
     }
 
+    public void setYear(Long year) 
+    {
+        this.year = year;
+    }
+
+    public Long getYear() 
+    {
+        return year;
+    }
+
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+
     public void setOnline(Long online) 
     {
         this.online = online;
@@ -70,13 +92,38 @@ public class DzClasses extends BaseEntity
         return online;
     }
 
+    public void setStatus(Long status) 
+    {
+        this.status = status;
+    }
+
+    public Long getStatus() 
+    {
+        return status;
+    }
+
+    public void setStats(String stats) 
+    {
+        this.stats = stats;
+    }
+
+    public String getStats() 
+    {
+        return stats;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("id", getId())
-            .append("name", getName())
+            .append("classId", getClassId())
             .append("schoolId", getSchoolId())
+            .append("year", getYear())
+            .append("name", getName())
             .append("online", getOnline())
+            .append("status", getStatus())
+            .append("stats", getStats())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
             .toString();
     }
 }

+ 28 - 17
ie-system/src/main/java/com/ruoyi/dz/domain/DzSchool.java

@@ -1,5 +1,6 @@
 package com.ruoyi.dz.domain;
 
+import com.ruoyi.common.core.domain.entity.SysDept;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
@@ -7,7 +8,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
  * 机构校区对象 dz_school
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
@@ -46,82 +47,92 @@ public class DzSchool extends BaseEntity
     @Excel(name = "状态(0:无效,1:有效)")
     private Integer status;
 
-    public void setId(Long id) 
+    private SysDept dept;
+
+    public SysDept getDept() {
+        return dept;
+    }
+
+    public void setDept(SysDept dept) {
+        this.dept = dept;
+    }
+
+    public void setId(Long id)
     {
         this.id = id;
     }
 
-    public Long getId() 
+    public Long getId()
     {
         return id;
     }
 
-    public void setName(String name) 
+    public void setName(String name)
     {
         this.name = name;
     }
 
-    public String getName() 
+    public String getName()
     {
         return name;
     }
 
-    public void setDeptId(Long deptId) 
+    public void setDeptId(Long deptId)
     {
         this.deptId = deptId;
     }
 
-    public Long getDeptId() 
+    public Long getDeptId()
     {
         return deptId;
     }
 
-    public void setLocation(String location) 
+    public void setLocation(String location)
     {
         this.location = location;
     }
 
-    public String getLocation() 
+    public String getLocation()
     {
         return location;
     }
 
-    public void setPro(Long pro) 
+    public void setPro(Long pro)
     {
         this.pro = pro;
     }
 
-    public Long getPro() 
+    public Long getPro()
     {
         return pro;
     }
 
-    public void setCity(Long city) 
+    public void setCity(Long city)
     {
         this.city = city;
     }
 
-    public Long getCity() 
+    public Long getCity()
     {
         return city;
     }
 
-    public void setArea(Long area) 
+    public void setArea(Long area)
     {
         this.area = area;
     }
 
-    public Long getArea() 
+    public Long getArea()
     {
         return area;
     }
 
-    public void setStatus(Integer status) 
+    public void setStatus(Integer status)
     {
         this.status = status;
     }
 
-    public Integer getStatus() 
+    public Integer getStatus()
     {
         return status;
     }

+ 19 - 19
ie-system/src/main/java/com/ruoyi/dz/mapper/DzClassesMapper.java

@@ -4,58 +4,58 @@ import java.util.List;
 import com.ruoyi.dz.domain.DzClasses;
 
 /**
- * 机构班级Mapper接口
+ * 学生班级Mapper接口
  * 
  * @author ruoyi
- * @date 2025-09-12
+ * @date 2025-09-29
  */
 public interface DzClassesMapper 
 {
     /**
-     * 查询机构班级
+     * 查询学生班级
      * 
-     * @param id 机构班级主键
-     * @return 机构班级
+     * @param classId 学生班级主键
+     * @return 学生班级
      */
-    public DzClasses selectDzClassesById(Long id);
+    public DzClasses selectDzClassesByClassId(Long classId);
 
     /**
-     * 查询机构班级列表
+     * 查询学生班级列表
      * 
-     * @param dzClasses 机构班级
-     * @return 机构班级集合
+     * @param dzClasses 学生班级
+     * @return 学生班级集合
      */
     public List<DzClasses> selectDzClassesList(DzClasses dzClasses);
 
     /**
-     * 新增机构班级
+     * 新增学生班级
      * 
-     * @param dzClasses 机构班级
+     * @param dzClasses 学生班级
      * @return 结果
      */
     public int insertDzClasses(DzClasses dzClasses);
 
     /**
-     * 修改机构班级
+     * 修改学生班级
      * 
-     * @param dzClasses 机构班级
+     * @param dzClasses 学生班级
      * @return 结果
      */
     public int updateDzClasses(DzClasses dzClasses);
 
     /**
-     * 删除机构班级
+     * 删除学生班级
      * 
-     * @param id 机构班级主键
+     * @param classId 学生班级主键
      * @return 结果
      */
-    public int deleteDzClassesById(Long id);
+    public int deleteDzClassesByClassId(Long classId);
 
     /**
-     * 批量删除机构班级
+     * 批量删除学生班级
      * 
-     * @param ids 需要删除的数据主键集合
+     * @param classIds 需要删除的数据主键集合
      * @return 结果
      */
-    public int deleteDzClassesByIds(Long[] ids);
+    public int deleteDzClassesByClassIds(Long[] classIds);
 }

+ 19 - 19
ie-system/src/main/java/com/ruoyi/dz/service/IDzClassesService.java

@@ -4,58 +4,58 @@ import java.util.List;
 import com.ruoyi.dz.domain.DzClasses;
 
 /**
- * 机构班级Service接口
+ * 学生班级Service接口
  * 
  * @author ruoyi
- * @date 2025-09-12
+ * @date 2025-09-29
  */
 public interface IDzClassesService 
 {
     /**
-     * 查询机构班级
+     * 查询学生班级
      * 
-     * @param id 机构班级主键
-     * @return 机构班级
+     * @param classId 学生班级主键
+     * @return 学生班级
      */
-    public DzClasses selectDzClassesById(Long id);
+    public DzClasses selectDzClassesByClassId(Long classId);
 
     /**
-     * 查询机构班级列表
+     * 查询学生班级列表
      * 
-     * @param dzClasses 机构班级
-     * @return 机构班级集合
+     * @param dzClasses 学生班级
+     * @return 学生班级集合
      */
     public List<DzClasses> selectDzClassesList(DzClasses dzClasses);
 
     /**
-     * 新增机构班级
+     * 新增学生班级
      * 
-     * @param dzClasses 机构班级
+     * @param dzClasses 学生班级
      * @return 结果
      */
     public int insertDzClasses(DzClasses dzClasses);
 
     /**
-     * 修改机构班级
+     * 修改学生班级
      * 
-     * @param dzClasses 机构班级
+     * @param dzClasses 学生班级
      * @return 结果
      */
     public int updateDzClasses(DzClasses dzClasses);
 
     /**
-     * 批量删除机构班级
+     * 批量删除学生班级
      * 
-     * @param ids 需要删除的机构班级主键集合
+     * @param classIds 需要删除的学生班级主键集合
      * @return 结果
      */
-    public int deleteDzClassesByIds(Long[] ids);
+    public int deleteDzClassesByClassIds(Long[] classIds);
 
     /**
-     * 删除机构班级信息
+     * 删除学生班级信息
      * 
-     * @param id 机构班级主键
+     * @param classId 学生班级主键
      * @return 结果
      */
-    public int deleteDzClassesById(Long id);
+    public int deleteDzClassesByClassId(Long classId);
 }

+ 25 - 22
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzClassesServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.dz.service.impl;
 
 import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.dz.mapper.DzClassesMapper;
@@ -8,10 +9,10 @@ import com.ruoyi.dz.domain.DzClasses;
 import com.ruoyi.dz.service.IDzClassesService;
 
 /**
- * 机构班级Service业务层处理
+ * 学生班级Service业务层处理
  * 
  * @author ruoyi
- * @date 2025-09-12
+ * @date 2025-09-29
  */
 @Service
 public class DzClassesServiceImpl implements IDzClassesService 
@@ -20,22 +21,22 @@ public class DzClassesServiceImpl implements IDzClassesService
     private DzClassesMapper dzClassesMapper;
 
     /**
-     * 查询机构班级
+     * 查询学生班级
      * 
-     * @param id 机构班级主键
-     * @return 机构班级
+     * @param classId 学生班级主键
+     * @return 学生班级
      */
     @Override
-    public DzClasses selectDzClassesById(Long id)
+    public DzClasses selectDzClassesByClassId(Long classId)
     {
-        return dzClassesMapper.selectDzClassesById(id);
+        return dzClassesMapper.selectDzClassesByClassId(classId);
     }
 
     /**
-     * 查询机构班级列表
+     * 查询学生班级列表
      * 
-     * @param dzClasses 机构班级
-     * @return 机构班级
+     * @param dzClasses 学生班级
+     * @return 学生班级
      */
     @Override
     public List<DzClasses> selectDzClassesList(DzClasses dzClasses)
@@ -44,50 +45,52 @@ public class DzClassesServiceImpl implements IDzClassesService
     }
 
     /**
-     * 新增机构班级
+     * 新增学生班级
      * 
-     * @param dzClasses 机构班级
+     * @param dzClasses 学生班级
      * @return 结果
      */
     @Override
     public int insertDzClasses(DzClasses dzClasses)
     {
+        dzClasses.setCreateTime(DateUtils.getNowDate());
         return dzClassesMapper.insertDzClasses(dzClasses);
     }
 
     /**
-     * 修改机构班级
+     * 修改学生班级
      * 
-     * @param dzClasses 机构班级
+     * @param dzClasses 学生班级
      * @return 结果
      */
     @Override
     public int updateDzClasses(DzClasses dzClasses)
     {
+        dzClasses.setUpdateTime(DateUtils.getNowDate());
         return dzClassesMapper.updateDzClasses(dzClasses);
     }
 
     /**
-     * 批量删除机构班级
+     * 批量删除学生班级
      * 
-     * @param ids 需要删除的机构班级主键
+     * @param classIds 需要删除的学生班级主键
      * @return 结果
      */
     @Override
-    public int deleteDzClassesByIds(Long[] ids)
+    public int deleteDzClassesByClassIds(Long[] classIds)
     {
-        return dzClassesMapper.deleteDzClassesByIds(ids);
+        return dzClassesMapper.deleteDzClassesByClassIds(classIds);
     }
 
     /**
-     * 删除机构班级信息
+     * 删除学生班级信息
      * 
-     * @param id 机构班级主键
+     * @param classId 学生班级主键
      * @return 结果
      */
     @Override
-    public int deleteDzClassesById(Long id)
+    public int deleteDzClassesByClassId(Long classId)
     {
-        return dzClassesMapper.deleteDzClassesById(id);
+        return dzClassesMapper.deleteDzClassesByClassId(classId);
     }
 }

+ 469 - 0
ie-system/src/main/java/com/ruoyi/system/domain/SysArea.java

@@ -0,0 +1,469 @@
+package com.ruoyi.system.domain;
+
+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.TreeEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 区域-省市区县对象 sys_area
+ *
+ * @author ruoyi
+ * @date 2025-09-29
+ */
+public class SysArea
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    @Excel(name = "ID")
+    private Long areaId;
+
+    /** 级别 */
+    @Excel(name = "级别")
+    private String levelType;
+
+    /** 名称 */
+    @Excel(name = "名称")
+    private String areaName;
+
+    /** 简称 */
+    @Excel(name = "简称")
+    private String shortName;
+
+    /** 拼音 */
+    @Excel(name = "拼音")
+    private String pinyin;
+
+    /** 省份 */
+    @Excel(name = "省份")
+    private String provinceName;
+
+    /** 省份简称 */
+    @Excel(name = "省份简称")
+    private String provinceShortname;
+
+    /** 省份拼音 */
+    @Excel(name = "省份拼音")
+    private String provincePinyin;
+
+    /** 城市 */
+    @Excel(name = "城市")
+    private String cityName;
+
+    private Boolean hasChildren;
+
+
+    /** 城市简称 */
+    @Excel(name = "城市简称")
+    private String cityShortname;
+
+    /** 城市拼音 */
+    @Excel(name = "城市拼音")
+    private String cityPinyin;
+
+    /** 区县 */
+    @Excel(name = "区县")
+    private String districtName;
+
+    /** 区县简称 */
+    @Excel(name = "区县简称")
+    private String districtShortname;
+
+    /** 区县拼音 */
+    @Excel(name = "区县拼音")
+    private String districtPinyin;
+
+    /** 简拼 */
+    @Excel(name = "简拼")
+    private String jianpin;
+
+    /** 首字母 */
+    @Excel(name = "首字母")
+    private String firstChar;
+
+    /** 区号 */
+    @Excel(name = "区号")
+    private String areaCode;
+
+    /** 邮编 */
+    @Excel(name = "邮编")
+    private String zipCode;
+
+    /** 经度 */
+    @Excel(name = "经度")
+    private String lontitude;
+
+    /** 纬度 */
+    @Excel(name = "纬度")
+    private String latitude;
+
+    /** 类型 */
+    @Excel(name = "类型")
+    private String type;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 区域状态(0正常 1停用) */
+    @Excel(name = "区域状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+    /** 父菜单名称 */
+    private String parentName;
+
+    /** 父菜单ID */
+    private Long parentId;
+
+    /** 显示顺序 */
+    private Integer orderNum;
+
+    /** 祖级列表 */
+    private String ancestors;
+
+    /** 子机构 */
+    private List<SysArea> children = new ArrayList<>();
+    private String remark;
+
+    public Boolean getHasChildren() {
+        return hasChildren;
+    }
+
+    public void setHasChildren(Boolean hasChildren) {
+        this.hasChildren = hasChildren;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getParentName()
+    {
+        return parentName;
+    }
+
+    public void setParentName(String parentName)
+    {
+        this.parentName = parentName;
+    }
+
+    public Long getParentId()
+    {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId)
+    {
+        this.parentId = parentId;
+    }
+
+    public Integer getOrderNum()
+    {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum)
+    {
+        this.orderNum = orderNum;
+    }
+
+    public String getAncestors()
+    {
+        return ancestors;
+    }
+
+    public void setAncestors(String ancestors)
+    {
+        this.ancestors = ancestors;
+    }
+
+    public List<SysArea> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<SysArea> children)
+    {
+        this.children = children;
+    }
+    public void setAreaId(Long areaId)
+    {
+        this.areaId = areaId;
+    }
+
+    public Long getAreaId()
+    {
+        return areaId;
+    }
+
+    public void setLevelType(String levelType)
+    {
+        this.levelType = levelType;
+    }
+
+    public String getLevelType()
+    {
+        return levelType;
+    }
+
+    public void setAreaName(String areaName)
+    {
+        this.areaName = areaName;
+    }
+
+    public String getAreaName()
+    {
+        return areaName;
+    }
+
+    public void setShortName(String shortName)
+    {
+        this.shortName = shortName;
+    }
+
+    public String getShortName()
+    {
+        return shortName;
+    }
+
+    public void setPinyin(String pinyin)
+    {
+        this.pinyin = pinyin;
+    }
+
+    public String getPinyin()
+    {
+        return pinyin;
+    }
+
+    public void setProvinceName(String provinceName)
+    {
+        this.provinceName = provinceName;
+    }
+
+    public String getProvinceName()
+    {
+        return provinceName;
+    }
+
+    public void setProvinceShortname(String provinceShortname)
+    {
+        this.provinceShortname = provinceShortname;
+    }
+
+    public String getProvinceShortname()
+    {
+        return provinceShortname;
+    }
+
+    public void setProvincePinyin(String provincePinyin)
+    {
+        this.provincePinyin = provincePinyin;
+    }
+
+    public String getProvincePinyin()
+    {
+        return provincePinyin;
+    }
+
+    public void setCityName(String cityName)
+    {
+        this.cityName = cityName;
+    }
+
+    public String getCityName()
+    {
+        return cityName;
+    }
+
+    public void setCityShortname(String cityShortname)
+    {
+        this.cityShortname = cityShortname;
+    }
+
+    public String getCityShortname()
+    {
+        return cityShortname;
+    }
+
+    public void setCityPinyin(String cityPinyin)
+    {
+        this.cityPinyin = cityPinyin;
+    }
+
+    public String getCityPinyin()
+    {
+        return cityPinyin;
+    }
+
+    public void setDistrictName(String districtName)
+    {
+        this.districtName = districtName;
+    }
+
+    public String getDistrictName()
+    {
+        return districtName;
+    }
+
+    public void setDistrictShortname(String districtShortname)
+    {
+        this.districtShortname = districtShortname;
+    }
+
+    public String getDistrictShortname()
+    {
+        return districtShortname;
+    }
+
+    public void setDistrictPinyin(String districtPinyin)
+    {
+        this.districtPinyin = districtPinyin;
+    }
+
+    public String getDistrictPinyin()
+    {
+        return districtPinyin;
+    }
+
+    public void setJianpin(String jianpin)
+    {
+        this.jianpin = jianpin;
+    }
+
+    public String getJianpin()
+    {
+        return jianpin;
+    }
+
+    public void setFirstChar(String firstChar)
+    {
+        this.firstChar = firstChar;
+    }
+
+    public String getFirstChar()
+    {
+        return firstChar;
+    }
+
+    public void setAreaCode(String areaCode)
+    {
+        this.areaCode = areaCode;
+    }
+
+    public String getAreaCode()
+    {
+        return areaCode;
+    }
+
+    public void setZipCode(String zipCode)
+    {
+        this.zipCode = zipCode;
+    }
+
+    public String getZipCode()
+    {
+        return zipCode;
+    }
+
+    public void setLontitude(String lontitude)
+    {
+        this.lontitude = lontitude;
+    }
+
+    public String getLontitude()
+    {
+        return lontitude;
+    }
+
+    public void setLatitude(String latitude)
+    {
+        this.latitude = latitude;
+    }
+
+    public String getLatitude()
+    {
+        return latitude;
+    }
+
+    public void setType(String type)
+    {
+        this.type = type;
+    }
+
+    public String getType()
+    {
+        return type;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("areaId", getAreaId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("levelType", getLevelType())
+            .append("areaName", getAreaName())
+            .append("shortName", getShortName())
+            .append("pinyin", getPinyin())
+            .append("provinceName", getProvinceName())
+            .append("provinceShortname", getProvinceShortname())
+            .append("provincePinyin", getProvincePinyin())
+            .append("cityName", getCityName())
+            .append("cityShortname", getCityShortname())
+            .append("cityPinyin", getCityPinyin())
+            .append("districtName", getDistrictName())
+            .append("districtShortname", getDistrictShortname())
+            .append("districtPinyin", getDistrictPinyin())
+            .append("jianpin", getJianpin())
+            .append("firstChar", getFirstChar())
+            .append("areaCode", getAreaCode())
+            .append("zipCode", getZipCode())
+            .append("lontitude", getLontitude())
+            .append("latitude", getLatitude())
+            .append("type", getType())
+            .append("remark", getRemark())
+            .append("orderNum", getOrderNum())
+            .append("delFlag", getDelFlag())
+            .append("status", getStatus())
+            .toString();
+    }
+
+    public SysArea addChildren(SysArea row) {
+        if (null == this.children) {
+            this.children = new ArrayList<>(12);
+        }
+        if (!this.children.contains(row)) {
+            this.children.add(row);
+        }
+        return this;
+    }
+}

+ 61 - 0
ie-system/src/main/java/com/ruoyi/system/mapper/SysAreaMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysArea;
+
+/**
+ * 区域-省市区县Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-09-29
+ */
+public interface SysAreaMapper 
+{
+    /**
+     * 查询区域-省市区县
+     * 
+     * @param areaId 区域-省市区县主键
+     * @return 区域-省市区县
+     */
+    public SysArea selectSysAreaByAreaId(Long areaId);
+
+    /**
+     * 查询区域-省市区县列表
+     * 
+     * @param sysArea 区域-省市区县
+     * @return 区域-省市区县集合
+     */
+    public List<SysArea> selectSysAreaList(SysArea sysArea);
+
+    /**
+     * 新增区域-省市区县
+     * 
+     * @param sysArea 区域-省市区县
+     * @return 结果
+     */
+    public int insertSysArea(SysArea sysArea);
+
+    /**
+     * 修改区域-省市区县
+     * 
+     * @param sysArea 区域-省市区县
+     * @return 结果
+     */
+    public int updateSysArea(SysArea sysArea);
+
+    /**
+     * 删除区域-省市区县
+     * 
+     * @param areaId 区域-省市区县主键
+     * @return 结果
+     */
+    public int deleteSysAreaByAreaId(Long areaId);
+
+    /**
+     * 批量删除区域-省市区县
+     * 
+     * @param areaIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSysAreaByAreaIds(Long[] areaIds);
+}

+ 61 - 0
ie-system/src/main/java/com/ruoyi/system/service/ISysAreaService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.SysArea;
+
+/**
+ * 区域-省市区县Service接口
+ *
+ * @author ruoyi
+ * @date 2025-09-29
+ */
+public interface ISysAreaService
+{
+    /**
+     * 查询区域-省市区县
+     *
+     * @param areaId 区域-省市区县主键
+     * @return 区域-省市区县
+     */
+    public SysArea selectSysAreaByAreaId(Long areaId);
+
+    /**
+     * 查询区域-省市区县列表
+     *
+     * @param sysArea 区域-省市区县
+     * @return 区域-省市区县集合
+     */
+    public List<SysArea> selectSysAreaList(SysArea sysArea);
+    public List<SysArea> listTree(SysArea criteria);
+    /**
+     * 新增区域-省市区县
+     *
+     * @param sysArea 区域-省市区县
+     * @return 结果
+     */
+    public int insertSysArea(SysArea sysArea);
+
+    /**
+     * 修改区域-省市区县
+     *
+     * @param sysArea 区域-省市区县
+     * @return 结果
+     */
+    public int updateSysArea(SysArea sysArea);
+
+    /**
+     * 批量删除区域-省市区县
+     *
+     * @param areaIds 需要删除的区域-省市区县主键集合
+     * @return 结果
+     */
+    public int deleteSysAreaByAreaIds(Long[] areaIds);
+
+    /**
+     * 删除区域-省市区县信息
+     *
+     * @param areaId 区域-省市区县主键
+     * @return 结果
+     */
+    public int deleteSysAreaByAreaId(Long areaId);
+}

+ 146 - 0
ie-system/src/main/java/com/ruoyi/system/service/impl/SysAreaServiceImpl.java

@@ -0,0 +1,146 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.SysAreaMapper;
+import com.ruoyi.system.domain.SysArea;
+import com.ruoyi.system.service.ISysAreaService;
+
+/**
+ * 区域-省市区县Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-09-29
+ */
+@Service
+public class SysAreaServiceImpl implements ISysAreaService
+{
+    @Autowired
+    private SysAreaMapper sysAreaMapper;
+
+    /**
+     * 查询区域-省市区县
+     *
+     * @param areaId 区域-省市区县主键
+     * @return 区域-省市区县
+     */
+    @Override
+    public SysArea selectSysAreaByAreaId(Long areaId)
+    {
+        return sysAreaMapper.selectSysAreaByAreaId(areaId);
+    }
+
+    /**
+     * 查询区域-省市区县列表
+     *
+     * @param sysArea 区域-省市区县
+     * @return 区域-省市区县
+     */
+    @Override
+    public List<SysArea> selectSysAreaList(SysArea sysArea)
+    {
+        return sysAreaMapper.selectSysAreaList(sysArea);
+    }
+
+    @Override
+    public List<SysArea> listTree(SysArea criteria) {
+        List<SysArea> list = selectSysAreaList(criteria);
+        Map<Long, SysArea> cache = list.stream().collect(Collectors.toMap(SysArea::getAreaId, v -> v));
+        List<SysArea> res = new ArrayList<>(6);
+        for (SysArea row : list) {
+            Long parentId = row.getParentId();
+            if (null == parentId || parentId == 0l || !cache.containsKey(parentId)) {
+                res.add(row);
+            } else {
+                cache.get(parentId).addChildren(row);
+            }
+        }
+        return res;
+
+//        Map<Long, SysArea> cache = new HashMap<>();
+//        List<SysArea> res = new ArrayList<>();
+//        // 先将所有节点放入缓存
+//        for (SysArea area : list) {
+//            cache.put(area.getAreaId(), area);
+//            // 初始化children列表
+//            if (area.getChildren() == null) {
+//                area.setChildren(new ArrayList<>());
+//            }
+//        }
+//
+//        // 建立父子关系
+//        for (SysArea area : list) {
+//            Long parentId = area.getParentId();
+//            if (parentId != null && parentId != 0L && cache.containsKey(parentId)) {
+//                SysArea parent = cache.get(parentId);
+//                if (parent.getChildren() == null) {
+//                    parent.setChildren(new ArrayList<>());
+//                }
+//                parent.getChildren().add(area);
+//            }
+//        }
+//
+//        // 只返回根节点
+//        for (SysArea area : list) {
+//            Long parentId = area.getParentId();
+//            if (parentId == null || parentId == 0L || !cache.containsKey(parentId)) {
+//                res.add(area);
+//            }
+//        }
+//        return res;
+    }
+
+    /**
+     * 新增区域-省市区县
+     *
+     * @param sysArea 区域-省市区县
+     * @return 结果
+     */
+    @Override
+    public int insertSysArea(SysArea sysArea)
+    {
+        return sysAreaMapper.insertSysArea(sysArea);
+    }
+
+    /**
+     * 修改区域-省市区县
+     *
+     * @param sysArea 区域-省市区县
+     * @return 结果
+     */
+    @Override
+    public int updateSysArea(SysArea sysArea)
+    {
+        return sysAreaMapper.updateSysArea(sysArea);
+    }
+
+    /**
+     * 批量删除区域-省市区县
+     *
+     * @param areaIds 需要删除的区域-省市区县主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysAreaByAreaIds(Long[] areaIds)
+    {
+        return sysAreaMapper.deleteSysAreaByAreaIds(areaIds);
+    }
+
+    /**
+     * 删除区域-省市区县信息
+     *
+     * @param areaId 区域-省市区县主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysAreaByAreaId(Long areaId)
+    {
+        return sysAreaMapper.deleteSysAreaByAreaId(areaId);
+    }
+}

+ 40 - 17
ie-system/src/main/resources/mapper/dz/DzClassesMapper.xml

@@ -5,62 +5,85 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <mapper namespace="com.ruoyi.dz.mapper.DzClassesMapper">
     
     <resultMap type="DzClasses" id="DzClassesResult">
-        <result property="id"    column="id"    />
-        <result property="name"    column="name"    />
+        <result property="classId"    column="class_id"    />
         <result property="schoolId"    column="school_id"    />
+        <result property="year"    column="year"    />
+        <result property="name"    column="name"    />
         <result property="online"    column="online"    />
+        <result property="status"    column="status"    />
+        <result property="stats"    column="stats"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
     </resultMap>
 
     <sql id="selectDzClassesVo">
-        select id, name, school_id, online from dz_classes
+        select class_id, school_id, year, name, online, status, stats, create_time, update_time from dz_classes
     </sql>
 
     <select id="selectDzClassesList" parameterType="DzClasses" resultMap="DzClassesResult">
         <include refid="selectDzClassesVo"/>
         <where>  
-            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="schoolId != null "> and school_id = #{schoolId}</if>
+            <if test="year != null "> and year = #{year}</if>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="online != null "> and online = #{online}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="stats != null  and stats != ''"> and stats = #{stats}</if>
         </where>
     </select>
     
-    <select id="selectDzClassesById" parameterType="Long" resultMap="DzClassesResult">
+    <select id="selectDzClassesByClassId" parameterType="Long" resultMap="DzClassesResult">
         <include refid="selectDzClassesVo"/>
-        where id = #{id}
+        where class_id = #{classId}
     </select>
 
-    <insert id="insertDzClasses" parameterType="DzClasses" useGeneratedKeys="true" keyProperty="id">
+    <insert id="insertDzClasses" parameterType="DzClasses" useGeneratedKeys="true" keyProperty="classId">
         insert into dz_classes
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="name != null and name != ''">name,</if>
             <if test="schoolId != null">school_id,</if>
+            <if test="year != null">year,</if>
+            <if test="name != null and name != ''">name,</if>
             <if test="online != null">online,</if>
+            <if test="status != null">status,</if>
+            <if test="stats != null">stats,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="name != null and name != ''">#{name},</if>
             <if test="schoolId != null">#{schoolId},</if>
+            <if test="year != null">#{year},</if>
+            <if test="name != null and name != ''">#{name},</if>
             <if test="online != null">#{online},</if>
+            <if test="status != null">#{status},</if>
+            <if test="stats != null">#{stats},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
          </trim>
     </insert>
 
     <update id="updateDzClasses" parameterType="DzClasses">
         update dz_classes
         <trim prefix="SET" suffixOverrides=",">
-            <if test="name != null and name != ''">name = #{name},</if>
             <if test="schoolId != null">school_id = #{schoolId},</if>
+            <if test="year != null">year = #{year},</if>
+            <if test="name != null and name != ''">name = #{name},</if>
             <if test="online != null">online = #{online},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="stats != null">stats = #{stats},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
         </trim>
-        where id = #{id}
+        where class_id = #{classId}
     </update>
 
-    <delete id="deleteDzClassesById" parameterType="Long">
-        delete from dz_classes where id = #{id}
+    <delete id="deleteDzClassesByClassId" parameterType="Long">
+        delete from dz_classes where class_id = #{classId}
     </delete>
 
-    <delete id="deleteDzClassesByIds" parameterType="String">
-        delete from dz_classes where id in 
-        <foreach item="id" collection="array" open="(" separator="," close=")">
-            #{id}
+    <delete id="deleteDzClassesByClassIds" parameterType="String">
+        delete from dz_classes where class_id in 
+        <foreach item="classId" collection="array" open="(" separator="," close=")">
+            #{classId}
         </foreach>
     </delete>
 </mapper>

+ 28 - 14
ie-system/src/main/resources/mapper/dz/DzSchoolMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.dz.mapper.DzSchoolMapper">
-    
+
     <resultMap type="DzSchool" id="DzSchoolResult">
         <result property="id"    column="id"    />
         <result property="name"    column="name"    />
@@ -16,28 +16,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="status"    column="status"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
+        <association property="dept"     javaType="SysDept"         resultMap="deptResult" />
+    </resultMap>
+
+    <resultMap id="deptResult" type="SysDept">
+        <id     property="deptId"    column="dept_id"     />
+        <result property="parentId"  column="parent_id"   />
+        <result property="deptName"  column="dept_name"   />
+        <result property="ancestors" column="ancestors"   />
+        <result property="orderNum"  column="order_num"   />
+        <result property="leader"    column="leader"      />
+        <result property="status"    column="dept_status" />
     </resultMap>
 
     <sql id="selectDzSchoolVo">
-        select id, name, dept_id, location, remark, pro, city, area, status, create_time, update_time from dz_school
+        select t1.id, t1.name, t1.dept_id, t1.location, t1.remark, t1.pro, t1.city, t1.area, t1.status, t1.create_time, t1.update_time,
+        d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status
+         from dz_school t1
+        left join sys_dept d on t1.dept_id = d.dept_id
     </sql>
 
     <select id="selectDzSchoolList" parameterType="DzSchool" resultMap="DzSchoolResult">
         <include refid="selectDzSchoolVo"/>
-        <where>  
-            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
-            <if test="deptId != null "> and dept_id = #{deptId}</if>
-            <if test="location != null  and location != ''"> and location = #{location}</if>
-            <if test="pro != null "> and pro = #{pro}</if>
-            <if test="city != null "> and city = #{city}</if>
-            <if test="area != null "> and area = #{area}</if>
-            <if test="status != null "> and status = #{status}</if>
+        <where>
+            <if test="name != null  and name != ''"> and t1.name like concat('%', #{name}, '%')</if>
+            <if test="deptId != null "> and t1.dept_id = #{deptId}</if>
+            <if test="location != null  and location != ''"> and t1.location = #{location}</if>
+            <if test="pro != null "> and t1.pro = #{pro}</if>
+            <if test="city != null "> and t1.city = #{city}</if>
+            <if test="area != null "> and t1.area = #{area}</if>
+            <if test="status != null "> and t1.status = #{status}</if>
         </where>
     </select>
-    
+
     <select id="selectDzSchoolById" parameterType="Long" resultMap="DzSchoolResult">
         <include refid="selectDzSchoolVo"/>
-        where id = #{id}
+        where t1.id = #{id}
     </select>
 
     <insert id="insertDzSchool" parameterType="DzSchool" useGeneratedKeys="true" keyProperty="id">
@@ -90,9 +104,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteDzSchoolByIds" parameterType="String">
-        delete from dz_school where id in 
+        delete from dz_school where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
-</mapper>
+</mapper>

+ 182 - 0
ie-system/src/main/resources/mapper/system/SysAreaMapper.xml

@@ -0,0 +1,182 @@
+<?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.SysAreaMapper">
+
+    <resultMap type="SysArea" id="SysAreaResult">
+        <result property="areaId"    column="area_id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="ancestors"    column="ancestors"    />
+        <result property="levelType"    column="level_type"    />
+        <result property="areaName"    column="area_name"    />
+        <result property="shortName"    column="short_name"    />
+        <result property="pinyin"    column="pinyin"    />
+        <result property="provinceName"    column="province_name"    />
+        <result property="provinceShortname"    column="province_shortname"    />
+        <result property="provincePinyin"    column="province_pinyin"    />
+        <result property="cityName"    column="city_name"    />
+        <result property="cityShortname"    column="city_shortname"    />
+        <result property="cityPinyin"    column="city_pinyin"    />
+        <result property="districtName"    column="district_name"    />
+        <result property="districtShortname"    column="district_shortname"    />
+        <result property="districtPinyin"    column="district_pinyin"    />
+        <result property="jianpin"    column="jianpin"    />
+        <result property="firstChar"    column="first_char"    />
+        <result property="areaCode"    column="area_code"    />
+        <result property="zipCode"    column="zip_code"    />
+        <result property="lontitude"    column="lontitude"    />
+        <result property="latitude"    column="latitude"    />
+        <result property="type"    column="type"    />
+        <result property="remark"    column="remark"    />
+        <result property="orderNum"    column="order_num"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="status"    column="status"    />
+        <result property="hasChildren"    column="has_children"    />
+    </resultMap>
+
+    <sql id="selectSysAreaVo">
+        select area_id, parent_id, ancestors,has_children, level_type, area_name, short_name, pinyin, province_name, province_shortname, province_pinyin, city_name, city_shortname, city_pinyin, district_name, district_shortname, district_pinyin, jianpin, first_char, area_code, zip_code, lontitude, latitude, type, remark, order_num, del_flag, status from sys_area
+    </sql>
+
+    <select id="selectSysAreaList" parameterType="SysArea" resultMap="SysAreaResult">
+        <include refid="selectSysAreaVo"/>
+            where status='0'
+            <if test="areaId != null "> and area_id = #{areaId}</if>
+            <if test="parentId != null "> and parent_id = #{parentId}</if>
+            <if test="ancestors != null  and ancestors != ''"> and ancestors = #{ancestors}</if>
+            <if test="levelType != null  and levelType != ''"> and level_type = #{levelType}</if>
+            <if test="areaName != null  and areaName != ''"> and area_name like concat('%', #{areaName}, '%')</if>
+            <if test="shortName != null  and shortName != ''"> and short_name like concat('%', #{shortName}, '%')</if>
+            <if test="pinyin != null  and pinyin != ''"> and pinyin = #{pinyin}</if>
+            <if test="provinceName != null  and provinceName != ''"> and province_name like concat('%', #{provinceName}, '%')</if>
+            <if test="provinceShortname != null  and provinceShortname != ''"> and province_shortname like concat('%', #{provinceShortname}, '%')</if>
+            <if test="provincePinyin != null  and provincePinyin != ''"> and province_pinyin = #{provincePinyin}</if>
+            <if test="cityName != null  and cityName != ''"> and city_name like concat('%', #{cityName}, '%')</if>
+            <if test="cityShortname != null  and cityShortname != ''"> and city_shortname like concat('%', #{cityShortname}, '%')</if>
+            <if test="cityPinyin != null  and cityPinyin != ''"> and city_pinyin = #{cityPinyin}</if>
+            <if test="districtName != null  and districtName != ''"> and district_name like concat('%', #{districtName}, '%')</if>
+            <if test="districtShortname != null  and districtShortname != ''"> and district_shortname like concat('%', #{districtShortname}, '%')</if>
+            <if test="districtPinyin != null  and districtPinyin != ''"> and district_pinyin = #{districtPinyin}</if>
+            <if test="jianpin != null  and jianpin != ''"> and jianpin = #{jianpin}</if>
+            <if test="firstChar != null  and firstChar != ''"> and first_char = #{firstChar}</if>
+            <if test="areaCode != null  and areaCode != ''"> and area_code = #{areaCode}</if>
+            <if test="zipCode != null  and zipCode != ''"> and zip_code = #{zipCode}</if>
+            <if test="lontitude != null  and lontitude != ''"> and lontitude = #{lontitude}</if>
+            <if test="latitude != null  and latitude != ''"> and latitude = #{latitude}</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+            <if test="orderNum != null "> and order_num = #{orderNum}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="hasChildren != null"> and has_children = #{hasChildren}</if>
+        order by area_id asc
+    </select>
+
+    <select id="selectSysAreaByAreaId" parameterType="Long" resultMap="SysAreaResult">
+        <include refid="selectSysAreaVo"/>
+        where area_id = #{areaId}
+    </select>
+
+    <insert id="insertSysArea" parameterType="SysArea" useGeneratedKeys="true" keyProperty="areaId">
+        insert into sys_area
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">parent_id,</if>
+            <if test="ancestors != null">ancestors,</if>
+            <if test="levelType != null">level_type,</if>
+            <if test="areaName != null">area_name,</if>
+            <if test="shortName != null">short_name,</if>
+            <if test="pinyin != null">pinyin,</if>
+            <if test="provinceName != null">province_name,</if>
+            <if test="provinceShortname != null">province_shortname,</if>
+            <if test="provincePinyin != null">province_pinyin,</if>
+            <if test="cityName != null">city_name,</if>
+            <if test="cityShortname != null">city_shortname,</if>
+            <if test="cityPinyin != null">city_pinyin,</if>
+            <if test="districtName != null">district_name,</if>
+            <if test="districtShortname != null">district_shortname,</if>
+            <if test="districtPinyin != null">district_pinyin,</if>
+            <if test="jianpin != null">jianpin,</if>
+            <if test="firstChar != null">first_char,</if>
+            <if test="areaCode != null">area_code,</if>
+            <if test="zipCode != null">zip_code,</if>
+            <if test="lontitude != null">lontitude,</if>
+            <if test="latitude != null">latitude,</if>
+            <if test="type != null">type,</if>
+            <if test="remark != null">remark,</if>
+            <if test="orderNum != null">order_num,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="status != null">status,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">#{parentId},</if>
+            <if test="ancestors != null">#{ancestors},</if>
+            <if test="levelType != null">#{levelType},</if>
+            <if test="areaName != null">#{areaName},</if>
+            <if test="shortName != null">#{shortName},</if>
+            <if test="pinyin != null">#{pinyin},</if>
+            <if test="provinceName != null">#{provinceName},</if>
+            <if test="provinceShortname != null">#{provinceShortname},</if>
+            <if test="provincePinyin != null">#{provincePinyin},</if>
+            <if test="cityName != null">#{cityName},</if>
+            <if test="cityShortname != null">#{cityShortname},</if>
+            <if test="cityPinyin != null">#{cityPinyin},</if>
+            <if test="districtName != null">#{districtName},</if>
+            <if test="districtShortname != null">#{districtShortname},</if>
+            <if test="districtPinyin != null">#{districtPinyin},</if>
+            <if test="jianpin != null">#{jianpin},</if>
+            <if test="firstChar != null">#{firstChar},</if>
+            <if test="areaCode != null">#{areaCode},</if>
+            <if test="zipCode != null">#{zipCode},</if>
+            <if test="lontitude != null">#{lontitude},</if>
+            <if test="latitude != null">#{latitude},</if>
+            <if test="type != null">#{type},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="orderNum != null">#{orderNum},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="status != null">#{status},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysArea" parameterType="SysArea">
+        update sys_area
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="parentId != null">parent_id = #{parentId},</if>
+            <if test="ancestors != null">ancestors = #{ancestors},</if>
+            <if test="levelType != null">level_type = #{levelType},</if>
+            <if test="areaName != null">area_name = #{areaName},</if>
+            <if test="shortName != null">short_name = #{shortName},</if>
+            <if test="pinyin != null">pinyin = #{pinyin},</if>
+            <if test="provinceName != null">province_name = #{provinceName},</if>
+            <if test="provinceShortname != null">province_shortname = #{provinceShortname},</if>
+            <if test="provincePinyin != null">province_pinyin = #{provincePinyin},</if>
+            <if test="cityName != null">city_name = #{cityName},</if>
+            <if test="cityShortname != null">city_shortname = #{cityShortname},</if>
+            <if test="cityPinyin != null">city_pinyin = #{cityPinyin},</if>
+            <if test="districtName != null">district_name = #{districtName},</if>
+            <if test="districtShortname != null">district_shortname = #{districtShortname},</if>
+            <if test="districtPinyin != null">district_pinyin = #{districtPinyin},</if>
+            <if test="jianpin != null">jianpin = #{jianpin},</if>
+            <if test="firstChar != null">first_char = #{firstChar},</if>
+            <if test="areaCode != null">area_code = #{areaCode},</if>
+            <if test="zipCode != null">zip_code = #{zipCode},</if>
+            <if test="lontitude != null">lontitude = #{lontitude},</if>
+            <if test="latitude != null">latitude = #{latitude},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="orderNum != null">order_num = #{orderNum},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="status != null">status = #{status},</if>
+        </trim>
+        where area_id = #{areaId}
+    </update>
+
+    <delete id="deleteSysAreaByAreaId" parameterType="Long">
+        delete from sys_area where area_id = #{areaId}
+    </delete>
+
+    <delete id="deleteSysAreaByAreaIds" parameterType="String">
+        delete from sys_area where area_id in
+        <foreach item="areaId" collection="array" open="(" separator="," close=")">
+            #{areaId}
+        </foreach>
+    </delete>
+</mapper>