jiangping
2025-04-11 31678643b941483116cb4669fe6fefae4fcc0d26
代码初始化
已添加8个文件
已删除5个文件
已修改30个文件
已重命名1个文件
2364 ■■■■■ 文件已修改
admin/src/components/business/OperaWorkorderDetailDcaInfoWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailDcaWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailSheWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/workorderDbh.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/workorderDca.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/workorderDcaChild.vue 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/workorderShe.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/CategoryController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/CompanyController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/CompanyMemberController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/ManagersController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/MemberController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/MultifileController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/NoticesController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/WorkorderController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/business/WorkorderLogController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/system/SystemLoginLogController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/system/SystemTraceLogController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelColumn.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelDataHandlerAdapter.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java 266 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java 504 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/Reflections.java 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Category.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Company.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/CompanyMember.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Managers.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Member.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Multifile.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Notices.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Workorder.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderAllDto.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderDbhDto.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderDcaChildDto.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderDcaDto.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/vo/WorkorderSheDto.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaWorkorderDetailDcaInfoWindow.vue
@@ -35,7 +35,7 @@
              <div class="value">{{ info.companyName }} </div>
            </div>
            <div class="item">
              <div class="label">发生地点</div>
              <div class="label">位置</div>
              <div class="value">{{ info.locationName }}</div>
            </div>
            <div class="item">
admin/src/components/business/OperaWorkorderDetailDcaWindow.vue
@@ -41,7 +41,7 @@
              <div class="value">{{ info.happenTime}}</div>
            </div>
            <div class="item">
              <div class="label">发生地点</div>
              <div class="label">位置</div>
              <div class="value">{{ info.locationName }}</div>
            </div>
            <div class="item">
admin/src/components/business/OperaWorkorderDetailSheWindow.vue
@@ -45,6 +45,10 @@
              <div class="value">{{ info.locationName }}</div>
            </div>
            <div class="item">
              <div class="label">具体位置</div>
              <div class="value">{{ info.remark }}</div>
            </div>
            <div class="item">
              <div class="label">外部就医</div>
              <div class="value">{{ info.outJiuyi == "0" ? "否" : "是" }}</div>
            </div>
admin/src/views/business/workorderDbh.vue
@@ -40,14 +40,7 @@
            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('SHE事件工单详情', row)" >{{ row.code || '-'}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="typeName" label="伤害类型" min-width="100px"></el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所在部门" min-width="100px"></el-table-column>
        <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>
@@ -58,6 +51,13 @@
        <el-table-column prop="submitDate" label="上报时间" min-width="150px"></el-table-column>
        <el-table-column prop="happenTime" label="发现时间" min-width="150px"></el-table-column>
        <el-table-column prop="riskInfo" label="风险描述" min-width="100px"></el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="150px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
admin/src/views/business/workorderDca.vue
@@ -3,7 +3,7 @@
    <!-- æœç´¢è¡¨å• -->
    <div slot="search-form">
      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
        <el-form-item label="风险类型" prop="typeId">
        <el-form-item label="观察主题" prop="typeId">
          <el-select v-model="searchForm.typeId" @change="search">
          <el-option  clearable filterable
              v-for="item in categorys"
@@ -41,24 +41,25 @@
      >
        <el-table-column prop="code"  label="工单号" min-width="150px" fixed>
          <template slot-scope="{row}">
            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('SHE事件工单详情', row)" >{{ row.code || '-'}}</span>
            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('DCA事件工单记录详情', row)" >{{ row.code || '-'}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所在部门" min-width="100px"></el-table-column>
        <el-table-column prop="typeName" label="观察主题" min-width="150px"></el-table-column>
        <el-table-column prop="dcaYesNum" label="观察项统计" min-width="150px">
          <template slot-scope="{row}">
            <span  style="color: #1562e2" >符合:{{row.dcaYesNum}} ï¼Œä¸ç¬¦åˆï¼š<span style="color:red;">{{row.dcaNoNum}}</span> </span>
          </template>
        </el-table-column>
        <el-table-column prop="locationName" label="位置" min-width="150px"></el-table-column>
        <el-table-column prop="submitDate" label="上报时间" min-width="150px"></el-table-column>
        <el-table-column prop="happenTime" label="发现时间" min-width="150px"></el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="150px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
@@ -67,7 +68,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaWorkorderWindow.open('DCA事件工单详情', row)" icon="el-icon-zoom-out" >查看详情</el-button>
            <el-button type="text" @click="$refs.operaWorkorderWindow.open('DCA事件工单记录详情', row)" icon="el-icon-zoom-out" >查看详情</el-button>
          <!--<el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:workorder:delete']">删除</el-button>-->
          </template>
        </el-table-column>
admin/src/views/business/workorderDcaChild.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
<template>
  <TableLayout :permissions="['business:workorder:query']">
    <!-- æœç´¢è¡¨å• -->
    <div slot="search-form">
      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
        <el-form-item label="观察主题" prop="typeId">
          <el-select v-model="searchForm.typeId" @change="changeType" style="width: 120px">
          <el-option  clearable filterable
              v-for="item in categorys"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
          </el-select>-
          <el-select v-model="searchForm.categoryId" @change="search" style="width: 120px">
          <el-option  clearable filterable
              v-for="item in categorys1"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="上报人员" prop="memberName">
          <el-input v-model="searchForm.memberName" clearable placeholder="人员姓名或手机号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="工单号" prop="code">
          <el-input v-model="searchForm.code" clearable placeholder="请输入工单号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
          <el-button @click="reset">重置</el-button>
        </section>
      </el-form>
    </div>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:workorder:exportExcel']">
        <li> <el-button type="primary" :loading="isWorking.export" @click="exportExcel">导出</el-button></li>
      </ul>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column prop="code"  label="工单号" min-width="150px" fixed>
          <template slot-scope="{row}">
            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('DCA事件工单详情', row)" >{{ row.code || '-'}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="typeName" label="观察主题" min-width="150px"></el-table-column>
        <el-table-column prop="categoryName" label="二级观察主题" min-width="150px"></el-table-column>
        <el-table-column prop="problemTitle" label="不符合项" min-width="150px"></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-else-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="locationName" label="位置" min-width="150px"></el-table-column>
        <el-table-column prop="submitDate" label="上报时间" min-width="150px"></el-table-column>
        <el-table-column prop="happenTime" label="发现时间" min-width="150px"></el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="150px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaWorkorderWindow.open('DCA事件工单详情', row)" icon="el-icon-zoom-out" >查看详情</el-button>
          <!--<el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:workorder:delete']">删除</el-button>-->
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaWorkorderDetailDcaInfoWindow ref="operaWorkorderWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaWorkorderDetailDcaInfoWindow from '@/components/business/OperaWorkorderDetailDcaInfoWindow'
import { allList } from '@/api/business/category'
export default {
  name: 'Workorder',
  extends: BaseTable,
  components: {TableLayout, Pagination, OperaWorkorderDetailDcaInfoWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        type: '2',
        memberName: '',
        memberCompanyId: '',
        localtionId: '',
        categoryId: '',
        typeId: '',
        code: '',
        categoryList: []
      },
      categoryprops: {
        label: 'name',
        value: 'id',
        checkStrictly: true,
        lazyLoad: this.lazyLoad
      },
      categorys: [],
      categorys1: []
    }
  },
  created () {
    this.config({
      module: '工单信息表',
      api: '/business/workorder',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.loadCategorys()
    this.search()
  },
  methods: {
    changeType(){
      this.search()
      this.categorys1 = []
      this.searchForm.categoryId = null
      this.loadCategorys1()
    },
    handleChangeCategory (value) {
      if (this.searchForm.categoryList && this.searchForm.categoryList.length >= 1) {
        this.searchForm.typeId = this.searchForm.categoryList[this.searchForm.categoryList.length - 1]
      }
    },
    loadCategorys () {
      allList({ type: 4, isRoot:1})
        .then(res => {
          if (res && res.length > 0) {
            this.categorys = res
          }
        })
    },
    loadCategorys1 ( ) {
      if (!this.searchForm.typeId) {
        return
      }
      allList({ type: 4, parentId: this.searchForm.typeId })
        .then(res => {
          if (res && res.length > 0) {
            this.categorys1 = res
          }
        })
    },
  }
}
</script>
admin/src/views/business/workorderShe.vue
@@ -49,13 +49,6 @@
            <span :class="'statusInfo'+row.status" v-else>处理中</span>
          </template>
        </el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所在部门" min-width="100px"></el-table-column>
        <el-table-column prop="memberType" label="涉及人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberType == 2">供应商-{{row.memberNames}}</span>
@@ -64,6 +57,7 @@
          </template>
        </el-table-column>
        <el-table-column prop="locationName" label="发生地点" min-width="100px"></el-table-column>
        <el-table-column prop="remark" label="具体位置" min-width="100px"></el-table-column>
          <el-table-column prop="outJiuyi" label="就医情况" min-width="100px">
            <template slot-scope="{row}">
              <span v-if="row.outJiuyi == 0">非外部就医-
@@ -83,7 +77,14 @@
            </template>
          </el-table-column>
        <el-table-column prop="eventInfo" label="事件说明" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="150px"></el-table-column>
        <el-table-column prop="memberName" label="上报人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
            <span v-else >{{row.memberName}} </span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="提交时间" min-width="150px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
          label="操作"
server/src/main/java/com/doumee/api/business/CategoryController.java
@@ -7,7 +7,6 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Company;
import com.doumee.service.business.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -16,7 +15,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
@@ -80,7 +78,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:category:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Category> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Category.class).exportData(categoryService.findPage(pageWrap).getRecords(), "分类信息表", response);
        ExcelExporter.build(Category.class).export(categoryService.findPage(pageWrap).getRecords(), "分类信息表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/CompanyController.java
@@ -9,15 +9,12 @@
import com.doumee.dao.business.model.Company;
import com.doumee.service.business.CompanyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;    
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
@@ -90,7 +87,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:company:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Company> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Company.class).exportData(companyService.findPage(pageWrap).getRecords(), "组织信息表", response);
        ExcelExporter.build(Company.class).export(companyService.findPage(pageWrap).getRecords(), "组织信息表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/CompanyMemberController.java
@@ -15,9 +15,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @since 2025/04/03 16:30
@@ -73,7 +70,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:companymember:exportExcel")
    public void exportExcel (@RequestBody PageWrap<CompanyMember> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(CompanyMember.class).exportData(companyMemberService.findPage(pageWrap).getRecords(), "人员信息表", response);
        ExcelExporter.build(CompanyMember.class).export(companyMemberService.findPage(pageWrap).getRecords(), "人员信息表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/ManagersController.java
@@ -15,9 +15,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @since 2025/04/02 17:49
@@ -73,7 +70,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:managers:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Managers> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Managers.class).exportData(managersService.findPage(pageWrap).getRecords(), "责任人信息表", response);
        ExcelExporter.build(Managers.class).export(managersService.findPage(pageWrap).getRecords(), "责任人信息表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/MemberController.java
@@ -3,7 +3,6 @@
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.constants.Constants;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
@@ -16,7 +15,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
@@ -86,7 +84,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:member:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Member> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Member.class).exportData(memberService.findPage(pageWrap).getRecords(), "人员信息表", response);
        ExcelExporter.build(Member.class).export(memberService.findPage(pageWrap).getRecords(), "人员信息表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/MultifileController.java
@@ -1,7 +1,6 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
@@ -14,9 +13,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
@@ -69,12 +65,6 @@
        return ApiResponse.success(multifileService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:multifile:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Multifile> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Multifile.class).exportData(multifileService.findPage(pageWrap).getRecords(), "附件上传信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
server/src/main/java/com/doumee/api/business/NoticesController.java
@@ -15,9 +15,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @since 2025/04/02 17:49
@@ -73,7 +70,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:notices:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Notices> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Notices.class).exportData(noticesService.findPage(pageWrap).getRecords(), "系统消息信息表", response);
        ExcelExporter.build(Notices.class).export(noticesService.findPage(pageWrap).getRecords(), "系统消息信息表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/WorkorderController.java
@@ -3,19 +3,30 @@
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.Workorder;
import com.doumee.dao.business.vo.WorkorderDbhDto;
import com.doumee.dao.business.vo.WorkorderDcaChildDto;
import com.doumee.dao.business.vo.WorkorderDcaDto;
import com.doumee.dao.business.vo.WorkorderSheDto;
import com.doumee.service.business.WorkorderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@@ -73,7 +84,76 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:workorder:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Workorder> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(Workorder.class).exportData(workorderService.findPage(pageWrap).getRecords(), "工单信息表", response);
        //0SHE事件 1DCA事件提交记录 2DCA工单 3跌绊滑事件
        long index = 1;
        if(Constants.equalsInteger(pageWrap.getModel().getType(),Constants.ZERO)){
            List<Workorder> records = workorderService.findPage(pageWrap).getRecords();
            List<WorkorderSheDto> list = new ArrayList<>();
            if(records!=null){
                for(Workorder model : records){
                    WorkorderSheDto t = new WorkorderSheDto();
                    t.setIndex(index++);
                    BeanUtils.copyProperties(model,t);
                    if(Constants.equalsInteger(model.getOutJiuyi(),Constants.ONE)){
                        t.setJiuyiInfo("外部就医");
                    }else{
                        t.setJiuyiInfo("非外部就医");
                        if(Constants.equalsInteger(model.getIsYiwushi(),Constants.ONE)){
                            t.setJiuyiInfo(t.getJiuyiInfo() + "-医务室");
                        }else{
                            t.setJiuyiInfo(t.getJiuyiInfo() + "-非医务室");
                            if(Constants.equalsInteger(model.getIsHurted(),Constants.ONE)){
                                t.setJiuyiInfo(t.getJiuyiInfo() + "-受伤");
                            }else{
                                t.setJiuyiInfo(t.getJiuyiInfo() + "-未受伤");
                            }
                        }
                    }
                    t.setMemberNames("本人");
                    t.setMemberNames(t.getMemberNames()+"-"+StringUtils.defaultString(model.getMemberNames(),""));
                    list.add(t);
                }
            }
            ExcelExporter.build(WorkorderSheDto.class).export(list, "SHE事件工单报表_"+ DateUtil.formatDate(new Date(),"yyyyMMddHHmmss"), response);
        }else if(Constants.equalsInteger(pageWrap.getModel().getType(),Constants.ONE)){
            List<Workorder> records = workorderService.findPage(pageWrap).getRecords();
            List<WorkorderDcaDto> list = new ArrayList<>();
            if(records!=null){
                for(Workorder model : records){
                    WorkorderDcaDto t = new WorkorderDcaDto();
                    t.setIndex(index++);
                    BeanUtils.copyProperties(model,t);
                    list.add(t);
                }
            }
            ExcelExporter.build(WorkorderDcaDto.class).export(list, "DCA事件工单提交记录报表_"+ DateUtil.formatDate(new Date(),"yyyyMMddHHmmss"), response);
          }else if(Constants.equalsInteger(pageWrap.getModel().getType(),Constants.TWO)){
            List<Workorder> records = workorderService.findPage(pageWrap).getRecords();
            List<WorkorderDcaChildDto> list = new ArrayList<>();
            if(records!=null){
                for(Workorder model : records){
                    WorkorderDcaChildDto t = new WorkorderDcaChildDto();
                    t.setIndex(index++);
                    BeanUtils.copyProperties(model,t);
                    list.add(t);
                }
            }
            ExcelExporter.build(WorkorderDcaChildDto.class).export(list, "DCA事件工单报表_"+ DateUtil.formatDate(new Date(),"yyyyMMddHHmmss"), response);
        }else if(Constants.equalsInteger(pageWrap.getModel().getType(),Constants.THREE)){
            List<Workorder> records = workorderService.findPage(pageWrap).getRecords();
            List<WorkorderDbhDto> list = new ArrayList<>();
            if(records!=null){
                for(Workorder model : records){
                    WorkorderDbhDto t = new WorkorderDbhDto();
                    t.setIndex(index++);
                    BeanUtils.copyProperties(model,t);
                    list.add(t);
                }
            }
            ExcelExporter.build(WorkorderDbhDto.class).export(list, "跌绊滑事件工单报表_"+ DateUtil.formatDate(new Date(),"yyyyMMddHHmmss"), response);
        }else{
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/business/WorkorderLogController.java
@@ -15,9 +15,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @since 2025/04/02 17:49
@@ -73,7 +70,7 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:workorderlog:exportExcel")
    public void exportExcel (@RequestBody PageWrap<WorkorderLog> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(WorkorderLog.class).exportData(workorderLogService.findPage(pageWrap).getRecords(), "工单操作历史表", response);
        ExcelExporter.build(WorkorderLog.class).export(workorderLogService.findPage(pageWrap).getRecords(), "工单操作历史表", response);
    }
    @ApiOperation("根据ID查询")
server/src/main/java/com/doumee/api/system/SystemLoginLogController.java
@@ -39,6 +39,6 @@
    @ApiOperation("导出Excel")
    @RequiresPermissions("system:loginLog:query")
    public void export (@RequestBody PageWrap<QuerySystemLoginLogDTO> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SystemLoginLog.class).exportData(systemLoginLogService.findPage(pageWrap).getRecords(), "登录日志", response);
        ExcelExporter.build(SystemLoginLog.class).export(systemLoginLogService.findPage(pageWrap).getRecords(), "登录日志", response);
    }
}
server/src/main/java/com/doumee/api/system/SystemTraceLogController.java
@@ -3,7 +3,6 @@
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.system.dto.QuerySystemTraceLogDTO;
import com.doumee.dao.system.model.SystemTraceLog;
@@ -39,6 +38,6 @@
    @PostMapping("/exportExcel")
    @RequiresPermissions("system:traceLog:query")
    public void exportExcel (@RequestBody PageWrap<QuerySystemTraceLogDTO> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(SystemTraceLog.class).exportData(systemTraceLogService.findPage(pageWrap).getRecords(), "操作日志", response);
        ExcelExporter.build(SystemTraceLog.class).export(systemTraceLogService.findPage(pageWrap).getRecords(), "操作日志", response);
    }
}
server/src/main/java/com/doumee/core/annotation/excel/ExcelColumn.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.doumee.core.annotation.excel;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.lang.annotation.*;
/**
 * æ ‡è®°ä¸ºExcel列
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Inherited
//@Target(ElementType.FIELD)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelColumn {
    /**
     * å¯¼å‡ºå­—段名(默认调用当前字段的“get”方法,如指定导出字段为对象,请填写“对象名.对象属性”,例:“area.name”、“office.name”)
     */
    String value() default "";
    /**
     * å­—段类型(0:导出导入;1:仅导出;2:仅导入)
     */
    int type() default 0;
    /**
     * åˆ—名
     */
    String name();
    /**
     * åˆ—宽(单位为字符),-1自动计算
     */
    int width() default -1;
    /**
     * æŽ’序,值越小越靠前,-1按字段反射顺序排序
     */
    int index() default -1;
    /**
     * å¯¹é½æ–¹å¼
     */
    HorizontalAlignment align() default HorizontalAlignment.LEFT;
    /**
     * åˆ—背景色
     */
    IndexedColors backgroundColor() default IndexedColors.GREY_25_PERCENT;
    /**
     * åˆ—数据单元格背景色
     */
    IndexedColors dataBackgroundColor() default IndexedColors.WHITE;
    /**
     * å­—体颜色
     */
    IndexedColors color() default IndexedColors.BLACK;
    /**
     * å­—体大小(像素)
     */
    short fontSize() default 12;
    /**
     * ç²—体
     */
    boolean bold() default false;
    /**
     * æ–œä½“
     */
    boolean italic() default false;
    /**
     * å€¼æ˜ å°„,如0=女;1=男
     */
    String valueMapping() default "";
    /**
     * æ•°æ®å‰ç¼€
     */
    String prefix() default "";
    /**
     * æ•°æ®åŽç¼€
     */
    String suffix() default "";
    /**
     * æ—¥æœŸæ ¼å¼
     */
    String dateFormat() default "yyyy-MM-dd";
    /**
     * è‡ªå®šä¹‰æ•°æ®å¤„理器
     */
    Class handler() default ExcelDataHandlerAdapter.class;
    /**
     * è‡ªå®šä¹‰æ•°æ®å¤„理器参数
     */
    String[] args() default {};
    /**
     * åå°„类型
     */
    Class<?> fieldType() default Class.class;
    /**
     * å­—段归属组(根据分组导出导入)
     */
    int[] groups() default {};
}
server/src/main/java/com/doumee/core/annotation/excel/ExcelDataHandlerAdapter.java
ÎļþÃû´Ó server/src/main/java/com/doumee/core/annotation/excel/ExcelDataConverterAdapter.java ÐÞ¸Ä
@@ -2,16 +2,16 @@
/**
 * Excel数据格式处理适配器
 * @author  dm
 * @since 2025/03/31 16:44
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
public interface ExcelDataConverterAdapter {
public interface ExcelDataHandlerAdapter {
    /**
     * æ ¼å¼åŒ–
     *
     * @param args å‚数集合,第一个参数为单元格数据
     *
     * @return String
     */
    Object convert(Object... args);
    Object format (Object... args);
}
server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java
ÎļþÒÑɾ³ý
server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
@@ -5,6 +5,7 @@
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.core.annotation.AnnotationConfigurationException;
@@ -14,14 +15,14 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Excel导出实现
 * @author  dm
 * @since 2025/03/31 16:44
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Data
public class ExcelExporter<T> {
@@ -29,12 +30,12 @@
    private static final String DEFAULT_SHEET_NAME = "Sheet1";
    private Class<T> modelClass;
    private static int maxrows = 50000;
    private ExcelExporter(){}
    /**
     * æž„造器
     *
     * @param modelClass å®žä½“Class对象
     */
    public static <T> ExcelExporter<T> build(Class<T> modelClass) {
@@ -42,22 +43,26 @@
        excelExporter.setModelClass(modelClass);
        return excelExporter;
    }
    /**
     * å¯¼å‡ºåˆ°æŒ‡å®šè¾“出流
     *
     * @param data æ•°æ®
     * @param sheetName Sheet名称
     * @param os è¾“出流
     */
    public void exportData(List<T> data, String sheetName, OutputStream os) {
    public void exportWithFirstAndEnd (List<T> data, String sheetName,String first,String end, OutputStream os) {
        SXSSFWorkbook sxssfWorkbook;
        try {
            sxssfWorkbook = new SXSSFWorkbook();
            Sheet sheet = sxssfWorkbook.createSheet(sheetName);
            // åˆ›å»ºåˆ—头
            sheet.createFreezePane(0, 1);
            Row header = sheet.createRow(0);
            sheet.createFreezePane(0, 2);
            sheet.addMergedRegion(new CellRangeAddress(0   ,0,0,this.getColumns().size()-1));
            Row title = sheet.createRow(0);
            title.setHeight((short) 1000);
            Cell c = title.createCell(0);
            c.setCellValue(first);
            configFirstCell(sxssfWorkbook,c);
            Row header = sheet.createRow(1);
            List<ColumnInfo> columns = this.getColumns();
            for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
                ColumnInfo column = columns.get(columnIndex);
@@ -72,17 +77,27 @@
                // è®¾ç½®åˆ—头单元格
                configHeaderCell(sxssfWorkbook, cell, column.columnConfig);
            }
            List<CellStyle> styleList = new ArrayList<>();
            for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
                ColumnInfo column = columns.get(columnIndex);
                styleList.add( configDataCell(sxssfWorkbook,   column.columnConfig));
            }
            // åˆ›å»ºæ•°æ®è®°å½•
            for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
                Row row = sheet.createRow(rowIndex + 1);
                Row row = sheet.createRow(rowIndex + 2);
                for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
                    ColumnInfo column = columns.get(columnIndex);
                    Cell cell = row.createCell(columnIndex);
                    cell.setCellValue(getCellData(column, data.get(rowIndex)));
                    // è®¾ç½®æ•°æ®å•元格
                    configDataCell(sxssfWorkbook, cell, column.columnConfig);
                    cell.setCellStyle(styleList.get(columnIndex));
                }
            }
            sheet.addMergedRegion(new CellRangeAddress(data.size()+2   ,data.size()+2,0,this.getColumns().size()-1));
            Row endRow = sheet.createRow(data.size()+2);
//            endRow.setHeight((short) 600);
            Cell c1 = endRow.createCell(0);
            c1.setCellValue(end);
            c1.setCellStyle(  configEndCell(sxssfWorkbook));
            sxssfWorkbook.write(os);
            os.close();
        } catch (Exception e) {
@@ -99,21 +114,117 @@
    }
    /**
     * å¯¼å‡ºåˆ°æŒ‡å®šè¾“出流
     * @param data æ•°æ®
     * @param sheetName Sheet名称
     * @param os è¾“出流
     */
    public void export (List<T> data, String sheetName, OutputStream os) {
        SXSSFWorkbook sxssfWorkbook;
        try {
            sxssfWorkbook = new SXSSFWorkbook();
            int totalSheet =1;
            if( data!=null && data.size()>0){
                totalSheet = data.size()/maxrows;
                if(data.size()%maxrows !=0){
                    totalSheet += 1;
                }
            }
            for (int i = 0; i < totalSheet; i++) {
                List<T> list = null;
                if(data.size() < maxrows * (i+1)) {
                    list = data.subList(maxrows*i,data.size());
                }else{
                    list = data.subList(maxrows*i,maxrows*(i+1));
                }
                createSheetDataBiz(list,"【"+(i+1)+"】"+sheetName,sxssfWorkbook);
            }
            sxssfWorkbook.write(os);
            os.close();
        } catch (Exception e) {
            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private void createSheetDataBiz(List<T> data, String sheetName, SXSSFWorkbook sxssfWorkbook) throws Exception{
        Sheet sheet = sxssfWorkbook.createSheet(sheetName);
        // åˆ›å»ºåˆ—头
        sheet.createFreezePane(0, 1);
        Row header = sheet.createRow(0);
        List<ColumnInfo> columns = this.getColumns();
        for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
            ColumnInfo column = columns.get(columnIndex);
            Cell cell = header.createCell(columnIndex);
            cell.setCellValue(column.columnConfig.name());
            // åˆ—宽设置
            if (column.columnConfig.width() == -1) {
                sheet.setColumnWidth(columnIndex, column.columnConfig.name().length() * 2 * 256);
            } else {
                sheet.setColumnWidth(columnIndex, column.columnConfig.width() * 2 * 256);
            }
            // è®¾ç½®åˆ—头单元格
            configHeaderCell(sxssfWorkbook, cell, column.columnConfig);
        }
        List<CellStyle> styleList = new ArrayList<>();
        for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
            ColumnInfo column = columns.get(columnIndex);
            styleList.add( configDataCell(sxssfWorkbook,   column.columnConfig));
        }
        // åˆ›å»ºæ•°æ®è®°å½•
        for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
            Row row = sheet.createRow(rowIndex + 1);
            for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
                ColumnInfo column = columns.get(columnIndex);
                Cell cell = row.createCell(columnIndex);
                cell.setCellValue(getCellData(column, data.get(rowIndex)));
                // è®¾ç½®æ•°æ®å•元格样式
                cell.setCellStyle(styleList.get(columnIndex));
            }
        }
    }
    /**
     * å¯¼å‡ºè‡³å“åº”流
     *
     * @param data æ•°æ®
     * @param fileName Excel文件名
     * @param sheetName Sheet名称
     * @param response HttpServletResponse对象
     */
    public void exportData(List<T> data, String fileName, String sheetName, HttpServletResponse response) {
    public void export (List<T> data, String fileName, String sheetName, HttpServletResponse response) {
        try {
            String encodeFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()) + ".xlsx";
            String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx";
            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
            response.setContentType("application/octet-stream");
            response.setHeader("doumee-opera-type", "download");
            response.setHeader("doumee-download-filename", encodeFileName);
            this.exportData(data, sheetName, response.getOutputStream());
            this.export(data, sheetName, response.getOutputStream());
        } catch (IOException e) {
            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
        }
    }
    /**
     * å¯¼å‡ºè‡³å“åº”流
     * @param data æ•°æ®
     * @param fileName Excel文件名
     * @param sheetName Sheet名称
     * @param response HttpServletResponse对象
     */
    public void exportWithFirstAndEnd (List<T> data, String fileName, String sheetName, String first,String end ,HttpServletResponse response) {
        try {
            String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx";
            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
            response.setContentType("application/octet-stream");
            response.setHeader("doumee-opera-type", "download");
            response.setHeader("doumee-download-filename", encodeFileName);
            this.exportWithFirstAndEnd(data, sheetName,first,end, response.getOutputStream());
        } catch (IOException e) {
            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
        }
@@ -121,16 +232,25 @@
    /**
     * å¯¼å‡ºè‡³å“åº”流
     *
     * @param data æ•°æ®
     * @param fileName Excel文件名
     * @param response HttpServletResponse对象
     */
    public void exportData(List<T> data, String fileName, HttpServletResponse response) {
        this.exportData(data, fileName, DEFAULT_SHEET_NAME, response);
    public void export (List<T> data, String fileName, HttpServletResponse response) {
        this.export(data, fileName, DEFAULT_SHEET_NAME, response);
    }
    /**
     * å¯¼å‡ºè‡³å“åº”流
     * @param data æ•°æ®
     * @param fileName Excel文件名
     * @param response HttpServletResponse对象
     */
    public void exportWithFirstAndEnd (List<T> data, String fileName,String first,String end, HttpServletResponse response) {
        this.exportWithFirstAndEnd(data, fileName, DEFAULT_SHEET_NAME, first,end,response);
    }
    /**
    /**O
     * èŽ·å–åˆ—é›†åˆ
     */
    private List<ColumnInfo> getColumns () {
@@ -138,12 +258,12 @@
        Field[] fields = modelClass.getDeclaredFields();
        int index = 0;
        for (Field field : fields) {
            ExcelExportColumn excelColumn = field.getAnnotation(ExcelExportColumn.class);
            ExcelColumn excelColumn = field.getAnnotation(ExcelColumn.class);
            if (excelColumn == null) {
                continue;
            }
            if (sortedFields.get(excelColumn.index()) != null) {
                throw new AnnotationConfigurationException("EVA: excel column contains the same index.");
                throw new AnnotationConfigurationException("Excel column contains the same index.");
            }
            sortedFields.put(excelColumn.index() == -1 ? index : excelColumn.index(), new ColumnInfo(excelColumn, field));
            index++;
@@ -154,32 +274,35 @@
    /**
     * é…ç½®æ•°æ®å•元格
     */
    private void configDataCell (SXSSFWorkbook workbook, Cell cell, ExcelExportColumn columnConfig) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(columnConfig.align());
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // è®¾ç½®èƒŒæ™¯
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setFillForegroundColor(columnConfig.dataBackgroundColor().getIndex());
        // å­—体
        Font font = workbook.createFont();
        font.setFontHeightInPoints(columnConfig.fontSize());
        // å­—体颜色
        font.setColor(columnConfig.color().getIndex());
        // ç²—体
        font.setBold(columnConfig.bold());
        // æ–œä½“
        font.setItalic(columnConfig.italic());
        style.setFont(font);
        // è¾¹æ¡†
        configCellBorder(style);
        cell.setCellStyle(style);
    private CellStyle configDataCell (SXSSFWorkbook workbook, ExcelColumn columnConfig) {
            CellStyle  configDataCellStyle = workbook.createCellStyle();
            configDataCellStyle.setAlignment(columnConfig.align());
            configDataCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // è®¾ç½®èƒŒæ™¯
            configDataCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            configDataCellStyle.setFillForegroundColor(columnConfig.dataBackgroundColor().getIndex());
            // å­—体
            Font font = workbook.createFont();
            font.setFontHeightInPoints(columnConfig.fontSize());
            // å­—体颜色
            font.setColor(columnConfig.color().getIndex());
            // ç²—体
            font.setBold(columnConfig.bold());
            // æ–œä½“
            font.setItalic(columnConfig.italic());
            configDataCellStyle.setFont(font);
            // è¾¹æ¡†
            configCellBorder(configDataCellStyle);
            configDataCellStyle.setWrapText(true);
        return configDataCellStyle;
//        cell.setCellStyle(configDataCellStyle);
    }
    /**
     * é…ç½®åˆ—头单元格
     */
    private void configHeaderCell (SXSSFWorkbook workbook, Cell cell, ExcelExportColumn columnConfig) {
    private void configHeaderCell (SXSSFWorkbook workbook, Cell cell, ExcelColumn columnConfig) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(columnConfig.align());
        style.setVerticalAlignment(VerticalAlignment.CENTER);
@@ -193,6 +316,44 @@
        // è®¾ç½®è¾¹æ¡†
        configCellBorder(style);
        cell.setCellStyle(style);
    }
    /**
     * é…ç½®åˆ—头单元格
     */
    private void configFirstCell (SXSSFWorkbook workbook, Cell cell ) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // è®¾ç½®èƒŒæ™¯
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        // å­—体
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short)18);
        style.setFont(font);
        // è®¾ç½®è¾¹æ¡†
        configCellBorder(style);
        cell.setCellStyle(style);
    }
//    public static CellStyle configEndCellStyle =null;
    /**
     * é…ç½®åˆ—头单元格
     */
    private CellStyle configEndCell (SXSSFWorkbook workbook ) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.RIGHT);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // è®¾ç½®èƒŒæ™¯
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        // å­—体
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short)14);
        style.setFont(font);
        // è®¾ç½®è¾¹æ¡†
        configCellBorder(style);
        return style;
    }
    /**
@@ -221,19 +382,19 @@
        }
        String stringValue = value.toString();
        // å­˜åœ¨è‡ªå®šä¹‰æ•°æ®å¤„理器
        if (!columnInfo.columnConfig.converter().equals(ExcelDataConverterAdapter.class)) {
        if (!columnInfo.columnConfig.handler().equals(ExcelDataHandlerAdapter.class)) {
            try {
                Object instance = columnInfo.columnConfig.converter().newInstance();
                Method convertMethod = columnInfo.columnConfig.converter().getMethod("convert", Object[].class);
                Object instance = columnInfo.columnConfig.handler().newInstance();
                Method formatMethod = columnInfo.columnConfig.handler().getMethod("format", Object[].class);
                List<Object> args = new ArrayList<>();
                args.add(value);
                for (String arg : columnInfo.columnConfig.args()) {
                    args.add(arg);
                }
                value = convertMethod.invoke(instance, new Object[]{args.toArray()});
                value = formatMethod.invoke(instance, new Object[]{args.toArray()});
                stringValue = value.toString();
            } catch (Exception e) {
                throw new IllegalStateException("EVA: can not convert data by " + columnInfo.columnConfig.converter(), e);
                throw new IllegalStateException("Can not format data by " + columnInfo.columnConfig.handler(), e);
            }
        }
        // æ—¥æœŸå¤„理
@@ -258,17 +419,12 @@
        return stringValue;
    }
    /**
     * åˆ—信息
     */
    @Data
    @AllArgsConstructor
    private static class ColumnInfo {
        // åˆ—配置
        private ExcelExportColumn columnConfig;
        private ExcelColumn columnConfig;
        // å­—段信息
        private Field field;
    }
server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java
ÎļþÒÑɾ³ý
server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java
ÎļþÒÑɾ³ý
server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -1,212 +1,394 @@
package com.doumee.core.annotation.excel;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.core.annotation.AnnotationConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.*;
/**
 * Excel导入实现
 * @author  dm
 * @since 2025/03/31 16:44
 * å¯¼å…¥Excel文件(支持“XLS”和“XLSX”格式)
 */
public class ExcelImporter<T> {
public class ExcelImporter {
    private Class<T> modelClass;
    private ExcelImporter () {}
    private static Logger log = LoggerFactory.getLogger(ExcelImporter.class);
    /**
     * æž„造ExcelImporter对象
     *
     * @param modelClass å®žä½“Class对象
     * @return ExcelImporter实例
     * å·¥ä½œè–„对象
     */
    public static <T> ExcelImporter<T> build(Class<T> modelClass) {
        ExcelImporter<T> excelImporter = new ExcelImporter<>();
        excelImporter.modelClass = modelClass;
        return excelImporter;
    private Workbook wb;
    /**
     * å·¥ä½œè¡¨å¯¹è±¡
     */
    private Sheet sheet;
    /**
     * æ ‡é¢˜è¡Œå·
     */
    private int headerNum;
    /**
     * æ ‡é¢˜è¡Œå·
     */
    private CellType changeType;
    /**
     * æž„造函数
     * @param--path å¯¼å…¥æ–‡ä»¶ï¼Œè¯»å–第一个工作表
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1
     * @throws InvalidFormatException
     * @throws IOException
     */
    public ExcelImporter(String fileName, int headerNum)
        throws InvalidFormatException, IOException {
        this(new File(fileName), headerNum);
    }
    /**
     * å¯¼å…¥æ•°æ®
     *
     * @param is è¾“入流
     * @param callback å›žè°ƒ
     * @param sync æ˜¯å¦åŒæ­¥å·²å­˜åœ¨æ•°æ®
     * @return å¯¼å…¥æˆåŠŸæ•°
     * æž„造函数
     * @param--path å¯¼å…¥æ–‡ä»¶å¯¹è±¡ï¼Œè¯»å–第一个工作表
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1   (eg: 1)
     * @throws InvalidFormatException
     * @throws IOException
     */
    public int importData (InputStream is, ExcelImportCallback<T> callback, boolean sync) {
        return this.importData(is, 0, callback, sync);
    public ExcelImporter(File file, int headerNum)
        throws InvalidFormatException, IOException {
        this(file, headerNum, 0);
    }
    /**
     * å¯¼å…¥æ•°æ®
     *
     * @param is è¾“入流
     * @param sheetIndex sheet坐标
     * @param callback å›žè°ƒ
     * @param sync æ˜¯å¦åŒæ­¥å·²å­˜åœ¨æ•°æ®
     * @return å¯¼å…¥æˆåŠŸæ•°
     * æž„造函数
     * @param--path å¯¼å…¥æ–‡ä»¶
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1
     * @param sheetIndex å·¥ä½œè¡¨ç¼–号
     * @throws InvalidFormatException
     * @throws IOException
     */
    public int importData (InputStream is, int sheetIndex, ExcelImportCallback<T> callback, boolean sync) {
        try {
            Workbook workbook = new XSSFWorkbook(is);
            Sheet sheet = workbook.getSheetAt(sheetIndex);
            // èŽ·å–åˆ—ä¿¡æ¯
            List<ColumnInfo> columns = this.getColumns();
            List<T> data = new ArrayList<>();
            // å¾ªçŽ¯èŽ·å–excel行记录
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                // æž„造数据实例对象
                T instance = modelClass.newInstance();
                Row row = sheet.getRow(i);
                // å¾ªçŽ¯èŽ·å–å•å…ƒæ ¼ä¿¡æ¯
                for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) {
                    Cell cell = row.getCell(columnIndex);
                    if (cell == null) {
                        continue;
                    }
                    if (StringUtils.isBlank(cell.toString())) {
                        continue;
                    }
                    ColumnInfo columnInfo = columns.get(columnIndex);
                    if (columnInfo == null) {
                        break;
                    }
                    // å†™å…¥å¯¹è±¡å±žæ€§
                    columnInfo.getField().setAccessible(Boolean.TRUE);
                    columnInfo.getField().set(instance, this.getCellValue(cell, columnInfo));
                    columnInfo.getField().setAccessible(Boolean.FALSE);
                }
                // å¦‚果是空行则结束行读取
                if (this.isEmptyRow(instance)) {
                    break;
                }
                data.add(instance);
            }
            // æ‰§è¡Œå›žè°ƒå‡½æ•°
            return callback.callback(data, sync);
        } catch (Exception e) {
            throw new BusinessException(ResponseStatus.IMPORT_EXCEL_ERROR, e);
        }  finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    public ExcelImporter(String fileName, int headerNum, int sheetIndex)
        throws InvalidFormatException, IOException {
        this(new File(fileName), headerNum, sheetIndex);
    }
    /**
     * æž„造函数
     * @param--path å¯¼å…¥æ–‡ä»¶å¯¹è±¡
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1
     * @param sheetIndex å·¥ä½œè¡¨ç¼–号
     * @throws InvalidFormatException
     * @throws IOException
     */
    public ExcelImporter(File file, int headerNum, int sheetIndex)
        throws InvalidFormatException, IOException {
        this(file.getName(), new FileInputStream(file), headerNum, sheetIndex);
    }
    /**
     * æž„造函数 (重要)
     * @param--file å¯¼å…¥æ–‡ä»¶å¯¹è±¡
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1
     * @param sheetIndex å·¥ä½œè¡¨ç¼–号
     * @throws InvalidFormatException
     * @throws IOException
     */
    public ExcelImporter(MultipartFile multipartFile, int headerNum, int sheetIndex)
        throws InvalidFormatException, IOException {
        this(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), headerNum, sheetIndex);
    }
    /**
     * æž„造函数 (重要)
     * @param--file å¯¼å…¥æ–‡ä»¶å¯¹è±¡
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1
     * @param sheetIndex å·¥ä½œè¡¨ç¼–号
     * @throws InvalidFormatException
     * @throws IOException
     */
    public ExcelImporter(MultipartFile multipartFile, int headerNum, int sheetIndex, CellType cellType)
        throws InvalidFormatException, IOException {
        this(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), headerNum, sheetIndex,cellType);
    }
    /**
     * æž„造函数 ï¼ˆï¼‰
     * @param--path å¯¼å…¥æ–‡ä»¶å¯¹è±¡
     * @param headerNum æ ‡é¢˜è¡Œå·ï¼Œæ•°æ®è¡Œå·=标题行号+1
     * @param sheetIndex å·¥ä½œè¡¨ç¼–号 (eg: 0)
     * @throws InvalidFormatException
     * @throws IOException
     */
    public ExcelImporter(String fileName, InputStream in, int headerNum, int sheetIndex)
        throws InvalidFormatException, IOException {
        if (StringUtils.isBlank(fileName)){
            throw new RuntimeException("导入文档为空!");
        }else if(fileName.toLowerCase().endsWith("xls")){
            this.wb = new HSSFWorkbook(in);
        }else if(fileName.toLowerCase().endsWith("xlsx")){
            this.wb = new XSSFWorkbook(in);
        }else{
            throw new RuntimeException("文档格式不正确!");
        }
        if (this.wb.getNumberOfSheets()<sheetIndex){
            throw new RuntimeException("文档中没有工作表!");
        }
        this.sheet = this.wb.getSheetAt(sheetIndex);
        this.headerNum = headerNum;
        log.debug("Initialize success.");
    }
    public ExcelImporter(String fileName, InputStream in, int headerNum, int sheetIndex,CellType cellType)
        throws InvalidFormatException, IOException {
        if (StringUtils.isBlank(fileName)){
            throw new RuntimeException("导入文档为空!");
        }else if(fileName.toLowerCase().endsWith("xls")){
            this.wb = new HSSFWorkbook(in);
        }else if(fileName.toLowerCase().endsWith("xlsx")){
            this.wb = new XSSFWorkbook(in);
        }else{
            throw new RuntimeException("文档格式不正确!");
        }
        if (this.wb.getNumberOfSheets()<sheetIndex){
            throw new RuntimeException("文档中没有工作表!");
        }
        this.sheet = this.wb.getSheetAt(sheetIndex);
        this.headerNum = headerNum;
        this.changeType = cellType;
        log.debug("Initialize success.");
    }
    /**
     * èŽ·å–è¡Œå¯¹è±¡
     * @param rownum
     * @return
     */
    public Row getRow(int rownum){
        return this.sheet.getRow(rownum);
    }
    /**
     * èŽ·å–Cell值
     *
     * @param cell å•元格对象
     * @param columnInfo åˆ—配置
     * èŽ·å–æ•°æ®è¡Œå·
     * @return
     */
    public int getDataRowNum(){
        return headerNum+1;
    }
    /**
     * èŽ·å–æœ€åŽä¸€ä¸ªæ•°æ®è¡Œå·
     * @return
     */
    public int getLastDataRowNum(){
        return this.sheet.getLastRowNum()+headerNum;
    }
    /**
     * èŽ·å–æœ€åŽä¸€ä¸ªåˆ—å·
     * @return
     */
    public int getLastCellNum(){
        return this.getRow(headerNum).getLastCellNum();
    }
    /**
     * èŽ·å–å•å…ƒæ ¼å€¼
     * @param row èŽ·å–çš„è¡Œ
     * @param column èŽ·å–å•å…ƒæ ¼åˆ—å·
     * @return å•元格值
     */
    private Object getCellValue (Cell cell, ColumnInfo columnInfo) {
        CellType cellType = cell.getCellType();
        Type fieldType = columnInfo.getField().getGenericType();
        Object value = null;
        if (fieldType.getTypeName().equals("java.util.Date")) {
            value = cell.getDateCellValue();
        } else if (cellType.equals(CellType.NUMERIC)) {
            value = cell.getNumericCellValue();
        } else if (cellType.equals(CellType.STRING)) {
            value = cell.getStringCellValue();
        } else if (cellType.equals(CellType.BOOLEAN)) {
            value = cell.getBooleanCellValue();
        } else if (cellType.equals(CellType.BLANK)) {
            value = "";
        } else if (cellType.equals(CellType.ERROR)) {
            value = cell.getErrorCellValue();
        }
        // è°ƒç”¨è½¬æ¢å™¨
        if (!columnInfo.columnConfig.converter().equals(ExcelDataConverterAdapter.class)) {
            try {
                Object instance = columnInfo.columnConfig.converter().newInstance();
                Method convertMethod = columnInfo.columnConfig.converter().getMethod("convert", Object[].class);
                List<Object> args = new ArrayList<>();
                args.add(value);
                for (String arg : columnInfo.columnConfig.args()) {
                    args.add(arg);
    public Object getCellValue(Row row, int column){
        Object val = "";
        try{
            Cell cell = row.getCell(column);
            if (cell != null){
                if (cell.getCellType() == CellType.NUMERIC){
                    cell.setCellType(CellType.STRING); // ç¡®ä¿å•元格类型为字符串
                    val = cell.getStringCellValue();
                }else if (cell.getCellType() == CellType.STRING){
                    val = cell.getStringCellValue();
                }else if (cell.getCellType() == CellType.FORMULA){
                    val = cell.getCellFormula();
                }else if (cell.getCellType() == CellType.BOOLEAN){
                    val = cell.getBooleanCellValue();
                }else if (cell.getCellType() == CellType.ERROR){
                    val = cell.getErrorCellValue();
                }
                value = convertMethod.invoke(instance, new Object[]{args.toArray()});
            } catch (Exception e) {
                throw new IllegalStateException("EVA: can not convert data by " + columnInfo.columnConfig.converter(), e);
            }
        }catch (Exception e) {
            return val;
        }
        return value;
        return val;
    }
    /**
     * èŽ·å–åˆ—é›†åˆ
     * èŽ·å–å¯¼å…¥æ•°æ®åˆ—è¡¨
     * @param cls å¯¼å…¥å¯¹è±¡ç±»åž‹
     * @param groups å¯¼å…¥åˆ†ç»„  å¯ä¸ºç©º
     */
    private List<ColumnInfo> getColumns () {
        Map<Integer, ColumnInfo> sortedFields = new TreeMap<>();
        Field[] fields = modelClass.getDeclaredFields();
        int index = 0;
        for (Field field : fields) {
            ExcelImportColumn excelColumn = field.getAnnotation(ExcelImportColumn.class);
            if (excelColumn == null) {
    public <E> List<E> getDataList(Class<E> cls, int... groups) throws InstantiationException, IllegalAccessException{
        List<Object[]> annotationList = new ArrayList<>();
        // Get annotation field
        Field[] fs = cls.getDeclaredFields();
        for (Field f : fs){
            ExcelColumn ef = f.getAnnotation(ExcelColumn.class);
            if (ef != null && (ef.type()==0 || ef.type()==2)){
                if (groups!=null && groups.length>0){
                    boolean inGroup = false;
                    for (int g : groups){
                        if (inGroup){
                            break;
                        }
                        for (int efg : ef.groups()){
                            if (g == efg){
                                inGroup = true;
                                annotationList.add(new Object[]{ef, f});
                                break;
                            }
                        }
                    }
                }else{
                    annotationList.add(new Object[]{ef, f});
                }
            }
        }
        // Get annotation method
        Method[] ms = cls.getDeclaredMethods();
        for (Method m : ms){
            ExcelColumn ef = m.getAnnotation(ExcelColumn.class);
            if (ef != null && (ef.type()==0 || ef.type()==2)){
                if (groups!=null && groups.length>0){
                    boolean inGroup = false;
                    for (int g : groups){
                        if (inGroup){
                            break;
                        }
                        for (int efg : ef.groups()){
                            if (g == efg){
                                inGroup = true;
                                annotationList.add(new Object[]{ef, m});
                                break;
                            }
                        }
                    }
                }else{
                    annotationList.add(new Object[]{ef, m});
                }
            }
        }
        // Field sorting
        Collections.sort(annotationList, (o1, o2) -> {
            int index1 =((ExcelColumn)o1[0]).index(), index2=((ExcelColumn)o2[0]).index();
            if(index1 == -1){
                index1  = annotationList.size()+99999;
            }
            if(index2 == -1){
                index2  = annotationList.size()+99999;
            }
            return new Integer(index1).compareTo(new Integer(index2));
        });
        //log.debug("Import column count:"+annotationList.size());
        // Get excel data
        List<E> dataList = new ArrayList<>();
        System.out.println("起始数据行:"+getDataRowNum());
        System.out.println("结束数据行:"+getLastDataRowNum());
        for (int i = this.getDataRowNum(); i <= this.getLastDataRowNum(); i++) {
            E e = (E)cls.newInstance();
            int column = 0;
            Row row = this.getRow(i);
            if (Objects.isNull(row)){
                continue;
            }
            if (sortedFields.get(excelColumn.index()) != null) {
                throw new AnnotationConfigurationException("EVA: Excel column contains the same index.");
            StringBuilder sb = new StringBuilder();
            for (Object[] os : annotationList){
                Object val = this.getCellValue(row, column++);
                if (val != null){
                    ExcelColumn ef = (ExcelColumn)os[0];
                    // Get param type and type cast
                    Class<?> valType = Class.class;
                    if (os[1] instanceof Field){
                        valType = ((Field)os[1]).getType();
                    }else if(os[1] instanceof Method){
                        Method method = ((Method)os[1]);
                        if ("get".equals(method.getName().substring(0, 3))){
                            valType = method.getReturnType();
                        }else if("set".equals(method.getName().substring(0, 3))){
                            valType = ((Method)os[1]).getParameterTypes()[0];
                        }
                    }
                    //log.debug("Import value type: ["+i+","+column+"] " + valType);
                    try {
                        if (valType == String.class){
                            String s = String.valueOf(val.toString());
                            if(StringUtils.endsWith(s, ".0")){
                                val = StringUtils.substringBefore(s, ".0");
                            }else{
                                val = String.valueOf(val.toString()).trim();
                            }
                        }
                        else if (valType == Integer.class){
                            val = Double.valueOf(val.toString()).intValue();
                        }else if (valType == Long.class){
                            val = Double.valueOf(val.toString()).longValue();
                        }else if (valType == Double.class){
                            val = Double.valueOf(val.toString());
                        }else if (valType == Float.class){
                            val = Float.valueOf(val.toString());
                        }else if (valType == Date.class){
                            val = DateUtil.getJavaDate((Double)val);
                        }else{
                            if (ef.fieldType() != Class.class){
                                val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
                            }else{
                                val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
                                    "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString());
                            }
                        }
                    } catch (Exception ex) {
                        log.info("Get cell value ["+i+","+column+"] error: " + ex.toString());
                        val = null;
                    }
                    // set entity value
                    if (os[1] instanceof Field){
                        Reflections.invokeSetter(e, ((Field)os[1]).getName(), val);
                    }else if (os[1] instanceof Method){
                        String mthodName = ((Method)os[1]).getName();
                        if ("get".equals(mthodName.substring(0, 3))){
                            mthodName = "set"+StringUtils.substringAfter(mthodName, "get");
                        }
                        Reflections.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val});
                    }
                }
                sb.append(val+", ");
            }
            sortedFields.put(excelColumn.index() == -1 ? index : excelColumn.index(), new ColumnInfo(excelColumn, field));
            index++;
            dataList.add(e);
            log.debug("Read success: ["+i+"] "+sb.toString());
        }
        return new ArrayList<>(sortedFields.values());
        return dataList;
    }
    /**
     * åˆ¤æ–­æ˜¯å¦ä¸ºç©ºè¡Œ
     *
     * @param row è¡Œå¯¹è±¡
     * @return Boolean
     *  å…³é—­æµ æ¸…理临时文件
     */
    private boolean isEmptyRow(Object row) throws IllegalAccessException{
        Field[] fields = row.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(Boolean.TRUE);
            if (field.get(row) != null) {
                field.setAccessible(Boolean.FALSE);
                return Boolean.FALSE;
    public void dispose(){
        try {
            if(wb!=null){
                wb.close();
            }
            field.setAccessible(Boolean.FALSE);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return Boolean.TRUE;
    }
    /**
     * åˆ—信息
     */
    @Data
    @AllArgsConstructor
    private static class ColumnInfo {
        // åˆ—配置
        private ExcelImportColumn columnConfig;
        // å­—段信息
        private Field field;
    }
}
}
server/src/main/java/com/doumee/core/annotation/excel/Reflections.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,294 @@
package com.doumee.core.annotation.excel;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import java.lang.reflect.*;
/**
 * åå°„工具类.
 * æä¾›è°ƒç”¨getter/setter方法, è®¿é—®ç§æœ‰å˜é‡, è°ƒç”¨ç§æœ‰æ–¹æ³•, èŽ·å–æ³›åž‹ç±»åž‹Class, è¢«AOP过的真实类等工具函数.
 */
@SuppressWarnings("rawtypes")
public class Reflections {
    private static final String SETTER_PREFIX = "set";
    private static final String GETTER_PREFIX = "get";
    private static final String CGLIB_CLASS_SEPARATOR = "$$";
    private static Logger logger = LoggerFactory.getLogger(Reflections.class);
    /**
     * è°ƒç”¨Getter方法.
     * æ”¯æŒå¤šçº§ï¼Œå¦‚:对象名.对象名.方法
     */
    public static Object invokeGetter(Object obj, String propertyName) {
        Object object = obj;
        for (String name : StringUtils.split(propertyName, ".")){
            String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
            object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
        }
        return object;
    }
    /**
     * è°ƒç”¨Setter方法, ä»…匹配方法名。
     * æ”¯æŒå¤šçº§ï¼Œå¦‚:对象名.对象名.方法
     */
    public static void invokeSetter(Object obj, String propertyName, Object value) {
        Object object = obj;
        String[] names = StringUtils.split(propertyName, ".");
        for (int i=0; i<names.length; i++){
            if(i<names.length-1){
                String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
                object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
            }else{
                String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
                invokeMethodByName(object, setterMethodName, new Object[] { value });
            }
        }
    }
    /**
     * ç›´æŽ¥è¯»å–对象属性值, æ— è§†private/protected修饰符, ä¸ç»è¿‡getter函数.
     */
    public static Object getFieldValue(final Object obj, final String fieldName) {
        Field field = getAccessibleField(obj, fieldName);
        if (field == null) {
            throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
        }
        Object result = null;
        try {
            result = field.get(obj);
        } catch (IllegalAccessException e) {
            logger.error("非法访问的异常{}", e.getMessage());
        }
        return result;
    }
    /**
     * ç›´æŽ¥è®¾ç½®å¯¹è±¡å±žæ€§å€¼, æ— è§†private/protected修饰符, ä¸ç»è¿‡setter函数.
     */
    public static void setFieldValue(final Object obj, final String fieldName, final Object value) {
        Field field = getAccessibleField(obj, fieldName);
        if (field == null) {
            throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
        }
        try {
            field.set(obj, value);
        } catch (IllegalAccessException e) {
            logger.error("非法访问的异常:{}", e.getMessage());
        }
    }
    /**
     * ç›´æŽ¥è°ƒç”¨å¯¹è±¡æ–¹æ³•, æ— è§†private/protected修饰符.
     * ç”¨äºŽä¸€æ¬¡æ€§è°ƒç”¨çš„æƒ…况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
     * åŒæ—¶åŒ¹é…æ–¹æ³•名+参数类型,
     */
    public static Object invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
        final Object[] args) {
        Method method = getAccessibleMethod(obj, methodName, parameterTypes);
        if (method == null) {
            throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
        }
        try {
            return method.invoke(obj, args);
        } catch (Exception e) {
            throw convertReflectionExceptionToUnchecked(e);
        }
    }
    /**
     * ç›´æŽ¥è°ƒç”¨å¯¹è±¡æ–¹æ³•, æ— è§†private/protected修饰符,
     * ç”¨äºŽä¸€æ¬¡æ€§è°ƒç”¨çš„æƒ…况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
     * åªåŒ¹é…å‡½æ•°åï¼Œå¦‚果有多个同名函数调用第一个。
     */
    public static Object invokeMethodByName(final Object obj, final String methodName, final Object[] args) {
        Method method = getAccessibleMethodByName(obj, methodName);
        if (method == null) {
            throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
        }
        try {
            return method.invoke(obj, args);
        } catch (Exception e) {
            throw convertReflectionExceptionToUnchecked(e);
        }
    }
    /**
     * å¾ªçŽ¯å‘ä¸Šè½¬åž‹, èŽ·å–å¯¹è±¡çš„DeclaredField, å¹¶å¼ºåˆ¶è®¾ç½®ä¸ºå¯è®¿é—®.
     *
     * å¦‚向上转型到Object仍无法找到, è¿”回null.
     */
    public static Field getAccessibleField(final Object obj, final String fieldName) {
        Validate.notNull(obj, "object can't be null");
        Validate.notBlank(fieldName, "fieldName can't be blank");
        for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
            try {
                Field field = superClass.getDeclaredField(fieldName);
                makeAccessible(field);
                return field;
            } catch (NoSuchFieldException e) {//NOSONAR
                // Field不在当前类定义,继续向上转型
                continue;// new add
            }
        }
        return null;
    }
    /**
     * å¾ªçŽ¯å‘ä¸Šè½¬åž‹, èŽ·å–å¯¹è±¡çš„DeclaredMethod,并强制设置为可访问.
     * å¦‚向上转型到Object仍无法找到, è¿”回null.
     * åŒ¹é…å‡½æ•°å+参数类型。
     *
     * ç”¨äºŽæ–¹æ³•需要被多次调用的情况. å…ˆä½¿ç”¨æœ¬å‡½æ•°å…ˆå–å¾—Method,然后调用Method.invoke(Object obj, Object... args)
     */
    public static Method getAccessibleMethod(final Object obj, final String methodName,
        final Class<?>... parameterTypes) {
        Validate.notNull(obj, "object can't be null");
        Validate.notBlank(methodName, "methodName can't be blank");
        for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
            try {
                Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
                makeAccessible(method);
                return method;
            } catch (NoSuchMethodException e) {
                // Method不在当前类定义,继续向上转型
                continue;// new add
            }
        }
        return null;
    }
    /**
     * å¾ªçŽ¯å‘ä¸Šè½¬åž‹, èŽ·å–å¯¹è±¡çš„DeclaredMethod,并强制设置为可访问.
     * å¦‚向上转型到Object仍无法找到, è¿”回null.
     * åªåŒ¹é…å‡½æ•°åã€‚
     *
     * ç”¨äºŽæ–¹æ³•需要被多次调用的情况. å…ˆä½¿ç”¨æœ¬å‡½æ•°å…ˆå–å¾—Method,然后调用Method.invoke(Object obj, Object... args)
     */
    public static Method getAccessibleMethodByName(final Object obj, final String methodName) {
        Validate.notNull(obj, "object can't be null");
        Validate.notBlank(methodName, "methodName can't be blank");
        for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
            Method[] methods = searchType.getDeclaredMethods();
            for (Method method : methods) {
                if (method.getName().equals(methodName)) {
                    makeAccessible(method);
                    return method;
                }
            }
        }
        return null;
    }
    /**
     * æ”¹å˜private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
     */
    public static void makeAccessible(Method method) {
        if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
            && !method.isAccessible()) {
            method.setAccessible(true);
        }
    }
    /**
     * æ”¹å˜private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
     */
    public static void makeAccessible(Field field) {
        if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier
            .isFinal(field.getModifiers())) && !field.isAccessible()) {
            field.setAccessible(true);
        }
    }
    /**
     * é€šè¿‡åå°„, èŽ·å¾—Class定义中声明的泛型参数的类型, æ³¨æ„æ³›åž‹å¿…须定义在父类处
     * å¦‚无法找到, è¿”回Object.class.
     * eg.
     * public UserDao extends HibernateDao<User>
     *
     * @param clazz The class to introspect
     * @return the first generic declaration, or Object.class if cannot be determined
     */
    @SuppressWarnings("unchecked")
    public static <T> Class<T> getClassGenricType(final Class clazz) {
        return getClassGenricType(clazz, 0);
    }
    /**
     * é€šè¿‡åå°„, èŽ·å¾—Class定义中声明的父类的泛型参数的类型.
     * å¦‚无法找到, è¿”回Object.class.
     *
     * å¦‚public UserDao extends HibernateDao<User,Long>
     *
     * @param clazz clazz The class to introspect
     * @param index the Index of the generic ddeclaration,start from 0.
     * @return the index generic declaration, or Object.class if cannot be determined
     */
    public static Class getClassGenricType(final Class clazz, final int index) {
        Type genType = clazz.getGenericSuperclass();
        if (!(genType instanceof ParameterizedType)) {
            logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
            return Object.class;
        }
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        if (index >= params.length || index < 0) {
            logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
                + params.length);
            return Object.class;
        }
        if (!(params[index] instanceof Class)) {
            logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
            return Object.class;
        }
        return (Class) params[index];
    }
    public static Class<?> getUserClass(Object instance) {
        Assert.notNull(instance, "Instance must not be null");
        Class clazz = instance.getClass();
        if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) {
            Class<?> superClass = clazz.getSuperclass();
            if (superClass != null && !Object.class.equals(superClass)) {
                return superClass;
            }
        }
        return clazz;
    }
    /**
     * å°†åå°„æ—¶çš„checked exception转换为unchecked exception.
     */
    public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) {
        if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
            || e instanceof NoSuchMethodException) {
            return new IllegalArgumentException(e);
        } else if (e instanceof InvocationTargetException) {
            return new RuntimeException(((InvocationTargetException) e).getTargetException());
        } else if (e instanceof RuntimeException) {
            return (RuntimeException) e;
        }
        return new RuntimeException("Unexpected Checked Exception.", e);
    }
}
server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java
ÎļþÒÑɾ³ý
server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java
ÎļþÒÑɾ³ý
server/src/main/java/com/doumee/dao/business/model/Category.java
@@ -1,14 +1,13 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
@@ -24,65 +23,50 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "名称")
    @ExcelExportColumn(name="名称")
    private String name;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "1")
    @ExcelExportColumn(name="状态 0启用 1禁用")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "图标")
    @ExcelExportColumn(name="图标")
    private String imgurl;
    @ApiModelProperty(value = "类型 0SHE伤害类型 1跌绊滑伤害类型 2跌绊滑发生地点 3DCA位置 4DCA主题 5SHE风险地点 6DCA观察项", example = "1")
    @ExcelExportColumn(name="类型 0SHE伤害类型 1跌绊滑伤害类型 2跌绊滑发生地点 3DCA位置 4DCA主题 5SHE风险地点 6DCA观察项")
    private Integer type;
    @ApiModelProperty(value = "父级编码(自关联)", example = "1")
    @ExcelExportColumn(name="父级编码(自关联)")
    private Integer parentId;
    @ApiModelProperty(value = "名称路径")
    @ExcelExportColumn(name="名称路径")
    private String namePath;
    @ApiModelProperty(value = "编码路径")
    @ExcelExportColumn(name="编码路径")
    private String idPath;
    @ApiModelProperty(value = "上级名称")
    @TableField(exist = false)
server/src/main/java/com/doumee/dao/business/model/Company.java
@@ -1,14 +1,13 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
@@ -24,76 +23,58 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "名称")
    @ExcelExportColumn(name="名称")
    private String name;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0正常 1禁用", example = "1")
    @ExcelExportColumn(name="状态 0正常 1禁用")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "头像")
    @ExcelExportColumn(name="头像")
    private String imgurl;
    @ApiModelProperty(value = "类型", example = "1")
    @ExcelExportColumn(name="类型")
    private Integer type;
    @ApiModelProperty(value = "所属父级编码(关联company)", example = "1")
    @ExcelExportColumn(name="所属父级编码(关联company)")
    private Integer parentId;
    @ApiModelProperty(value = "编码")
    @ExcelExportColumn(name="编码")
    private String code;
    @ApiModelProperty(value = "企微标识")
    @ExcelExportColumn(name="企微标识")
    private String qwId;
    @ApiModelProperty(value = "名称路径")
    @ExcelExportColumn(name="名称路径")
    private String namePath;
    @ApiModelProperty(value = "编码路径")
    @ExcelExportColumn(name="编码路径")
    private String idPath;
    @ApiModelProperty(value = "企业微信所属父级编码(关联company)", example = "1")
    @ExcelExportColumn(name="企业微信所属父级编码(关联company)")
    private String qwParentId;
server/src/main/java/com/doumee/dao/business/model/CompanyMember.java
@@ -1,13 +1,12 @@
package com.doumee.dao.business.model;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
@@ -22,52 +21,40 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "所属组织编码(关联company)", example = "1")
    @ExcelExportColumn(name="所属组织编码(关联company)")
    private Integer companyId;
    @ApiModelProperty(value = "所属组织编码路径 ", example = "1")
    @ExcelExportColumn(name="所属组织编码路径 ")
    private String companyIdPath;
    @ApiModelProperty(value = "人员编码(关联member", example = "1")
    @ExcelExportColumn(name="人员编码(关联member")
    private Integer memberId;
    @ApiModelProperty(value = "是否为部门负责人0-否;1-是", example = "1")
    @ExcelExportColumn(name="是否为部门负责人0-否;1-是")
    private Integer isLeader;
}
server/src/main/java/com/doumee/dao/business/model/Managers.java
@@ -1,14 +1,13 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
@@ -23,53 +22,41 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "所属分类编(关联category)")
    @ExcelExportColumn(name="所属分类编(关联category)")
    private String categoryId;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "1")
    @ExcelExportColumn(name="状态 0启用 1禁用")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "类型 0SHE负责人 1DCA手动抄送人员 2DCA权限人员", example = "1")
    @ExcelExportColumn(name="类型 0SHE负责人 1DCA手动抄送人员 2DCA权限人员")
    private Integer type;
    @ApiModelProperty(value = "人员编码(关联member)", example = "1")
    @ExcelExportColumn(name="人员编码(关联member)")
    private Integer memberId;
    @ApiModelProperty(value = "组织名称")
    @TableField(exist = false)
server/src/main/java/com/doumee/dao/business/model/Member.java
@@ -1,14 +1,13 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
@@ -24,89 +23,68 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "姓名")
    @ExcelExportColumn(name="姓名")
    private String name;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0正常 1禁用", example = "1")
    @ExcelExportColumn(name="状态 0正常 1禁用")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "头像")
    @ExcelExportColumn(name="头像")
    private String imgurl;
    @ApiModelProperty(value = "类型", example = "1")
    @ExcelExportColumn(name="类型")
    private Integer type;
    @ApiModelProperty(value = "所属组织编码(关联company)", example = "1")
    @ExcelExportColumn(name="所属组织编码(关联company)")
    private String companyId;
    @ApiModelProperty(value = "手机号")
    @ExcelExportColumn(name="手机号")
    private String phone;
    @ApiModelProperty(value = "邮箱")
    @ExcelExportColumn(name="邮箱")
    private String email;
    @ApiModelProperty(value = "性别 0男 1女 2位置", example = "1")
    @ExcelExportColumn(name="性别 0男 1女 2位置")
    private Integer sex;
    @ApiModelProperty(value = "工号")
    @ExcelExportColumn(name="工号")
    private String code;
    @ApiModelProperty(value = "企微标识")
    @ExcelExportColumn(name="企微标识")
    private String qwId;
    @ApiModelProperty(value = "证件号")
    @ExcelExportColumn(name="证件号")
    private String idcard;
    @ApiModelProperty(value = "最近上线时间")
    @ExcelExportColumn(name="最近上线时间")
    private Date lastLoginDate;
    @ApiModelProperty(value = "登录次数", example = "1")
    @ExcelExportColumn(name="登录次数")
    private Integer loginCount;
    @ApiModelProperty(value = "是否包含下级组织用户")
server/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -1,14 +1,11 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
@@ -22,63 +19,49 @@
public class Multifile {
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "文件名")
    @ExcelExportColumn(name="文件名")
    private String name;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "关联对象编码", example = "1")
    @ExcelExportColumn(name="关联对象编码")
    private Integer objId;
    @ApiModelProperty(value = "类型0图片 1视频 2其他", example = "1")
    @ExcelExportColumn(name="类型0图片 1视频 2其他")
    private Integer type;
//    @ApiModelProperty(value = "关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片", example = "1")
//    @ExcelExportColumn(name="关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片")
    @ApiModelProperty(value = "关联对象类型 0工单上报 1工单处理 2工单转交", example = "1")
    @ExcelExportColumn(name="关联对象类型 0工单上报 1工单处理 2工单转交")
    private Integer objType;
    @ApiModelProperty(value = "文件地址")
    @ExcelExportColumn(name="文件地址")
    private String fileurl;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "企业编码(关联company表)", example = "1")
    @ExcelExportColumn(name="企业编码(关联company表)")
    private Integer companyId;
    @ApiModelProperty(value = "文件地址")
server/src/main/java/com/doumee/dao/business/model/Notices.java
@@ -1,13 +1,12 @@
package com.doumee.dao.business.model;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
@@ -22,108 +21,83 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "标题")
    @ExcelExportColumn(name="标题")
    private String title;
    @ApiModelProperty(value = "简介")
    @ExcelExportColumn(name="简介")
    private String info;
    @ApiModelProperty(value = "内容")
    @ExcelExportColumn(name="内容")
    private String content;
    @ApiModelProperty(value = "关联对象编码", example = "1")
    @ExcelExportColumn(name="关联对象编码")
    private Integer objId;
    @ApiModelProperty(value = "关联对象类型 0工单")
    @ExcelExportColumn(name="关联对象类型 0工单")
    private String objType;
    @ApiModelProperty(value = "关联对象名称")
    @ExcelExportColumn(name="关联对象名称")
    private String objName;
    @ApiModelProperty(value = "类型 0工单上报 1抄送 2转交")
    private String type;
    @ApiModelProperty(value = "用户企微主键")
    @ExcelExportColumn(name="关联参数1")
    private String param1;
    @ApiModelProperty(value = "关联参数2")
    @ExcelExportColumn(name="关联参数2")
    private String param2;
    @ApiModelProperty(value = "关联参数3")
    @ExcelExportColumn(name="关联参数3")
    private String param3;
    @ApiModelProperty(value = "关联参数4")
    @ExcelExportColumn(name="关联参数4")
    private String param4;
    @ApiModelProperty(value = "关联参数5")
    @ExcelExportColumn(name="关联参数5")
    private String param5;
    @ApiModelProperty(value = "关联用户姓名")
    @ExcelExportColumn(name="关联用户姓名")
    private String memberName;
    @ApiModelProperty(value = "关联用户企微编码")
    @ExcelExportColumn(name="关联用户企微编码")
    private String qwId;
    @ApiModelProperty(value = "关联用户编码(关联member)", example = "1")
    @ExcelExportColumn(name="关联用户编码(关联member)")
    private Integer memberId;
    @ApiModelProperty(value = "关联企业组织编码(关联company)", example = "1")
    @ExcelExportColumn(name="关联企业组织编码(关联company)")
    private Integer companyId;
    @ApiModelProperty(value = "状态 0正常 1已关闭", example = "1")
    @ExcelExportColumn(name="状态 0正常 1已关闭")
    private Integer status;
    @ApiModelProperty(value = "是否抄送 0不是 1是", example = "1")
    @ExcelExportColumn(name="是否抄送 0不是 1是")
    private Integer sendacopy;
    @ApiModelProperty(value = "是否已读 0未读 1已读", example = "1")
    @ExcelExportColumn(name="是否已读 0未读 1已读")
    private Integer readed;
}
server/src/main/java/com/doumee/dao/business/model/Workorder.java
@@ -1,7 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import com.doumee.dao.web.dto.DCANoProblemDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -25,179 +24,135 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "DCA分类(关联category)")
    @ExcelExportColumn(name="DCA分类(关联category)")
    private String categoryId;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理  3SHE关闭 4WTS关闭 5工程师关闭", example = "1")
    @ExcelExportColumn(name="状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理  3SHE关闭 4WTS关闭 5工程师关闭")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelExportColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "类型 0SHE事件 1DCA事件提交记录 2DCA工单 3跌绊滑事件", example = "1")
    @ExcelExportColumn(name="类型 0SHE事件 1DCA事件提交记录 2DCA工单 3跌绊滑事件")
    private Integer type;
    @ApiModelProperty(value = "上报人员编码(关联member)", example = "1")
    @ExcelExportColumn(name="上报人员编码(关联member)")
    private Integer memberId;
    @ApiModelProperty(value = "部门编码", example = "1")
    @ExcelExportColumn(name="部门编码")
    private Integer companyId;
    @ApiModelProperty(value = "上报时间", example = "1")
    @ExcelExportColumn(name="上报时间")
    private Date submitDate;
    @ApiModelProperty(value = "SHE涉及人员类型 0本人 1同事 2供应商", example = "1")
    @ExcelExportColumn(name="SHE涉及人员类型 0本人 1同事 2供应商")
    private Integer memberType;
    @ApiModelProperty(value = "SHE涉及人员企业编码集合")
    @ExcelExportColumn(name="SHE涉及人员企业编码集合")
    private String memberQwids;
    @ApiModelProperty(value = "SHE涉及人员供应商集合")
    @ExcelExportColumn(name="SHE涉及人员供应商集合")
    private String memberNames;
    @ApiModelProperty(value = "发生地点/位置编码(关联category)", example = "1")
    @ExcelExportColumn(name="发生地点/位置编码(关联category)")
    private Integer localtionId;
    @ApiModelProperty(value = "是否外部就医 0否 1是")
    @ExcelExportColumn(name="是否外部就医 0否 1是")
    private Integer outJiuyi;
    @ApiModelProperty(value = "是否医务室 0否 1是", example = "1")
    @ExcelExportColumn(name="是否医务室 0否 1是")
    private Integer isYiwushi;
    @ApiModelProperty(value = "是否受伤 0否 1是", example = "1")
    @ExcelExportColumn(name="是否受伤 0否 1是")
    private Integer isHurted;
    @ApiModelProperty(value = "是否和工作相关", example = "1")
    @ExcelExportColumn(name="是否和工作相关")
    private Integer workRelated;
    @ApiModelProperty(value = "事件说明", example = "1")
    @ExcelExportColumn(name="事件说明")
    private String eventInfo;
    @ApiModelProperty(value = "邮件通知人员编码集合")
    @ExcelExportColumn(name="邮件通知人员编码集合")
    private String emialMemberIds;
    @ApiModelProperty(value = "企业微信通知人员编码集合")
    @ExcelExportColumn(name="企业微信通知人员编码集合")
    private String qwnoticeMemberIds;
    @ApiModelProperty(value = "发生时间")
    @ExcelExportColumn(name="发生时间")
    private Date happenTime;
    @ApiModelProperty(value = "风险、伤害、观察主题类型(关联category)")
    @ExcelExportColumn(name="风险、伤害、观察主题类型(关联category)")
    private Integer typeId;
    @ApiModelProperty(value = "风险描述", example = "1")
    @ExcelExportColumn(name="风险描述")
    private String riskInfo;
    @ApiModelProperty(value = "当前物业主管企业微信编码", example = "1")
    @ExcelExportColumn(name="当前物业主管企业微信编码")
    private String managerId;
    @ApiModelProperty(value = "当前处理人员企业微信编码", example = "1")
    @ExcelExportColumn(name="当前处理人员企业微信编码")
    private String dealerId;
    @ApiModelProperty(value = "分配时间")
    @ExcelExportColumn(name="分配时间")
    private Date dispatchTime;
    @ApiModelProperty(value = "分配备注")
    @ExcelExportColumn(name="分配备注")
    private String dispatchInfo;
    @ApiModelProperty(value = "处理时间")
    @ExcelExportColumn(name="处理时间")
    private Date dealTime;
    @ApiModelProperty(value = "处理备注")
    @ExcelExportColumn(name="处理备注")
    private String dealInfo;
    @ApiModelProperty(value = "DCA问题标题")
    @ExcelExportColumn(name="DCA问题标题")
    private String problemTitle;
    @ApiModelProperty(value = "DCA问题编码(关联category)", example = "1")
    @ExcelExportColumn(name="DCA问题编码(关联category)")
    private Integer problemId;
    @ApiModelProperty(value = "DCA问题描述")
    @ExcelExportColumn(name="DCA问题描述")
    private String problemInfo;
    @ApiModelProperty(value = "位置地点路径名称")
    @ExcelExportColumn(name="位置地点路径名称")
    private String locationName;
    @ApiModelProperty(value = "工单号")
    @ExcelExportColumn(name="工单号")
    private String code;
    @ApiModelProperty(value = "DCA符合数量", example = "1")
    @ExcelExportColumn(name="DCA符合数量")
    private Integer dcaYesNum;
    @ApiModelProperty(value = "DCA不符合数量", example = "1")
    @ExcelExportColumn(name="DCA不符合数量")
    private Integer dcaNoNum;
    @ApiModelProperty(value = "DCA提交记录编码(自关联)", example = "1")
    @ExcelExportColumn(name="DCA提交记录编码(自关联)")
    private Integer dcaRecordId;
    @ApiModelProperty(value = "DCA工单抄送人员企业微信编码集合(多个英文逗号隔开)")
    @ExcelExportColumn(name="DCA工单抄送人员企业微信编码集合(多个英文逗号隔开)")
    private String dcaCsIds;
    @ApiModelProperty(value = "下次催促时间")
    @ExcelExportColumn(name="下次催促时间")
    private Date urgeDate;
    @ApiModelProperty("附件信息")
server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java
@@ -1,14 +1,13 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
@@ -24,77 +23,59 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelExportColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelExportColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelExportColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelExportColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelExportColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelExportColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "工单编码(关联workorder)", example = "1")
    @ExcelExportColumn(name="工单编码(关联workorder)")
    private Integer workorderId;
    @ApiModelProperty(value = "标题")
    @ExcelExportColumn(name="标题")
    private String title;
    @ApiModelProperty(value = "简介")
    @ExcelExportColumn(name="简介")
    private String content;
    @ApiModelProperty(value = "操作类型 0任务上报 1任务分配物业主管 2任务分配处理人 3任务处理关闭 4任务催促", example = "1")
    @ExcelExportColumn(name="操作类型 0任务上报 1任务分配物业主管 2任务分配处理人 3任务处理关闭 4任务催促")
    private Integer objType;
    @ApiModelProperty(value = "关联对象编码")
    @ExcelExportColumn(name="关联对象编码")
    private String objId;
    @ApiModelProperty(value = "操作前内容")
    @ExcelExportColumn(name="操作前内容")
    private String beforeContent;
    @ApiModelProperty(value = "操作后内容")
    @ExcelExportColumn(name="操作后内容")
    private String afterContent;
    @ApiModelProperty(value = "操作人")
    @ExcelExportColumn(name="参数1")
    private String param1;
    @ApiModelProperty(value = "处理人")
    @ExcelExportColumn(name="参数2")
    private String param2;
    @ApiModelProperty(value = "参数3")
    @ExcelExportColumn(name="参数3")
    private String param3;
    @ApiModelProperty(value = "参数4")
    @ExcelExportColumn(name="参数4")
    private String param4;
    @ApiModelProperty(value = "操作人名称")
server/src/main/java/com/doumee/dao/business/vo/WorkorderAllDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.doumee.dao.business.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.Multifile;
import com.doumee.dao.business.model.Workorder;
import com.doumee.dao.business.model.WorkorderLog;
import com.doumee.dao.web.dto.DCANoProblemDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
@Data
@ApiModel("工单导出信息")
public class WorkorderAllDto {
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="提交时间",index =10 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date createDate;
    @ApiModelProperty(value = "最近操作时间")
    @ExcelColumn(name="提交时间",index =10 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date editDate;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注",index =10  ,width = 10)
    private String remark;
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理   4WTS关闭 5工程师关闭", example = "1")
    @ExcelColumn(name="状态",index =13,width = 6, valueMapping = "0=待处理;1=待分配;2=待处理;3=SHE关闭;4=WTS关闭;5=工程师关闭;")
    private Integer status;
    @ApiModelProperty(value = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =10 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date submitDate;
    @ApiModelProperty(value = "SHE涉及人员供应商集合")
    private String memberNames;
    @ApiModelProperty(value = "是否外部就医")
    @ExcelColumn(name="是否外部就医",index =13,width = 6, valueMapping = "0=否;1=是;")
    private Integer outJiuyi;
    @ApiModelProperty(value = "是否医务室", example = "1")
    @ExcelColumn(name="是否医务室",index =13,width = 6, valueMapping = "0=否;1=是;")
    private Integer isYiwushi;
    @ApiModelProperty(value = "是否受伤", example = "1")
    @ExcelColumn(name="是否受伤",index =13,width = 6, valueMapping = "0=否;1=是;")
    private Integer isHurted;
    @ApiModelProperty(value = "是否和工作相关", example = "1")
    @ExcelColumn(name="是否和工作相关",index =13,width = 6, valueMapping = "0=否;1=是;")
    private Integer workRelated;
    @ApiModelProperty(value = "事件说明", example = "1")
    @ExcelColumn(name="事件说明",index =13,width = 6)
    private String eventInfo;
    @ApiModelProperty(value = "发生时间")
    @ExcelColumn(name="发生时间",index =10 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date happenTime;
    @ApiModelProperty(value = "风险描述", example = "1")
    @ExcelColumn(name="风险描述",index =13,width = 6)
    private String riskInfo;
    @ApiModelProperty(value = "观察项")
    @ExcelColumn(name="风险描述",index =13,width = 6)
    private String problemTitle;
    @ApiModelProperty(value = "DCA问题描述")
    @ExcelColumn(name="DCA问题描述",index =13,width = 6)
    private String problemInfo;
    @ApiModelProperty(value = "位置地点路径名称")
    @ExcelColumn(name="位置地点路径名称",index =13,width = 6)
    private String locationName;
    @ApiModelProperty(value = "符合项数量", example = "1")
    @ExcelColumn(name="符合项数量",index =13,width = 6)
    private Integer dcaYesNum;
    @ApiModelProperty(value = "DCA不符合数量", example = "1")
    @ExcelColumn(name="符合项数量",index =13,width = 6)
    private Integer dcaNoNum;
    @ApiModelProperty("提报人员名称")
    @ExcelColumn(name="提报人员",index =13,width = 6)
    private String memberName;
    @ApiModelProperty("员工手机号")
    @ExcelColumn(name="员工手机号",index =13,width = 6)
    private String memberPhone;
    @ApiModelProperty("提报人员所属部门")
    @ExcelColumn(name="所属部门",index =13,width = 6)
    private String companyName;
    @ApiModelProperty("风险类型名称")
    @ExcelColumn(name="风险类型",index =13,width = 6)
    private String typeName;
    @ApiModelProperty("二级主题名称")
    @ExcelColumn(name="二级主题",index =13,width = 6)
    @TableField(exist = false)
    private String categoryName;
}
server/src/main/java/com/doumee/dao/business/vo/WorkorderDbhDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
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;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
@Data
@ApiModel("跌绊滑工单导出信息")
public class WorkorderDbhDto {
    @ApiModelProperty(value = "序号")
    @ExcelColumn(name="序号",index =1  ,width = 4)
    private Long index;
    @ApiModelProperty(value = "工单号")
    @ExcelColumn(name="工单号",index =2  ,width = 8)
    private String code;
    @ApiModelProperty("风险类型")
    @ExcelColumn(name="风险类型",index =3,width = 6)
    private String typeName;
    @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 = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =5 ,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)
    private Date happenTime;
    @ApiModelProperty(value = "位置", example = "1")
    @ExcelColumn(name="位置",index =7 ,width = 6)
    private String locationName;
    @ApiModelProperty(value = "风险描述", example = "1")
    @ExcelColumn(name="riskInfo",index =11,width = 10)
    private String eventInfo;
    @ApiModelProperty("提报人员名称")
    @ExcelColumn(name="上报员工",index =12,width = 4)
    private String memberName;
    @ApiModelProperty("员工手机号")
    @ExcelColumn(name="员工手机号",index =13,width = 6)
    private String memberPhone;
    @ApiModelProperty("提报人员所属部门")
    @ExcelColumn(name="所属部门",index =14,width = 8)
    private String companyName;
    @ApiModelProperty(value = "提交时间")
    @ExcelColumn(name="提交时间",index =15 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date createDate;
}
server/src/main/java/com/doumee/dao/business/vo/WorkorderDcaChildDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
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;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
@Data
@ApiModel("DCA工单记录导出信息")
public class WorkorderDcaChildDto {
    @ApiModelProperty(value = "序号")
    @ExcelColumn(name="序号",index =1  ,width = 4)
    private Long index;
    @ApiModelProperty(value = "工单号")
    @ExcelColumn(name="工单号",index =2  ,width = 8)
    private String code;
    @ApiModelProperty("一级观察主题")
    @ExcelColumn(name="一级观察主题",index =3,width = 6)
    private String typeName;
    @ApiModelProperty("二级观察主题")
    @ExcelColumn(name="二级观察主题",index =4,width = 6)
    private String categoryName;
    @ApiModelProperty("不符合项")
    @ExcelColumn(name="不符合项",index =5,width = 10)
    private String problemTitle;
    @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 = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =7 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date submitDate;
    @ApiModelProperty(value = "发现时间", example = "1")
    @ExcelColumn(name="发现时间",index =8 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date happenTime;
    @ApiModelProperty(value = "位置", example = "1")
    @ExcelColumn(name="位置",index =9 ,width = 6)
    private String locationName;
    @ApiModelProperty(value = "问题描述", example = "1")
    @ExcelColumn(name="问题描述",index =10,width = 4)
    private String eventInfo;
    @ApiModelProperty("提报人员名称")
    @ExcelColumn(name="上报员工",index =12,width = 4)
    private String memberName;
    @ApiModelProperty("员工手机号")
    @ExcelColumn(name="员工手机号",index =13,width = 6)
    private String memberPhone;
    @ApiModelProperty("提报人员所属部门")
    @ExcelColumn(name="所属部门",index =14,width = 8)
    private String companyName;
    @ApiModelProperty(value = "提交时间")
    @ExcelColumn(name="提交时间",index =15 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date createDate;
}
server/src/main/java/com/doumee/dao/business/vo/WorkorderDcaDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
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;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
@Data
@ApiModel("DCA工单记录导出信息")
public class WorkorderDcaDto {
    @ApiModelProperty(value = "序号")
    @ExcelColumn(name="序号",index =1  ,width = 4)
    private Long index;
    @ApiModelProperty(value = "工单号")
    @ExcelColumn(name="工单号",index =2  ,width = 8)
    private String code;
    @ApiModelProperty("观察主题")
    @ExcelColumn(name="观察主题",index =3,width = 6)
    private String typeName;
    @ApiModelProperty(value = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =5 ,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)
    private Date happenTime;
    @ApiModelProperty(value = "符合项数量", example = "1")
    @ExcelColumn(name="符合项数量",index =7,width = 4)
    private Integer dcaYesNum;
    @ApiModelProperty(value = "不符合项数量", example = "1")
    @ExcelColumn(name="不符合项数量",index =8,width = 4)
    private Integer dcaNoNum;
    @ApiModelProperty("提报人员名称")
    @ExcelColumn(name="上报员工",index =12,width = 4)
    private String memberName;
    @ApiModelProperty("员工手机号")
    @ExcelColumn(name="员工手机号",index =13,width = 6)
    private String memberPhone;
    @ApiModelProperty("提报人员所属部门")
    @ExcelColumn(name="所属部门",index =14,width = 8)
    private String companyName;
    @ApiModelProperty(value = "提交时间")
    @ExcelColumn(name="提交时间",index =15 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date createDate;
}
server/src/main/java/com/doumee/dao/business/vo/WorkorderSheDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.doumee.dao.business.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Multifile;
import com.doumee.dao.business.model.Workorder;
import com.doumee.dao.business.model.WorkorderLog;
import com.doumee.dao.web.dto.DCANoProblemDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
@Data
@ApiModel("SHE工单导出信息")
public class WorkorderSheDto {
    @ApiModelProperty(value = "序号")
    @ExcelColumn(name="序号",index =1  ,width = 4)
    private Long index;
    @ApiModelProperty(value = "工单号")
    @ExcelColumn(name="工单号",index =2  ,width = 8)
    private String code;
    @ApiModelProperty("伤害类型")
    @ExcelColumn(name="伤害类型",index =3,width = 6)
    private String typeName;
    @ApiModelProperty(value = "上报时间", example = "1")
    @ExcelColumn(name="上报时间",index =4 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date submitDate;
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理   4WTS关闭 5工程师关闭", example = "1")
    @ExcelColumn(name="状态",index =5,width = 4, valueMapping = "0=待处理;1=处理中;2=处理中;3=已处理;4=已处理;5=已处理;")
    private Integer status;
    @ApiModelProperty(value = "发生地点")
    @ExcelColumn(name="发生地点",index =6,width = 8)
    private String locationName;
    @ApiModelProperty(value = "SHE涉及人员供应商集合")
    @ExcelColumn(name="涉及人员",index =7,width = 8)
    private String memberNames;
    @ApiModelProperty(value = "具体位置")
    @ExcelColumn(name="具体位置",index =8,width = 8)
    private String remark;
    @ApiModelProperty(value = "就医情况")
    @ExcelColumn(name="就医情况",index =9,width = 8)
    private String jiuyiInfo;
    @ApiModelProperty(value = "是否和工作相关", example = "1")
    @ExcelColumn(name="是否和工作相关",index =10,width = 4, valueMapping = "0=否;1=是;")
    private Integer workRelated;
    @ApiModelProperty(value = "事件说明", example = "1")
    @ExcelColumn(name="事件说明",index =11,width = 10)
    private String eventInfo;
    @ApiModelProperty("提报人员名称")
    @ExcelColumn(name="上报员工",index =12,width = 4)
    private String memberName;
    @ApiModelProperty("员工手机号")
    @ExcelColumn(name="员工手机号",index =13,width = 6)
    private String memberPhone;
    @ApiModelProperty("提报人员所属部门")
    @ExcelColumn(name="所属部门",index =14,width = 8)
    private String companyName;
    @ApiModelProperty(value = "提交时间")
    @ExcelColumn(name="提交时间",index =15 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date createDate;
}
server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java
@@ -1,13 +1,10 @@
package com.doumee.dao.system.model;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.util.Date;
@@ -28,47 +25,36 @@
    private Integer userId;
    @ApiModelProperty(value = "登录用户名")
    @ExcelExportColumn(name="登录用户名")
    private String loginUsername;
    @ApiModelProperty(value = "登录IP")
    @ExcelExportColumn(name="登录IP", color = IndexedColors.RED, width = 8)
    private String ip;
    @ApiModelProperty(value = "登录地址")
    @ExcelExportColumn(name="登录地址", width = 10)
    private String location;
    @ApiModelProperty(value = "客户端")
    @ExcelExportColumn(name="客户端", width = 10)
    private String clientInfo;
    @ApiModelProperty(value = "操作系统")
    @ExcelExportColumn(name="操作系统")
    private String osInfo;
    @ApiModelProperty(value = "登录平台")
    @ExcelExportColumn(name="登录平台")
    private String platform;
    @ApiModelProperty(value = "系统版本")
    @ExcelExportColumn(name="系统版本")
    private String systemVersion;
    @ApiModelProperty(value = "服务器IP")
    @ExcelExportColumn(name="服务器IP", width = 8)
    private String serverIp;
    @ApiModelProperty(value = "是否登录成功")
    @ExcelExportColumn(name="是否登录成功", valueMapping = "true=是;false=否", align = HorizontalAlignment.CENTER)
    private Boolean success;
    @ApiModelProperty(value = "失败原因")
    @ExcelExportColumn(name="失败原因", color = IndexedColors.RED, width = 16)
    private String reason;
    @ApiModelProperty(value = "登录时间")
    @ExcelExportColumn(name="登录时间", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 10)
    private Date loginTime;
}
server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java
@@ -1,6 +1,5 @@
package com.doumee.dao.system.model;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -27,11 +26,9 @@
    private Integer userId;
    @ApiModelProperty(value = "固化用户名")
    @ExcelExportColumn(name="操作人用户名")
    private String username;
    @ApiModelProperty(value = "固化用户姓名")
    @ExcelExportColumn(name="操作人姓名")
    private String userRealname;
    @ApiModelProperty(value = "固化用户角色")
@@ -41,75 +38,57 @@
    private String userPermissions;
    @ApiModelProperty(value = "操作模块")
    @ExcelExportColumn(name="操作模块")
    private String operaModule;
    @ApiModelProperty(value = "操作类型")
    @ExcelExportColumn(name="操作类型")
    private String operaType;
    @ApiModelProperty(value = "操作备注")
    @ExcelExportColumn(name="备注", width = 5)
    private String operaRemark;
    @ApiModelProperty(value = "操作开始时间")
    @ExcelExportColumn(name="操作开始时间", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 10)
    private Date operaTime;
    @ApiModelProperty(value = "耗时", example = "1")
    @ExcelExportColumn(name="耗时(ms)")
    private Integer operaSpendTime;
    @ApiModelProperty(value = "请求方式")
    @ExcelExportColumn(name="请求方式")
    private String requestMethod;
    @ApiModelProperty(value = "请求地址")
    @ExcelExportColumn(name="请求地址", width = 14)
    private String requestUri;
    @ApiModelProperty(value = "请求参数")
    @ExcelExportColumn(name="请求参数", width = 16)
    private String requestParams;
    @ApiModelProperty(value = "请求结果")
    @ExcelExportColumn(name="请求结果", width = 10)
    private String requestResult;
    @ApiModelProperty(value = "状态(0操作失败,1操作成功,-1未得到处理)", example = "1")
    @ExcelExportColumn(name="状态", valueMapping = "0=操作失败;1=操作成功;-1=未处理", width = 4)
    private Integer status;
    @ApiModelProperty(value = "异常等级")
    @ExcelExportColumn(name="异常等级", valueMapping = "0=低;5=中;10=高")
    private Integer exceptionLevel;
    @ApiModelProperty(value = "异常信息")
    @ExcelExportColumn(name="异常信息", width = 16)
    private String exceptionStack;
    @ApiModelProperty(value = "IP")
    @ExcelExportColumn(name="IP", width = 8)
    private String ip;
    @ApiModelProperty(value = "服务器IP")
    @ExcelExportColumn(name="服务器IP", width = 8)
    private String serverIp;
    @ApiModelProperty(value = "接口版本")
    @ExcelExportColumn(name="接口版本")
    private String systemVersion;
    @ApiModelProperty(value = "操作平台")
    @ExcelExportColumn(name="操作平台")
    private String platform;
    @ApiModelProperty(value = "客户端信息")
    @ExcelExportColumn(name="客户端信息", width = 10)
    private String clientInfo;
    @ApiModelProperty(value = "系统信息")
    @ExcelExportColumn(name="系统信息")
    private String osInfo;
}