jiangping
2025-04-25 1e0c8c2a1a3e67cf95a4ccc60012cc3c6dad26be
代码初始化
已添加2个文件
已修改28个文件
938 ■■■■■ 文件已修改
admin/src/api/business/category.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCategoryImportWindow.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaManagersWindow.vue 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailDbhWindow.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailDcaInfoWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailDcaWindow.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailSheWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryDcaProblem.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/managersShe.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/managersSheNotice.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/workorderDbh.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/workorderDcaChild.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/CategoryController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/constants/Constants.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Category.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Managers.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Workorder.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/CategoryDcaProblemDto.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderDbhDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderDcaChildDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/CategoryService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/ManagersServiceImpl.java 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/application.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/category.js
@@ -24,6 +24,15 @@
    download: true
  })
}
export function importDcaExcel (data) {
  return request.post('/business/category/importDcaExcel', data)
}
export function exportDcaExcel (data) {
  return request.post('/business/category/exportDcaExcel', encryptData(data), {
    trim: true,
    download: true
  })
}
// åˆ›å»º
export function create (data) {
admin/src/assets/style/style.scss
@@ -30,6 +30,19 @@
.el-transfer__buttons {
  padding: 0 16px !important;
}
.tip-warn {
  margin: 4px 0 25px 0;
  font-size: 12px;
  color: #999;
  line-height: 25px;
  i {
    color: orange;
    margin-right: 4px;
    font-size: 14px;
    position: relative;
    top: 1px;
  }
}
// dialog
.eva-dialog {
admin/src/components/business/OperaCategoryImportWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
<template>
  <el-dialog
      class="center-title"
      :title="title"
      width="55%"
      top="30vh"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <p class="tip-warn"><i class="el-icon-warning"></i>导入说明:<br>
      1.请先下载文件模板,并按照模板要去填写表格内容;<br>
      2.下载模版为当前系统已录入的全量主题观察项数据;<br>
      3.每次全量导入将覆盖更新与表格数据、层级关系不一致的数据配置项,请谨慎操作!<br>
    </p>
    <el-form class="demo-form-inline" >
      <el-form-item label="选择导入文件" required>
        <div style="width: 100%;display: flex;align-items: center;">
          <el-button type="primary"   @click="clickRef">点击上传</el-button>
          <el-button type="text" @click="exportTemplate" :loading="exporting">点击下载模版.EXCEL</el-button>
        </div>
        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
      </el-form-item>
    </el-form>
    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
    <template   v-slot:footer>
      <el-button @click="visible=false">返回</el-button>
    </template>
  </el-dialog>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import { importDcaExcel, exportDcaExcel } from '@/api/business/category'
export default {
  name: 'OperaCategoryImportWindow',
  extends: BaseOpera,
  components: {},
  data () {
    return {
      exporting: false,
      importing: false,
      fileName: ''
    }
  },
  methods: {
    open (title, companyType) {
      this.title = title
      this.fileName = ''
      this.visible = true
    },
    // å¯¼å‡ºæ¨¡æ¿
    exportTemplate () {
      this.$dialog.exportConfirm('确认导出下载模版吗?')
        .then(() => {
          this.exporting = true
          exportDcaExcel({}).then(response => {
            this.exporting = false
            this.download(response)
          })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.exporting = false
            })
        })
        .catch(() => {})
    },
    clickRef () {
      this.$refs.fileExcel.click()
    },
    result (e) {
      const data = new FormData()
      data.append('file', e.target.files[0])
      importDcaExcel(data)
        .then(res => {
          this.$message.success('导入成功')
          this.$emit('success')
          this.visible = false
        })
        .catch(err => {
          this.$message.error(err)
          this.fileName = ''
        })
        .finally(() => {
          this.$refs.fileExcel.value = null
        })
    }
  }
}
</script>
<style lang="scss" scoped>
</style>
admin/src/components/business/OperaManagersWindow.vue
@@ -6,8 +6,26 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item  label="选择负责人:" prop="memberId">
        <el-select v-model="form.memberId" filterable remote :remote-method="loadMember" :loading="loading"  placeholder="可输入姓名 | æ‰‹æœºå· | éƒ¨é—¨åç§°è¿›è¡Œæœç´¢">
      <el-form-item label="设置范围" prop="isMember" :required="true">
        <el-radio-group v-model="form.isMember">
          <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="companyId" v-if="form.isMember==0 || form.isMember==1"  :required="true">
        <treeselect
            v-model="form.companyId"
            placeholder="请选择"
            :options="companyTree"
            :normalizer="normalizeOptions"
            :default-expand-level="1"
            noChildrenText="没有子选项"
            noOptionsText="没有可选项"
            noResultsText="没有匹配的结果" />
      </el-form-item>
      <el-form-item  label="选择负责人:" prop="memberIds" v-if="form.isMember==2" :required="true">
        <el-select v-model="form.memberIds" filterable :multiple="true" :loading="loading"  placeholder="可输入姓名 | æ‰‹æœºå· | éƒ¨é—¨åç§°è¿›è¡Œæœç´¢">
          <el-option
              v-for="item in memberList"
              :key="item.id"
@@ -35,6 +53,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
import { treeList } from '@/api/business/company'
export default {
  name: 'OperaManagersWindow',
@@ -45,17 +64,27 @@
      // è¡¨å•数据
      form: {
        type: '',
        companyId: null,
        memberId: '',
        memberIds: [],
        remark: '',
        isQw: 0,
        isEmail: 0
        isEmail: 0,
        isMember: 0
      },
      companyTree: [],
      loading: false,
      memberList: [],
      // éªŒè¯è§„则
      rules: {
        memberId: [
          { required: true, message: '请选择负责人' }
        memberIds: [
          { required: true ,message: '请选择负责人' }
        ],
        companyId: [
          { required: true, message: '请选择部门' }
        ],
        isMember: [
          { required: true, message: '选择设置范围' }
        ]
      }
    }
@@ -67,10 +96,33 @@
    })
  },
  methods: {
    getfindCompanyTreePage () {
      treeList({})
        .then(res => {
          if (res && res.length > 0) {
            res[0].fsStatus = 1
            this.companyTree = res
            // this.searchForm.erpOrgId = res[0].erpId
          }
        })
    },
    // è§„范化选项数据的方法
    normalizeOptions (node) {
      if (node.childList && !node.childList.length) {
        delete node.childList
      }
      return {
        id: node.id,
        label: node.name,
        children: node.childList
      }
    },
    loadMember (query) {
      this.memberList = []
      console.log(query)
      if (!query || query == '') {
        return
        // return
      }
      this.loading = true
      allList({
@@ -95,7 +147,8 @@
        this.form[this.configData['field.id']] = null
      })
      this.memberList = []
      // this.loadMember()
      this.getfindCompanyTreePage()
      this.loadMember()
    }
  }
}
admin/src/components/business/OperaWorkorderDetailDbhWindow.vue
@@ -148,11 +148,11 @@
      info: {},
      statusMap: {
        0: '待分配WTS',
        1: '待分配任务',
        2: '待工程师处理',
        3: '已解决',
        4: '已解决',
        5: '已解决'
        1: '待分配工程师',
        2: '待分配任务',
        3: 'SHE关闭',
        4: 'WTS关闭',
        5: '工程师关闭'
      },
      cateList: {
        0: 'SHE事件工单',
@@ -231,7 +231,7 @@
.modal_wrap {
  display: flex;
  height: 100%;
  height: aotu;
  .modal_content {
    flex: 1;
admin/src/components/business/OperaWorkorderDetailDcaInfoWindow.vue
@@ -148,7 +148,7 @@
      statusMap: {
        0: '待分配WTS',
        1: '待分配任务',
        2: '待工程师处理',
        2: '待分配任务',
        3: '已解决',
        4: '已解决',
        5: '已解决'
@@ -230,7 +230,7 @@
.modal_wrap {
  display: flex;
  height: 100%;
  height: auto;
  overflow: hidden;
  .modal_content {
admin/src/components/business/OperaWorkorderDetailDcaWindow.vue
@@ -91,11 +91,16 @@
            <el-table-column label="二级主题" prop="categoryName" min-width="60"> </el-table-column>
            <el-table-column label="观察项" prop="problemTitle" min-width="100"> </el-table-column>
            <el-table-column label="不符合原因" prop="eventInfo" min-width="120" />
            <el-table-column label="处理状态" prop="status" min-width="80">
            <el-table-column label="状态" prop="status" min-width="80">
              <template slot-scope="{row}">
<!--                <span :class="'statusInfo'+row.status" v-if="row.status ==0">待处理</span>-->
                <span :class="'statusInfo'+row.status" v-if="row.status ==3 ||row.status ==4||row.status ==5">已处理</span>
                <span :class="'statusInfo'+row.status" v-else>处理中</span>
              </template>
            </el-table-column>
            <el-table-column prop="statusInfo" label="状态描述" min-width="100px">
              <template slot-scope="{row}">
                <span :class="'statusInfo'+row.status" >{{ row.statusName }}</span>
              </template>
            </el-table-column>
            <el-table-column label="操作" prop="status" min-width="80">
@@ -146,11 +151,11 @@
      dataList2: [],
      statusMap: {
        0: '待分配WTS',
        1: '待分配任务',
        2: '待工程师处理',
        3: '已解决',
        4: '已解决',
        5: '已解决'
        1: '待分配工程师',
        2: '待分配任务',
        3: 'SHE关闭',
        4: 'WTS关闭',
        5: '工程师关闭'
      },
      cateList: {
        0: 'SHE事件工单',
@@ -249,7 +254,7 @@
.modal_wrap {
  display: flex;
  height: 100%;
  height: auto;
  .modal_content {
    flex: 1;
admin/src/components/business/OperaWorkorderDetailSheWindow.vue
@@ -181,7 +181,7 @@
      statusMap: {
        0: '待分配WTS',
        1: '待分配任务',
        2: '待工程师处理',
        2: '待分配任务',
        3: '已解决',
        4: '已解决',
        5: '已解决'
@@ -263,7 +263,7 @@
.modal_wrap {
  display: flex;
  height: 100%;
  height: auto;
  .modal_content {
    flex: 1;
admin/src/views/business/categoryDcaProblem.vue
@@ -25,9 +25,11 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
        <li> <el-button type="primary" :loading="isWorking.export"  icon="el-icon-download"  @click="exportDcaExcel">导出全部</el-button></li>
        <li><el-button type="primary"
                       @click="$refs.operaCategoryWindow.open('新建DCA主题和观察项', null,categoryList ,4,searchForm.parentId)" icon="el-icon-plus"
                       v-permissions="['business:category:create']">新建</el-button></li>
        <li> <el-button type="primary" :loading="importing"  icon="el-icon-plus" @click="$refs.OperaCategoryImportWindow.open('批量导入主题观察项')">全量导入</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">批量删除</el-button></li>
      </ul>
      <el-table  :height="tableHeightNew" v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
@@ -54,6 +56,7 @@
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
      <OperaCategoryDcaProblemWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
      <OperaCategoryImportWindow ref="OperaCategoryImportWindow" @success="handlePageChangeDo" />
    </template>
  </TableLayout1>
</template>
@@ -65,14 +68,16 @@
import Pagination from '@/components/common/Pagination'
import Tree from '@/components/common/Tree'
import { treeList } from '@/api/business/category'
import OperaCategoryImportWindow from '@/components/business/OperaCategoryImportWindow'
export default {
  name: 'categoryDcaProblem',
  extends: BaseTable,
  components: { TableLayout1, Pagination, Tree, OperaCategoryDcaProblemWindow },
  components: { TableLayout1, Pagination, Tree, OperaCategoryDcaProblemWindow ,OperaCategoryImportWindow},
  data () {
    return {
      TreeList: [],
      level: 0,
      importing: false,
      // æœç´¢
      searchForm: {
        name: '',
@@ -100,6 +105,24 @@
    this.getfindTreePage()
  },
  methods: {
    exportDcaExcel () {
      this.__checkApi()
      this.$dialog.exportConfirm('确认导出吗?')
        .then(() => {
          this.isWorking.export = true
          this.api.exportDcaExcel({})
            .then(response => {
              this.download(response)
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking.export = false
            })
        })
        .catch(() => {})
    },
    handlePageChangeDo () {
      this.searchForm.isRoot = 1
      this.searchForm.level = 1
@@ -163,7 +186,7 @@
      this.searchForm.parentId = row.id
      this.searchForm.isRoot = null
      this.searchForm.parentIdPath = row.idPath
      this.level= row.level
      this.level = row.level
      if (row.level === 2) {
        this.searchForm.type = 6
      } else {
admin/src/views/business/managersShe.vue
@@ -16,7 +16,7 @@
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:managers:create', 'business:managers:delete']">
        <li><el-button type="primary" @click="$refs.operaManagersWindow.open('新建SHE责任人',{type:0})" icon="el-icon-plus" v-permissions="['business:managers:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">删除</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">删除</el-button></li>
      </ul>
      <el-table
          :height="tableHeightNew"
admin/src/views/business/managersSheNotice.vue
@@ -16,7 +16,7 @@
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:managers:create', 'business:managers:delete']">
        <li><el-button type="primary" @click="$refs.operaManagersWindow.open('新建事件通知人管理',{type:3})" icon="el-icon-plus" v-permissions="['business:managers:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">删除</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">删除</el-button></li>
      </ul>
      <el-table
          :height="tableHeightNew"
admin/src/views/business/workorderDbh.vue
@@ -23,6 +23,15 @@
        <el-form-item label="工单号" prop="code">
          <el-input v-model="searchForm.code" clearable placeholder="请输入工单号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="状态描述" prop="status">
          <el-select v-model="searchForm.status" placeholder="请选择">
            <el-option label="待分配WTS" value="0"></el-option>
            <el-option label="待分配工程师" value="1"></el-option>
            <el-option label="SHE关闭" value="2"></el-option>
            <el-option label="WTS关闭" value="3"></el-option>
            <el-option label="工程师关闭" value="4"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="提交时间" prop="queryStartTime">
          <el-date-picker type="datetime" v-model="searchForm.queryStartTime" value-format="yyyy-MM-dd HH:mm:ss"
                          placeholder="请选择开始时间" @change="changeRadio" />
@@ -64,11 +73,13 @@
        <el-table-column prop="typeName" label="风险类型" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px">
          <template slot-scope="{row}">
<!--
            <span :class="'statusInfo'+row.status" v-if="row.status ==0">待处理</span>
-->
            <span :class="'statusInfo'+row.status" v-if="row.status ==3 ||row.status ==4||row.status ==5">已处理</span>
            <span :class="'statusInfo'+row.status" v-else>未处理</span>
          </template>
        </el-table-column>
        <el-table-column prop="statusInfo" label="状态描述" min-width="100px">
          <template slot-scope="{row}">
            <span :class="'statusInfo'+row.status" >{{ row.statusName }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="submitDate" label="上报时间" min-width="150px"></el-table-column>
@@ -132,6 +143,7 @@
        typeId: null,
        typeIdPath: null,
        code: '',
        status: null,
        categoryList: []
      },
      categoryprops: {
admin/src/views/business/workorderDcaChild.vue
@@ -29,6 +29,15 @@
        <el-form-item label="工单号" prop="code">
          <el-input v-model="searchForm.code" style="width: 120px"  clearable placeholder="工单号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="状态描述" prop="status">
          <el-select v-model="searchForm.status" placeholder="请选择">
            <el-option label="待分配WTS" value="0"></el-option>
            <el-option label="待分配工程师" value="1"></el-option>
            <el-option label="SHE关闭" value="2"></el-option>
            <el-option label="WTS关闭" value="3"></el-option>
            <el-option label="工程师关闭" value="4"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="提交时间" prop="queryStartTime">
          <el-date-picker type="datetime" v-model="searchForm.queryStartTime" value-format="yyyy-MM-dd HH:mm:ss"
                          placeholder="开始时间" @change="changeRadio" />
@@ -62,7 +71,7 @@
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column prop="code"  label="工单号" min-width="150px" fixed>
        <el-table-column prop="code"  label="工单号" min-width="160px" fixed>
          <template slot-scope="{row}">
            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('DCA事件工单详情', row)" >{{ row.code || '-'}}</span>
          </template>
@@ -71,15 +80,17 @@
          <template slot-scope="{row}"> {{row.typeName}}/{{row.categoryName}}
          </template>
        </el-table-column>
<!--
        <el-table-column prop="categoryName" label="二级主题" min-width="100px"></el-table-column>
-->
        <el-table-column prop="problemTitle" label="不符合项" min-width="250px"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px">
          <template slot-scope="{row}">
            <!--                <span :class="'statusInfo'+row.status" v-if="row.status ==0">待处理</span>-->
            <span :class="'statusInfo'+row.status" v-if="row.status ==3 ||row.status ==4||row.status ==5">已处理</span>
            <span :class="'statusInfo'+row.status" v-else>处理中</span>
          </template>
        </el-table-column>
        <el-table-column prop="statusInfo" label="状态描述" min-width="100px">
          <template slot-scope="{row}">
            <span :class="'statusInfo'+row.status" >{{ row.statusName}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="locationName" label="位置" min-width="150px"></el-table-column>
@@ -142,6 +153,7 @@
        categoryId: '',
        typeId: '',
        code: '',
        status: null,
        categoryList: []
      },
      categoryprops: {
server/src/main/java/com/doumee/api/business/CategoryController.java
@@ -9,14 +9,17 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.vo.CategoryDcaProblemDto;
import com.doumee.service.business.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import io.swagger.annotations.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
/**
@@ -95,6 +98,13 @@
    public void exportExcel (@RequestBody PageWrap<Category> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Category.class).export(categoryService.findPage(pageWrap).getRecords(), "分类信息表", response);
    }
    @ApiOperation("导出DCAExcel")
    @PostMapping("/exportDcaExcel")
    @EncryptionReq
    @RequiresPermissions("business:category:exportExcel")
    public void exportDcaExcel (@RequestBody Category  pageWrap, HttpServletResponse response) {
        ExcelExporter.build(CategoryDcaProblemDto.class).export(categoryService.findListForDca(pageWrap), "DCA事件主题和观察项配置_"+System.currentTimeMillis(), response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
@@ -114,5 +124,13 @@
    public ApiResponse<List<Category>> tree (@RequestBody Category param){
        return ApiResponse.success(categoryService.treeList(param));
    }
    @ApiOperation(value = "DCA主题和观察项信息导入" ,notes = "保单申请")
    @PostMapping("/importDcaExcel")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
    })
    @RequiresPermissions("business:member:create")
    public ApiResponse<String> imporimportDcaExceltExcel (@ApiParam(value = "file") MultipartFile file   ) {
        return ApiResponse.success(categoryService.importDcaBatch(file));
    }
}
server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java
@@ -5,9 +5,22 @@
@Slf4j
public class DmStdOutImpl extends StdOutImpl {
    private Boolean isOff = false;
    public Boolean isOff() {
        return isOff;
    }
    public void setOff(Boolean off) {
        isOff = off;
    }
    public DmStdOutImpl(String clazz) {
        super(clazz);
    }
    public DmStdOutImpl(String clazz,Boolean off) {
        super(clazz);
        this.isOff = off;
    }
    public boolean isDebugEnabled() {
@@ -30,6 +43,9 @@
    }
    public void debug(String s) {
        if(isOff!=null && isOff()){
            return;
        }
        log.info(s);
//        System.out.println(s);
    }
server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java
@@ -4,6 +4,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
@@ -11,7 +12,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
/**
@@ -41,6 +44,7 @@
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        Object target = invocation.getArgs()[1];
        if(target instanceof MapperMethod.ParamMap) {
            try {
                target = ((MapperMethod.ParamMap) target).get("param1");
server/src/main/java/com/doumee/core/constants/Constants.java
@@ -57,7 +57,9 @@
     */
    interface CacheKey {
    }
    public interface RedisKeys {
        public static final String IMPORTING_CATEGORY = "IMPORTING_CATEGORY";
    }
    /**
     * æ“ä½œç±»åž‹ï¼Œç”¨äºŽåšæŽ¥å£éªŒè¯åˆ†ç»„
     */
@@ -226,31 +228,41 @@
    public enum WorkOrderStatus{
        waitConfirm( 0, "待分配WTS","{title}上报",""),
        waitAllocation(1, "待分配任务","待分配任务",""),
        waitDeal(2, "待处理","待处理",""),
        sheClose(3, "已解决","SHE已关闭",""),
        wtsClose(4, "已解决","WTS已关闭",""),
        close(5, "已解决","已解决",""),
        urge (6, "催促","","")
        waitConfirm( 0, "待分配WTS","{title}上报","","待分配WTS" ),
        waitAllocation(1, "待分配任务","待分配任务","","待分配任务"),
        waitDeal(2, "待处理","待处理","","待工程师处理"),
        sheClose(3, "已解决","SHE已关闭","","SHE已关闭"),
        wtsClose(4, "已解决","WTS已关闭","","WTS已关闭"),
        close(5, "已解决","已解决","","工程师关闭"),
        urge (6, "催促","","","")
        ;
        private int status;
        private String statusInfo;
        private String statusName;
        private String logTitle;
        private String noticeContent;
        // æž„造方法
        WorkOrderStatus(int status, String statusInfo,String logTitle,String noticeContent ) {
        WorkOrderStatus(int status, String statusInfo,String logTitle,String noticeContent,String statusName ) {
            this.status = status;
            this.statusInfo = statusInfo;
            this.logTitle = logTitle;
            this.noticeContent = noticeContent;
            this.statusName = statusName;
        }
        public static String getName(int index) {
            for (WorkOrderStatus c : WorkOrderStatus.values()) {
                if (c.getKey() == index) {
                    return c.statusInfo;
                }
            }
            return null;
        }
        public static String getStatusName(int index) {
            for (WorkOrderStatus c : WorkOrderStatus.values()) {
                if (c.getKey() == index) {
                    return c.statusName;
                }
            }
            return null;
@@ -264,6 +276,22 @@
            this.status = status;
        }
        public int getStatus() {
            return status;
        }
        public void setStatus(int status) {
            this.status = status;
        }
        public String getStatusName() {
            return statusName;
        }
        public void setStatusName(String statusName) {
            this.statusName = statusName;
        }
        public String getStatusInfo() {
            return statusInfo;
        }
server/src/main/java/com/doumee/dao/business/model/Category.java
@@ -71,6 +71,9 @@
    @ApiModelProperty(value = "上级名称")
    @TableField(exist = false)
    private String parentName;
    @ApiModelProperty(value = "上上级名称")
    @TableField(exist = false)
    private String rootName;
    @ApiModelProperty(value = "操作人名字")
    @TableField(exist = false)
    private String editorName;
@@ -83,4 +86,8 @@
    @ApiModelProperty(value = "子集集合")
    @TableField(exist = false)
    private List<Category> childList;
    @ApiModelProperty(value = "子集集合(批量导入对比下集)")
    @TableField(exist = false)
    private List<Category> childMatchList;
}
server/src/main/java/com/doumee/dao/business/model/Managers.java
@@ -9,6 +9,7 @@
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * è´£ä»»äººä¿¡æ¯è¡¨
@@ -87,4 +88,13 @@
    @ApiModelProperty(value = "员工企微ID")
    @TableField(exist = false)
    private String memberQwId;
    @ApiModelProperty(value = "员工编码集合")
    @TableField(exist = false)
    private List<Integer> memberIds;
    @ApiModelProperty(value = "组织编码ID")
    @TableField(exist = false)
    private Integer companyId;
    @ApiModelProperty(value = "设置范围 0直属部门员工 1部门及其下级布恩员工 2指定人员")
    @TableField(exist = false)
    private Integer isMember;
}
server/src/main/java/com/doumee/dao/business/model/Workorder.java
@@ -218,6 +218,9 @@
    @ApiModelProperty(value = "解决情况(查询使用):0=否;1=是;",hidden = true)
    @TableField(exist = false)
    private Integer dealStatus;
    @ApiModelProperty(value = "状态描述;",hidden = true)
    @TableField(exist = false)
    private String statusName;
    @ApiModelProperty(value = "统计数;",hidden = true)
    @TableField(exist = false)
    private Long num;
server/src/main/java/com/doumee/dao/business/vo/CategoryDcaProblemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.business.vo;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
@Data
@ApiModel("DCA主题观察项导出信息")
public class CategoryDcaProblemDto {
    @ApiModelProperty(value = "序号")
    @ExcelColumn(name="序号",index =1  ,width = 4)
    private Long index;
    @ApiModelProperty(value = "一级主题")
    @ExcelColumn(name="一级观察主题",index =2  ,width = 10)
    private String parentName;
    @ApiModelProperty("二级观察主题")
    @ExcelColumn(name="二级观察主题",index =3,width = 10)
    private String typeName;
    @ApiModelProperty(value = "观察项"  )
    @ExcelColumn(name="观察项",index =4,width = 40 )
    private String problem;
}
server/src/main/java/com/doumee/dao/business/vo/WorkorderDbhDto.java
@@ -28,14 +28,17 @@
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理   4WTS关闭 5工程师关闭", example = "1")
    @ExcelColumn(name="状态",index =4,width = 4, valueMapping = "0=待处理;1=处理中;2=处理中;3=已处理;4=已处理;5=已处理;")
    private Integer status;
    @ApiModelProperty(value = "状态描述")
    @ExcelColumn(name="状态描述",index =5,width = 8)
    private String statusName;
    @ApiModelProperty(value = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =5 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    @ExcelColumn(name="上报时间",index =6 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date submitDate;
    @ApiModelProperty(value = "发现时间", example = "1")
    @ExcelColumn(name="发现时间",index =6 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    @ExcelColumn(name="发现时间",index =7 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date happenTime;
    @ApiModelProperty(value = "发生地点", example = "1")
    @ExcelColumn(name="发生地点",index =7 ,width = 6)
    @ExcelColumn(name="发生地点",index =8 ,width = 6)
    private String locationName;
    @ApiModelProperty(value = "风险描述", example = "1")
    @ExcelColumn(name="风险描述",index =11,width = 10)
server/src/main/java/com/doumee/dao/business/vo/WorkorderDcaChildDto.java
@@ -4,6 +4,8 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.ibatis.logging.nologging.NoLoggingImpl;
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import java.util.Date;
@@ -34,6 +36,9 @@
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理   4WTS关闭 5工程师关闭", example = "1")
    @ExcelColumn(name="状态",index =6,width = 4, valueMapping = "0=待处理;1=处理中;2=处理中;3=已处理;4=已处理;5=已处理;")
    private Integer status;
    @ApiModelProperty(value = "状态描述")
    @ExcelColumn(name="状态描述",index =5,width = 8)
    private String statusName;
    @ApiModelProperty(value = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =7 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date submitDate;
@@ -43,6 +48,7 @@
    @ApiModelProperty(value = "位置", example = "1")
    @ExcelColumn(name="位置",index =9 ,width = 6)
    private String locationName;
    @ApiModelProperty(value = "不符合原因", example = "1")
    @ExcelColumn(name="不符合原因",index =10,width = 10)
    private String eventInfo;
server/src/main/java/com/doumee/service/business/CategoryService.java
@@ -3,7 +3,9 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.vo.CategoryDcaProblemDto;
import com.doumee.dao.web.vo.CategoryVO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -103,10 +105,14 @@
     * @return
     */
    List<CategoryVO>  getCategoryVOTree(String categoryType,Integer categoryId);
    List<CategoryDcaProblemDto>  findListForDca(Category category);
    List<CategoryVO>  getCategoryVOList(Integer categoryType,Integer isRoot);
    List<CategoryVO>  getCategoryVOForGCXTree(Integer categoryId);
    List<Category> treeList(Category param );
    String importDcaBatch(MultipartFile file);
    String initRedis();
}
server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -1,6 +1,6 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.Constants;
import com.doumee.core.annotation.excel.ExcelImporter;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
@@ -10,14 +10,12 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.vo.CategoryDcaProblemDto;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.web.vo.CategoryVO;
import com.doumee.dao.web.vo.CategoryVOTree;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Managers;
import com.doumee.dao.business.vo.CategoryTree;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CategoryService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -25,17 +23,24 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
/**
@@ -46,6 +51,8 @@
@Service
public class CategoryServiceImpl implements CategoryService {
    @Resource(name="sessionRedisTemplate")
    private RedisTemplate<Object, Serializable> redisTemplate;
    @Autowired
    private CategoryMapper categoryMapper;
@@ -375,8 +382,366 @@
        }
        return categoryVOList;
    }
    public   List<Category>  findAllListForDca() {
        List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
                .eq(Category::getIsdeleted, Constants.ZERO)
                .in(Category::getType, Constants.FOUR, Constants.SIX)//主题和观察项
                .orderByAsc(Category::getSortnum)
        );
        return  categoryList;
    }
    public   List<Category>  findListForDcaTree(   List<Category> categoryList) {
        if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)) {
            long index = 1;
            List<Category> pList = new ArrayList<>();
            for (Category category : categoryList) {
                if (category.getParentId() == null) {
                    category.setChildList(new ArrayList<>());
                    for (Category cc : categoryList) {
                        if (Constants.equalsInteger(cc.getParentId(), category.getId())) {
                            cc.setChildList(new ArrayList<>());
                            for (Category ccc : categoryList) {
                                if (Constants.equalsInteger(ccc.getParentId(), cc.getId())) {
                                    cc.getChildList().add(ccc);
                                }
                            }
                            category.getChildList().add(cc);
                        }
                    }
                    pList.add(category);
                }
            }
            return pList;
        }
        return  null;
    }
    public   List<Category>  findImportTreeForDca (  List<CategoryDcaProblemDto> categoryList,LoginUserInfo user, Date date) {
        List<Category> pList = new ArrayList<>();
        if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)) {
            Integer index = 1;
            for (CategoryDcaProblemDto categoryDcaProblemDto : categoryList) {
                if(StringUtils.isBlank(categoryDcaProblemDto.getProblem())
                        &&StringUtils.isBlank(categoryDcaProblemDto.getParentName())
                        &&StringUtils.isBlank(categoryDcaProblemDto.getTypeName()) ){
                    //去空行
                    continue;
                }
                if(StringUtils.isBlank(categoryDcaProblemDto.getParentName())){
                    throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,表格第【"+(index + 1)+"】行一级主题信息不能为空,请返回检查表格信息!");
                }
                categoryDcaProblemDto.setProblem(StringUtils.defaultString(categoryDcaProblemDto.getProblem(),"").trim());
                categoryDcaProblemDto.setTypeName(StringUtils.defaultString(categoryDcaProblemDto.getTypeName(),"").trim());
                categoryDcaProblemDto.setParentName(StringUtils.defaultString(categoryDcaProblemDto.getParentName(),"").trim());
                Category first = getNewCateFromListByName(categoryDcaProblemDto.getParentName(), pList);
                if(first == null){
                    first = new Category();
                    first.setIsdeleted(Constants.ZERO);
                    first.setCreateDate(date);
                    first.setCreator(user.getId());
                    first.setIsdeleted(Constants.ZERO);
                    first.setStatus(Constants.ZERO);
                    first.setEditDate(date);
                    first.setEditor(user.getId());
                    first.setName(categoryDcaProblemDto.getParentName());
                    first.setType(Constants.FOUR);//主题
                    first.setSortnum(index++);
                    first.setChildList(new ArrayList<>());
                    pList.add(first);
                    List<Category> childList = getSecondListFromImport(first,0,categoryList);
                    first.setChildList(childList);
                }
            }
        }
        return  pList;
    }
    private List<Category> getSecondListFromImport(Category parent,int type,   List<CategoryDcaProblemDto> categoryList) {
        List<Category> pList = new ArrayList<>();
        Integer index = 1;
        for (CategoryDcaProblemDto categoryDcaProblemDto : categoryList) {
            if(type ==0 && (StringUtils.isBlank(categoryDcaProblemDto.getTypeName()) || StringUtils.isBlank(categoryDcaProblemDto.getProblem()))){
                //去空行
                continue;
            }
            if(type ==1 &&(StringUtils.isBlank(categoryDcaProblemDto.getProblem()))){
                //去空行
                continue;
            }
            if(type ==0 && StringUtils.isBlank(categoryDcaProblemDto.getTypeName())){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,表格第【"+(index + 1)+"】行二级主题信息不能为空,请返回检查表格信息!");
            }
            if(type == 0 && !StringUtils.equals(categoryDcaProblemDto.getParentName(),parent.getName())){
                //只处理子级
                continue;
            }
            if(type == 1 && !StringUtils.equals(categoryDcaProblemDto.getTypeName(),parent.getName())){
                //只处理子级
                continue;
            }
            Category model = getNewCateFromListByName(type == 0 ?categoryDcaProblemDto.getTypeName():categoryDcaProblemDto.getProblem(), pList);
            if(model == null){
                model = new Category();
                model.setIsdeleted(Constants.ZERO);
                model.setCreateDate(parent.getCreateDate());
                model.setCreator(parent.getCreator());
                model.setIsdeleted(Constants.ZERO);
                model.setStatus(Constants.ZERO);
                model.setEditDate(parent.getCreateDate());
                model.setEditor(parent.getCreator());
                model.setName(type == 0 ?categoryDcaProblemDto.getTypeName():categoryDcaProblemDto.getProblem());
                model.setType(type == 0 ? Constants.FOUR:Constants.SIX);//
                model.setSortnum(index++);
                model.setChildList(new ArrayList<>());
                pList.add(model);
            }
            if(type == 0){
                //如果是二级主题处理获取子集部门
                List<Category> childList = getSecondListFromImport(model,1,categoryList);
                model.setChildList(childList);
            }
        }
        return  pList;
    }
    private Category getNewCateFromListByName(String parentName, List<Category> pList) {
        if(pList ==null){
            return  null;
        }
        for(Category cate : pList){
            if(StringUtils.equals(parentName,cate.getName())){
                    return cate;
            }
        }
        return null;
    }
    private Category getNewCateFromListByNameAndParent(String parentName,int type,boolean isRoot, List<Category> pList) {
        for(Category cate : pList){
            if(StringUtils.equals(parentName,cate.getName()) && Constants.equalsInteger(cate.getType(),type)){
                if(isRoot && cate.getParentId()==null){
                    return cate;
                }else  if(isRoot && cate.getParentId()==null){
                    return cate;
                }
            }
        }
        return null;
    }
    @Override
    public   List<CategoryDcaProblemDto>  findListForDca(Category param){
        long index =1;
        List<CategoryDcaProblemDto>  categoryVOList = new ArrayList<>();
        List<Category> pList = findListForDcaTree( findAllListForDca());
        for (Category category:pList) {
            if(category.getChildList().size() ==0){
                CategoryDcaProblemDto categoryVO = new CategoryDcaProblemDto();
                categoryVO.setIndex(index);
                categoryVO.setParentName(category.getName());
                index++;
                categoryVOList.add(categoryVO);
            }else{
                for (Category cc:category.getChildList()) {
                    if(cc.getChildList().size() ==0){
                        CategoryDcaProblemDto categoryVO = new CategoryDcaProblemDto();
                        categoryVO.setIndex(index);
                        categoryVO.setParentName(category.getName());
                        categoryVO.setTypeName(cc.getName());
                        index++;
                        categoryVOList.add(categoryVO);
                    }else{
                        for (Category ccc:cc.getChildList()) {
                            CategoryDcaProblemDto categoryVO = new CategoryDcaProblemDto();
                            categoryVO.setIndex(index);
                            categoryVO.setParentName(category.getName());
                            categoryVO.setTypeName(cc.getName());
                            categoryVO.setProblem(ccc.getName());
                            index++;
                            categoryVOList.add(categoryVO);
                        }
                    }
                }
            }
        }
        return categoryVOList;
    }
    @Override
    @PostConstruct
    public String initRedis(){
        redisTemplate.delete(Constants.RedisKeys.IMPORTING_CATEGORY);
        return  "";
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public String importDcaBatch(MultipartFile file){
        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_CATEGORY);
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在员工导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_CATEGORY,true);
        try {
            ExcelImporter ie = null;
            List<CategoryDcaProblemDto> dataList =null;
            try {
                ie = new ExcelImporter(file,0,0, CellType.STRING); // ç¡®ä¿å•元格类型为字符串);
                dataList = ie.getDataList(CategoryDcaProblemDto.class,null);
            }  catch (Exception e) {
                e.printStackTrace();
            }
            if(dataList == null || dataList.size() ==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!");
            }
            Date date = new Date();
            LoginUserInfo user = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
            List<Category> treeImportList =   findImportTreeForDca(dataList,user,date);//查询现有的全部主题观察项数据
            if(treeImportList == null || treeImportList.size() ==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入的有效数据为空!");
            }
            //查询现有的全部主题观察项数据
            List<Category> list = categoryMapper.selectJoinList(Category.class,new MPJLambdaWrapper<Category>()
                             .selectAll(Category.class)
//                             .select("t1.name",Category::getParentName)
//                             .select("t2.name",Category::getRootName)
//                             .leftJoin(Category.class,Category::getId,Category::getParentId)
//                             .leftJoin( "category t2 on t1.parent_id=t2.id")
                            .eq(Category::getIsdeleted, Constants.ZERO)
                            .in(Category::getType, Constants.FOUR, Constants.SIX)//主题和观察项
                            .orderByAsc(Category::getSortnum)
            ) ;
            List<Category> treeList =   findListForDcaTree(list);//查询现有的全部主题观察项数据
            List<Integer> allUpdateIds = new ArrayList<>();
            dealImportNewOrUpdateBiz(treeList,treeImportList,allUpdateIds);
            dealDeletedList(list,allUpdateIds,user,date);//处理删除的数据信息
            dealTreePathInfo(treeImportList);
            return "导入成功";
        }catch (BusinessException e){
            throw e;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"员工信息导入失败,请稍后重试");
        }finally {
            redisTemplate.delete(Constants.RedisKeys.IMPORTING_CATEGORY);
        }
    }
    private void dealImportNewOrUpdateBiz(List<Category> treeList, List<Category> treeImportList, List<Integer> allUpdateIds) {
        List<Category> newList = new ArrayList<>();
        List<Category> updateList = new ArrayList<>();
        for(Category tmodel :treeImportList){
            //处理一级主题增改逻辑
            //查询是否存在名称相同的一级主题,存在则更新,不存在则新增
            Category first = getNewCateFromListByName(tmodel.getName(),treeList);
            if(first!=null){
                tmodel.setId(first.getId());
                tmodel.setChildMatchList(first.getChildList());
                allUpdateIds.add(first.getId());
                updateList.add(tmodel);
            }else{
                newList.add(tmodel);
            }
        }
        //先批量处理一级主题的增改数据,刷新一级主题对象的编码
        if(newList.size() >0){
            categoryMapper.insert(newList);
        }
        if( updateList.size() >0){
            for(Category update :updateList){
                categoryMapper.updateById(update);
            }
        }
        dealSecChildList(newList,updateList,allUpdateIds,1);//处理二级数据
    }
    private void dealDeletedList(List<Category> list, List<Integer> allUpdateIds, LoginUserInfo user, Date date) {
        List<Integer> deleteList = new ArrayList<>();
        for(Category cate : list){
            for(Integer nowId : allUpdateIds){
                if(Constants.equalsInteger(cate.getId(),nowId)){
                    continue;
                }
                deleteList.add(cate.getId());
            }
        }
        if(deleteList.size() >0){
            //删除不存在的
            categoryMapper.update(null,new UpdateWrapper<Category>().lambda()
                    .set(Category::getIsdeleted,Constants.ONE)
                    .set(Category::getEditor,user.getId())
                    .set(Category::getEditDate,date)
                    .in(Category::getId,deleteList));
        }
    }
    private void dealSecChildList(List<Category> newList, List<Category> updateList,List<Integer> allUpdateIds,int level) {
        List<Category> childNewList = new ArrayList<>();
        List<Category> childUpdateList = new ArrayList<>();
        if(newList.size() >0 || updateList.size()>0) {
            for(Category c : newList){
                if(c.getChildList()!=null && c.getChildList().size()>0){
                    for(Category sec : c.getChildList()){
                        sec.setParentId(c.getId());
                    }
                    childNewList.addAll(c.getChildList());
                }
            }
            for(Category c : updateList){
                if(c.getChildList()!=null && c.getChildList().size()>0){
                    List<Category> tList = c.getChildMatchList();
                    for(Category sec : c.getChildList()){
                        sec.setParentId(c.getId());
                        Category mmodel = getNewCateFromListByName(sec.getName(),tList);
                        if(mmodel!=null){
                            sec.setId(mmodel.getId());
                            sec.setChildMatchList(mmodel.getChildList());
                            allUpdateIds.add(mmodel.getId());
                            childUpdateList.add(sec);
                        }else{
                            childNewList.add(sec);
                        }
                    }
                }
            }
        }
        if(childNewList.size() >0){
            categoryMapper.insert(childNewList);
        }
        if( childUpdateList.size() >0){
            for(Category update :childUpdateList){
                categoryMapper.updateById(update);
            }
        }
        if(level == 1){
            dealSecChildList(childNewList,childUpdateList,allUpdateIds,2);//处理三级级数据
        }
    }
    private void dealTreePathInfo(List<Category> tree) {
        if(tree!=null || tree.size()>0){
            for(Category t : tree){
                t.setIdPath(t.getId()+"/");
                t.setNamePath(t.getName());
                categoryMapper.updateById(t);
                dealChildParentId(t,t.getChildList());
            }
        }
    }
    private void dealChildParentId(Category t, List<Category> childList) {
        if(childList ==null || childList.size()==0){
            return;
        }
        for(Category c : childList){
            c.setParentId(t.getId());
            c.setIdPath(t.getIdPath()+c.getId()+"/");
            c.setNamePath(t.getNamePath()+"/"+c.getName());
            categoryMapper.updateById(c);
            if(t.getChildList()!=null || t.getChildList().size()==0){
                //递归处理子集
                dealChildParentId(c,c.getChildList());
            }
        }
    }
}
server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -24,9 +24,12 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -40,6 +43,8 @@
@Service
public class CompanyServiceImpl implements CompanyService {
    @Resource(name="sessionRedisTemplate")
    private RedisTemplate<Object, Serializable> redisTemplate;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
server/src/main/java/com/doumee/service/business/impl/ManagersServiceImpl.java
@@ -8,8 +8,10 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.ManagersMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Managers;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.system.model.SystemUser;
@@ -23,8 +25,10 @@
import org.apache.shiro.SecurityUtils;
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.Date;
import java.util.List;
@@ -40,29 +44,69 @@
    private ManagersMapper managersMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer create(Managers managers) {
        Member member =memberMapper.selectById(managers.getMemberId());
        if(member == null || Constants.equalsInteger(member.getIsdeleted(),Constants.ONE)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该负责人信息不存在,请刷新页面重试!");
        List<Managers> newList = new ArrayList<>();
        if(  managers.getIsMember() == null || managers.getType() == null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Managers model =managersMapper.selectOne(new LambdaQueryWrapper<Managers>().eq(Managers::getMemberId,managers.getMemberId())
                .eq(Managers::getType,managers.getType())
                .eq(Managers::getIsdeleted,Constants.ZERO)
        );
        if(model !=null){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"该人员信息已设置,无需重新添加");
        List<Member> memberList = new ArrayList<>();
        List<Integer> memberIdList = new ArrayList<>();
        //设置范围 0直属部门员工 1部门及其下级布恩员工 2指定人员
        if(Constants.equalsInteger(managers.getIsMember(),Constants.ZERO) || Constants.equalsInteger(managers.getIsMember(),Constants.ONE)){
            //直属部门 æˆ– éƒ¨é—¨åŠå…¶å­éƒ¨é—¨
            if(managers.getCompanyId() ==null ){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST);
            }
            Company company = companyMapper.selectById(managers.getCompanyId());
            if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,部门信息不存在,请刷新页面重试!");
            }
            memberList  =memberMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>()
                    .selectAll(Member.class)
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .exists(Constants.equalsInteger(managers.getIsMember(),Constants.ZERO),"select (cm.id) from company_member cm where cm.company_id='"+company.getId()+"'  and cm.member_id=t.id")
                    .exists(Constants.equalsInteger(managers.getIsMember(),Constants.ONE),"select (cm.id) from company_member cm where cm.company_id_path like '"+company.getIdPath()+"%'  and cm.member_id=t.id"));
        }else{
            if(managers.getMemberIds()==null || managers.getMemberIds().size()==0){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请按要求选择指定员工信息!");
            }
            memberList  =memberMapper.selectList(new LambdaQueryWrapper<Member>()
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .in(Member::getId,managers.getMemberIds()));
        }
        if(memberList.size() ==0){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,选择范围未查询到相关员工信息,此次设置无效!");
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        managers.setCreator(user.getId());
        managers.setCreateDate(new Date());
        managers.setIsdeleted(Constants.ZERO);
        managers.setEditor(managers.getCreator());
        managers.setEditDate(managers.getCreateDate());
        managers.setStatus(Constants.ZERO);
        managersMapper.insert(managers);
        return managers.getId();
        for(Member m :memberList){
            Managers mm = new Managers();
            mm.setCreator(user.getId());
            mm.setCreateDate(new Date());
            mm.setIsdeleted(Constants.ZERO);
            mm.setEditor(managers.getCreator());
            mm.setEditDate(managers.getCreateDate());
            mm.setStatus(Constants.ZERO);
            mm.setType(managers.getType());
            mm.setMemberId(m.getId());
            mm.setRemark(managers.getRemark());
            memberIdList.add(m.getId());
            newList.add(mm);
        }
        //清空原有的设置信息
        managersMapper.delete(new UpdateWrapper<Managers>().lambda()
                .eq(Managers::getType,managers.getType())
                .in(Managers::getMemberId,memberIdList)
        );
        managersMapper.insert(newList);
        return newList.size();
    }
    @Override
server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -29,11 +29,14 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -47,6 +50,8 @@
@Service
public class MemberServiceImpl implements MemberService {
    @Resource(name="sessionRedisTemplate")
    private RedisTemplate<Object, Serializable> redisTemplate;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
@@ -502,6 +502,7 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        workorder.setStatusName(Constants.WorkOrderStatus.getStatusName(workorder.getStatus()));
        this.dealButton(workorder,member);
        //查询附件信息
        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda().eq(Multifile::getIsdeleted,Constants.ZERO)
@@ -777,7 +778,13 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        MPJLambdaWrapper<Workorder> queryWrapper = getJoinQueryMapper(pageWrap.getModel());
        return PageData.from(workorderMapper.selectJoinPage(page,Workorder.class, queryWrapper));
        PageData<Workorder> result = PageData.from(workorderMapper.selectJoinPage(page,Workorder.class, queryWrapper));
        if(result!=null && result.getRecords()!=null){
            for(Workorder w : result.getRecords()){
                w.setStatusName(Constants.WorkOrderStatus.getStatusName(w.getStatus()));
            }
        }
        return result;
    }
    @Override
server/src/main/resources/application.yml
@@ -9,7 +9,7 @@
spring:
  profiles:
    active: test
    active: dev
  # JSON返回配置
  jackson:
    # é»˜è®¤æ—¶åŒº
@@ -33,6 +33,8 @@
  configuration:
    map-underscore-to-camel-case: true
    log-impl: com.doumee.config.mybatis.DmStdOutImpl
#    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
#    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
# ç¼“存内容设置
@@ -60,7 +62,7 @@
# æ—¥å¿—配置
logback:
  level: INFO
  level: ERROR
  appender: ${project.env}
# dao层的日志设置为debug,方便查看sql
logging:
@@ -70,7 +72,7 @@
    com.doumee.dao.system.SystemJobListMapper: ERROR
    com.doumee.dao.system.SystemJobSnippetMapper: ERROR
    com.doumee.dao.system.SystemJobLogMapper: ERROR
    com.doumee.dao.business: DEBUG
    com.doumee.dao.business: ERROR
auth:
  jwt:
    enabled: true   #是否开启JWT登录认证功能