doum
2026-01-30 980757bcfdd3ff2512e2dd7c17e3821d29df7b2a
提交忽略文件
已添加3个文件
已修改15个文件
593 ■■■■■ 文件已修改
admin/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCasesListWindow.vue 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberListWindow.vue 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalWindow.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/importRecord.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/member.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/init/InitService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Cases.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Member.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/ImportRecordService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env
@@ -10,4 +10,4 @@
VUE_APP_CONTEXT_PATH = './'
# æŽ¥å£å‰ç¼€
VUE_APP_API_PREFIX = '/jinkuai_admin'
VUE_APP_API_PREFIX = '/dianjiang_admin_api'
admin/.env.development
@@ -1,3 +1,3 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
VUE_APP_API_URL = 'http://localhost:10010'
VUE_APP_API_URL = 'http://localhost:11010'
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'
admin/package.json
@@ -1,5 +1,5 @@
{
  "name": "jinkuai",
  "name": "zbom_dianjiang",
  "version": "1.0.0",
  "private": true,
  "scripts": {
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>
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>
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;
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,11 +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"
@@ -82,7 +97,8 @@
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
    <OperaMemberListWindow ref="OperaMemberListWindow" @success="handlePageChange"/>
    <OperaCasesListWindow ref="OperaCasesListWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
@@ -90,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 {
      // æœç´¢
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 {
      // æœç´¢
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();
    }
}
server/admin/src/main/resources/application.yml
@@ -1,6 +1,6 @@
# ç«¯å£å™¨é…ç½®
server:
  port: 10010
  port: 11010
# é¡¹ç›®ä¿¡æ¯é…ç½®
project:
  name: å¿—邦-点将
server/services/src/main/java/com/doumee/dao/business/model/Cases.java
@@ -99,6 +99,9 @@
    @TableField(exist = false)
    private List<byte[]> imgdataList;
    @ApiModelProperty(value = "是否包含已删除 0不包含 1包含;", example = "1")
    @TableField(exist = false)
    private int containDeleted;
}
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;
}
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;
}
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();
}
server/services/src/main/java/com/doumee/service/business/impl/CasesServiceImpl.java
@@ -177,7 +177,6 @@
    public PageData<Cases> findPage(PageWrap<Cases> pageWrap) {
        IPage<Cases> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Cases> queryWrapper = new MPJLambdaWrapper<>();
        pageWrap.getModel().setDeleted(Constants.ZERO);
        queryWrapper.selectAll(Cases.class)
                .selectAs(Member::getName,Cases::getMemberName)
                .selectAs(Member::getCode,Cases::getMemberCode)
@@ -185,8 +184,8 @@
                .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());
server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
@@ -38,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;
@@ -141,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());
@@ -499,6 +501,32 @@
    }
    /**
     * å¼‚步执行文件任务
     */
    @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
     */
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)