From cb94ff4f0a46eb74c21dd7b34b8d958ef9a9f11c Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期一, 02 二月 2026 09:05:28 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/zbom_dianjiang

---
 admin/.env                                                                                  |    2 
 server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java        |    5 
 admin/src/components/business/OperaCasesImportWindow.vue                                    |    2 
 admin/public/template/casees.xlsx                                                           |    0 
 server/services/src/main/java/com/doumee/core/dingTalk/DingTalk.java                        |  128 +++++
 admin/src/views/business/importRecord.vue                                                   |   30 
 admin/public/favicon.ico                                                                    |    0 
 server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java               |    3 
 server/services/src/main/java/com/doumee/core/constants/Constants.java                      |    6 
 server/services/src/main/java/com/doumee/service/business/ImportRecordService.java          |    1 
 admin/.env.development                                                                      |    2 
 server/admin/src/main/resources/application.yml                                             |    2 
 server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java |  220 +++++++-
 server/services/src/main/java/com/doumee/core/dingTalk/DingTalkStream.java                  |   71 ++
 server/services/pom.xml                                                                     |   15 
 admin/src/views/business/cases.vue                                                          |   12 
 server/admin/src/main/java/com/doumee/init/InitService.java                                 |   20 
 server/services/src/main/resources/application-dev.yml                                      |    5 
 admin/public/template/member.xlsx                                                           |    0 
 server/services/src/main/java/com/doumee/dao/system/dto/DingLoginDTO.java                   |   26 +
 admin/package.json                                                                          |    2 
 server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java     |    4 
 admin/src/components/business/OperaMemberListWindow.vue                                     |  288 +++++++++++
 admin/src/views/business/member.vue                                                         |    9 
 server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java           |  143 +++--
 server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java                 |    5 
 admin/src/components/common/GlobalWindow.vue                                                |    1 
 server/web/src/main/java/com/doumee/api/web/LoginController.java                            |   41 +
 server/services/src/main/java/com/doumee/dao/business/model/Cases.java                      |   12 
 admin/.env.test                                                                             |   10 
 server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java        |   81 ++
 server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java                         |    4 
 admin/src/components/business/OperaCasesListWindow.vue                                      |  182 +++++++
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java       |   64 +-
 server/services/src/main/java/com/doumee/dao/business/model/Member.java                     |    3 
 admin/src/components/business/OperaCasesWindow.vue                                          |    4 
 server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java                  |   44 +
 37 files changed, 1,273 insertions(+), 174 deletions(-)

diff --git a/admin/.env b/admin/.env
index a7c48e5..1cda429 100644
--- a/admin/.env
+++ b/admin/.env
@@ -10,4 +10,4 @@
 VUE_APP_CONTEXT_PATH = './'
 
 # 鎺ュ彛鍓嶇紑
-VUE_APP_API_PREFIX = '/jinkuai_admin'
+VUE_APP_API_PREFIX = '/dianjiang_admin_api'
diff --git a/admin/.env.development b/admin/.env.development
index fafd2c3..0c1e283 100644
--- a/admin/.env.development
+++ b/admin/.env.development
@@ -1,3 +1,3 @@
 # 寮�鍙戠幆澧冮厤缃�
 NODE_ENV = 'development'
-VUE_APP_API_URL = 'http://localhost:10010'
+VUE_APP_API_URL = 'http://localhost:11010'
diff --git a/admin/.env.test b/admin/.env.test
index 4ffc032..d3fad2e 100644
--- a/admin/.env.test
+++ b/admin/.env.test
@@ -1,7 +1,3 @@
-# 鐢熶骇鐜閰嶇疆
-NODE_ENV = 'production'
-
-# 鍏抽棴DEBUG
-VUE_APP_DEBUG = 'off'
-
-VUE_APP_API_URL  = 'https://test.doumee.cn/lianhelihua_interface'
+# 寮�鍙戠幆澧冮厤缃�
+NODE_ENV = 'development'
+VUE_APP_API_URL = 'http://192.168.0.7:10010/dianjiang_admin_interface'
diff --git a/admin/package.json b/admin/package.json
index d8f88e9..4965988 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "jinkuai",
+  "name": "zbom_dianjiang",
   "version": "1.0.0",
   "private": true,
   "scripts": {
diff --git a/admin/public/favicon.ico b/admin/public/favicon.ico
index e69de29..271e35f 100644
--- a/admin/public/favicon.ico
+++ b/admin/public/favicon.ico
Binary files differ
diff --git a/admin/public/template/casees.xlsx b/admin/public/template/casees.xlsx
index 38aaf8c..fdee30d 100644
--- a/admin/public/template/casees.xlsx
+++ b/admin/public/template/casees.xlsx
Binary files differ
diff --git a/admin/public/template/member.xlsx b/admin/public/template/member.xlsx
index be97d45..b872ea2 100644
--- a/admin/public/template/member.xlsx
+++ b/admin/public/template/member.xlsx
Binary files differ
diff --git a/admin/src/components/business/OperaCasesImportWindow.vue b/admin/src/components/business/OperaCasesImportWindow.vue
index 65f992a..f8b6ab8 100644
--- a/admin/src/components/business/OperaCasesImportWindow.vue
+++ b/admin/src/components/business/OperaCasesImportWindow.vue
@@ -48,7 +48,7 @@
       this.title = title
       this.fileName = ''
       this.visible = true
-      this.type = 0
+      this.type = 1
     },
     // 瀵煎嚭妯℃澘
     exportTemplate () {
diff --git a/admin/src/components/business/OperaCasesListWindow.vue b/admin/src/components/business/OperaCasesListWindow.vue
new file mode 100644
index 0000000..edf5638
--- /dev/null
+++ b/admin/src/components/business/OperaCasesListWindow.vue
@@ -0,0 +1,182 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    width="100%"
+  >
+    <TableLayout :permissions="['business:cases:query']">
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <el-form ref="searchForm" slot="search-form" :model="searchForm" id="curSearchForm"  label-width="100px" inline>
+        <el-form-item label="鏍囬" prop="name">
+          <el-input v-model="searchForm.name"  style="width: 150px" placeholder="璇疯緭鍏ユ爣棰�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-select
+              v-model="searchForm.status"
+              placeholder="鐘舵��"
+              clearable
+              style="width: 150px"
+              @change="search"
+          >
+            <el-option :key="0" :value="0" label="鍚敤"></el-option>
+            <el-option :key="1" :value="1" label="绂佺敤"></el-option>
+          </el-select>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+      <!-- 琛ㄦ牸鍜屽垎椤� -->
+      <template v-slot:table-wrap>
+<!--        <ul class="toolbar" v-permissions="['business:cases:create', 'business:cases:delete']">
+          <li><el-button type="primary" @click="$refs.operaCasesWindow.open('鏂板缓妗堜緥',null)" icon="el-icon-plus" v-permissions="['business:cases:create']">鏂板缓</el-button></li>
+          <li><el-button type="primary" icon="el-icon-refresh" v-permissions="['business:cases:create']" @click="$refs.OperaCasesImportWindow.open('妗堜緥瀵煎叆')">鎵归噺瀵煎叆</el-button></li>
+          <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:cases:delete']">鍒犻櫎</el-button></li>
+        </ul>-->
+        <el-table
+            :height="tableHeight"
+            v-loading="isWorking.search"
+            :data="tableData.list"
+            :cell-class-name="setRowClassName"
+            border
+            stripe
+            @selection-change="handleSelectionChange"
+        >
+          <el-table-column prop="name" label="妗堜緥鏍囬" min-width="200px"></el-table-column>
+          <el-table-column  prop="icon" label="鎺掕姒滃浘闆�" min-width="220px">
+            <template slot-scope="{row}">
+              <div style="display: flex; flex-wrap: wrap;width: 200px;"  v-if="row.fileList && row.fileList.length">
+                <div v-for="item in row.fileList" :key="row.id+'_img'+item.id" style=" box-sizing: border-box;  margin-right: 10px; " >
+                  <el-image  style="width: 50px; height: 50px;" :src="item.url"
+                             :preview-src-list="[item.url]">
+                  </el-image>
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="memberName" label="鑰佸笀" min-width="220px">
+            <template slot-scope="{row}">
+              <span class="orange" style="margin-right: 10px"> {{row.memberCode}}</span> <span>{{row.memberName||''}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="140px"></el-table-column>
+          <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="140px"></el-table-column>
+          <el-table-column prop="detail" label="妗堜緥鎻忚堪" min-width="230px" ></el-table-column>
+          <el-table-column label="鐘舵��"  >
+            <template slot-scope="{row}">
+              <span class="orange" v-if="row.status==0"  >鍚敤</span>
+              <span class="red"  v-if="row.status==1">绂佺敤</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏄惁鍒犻櫎"  >
+            <template slot-scope="{row}">
+              <span class="red" v-if="row.deleted==1"  >宸插垹闄�</span>
+              <span class="green"  v-else>鏈垹闄�</span>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+            @size-change="handleSizeChange"
+            @current-change="handlePageChange"
+            :pagination="tableData.pagination"
+        >
+        </pagination>
+      </template>
+    </TableLayout>
+    <template  v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { findAll as memberList } from '@/api/business/member'
+import {findAll as cateList} from "@/api/business/category";
+export default {
+  name: 'OperaCasesListWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination },
+  data () {
+    return {
+      title: '',
+      visible: false,
+      tableHeight: null,
+      searchForm: {
+        containDeleted: 1,
+        name: '',
+        importId: '',
+        status: null
+      },
+      memberList: []
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/cases',
+      'field.id': 'id'
+    })
+    window.addEventListener('resize', () => {
+       this.getTableHeight()
+    })
+    cateList({
+    }).then(res => {
+      this.cateList = res
+    })
+  },
+  methods: {
+    setRowClassName({row, rowIndex}) {
+      if (row.deleted == 1) {
+        return 'warning-row'
+      }
+      return '' // 濡傛灉涓嶉渶瑕佷换浣曠壒娈婃牱寮忥紝杩斿洖绌哄瓧绗︿覆鎴� null
+    },
+    getTableHeight(){
+      this.$nextTick(() => {
+        this.tableHeight = window.innerHeight - 180- document.getElementById('curSearchForm').clientHeight
+      })
+    },
+    open (title, memberId, importId) {
+      this.title = title
+      this.visible = true
+      this.getTableHeight()
+      this.tableData = {
+        // 宸查�変腑鐨勬暟鎹�
+        selectedRows: [],
+        // 鎺掑簭鐨勫瓧娈�
+        sorts: [],
+        // 褰撳墠椤垫暟鎹�
+        list: [],
+        // 鍒嗛〉
+        pagination: {
+          pageIndex: 1,
+          pageSize: 10,
+          total: 0
+        }
+      }
+      this.searchForm.importId = importId
+      this.search()
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+/deep/ .window__body {
+  overflow-y: hidden !important;
+}
+.table-content .table-wrap .el-table{
+  overflow-y: hidden !important;
+}
+</style>
+<style  >
+.success-row {
+  background: #f0f9eb; /* 娴呯豢鑹茶儗鏅� */
+}
+.warning-row {
+  background: rgba(161, 14, 14, 0.35); /* 娴呯孩鑹茶儗鏅� */
+}
+</style>
diff --git a/admin/src/components/business/OperaCasesWindow.vue b/admin/src/components/business/OperaCasesWindow.vue
index f920d92..a2d5568 100644
--- a/admin/src/components/business/OperaCasesWindow.vue
+++ b/admin/src/components/business/OperaCasesWindow.vue
@@ -16,7 +16,7 @@
               v-for="item in memberList"
               :key="item.id"
               :value="item.id"
-              :label="item.name"
+              :label="item.name+' 銆�'+item.code+'銆�'"
           ></el-option>
         </el-select>
       </el-form-item>
@@ -74,7 +74,7 @@
     return {
       isUploading: false,
       uploadData: {
-        folder: 'dianjiang/category'
+        folder: 'dianjiang/cases'
       },
       // 琛ㄥ崟鏁版嵁
       form: {
diff --git a/admin/src/components/business/OperaMemberListWindow.vue b/admin/src/components/business/OperaMemberListWindow.vue
new file mode 100644
index 0000000..96941a2
--- /dev/null
+++ b/admin/src/components/business/OperaMemberListWindow.vue
@@ -0,0 +1,288 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    width="100%"
+  >
+    <TableLayout :permissions="['business:cases:query']">
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <el-form class="table-search-formCur" ref="searchForm" id="curSearchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name"  style="width: 150px" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ彿" prop="code">
+          <el-input v-model="searchForm.code" style="width: 150px" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎴樺尯" prop="zhanquIds">
+          <el-select
+              v-model="searchForm.zhanquIds"
+              style="width: 150px"
+              placeholder="鎴樺尯"
+              clearable
+              @change="search"
+          >
+            <el-option
+                v-for="item in cateList.filter(item=>{return item.type==0})"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍟嗕笟鍖栫被鍨�" prop="bustypeIds">
+          <el-select
+              v-model="searchForm.bustypeIds"
+              style="width: 150px"
+              placeholder="鍟嗕笟鍖栫被鍨�"
+              clearable
+              @change="search"
+          >
+            <el-option
+                v-for="item in cateList.filter(item=>{return item.type==1})"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎿呴暱棰嗗煙" prop="fieldIdList">
+          <el-select
+              v-model="searchForm.fieldIdList"
+              style="width: 150px"
+              placeholder="鎿呴暱棰嗗煙"
+              clearable
+              multiple
+              @change="search"
+          >
+            <el-option
+                v-for="item in cateList.filter(item=>{return item.type==2})"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑰佸笀绛夌骇" prop="levelId">
+          <el-select
+              v-model="searchForm.levelId"
+              style="width: 150px"
+              placeholder="鑰佸笀绛夌骇"
+              clearable
+              @change="search"
+          >
+            <el-option
+                v-for="item in cateList.filter(item=>{return item.type==3})"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+          <el-form-item label="鐘舵��" prop="status">
+            <el-select
+                v-model="searchForm.status"
+                placeholder="鐘舵��"
+                clearable
+                style="width: 150px"
+                @change="search"
+            >
+              <el-option :key="0" :value="0" label="鍚敤"></el-option>
+              <el-option :key="1" :value="1" label="绂佺敤"></el-option>
+            </el-select>
+          </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+      <!-- 琛ㄦ牸鍜屽垎椤� -->
+      <template v-slot:table-wrap>
+<!--        <ul class="toolbar" v-permissions="['business:cases:create', 'business:cases:delete']">
+          <li><el-button type="primary" @click="$refs.operaCasesWindow.open('鏂板缓妗堜緥',null)" icon="el-icon-plus" v-permissions="['business:cases:create']">鏂板缓</el-button></li>
+          <li><el-button type="primary" icon="el-icon-refresh" v-permissions="['business:cases:create']" @click="$refs.OperaCasesImportWindow.open('妗堜緥瀵煎叆')">鎵归噺瀵煎叆</el-button></li>
+          <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:cases:delete']">鍒犻櫎</el-button></li>
+        </ul>-->
+        <el-table
+            :height="tableHeight"
+            v-loading="isWorking.search"
+            :data="tableData.list"
+            border
+            :cell-class-name="setRowClassName"
+            stripe
+            @selection-change="handleSelectionChange"
+        >
+          <el-table-column  prop="imgurl" label="鍥剧墖" min-width="100px">
+            <template slot-scope="{row}">
+              <el-image v-if="row.fullImgurl" style="width: 50px; height: 50px; margin-right: 10px" :src="row.fullImgurl"
+                        :preview-src-list="[row.fullImgurl]">
+              </el-image>
+            </template>
+          </el-table-column>
+          <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
+          <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+          <el-table-column prop="sex" label="鎬у埆" min-width="100px">
+            <template slot-scope="{row}">
+              <span v-if="row.sex ==0">鐢�</span>
+              <span v-if="row.sex ==1">濂�</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="positon" label="宀椾綅" min-width="120px"></el-table-column>
+          <el-table-column prop="levelName" label="绛夌骇" min-width="100px"></el-table-column>
+          <el-table-column prop="jobYear" label="浠庝笟骞翠唤" min-width="100px"></el-table-column>
+          <el-table-column prop="serveNum" label="鏈嶅姟鍟嗗満" min-width="100px">
+            <template slot-scope="{row}">
+              <span v-if="row.serveNum">{{row.serveNum}}涓�</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="caseNum" label="鏍囨潌妗堜緥" min-width="100px">
+            <template slot-scope="{row}">
+              <span >{{row.caseNum || 0}}涓�</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="busTypeNames" label="鍟嗕笟鍖栫被鍨�" min-width="200px">
+            <template slot-scope="{row}">
+              <div v-if="row.typeList && row.typeList.length">
+                <div style="display:inline-block;" v-for="(item,index) in row.typeList">{{item.name||''}} <span v-if="index < row.typeList.length-1" style="display:inline-block;padding: 0px 3px;">/</span></div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="areaNames" label="鏈嶅姟鎴樺尯" min-width="200px">
+            <template slot-scope="{row}">
+              <div v-if="row.zqList && row.zqList.length">
+                <div style="display:inline-block;" v-for="(item,index) in row.zqList">{{item.name||''}} <span v-if="index < row.zqList.length-1" style="display:inline-block;padding: 0px 3px;">/</span></div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="fieldNames" label="鎿呴暱棰嗗煙" min-width="200px">
+            <template slot-scope="{row}">
+              <div v-if="row.fieldList && row.fieldList.length">
+                <div style="display:inline-block;" v-for="(item,index) in row.fieldList">{{item.name||''}} <span v-if="index < row.fieldList.length-1" style="display:inline-block;padding: 0px 3px;">/</span></div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="fee" label="璐圭敤鏍囧噯(鍏�/鍛�)" min-width="130px"></el-table-column>
+          <el-table-column label="鐘舵��"  >
+            <template slot-scope="{row}">
+              <span class="orange" v-if="row.status==0"  >鍚敤</span>
+              <span class="red"  v-if="row.status==1">绂佺敤</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏄惁鍒犻櫎"  >
+            <template slot-scope="{row}">
+              <span class="red" v-if="row.deleted==1"  >宸插垹闄�</span>
+              <span class="green"  v-else>鏈垹闄�</span>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+            @size-change="handleSizeChange"
+            @current-change="handlePageChange"
+            :pagination="tableData.pagination"
+        >
+        </pagination>
+      </template>
+    </TableLayout>
+    <template  v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { findAll as memberList } from '@/api/business/member'
+export default {
+  name: 'OperaMemberListWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination },
+  data () {
+    return {
+      title: '',
+      visible: false,
+      tableHeight: null,
+      searchForm: {
+        name: '',
+        containDeleted: 1,
+        queryFlag: 1,
+        code: '',
+        status: null,
+        levelId: null,
+        fieldIdList: [],
+        zhanquIds: null,
+        bustypeIds: null,
+        type: 0
+      },
+      cateList: []
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/member',
+      'field.id': 'id'
+    })
+    window.addEventListener('resize', () => {
+      this.getTableHeight()
+    })
+  },
+  methods: {
+    getTableHeight () {
+      this.$nextTick(() => {
+        this.tableHeight = window.innerHeight - 180- document.getElementById('curSearchForm').clientHeight
+      })
+
+    },
+    loadMemberList () {
+      memberList({
+      }).then(res => {
+        this.memberList = res
+      })
+    },
+    setRowClassName({row, rowIndex}) {
+      if (row.deleted == 1) {
+        return 'warning-row'
+      }
+      return '' // 濡傛灉涓嶉渶瑕佷换浣曠壒娈婃牱寮忥紝杩斿洖绌哄瓧绗︿覆鎴� null
+    },
+    open (title, importId) {
+      this.title = title
+      this.visible = true
+      this.getTableHeight()
+      this.tableData = {
+        // 宸查�変腑鐨勬暟鎹�
+        selectedRows: [],
+        // 鎺掑簭鐨勫瓧娈�
+        sorts: [],
+        // 褰撳墠椤垫暟鎹�
+        list: [],
+        // 鍒嗛〉
+        pagination: {
+          pageIndex: 1,
+          pageSize: 10,
+          total: 0
+        }
+      }
+      this.searchForm.importId = importId
+      this.search()
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+/deep/ .window__body {
+  overflow-y: hidden !important;
+}
+.table-content .table-wrap .el-table{
+  overflow-y: hidden !important;
+}
+</style>
+<style  >
+.success-row {
+  background: #f0f9eb; /* 娴呯豢鑹茶儗鏅� */
+}
+.warning-row {
+  background: rgba(161, 14, 14, 0.35); /* 娴呯孩鑹茶儗鏅� */
+}
+</style>
diff --git a/admin/src/components/common/GlobalWindow.vue b/admin/src/components/common/GlobalWindow.vue
index a670937..ff394f6 100644
--- a/admin/src/components/common/GlobalWindow.vue
+++ b/admin/src/components/common/GlobalWindow.vue
@@ -85,6 +85,7 @@
 $input-height: 32px;
 .global-window {
   // 澶撮儴鏍囬
+  left: 218px !important;
   /deep/ .el-drawer__header {
     padding: 0 10px 0 0;
     line-height: 40px;
diff --git a/admin/src/views/business/cases.vue b/admin/src/views/business/cases.vue
index 6024fbd..ec782ec 100644
--- a/admin/src/views/business/cases.vue
+++ b/admin/src/views/business/cases.vue
@@ -18,7 +18,7 @@
               v-for="item in memberList"
               :key="item.id"
               :value="item.id"
-              :label="item.name"
+              :label="item.name+' 銆�'+item.code+'銆�'"
           ></el-option>
         </el-select>
       </el-form-item>
@@ -54,7 +54,7 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="妗堜緥鏍囬" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="妗堜緥鏍囬" min-width="200px"></el-table-column>
         <el-table-column  prop="icon" label="鎺掕姒滃浘闆�" min-width="220px">
           <template slot-scope="{row}">
             <div style="display: flex; flex-wrap: wrap;width: 200px;"  v-if="row.fileList && row.fileList.length">
@@ -66,10 +66,14 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="memberName" label="鑰佸笀" min-width="120px"></el-table-column>
+        <el-table-column prop="memberName" label="鑰佸笀" min-width="220px">
+          <template slot-scope="{row}">
+            <span class="orange" style="margin-right: 10px"> {{row.memberCode}}</span> <span>{{row.memberName||''}}</span>
+          </template>
+        </el-table-column>
         <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" min-width="140px"></el-table-column>
         <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" min-width="140px"></el-table-column>
-        <el-table-column prop="detail" label="妗堜緥鎻忚堪" min-width="230px" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="detail" label="妗堜緥鎻忚堪" min-width="230px" ></el-table-column>
         <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
         <el-table-column label="鐘舵��" fixed="right">
diff --git a/admin/src/views/business/importRecord.vue b/admin/src/views/business/importRecord.vue
index 2cd48c9..145e518 100644
--- a/admin/src/views/business/importRecord.vue
+++ b/admin/src/views/business/importRecord.vue
@@ -56,8 +56,8 @@
         <el-table-column prop="title" label="鍐呭" min-width="200px" show-overflow-tooltip></el-table-column>
         <el-table-column label="涓氬姟绫诲瀷">
           <template slot-scope="{row}">
-            <span v-if="row.type ==0 " >鑰佸笀瀵煎叆</span>
-            <span v-if="row.type == 1"  >妗堜緥瀵煎叆</span>
+            <span v-if="row.type ==0 "  class="green">鑰佸笀瀵煎叆</span>
+            <span v-if="row.type == 1"   class="orange" >妗堜緥瀵煎叆</span>
           </template>
         </el-table-column>
         <el-table-column label="鐘舵��">
@@ -68,10 +68,26 @@
           </template>
         </el-table-column>
         <el-table-column prop="totalNum" label="鎬昏褰曟暟" min-width="100px"></el-table-column>
-        <el-table-column prop="doneNum" label="鎴愬姛褰曞叆鏁伴噺" min-width="100px"></el-table-column>
+        <el-table-column prop="doneNum" label="鎴愬姛褰曞叆鏁伴噺" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.status == 1" class="red">{{row.ingNum}}</span>
+            <span v-else>{{ row.doneNum }}</span>
+          </template>
+        </el-table-column>
         <el-table-column prop="errorNum" label="褰曞叆澶辫触鏁伴噺" min-width="100px"></el-table-column>
         <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="createTime" label="瀵煎叆鏃堕棿" min-width="150px"></el-table-column>
         <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column
+            label="鎿嶄綔"
+            min-width="120"
+            fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text"  v-if="row.type ==1"  style="color: orange" @click="$refs.OperaCasesListWindow.open('鏌ョ湅瀵煎叆妗堜緥銆�'+row.title+'銆�',null, row.id)" icon="el-icon-open">鏌ョ湅瀵煎叆妗堜緥</el-button>
+            <el-button type="text"  v-if="row.type ==0" style="color: green"   @click="$refs.OperaMemberListWindow.open('鏌ョ湅瀵煎叆妗堜緥銆�'+row.title+'銆�', row.id)" icon="el-icon-open">鏌ョ湅瀵煎叆鑰佸笀</el-button>
+          </template>
+        </el-table-column>
       </el-table>
       <pagination
         @size-change="handleSizeChange"
@@ -81,7 +97,8 @@
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
+    <OperaMemberListWindow ref="OperaMemberListWindow" @success="handlePageChange"/>
+    <OperaCasesListWindow ref="OperaCasesListWindow" @success="handlePageChange"/>
   </TableLayout>
 </template>
 
@@ -89,11 +106,12 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
-import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import OperaMemberListWindow from '@/components/business/OperaMemberListWindow'
+import OperaCasesListWindow from '@/components/business/OperaCasesListWindow'
 export default {
   name: 'Category',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaCategoryWindow },
+  components: { TableLayout, Pagination, OperaCasesListWindow,OperaMemberListWindow},
   data () {
     return {
       // 鎼滅储
diff --git a/admin/src/views/business/member.vue b/admin/src/views/business/member.vue
index b8804e8..df448f1 100644
--- a/admin/src/views/business/member.vue
+++ b/admin/src/views/business/member.vue
@@ -72,6 +72,7 @@
               :label="item.name"
           ></el-option>
         </el-select>
+      </el-form-item>
         <el-form-item label="鐘舵��" prop="status">
           <el-select
               v-model="searchForm.status"
@@ -84,7 +85,6 @@
             <el-option :key="1" :value="1" label="绂佺敤"></el-option>
           </el-select>
         </el-form-item>
-      </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
@@ -167,11 +167,12 @@
         <el-table-column
           v-if="containPermissions(['business:member:update', 'business:member:delete'])"
           label="鎿嶄綔"
-          min-width="120"
+          min-width="180"
           fixed="right"
         >
           <template slot-scope="{row}">
             <el-button type="text" @click="$refs.operaMemberWindow.open('缂栬緫鑰佸笀', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:member:update']">缂栬緫</el-button>
+            <el-button type="text"   @click="$refs.OperaCasesListWindow.open('鏌ョ湅鑰佸笀妗堜緥銆�'+row.name+'銆�', row.id)" icon="el-icon-open">妗堜緥</el-button>
             <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -186,6 +187,7 @@
     <!-- 鏂板缓/淇敼 -->
     <OperaMemberWindow ref="operaMemberWindow" @success="handlePageChange"/>
     <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
+    <OperaCasesListWindow ref="OperaCasesListWindow" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -195,11 +197,12 @@
 import Pagination from '@/components/common/Pagination'
 import OperaMemberWindow from '@/components/business/OperaMemberWindow'
 import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
+import OperaCasesListWindow from '@/components/business/OperaCasesListWindow'
 import { findAll as cateList } from '@/api/business/category'
 export default {
   name: 'Category',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaMemberWindow ,OperaMemberImportWindow},
+  components: { TableLayout, Pagination, OperaMemberWindow ,OperaMemberImportWindow,OperaCasesListWindow},
   data () {
     return {
       // 鎼滅储
diff --git a/server/admin/src/main/java/com/doumee/init/InitService.java b/server/admin/src/main/java/com/doumee/init/InitService.java
new file mode 100644
index 0000000..d33e9f0
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/init/InitService.java
@@ -0,0 +1,20 @@
+package com.doumee.init;
+
+import com.doumee.service.business.ImportRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+@Service
+@Slf4j
+public class InitService  {
+
+    @Autowired
+    private ImportRecordService importRecordService;
+    @PostConstruct
+    public void initImportTaskStatus() {
+        importRecordService.clearImporTask();
+    }
+}
diff --git a/server/admin/src/main/resources/application.yml b/server/admin/src/main/resources/application.yml
index 7648e46..94a46dc 100644
--- a/server/admin/src/main/resources/application.yml
+++ b/server/admin/src/main/resources/application.yml
@@ -1,6 +1,6 @@
 # 绔彛鍣ㄩ厤缃�
 server:
-  port: 10010
+  port: 11010
 # 椤圭洰淇℃伅閰嶇疆
 project:
   name: 蹇楅偊-鐐瑰皢
diff --git a/server/services/pom.xml b/server/services/pom.xml
index f8eb953..c01a358 100644
--- a/server/services/pom.xml
+++ b/server/services/pom.xml
@@ -24,6 +24,21 @@
       <artifactId>hutool-all</artifactId>
       <version>5.8.40</version>
     </dependency>
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>dingtalk</artifactId>
+      <version>2.2.25</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingtalk.open</groupId>
+      <artifactId>app-stream-client</artifactId>
+      <version>1.3.7</version>
+    </dependency>
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+      <version>2.0.0</version>
+    </dependency>
   </dependencies>
   <properties>
     <maven.compiler.source>8</maven.compiler.source>
diff --git a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
index 56eb9a9..a19134d 100644
--- a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
+++ b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -4,6 +4,7 @@
 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.XSSFPicture;
 import org.apache.poi.xssf.usermodel.XSSFPictureData;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.slf4j.Logger;
@@ -329,64 +330,102 @@
             }
             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];
-                        }
+                int tcolumn = column++;
+                Object val = this.getCellValue(row, tcolumn);;
+                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();
+                }
+                if(ef.fieldType()== XSSFPictureData.class){
+                    XSSFPictureData qrData = null;
+                    if(val !=null){
+                        String tid = String.valueOf(val.toString()).trim();
+                        int start = tid.indexOf("(\"")+2;
+                        int end = tid.indexOf("\",");
+                        if(start>=0&& end>=1 && end>start){
+                            String picId = tid.substring(start,end);
+                            XSSFPictureData data = this.pictureList.get(picId);
+                            if(data!= null && data.getData() != null){
+                                qrData =data;
                             }
                         }
-                        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());
+                    }
+                    val = null;
+                    //鎮诞鍥剧墖
+                    List<XSSFPictureData> xfData = ExcelPictureUtil.getPicturesFromCell(this.sheet,row.getCell(tcolumn));
+                    List<XSSFPictureData> valList =new ArrayList<>();
+                    if(qrData!=null){
+                        valList.add(qrData);
+                    }
+                    if(xfData!=null){
+                        valList.addAll(xfData);
+                    }
+                    if (valType==List.class){
+                        val =valList;
+                    } else if ( valType==XSSFPictureData.class){
+                        val = (valList!=null && valList.size()>0)?valList.get(0):null;
+                    }
+                }else{
+                    if (val != null){
+                        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 (valType == XSSFPictureData.class){
+                            }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;
                         }
-
-                    } 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});
-                    }
+                }
+                 if (val != null){
+                     try {
+                         // 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});
+                         }
+                     }catch (Exception e1){
+                         val =null;
+                     }
+                }else{
                 }
                 sb.append(val+", ");
             }
diff --git a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java
index 4850f08..9d9ec0c 100644
--- a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java
+++ b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java
@@ -7,17 +7,13 @@
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.openxml4j.opc.PackagePartName;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.*;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
@@ -315,4 +311,75 @@
         }
     }
 
+
+    /**
+     * 鑾峰彇鍗曞厓鏍间腑鐨勫浘鐗�
+     */
+
+    public static List<XSSFPictureData> getPicturesFromCell(Sheet sheet, Cell cell) {
+        try {
+            List<XSSFPictureData> cellPictures = new ArrayList<>();
+            XSSFDrawing drawing = ((XSSFSheet) sheet).createDrawingPatriarch();
+            if (drawing != null) {
+                List<XSSFPicture> pictures = drawing.getShapes().stream()
+                        .filter(shape -> shape instanceof XSSFPicture)
+                        .map(shape -> (XSSFPicture) shape).collect(Collectors.toList());
+                for (XSSFPicture picture : pictures) {
+                    int rowIndex = picture.getPreferredSize().getRow1();
+                    int colIndex = picture.getPreferredSize().getCol1();
+                    if (colIndex == cell.getColumnIndex() && rowIndex == cell.getRowIndex()) {
+                        cellPictures.add(picture.getPictureData());
+                    }
+                }
+            }
+            return cellPictures;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+         return  null;
+    }
+
+    private static Map<String, List<XSSFPicture>> getImgPathMap(Sheet sheet) {
+        Map<String, List<XSSFPicture>> imgPathMap = new HashMap<>();
+        XSSFDrawing drawing = ((XSSFSheet) sheet).createDrawingPatriarch();
+        if (drawing != null) {
+            List<XSSFPicture> pictures = drawing.getShapes().stream()
+                    .filter(shape -> shape instanceof XSSFPicture)
+                    .map(shape -> (XSSFPicture) shape).collect(Collectors.toList());
+            for (XSSFPicture picture : pictures) {
+                int rowIndex = picture.getPreferredSize().getRow1();
+                int colIndex = picture.getPreferredSize().getCol1();
+                String key = colIndex + "-" + rowIndex;
+                List<XSSFPicture> list = null;
+                if (imgPathMap.containsKey(key)) {
+                    list = imgPathMap.get(key);
+                } else {
+                    list = new ArrayList<>();
+                    imgPathMap.put(key, list);
+                }
+                list.add(picture);
+            }
+        }
+        return imgPathMap;
+    }
+
+
+    /**
+     * 鑾峰彇鍥剧墖鐨勬墿灞曞悕
+     */
+
+    private static String getImageExtension(PictureData picture) {
+        String mimeType = picture.getMimeType();
+        switch (mimeType) {
+            case "image/jpeg":
+                return "jpg";
+            case "image/png":
+                return "png";
+            default:
+                return "";
+        }
+    }
+
+
+
 }
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index 5fe8c94..4e2953d 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -76,6 +76,8 @@
     public static final Integer FOUR = 4;
     public static final Integer SIX = 6;
     public static final Integer FIVE = 5;
+    public static final Integer DD_STATUS_SUCCESS_CODE = 200 ;
+    public static final Long DD_ERR_CODE = 0L ;
     public static final String INENTITY_FILES = "INENTITY_FILES";
     public static final String MEMBER_FILES = "MEMBER_FILES";
     public static final String CATEGORY_FILES = "CATEGORY_FILES";
@@ -85,6 +87,10 @@
     public static final String ZBOM_TICKET_LOGIN_URL ="ZBOM_TICKET_LOGIN_URL" ;
     public static final String OBJCET_STORAGE = "OBJCET_STORAGE";
     public static final Object OBJECT_TYPE_CASES = "OBJECT_TYPE_CASES";
+    public static final String DD_TALK = "DD_TALK" ;
+    public static final String APP_KEY = "APP_KEY";
+    public static final String APP_SECRET = "APP_SECRET";
+    public static final String DD_USER_TYPE = "DD_USER";
     public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
     public static  boolean DEALING_COMPANY_SYNC = false ;
     public static  boolean DEALING_MEMBER_SYNC = false ;
diff --git a/server/services/src/main/java/com/doumee/core/dingTalk/DingTalk.java b/server/services/src/main/java/com/doumee/core/dingTalk/DingTalk.java
new file mode 100644
index 0000000..4942d4f
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -0,0 +1,128 @@
+package com.doumee.core.dingTalk;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkoauth2_1_0.Client;
+import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse;
+import com.aliyun.dingtalkoauth2_1_0.models.GetTokenResponse;
+import com.aliyun.dingtalktodo_1_0.models.*;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.dao.system.dto.DingLoginDTO;
+import com.doumee.dao.system.model.SystemDictData;
+import com.taobao.api.ApiException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/9/24 16:25
+ */
+@Slf4j
+@Service
+public class DingTalk {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+
+    @Value("${dingtalk.clientId}")
+    private String clientId;
+    @Value("${dingtalk.clientSecret}")
+    private String clientSecret;
+
+    /**
+     * 浣跨敤 Token 鍒濆鍖栬处鍙稢lient 鏁版嵁鍚屾绫�
+     * @return Client com.aliyun.dingtalkoauth2_1_0.
+     * @throws Exception
+     */
+    public static Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new Client(config);
+    }
+
+    /**
+     * 寰呭姙閫氱煡绫� 閾炬帴姹�
+     * @return
+     * @throws Exception
+     */
+    public static com.aliyun.dingtalktodo_1_0.Client createV1Client() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalktodo_1_0.Client(config);
+    }
+
+
+    /**
+     * 鑾峰彇閽夐拤Token
+     * @return
+     */
+    public String getToken(){
+        String accessToken  =  systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.ACCESS_TOKEN).getCode();
+        return accessToken;
+    }
+
+    private String getAccessToken(String corpId) {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        try {
+            com.aliyun.dingtalkoauth2_1_0.Client client = new com.aliyun.dingtalkoauth2_1_0.Client(config);
+            com.aliyun.dingtalkoauth2_1_0.models.GetTokenRequest getTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetTokenRequest()
+                    .setClientId(clientId)
+                    .setClientSecret(clientSecret)
+                    .setGrantType("client_credentials");
+            GetTokenResponse response = client.getToken(corpId, getTokenRequest);
+            return response.getBody().accessToken;
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("Error getting access token: {}", err.getMessage());
+            }
+
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 涓惈鏈� code 鍜� message 灞炴�э紝鍙府鍔╁紑鍙戝畾浣嶉棶棰�
+                log.error("Error getting access token: {}", err.getMessage());
+            }
+        }
+        return null;
+    }
+
+
+    public OapiV2UserGetuserinfoResponse.UserGetByCodeResponse  getDDUserByCode(DingLoginDTO dto) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
+        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
+        req.setCode(dto.getCode());
+        OapiV2UserGetuserinfoResponse rsp = client.execute(req, getAccessToken(dto.getCorpId()));
+        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
+           return  rsp.getResult();
+        }else{
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
+        }
+    }
+
+
+
+}
diff --git a/server/services/src/main/java/com/doumee/core/dingTalk/DingTalkStream.java b/server/services/src/main/java/com/doumee/core/dingTalk/DingTalkStream.java
new file mode 100644
index 0000000..ebc66d2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/dingTalk/DingTalkStream.java
@@ -0,0 +1,71 @@
+package com.doumee.core.dingTalk;
+
+import com.dingtalk.open.app.api.GenericEventListener;
+import com.dingtalk.open.app.api.OpenDingTalkStreamClientBuilder;
+import com.dingtalk.open.app.api.message.GenericOpenDingTalkEvent;
+import com.dingtalk.open.app.api.security.AuthClientCredential;
+import com.dingtalk.open.app.stream.protocol.event.EventAckStatus;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.service.business.MemberService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import shade.com.alibaba.fastjson2.JSONObject;
+
+/**
+ * 閽夐拤 璁㈤槄浜嬩欢閫氱煡
+ *
+ * @Author : Rk
+ * @create 2025/9/24 17:14
+ */
+@Slf4j
+@Configuration
+public class DingTalkStream {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Bean
+    public void DingTalkStreamRun()  throws Exception {
+        String appKey  =  systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.APP_KEY).getCode();
+        String appSecret  = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.APP_SECRET).getCode();
+
+        OpenDingTalkStreamClientBuilder
+                .custom()
+                .credential(new AuthClientCredential(appKey, appSecret))
+                //娉ㄥ唽浜嬩欢鐩戝惉
+                .registerAllEventListener(new GenericEventListener() {
+                    @Override
+                    public EventAckStatus onEvent(GenericOpenDingTalkEvent event) {
+                        try {
+                            //浜嬩欢鍞竴Id
+                            String eventId = event.getEventId();
+                            log.error("閽夐拤鎺ㄩ�佷簨浠禝d:{}"+eventId);
+                            //浜嬩欢绫诲瀷
+                            String eventType = event.getEventType();
+                            log.error("閽夐拤鎺ㄩ�佷簨浠剁被鍨�:{}"+eventType);
+                            //浜嬩欢浜х敓鏃堕棿
+                            Long bornTime = event.getEventBornTime();
+                            log.error("閽夐拤鎺ㄩ�佷簨浠朵骇鐢熸椂闂�:{}"+bornTime);
+                            //鑾峰彇浜嬩欢浣�
+                            JSONObject bizData = event.getData();
+                            log.error("閽夐拤鎺ㄩ�佷簨浠惰鎯�:{}"+bizData);
+
+                            //澶勭悊浜嬩欢
+//                            process(bizData);
+                            //娑堣垂鎴愬姛
+                            return EventAckStatus.SUCCESS;
+                        } catch (Exception e) {
+                            //娑堣垂澶辫触
+                            return EventAckStatus.LATER;
+                        }
+                    }
+                })
+                .build().start();
+    }
+
+
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java b/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java
index 9589699..d74f2dd 100644
--- a/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java
+++ b/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java
@@ -3,6 +3,11 @@
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
+import org.apache.poi.xssf.usermodel.XSSFPicture;
+import org.apache.poi.xssf.usermodel.XSSFPictureData;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * 鍛樺伐淇℃伅瀵煎叆琛�
@@ -13,24 +18,31 @@
 @ApiModel("鍛樺伐淇℃伅瀵煎叆")
 public class CasesImport {
 
-//    @ExcelColumn(name="搴忓彿",value = "sn")
-    private Integer sn;
-
-    @ExcelColumn(name="濮撳悕",value = "name",index = 1)
+    @ExcelColumn(name="妗堜緥涓婚",value = "name",index = 1)
     private String name;
-    @ExcelColumn(name="鎵嬫満鍙�",value = "phone",index = 2)
-    private String phone;
+    @ExcelColumn(name="寮�濮嬫棩鏈�",value = "startDate",index = 2)
+    private String startDate;
 
-    @ExcelColumn(name="韬唤璇佸彿",value = "idcardNo",index = 3)
-    private String idcardNo;
+    @ExcelColumn(name="缁撴潫鏃ユ湡",value = "endDate",index = 3)
+    private String endDate;
 
-    @ExcelColumn(name="缁勭粐鍚嶇О" , value = "companyName" ,index = 4)
-    private String companyName;
+    @ExcelColumn(name="鏈嶅姟鑰佸笀" , value = "memberCode" ,index = 4)
+    private String memberCode;
+    @ExcelColumn(name="鏈嶅姟鑰佸笀濮撳悕" , value = "memberName" ,index = 5)
+    private String memberName;
 
-    @ExcelColumn(name="宸ュ彿" , value = "code")
-    private String code;
-
-    @ExcelColumn(name="宀椾綅" , value = "code")
-    private String positionName;
-
+    @ExcelColumn(name="妗堜緥璇存槑" , value = "detail",index = 6)
+    private String detail;
+    @ExcelColumn(name="妗堜緥鍥�1" , value = "imageList",fieldType = XSSFPictureData.class,index = 7)
+    private List<XSSFPictureData> imageList;
+    @ExcelColumn(name="妗堜緥鍥�2" , value = "imageList1",fieldType = XSSFPictureData.class,index = 8)
+    private List<XSSFPictureData> imageList1;
+    @ExcelColumn(name="妗堜緥鍥�3" , value = "imageList2",fieldType = XSSFPictureData.class,index = 9)
+    private List<XSSFPictureData> imageList2;
+    @ExcelColumn(name="妗堜緥鍥�4" , value = "imageList3",fieldType = XSSFPictureData.class,index = 10)
+    private List<XSSFPictureData> imageList3;
+    @ExcelColumn(name="妗堜緥鍥�5" , value = "imageList4",fieldType = XSSFPictureData.class,index = 11)
+    private List<XSSFPictureData> imageList4;
+    @ExcelColumn(name="妗堜緥鍥�6" , value = "imageList5",fieldType = XSSFPictureData.class,index = 12)
+    private List<XSSFPictureData> imageList5;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java b/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java
index a2cc4ed..82dcad0 100644
--- a/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java
+++ b/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java
@@ -5,6 +5,7 @@
 import com.doumee.dao.business.model.Category;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
+import org.apache.poi.xssf.usermodel.XSSFPictureData;
 
 import java.util.List;
 
@@ -20,8 +21,8 @@
     private String code;
     @ExcelColumn(name="濮撳悕",value = "name",index = 2)
     private String name;
-    @ExcelColumn(name="鑱屼笟鐓�",value = "imgurl",index = 3)
-    private String imgurl;
+    @ExcelColumn(name="鑱屼笟鐓�",value = "imgurl",index = 3,fieldType = XSSFPictureData.class)
+    private XSSFPictureData imgurl;
     @ExcelColumn(name="绛夌骇",value = "levelName",index = 4)
     private String levelName;
     @ExcelColumn(name="鎬у埆" , value = "sex" ,index = 5)
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Cases.java b/server/services/src/main/java/com/doumee/dao/business/model/Cases.java
index 65a307e..66bea71 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Cases.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Cases.java
@@ -86,10 +86,22 @@
     @ApiModelProperty(value = "鑰佸笀濮撳悕", example = "1")
     @TableField(exist = false)
     private String memberName  ;
+    @ApiModelProperty(value = "鑰佸笀宸ュ彿", example = "1")
+    @TableField(exist = false)
+    private String memberCode  ;
     @ApiModelProperty(value = "鍥鹃泦闄勪欢闆嗗悎", example = "1")
     @TableField(exist = false)
     private List<Multifile> fileList;
     @ApiModelProperty(value = "鏈�鍚庢搷浣滀汉鍛橈紱", example = "1")
     @TableField(exist = false)
     private String updateUserName;
+    @ApiModelProperty(value = "鍥剧墖闆嗘暟鎹紱", example = "1")
+    @TableField(exist = false)
+    private List<byte[]> imgdataList;
+
+    @ApiModelProperty(value = "鏄惁鍖呭惈宸插垹闄� 0涓嶅寘鍚� 1鍖呭惈锛�", example = "1")
+    @TableField(exist = false)
+    private int containDeleted;
+
 }
+
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java b/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
index 4a87d87..3dc860f 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
@@ -98,4 +98,7 @@
     @ApiModelProperty(value = "缁撴潫鏃堕棿锛�", example = "1")
     @TableField(exist = false)
     private Date endtime;
+    @ApiModelProperty(value = "杩涜涓凡澶勭悊鐨勬暟閲忥紱", example = "1")
+    @TableField(exist = false)
+    private Integer ingNum;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Member.java b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
index a39b833..0598154 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -181,4 +181,7 @@
     @ApiModelProperty(value = "鏈�鍚庢搷浣滀汉鍛橈紱", example = "1")
     @TableField(exist = false)
     private String updateUserName;
+    @ApiModelProperty(value = "鏄惁鍖呭惈宸插垹闄� 0涓嶅寘鍚� 1鍖呭惈锛�", example = "1")
+    @TableField(exist = false)
+    private int containDeleted;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/system/dto/DingLoginDTO.java b/server/services/src/main/java/com/doumee/dao/system/dto/DingLoginDTO.java
new file mode 100644
index 0000000..32e9dd2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/system/dto/DingLoginDTO.java
@@ -0,0 +1,26 @@
+package com.doumee.dao.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author  dm
+ * @since 2025/03/31 16:44
+ */
+@Data
+@ApiModel("鐧诲綍鍙傛暟")
+public class DingLoginDTO implements Serializable {
+
+    @NotBlank(message = "code涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "code")
+    private String code;
+
+    @NotBlank(message = "corpId涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "corpId")
+    private String corpId;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java b/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java
index e9cd3f1..b7d2620 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java
@@ -19,10 +19,12 @@
     @ApiModelProperty(value = "鐢ㄦ埛涓婚敭")
     private String id;
 
-    @ApiModelProperty(value = "鐢ㄦ埛瑙掕壊锛�")
+    @ApiModelProperty(value = "鐢ㄦ埛瑙掕壊锛�   (dUser:鏍囪涓洪拤閽夌敤鎴�)")
     private String roleType;
 
     @ApiModelProperty(value = "鎴樺尯缂栫爜")
     private String zhanqu;
 
+    @ApiModelProperty(value = "token")
+    private String token;
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java b/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
index cadb3da..86fec2c 100644
--- a/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
+++ b/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
@@ -99,4 +99,5 @@
     ImportRecord importBatch(MultipartFile file, int type );
 
     void dealImporTask(ImportRecord importRecord);
+    void clearImporTask();
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java
index 74b8099..76551cc 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java
@@ -179,12 +179,13 @@
         MPJLambdaWrapper<Cases> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(Cases.class)
                 .selectAs(Member::getName,Cases::getMemberName)
+                .selectAs(Member::getCode,Cases::getMemberCode)
                 .selectAs(SystemUser::getRealname, Member::getUpdateUserName)
                 .leftJoin(SystemUser.class,SystemUser::getId,Cases::getUpdateUser)
                  .leftJoin(Member.class,Member::getId,Cases::getMemberId);
         Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.eq(pageWrap.getModel().getContainDeleted()!=1,Cases::getDeleted, Constants.ZERO);
         queryWrapper.eq(pageWrap.getModel().getId() != null,Cases::getId, pageWrap.getModel().getId());
-        queryWrapper.eq(pageWrap.getModel().getDeleted() != null,Cases::getDeleted, pageWrap.getModel().getDeleted());
         queryWrapper.eq(pageWrap.getModel().getCreateUser() != null,Cases::getCreateUser, pageWrap.getModel().getCreateUser());
         queryWrapper.eq(pageWrap.getModel().getUpdateUser() != null,Cases::getUpdateUser, pageWrap.getModel().getUpdateUser());
         queryWrapper.eq(pageWrap.getModel().getRemark() != null,Cases::getRemark, pageWrap.getModel().getRemark());
@@ -209,7 +210,7 @@
     }
     private void initMultifileList(Cases cate) {
         String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode()
-                + systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
+                + systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CASES_FILES).getCode();
 
         Multifile find = new Multifile();
         find.setObjId(cate.getId());
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index 29bc62f..c3a3117 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -283,8 +283,8 @@
                 .orderByAsc(Category::getSortnum)
         );
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){
-            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
-                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
+            String path  = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.CATEGORY_FILES).getCode();
             for (Category category:categoryList) {
                 if(StringUtils.isNotBlank(category.getIcon())){
                     category.setIconFull(path + category.getIcon());
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
index 1503157..e268a1b 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
@@ -10,17 +10,11 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.tyyun.TyyZosUtil;
-import com.doumee.dao.business.CasesMapper;
-import com.doumee.dao.business.CategoryMapper;
-import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.dto.CasesImport;
 import com.doumee.dao.business.dto.MemberImport;
-import com.doumee.dao.business.model.Cases;
-import com.doumee.dao.business.model.Category;
-import com.doumee.dao.business.model.ImportRecord;
+import com.doumee.dao.business.model.*;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.ImportRecordMapper;
-import com.doumee.dao.business.model.Member;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.ImportRecordService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -44,6 +38,7 @@
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.io.ByteArrayInputStream;
 import java.math.BigDecimal;
@@ -67,6 +62,8 @@
     private MemberMapper memberMapper;
     @Autowired
     private CasesMapper casesMapper;
+    @Autowired
+    private MultifileMapper multifileMapper;
     @Resource
     private RedisTemplate<String, Object> redisTemplate;
     @Resource
@@ -145,7 +142,8 @@
         MPJLambdaWrapper<ImportRecord> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
         queryWrapper.selectAll(ImportRecord.class )
-        .selectAs(SystemUser::getRealname,ImportRecord::getUpdateUserName)
+                .select( "(select count(c.id) from cases c where c.import_id= t.id)",ImportRecord::getIngNum)
+                .selectAs(SystemUser::getRealname,ImportRecord::getUpdateUserName)
                 .leftJoin(SystemUser.class,SystemUser::getId,ImportRecord::getUpdateUser);
        queryWrapper.eq(pageWrap.getModel().getId() != null,ImportRecord::getId, pageWrap.getModel().getId());
        queryWrapper.eq(pageWrap.getModel().getDeleted() != null,ImportRecord::getDeleted, pageWrap.getModel().getDeleted());
@@ -203,9 +201,7 @@
             Map<String, XSSFPictureData> pics = ie.getExcelPictures();
             if(type == 1) {
               List<CasesImport> importList =  (ie.getDataList(CasesImport.class,null));
-              if(importList==null || importList.size()==0){
-                  throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵煎叆鏂囦欢妗堜緥淇℃伅鍐呭涓虹┖锛�");
-              }
+              model.setCaseList(isvalidImpartCasesParam(loginUserInfo,pics,importList));
               model.setTotalNum(model.getCaseList().size());
             }else{
                List<MemberImport> importList = (ie.getDataList(MemberImport.class,null));
@@ -242,19 +238,21 @@
         int index = 1;
          for(MemberImport param :memberList){
              index ++;
-             if(StringUtils.isBlank(param.getImgurl())
-             ||StringUtils.isBlank(param.getFee())
-             ||StringUtils.isBlank(param.getName())
-             ||StringUtils.isBlank(param.getInfo())
-             ||StringUtils.isBlank(param.getJobYear())
-             ||StringUtils.isBlank(param.getPosition())
-             ||StringUtils.isBlank(param.getFieldNames())
-             ||StringUtils.isBlank(param.getSex())
-             ||StringUtils.isBlank(param.getCode())
-             ||StringUtils.isBlank(param.getZqNames())
-             ||StringUtils.isBlank(param.getLevelName())
-             ||StringUtils.isBlank(param.getServeNum())
-             ||StringUtils.isBlank(param.getTypeNames())){
+             if(( param.getImgurl() == null
+                 ||param.getImgurl().getData() == null
+                 ||param.getImgurl().getData().length == 0)
+                     &&StringUtils.isBlank(param.getFee())
+                     &&StringUtils.isBlank(param.getName())
+                     &&StringUtils.isBlank(param.getInfo())
+                     &&StringUtils.isBlank(param.getJobYear())
+                     &&StringUtils.isBlank(param.getPosition())
+                     &&StringUtils.isBlank(param.getFieldNames())
+                     &&StringUtils.isBlank(param.getSex())
+                     &&StringUtils.isBlank(param.getCode())
+                     &&StringUtils.isBlank(param.getZqNames())
+                     &&StringUtils.isBlank(param.getLevelName())
+                     &&StringUtils.isBlank(param.getServeNum())
+                     &&StringUtils.isBlank(param.getTypeNames())){
                  continue;
              }
              Member member = new Member();
@@ -295,7 +293,7 @@
              if(StringUtils.isBlank(param.getFee())){
                  throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 璐圭敤鏍囧噯淇℃伅涓嶈兘涓虹┖");
              }
-             if(pics!=null && StringUtils.isNotBlank(param.getImgurl())){
+          /*   if(pics!=null && StringUtils.isNotBlank(param.getImgurl())){
                 log.info("===================="+param.getImgurl());
                 int start = param.getImgurl().indexOf("(\"")+2;
                 int end = param.getImgurl().indexOf("\",");
@@ -307,7 +305,11 @@
                         member.setImgurlData(data.getData());
                     }
                 }
-            }
+            }*/
+             if(param.getImgurl() ==null ){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屻��"+param.getName()+"銆戞暟鎹紝 鏈鍙栧埌浠讳綍鑱屼笟鐓у浘鐗囨暟鎹�");
+             }
+             member.setImgurlData(param.getImgurl().getData());
              if(member.getImgurlData() ==null || member.getImgurlData().length==0){
                  throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屻��"+param.getName()+"銆戞暟鎹紝 鏈鍙栧埌浠讳綍鑱屼笟鐓у浘鐗囨暟鎹�");
              }
@@ -350,6 +352,91 @@
             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈鍙栧埌鏈夋晥鏁版嵁");
         }
          return insertMember;
+
+    }
+    private  List<Cases> isvalidImpartCasesParam(LoginUserInfo user,  Map<String, XSSFPictureData> pics, List<CasesImport> casesImportList) {
+        if(casesImportList ==null || casesImportList.size()==0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈鍙栧埌鏈夋晥鏁版嵁");
+        }
+        if(pics ==null || pics.size()==0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈鍙栧埌浠讳綍鑱屼笟鐓у浘鐗囨暟鎹�");
+        }
+        List<Cases> insertList = new ArrayList<>();
+        List<Member> allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                .eq(Member::getDeleted,Constants.ZERO));
+        allList=allList==null?new ArrayList<>():allList;
+        if(allList == null || allList.size()==0){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝 璇诲彇鑰佸笀鏁版嵁寮傚父锛岃鍏堢淮鎶よ�佸笀鏁版嵁淇℃伅锛�");
+        }
+        Date date = new Date();
+        int index = 1;
+         for(CasesImport param :casesImportList){
+             index ++;
+             if(  StringUtils.isBlank(param.getName())
+                     &&StringUtils.isBlank(param.getMemberCode())
+                     &&StringUtils.isBlank(param.getStartDate())
+                     &&StringUtils.isBlank(param.getEndDate())
+                     &&StringUtils.isBlank(param.getDetail())){
+                 continue;
+             }
+             Cases cases = new Cases();
+             cases.setStartDate(DateUtil.fromStringToDate("yyyy-MM-dd",param.getStartDate()));
+             cases.setEndDate(DateUtil.fromStringToDate("yyyy-MM-dd",param.getEndDate()));
+             if(StringUtils.isBlank(param.getName())){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 妗堜緥涓婚涓嶈兘涓虹┖");
+             }
+             Member member =null;
+             for(Member m : allList){
+                 if(StringUtils.equals(param.getMemberCode(),m.getCode())){
+                    member = m;
+                 }
+             }
+             if(member == null){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 鑰佸笀宸ュ彿銆�"+param.getMemberCode()+"銆戜俊鎭笉瀛樺湪锛岃纭涓嶈閲嶅褰曞叆");
+
+             }
+             if(StringUtils.isBlank(param.getDetail())){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 妗堜緥璇存槑涓嶈兘涓虹┖");
+             }
+             if(param.getImageList() == null){
+                 param.setImageList(new ArrayList<>());
+             }
+             param.getImageList().addAll(param.getImageList1()!=null?param.getImageList1():new ArrayList<>());
+             param.getImageList().addAll(param.getImageList2()!=null?param.getImageList2():new ArrayList<>());
+             param.getImageList().addAll(param.getImageList3()!=null?param.getImageList3():new ArrayList<>());
+             param.getImageList().addAll(param.getImageList4()!=null?param.getImageList4():new ArrayList<>());
+             param.getImageList().addAll(param.getImageList5()!=null?param.getImageList5():new ArrayList<>());
+         /*    if(param.getImageList() == null
+                     ||param.getImageList().size() == 0 ){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 妗堜緥鍥句俊鎭笉鑳戒负绌�");
+             }*/
+             if(cases.getStartDate()==null){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 寮�濮嬫棩鏈熻鍙栧け璐�");
+             }
+             if(cases.getEndDate()==null){
+                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹紝 缁撴潫鏃ユ湡璇诲彇澶辫触");
+             }
+             cases.setImgdataList(new ArrayList<>());
+             for(XSSFPictureData d : param.getImageList()){
+                 cases.getImgdataList().add(d.getData());
+             }
+             cases.setCreateTime(date);
+             cases.setUpdateTime(date);
+             cases.setCreateUser(user.getId());
+             cases.setUpdateUser(user.getId());
+             cases.setAddType(Constants.ONE);
+             cases.setDeleted(Constants.ZERO);
+             cases.setStatus(Constants.ZERO);
+             cases.setName(param.getName());
+             cases.setDetail(param.getDetail());
+             cases.setMemberId(member.getId());
+
+             insertList.add(cases);
+         }
+        if(insertList ==null || insertList.size()==0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈鍙栧埌鏈夋晥鏁版嵁");
+        }
+         return insertList;
 
     }
 
@@ -414,22 +501,66 @@
     }
 
     /**
+     * 寮傛鎵ц鏂囦欢浠诲姟
+     */
+    @Override
+    public  void clearImporTask(){
+        try {
+            List<ImportRecord> records = importRecordMapper.selectList(new QueryWrapper<ImportRecord>()
+                    .select("id,total_num,(select count(c.id) from cases c where c.import_id= import_record.id) as doneNum")
+                    .lambda()
+                    .eq(ImportRecord::getDetail,Constants.ZERO)
+                    .ne(ImportRecord::getStatus,Constants.TWO)
+            );
+            for(ImportRecord importRecord : records){
+                importRecord.setErrorNum(Constants.formatIntegerNum(importRecord.getTotalNum()- Constants.formatIntegerNum(importRecord.getDoneNum())));
+                importRecord.setStatus(Constants.TWO);
+                importRecord.setUpdateTime(new Date());
+                importRecord.setRemark("浠诲姟鎵ц涓柇锛屽己鍒惰缃换鍔$姸鎬�");
+                importRecordMapper.updateById(importRecord);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            redisTemplate.delete(Constants.RedisKeys.IMPORTING_RECORD);
+        }
+    }
+
+    /**
      * 澶勭悊妗堜緥瀵煎叆浠诲姟
      * @param importRecord
      */
 
     private int dealCaseImportBiz(ImportRecord importRecord) {
         int success=0;
-        String msg ="";
+        String msg = "";
+        String nowDate =DateUtil.getNowShortDate();
         try {
-            for(Cases param:importRecord.getCaseList()){
-
+            String bucket =systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.BUCKETNAME).getCode();
+            String folder =systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.CASES_FILES).getCode();
+            TyyZosUtil obs = new TyyZosUtil(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ENDPOINT).getCode(),
+                    systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_ID).getCode(),
+                    systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_KEY).getCode());
+            for(Cases param: importRecord.getCaseList()){
+                int ts =0;
+                try {
+                    param.setImportId(importRecord.getId());
+                    param.setAddType(Constants.ONE);
+                    ts =  dealCasesInsert(obs,param,folder,nowDate,bucket);
+                }catch (Exception e){
+                    log.error("澶勭悊浜哄憳淇℃伅鍙戠敓寮傚父{}",e.getMessage());
+                    ts =0;
+                }
+                success += ts;
             }
+            obs.shutDown();
         }catch (Exception e){
 
         }
         importRecord.setDoneNum(success);
         importRecord.setErrorNum(importRecord.getTotalNum() - success);
+        importRecord.setDetail(msg);
+        redisTemplate.delete(Constants.RedisKeys.IMPORTING_RECORD);
         return success;
     }
 
@@ -464,6 +595,35 @@
     }
 
 
+    @Transactional
+    private int dealCasesInsert( TyyZosUtil obs,Cases param,String folder,String nowDate,String bucketName) {
+        int success = casesMapper.insert(param);
+        if(param.getImgdataList()!=null && param.getImgdataList().size()>0){
+            List<Multifile> multifileList = new ArrayList<>();
+            for(byte[] d : param.getImgdataList()){
+                String fileName = UUID.randomUUID() + ".png";
+                String tempFileName = nowDate + "/" + fileName;
+                String key = folder + tempFileName;// 鏂囦欢鍚�
+                if (obs.uploadInputstreamObjectNoShutdown(new ByteArrayInputStream(d ) ,bucketName,  key)) {
+                    Multifile s = new Multifile();
+                    s.setIsdeleted(Constants.ZERO);
+                    s.setCreator(param.getCreateUser());
+                    s.setCreateDate(param.getCreateTime());
+                    s.setObjId(param.getId());
+                    s.setType(Constants.ZERO);
+                    s.setFileurl(tempFileName);
+                    s.setObjType(Constants.ONE);
+                    multifileList.add(s);
+                    param.setImgurl(tempFileName);//璇佷欢鐓у湴鍧�
+                }else{
+                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鍥鹃泦涓婁紶澶辫触锛�");
+                }
+            }
+            multifileMapper.insert(multifileList);
+        }
+        return success;
+}
+
     private int dealMemberInsert( TyyZosUtil obs,Member param,String folder,String nowDate,String bucketName) {
         int success =0;
         try {
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 24521a0..32314b2 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -221,8 +221,9 @@
                 .apply(Objects.nonNull(model.getBustypeIds())," find_in_set( '["+model.getBustypeIds()+"]', t.BUSTYPE_IDS ) ")
                 .apply(Objects.nonNull(model.getZhanquIds())," find_in_set( '["+model.getZhanquIds()+"]', t.ZHANQU_IDS ) ")
                 .like(StringUtils.isNotBlank(model.getName()),Member::getName, model.getName())
+                .eq(Objects.nonNull(model.getImportId()),Member::getImportId, model.getImportId())
                 .eq(Objects.nonNull(model.getStatus()),Member::getStatus, model.getStatus())
-                .eq(Member::getDeleted, Constants.ZERO)
+                .eq(model.getContainDeleted()!=1,Member::getDeleted, Constants.ZERO)
                 .in(Objects.nonNull(model.getLevelId()),Category::getId, model.getLevelId())
                 .eq(Objects.nonNull(model.getCode()),Member::getCode, model.getCode())
                 .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.ZERO),Member::getFee)
@@ -235,11 +236,13 @@
         if(Constants.equalsInteger(pageWrap.getModel().getQueryFlag(),Constants.ONE)){
             queryWrapper.select("(select count(c.id) from cases c where c.deleted=0 and c.member_id=t.id)",Member::getCaseNum);
         }
-        if(StringUtils.isNotBlank(model.getFieldIds())){
-            String [] fieldIds = model.getFieldIds().split(",");
-            for (String s:fieldIds) {
-                queryWrapper.apply("find_in_set( '["+s+"]' , t.FIELD_IDS )");
+        if(CollectionUtils.isNotEmpty(model.getFieldIdList())){
+            String sql = "";
+            for (Integer s:model.getFieldIdList()
+                 ) {
+                sql = sql + (StringUtils.isNotBlank(sql)?" or ":"") + " find_in_set( '["+s+"]' , t.FIELD_IDS ) ";
             }
+            queryWrapper.apply(sql);
         }
         if (StringUtils.isNotBlank(model.getQueryZQCode())) {
             Category zhanqu = categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
@@ -261,19 +264,12 @@
             );
             String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode() +
                     systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.MEMBER_FILES).getCode();
-            String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
             for (Member member:memberIPage.getRecords()) {
                 if(CollectionUtils.isNotEmpty(categoryList)){
                     dealMemberField(member,categoryList);
-                    if(Constants.equalsInteger(pageWrap.getModel().getQueryFlag(),Constants.ONE)) {
-                        dealMemberCategoryList(member, categoryList);
-                    }
+                    dealMemberCategoryList(member, categoryList,pageWrap.getModel().getQueryFlag());
                 }
                 member.setFullImgurl(StringUtils.isNotBlank(member.getImgurl())?(path + member.getImgurl()):"");
-                if(!Constants.equalsInteger(pageWrap.getModel().getQueryFlag(),Constants.ONE) && (StringUtils.isBlank(roleConfig)||StringUtils.isBlank(model.getQueryUserRole())
-                        || !roleConfig.contains(model.getQueryUserRole()))){
-                    member.setFee(null);
-                }
                if(member.getJobYear()!=null){
                     member.setWorkYears(DateUtil.getCurrentYear( ) - member.getJobYear()+1);
                 }
@@ -282,36 +278,38 @@
         return PageData.from(memberIPage);
     }
 
-    private void dealMemberCategoryList(Member member, List<Category> categoryList) {
-        member.setFieldIdList(new ArrayList<>());
-        member.setBustypeIdList(new ArrayList<>());
-        member.setZhanquIdList(new ArrayList<>());
+    private void dealMemberCategoryList(Member member, List<Category> categoryList, Integer queryFlag) {
         member.setFieldList(new ArrayList<>());
         member.setTypeList(new ArrayList<>());
         member.setZqList(new ArrayList<>());
+        member.setBustypeIdList(new ArrayList<>());
+        member.setZhanquIdList(new ArrayList<>());
         for(Category c:categoryList){
-//            0=鎴樺尯;1=鍟嗕笟鍖�;2=鎿呴暱棰嗗煙;
-            if(Constants.equalsInteger(c.getType(),Constants.ZERO)&& StringUtils.contains(member.getZhanquIds(),"["+c.getId()+"]")){
-                //鎴樺尯
-                member.getZqList().add(c);
-                member.getZhanquIdList().add(c.getId());
-            }
             if(Constants.equalsInteger(c.getType(),Constants.ONE)&& StringUtils.contains(member.getBustypeIds(),"["+c.getId()+"]")){
                 //鍟嗕笟鍖�
                 member.getTypeList().add(c);
                 member.getBustypeIdList().add(c.getId());
             }
-            if(Constants.equalsInteger(c.getType(),Constants.TWO) && StringUtils.contains(member.getFieldIds(),"["+c.getId()+"]")){
-                //鎿呴暱棰嗗煙
-                member.getFieldList().add(c);
-                member.getFieldIdList().add(c.getId());
+            if(Constants.equalsInteger(queryFlag,Constants.ONE)) {
+                //            0=鎴樺尯;1=鍟嗕笟鍖�;2=鎿呴暱棰嗗煙;
+                if(Constants.equalsInteger(c.getType(),Constants.ZERO)&& StringUtils.contains(member.getZhanquIds(),"["+c.getId()+"]")){
+                    //鎴樺尯
+                    member.getZqList().add(c);
+                    member.getZhanquIdList().add(c.getId());
+                }
+                if(Constants.equalsInteger(c.getType(),Constants.TWO) && StringUtils.contains(member.getFieldIds(),"["+c.getId()+"]")){
+                    //鎿呴暱棰嗗煙
+                    member.getFieldList().add(c);
+                    member.getFieldIdList().add(c.getId());
+                }
             }
+
         }
     }
 
 
     @Override
-    public Member findDetailById(Integer id,String queryUserRole) {
+    public Member findDetailById(Integer id,String userRole) {
         Member member = memberMapper.selectJoinOne(Member.class, new MPJLambdaWrapper<Member>()
                 .selectAll(Member.class)
                 .select(" c1.NAME ", Member::getPromotionName)
@@ -336,7 +334,7 @@
        }
 
         String resourcePath = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode();
-        String path =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
+        String path =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.MEMBER_FILES).getCode();
         String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
         member.setFullImgurl(StringUtils.isNotBlank(member.getImgurl())?(resourcePath  + path + member.getImgurl()):"");
         List<Cases> casesList = casesMapper.selectList(new QueryWrapper<Cases>().lambda()
@@ -345,7 +343,7 @@
                 .orderByDesc(Cases::getId)
         );
         if(CollectionUtils.isNotEmpty(casesList)){
-            String casePath =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CASES_FILES).getCode();
+            String casePath =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
             for (Cases cases:casesList) {
                 List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                         .eq(Multifile::getObjId,cases.getId())
@@ -356,11 +354,12 @@
                 multifileList.forEach(multifile -> {
                     multifile.setUrl(StringUtils.isNotBlank(multifile.getFileurl())?(resourcePath  + casePath + multifile.getFileurl()):"");
                 });
+                cases.setFileList(multifileList);
             }
             member.setCasesList(casesList);
         }
-        if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(queryUserRole)
-                || !roleConfig.contains(queryUserRole)){
+        if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(userRole)
+                || !(roleConfig.contains(userRole)||userRole.equals(Constants.DD_USER_TYPE) )){
             member.setFee(null);
         }
         return member;
@@ -390,4 +389,5 @@
     }
 
 
+
 }
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index 492ab94..2433c64 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -86,4 +86,9 @@
   # 妯″紡锛宼esting娴嬭瘯妯″紡
   mode: testing
 
+dingtalk:
+  clientId: dingulzemj5bynjciapg
+  clientSecret: tLnWtSmmTuqjX9a1MvJzYxI1iXVJxEwtyZZYYFQ5cLg57pzzCZ4J8VsVwvmRNtkK
+
+
 
diff --git a/server/web/src/main/java/com/doumee/api/web/LoginController.java b/server/web/src/main/java/com/doumee/api/web/LoginController.java
index e4a8040..80b7ca5 100644
--- a/server/web/src/main/java/com/doumee/api/web/LoginController.java
+++ b/server/web/src/main/java/com/doumee/api/web/LoginController.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.doumee.api.BaseController;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.config.annotation.LoginRequired;
@@ -10,6 +11,7 @@
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.constants.Constants;
+import com.doumee.core.dingTalk.DingTalk;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
@@ -18,16 +20,19 @@
 import com.doumee.dao.business.dto.LoginRequestNewParam;
 import com.doumee.dao.business.model.Category;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.system.dto.DingLoginDTO;
 import com.doumee.dao.system.model.SystemJob;
 import com.doumee.dao.vo.WebLoginUserVO;
 import com.doumee.service.business.CategoryService;
 import com.doumee.service.business.MemberService;
 import com.sun.deploy.net.HttpUtils;
+import com.taobao.api.ApiException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -42,6 +47,7 @@
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 /**
@@ -67,14 +73,17 @@
     @Autowired
     private MemberService memberService;
 
+    @Autowired
+    private DingTalk dingTalk;
+
 
     @ApiOperation("UK鍗曠偣鐧诲綍")
     @GetMapping("/ukLogin")
     public void ukLogin(String tick, Object obj, HttpServletRequest request, HttpServletResponse response) throws Exception  {
         LoginRequestNewParam requestParam = new LoginRequestNewParam();
-        /*// UK_ERROR_URL = "http://u.zhibang.com/sso/web/token/error";
+        // UK_ERROR_URL = "http://u.zhibang.com/sso/web/token/error";
         String errorUrl =systemDictDataBiz.queryByCode(Constants.ZBOM_PARAM,Constants.ZBOM_UK_ERROR_URL).getCode();
-        try {
+       /* try {
             log.error("璇锋眰鍙傛暟TICK鏈�鍘熷===========锛�" + tick);
             JSONObject urlParams = new JSONObject();
             log.info("璇锋眰鍙傛暟锛�" + JSON.toJSONString(urlParams));
@@ -106,6 +115,19 @@
         response.sendRedirect(requestParam.getRediUrl()+"?token="+token);
     }
 
+    @ApiOperation("閽夐拤鐧诲綍")
+    @PostMapping("/ddLogin")
+    public ApiResponse<WebLoginUserVO> ddLogin(@Validated @RequestBody DingLoginDTO dingLoginDTO)  throws ApiException {
+        WebLoginUserVO loginUserVO = new WebLoginUserVO();
+        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse response = dingTalk.getDDUserByCode(dingLoginDTO);
+        if(Objects.nonNull(response)){
+            loginUserVO.setId(response.getUserid());
+            loginUserVO.setRoleType(Constants.DD_USER_TYPE);
+        }
+        loginUserVO.setToken(jwtTokenUtil.generateToken(loginUserVO));
+        return ApiResponse.success(loginUserVO);
+    }
+
 
     private String enCode(String string) {
         // TODO Auto-generated method stub
@@ -129,7 +151,17 @@
         WebLoginUserVO loginUserVO = this.getMemberResponse();
         pageWrap.getModel().setQueryUserRole(loginUserVO.getRoleType());
         pageWrap.getModel().setQueryZQCode(loginUserVO.getZhanqu());
-        return ApiResponse.success(memberService.findPage(pageWrap));
+        PageData<Member> pageData = memberService.findPage(pageWrap);
+        if(CollectionUtils.isNotEmpty(pageData.getRecords())){
+            String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
+            if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(pageWrap.getModel().getQueryUserRole())
+                    || ! (roleConfig.contains(pageWrap.getModel().getQueryUserRole()) || pageWrap.getModel().getQueryUserRole().equals(Constants.DD_USER_TYPE) )){
+                pageData.getRecords().forEach(i->{
+                    i.setFee(null);
+                });
+            }
+        }
+        return ApiResponse.success(pageData);
     }
 
 
@@ -158,4 +190,7 @@
 
 
 
+
+
+
 }

--
Gitblit v1.9.3