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