doum
22 小时以前 064d703f2907b931085c5f565269289e9fa81012
最新版本541200007
已添加4个文件
已修改13个文件
865 ■■■■ 文件已修改
admin/src/api/system/permission.js 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/EmptyTip.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/FormItemTip.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/permission/OperaModuleWindow.vue 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/permission/OperaPermissionWindow.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/permission.vue 229 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionCloudController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/api/system/SystemPermissionController.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/SystemPermissionMapper.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/SystemPermission.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/SystemPermissionService.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/resources/mappers/SystemPermissionMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/permission.js
@@ -1,13 +1,8 @@
import request from '@/utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/system/permission/page', data)
}
// æŸ¥è¯¢æ‰€æœ‰
export function fetchAll () {
  return request.get('/visitsAdmin/cloudService/system/permission/all')
// æŸ¥è¯¢æ ‘列表
export function fetchTree () {
  return request.get('/visitsAdmin/cloudService/system/permission/tree')
}
// æ–°å»º
@@ -24,16 +19,19 @@
  })
}
// æ‰¹é‡ä¿®æ”¹
export function updateByIdInBatch (data) {
  return request.post('/visitsAdmin/cloudService/system/permission/updateByIdInBatch', data, {
    trim: true
  })
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/system/permission/delete/${id}`)
export function deletePermission (data) {
  return request.post('/visitsAdmin/cloudService/system/permission/delete', data)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/visitsAdmin/cloudService/system/permission/delete/batch', {
    params: {
      ids
    }
  })
export function deletePermissionInBatch (data) {
  return request.post('/visitsAdmin/cloudService/system/permission/delete/batch', data)
}
admin/src/components/common/EmptyTip.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<template>
  <div class="empty-tip">
    <slot>暂无数据</slot>
  </div>
</template>
<script>
export default {
  name: 'EmptyTip'
}
</script>
<style scoped lang="scss">
.empty-tip {
  text-align: center;
  padding: 40px 0;
  color: #999;
}
</style>
admin/src/components/common/FormItemTip.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
<template>
  <p class="form-item-tip"><i class="el-icon-warning-outline"></i><slot></slot></p>
</template>
<script>
export default {
  name: 'FormItemTip'
}
</script>
<style scoped lang="scss">
.form-item-tip {
  line-height: 20px;
  font-size: 13px;
  color: #999;
  margin: 6px 0 0 0;
  .el-icon-warning-outline {
    font-size: 16px;
    margin-right: 5px;
    position: relative;
    top: 2px;
    color: orange;
  }
}
</style>
admin/src/components/system/permission/OperaModuleWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="权限模块" prop="module">
        <el-input v-model="form.module" placeholder="请输入权限模块" v-trim maxlength="500"/>
        <FormItemTip>多个模块可以通过"/"分割,例如"日志管理/操作日志"</FormItemTip>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import FormItemTip from '@/components/common/FormItemTip'
import { updateByIdInBatch } from '@/api/system/permission'
export default {
  name: 'OperaModuleWindow',
  extends: BaseOpera,
  components: { FormItemTip, GlobalWindow },
  data () {
    return {
      // è¡Œæ•°æ®
      row: null,
      // è¡¨å•数据
      form: {
        module: ''
      },
      // éªŒè¯è§„则
      rules: {
        module: [
          { validator: this.__checkModule, trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    /**
     * æ‰“开窗口
     *
     * @param title æ ‡é¢˜
     * @param target è¡Œå¯¹è±¡ï¼ˆä»…编辑需该参数)
     */
    open (title, target) {
      this.title = title
      this.row = target
      this.visible = true
      // ç¼–辑
      this.$nextTick(() => {
        this.form.module = target.name
      })
    },
    /**
     * ç¡®è®¤
     */
    confirm () {
      this.$refs.form.validate(valid => {
        if (!valid) {
          return
        }
        const pool = []
        this.__fillPool(pool, this.row.children, this.form.module)
        this.isWorking = true
        updateByIdInBatch(pool)
          .then(() => {
            this.visible = false
            this.$emit('success')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
          })
      })
    },
    /**
     * å¡«å……权限池,将所有权限的模块前缀调整为新权限模块后丢入pool中
     *
     * @param pool æƒé™æ± 
     * @param list æƒé™åˆ—表
     * @param newModule æ–°æƒé™æ¨¡å—
     */
    __fillPool (pool, list, newModule) {
      if (list == null) {
        return
      }
      for (const child of list) {
        if (child.type !== 'module') {
          const modulePaths = child.module.split('/')
          modulePaths[this.row.level] = newModule
          child.module = modulePaths.join('/')
          pool.push(child)
          continue
        }
        this.__fillPool(pool, child.children, newModule)
      }
    },
    /**
     * éªŒè¯æ¨¡å—
     *
     * @param rule è§„则
     * @param value å€¼
     * @param callback å›žè°ƒ
     * @returns {*}
     * @private
     */
    __checkModule (rule, value, callback) {
      if (value == null || value === '') {
        return callback()
      }
      // ä¸å…è®¸åŒ…含空格
      if (value.indexOf(' ') !== -1) {
        return callback(new Error('不允许包含空格'))
      }
      // ä¸å…è®¸ä½¿ç”¨"/"开头或结尾
      if (value.startsWith('/') || value.endsWith('/')) {
        return callback(new Error('请勿使用"/"开头或结尾'))
      }
      return callback()
    }
  },
  created () {
    this.config({
      api: '/system/permission'
    })
  }
}
</script>
admin/src/components/system/permission/OperaPermissionWindow.vue
@@ -12,6 +12,10 @@
      <el-form-item label="权限名称" prop="name" required>
        <el-input v-model="form.name" placeholder="请输入权限名称" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="权限模块" prop="module">
        <el-input v-model="form.module" placeholder="请输入权限模块" v-trim maxlength="500"/>
        <FormItemTip>多个模块可以通过"/"分割,例如"日志管理/操作日志"</FormItemTip>
      </el-form-item>
      <el-form-item label="权限备注" prop="remark">
        <el-input v-model="form.remark" placeholder="请输入权限备注" type="textarea" :rows="3" v-trim maxlength="500"/>
      </el-form-item>
@@ -22,10 +26,11 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import FormItemTip from '@/components/common/FormItemTip'
export default {
  name: 'OperaPermissionWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  components: { FormItemTip, GlobalWindow },
  data () {
    return {
      // åŽŸæƒé™ç 
@@ -35,6 +40,7 @@
        id: null,
        code: '',
        name: '',
        module: '',
        remark: ''
      },
      // éªŒè¯è§„则
@@ -44,19 +50,31 @@
        ],
        name: [
          { required: true, message: '请输入权限名称' }
        ],
        module: [
          { validator: this.__checkModule, trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    /**
     * æ‰“开窗口
     *
     * @param title çª—口标题
     * @param target è¡Œå¯¹è±¡ï¼ˆä»…编辑需该参数)
     */
    open (title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
      if (target == null || target.type === 'module') {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          if (target.type === 'module') {
            this.form.module = target.modulePath
          }
        })
        return
      }
@@ -68,6 +86,9 @@
        }
      })
    },
    /**
     * ç¡®è®¤
     */
    confirm () {
      if (this.form.id == null || this.form.id === '') {
        this.__confirmCreate()
@@ -85,6 +106,29 @@
        .then(() => {
          this.__confirmEdit()
        })
    },
    /**
     * éªŒè¯æ¨¡å—
     *
     * @param rule è§„则
     * @param value å€¼
     * @param callback å›žè°ƒ
     * @returns {*}
     * @private
     */
    __checkModule (rule, value, callback) {
      if (value == null || value === '') {
        return callback()
      }
      // ä¸å…è®¸åŒ…含空格
      if (value.indexOf(' ') !== -1) {
        return callback(new Error('不允许包含空格'))
      }
      // ä¸å…è®¸ä½¿ç”¨"/"开头或结尾
      if (value.startsWith('/') || value.endsWith('/')) {
        return callback(new Error('请勿使用"/"开头或结尾'))
      }
      return callback()
    }
  },
  created () {
admin/src/views/system/permission.vue
@@ -1,97 +1,190 @@
<template>
  <TableLayout :permissions="['system:permission:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="权限编码" prop="code">
        <el-input v-model="searchForm.code" v-trim placeholder="请输入权限编码" @keypress.enter.native="search"/>
      </el-form-item>
      <el-form-item label="权限名称" prop="name">
        <el-input v-model="searchForm.name" v-trim placeholder="请输入权限名称" @keypress.enter.native="search"/>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['system:permission:create', 'system:permission:delete']">
        <li><el-button type="primary" @click="$refs.operaPermissionWindow.open('新建系统权限')" icon="el-icon-plus" v-permissions="['system:permission:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['system:permission:delete']">删除</el-button></li>
      </ul>
      <el-table
          :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        :default-sort = "{prop: 'createTime', order: 'descending'}"
        stripe
        @selection-change="handleSelectionChange"
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" fixed="left" width="55"></el-table-column>
        <el-table-column prop="code" label="权限编码" fixed="left" min-width="240px"></el-table-column>
        <el-table-column prop="name" label="权限名称" fixed="left" min-width="200px"></el-table-column>
        <el-table-column prop="remark" label="权限备注" min-width="200px"></el-table-column>
        <el-table-column prop="createUser" label="创建人" min-width="100px">
          <template slot-scope="{row}">{{row.createUserInfo == null ? '' : row.createUserInfo.username}}</template>
        </el-table-column>
        <el-table-column prop="createTime" label="创建时间" min-width="140px" sortable="custom" sort-by="perm.CREATE_TIME"></el-table-column>
        <el-table-column prop="updateUser" label="更新人" min-width="100px">
          <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template>
        </el-table-column>
        <el-table-column prop="updateTime" label="更新时间" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['system:permission:update', 'system:permission:delete'])"
          label="操作"
          min-width="130"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button v-if="!row.fixed" type="text" @click="$refs.operaPermissionWindow.open('编辑系统权限', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">编辑</el-button>
            <el-button v-if="!row.fixed" type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['system:permission:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      ></pagination>
      <el-tabs v-model="currentTab" v-loading="isWorking.search">
        <el-tab-pane :name="'module'+module.id" :label="module.name" v-for="module in tableData.list" :key="module.id">
          <ul class="toolbar" v-permissions="['system:permission:create', 'system:permission:delete']">
            <li><el-button type="primary" @click="$refs.operaPermissionWindow.open('新建系统权限', module)" icon="el-icon-plus" v-permissions="['system:permission:create']">新建</el-button></li>
            <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['system:permission:delete']">删除</el-button></li>
          </ul>
          <el-table
              :height="tableHeightNew"
            :data="module.children"
            :ref="'module' + module.id"
            row-key="id"
            stripe
            default-expand-all
            @selection-change="handleSelectionChange"
          >
            <el-table-column type="selection" fixed="left" width="55"></el-table-column>
            <el-table-column prop="name" label="权限名称" fixed="left" min-width="200px"></el-table-column>
            <el-table-column prop="code" label="权限编码" min-width="200px"></el-table-column>
            <el-table-column prop="remark" label="权限备注" min-width="120px"></el-table-column>
            <el-table-column prop="createUser" label="创建人" min-width="100px">
              <template slot-scope="{row}">{{row.createUserInfo == null ? '' : row.createUserInfo.username}}</template>
            </el-table-column>
            <el-table-column prop="createTime" label="创建时间" min-width="140px"></el-table-column>
            <el-table-column prop="updateUser" label="更新人" min-width="100px">
              <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template>
            </el-table-column>
            <el-table-column prop="updateTime" label="更新时间" min-width="140px"></el-table-column>
            <el-table-column
              v-if="containPermissions(['system:permission:update', 'system:permission:delete'])"
              label="操作"
              min-width="150"
              fixed="right"
            >
              <template slot-scope="{row}">
                <!-- æ¨¡å—编辑&删除 -->
                <template v-if="row.type === 'module'">
                  <el-button type="text" @click="$refs.operaModuleWindow.open('编辑模块', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">编辑</el-button>
                  <el-button type="text" @click="$refs.operaPermissionWindow.open('新建系统权限', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">添加权限</el-button>
                  <el-button v-if="!row.fixed" type="text" @click="deletePermission(row)" icon="el-icon-delete" v-permissions="['system:permission:delete']">删除</el-button>
                </template>
                <!-- æƒé™ç¼–辑&删除 -->
                <template v-else>
                  <el-button v-if="!row.fixed" type="text" @click="$refs.operaPermissionWindow.open('编辑系统权限', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">编辑</el-button>
                  <el-button v-if="!row.fixed" type="text" @click="deletePermission(row)" icon="el-icon-delete" v-permissions="['system:permission:delete']">删除</el-button>
                </template>
              </template>
            </el-table-column>
          </el-table>
        </el-tab-pane>
      </el-tabs>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaPermissionWindow ref="operaPermissionWindow" @success="handlePageChange"/>
    <OperaPermissionWindow ref="operaPermissionWindow" @success="search"/>
    <!-- ç¼–辑权限模块 -->
    <OperaModuleWindow ref="operaModuleWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import TableLayout from '@/layouts/TableLayout'
import BaseTable from '@/components/base/BaseTable'
import OperaPermissionWindow from '@/components/system/permission/OperaPermissionWindow'
import OperaModuleWindow from '@/components/system/permission/OperaModuleWindow'
export default {
  name: 'SystemPermission',
  extends: BaseTable,
  components: { OperaPermissionWindow, TableLayout, Pagination },
  components: { OperaModuleWindow, OperaPermissionWindow, TableLayout },
  data () {
    return {
      // æœç´¢
      searchForm: {
        code: '',
        name: '',
        remark: ''
      // å½“前选中的模块
      currentTab: null
    }
  },
  methods: {
    /**
     * è¦†ç›–页码变更处理
     */
    handlePageChange () {
      this.isWorking.search = true
      this.api.fetchTree()
        .then(data => {
          this.tableData.list = data
          this.currentTab = 'module' + this.tableData.list[0].id
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking.search = false
        })
    },
    /**
     * è¦†ç›–删除处理
     */
    deletePermission (row, childConfirm = true) {
      this.__checkApi()
      let message = `确认删除${this.module}【${row[this.configData['field.main']]}】吗?`
      if (childConfirm && row.children != null && row.children.length > 0) {
        message = `确认删除${this.module}【${row[this.configData['field.main']]}】及其子${this.module}吗?`
      }
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          this.api.deletePermission({
            id: row.type === 'module' ? null : row.id, // æ¨¡å—不传ID
            modulePrefix: row.type === 'module' ? row.modulePath : null // æƒé™ä¸ä¼ æ¨¡å—
          })
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.__afterDelete()
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking.delete = false
            })
        })
        .catch(() => {})
    },
    /**
     * è¦†ç›–批量删除处理
     */
    deleteByIdInBatch (childConfirm = true) {
      this.__checkApi()
      if (this.tableData.selectedRows.length === 0) {
        this.$tip.warning('请至少选择一条数据')
        return
      }
      let message = `确认删除已选中的 ${this.tableData.selectedRows.length} æ¡${this.module}记录吗?`
      if (childConfirm) {
        const containChildrenRows = []
        for (const row of this.tableData.selectedRows) {
          if (row.children != null && row.children.length > 0) {
            containChildrenRows.push(row[this.configData['field.main']])
          }
        }
        if (containChildrenRows.length > 0) {
          message = `本次将删除${this.module}【${containChildrenRows.join('、')}】及其子${this.module}记录,确认删除吗?`
        }
      }
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          this.api.deletePermissionInBatch(this.tableData.selectedRows.map(row => {
            return {
              id: row.type === 'module' ? null : row.id, // æ¨¡å—不传ID
              modulePrefix: row.type === 'module' ? row.modulePath : null // æƒé™ä¸ä¼ æ¨¡å—
            }
          }))
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.__afterDelete(this.tableData.selectedRows.length)
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking.delete = false
            })
        })
        .catch(() => {})
    }
  },
  created () {
    this.config({
      module: '权限',
      api: '/system/permission',
      sorts: [{
        property: 'perm.CREATE_TIME',
        direction: 'DESC'
      }]
      api: '/system/permission'
    })
    this.search()
  }
}
</script>
<style scoped lang="scss">
/deep/ .table-content {
  margin-top: 0;
  .table-wrap {
    padding-bottom: 16px;
  }
}
/deep/ .el-tabs__nav-prev, /deep/ .el-tabs__nav-next {
  line-height: 40px;
}
</style>
server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionCloudController.java
@@ -5,6 +5,7 @@
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.constants.OperaType;
import com.doumee.dao.system.dto.DeleteSystemPermissionDTO;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -30,7 +31,7 @@
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/system/permission")
public class SystemPermissionCloudController extends BaseController {
    @Autowired
    private SystemPermissionService systemPermissionService;
@@ -41,54 +42,46 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("system:permission:create")
    public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemPermission systemPermission) {
        systemPermission.setCreateUser(this.getLoginUser(token).getId());
    public ApiResponse create(@Validated(Constants.OperaType.Create.class) @RequestBody SystemPermission systemPermission) {
        return ApiResponse.success(systemPermissionBiz.create(systemPermission));
    }
    @ApiOperation("删除")
    @GetMapping("/delete/{id}")
    @PostMapping("/delete")
    @CloudRequiredPermission("system:permission:delete")
    public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) {
        systemPermissionBiz.deleteById(id);
    public ApiResponse deleteById(@RequestBody DeleteSystemPermissionDTO dto) {
        systemPermissionService.delete(dto);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @PostMapping("/delete/batch")
    @CloudRequiredPermission("system:permission:delete")
    public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        systemPermissionBiz.deleteByIdInBatch(idList);
    public ApiResponse deleteByIdInBatch(@RequestBody List<DeleteSystemPermissionDTO> dtos) {
        systemPermissionService.deleteInBatch(dtos);
        return ApiResponse.success(null);
    }
    @ApiOperation("修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("system:permission:update")
    public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemPermission systemPermission) {
        systemPermission.setUpdateUser(this.getLoginUser(token).getId());
    public ApiResponse updateById(@Validated(Constants.OperaType.Update.class) @RequestBody SystemPermission systemPermission) {
        systemPermissionBiz.updateById(systemPermission);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("system:permission:query")
    public ApiResponse<PageData<SystemPermissionListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemPermissionDTO> pageWrap) {
        return ApiResponse.success(systemPermissionService.findPage(pageWrap));
    @ApiOperation("批量修改")
    @PostMapping("/updateByIdInBatch")
    @CloudRequiredPermission("system:permission:update")
    public ApiResponse updateById(@RequestBody List<SystemPermission> permissions) {
        systemPermissionService.updateByIdInBatch(permissions);
        return ApiResponse.success(null);
    }
    @ApiOperation("查询所有")
    @GetMapping("/all")
    @ApiOperation("查询权限树列表")
    @GetMapping("/tree")
    @CloudRequiredPermission("system:permission:query")
    public ApiResponse<List<SystemPermission>> findAll (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        SystemPermission systemPermission = new SystemPermission();
        systemPermission.setDeleted(Boolean.FALSE);
        return ApiResponse.success(systemPermissionService.findList(systemPermission));
    public ApiResponse<List<SystemPermissionListVO>> findAll () {
        return ApiResponse.success(systemPermissionService.findTree());
    }
}
server/system_service/src/main/java/com/doumee/api/system/SystemPermissionController.java
@@ -3,12 +3,8 @@
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemPermissionBiz;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.constants.OperaType;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.system.dto.QuerySystemPermissionDTO;
import com.doumee.dao.system.dto.DeleteSystemPermissionDTO;
import com.doumee.dao.system.model.SystemPermission;
import com.doumee.dao.system.vo.SystemPermissionListVO;
import com.doumee.service.system.SystemPermissionService;
@@ -17,14 +13,14 @@
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import com.doumee.service.business.third.model.ApiResponse;
/**
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @author  dm
 * @since 2025/03/31 16:44
 */
@Api(tags = "系统权限")
@RestController
@@ -41,54 +37,46 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("system:permission:create")
    public ApiResponse create(@Validated(OperaType.Create.class)@RequestBody SystemPermission systemPermission, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
       systemPermission.setCreateUser(this.getLoginUser(token).getId());
    public ApiResponse create(@Validated(Constants.OperaType.Create.class) @RequestBody SystemPermission systemPermission) {
        return ApiResponse.success(systemPermissionBiz.create(systemPermission));
    }
    @ApiOperation("删除")
    @GetMapping("/delete/{id}")
    @PostMapping("/delete")
    @RequiresPermissions("system:permission:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        systemPermissionBiz.deleteById(id);
    public ApiResponse deleteById(@RequestBody DeleteSystemPermissionDTO dto) {
        systemPermissionService.delete(dto);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @PostMapping("/delete/batch")
    @RequiresPermissions("system:permission:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        systemPermissionBiz.deleteByIdInBatch(idList);
    public ApiResponse deleteByIdInBatch(@RequestBody List<DeleteSystemPermissionDTO> dtos) {
        systemPermissionService.deleteInBatch(dtos);
        return ApiResponse.success(null);
    }
    @ApiOperation("修改")
    @PostMapping("/updateById")
    @RequiresPermissions("system:permission:update")
    public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemPermission systemPermission, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        systemPermission.setUpdateUser(this.getLoginUser(token).getId());
    public ApiResponse updateById(@Validated(Constants.OperaType.Update.class) @RequestBody SystemPermission systemPermission) {
        systemPermissionBiz.updateById(systemPermission);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("system:permission:query")
    public ApiResponse<PageData<SystemPermissionListVO>> findPage (@RequestBody PageWrap<QuerySystemPermissionDTO> pageWrap) {
        return ApiResponse.success(systemPermissionService.findPage(pageWrap));
    @ApiOperation("批量修改")
    @PostMapping("/updateByIdInBatch")
    @RequiresPermissions("system:permission:update")
    public ApiResponse updateById(@RequestBody List<SystemPermission> permissions) {
        systemPermissionService.updateByIdInBatch(permissions);
        return ApiResponse.success(null);
    }
    @ApiOperation("查询所有")
    @GetMapping("/all")
    @ApiOperation("查询权限树列表")
    @GetMapping("/tree")
    @RequiresPermissions("system:permission:query")
    public ApiResponse<List<SystemPermission>> findAll () {
        SystemPermission systemPermission = new SystemPermission();
        systemPermission.setDeleted(Boolean.FALSE);
        return ApiResponse.success(systemPermissionService.findList(systemPermission));
    public ApiResponse<List<SystemPermissionListVO>> findAll () {
        return ApiResponse.success(systemPermissionService.findTree());
    }
}
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -54,7 +54,26 @@
    public static final String SIGN_IN_QRCODE ="SIGN_IN_QRCODE" ;
    public static final String SIGN_IN_ATTENTION ="SIGN_IN_ATTENTION" ;
    public static final String SIGN_IN_QRCODE_PREFIX ="SIGN_IN_QRCODE_PREFIX" ;
    /**
     * æ“ä½œç±»åž‹ï¼Œç”¨äºŽåšæŽ¥å£éªŒè¯åˆ†ç»„
     */
    public interface OperaType {
        /**
         * åˆ›å»º
         */
        interface Create {}
        /**
         * ä¿®æ”¹
         */
        interface Update {}
        /**
         * ä¿®æ”¹çŠ¶æ€
         */
        interface UpdateStatus {}
    }
    public static final String WEATHER_CONFIG ="WEATHER_CONFIG" ;
    public static final String REQUEST_URL ="REQUEST_URL" ;
server/system_service/src/main/java/com/doumee/dao/system/SystemPermissionMapper.java
@@ -12,23 +12,24 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param userId ç”¨æˆ·ID
     * @return List<SystemPermission>
     */
    List<SystemPermission> selectByUserId(Integer userId);
    /**
     * æ ¹æ®è§’色ID查询
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param roleId è§’色ID
     * @return List<SystemPermission>
     */
    List<SystemPermission> selectByRoleId(Integer roleId);
    /**
     * æŸ¥è¯¢åˆ—表
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     * æŸ¥è¯¢æƒé™ç®¡ç†åˆ—表
     *
     * @return List<SystemPermissionListVO>
     */
    List<SystemPermissionListVO> selectManageList(@Param("dto") QuerySystemPermissionDTO dto, @Param("orderByClause") String orderByClause);
    List<SystemPermissionListVO> selectManageList();
}
server/system_service/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.doumee.dao.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author  dm
 * @since 2025/03/31 16:44
 */
@Data
@ApiModel("删除权限参数")
public class DeleteSystemPermissionDTO {
    @ApiModelProperty("权限ID")
    private Integer id;
    @ApiModelProperty("模块前缀")
    private String modulePrefix;
}
server/system_service/src/main/java/com/doumee/dao/system/model/SystemPermission.java
@@ -56,4 +56,9 @@
    @ApiModelProperty(value = "是否已删除", hidden = true)
    private Boolean deleted;
    @ApiModelProperty(value = "模块")
    private String module;
}
server/system_service/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java
@@ -6,14 +6,28 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @author  dm
 * @since 2025/03/31 16:44
 */
@Data
@ApiModel("系统权限列表视图对象")
public class SystemPermissionListVO extends SystemPermission {
    @ApiModelProperty(value = "类型,module模块,permission权限")
    private String type;
    @ApiModelProperty(value = "模块路径")
    private String modulePath;
    @ApiModelProperty(value = "层级")
    private Integer level;
    @ApiModelProperty(value = "子权限列表")
    private List<SystemPermissionListVO> children;
    @ApiModelProperty(value = "创建人信息")
    private SystemUser createUserInfo;
server/system_service/src/main/java/com/doumee/service/system/SystemPermissionService.java
@@ -1,5 +1,6 @@
package com.doumee.service.system;
import com.doumee.dao.system.dto.DeleteSystemPermissionDTO;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.system.dto.QuerySystemPermissionDTO;
@@ -17,85 +18,106 @@
    /**
     * åˆ›å»º
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param systemPermission å®žä½“
     * @return Integer
     */
    Integer create(SystemPermission systemPermission);
    /**
     * ä¸»é”®åˆ é™¤
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param ids ä¸»é”®åˆ—表
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * åˆ é™¤
     *
     * @param dto åˆ é™¤æ¡ä»¶
     */
    void delete (DeleteSystemPermissionDTO dto);
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param dtos åˆ é™¤æ¡ä»¶åˆ—表
     */
    void deleteInBatch(List<DeleteSystemPermissionDTO> dtos);
    /**
     * ä¸»é”®æ›´æ–°
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param systemPermission å®žä½“
     */
    void updateById(SystemPermission systemPermission);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param systemPermissions å®žä½“列表
     */
    void updateByIdInBatch(List<SystemPermission> systemPermissions);
    /**
     * ä¸»é”®æŸ¥è¯¢
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param id ä¸»é”®
     * @return SystemPermission
     */
    SystemPermission findById(Integer id);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param userId ç”¨æˆ·ID
     * @return List<SystemPermission>
     */
    List<SystemPermission> findByUserId(Integer userId);
    /**
     * æ ¹æ®è§’色ID查询
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param roleId è§’色ID
     * @return List<SystemPermission>
     */
    List<SystemPermission> findByRoleId(Integer roleId);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param systemPermission æŸ¥è¯¢æ¡ä»¶
     * @return SystemPermission
     */
    SystemPermission findOne(SystemPermission systemPermission);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param systemPermission æŸ¥è¯¢æ¡ä»¶
     * @return List<SystemPermission>
     */
    List<SystemPermission> findList(SystemPermission systemPermission);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     * æŸ¥è¯¢ç®¡ç†åˆ—表
     *
     * @return List<SystemPermissionListVO>
     */
    PageData<SystemPermissionListVO> findPage(PageWrap<QuerySystemPermissionDTO> pageWrap);
    List<SystemPermissionListVO> findTree();
    /**
     * æ¡ä»¶ç»Ÿè®¡
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     *
     * @param systemPermission ç»Ÿè®¡æ¡ä»¶
     * @return long
     */
    long count(SystemPermission systemPermission);
}
server/system_service/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java
@@ -1,5 +1,7 @@
package com.doumee.service.system.impl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.dao.system.dto.DeleteSystemPermissionDTO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.doumee.service.business.third.model.PageData;
@@ -11,11 +13,14 @@
import com.doumee.service.system.SystemPermissionService;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
@@ -25,6 +30,7 @@
 */
@Service
public class SystemPermissionServiceImpl implements SystemPermissionService {
    @Autowired
    private SystemPermissionMapper systemPermissionMapper;
@@ -53,6 +59,26 @@
    }
    @Override
    public void delete(DeleteSystemPermissionDTO dto) {
        UpdateWrapper<SystemPermission> deleteWrapper = new UpdateWrapper<>();
        deleteWrapper.lambda()
                .set(SystemPermission::getDeleted, Boolean.TRUE)
                .eq(dto.getId() != null, SystemPermission::getId, dto.getId())
                .likeLeft(dto.getModulePrefix() != null, SystemPermission::getModule, dto.getModulePrefix());
        systemPermissionMapper.update(null, deleteWrapper);
    }
    @Override
    public void deleteInBatch(List<DeleteSystemPermissionDTO> dtos) {
        if (CollectionUtils.isEmpty(dtos)) {
            return;
        }
        for (DeleteSystemPermissionDTO dto : dtos) {
            this.delete(dto);
        }
    }
    @Override
    public void updateById(SystemPermission systemPermission) {
        systemPermissionMapper.updateById(systemPermission);
    }
@@ -61,7 +87,7 @@
    @Transactional
    public void updateByIdInBatch(List<SystemPermission> systemPermissions) {
        if (CollectionUtils.isEmpty(systemPermissions)) return;
        for (SystemPermission systemPermission: systemPermissions) {
        for (SystemPermission systemPermission : systemPermissions) {
            this.updateById(systemPermission);
        }
    }
@@ -83,7 +109,8 @@
    @Override
    public SystemPermission findOne(SystemPermission systemPermission) {
        Wrapper<SystemPermission> wrapper = new QueryWrapper<>(systemPermission);
        QueryWrapper<SystemPermission> wrapper = new QueryWrapper<>(systemPermission);
        wrapper.lambda().last("limit 1");
        return systemPermissionMapper.selectOne(wrapper);
    }
@@ -94,9 +121,46 @@
    }
    @Override
    public PageData<SystemPermissionListVO> findPage(PageWrap<QuerySystemPermissionDTO> pageWrap) {
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
        return PageData.from(new PageInfo<>(systemPermissionMapper.selectManageList(pageWrap.getModel(), pageWrap.getOrderByClause())));
    public List<SystemPermissionListVO> findTree() {
        List<SystemPermissionListVO> permissionList = systemPermissionMapper.selectManageList();
        List<SystemPermissionListVO> tree = new ArrayList<>();
        for (SystemPermissionListVO permission : permissionList) {
            // æ²¡æœ‰æ¨¡å—的权限默认归属为"其它"模块
            if (StringUtils.isBlank(permission.getModule())) {
                permission.setModule("其它");
            }
            // åˆ†è§£æ¨¡å—
            String[] modulePaths = permission.getModule().split("/");
            SystemPermissionListVO target = null;
            SystemPermissionListVO parent = null;
            List<String> paths = new ArrayList<>();
            for (String path : modulePaths) {
                paths.add(path);
                // æŸ¥æ‰¾æ¨¡å—
                target = this.getTargetNode(tree, paths);
                // å¦‚果模块不存在,则添加一个子模块
                if (target == null) {
                    target = new SystemPermissionListVO();
                    target.setId(Integer.valueOf(RandomStringUtils.randomNumeric(6)) * -1);
                    target.setLevel(paths.size() - 1);
                    target.setType("module");
                    target.setName(path);
                    target.setModulePath(StringUtils.join(paths, "/"));
                    target.setChildren(new ArrayList<>());
                    if (parent != null) {
                        parent.getChildren().add(target);
                    } else {
                        tree.add(target);
                    }
                }
                parent = target;
            }
            // å°†æƒé™æ·»åŠ è¿›æ¨¡å—ä¸­
            if (target != null) {
                target.getChildren().add(permission);
            }
        }
        return tree;
    }
    @Override
@@ -104,4 +168,28 @@
        Wrapper<SystemPermission> wrapper = new QueryWrapper<>(systemPermission);
        return systemPermissionMapper.selectCount(wrapper);
    }
    /**
     * æŸ¥æ‰¾ç›®æ ‡èŠ‚ç‚¹
     * @param tree èŠ‚ç‚¹æ ‘
     * @param paths æ¨¡å—路径
     * @return
     */
    private SystemPermissionListVO getTargetNode(List<SystemPermissionListVO> tree, List<String> paths) {
        List<SystemPermissionListVO> list = tree;
        List<SystemPermissionListVO> nodeStack = new ArrayList<>();
        for (String path : paths) {
            if (list == null) {
                break;
            }
            for (SystemPermissionListVO permission : list) {
                if (path.equals(permission.getName()) && "module".equals(permission.getType())) {
                    nodeStack.add(permission);
                    list = permission.getChildren();
                    break;
                }
            }
        }
        return nodeStack.size() == paths.size() ? nodeStack.get(nodeStack.size() - 1) : null;
    }
}
server/system_service/src/main/resources/mappers/SystemPermissionMapper.xml
@@ -16,7 +16,7 @@
  </resultMap>
  <select id="selectManageList" resultMap="SystemPermissionListVO">
    SELECT
      perm.`ID`, perm.`CODE`, perm.`NAME`, perm.`REMARK`, perm.`FIXED`, perm.`CREATE_TIME`, perm.`UPDATE_TIME`, perm.`CREATE_USER`, perm.`UPDATE_USER`, perm.`DELETED`,
      perm.`ID`, perm.`CODE`, perm.`NAME`, perm.`MODULE`, perm.`REMARK`, perm.`FIXED`, perm.`CREATE_TIME`, perm.`UPDATE_TIME`, perm.`CREATE_USER`, perm.`UPDATE_USER`, perm.`DELETED`,
      create_user.ID CREATE_USER_ID, create_user.`USERNAME` CREATE_USER_NAME,
      update_user.ID UPDETE_USER_ID, update_user.`USERNAME` UPDATE_USER_NAME
    FROM SYSTEM_PERMISSION perm
@@ -24,14 +24,8 @@
    LEFT JOIN `SYSTEM_USER` update_user ON update_user.ID = perm.UPDATE_USER
    <where>
      perm.DELETED = 0
      <if test="dto.code != null">
        AND perm.CODE LIKE CONCAT('%', #{dto.code}, '%')
      </if>
      <if test="dto.name != null">
        AND perm.`NAME` LIKE CONCAT('%', #{dto.name}, '%')
      </if>
    </where>
    ${orderByClause}
    ORDER BY perm.CREATE_TIME ASC, perm.ID ASC
  </select>
  <!-- æ ¹æ®ç”¨æˆ·ID查询权限 -->
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
@@ -76,7 +76,6 @@
        jkSketchMapper.insert(jkSketch);
        return jkSketch.getId();
    }
    @Override
    public void deleteById(Integer id) {
        jkSketchMapper.deleteById(id);
@@ -87,7 +86,6 @@
        UpdateWrapper<JkSketch> deleteWrapper = new UpdateWrapper<>(jkSketch);
        jkSketchMapper.delete(deleteWrapper);
    }
    @Override
    @PostConstruct
@@ -492,7 +490,6 @@
                    .set(JkSketch::getStatus,Constants.THREE)
                    .set(JkSketch::getPlanLineEndDate,new Date()));
        }
    }
    @Override
    @Async
@@ -550,7 +547,6 @@
                    for (int j = 0; j < customerListParam.size(); j++) {
                        distanceMatrix1[i+1][j+1] =disList.get(j+1).getDistance() ;
                    }
                }
                //构造优化数据模型
                dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1);
@@ -574,7 +570,6 @@
                }
                line.setDistance(so.getDistance());
            }
        }catch (Exception e){
            e.printStackTrace();
            success =false;
@@ -595,9 +590,7 @@
                    .set(JkSketch::getStatus,success?Constants.TWO:Constants.THREE)
                    .set(JkSketch::getPlanLineEndDate,new Date()));
        }
    }
    private List<JkSketchCustomer> initSketchCustomerListParam(List<JkSketchCustomer> customerList, List<JkSketchCustomer> customerList1) {
        for(JkSketchCustomer param : customerList){
            for(JkSketchCustomer model : customerList1){