lishuai
2023-12-22 3f7aa1396eef8f046a9debb880285ce6b32acc53
Merge remote-tracking branch 'origin/master'
已修改36个文件
1144 ■■■■ 文件已修改
admin/src/api/business/device.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/deviceRole.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/common.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceRoleFWindow.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceRoleWindow.vue 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaProblemsWindow.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/device.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole_f.vue 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/laborSource.vue 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/problemLog.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/problems.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitorSources.vue 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/openapi/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/device.js
@@ -9,7 +9,12 @@
// 同步
export function syncDevices (data) {
  return request.post('/business/erpsync/syncDevices', data)
  return request.post('/business/hksync/syncDevices', data)
}
// 获取门禁集合-提供给门禁组
export function getList (data) {
  return request.post('/business/device/getList', data)
}
// 修改
admin/src/api/business/deviceRole.js
@@ -17,6 +17,16 @@
  return request.post('/business/deviceRole/updateById', data)
}
// 根据ID修改默认门禁组状态
export function updateStatusById (data) {
  return request.post('/business/deviceRole/updateStatusById', data)
}
// 【海康】全量同步访客权限组接口
export function syncPrivilege (data) {
  return request.post('/business/hksync/syncPrivilege', data)
}
// 删除
export function deleteById (id) {
  return request.get(`/business/deviceRole/delete/${id}`)
admin/src/api/system/common.js
@@ -26,3 +26,23 @@
    autoLogin: false
  })
}
// 访客来访配置
export function getVisitConfigDTO () {
  return request.get('/system/dictData/getVisitConfigDTO')
}
// 劳务来访配置
export function getLaborConfigDTO () {
  return request.get('/system/dictData/getLaborConfigDTO')
}
// 修改访客来访配置
export function updateVisitConfig (data) {
  return request.post('/system/dictData/updateVisitConfig', data)
}
// 修改劳务来访配置
export function updateLaborConfigDTO (data) {
  return request.post('/system/dictData/updateLaborConfigDTO', data)
}
admin/src/components/business/OperaDeviceRoleFWindow.vue
@@ -9,10 +9,10 @@
            <el-form-item label="门禁组名称" prop="name">
                <el-input v-model="form.name" placeholder="请输入门禁组名称" v-trim/>
            </el-form-item>
            <el-form-item label="授权门禁" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">访客</el-radio>
                    <el-radio :label="6">劳务人员</el-radio>
            <el-form-item label="适用用户" prop="type">
                <el-radio-group v-model="form.type">
                    <el-radio label="0">劳务访客</el-radio>
                    <el-radio label="1">普通访客</el-radio>
                </el-radio-group>
            </el-form-item>
        </el-form>
@@ -32,7 +32,7 @@
      form: {
        id: null,
        name: '',
        doorIds: ''
        type: ''
      },
      // 验证规则
      rules: {
admin/src/components/business/OperaDeviceRoleWindow.vue
@@ -6,27 +6,25 @@
        @confirm="confirm"
    >
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="名称" prop="name">
            <el-form-item label="门禁组名称" prop="name">
                <el-input v-model="form.name" placeholder="请输入名称" v-trim/>
            </el-form-item>
            <el-form-item label="是否默认" prop="isDefault">
            <el-form-item label="默认门禁组" prop="isDefault">
                <el-switch
                    v-model="form.isDefault"
                    active-color="#13ce66"
                    inactive-color="#ff4949"
                    :active-value="1"
                    :inactive-value="0">
                    :active-value="0"
                    :inactive-value="1">
                </el-switch>
            </el-form-item>
            <el-form-item label="授权门禁" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">全部门禁</el-radio>
                    <el-radio :label="6">部分门禁</el-radio>
                <el-radio-group v-model="form.radio" @input="changeRadio">
                    <el-radio :label="0">全部门禁</el-radio>
                    <el-radio :label="1">部分门禁</el-radio>
                </el-radio-group>
                <el-checkbox-group v-model="form.doorIds">
                    <el-checkbox label="门禁A"></el-checkbox>
                    <el-checkbox label="门禁B"></el-checkbox>
                    <el-checkbox label="门禁C"></el-checkbox>
                <el-checkbox-group v-model="form.doorIds" v-if="form.radio === 1">
                    <el-checkbox :label="item.id" v-for="(item, index) in device" :key="index">{{item.name}}</el-checkbox>
                </el-checkbox-group>
            </el-form-item>
        </el-form>
@@ -36,21 +34,39 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { getList } from '@/api/business/device'
export default {
  name: 'OperaDeviceRoleWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    var validatePass = (rule, value, callback) => {
      if (this.form.radio === 1) {
        if (value.length === 0) {
          callback(new Error('请选择门禁设备'))
        }
      }
      callback()
    }
    return {
      // 表单数据
      form: {
        id: null,
        name: '',
        isDefault: '',
        doorIds: ''
        isDefault: 1,
        doorIds: [],
        status: 1,
        radio: 0
      },
      device: [],
      // 验证规则
      rules: {
        name: [
          { required: true, message: '请输入门禁组名称' }
        ],
        doorIds: [
          { validator: validatePass, trigger: 'blur' }
        ]
      }
    }
  },
@@ -59,6 +75,104 @@
      api: '/business/deviceRole',
      'field.id': 'id'
    })
  },
  methods: {
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        // 调用新建接口
        this.isWorking = true
        if (this.form.id == null || this.form.id === '') {
          const doorNames = []
          this.form.doorIds.forEach(item => {
            this.device.forEach(row => {
              if (item === row.id) {
                doorNames.push(row.name)
              }
            })
          })
          this.api.create({
            name: this.form.name,
            status: this.form.status,
            doorNames: doorNames.join(','),
            type: 2,
            isDefault: this.form.isDefault,
            doorIds: this.form.doorIds.join(',')
          })
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('新建成功')
              this.$emit('success')
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking = false
            })
        } else {
          const doorNames = []
          this.form.doorIds.forEach(item => {
            this.device.forEach(row => {
              if (item === row.id) {
                doorNames.push(row.name)
              }
            })
          })
          this.api.updateById({
            id: this.form.id,
            name: this.form.name,
            status: this.form.status,
            isDefault: this.form.isDefault,
            type: 2,
            doorNames: doorNames.join(','),
            doorIds: this.form.doorIds.join(',')
          })
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('修改成功')
              this.$emit('success')
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking = false
            })
        }
      })
    },
    // 获取设备
    getLists () {
      getList({})
        .then(res => {
          this.device = res
        })
    },
    changeRadio (e) {
      this.form.doorIds = []
    },
    open (title, target) {
      this.getLists()
      this.title = title
      this.visible = true
      // 新建
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // 编辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
      })
    }
  }
}
</script>
admin/src/components/business/OperaProblemsWindow.vue
@@ -1,50 +1,63 @@
<template>
    <GlobalWindow
            :title="title"
            :visible.sync="visible"
            :confirm-working="isWorking"
            @confirm="confirm"
        :title="title"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="题目" prop="title">
                <el-input v-model="form.title" placeholder="请输入题目" v-trim/>
            </el-form-item>
            <el-form-item label="题目类型" prop="type">
                <el-select v-model="form.type" placeholder="请选择">
                    <el-option label="判断" value="0"></el-option>
                    <el-option label="单选" value="1"></el-option>
                    <el-option label="多选" value="2"></el-option>
                <el-select v-model="form.type" @change="changeType" placeholder="请选择">
                    <el-option label="判断" :value="0"></el-option>
                    <el-option label="单选" :value="1"></el-option>
                    <el-option label="多选" :value="2"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="适用用户" prop="useType">
                <el-radio-group v-model="form.useType">
                    <el-radio :label="0">劳务人员</el-radio>
                    <el-radio :label="1">普通访客</el-radio>
                    <el-radio :label="0">访客和劳务</el-radio>
                    <el-radio :label="1">仅访客</el-radio>
                    <el-radio :label="2">仅劳务</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="题目顺序(升序)" prop="sortnu">
                <el-input v-model="form.sortnu" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="选项集合" prop="options" v-if="form.type === '1' || form.type === '2'">
            <el-form-item label="选项集合" prop="objectList" v-if="form.type === 1 || form.type === 2">
                <el-button type="primary" style="width: 120px; margin-bottom: 15px;" @click="add" icon="el-icon-plus">添加选项</el-button>
                <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
                    <el-tab-pane
                        v-for="item in problems"
                        :key="item.name"
                        :label="item.name"
                        v-for="item in form.objectList"
                        :key="item.code"
                        :label="item.sort"
                        :name="item.id"
                    >
                        <el-input v-model="item.val" placeholder="请输入" v-trim/>
                        <el-input v-model="item.value" placeholder="请输入" v-trim/>
                    </el-tab-pane>
                </el-tabs>
            </el-form-item>
            <el-form-item label="正确答案" prop="answer">
                <el-select v-model="form.answer" multiple placeholder="请选择正确答案">
                <el-select v-model="form.answer" v-if="form.type === 0" placeholder="请选择正确答案">
                    <el-option label="正确" value="正确"></el-option>
                    <el-option label="错误" value="错误"></el-option>
                </el-select>
                <el-select v-model="form.answer" v-if="form.type === 1" placeholder="请选择正确答案">
                    <el-option
                        v-for="item in problems"
                        v-for="item in form.objectList"
                        :key="item.id"
                        :label="item.name"
                        :value="item.id">
                        :label="item.sort"
                        :value="item.code">
                    </el-option>
                </el-select>
                <el-select v-model="form.answer" v-if="form.type === 2" multiple placeholder="请选择正确答案">
                    <el-option
                    v-for="item in form.objectList"
                    :key="item.id"
                    :label="item.sort"
                    :value="item.code">
                    </el-option>
                </el-select>
            </el-form-item>
@@ -65,19 +78,30 @@
      form: {
        id: null,
        title: '',
        options: '',
        objectList: [
          { code: 'A', value: '', sort: '选项A', id: '0' }
        ],
        answer: '',
        sortnu: '',
        type: '',
        useType: ''
        type: 0,
        useType: 0
      },
      // 验证规则
      rules: {
        title: [
          { required: true, message: '请输入题目名称' }
        ],
        type: [
          { required: true, message: '请选择题目类型' }
        ],
        useType: [
          { required: true, message: '请选择适用用户' }
        ],
        answer: [
          { required: true, message: '请选择正确答案' }
        ]
      },
      editableTabsValue: '0',
      problems: [
        { name: '选择A', val: '', id: '0' }
      ],
      arr: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    }
  },
@@ -88,19 +112,106 @@
    })
  },
  methods: {
    open (title, target) {
      this.title = title
      this.editableTabsValue = '0'
      this.visible = true
      // 新建
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // 编辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
      })
    },
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        // 调用新建接口
        this.isWorking = true
        if (this.form.id == null || this.form.id === '') {
          this.api.create({
            // eslint-disable-next-line valid-typeof
            answer: typeof this.form.answer === 'object' ? this.form.answer.join(',') : this.form.answer,
            title: this.form.title,
            sortnu: this.form.sortnu,
            type: this.form.type,
            useType: this.form.useType,
            objectList: this.form.objectList
          })
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('新建成功')
              this.$emit('success')
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking = false
            })
        } else {
          this.api.updateById({
            id: this.form.id,
            // eslint-disable-next-line valid-typeof
            answer: typeof this.form.answer === 'object' ? this.form.answer.join(',') : this.form.answer,
            title: this.form.title,
            sortnu: this.form.sortnu,
            type: this.form.type,
            useType: this.form.useType,
            objectList: this.form.objectList
          })
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('修改成功')
              this.$emit('success')
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking = false
            })
        }
      })
    },
    changeType (e) {
      this.editableTabsValue = '0'
      this.form.objectList = [
        { code: 'A', value: '', sort: '选项A', id: '0' }
      ]
      this.$nextTick(() => {
        if (e === '0' || e === '1') {
          this.form.answer = ''
        } else {
          this.form.answer = []
        }
      })
      this.$forceUpdate()
    },
    removeTab (e) {
      this.problems.splice(e, 1)
      this.form.objectList.splice(e, 1)
      if (e === this.editableTabsValue) {
        this.editableTabsValue = '0'
      }
      this.problems.forEach((item, index) => {
        item.name = '选项' + this.arr[index]
      this.form.objectList.forEach((item, index) => {
        item.code = this.arr[index]
        item.sort = '选项' + this.arr[index]
        item.id = index.toString()
      })
    },
    add () {
      const name = '选项' + this.arr[this.problems.length]
      this.problems.push({ name, val: '', id: this.problems.length.toString() })
      const sort = '选项' + this.arr[this.form.objectList.length]
      this.form.objectList.push({ sort, value: '', code: this.arr[this.form.objectList.length], id: this.form.objectList.length.toString() })
    }
  }
}
admin/src/views/business/device.vue
@@ -37,16 +37,16 @@
                        <span v-if="row.status === 1">启用</span>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:device:update'])"
                    label="操作"
                    min-width="120"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.operaDeviceWindow.open('编辑设备信息表', row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
                    </template>
                </el-table-column>
<!--                <el-table-column-->
<!--                    v-if="containPermissions(['business:device:update'])"-->
<!--                    label="操作"-->
<!--                    min-width="120"-->
<!--                    fixed="right"-->
<!--                >-->
<!--                    <template slot-scope="{row}">-->
<!--                        <el-button type="text" @click="$refs.operaDeviceWindow.open('编辑设备信息表', row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>-->
<!--                    </template>-->
<!--                </el-table-column>-->
            </el-table>
            <pagination
                @size-change="handleSizeChange"
admin/src/views/business/deviceRole.vue
@@ -1,5 +1,5 @@
<template>
    <TableLayout :permissions="['business:company:query']">
    <TableLayout :permissions="['business:devicerole:query']">
        <!-- 搜索表单 -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="门禁组名称" prop="name">
@@ -12,9 +12,9 @@
        </el-form>
        <!-- 表格和分页 -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']">
                <li><el-button type="primary" @click="$refs.operaDeviceRoleWindow.open('新建门禁角色信息表')" icon="el-icon-plus" v-permissions="['business:company:create']">新建</el-button></li>
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:company:delete']">删除</el-button></li>
            <ul class="toolbar" v-permissions="['business:devicerole:create', 'business:devicerole:delete']">
                <li><el-button type="primary" @click="$refs.operaDeviceRoleWindow.open('新建门禁角色')" icon="el-icon-plus" v-permissions="['business:devicerole:create']">新建</el-button></li>
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:devicerole:delete']">删除</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
@@ -24,27 +24,28 @@
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="门禁组名称" min-width="100px"></el-table-column>
                <el-table-column prop="name" label="使用人数" min-width="100px"></el-table-column>
                <el-table-column prop="memberNum" label="使用人数" min-width="100px"></el-table-column>
                <el-table-column prop="isDefault" label="是否默认" min-width="100px">
                    <template slot-scope="{row}">
                        <el-switch
                            @change="changeIsDefault"
                            v-model="row.isDefault"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
                            :active-value="1"
                            :inactive-value="0">
                            :active-value="0"
                            :inactive-value="1">
                        </el-switch>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
                    v-if="containPermissions(['business:devicerole:update', 'business:devicerole:delete'])"
                    label="操作"
                    min-width="120"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('编辑门禁角色信息表', row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">删除</el-button>
                        <el-button type="text" @click="edit(row)" icon="el-icon-edit" v-permissions="['business:devicerole:update']">编辑</el-button>
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:devicerole:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -65,6 +66,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDeviceRoleWindow from '@/components/business/OperaDeviceRoleWindow'
import { updateStatusById } from '@/api/business/deviceRole'
export default {
  name: 'DeviceRole',
  extends: BaseTable,
@@ -74,18 +76,38 @@
      // 搜索
      searchForm: {
        name: '',
        isdeleted: 0,
        type: '2'
      }
    }
  },
  created () {
    this.config({
      module: '门禁角色信息表',
      module: '门禁角色',
      api: '/business/deviceRole',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    changeIsDefault (r) {
      updateStatusById({ isDefault: r, type: 2 })
        .finally(() => {
          this.search()
        })
    },
    edit (row) {
      if (row.doorIds) {
        row.radio = 1
        row.doorIds = row.doorIds.split(',')
        row.doorIds = row.doorIds.map(item => Number(item))
      } else {
        row.radio = 0
        row.doorIds = []
      }
      this.$refs.operaDeviceRoleWindow.open('编辑门禁角色', row)
    }
  }
}
</script>
admin/src/views/business/deviceRole_f.vue
@@ -1,5 +1,5 @@
<template>
    <TableLayout :permissions="['business:company:query']">
    <TableLayout :permissions="['business:devicerole:query']">
        <!-- 搜索表单 -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="门禁组名称" prop="name">
@@ -13,32 +13,38 @@
        <!-- 表格和分页 -->
        <template v-slot:table-wrap>
            <ul class="toolbar">
                <li><el-button type="primary">同步</el-button></li>
                <li><el-button type="primary" @click="synchronousData">同步</el-button></li>
            </ul>
            <el-table
                    v-loading="isWorking.search"
                    :data="tableData.list"
                    stripe
                    @selection-change="handleSelectionChange"
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="门禁组名称" min-width="100px"></el-table-column>
                <el-table-column prop="name" label="适用用户类型" min-width="100px"></el-table-column>
                <el-table-column prop="name" label="使用人数" min-width="100px"></el-table-column>
                <el-table-column label="适用用户类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.type === '0'">劳务访客</span>
                        <span v-if="row.type === '1'">普通访客</span>
                        <span v-if="row.type === '2'">内部人员</span>
                    </template>
                </el-table-column>
                <el-table-column prop="memberNum" label="使用人数" min-width="100px"></el-table-column>
                <el-table-column prop="isDefault" label="是否默认" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.isDefault === 1">是</span>
                        <span v-if="row.isDefault === 0">否</span>
                        <span v-if="row.isDefault === 0">是</span>
                        <span v-if="row.isDefault === 1">否</span>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
                    v-if="containPermissions(['business:devicerole:update'])"
                    label="操作"
                    min-width="120"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('编辑门禁角色信息表', row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('编辑门禁角色信息表', row)" icon="el-icon-edit" v-permissions="['business:devicerole:update']">编辑</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -59,6 +65,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDeviceRoleWindow from '@/components/business/OperaDeviceRoleFWindow'
import { syncPrivilege } from '@/api/business/deviceRole'
export default {
  name: 'DeviceRole',
  extends: BaseTable,
@@ -68,7 +75,7 @@
      // 搜索
      searchForm: {
        name: '',
        type: '1'
        type: '0,1'
      }
    }
  },
@@ -80,6 +87,23 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    synchronousData () {
      this.$confirm('确认同步吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        syncPrivilege({})
          .then(res => {
            this.$message({ type: 'success', message: '同步成功' })
            this.search()
          })
      }).catch(() => {
      })
    }
  }
}
</script>
admin/src/views/business/laborSource.vue
@@ -1,58 +1,99 @@
<template>
    <div class="box">
        <el-form :model="form" ref="form" label-width="140px">
            <el-form-item label="来访预约方式:" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">预约免登记</el-radio>
                    <el-radio :label="6">预约后登记(需要配备访客机)</el-radio>
            <el-form-item label="来访预约方式:" prop="reservationWay">
                <el-radio-group v-model="form.reservationWay">
                    <el-radio :label="0">预约免登记</el-radio>
                    <el-radio :label="1">预约后登记(需要配备访客机)</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="被访人校验方式:" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">仅手机号</el-radio>
                    <el-radio :label="6">手机号&姓名</el-radio>
            <el-form-item label="被访人校验方式:" prop="checkVisit">
                <el-radio-group v-model="form.checkVisit">
                    <el-radio :label="0">仅手机号</el-radio>
                    <el-radio :label="1">手机号&姓名</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="健康证是否必填:" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">否</el-radio>
                    <el-radio :label="6">是</el-radio>
            <el-form-item label="健康证是否必填:" prop="healthCard">
                <el-radio-group v-model="form.healthCard">
                    <el-radio :label="0">否</el-radio>
                    <el-radio :label="1">是</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="访客是否答题:" prop="doorIds">
            <el-form-item label="访客是否答题:" prop="isAnswer">
                <el-switch
                        v-model="form.doorIds"
                        active-color="#13ce66"
                        inactive-color="#ff4949"
                        :active-value="1"
                        :inactive-value="0">
                    v-model="form.isAnswer"
                    active-color="#13ce66"
                    inactive-color="#ff4949"
                    :active-value="1"
                    :inactive-value="0">
                </el-switch>
            </el-form-item>
            <el-form-item label="访客答题主题:" prop="doorIds">
                <el-input style="width: 50%;" v-model="form.doorIds" placeholder="请输入答题标题" v-trim/>
            <el-form-item label="访客答题主题:" prop="theme">
                <el-input style="width: 50%;" v-model="form.theme" placeholder="请输入答题标题" v-trim/>
            </el-form-item>
            <el-form-item label="访客答题说明:" prop="doorIds">
                <el-input style="width: 50%;" type="textarea" v-model="form.doorIds" placeholder="请输入" v-trim/>
            <el-form-item label="访客答题说明:" prop="description">
                <el-input style="width: 50%;" type="textarea" v-model="form.description" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item>
                <el-button type="primary">保存配置项</el-button>
                <el-button type="primary" @click="submit">保存配置项</el-button>
            </el-form-item>
        </el-form>
    </div>
</template>
<script>
  export default {
    name: 'visitorSources',
import { getLaborConfigDTO, updateLaborConfigDTO } from '@/api/system/common'
export default {
  name: 'visitorSources',
    data() {
      return {
        form: {
          doorIds: ''
        }
  data () {
    return {
      form: {
        id: null,
        checkVisit: 0,
        reservationWay: 0,
        healthCard: 0,
        isAnswer: 0,
        theme: '',
        description: ''
      }
    }
  },
  created () {
    this.getData()
  },
  methods: {
    getData () {
      getLaborConfigDTO({})
        .then(res => {
          this.form.id = res.id
          this.form.checkVisit = res.LaborConfigParam.checkVisit
          this.form.description = res.description
          this.form.healthCard = res.LaborConfigParam.healthCard
          this.form.isAnswer = res.LaborConfigParam.isAnswer
          this.form.reservationWay = res.LaborConfigParam.reservationWay
          this.form.theme = res.theme
        })
    },
    submit () {
      updateLaborConfigDTO({
        LaborConfigParam: {
          isAnswer: this.form.isAnswer,
          healthCard: this.form.healthCard,
          checkVisit: this.form.checkVisit,
          reservationWay: this.form.reservationWay
        },
        description: this.form.description,
        theme: this.form.theme
      }).then(res => {
        this.$message.success('保存成功')
        this.getData()
      })
    }
  }
}
</script>
<style lang="scss" scoped>
admin/src/views/business/problemLog.vue
@@ -8,14 +8,11 @@
            <el-form-item label="公司名称" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="人员类型" prop="companyId">
                <el-select v-model="searchForm.code" placeholder="请选择">
                    <el-option
                        v-for="item in options"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value">
                    </el-option>
            <el-form-item label="人员类型" prop="type">
                <el-select v-model="searchForm.type" placeholder="请选择">
                    <el-option label="劳务访客" value="0"></el-option>
                    <el-option label="普通访客" value="1"></el-option>
                    <el-option label="内部人员" value="2"></el-option>
                </el-select>
            </el-form-item>
            <section>
@@ -36,7 +33,13 @@
                <el-table-column prop="name" label="答题人" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="联系电话" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="公司名称" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="用户类型" min-width="100px"></el-table-column>
                <el-table-column label="用户类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.type === 0">劳务访客</span>
                        <span v-if="row.type === 1">普通访客</span>
                        <span v-if="row.type === 2">内部人员</span>
                    </template>
                </el-table-column>
                <el-table-column prop="createDate" label="答题时间" min-width="100px"></el-table-column>
            </el-table>
            <pagination
@@ -62,7 +65,8 @@
      // 搜索
      searchForm: {
        name: '',
        companyName: ''
        companyName: '',
        type: ''
      },
      options: []
    }
admin/src/views/business/problems.vue
@@ -1,5 +1,5 @@
<template>
    <TableLayout :permissions="['business:company:query']">
    <TableLayout :permissions="['business:problems:query']">
        <!-- 搜索表单 -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="题目名称" prop="title">
@@ -7,8 +7,9 @@
            </el-form-item>
            <el-form-item label="人员类型" prop="useType">
                <el-select v-model="searchForm.useType" placeholder="请选择" @keypress.enter.native="search">
                    <el-option label="劳务人员" value="0"></el-option>
                    <el-option label="普通访客" value="1"></el-option>
                    <el-option label="访客和劳务" value="0"></el-option>
                    <el-option label="仅访客" value="1"></el-option>
                    <el-option label="仅劳务" value="2"></el-option>
                </el-select>
            </el-form-item>
            <section>
@@ -18,30 +19,32 @@
        </el-form>
        <!-- 表格和分页 -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:company:create']">
                <li><el-button type="primary" @click="$refs.operaProblemsWindow.open('新建试题信息表')" icon="el-icon-plus" v-permissions="['business:company:create']">新建</el-button></li>
            <ul class="toolbar" v-permissions="['business:problems:create']">
                <li><el-button type="primary" @click="$refs.operaProblemsWindow.open('新建试题信息表')" icon="el-icon-plus" v-permissions="['business:problems:create']">新建</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column prop="title" label="题目名称" min-width="100px"></el-table-column>
                <el-table-column prop="title" label="题目名称" min-width="150px"></el-table-column>
                <el-table-column prop="useType" label="适用人员类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.useType === 0">劳务人员</span>
                        <span v-if="row.useType === 1">普通访客</span>
                        <span v-if="row.useType === 0">访客和劳务</span>
                        <span v-if="row.useType === 1">仅访客</span>
                        <span v-if="row.useType === 2">仅劳务</span>
                    </template>
                </el-table-column>
                <el-table-column prop="type" label="题目类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.useType === 0">单选</span>
                        <span v-if="row.useType === 1">多选</span>
                        <span v-if="row.type === 0">判断</span>
                        <span v-if="row.type === 1">单选</span>
                        <span v-if="row.type === 2">多选</span>
                    </template>
                </el-table-column>
                <el-table-column prop="sortnu" label="题目顺序(升序)" min-width="100px"></el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
                <el-table-column prop="creatorName" label="创建人" min-width="100px"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
                    label="操作"
@@ -49,7 +52,7 @@
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.operaProblemsWindow.open('编辑试题信息表', row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
                        <el-button type="text" @click="edit(row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">删除</el-button>
                    </template>
                </el-table-column>
@@ -92,6 +95,23 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    edit (row) {
      if (row.objectList && row.objectList.length > 0) {
        row.objectList = row.objectList.map((item, index) => {
          return {
            code: item.code,
            value: item.value,
            sort: '选项' + item.code,
            id: index.toString()
          }
        })
      } else {
        row.objectList = []
      }
      this.$refs.operaProblemsWindow.open('编辑试题信息', row)
    }
  }
}
</script>
admin/src/views/business/visitorSources.vue
@@ -1,56 +1,97 @@
<template>
    <div class="box">
        <el-form :model="form" ref="form" label-width="140px">
            <el-form-item label="来访预约方式:" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">预约免登记</el-radio>
                    <el-radio :label="6">预约后登记(需要配备访客机)</el-radio>
            <el-form-item label="来访预约方式:" prop="reservationWay">
                <el-radio-group v-model="form.reservationWay">
                    <el-radio :label="0">预约免登记</el-radio>
                    <el-radio :label="1">预约后登记(需要配备访客机)</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="被访人校验方式:" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">仅手机号</el-radio>
                    <el-radio :label="6">手机号&姓名</el-radio>
            <el-form-item label="被访人校验方式:" prop="checkVisit">
                <el-radio-group v-model="form.checkVisit">
                    <el-radio :label="0">仅手机号</el-radio>
                    <el-radio :label="1">手机号&姓名</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="健康证是否必填:" prop="doorIds">
                <el-radio-group v-model="form.doorIds">
                    <el-radio :label="3">否</el-radio>
                    <el-radio :label="6">是</el-radio>
            <el-form-item label="健康证是否必填:" prop="healthCard">
                <el-radio-group v-model="form.healthCard">
                    <el-radio :label="0">否</el-radio>
                    <el-radio :label="1">是</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="访客是否答题:" prop="doorIds">
            <el-form-item label="访客是否答题:" prop="isAnswer">
                <el-switch
                    v-model="form.doorIds"
                    v-model="form.isAnswer"
                    active-color="#13ce66"
                    inactive-color="#ff4949"
                    :active-value="1"
                    :inactive-value="0">
                </el-switch>
            </el-form-item>
            <el-form-item label="访客答题主题:" prop="doorIds">
                <el-input style="width: 50%;" v-model="form.doorIds" placeholder="请输入答题标题" v-trim/>
            <el-form-item label="访客答题主题:" prop="theme">
                <el-input style="width: 50%;" v-model="form.theme" placeholder="请输入答题标题" v-trim/>
            </el-form-item>
            <el-form-item label="访客答题说明:" prop="doorIds">
                <el-input style="width: 50%;" type="textarea" v-model="form.doorIds" placeholder="请输入" v-trim/>
            <el-form-item label="访客答题说明:" prop="description">
                <el-input style="width: 50%;" type="textarea" v-model="form.description" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item>
                <el-button type="primary">保存配置项</el-button>
                <el-button type="primary" @click="submit">保存配置项</el-button>
            </el-form-item>
        </el-form>
    </div>
</template>
<script>
import { getVisitConfigDTO, updateVisitConfig } from '@/api/system/common'
export default {
  name: 'visitorSources',
  data() {
  data () {
    return {
      form: {
        doorIds: ''
        id: null,
        checkVisit: 0,
        reservationWay: 0,
        healthCard: 0,
        isAnswer: 0,
        theme: '',
        description: ''
      }
    }
  },
  created () {
    this.getData()
  },
  methods: {
    getData () {
      getVisitConfigDTO({})
        .then(res => {
          this.form.id = res.id
          this.form.checkVisit = res.VisitConfigParam.checkVisit
          this.form.description = res.description
          this.form.healthCard = res.VisitConfigParam.healthCard
          this.form.isAnswer = res.VisitConfigParam.isAnswer
          this.form.reservationWay = res.VisitConfigParam.reservationWay
          this.form.theme = res.theme
        })
    },
    submit () {
      updateVisitConfig({
        VisitConfigParam: {
          isAnswer: this.form.isAnswer,
          healthCard: this.form.healthCard,
          checkVisit: this.form.checkVisit,
          reservationWay: this.form.reservationWay
        },
        description: this.form.description,
        theme: this.form.theme
      }).then(res => {
        this.$message.success('保存成功')
        this.getData()
      })
    }
  }
}
</script>
admin/vue.config.js
@@ -14,7 +14,7 @@
        // 192.168.0.110:10013  192.168.0.110:10013
        // http://192.168.0.101:10013
        // http://192.168.0.132:10013
        target: 'http://192.168.0.108:10013',
        target: 'http://192.168.0.132:10013',
        changeOrigin: true,
        pathRewrite: {
          [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''
server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java
@@ -2,9 +2,13 @@
import com.doumee.api.BaseController;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.erp.model.openapi.request.erp.OrgListRequest;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.erp.model.openapi.request.erp.UserListRequest;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.model.ApiResponse;
import com.doumee.service.business.ERPSyncService;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncPrivilegeServiceImpl;
@@ -25,36 +29,23 @@
@RestController
@RequestMapping("/business/erpsync")
public class ERPSyncController extends BaseController {
    @Autowired
    private HkSyncDeviceServiceImpl hkSyncDeviceService;
    @Autowired
    private HkSyncParkServiceImpl hkSyncParkService;
    @Autowired
    private HkSyncPrivilegeServiceImpl hkSyncPrivilegeService;
    private ERPSyncService erpSyncService;
    @PreventRepeat
    @ApiOperation("【ERP】全量同步门禁设备接口")
    @PostMapping("/syncDevices")
    //@RequiresPermissions("business:erpsync:device")
    public ApiResponse getDevices(@RequestBody AcsDeviceListRequest param) {
        String result = hkSyncDeviceService.syncHkDevices(param);
    @ApiOperation("【ERP】全量同步ERP组织接口")
    @PostMapping("/getCompanies")
    //@RequiresPermissions("business:erpsync:company")
    public ApiResponse getCompanies(@RequestBody OrgListRequest param) {
        String result = erpSyncService.syncCompany(param);
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】全量同步停车库接口")
    @PostMapping("/getParks")
//    @RequiresPermissions("business:hksync:park")
    public ApiResponse getParks(@RequestBody ParkListRequest param) {
        String result = hkSyncParkService.syncHkParks(param);
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】全量同步停车库接口")
    @PostMapping("/getPrivilege")
//    @RequiresPermissions("business:hksync:privilege")
    public ApiResponse getPrivilege(@RequestBody ParkListRequest param) {
        String result = hkSyncPrivilegeService.syncHkParks(param);
    @ApiOperation("【ERP】全量同步ERP人员接口")
    @PostMapping("/getUsers")
//    @RequiresPermissions("business:erpsync:users")
    public ApiResponse getUsers(@RequestBody UserListRequest param) {
        String result = erpSyncService.syncUsers(param);
        return ApiResponse.success(result);
    }
}
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -90,9 +90,14 @@
    @ApiOperation("人员移除/解冻")
    @PostMapping("/updateRemoveStatusById")
    @RequiresPermissions("business:member:update")
    public ApiResponse updateRemoveStatusById(@RequestParam List<Member> list){
        memberService.updateRemoveStatusById(list);
        return ApiResponse.success(null);
    public ApiResponse updateRemoveStatusById(@RequestBody List<Member> list){
        if(list.size()>0){
            memberService.updateRemoveStatusById(list);
            return ApiResponse.success(null);
        }else{
            return ApiResponse.failed("参数错误");
        }
    }
    @ApiOperation("人员拉黑/冻结")
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -90,7 +90,7 @@
    @ApiOperation("滞留人员")
    @PostMapping("/retentionPage")
  //  @RequiresPermissions("business:visits:query")
    @RequiresPermissions("business:visits:query")
    public ApiResponse<PageData<Visits>> retentionPage (@RequestBody PageWrap<Visits> pageWrap) {
        return ApiResponse.success(visitsService.retentionPage(pageWrap));
    }
server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java
@@ -113,10 +113,12 @@
    @ApiOperation("分页查询系统用户")
    @ApiOperation("查询所有系统用户")
    @PostMapping("/findAllList")
    @RequiresPermissions("system:user:query")
    public ApiResponse<PageData<SystemUser>> findAllList (@RequestBody PageWrap<SystemUser> pageWrap) {
    public ApiResponse<List<SystemUser>> findAllList (@RequestBody SystemUser pageWrap) {
        return ApiResponse.success(systemUserService.findAllList(pageWrap));
    }
server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
@@ -2,12 +2,14 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.EventSubRequest;
import com.doumee.core.haikang.model.param.respose.OrgListResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.InterfaceLogService;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import org.apache.commons.lang3.StringUtils;
@@ -27,6 +29,8 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private InterfaceLogService interfaceLogService;
    @PostConstruct
    public  int  initHkConfig(){
@@ -36,6 +40,7 @@
            ArtemisConfig.appSecret = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPSECRET).getCode();
            HKConstants.https = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_HTTPS).getCode();
        }
        HKTools.interfaceLogService=interfaceLogService;
        //获取根组织编码
        getRootOrgCode();
        //开始订阅门禁事件、访客事件、和停车场事件
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -1,6 +1,7 @@
package com.doumee.task;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncOrgUserServiceImpl;
@@ -29,6 +30,8 @@
    private HkSyncOrgUserServiceImpl hkSyncOrgUserService;
    @Autowired
    private HkSyncVisitServiceImpl hkSyncVisitService;
    @Autowired
    private MemberService memberService;
    /**
     * 是否开发者
     */
@@ -102,4 +105,12 @@
    }
    /**
     * 定时冻结内部人员
     */
    @Scheduled(fixedDelay= 60*1000)
    public void memberFreeze()  {
        memberService.memberFreeze();
    }
}
server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java
@@ -10,9 +10,14 @@
import com.doumee.core.erp.model.openapi.response.erp.ERPApiResponse;
import com.doumee.core.erp.model.openapi.response.erp.ErpOrgListResponse;
import com.doumee.core.erp.model.openapi.response.erp.ErpUserListResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.model.Member;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ErpTool {
@@ -23,17 +28,32 @@
     * @return
     */
    public static List<ErpOrgListResponse> getErpOrgList(String url, OrgListRequest param){
        String result = HttpsUtil.postJson(url, JSONObject.toJSONString(param));
        if(StringUtils.isNotBlank(result)){
            TypeReference typeReference =
                    new TypeReference<ERPApiResponse<List<ErpOrgListResponse>>>(){};
            ERPApiResponse<List<ErpOrgListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
            if(response!=null){
                return response.getData();
            }
        }
        return  null;
        List<ErpOrgListResponse> list = new ArrayList<>();
        int page =1;
        int pageSize  = 100;
        boolean hasLast = true;
        while (hasLast){
            hasLast = false;
            PageWrap<OrgListRequest> pageWrap  = new PageWrap<>();
            pageWrap.setModel(param);
            pageWrap.setPage(page);
            pageWrap.setCapacity(pageSize);
            String result = HttpsUtil.postJson(url, JSONObject.toJSONString(pageWrap));
            if(StringUtils.isNotBlank(result)){
                TypeReference typeReference =
                        new TypeReference<ERPApiResponse<PageData<ErpOrgListResponse>>>(){};
                ERPApiResponse<PageData<ErpOrgListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
                if(response!=null && response.getData()!=null&& response.getData().getRecords()!=null){
                    list.addAll(response.getData().getRecords());
                        if(100*pageSize < response.getData().getTotal() ){
                            hasLast =true;//还有下一页
                        }
                        page++;
                    }
                }
            }
        return  list;
    }
    /**
@@ -43,16 +63,33 @@
     * @return
     */
    public static List<ErpUserListResponse> getErpUserList(String url, UserListRequest param){
        String result = HttpsUtil.postJson(url, JSONObject.toJSONString(param));
        if(StringUtils.isNotBlank(result)){
            TypeReference typeReference =
                    new TypeReference<ERPApiResponse<List<ErpUserListResponse>>>(){};
            ERPApiResponse<List<ErpUserListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
            if(response!=null){
                return response.getData();
        List<ErpUserListResponse> list = new ArrayList<>();
        int page =1;
        int pageSize  = 100;
        boolean hasLast = true;
        while (hasLast){
            hasLast = false;
            PageWrap<UserListRequest> pageWrap  = new PageWrap<>();
            pageWrap.setModel(param);
            pageWrap.setPage(page);
            pageWrap.setCapacity(pageSize);
            String result = HttpsUtil.postJson(url, JSONObject.toJSONString(pageWrap));
            if(StringUtils.isNotBlank(result)){
                TypeReference typeReference =
                        new TypeReference<ERPApiResponse<PageData<ErpUserListResponse>>>(){};
                ERPApiResponse<PageData <ErpUserListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
                if(response!=null && response.getData()!=null && response.getData().getRecords()!=null){
                    list.addAll(response.getData().getRecords());
                    if(100*pageSize < response.getData().getTotal() ){
                        hasLast =true;//还有下一页
                    }
                    page++;
                }
            }
        }
        return  null;
        return  list;
    }
    /**
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -51,9 +51,10 @@
        System.out.println(content.toString());
    }
    public static InterfaceLogService interfaceLogService = null;
    private static void saveInterfaceLog(String s, String result,Map<String, String> path) {
        InterfaceLogService bean = SpringContextUtil.getBean(InterfaceLogService.class);
        if(bean !=null){
//        InterfaceLogService bean = SpringContextUtil.getBean(InterfaceLogService.class);
        if(interfaceLogService !=null){
            InterfaceLog hkMonitoryLogDO=new InterfaceLog();
            hkMonitoryLogDO.setType(0);
            hkMonitoryLogDO.setCreateDate(new Date());
@@ -62,7 +63,7 @@
            hkMonitoryLogDO.setRepose(result);
            hkMonitoryLogDO.setName(path.get(HKConstants.https));
            hkMonitoryLogDO.setUrl(HKConstants.https + ArtemisConfig.host+path.get(HKConstants.https));
            bean.create(hkMonitoryLogDO);
            interfaceLogService.create(hkMonitoryLogDO);
        }
    }
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -80,6 +80,9 @@
    // ERP ACCESS_SECRET
    public static final String ERP_ACCESS_SECRET = "ERP_ACCESS_SECRET";
    // 内部人员冻结配置时间
    public static final String TIMEOUT_FREEZE = "TIMEOUT_FREEZE";
    // FTP文件服务器资源访问地址
    public static  Date  getBirthdyByCardNo(String idCard){
server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -4,6 +4,7 @@
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
@@ -21,7 +22,11 @@
        return connection(url, "POST", data, contentType, ignoreSSL);
    }
    public static String postJson(String url, String data) {
        return connection(url, "POST", data, "application/json", false);
        if(url.startsWith("https://")){
            return connection(url, "POST", data, "application/json", true);
        }else{
            return connectionHttp(url, "POST", data, "application/json");
        }
    }
    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
@@ -82,6 +87,49 @@
        }
        return null;
    }
    public static String connectionHttp(String url,String method,String data,String contentType ){
        HttpURLConnection connection = null;
        try {
            URL _url = new URL(url);
            connection = (HttpURLConnection) _url.openConnection();
            connection.setRequestMethod(method);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            if(contentType != null){
                connection.setRequestProperty("Content-Type", contentType);
            }
            connection.connect();
            if(data != null){
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(data.getBytes("utf-8"));
                outputStream.close();
            }
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream is = connection.getInputStream();
                byte[] b = new byte[4096];
                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
                int len;
                while ((len = is.read(b)) != -1) {
                    baos.write(b, 0, len);
                }
                is.close();
                return baos.toString("utf-8");
            }
            return connection.getResponseMessage();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        return null;
    }
    public static void main(String[] args) {
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
@@ -49,4 +49,7 @@
    @ApiModelProperty(value = " 工号员")
    private Integer code;
    @ApiModelProperty(value = "操作人员 ")
    private Integer createrId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java
@@ -118,8 +118,8 @@
    @TableField(exist = false)
    private String createrName;
    @ApiModelProperty(value = "下发状态 0待下发 1已下发 2下发成功  3已取消 4下发失败 ", example = "1")
    @ExcelColumn(name="下发状态",index= 8,valueMapping ="0=待下发;1=已下发;2=下发成功;3=已取消;4=下发失败" )
    @ApiModelProperty(value = "一卡通授权下发状态 0待下发 1任务执行 2下发成功 3已取消 4下发失败 5任务下载已结束 ", example = "1")
    @ExcelColumn(name="下发状态",index= 8,valueMapping ="0=待下发;1=已下发;2=下发成功;3=已取消;4=下发失败;5=任务下载已结束" )
    private Integer sendStatus;
    @ApiModelProperty(value = "下发类型 0实时 1定时 ", example = "1")
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -256,4 +256,8 @@
    @TableField(exist = false)
    private Integer timeOut;
    @ApiModelProperty(value = "超时状态0未超时,1已超时,2即将超时", example = "1")
    @TableField(exist = false)
    private Integer outStatus;
}
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -159,7 +159,10 @@
    PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap);
    /**
     * 定时冻结内部人员
     */
    void memberFreeze();
    /********************************************公众号接口***********************************************************************/
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -26,11 +26,11 @@
import com.doumee.dao.admin.request.LaborMemberDTO;
import com.doumee.dao.admin.request.MemberQuery;
import com.doumee.dao.admin.response.MemberInfoDTO;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.TrainTimeMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.MemberJoinMapper;
import com.doumee.dao.business.join.UserActionJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.reqeust.CheckVisitedDTO;
import com.doumee.dao.web.response.MemberVO;
@@ -45,15 +45,14 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 人员信息表Service实现
@@ -72,6 +71,17 @@
    @Autowired
    private TrainTimeMapper trainTimeMapper;
    @Autowired
    private MemberRoleMapper memberRoleMapper;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
    @Autowired
    private EmpowerMapper empowerMapper;
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -222,7 +232,7 @@
        Member update = new Member();
        update.setEditDate(new Date());
        update.setEditor(loginUserInfo.getId());
        update.setStatus(member.getStatus());
        update.setStatus(Constants.Status.FREEZE.getValue());
        update.setId(member.getId());
        memberMapper.updateById(update);
@@ -232,9 +242,12 @@
        userAction.setCreator(loginUserInfo.getId());
        if(Constants.equalsInteger(result.getType(),Constants.TWO)){
            userAction.setType(Constants.ONE);
            userAction.setRemark("由【"+loginUserInfo.getUsername()+"】于【操作时间"+new Date()+"】,进行【冻结】");
        }
        if(Constants.equalsInteger(result.getType(),Constants.ZERO)){
            userAction.setType(Constants.TWO);
            userAction.setRemark("由【"+loginUserInfo.getUsername()+"】于【操作时间"+new Date()+"】,进行【拉黑】");
        }
        userAction.setMemberId(result.getId()+"");
        userAction.setBeforeStatus(status);
@@ -253,9 +266,12 @@
            Member update = new Member();
            update.setEditDate(date);
            update.setEditor(loginUserInfo.getId());
            update.setStatus(s.getStatus());
            update.setStatus(Constants.Status.ENABLE.getValue());
            update.setId(s.getId());
            memberMapper.updateById(update);
            //解冻业务 处理用户授权导入记录
            this.thawMember(result);
            UserAction userAction=new UserAction();
            userAction.setIsdeleted(Constants.ZERO);
@@ -618,23 +634,24 @@
    @Override
    public PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap) {
        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.selectAll(Member.class)
                .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
                .select(" (select ua.CREATE_DATE from user_action ua where ua.MEMBER_ID=t.id and ua.ISDELETED=0 and ua.type=1 order by ua.CREATE_DATE limit 1) as userActionType1")
                .select(" (select su.remark from user_action uac  where uac.MEMBER_ID=t.id and uac.ISDELETED=0 and uac.type=1 order by uac.CREATE_DATE limit 1) as creatorName")
             /*   .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0) as visitsCount")*/
                .select(" (select STARTTIME from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 order by CREATE_DATE limit 1) as visitsLastDate");
                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getPhone()),Member::getPhone,pageWrap.getModel().getPhone())
                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),ms->ms.like(Member::getPhone,pageWrap.getModel().getName())
                        .or().like(Member::getName,pageWrap.getModel().getName()))
                .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName())
                .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
                .eq(Member::getStatus,Constants.Status.ENABLE)
                .eq(Member::getStatus,Constants.Status.FREEZE.getValue())
                .eq(Objects.nonNull(pageWrap.getModel().getCode()),Member::getCode,pageWrap.getModel().getCode())
                .orderByDesc(Member::getCreateDate);
@@ -644,6 +661,113 @@
    }
    /**
     * 用户解冻 添加授权导入记录
     * @param member
     */
    public void thawMember(Member member){
        //用户角色组
        List<MemberRole> memberRoleList =  memberRoleMapper.selectList(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
        if(CollectionUtils.isNotEmpty(memberRoleList)){
            List<Integer> roleIds = memberRoleList.stream().map(m->m.getId()).collect(Collectors.toList());
            //角色组设备权限
            List<DeviceRole> deviceRoleList= deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                    .eq(DeviceRole::getType,Constants.TWO)
                    .in(DeviceRole::getId,roleIds));
            if(CollectionUtils.isNotEmpty(deviceRoleList)){
                String ids = "";
                List<Integer> r = new ArrayList<>();
                for (int i = 0; i < deviceRoleList.size(); i++) {
                    DeviceRole deviceRole =deviceRoleList.get(i);
                    if(i>0){
                        ids += ",";
                    }
                    Integer id =deviceRole.getId();
                    ids += "["+id+"]";
                    String doorids =deviceRole.getDoorIds();
                    if(StringUtils.isNotBlank(doorids)){
                        String[] ss = doorids.split(",");
                        try {
                            for(String s :ss){
                                r.add(Integer.parseInt(s));
                            }
                        }catch (Exception e){
                            //脏数据不处理
                        }
                    }
                }
                if(CollectionUtils.isNotEmpty(r)){
                    List<Empower> list = new ArrayList<>();
                    List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().lambda().in(Device::getId,r));
                    if(deviceList == null || deviceList.size() == 0){
                        return;
                    }
                    for (Device deviceRole:deviceList) {
                        Empower model = new Empower();
                        model.setCreateDate(new Date());
                        model.setMemberId(member.getId());
                        model.setIsdeleted(Constants.ZERO);
                        model.setDeviceId(deviceRole.getId());
                        model.setSendStatus(Constants.ZERO);
                        model.setSendType(Constants.ZERO);
                        list.add(model);
                    }
                    //导入新增的授权信息
                    empowerMapper.insertBatchSomeColumn(list);
                }
            }
        }
    }
    /**
     * 定时冻结内部人员
     */
    @Override
    public void memberFreeze(){
        SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_FREEZE);
        if(Objects.isNull(systemDictData)||
                StringUtils.isBlank(systemDictData.getCode())
        ){
            return;
        }
        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>()
                .lambda().eq(Member::getIsdeleted,Constants.ZERO)
                .eq(Member::getType,Constants.memberType.internal)
                .isNotNull(Member::getHkId)
                .notExists(" SELECT 1 FROM device_event b WHERE b.ext_event_person_no =  HK_ID AND TO_DAYS( NOW()) - TO_DAYS( b.CREATE_DATE ) > "+systemDictData.getCode()+"  ")
        );
        if(CollectionUtils.isEmpty(memberList)){
           return;
        }
        List<Integer> memberIds = memberList.stream().map(m->m.getId()).collect(Collectors.toList());
        //冻结状态
        memberMapper.update(null,new UpdateWrapper<Member>()
                .lambda().set(Member::getStatus,Constants.TWO)
                .in(Member::getId,memberIds)
        );
        //处理下发数据
        empowerMapper.update(null,new UpdateWrapper<Empower>()
                .lambda()
                .set(Empower::getIsdeleted,Constants.ONE)
                .set(Empower::getSendStatus,Constants.ZERO)
                .set(Empower::getEditDate,new Date())
                .in(Empower::getMemberId,memberIds)
        );
    }
    /********************************************公众号接口***********************************************************************/
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -596,6 +596,7 @@
        queryWrapper.leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.ne(Member::getType,Constants.TWO);
        queryWrapper.eq(Visits::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Visits::getType,pageWrap.getModel().getType());
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Visits::getPhone,pageWrap.getModel().getName())
@@ -605,7 +606,20 @@
                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Visits::getStatus,pageWrap.getModel().getStatus());
        queryWrapper.isNull(Visits::getOutDate);
        queryWrapper.orderByDesc(Visits::getEditDate);
       String code= systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_FREEZE).getCode();
        IPage<Visits> result = visitsJoinMapper.selectJoinPage(page, Visits.class,queryWrapper);
        if(result!=null&&result.getRecords()!=null){
            result.getRecords().stream().forEach(s ->{
                if(s.getTimeOut()>=Constants.ZERO){
                    s.setOutStatus(Constants.ONE);
                }else if(s.getTimeOut()<=Integer.valueOf(code)&&s.getTimeOut()>0){
                    s.setOutStatus(Constants.TWO);
                }else{
                    s.setOutStatus(Constants.ZERO);
                }
            });
        }
        return PageData.from(result);
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -221,6 +221,7 @@
        company.setName(respone.getName());
        company.setErpId(respone.getId());
        company.setCreateDate(date);
        company.setType(Constants.ONE);
        company.setCode(respone.getCode());
        company.setErpParentId(respone.getParentOrgId());
        company.setErpDate(date);
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
@@ -186,7 +186,7 @@
        OrgDelRequest request = new OrgDelRequest();
        request.setIndexCodes( delHkIds.toArray(new String[]{}));
        BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            List<String> fIds = new ArrayList<>();
            if(result.getData()!=null){
                for(OrgUpdateFailureResponse r : result.getData()){
server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java
@@ -78,7 +78,7 @@
     */
    PageData<SystemUserListVO> findPage(PageWrap<QuerySystemUserDTO> pageWrap);
    PageData<SystemUser> findAllList(PageWrap<SystemUser> pageWrap);
    List<SystemUser> findAllList(SystemUser pageWrap);
    /**
     * 条件统计
server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
@@ -206,24 +206,24 @@
    @Override
    public PageData<SystemUser> findAllList(PageWrap<SystemUser> pageWrap) {
    public List<SystemUser> findAllList(SystemUser pageWrap) {
        IPage<SystemUser> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<SystemUser> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        Utils.MP.blankToNull(pageWrap);
        queryWrapper.selectAll(SystemUser.class);
        queryWrapper.eq(SystemUser::getDeleted, Constants.ZERO);
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getUsername()),ms->ms.like(SystemUser::getUsername,pageWrap.getModel().getUsername())
        .or().like(SystemUser::getMobile,pageWrap.getModel().getUsername())
                .or().like(SystemUser::getRealname,pageWrap.getModel().getUsername())
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getUsername()),ms->ms.like(SystemUser::getUsername,pageWrap.getUsername())
        .or().like(SystemUser::getMobile,pageWrap.getUsername())
                .or().like(SystemUser::getRealname,pageWrap.getUsername())
        );
        queryWrapper.orderByDesc(SystemUser::getCreateTime);
        IPage<SystemUser> result = systemUserJoinMapper.selectJoinPage(page, SystemUser.class, queryWrapper);
        List<SystemUser> result = systemUserJoinMapper.selectJoinList( SystemUser.class, queryWrapper);
        return PageData.from(result);
        return result;
    }
server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java
@@ -43,16 +43,18 @@
        List<ErpOrgListResponse> list = new ArrayList<>();
        String[] ids = new String[]{"","001","002","003"};
        String[] names = new String[]{"","组织1","组织2","组织3"};
        for(int i=1;i<=4;i++){
        for(int i=1;i<4;i++){
            ErpOrgListResponse r = new ErpOrgListResponse();
            r.setParentOrgId(ids[i-1]);
            r.setId(ids[i]);
            r.setCreateDate(new Date());
            r.setCode(UUID.randomUUID().toString());
            r.setCode(ids[i]);
            r.setStatus(Constants.ZERO);
            r.setName(names[i]);
            list.add(r);
        }
        IPage<ErpOrgListResponse> pageInfo = new Page<>(1,10,3);
        pageInfo.setTotal(3);
        pageInfo.setRecords(list);
        PageData<ErpOrgListResponse> r = PageData.from( pageInfo);
        return ERPApiResponse.success(r);
@@ -64,18 +66,20 @@
        String[] ids = new String[]{"","1001","1002","1003"};
        String[] names = new String[]{"","人员1","人员2","人员3"};
        String[] orgs = new String[]{"","001","002","003"};
        for(int i=1;i<=4;i++){
        for(int i=1;i<4;i++){
            ErpUserListResponse r = new ErpUserListResponse();
            r.setOrgId(orgs[i]);
            r.setId(ids[i]);
            r.setName(names[i-1]);
            r.setCode( ids[i]);
            r.setIsdeleted(Constants.ONE);
            r.setName(names[i]);
            r.setFaceImg("/20223402/"+r.getId()+".png");
            list.add(r);
        }
        IPage<ErpUserListResponse> pageInfo = new Page<>(1,10,3);
        pageInfo.setRecords(list);
        pageInfo.setTotal(3);
        PageData<ErpUserListResponse> r = PageData.from( pageInfo);
        return ERPApiResponse.success(r);
    }
server/openapi/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeemes
  profiles:
    active: test
    active: dev
  # JSON返回配置
  jackson: