doum
4 天以前 078a5c4ced367fdbd5a16c27c8bada6e44e632d5
最新版本541200007
已添加4个文件
已修改42个文件
1320 ■■■■ 文件已修改
admin/src/api/business/jkSketch.js 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkSketchLine.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkLineImportWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkSketchImportWindow.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkSketchLineListWindow.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkSketchResultWindow.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkSketch.vue 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCloudController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchLineCloudController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkCustomerImport.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkLineImport.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkOrdersImport.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkOrdersMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchCustomerMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchLineMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkOrdersServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchCustomerServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchLineServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java 396 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkSketch.js
@@ -2,14 +2,29 @@
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/jkSketch/page', data, {
  return request.post('/visitsAdmin/cloudService/business/jkSketch/page', data, {
    trim: true
  })
}
export function importExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/jkSketch/importExcel', data)
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/business/jkSketch/exportExcel', data, {
  return request.post('/visitsAdmin/cloudService/business/jkSketch/exportExcel', data, {
    trim: true,
    download: true
  })
}
export function exportResultExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/jkSketchCustomer/exportExcel', data, {
    trim: true,
    download: true
  })
}
export function exportOrdersExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/jkOrders/exportExcel', data, {
    trim: true,
    download: true
  })
@@ -17,12 +32,12 @@
// åˆ›å»º
export function create (data) {
  return request.post('/business/jkSketch/create', data)
  return request.post('/visitsAdmin/cloudService/business/jkSketch/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/jkSketch/updateById', data)
  return request.post('/visitsAdmin/cloudService/business/jkSketch/updateById', data)
}
// åˆ é™¤
@@ -32,7 +47,7 @@
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/business/jkSketch/delete/batch', {
  return request.get('/visitsAdmin/cloudService/business/jkSketch/delete/batch', {
    params: {
      ids
    }
admin/src/api/business/jkSketchLine.js
@@ -6,6 +6,11 @@
    trim: true
  })
}
export function allList (data) {
  return request.post('/visitsAdmin/cloudService/business/jkSketchLine/list', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
admin/src/components/business/OperaJkLineImportWindow.vue
@@ -12,7 +12,7 @@
      1.请先下载文件模板,并按照模板要去填写表格内容;<br>
    </p>
    <el-form class="demo-form-inline" >
      <el-form-item label="新路信息" required>
      <el-form-item label="线路信息" required>
        <div style="width: 100%;display: flex;align-items: center;">
          <el-button type="primary"   @click="clickRef">点击上传</el-button>
          <el-button type="text" @click="exportTemplate">点击下载模版.EXCEL</el-button>
admin/src/components/business/OperaJkSketchImportWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
<template>
  <el-dialog
      class="center-title"
      :title="title"
      width="500px"
      top="30vh"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <p class="tip-warn"><i class="el-icon-warning"></i>导入说明:<br>
      1.请先下载文件模板,并按照模板要去填写表格内容;<br>
      2.每次导入销售订单表示即删除之前导入此次相应日期的订单记录,以此次导入的数据为主;<br>
    </p>
    <el-form class="demo-form-inline"  :model="form" ref="form" :rules="rules">
      <el-form-item label="送货日期" prop="dateInfo"  >
        <el-date-picker v-model="form.dateInfo" value-format="yyyy-MM-dd" placeholder="请输入日期" />
      </el-form-item>
      <el-form-item label="订单信息" required>
        <div style="width: 100%;display: flex;align-items: center;">
          <el-button type="primary"   @click="clickRef">点击上传</el-button>
          <el-button type="text" @click="exportTemplate">点击下载模版.EXCEL</el-button>
        </div>
        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
      </el-form-item>
    </el-form>
    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
    <template   v-slot:footer>
      <el-button @click="visible=false">返回</el-button>
    </template>
  </el-dialog>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { importExcel } from '@/api/business/jkSketch'
export default {
  extends: BaseOpera,
  // eslint-disable-next-line vue/no-unused-components
  components: { GlobalWindow },
  data () {
    return {
      importing: false,
      fileName: '',
      form: {
        dateInfo: null
      },
      rules: {
        dateInfo: [{ required: true, message: '请选择送货日期' }]
      }
    }
  },
  methods: {
    open (title) {
      this.title = title
      this.fileName = ''
      this.visible = true
    },
    // å¯¼å‡ºæ¨¡æ¿
    exportTemplate () {
      // æŠ•保申请
      window.open('/template/jkOrdersTemplate.xlsx')
    },
    clickRef () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        this.$refs.fileExcel.click()
      })
    },
    result (e) {
      const data = new FormData()
      data.append('dateInfo', this.form.dateInfo)
      data.append('file', e.target.files[0])
      importExcel(data)
        .then(res => {
          this.$message.success('导入成功')
          this.$emit('success')
          this.visible = false
        })
        .catch(err => {
          // this.$message.error(err)
          this.fileName = ''
        })
        .finally(() => {
          this.$refs.fileExcel.value = null
        })
    }
  }
}
</script>
<style lang="scss" scoped>
</style>
admin/src/components/business/OperaJkSketchLineListWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
<template>
  <GlobalWindow
    :title="title"
    width="85%"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <div  style="display: block;margin-bottom: 30px;">
      <div style="display: block;font-size: 16px;font-weight: 600;margin-bottom: 20px;">主线路信息</div>
      <div style="display: flex;">
          <div style="flex: 1">送货日期:{{model.dateInfo ||''}}</div>
          <div style="flex: 1">主线路:{{model.categoryName ||''}}</div>
          <div style="flex: 1">客户数:{{model.orderNum ||'-'}}</div>
          <div style="flex: 1">送货量(条):{{model.totalNum ||'-'}}</div>
      </div>
    </div>
    <div style="display: block">
      <div  style="display: block;font-size: 16px;font-weight: 600;margin-bottom: 10px;">线路明细</div>
      <div>
        <el-table  :data="dataList" stripe  >
          <el-table-column prop="dateInfo" label="送货日期" min-width="130px"></el-table-column>
          <el-table-column prop="lineName" label="送货线路" min-width="130px">  </el-table-column>
          <el-table-column prop="orderNum" label="客户数(户)" min-width="130px"></el-table-column>
          <el-table-column prop="totalNum" label="送货量(条)" min-width="130px"></el-table-column>
          <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
          <el-table-column prop="memberName" label="送货司机" min-width="100px"></el-table-column>
        </el-table>
      </div>
    </div>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
export default {
  name: 'OperaJkSketchLineWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      // è¡¨å•数据
      model: {
      },
      dataList:[],
    }
  },
  created () {
    this.config({
      api: '/business/jkSketchLine',
      'field.id': 'id'
    })
  },
  methods:{
    open (title, target) {
      this.title = title
      this.visible = true
      this.model= target
      this.loadList()
    },
    loadList () {
      this.api.allList({
        sketchId: this.model.id
      }).then(res => {
        this.dataList = res
      })
    },
  }
}
</script>
admin/src/components/business/OperaJkSketchResultWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
<template>
  <el-dialog
      class="center-title"
      :title="title"
      width="500px"
      top="30vh"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <p class="tip-warn"><i class="el-icon-warning"></i>导入说明:<br>
      1.请先下载文件模板,并按照模板要去填写表格内容;<br>
      2.每次导入销售订单表示即删除之前导入此次相应日期的订单记录,以此次导入的数据为主;<br>
    </p>
    <el-form class="demo-form-inline" >
      <el-form-item label="线路信息" required>
        <div style="width: 100%;display: flex;align-items: center;">
          <el-button type="primary"   @click="clickRef">点击上传</el-button>
          <el-button type="text" @click="exportTemplate">点击下载模版.EXCEL</el-button>
        </div>
        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
      </el-form-item>
    </el-form>
    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
    <template   v-slot:footer>
      <el-button @click="visible=false">返回</el-button>
    </template>
  </el-dialog>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { importExcel } from '@/api/business/jkLine'
export default {
  extends: BaseOpera,
  // eslint-disable-next-line vue/no-unused-components
  components: { GlobalWindow },
  data () {
    return {
      importing:false,
      fileName: ''
    }
  },
  methods: {
    open (title) {
      this.title = title
      this.fileName = ''
      this.visible = true
    },
    // å¯¼å‡ºæ¨¡æ¿
    exportTemplate () {
      // æŠ•保申请
      window.open('/template/jkLineTemplate.xlsx')
    },
    clickRef () {
      this.$refs.fileExcel.click()
    },
    result (e) {
      const data = new FormData()
      data.append('file', e.target.files[0])
      importExcel(data)
        .then(res => {
          this.$message.success('导入成功')
          this.$emit('success')
          this.visible = false
        })
        .catch(err => {
          // this.$message.error(err)
          this.fileName = ''
        })
        .finally(() => {
          this.$refs.fileExcel.value = null
        })
    }
  }
}
</script>
<style lang="scss" scoped>
</style>
admin/src/views/business/jkSketch.vue
@@ -2,81 +2,57 @@
  <TableLayout :permissions="['business:jksketch:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="主键" prop="id">
        <el-input v-model="searchForm.id" placeholder="请输入主键" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入创建人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间" @change="search"/>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间" @change="search"/>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="searchForm.info" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="主线路编码(关联category)" prop="categoryId">
        <el-input v-model="searchForm.categoryId" placeholder="请输入主线路编码(关联category)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="送货量" prop="totalNum">
        <el-input v-model="searchForm.totalNum" placeholder="请输入送货量" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="客户数" prop="orderNum">
        <el-input v-model="searchForm.orderNum" placeholder="请输入客户数" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态 0未优化 1优化中 2已优化" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0未优化 1优化中 2已优化" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="searchForm.sortnum" placeholder="请输入排序码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="日期" prop="dateInfo">
      <el-form-item label="送货日期" prop="dateInfo">
        <el-date-picker v-model="searchForm.dateInfo" value-format="yyyy-MM-dd" placeholder="请输入日期" @change="search"/>
      </el-form-item>
      <el-form-item label="优化记录编码(作为key值存redis)" prop="jobId">
        <el-input v-model="searchForm.jobId" placeholder="请输入优化记录编码(作为key值存redis)" @keypress.enter.native="search"></el-input>
      <el-form-item label="状态" prop="status" >
        <el-select v-model="searchForm.status" placeholder="请选择" clearable @change="search">
          <el-option label="未优化" value="0"></el-option>
          <el-option label="优化中" value="1"></el-option>
          <el-option label="已优化" value="2"></el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jksketch:exportExcel']" @click="exportExcel">导出</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:jksketch:create', 'business:jksketch:delete']">
      <ul class="toolbar" v-permissions="['business:jksketch:create']">
        <li><el-button icon="el-icon-upload"  type="primary" @click="$refs.OperaJkSketchImportWindow.open('销售订单导入')"  v-permissions="['business:jksketch:create']">销售订单导入</el-button></li>
        <!--
        <li><el-button type="primary" @click="$refs.operaJkSketchWindow.open('新建交控-线路优化记录信息表')" icon="el-icon-plus" v-permissions="['business:jksketch:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jksketch:delete']">删除</el-button></li>
        -->
        <li> <el-button type="primary" :loading="isWorking.export" v-permissions="['business:jksketch:exportExcel']" @click="exportExcel">导出列表数据</el-button></li>
        <li> <el-button type="primary" :loading="isWorking.export1" v-permissions="['business:jksketch:exportExcel']" @click="exportExcel1">导出优化结果</el-button></li>
        <li> <el-button type="primary" :loading="isWorking.export2" v-permissions="['business:jksketch:exportExcel']" @click="exportExcel2">导出销售订单</el-button></li>
      </ul>
      <el-table
          :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
<!--
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="categoryId" label="主线路编码(关联category)" min-width="100px"></el-table-column>
        <el-table-column prop="totalNum" label="送货量" min-width="100px"></el-table-column>
        <el-table-column prop="orderNum" label="客户数" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0未优化 1优化中 2已优化" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="dateInfo" label="日期" min-width="100px"></el-table-column>
        <el-table-column prop="jobId" label="优化记录编码(作为key值存redis)" min-width="100px"></el-table-column>
-->
        <el-table-column prop="dateInfo" label="送货日期" min-width="130px"></el-table-column>
        <el-table-column prop="categoryName" label="主线路" min-width="130px">
          <template slot-scope="{row}">
            <span class="blue" style="cursor: pointer" @click="$refs.operaJkSketchLineListWindow.open('配送线路明细', row)">{{ row.categoryName }}({{row.lineNum||0}}条线路)</span>
          </template>
        </el-table-column>
        <el-table-column prop="orderNum" label="客户数(户)" min-width="130px"></el-table-column>
        <el-table-column prop="totalNum" label="送货量(条)" min-width="130px"></el-table-column>
        <el-table-column prop="status" label="优化状态" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.status === 0" class="blue">未优化</span>
            <span v-if="row.status === 1" class="red">优化中</span>
            <span v-if="row.status === 2" class="green">已优化</span>
          </template>
        </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:jksketch:update', 'business:jksketch:delete'])"
          label="操作"
@@ -84,8 +60,8 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaJkSketchWindow.open('编辑交控-线路优化记录信息表', row)" icon="el-icon-edit" v-permissions="['business:jksketch:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jksketch:delete']">删除</el-button>
            <el-button type="text" @click="$refs.operaJkSketchWindow.open('线路优化', row)" icon="el-icon-edit" v-permissions="['business:jksketch:update']">线路优化</el-button>
            <el-button type="text" @click="$refs.OperaJkSketchResultWindow.open('线路优化结果', row)" icon="el-icon-view" v-if="row.status ==2" >优化结果</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -98,6 +74,9 @@
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaJkSketchWindow ref="operaJkSketchWindow" @success="handlePageChange"/>
    <OperaJkSketchResultWindow ref="OperaJkSketchResultWindow" @success="handlePageChange"/>
    <OperaJkSketchImportWindow ref="OperaJkSketchImportWindow" @success="handlePageChange"/>
    <OperaJkSketchLineListWindow ref="operaJkSketchLineListWindow"  />
  </TableLayout>
</template>
@@ -106,28 +85,23 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaJkSketchWindow from '@/components/business/OperaJkSketchWindow'
import OperaJkSketchLineListWindow from '@/components/business/OperaJkSketchLineListWindow'
import OperaJkSketchResultWindow from '@/components/business/OperaJkSketchResultWindow'
import OperaJkSketchImportWindow from '@/components/business/OperaJkSketchImportWindow'
export default {
  name: 'JkSketch',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaJkSketchWindow },
  components: { TableLayout, Pagination, OperaJkSketchWindow, OperaJkSketchResultWindow, OperaJkSketchImportWindow, OperaJkSketchLineListWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        categoryId: '',
        totalNum: '',
        orderNum: '',
        status: '',
        sortnum: '',
        dateInfo: '',
        jobId: ''
        dateInfo: ''
      },
      isWorking: {
        export1: false,
        export2: false
      }
    }
  },
@@ -139,6 +113,56 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    exportExcel1 () {
      if (!this.searchForm.dateInfo) {
        this.$message.error('请选择指定日期进行该导出操作!')
        return
      }
      this.$dialog.exportConfirm('确认导出吗?')
        .then(() => {
          this.exLoading = true
          this.api.exportResultExcel({
            page: 1,
            capacity: 1000000,
            model: {dateInfo:this.searchForm.dateInfo}
          })
            .then(response => {
              this.download(response)
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.exLoading = false
            })
        })
    },
    exportExcel2 () {
      if (!this.searchForm.dateInfo) {
        this.$message.error('请选择指定日期进行该导出操作!')
        return
      }
      this.$dialog.exportConfirm('确认导出吗?')
        .then(() => {
          this.exLoading = true
          this.api.exportOrdersExcel({
            page: 1,
            capacity: 1000000,
            model: {dateInfo:this.searchForm.dateInfo}
          })
            .then(response => {
              this.download(response)
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.exLoading = false
            })
        })
    }
  }
}
</script>
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -521,6 +521,7 @@
        public static final String IMPORTING_CARS ="IMPORTING_CARS";
        public static final String CHECKING_JKCUSTOMER_LOCATION ="CHECKING_JKCUSTOMER_LOCATION";
        public static final String IMPORTING_JKCUSTOMER ="IMPORTING_JKCUSTOMER";
        public static final String IMPORTING_JKORDERS ="IMPORTING_JKORDERS";
        public static final String IMPORTING_JKLINE ="IMPORTING_JKLINE";
        public static final String IMPORTING_MEMBER ="IMPORTING_MEMBER";
        public static final String BIGSCREEN_UUID ="BIGSCREEN_UUID";
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -2501,6 +2501,16 @@
            return null;
        }
    }
    public static Date getDateFromShortString(String strDate) {
        if (StringUtils.isEmpty(strDate)) {
          return  null;
        }
        try {
            return sdfLong.parse(strDate);
        } catch (Exception ex) {
            return null;
        }
    }
    // -----------------------------------------------------------------------
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java
@@ -97,7 +97,7 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
    })
    @CloudRequiredPermission("business:cars:create")
    @CloudRequiredPermission("business:jkcustomer:create")
    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        List<JkCustomer> list = jkCustomerService.importBatch(file,this.getLoginUser(token));
        return ApiResponse.success("导入成功");
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java
@@ -104,7 +104,7 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
    })
    @CloudRequiredPermission("business:cars:create")
    @CloudRequiredPermission("business:jkline:create")
    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        List<JkLine> list = jkLineService.importBatch(file,this.getLoginUser(token));
        return ApiResponse.success("导入成功");
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchCloudController.java
@@ -5,17 +5,19 @@
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.JkCustomer;
import com.doumee.dao.business.model.JkSketch;
import com.doumee.service.business.JkSketchService;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -35,14 +37,14 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jksketch:create")
    public ApiResponse create(@RequestBody JkSketch jkSketch) {
    public ApiResponse create(@RequestBody JkSketch jkSketch, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkSketchService.create(jkSketch));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jksketch:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkSketchService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -50,7 +52,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jksketch:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -63,7 +65,7 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jksketch:update")
    public ApiResponse updateById(@RequestBody JkSketch jkSketch) {
    public ApiResponse updateById(@RequestBody JkSketch jkSketch, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkSketchService.updateById(jkSketch);
        return ApiResponse.success(null);
    }
@@ -71,21 +73,33 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jksketch:query")
    public ApiResponse<PageData<JkSketch>> findPage (@RequestBody PageWrap<JkSketch> pageWrap) {
    public ApiResponse<PageData<JkSketch>> findPage (@RequestBody PageWrap<JkSketch> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkSketchService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jksketch:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkSketch> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<JkSketch> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkSketch.class).export(jkSketchService.findPage(pageWrap).getRecords(), "交控-线路优化记录信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jksketch:query")
    public ApiResponse findById(@PathVariable Integer id) {
    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkSketchService.findById(id));
    }
    @ApiOperation(value = "订单信息导入" ,notes = "订单信息导入")
    @PostMapping("/importExcel")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
            @ApiImplicitParam(name = "dateInfo", value = "dateInfo", required = true, paramType = "query", dataType = "String" ),
    })
    @CloudRequiredPermission("business:jksketch:create")
    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file,  String dateInfo, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        List<JkSketch> list = jkSketchService.importBatch(file,dateInfo,this.getLoginUser(token));
        return ApiResponse.success("导入成功");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkSketchLineCloudController.java
@@ -74,6 +74,12 @@
    public ApiResponse<PageData<JkSketchLine>> findPage (@RequestBody PageWrap<JkSketchLine> pageWrap) {
        return ApiResponse.success(jkSketchLineService.findPage(pageWrap));
    }
    @ApiOperation("查询全部列表")
    @PostMapping("/list")
    @CloudRequiredPermission("business:jksketchline:query")
    public ApiResponse<List<JkSketchLine>> findList (@RequestBody  JkSketchLine pageWrap) {
        return ApiResponse.success(jkSketchLineService.findList(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkCustomerImport.java
@@ -5,7 +5,7 @@
import lombok.Data;
/**
 * å‘˜å·¥ä¿¡æ¯å¯¼å…¥è¡¨
 * çº¿è·¯å®¢æˆ·ä¿¡æ¯å¯¼å…¥
 * @author æ±Ÿè¹„蹄
 * @date 2024/01/16 10:03
 */
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkLineImport.java
@@ -5,7 +5,7 @@
import lombok.Data;
/**
 * å‘˜å·¥ä¿¡æ¯å¯¼å…¥è¡¨
 * çº¿è·¯ä¿¡æ¯å¯¼å…¥
 * @author æ±Ÿè¹„蹄
 * @date 2024/01/16 10:03
 */
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkOrdersImport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.admin.request;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * å®¢æˆ·è®¢å•信息导入
 * @author æ±Ÿè¹„蹄
 * @date 2024/01/16 10:03
 */
@Data
@ApiModel("客户订单信息导入")
public class JkOrdersImport {
    @ExcelColumn(name="客户简码",value = "code",index = 0)
    private String code;
    @ExcelColumn(name="客户名称",value = "name",index = 1)
    private String name;
    @ExcelColumn(name="数量" , value = "num",index = 2)
    private String num;
    @ExcelColumn(name="线路",value = "lineName",index = 3)
    private String lineName;
    @ExcelColumn(name="序号",value = "sortnum",index = 4)
    private String sortnum;
    @ExcelColumn(name="地址",value = "dateInfo",index = 5)
    private String dateInfo;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkOrdersMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkOrders;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkOrdersMapper extends BaseMapper<JkOrders> {
public interface JkOrdersMapper extends MPJBaseMapper<JkOrders> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchCustomerMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkSketchCustomer;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkSketchCustomerMapper extends BaseMapper<JkSketchCustomer> {
public interface JkSketchCustomerMapper extends MPJBaseMapper<JkSketchCustomer> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchLineMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkSketchLine;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkSketchLineMapper extends BaseMapper<JkSketchLine> {
public interface JkSketchLineMapper extends MPJBaseMapper<JkSketchLine> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkSketchMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkSketch;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkSketchMapper extends BaseMapper<JkSketch> {
public interface JkSketchMapper extends MPJBaseMapper<JkSketch> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
@@ -24,6 +24,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java
@@ -23,6 +23,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
@@ -23,6 +23,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
@@ -25,6 +25,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    //@ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java
@@ -23,6 +23,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
@@ -23,6 +23,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java
@@ -24,6 +24,7 @@
    @ApiModelProperty(value = "主键", example = "1")
    //@ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkOrders.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -9,6 +10,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -22,62 +25,84 @@
public class JkOrders  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    //@ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    //@ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    //@ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    //@ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    //@ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    //@ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    //@ExcelColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "名称", example = "1")
    @ExcelColumn(name="名称")
    private Integer name;
    @ApiModelProperty(value = "客户编码关联(jk_customer)", example = "1")
    //@ExcelColumn(name="客户编码关联")
    private Integer customerId;
    @ApiModelProperty(value = "销量", example = "1")
    @ExcelColumn(name="销量")
    private Integer num;
    @ExcelColumn(name="数量",index = 3,width = 10)
    private BigDecimal num;
    @ApiModelProperty(value = "送货路线编码(关联jk_line)", example = "1")
    @ExcelColumn(name="送货路线编码(关联jk_line)")
    //@ExcelColumn(name="送货路线编码(关联jk_line)")
    private Integer lineId;
    @ApiModelProperty(value = "状态 0正常 ç¦ç”¨", example = "1")
    @ExcelColumn(name="状态 0正常 ç¦ç”¨")
    //@ExcelColumn(name="状态 0正常 ç¦ç”¨")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "序号", example = "1")
    @ExcelColumn(name="序号",index = 5,width = 10)
    private String sortnum;
    @ApiModelProperty(value = "日期")
    @ExcelColumn(name="日期")
    @ExcelColumn(name="送货日期",index = 6,width = 10)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dateInfo;
    @ApiModelProperty(value = "同班组间客户位置距离数组,[{a:12,b:100},{a:13,b:200},...],a:客户编码,b:与客户a之间的距离")
    @ExcelColumn(name="同班组间客户位置距离数组,[{a:12,b:100},{a:13,b:200},...],a:客户编码,b:与客户a之间的距离")
    //@ExcelColumn(name="同班组间客户位置距离数组,[{a:12,b:100},{a:13,b:200},...],a:客户编码,b:与客户a之间的距离")
    private String distances;
    @ApiModelProperty(value = "客户姓名", example = "1")
    @ExcelColumn(name="客户姓名",index = 2,width = 10)
    @TableField(exist = false)
    private String name;
    @ApiModelProperty(value = "客户编码", example = "1")
    @ExcelColumn(name="客户编码",index = 1,width = 10)
    @TableField(exist = false)
    private String code;
    @ApiModelProperty(value = "线路名称", example = "1")
    @ExcelColumn(name="线路",index = 4,width = 10)
    @TableField(exist = false)
    private String lineName;
    @ApiModelProperty(value = "所属主线路", example = "1")
    //@ExcelColumn(name="所属主线路",index = 2,width = 10)
    @TableField(exist = false)
    private String categoryName;
    @ApiModelProperty(value = "所属主线路编码", example = "1")
    //@ExcelColumn(name="所属主线路",index = 2,width = 10)
    @TableField(exist = false)
    private Integer categoryId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketch.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -9,6 +10,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -22,62 +25,70 @@
public class JkSketch  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    //@ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    //@ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    //@ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    //@ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    //@ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    //@ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    //@ExcelColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "主线路编码(关联category)", example = "1")
    @ExcelColumn(name="主线路编码(关联category)")
    //@ExcelColumn(name="主线路编码(关联category)")
    private Integer categoryId;
    @ApiModelProperty(value = "当前线路数", example = "1")
    //@ExcelColumn(name="主线路编码(关联category)")
    private Integer lineNum;
    @ApiModelProperty(value = "送货量", example = "1")
    @ExcelColumn(name="送货量")
    private Integer totalNum;
    @ExcelColumn(name="送货量(条)",index = 4,width = 10)
    private BigDecimal totalNum;
    @ApiModelProperty(value = "客户数", example = "1")
    @ExcelColumn(name="客户数")
    @ExcelColumn(name="客户数(户)",index = 3,width = 7)
    private Integer orderNum;
    @ApiModelProperty(value = "状态 0未优化 1优化中 2已优化", example = "1")
    @ExcelColumn(name="状态 0未优化 1优化中 2已优化")
    @ExcelColumn(name="状态",index = 5,width = 10,valueMapping = "0=未优化;1=优化中;2=已优化;")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    //@ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "优化记录编码(作为key值存redis)", example = "1")
    //@ExcelColumn(name="班组编码(关联category)")
    private String jobId;
    @ApiModelProperty(value = "日期")
    @ExcelColumn(name="日期")
    @ExcelColumn(name="送货日期",index = 1,width = 10)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dateInfo;
    @ApiModelProperty(value = "优化记录编码(作为key值存redis)")
    @ExcelColumn(name="优化记录编码(作为key值存redis)")
    private String jobId;
    @ApiModelProperty(value = "所属主线路", example = "1")
    @ExcelColumn(name="主线路",index = 2,width = 10)
    @TableField(exist = false)
    private String categoryName;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchCustomer.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -9,6 +10,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -22,58 +25,83 @@
public class JkSketchCustomer  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    //@ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    //@ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    //@ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    //@ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    //@ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    //@ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    //@ExcelColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "线路编码(关联jk_sketch_line)", example = "1")
    @ExcelColumn(name="线路编码(关联jk_sketch_line)")
    //@ExcelColumn(name="线路编码(关联jk_sketch_line)")
    private Integer sketchLineId;
    @ApiModelProperty(value = "线路优化编码(关联jk_sketch)", example = "1")
    @ExcelColumn(name="线路优化编码(关联jk_sketch)")
    //@ExcelColumn(name="线路优化编码(关联jk_sketch)")
    private Integer sketchId;
    @ApiModelProperty(value = "送货量", example = "1")
    @ExcelColumn(name="送货量")
    private Integer totalNum;
    @ExcelColumn(name="送货量(条)",index =5,width = 10)
    private BigDecimal totalNum;
    @ApiModelProperty(value = "客户数", example = "1")
    @ExcelColumn(name="客户数")
    private Integer orderNum;
    @ApiModelProperty(value = "订单编码(关联jk_orders)", example = "1")
    //@ExcelColumn(name="订单编码(关联jk_orders)")
    private Integer orderId;
    @ApiModelProperty(value = "客户编码(关联jk_customer)", example = "1")
    //@ExcelColumn(name="客户编码(关联jk_customer)")
    private Integer customerId;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    //@ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "日期")
    @ExcelColumn(name="日期")
    @ExcelColumn(name="送货日期",index = 6,width = 10)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dateInfo;
    @ApiModelProperty(value = "客户编码", example = "1")
    @ExcelColumn(name="客户编码",index = 1,width = 10)
    @TableField(exist = false)
    private String code;
    @ApiModelProperty(value = "客户姓名", example = "1")
    @ExcelColumn(name="客户姓名",index = 2,width = 10)
    @TableField(exist = false)
    private String name;
    @ApiModelProperty(value = "线路名称", example = "1")
    @ExcelColumn(name="线路",index = 4,width = 10)
    @TableField(exist = false)
    private String lineName;
    @ApiModelProperty(value = "所属主线路", example = "1")
    @ExcelColumn(name="所属主线路",index = 3,width = 10)
    @TableField(exist = false)
    private String categoryName;
    @ApiModelProperty(value = "所属主线路编码", example = "1")
    //@ExcelColumn(name="所属主线路",index = 2,width = 10)
    @TableField(exist = false)
    private Integer categoryId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkSketchLine.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -9,6 +10,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -21,6 +24,7 @@
@TableName("`jk_sketch_line`")
public class JkSketchLine  extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
@@ -61,7 +65,7 @@
    @ApiModelProperty(value = "送货量", example = "1")
    @ExcelColumn(name="送货量")
    private Integer totalNum;
    private BigDecimal totalNum;
    @ApiModelProperty(value = "客户数", example = "1")
    @ExcelColumn(name="客户数")
@@ -76,4 +80,21 @@
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dateInfo;
    @ApiModelProperty(value = "车牌号", example = "1")
    @TableField(exist = false)
    private String carCode;
    @ApiModelProperty(value = "送货司机", example = "1")
    @TableField(exist = false)
    private String memberName;
    @ApiModelProperty(value = "线路名称", example = "1")
    @TableField(exist = false)
    private String lineName;
    @ApiModelProperty(value = "所属主线路", example = "1")
    @TableField(exist = false)
    private String categoryName;
    @ApiModelProperty(value = "所属主线路编码", example = "1")
    @TableField(exist = false)
    private Integer categoryId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
@@ -21,6 +21,7 @@
@TableName("`jk_version`")
public class JkVersion  extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Warning.java
@@ -21,6 +21,7 @@
@TableName("`warning`")
public class Warning  extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java
@@ -21,6 +21,7 @@
@TableName("`warning_event`")
public class WarningEvent {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    //@ExcelColumn(name="主键")
    private Integer id;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
@@ -23,6 +23,7 @@
public class WarningPush  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @TableId(type = IdType.AUTO)
    //@ExcelColumn(name="主键")
    private Integer id;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRule.java
@@ -24,6 +24,7 @@
public class WarningRule  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @TableId(type = IdType.AUTO)
    @ExcelColumn(name="主键")
    private Integer id;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
@@ -22,6 +22,7 @@
public class WarningRuleDetail  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @TableId(type = IdType.AUTO)
    @ExcelColumn(name="主键")
    private Integer id;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkSketchService.java
@@ -1,8 +1,11 @@
package com.doumee.service.business;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.business.model.JkSketch;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
@@ -94,4 +97,6 @@
     * @return long
     */
    long count(JkSketch jkSketch);
    List<JkSketch> importBatch(MultipartFile file, String dateInfo, LoginUserInfo loginUser);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
@@ -38,6 +38,7 @@
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * è½¦è¾†ä¿¡æ¯è¡¨Service实现
@@ -510,7 +511,7 @@
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在车辆导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_CARS,true);
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_CARS,true,30, TimeUnit.MINUTES);
        try {
            ExcelImporter ie = null;
            List<CarsImport> dataList =null;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java
@@ -38,6 +38,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * äº¤æŽ§-客户信息表Service实现
@@ -299,7 +300,7 @@
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKCUSTOMER,true);
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKCUSTOMER,true,30, TimeUnit.MINUTES);
        try {
            ExcelImporter ie = null;
            List<JkCustomerImport> dataList =null;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java
@@ -34,6 +34,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * äº¤æŽ§-线路信息表Service实现
@@ -230,7 +231,7 @@
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKLINE,true);
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKLINE,true,30, TimeUnit.MINUTES);
        try {
            ExcelImporter ie = null;
            List<JkLineImport> dataList =null;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkOrdersServiceImpl.java
@@ -1,15 +1,17 @@
package com.doumee.service.business.impl;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkOrdersMapper;
import com.doumee.dao.business.model.JkOrders;
import com.doumee.service.business.JkOrdersService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -87,61 +89,68 @@
    @Override
    public PageData<JkOrders> findPage(PageWrap<JkOrders> pageWrap) {
        IPage<JkOrders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkOrders> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<JkOrders> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        queryWrapper.selectAll(JkOrders.class )
                .selectAs(Category::getId,JkOrders::getCategoryId)
                .selectAs(Category::getName,JkOrders::getCategoryName)
                .selectAs(JkCustomer::getCode,JkOrders::getCode)
                .selectAs(JkCustomer::getName,JkOrders::getName)
                .selectAs(JkLine::getName,JkOrders::getLineName)
                .leftJoin(JkCustomer.class,JkCustomer::getId,JkOrders::getCustomerId )
                .leftJoin(JkLine.class,JkLine::getId,JkOrders::getLineId )
                .leftJoin(Category.class,Category::getId,JkLine::getCategoryId );
        queryWrapper.eq( pageWrap.getModel().getCategoryId()!=null, JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
        queryWrapper.eq( pageWrap.getModel().getDateInfo()!=null, JkOrders::getDateInfo, pageWrap.getModel().getDateInfo());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkOrders::getId, pageWrap.getModel().getId());
           queryWrapper.eq(JkOrders::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkOrders::getCreator, pageWrap.getModel().getCreator());
           queryWrapper.eq(JkOrders::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkOrders::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkOrders::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
           queryWrapper.ge(JkOrders::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
           queryWrapper.le(JkOrders::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkOrders::getEditor, pageWrap.getModel().getEditor());
           queryWrapper.eq(JkOrders::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkOrders::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkOrders::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
           queryWrapper.ge(JkOrders::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
           queryWrapper.le(JkOrders::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkOrders::getIsdeleted, pageWrap.getModel().getIsdeleted());
           queryWrapper.eq(JkOrders::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkOrders::getInfo, pageWrap.getModel().getInfo());
           queryWrapper.eq(JkOrders::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().eq(JkOrders::getName, pageWrap.getModel().getName());
           queryWrapper.eq(JkOrders::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getNum() != null) {
            queryWrapper.lambda().eq(JkOrders::getNum, pageWrap.getModel().getNum());
           queryWrapper.eq(JkOrders::getNum, pageWrap.getModel().getNum());
        }
        if (pageWrap.getModel().getLineId() != null) {
            queryWrapper.lambda().eq(JkOrders::getLineId, pageWrap.getModel().getLineId());
           queryWrapper.eq(JkOrders::getLineId, pageWrap.getModel().getLineId());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkOrders::getStatus, pageWrap.getModel().getStatus());
           queryWrapper.eq(JkOrders::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getSortnum() != null) {
            queryWrapper.lambda().eq(JkOrders::getSortnum, pageWrap.getModel().getSortnum());
           queryWrapper.eq(JkOrders::getSortnum, pageWrap.getModel().getSortnum());
        }
        if (pageWrap.getModel().getDateInfo() != null) {
            queryWrapper.lambda().ge(JkOrders::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
            queryWrapper.lambda().le(JkOrders::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
           queryWrapper.ge(JkOrders::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
           queryWrapper.le(JkOrders::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
        }
        if (pageWrap.getModel().getDistances() != null) {
            queryWrapper.lambda().eq(JkOrders::getDistances, pageWrap.getModel().getDistances());
           queryWrapper.eq(JkOrders::getDistances, pageWrap.getModel().getDistances());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkOrdersMapper.selectPage(page, queryWrapper));
        queryWrapper.orderByAsc(JkOrders::getSortnum);
        IPage<JkOrders> result = jkOrdersMapper.selectJoinPage(page, JkOrders.class,queryWrapper);
        return PageData.from(result);
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchCustomerServiceImpl.java
@@ -1,19 +1,23 @@
package com.doumee.service.business.impl;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkSketchCustomerMapper;
import com.doumee.dao.business.model.JkSketchCustomer;
import com.doumee.service.business.JkSketchCustomerService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.RoundingMode;
import java.util.List;
/**
@@ -87,58 +91,64 @@
    @Override
    public PageData<JkSketchCustomer> findPage(PageWrap<JkSketchCustomer> pageWrap) {
        IPage<JkSketchCustomer> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkSketchCustomer> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<JkSketchCustomer> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        queryWrapper.selectAll(JkSketchCustomer.class )
                .selectAs(JkCustomer::getName,JkSketchCustomer::getName)
                .selectAs(JkCustomer::getCode,JkSketchCustomer::getCode)
                .selectAs(JkLine::getName,JkSketchCustomer::getLineName)
                .selectAs(Category::getId,JkSketchCustomer::getCategoryId)
                .selectAs(Category::getName,JkSketchCustomer::getCategoryName)
                .leftJoin(JkOrders.class,JkOrders::getId,JkSketchCustomer::getOrderId )
                .leftJoin(JkCustomer.class,JkCustomer::getId,JkSketchCustomer::getCustomerId )
                .leftJoin(JkLine.class,JkLine::getId,JkOrders::getLineId )
                .leftJoin(Category.class,Category::getId,JkLine::getCategoryId );
        queryWrapper.eq( pageWrap.getModel().getCategoryId()!=null,JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
        queryWrapper.eq( pageWrap.getModel().getDateInfo()!=null,JkSketchCustomer::getDateInfo, pageWrap.getModel().getDateInfo());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getId, pageWrap.getModel().getId());
            queryWrapper.eq(JkSketchCustomer::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getCreator, pageWrap.getModel().getCreator());
            queryWrapper.eq(JkSketchCustomer::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkSketchCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkSketchCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
            queryWrapper.ge(JkSketchCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.le(JkSketchCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getEditor, pageWrap.getModel().getEditor());
            queryWrapper.eq(JkSketchCustomer::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkSketchCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkSketchCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
            queryWrapper.ge(JkSketchCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.le(JkSketchCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
            queryWrapper.eq(JkSketchCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getInfo, pageWrap.getModel().getInfo());
            queryWrapper.eq(JkSketchCustomer::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getSketchLineId() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getSketchLineId, pageWrap.getModel().getSketchLineId());
            queryWrapper.eq(JkSketchCustomer::getSketchLineId, pageWrap.getModel().getSketchLineId());
        }
        if (pageWrap.getModel().getSketchId() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getSketchId, pageWrap.getModel().getSketchId());
            queryWrapper.eq(JkSketchCustomer::getSketchId, pageWrap.getModel().getSketchId());
        }
        if (pageWrap.getModel().getTotalNum() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getTotalNum, pageWrap.getModel().getTotalNum());
            queryWrapper.eq(JkSketchCustomer::getTotalNum, pageWrap.getModel().getTotalNum());
        }
        if (pageWrap.getModel().getOrderNum() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getOrderNum, pageWrap.getModel().getOrderNum());
        if (pageWrap.getModel().getOrderId() != null) {
            queryWrapper.eq(JkSketchCustomer::getOrderId, pageWrap.getModel().getOrderId());
        }
        if (pageWrap.getModel().getSortnum() != null) {
            queryWrapper.lambda().eq(JkSketchCustomer::getSortnum, pageWrap.getModel().getSortnum());
            queryWrapper.eq(JkSketchCustomer::getSortnum, pageWrap.getModel().getSortnum());
        }
        if (pageWrap.getModel().getDateInfo() != null) {
            queryWrapper.lambda().ge(JkSketchCustomer::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
            queryWrapper.lambda().le(JkSketchCustomer::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkSketchCustomerMapper.selectPage(page, queryWrapper));
        queryWrapper.orderByAsc(JkSketchCustomer::getSketchLineId);
        IPage<JkSketchCustomer> result = jkSketchCustomerMapper.selectJoinPage(page, JkSketchCustomer.class,queryWrapper);
        return PageData.from(result);
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchLineServiceImpl.java
@@ -1,15 +1,17 @@
package com.doumee.service.business.impl;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkSketchLineMapper;
import com.doumee.dao.business.model.JkSketchLine;
import com.doumee.service.business.JkSketchLineService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -80,8 +82,21 @@
    @Override
    public List<JkSketchLine> findList(JkSketchLine jkSketchLine) {
        QueryWrapper<JkSketchLine> wrapper = new QueryWrapper<>(jkSketchLine);
        return jkSketchLineMapper.selectList(wrapper);
        MPJLambdaWrapper<JkSketchLine> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(JkSketchLine.class )
                .selectAs(Member::getName,JkSketchLine::getMemberName)
                .selectAs(Cars::getCode,JkSketchLine::getCarCode)
                .selectAs(JkLine::getName,JkSketchLine::getLineName)
                .selectAs(Category::getId,JkSketchLine::getCategoryId)
                .selectAs(Category::getName,JkSketchLine::getCategoryName)
                .leftJoin(JkLine.class,JkLine::getId,JkOrders::getLineId )
                .leftJoin(Cars.class,Cars::getId,JkLine::getCarId )
                .leftJoin(Member.class,Member::getId,Cars::getMemberId )
                .leftJoin(Category.class,Category::getId,JkLine::getCategoryId );
        wrapper.eq( jkSketchLine.getSketchId()!=null,JkSketchLine::getSketchId, jkSketchLine.getSketchId())
                .eq(  JkSketchLine::getIsdeleted,Constants.ZERO);
        return jkSketchLineMapper.selectJoinList(JkSketchLine.class,wrapper);
    }
  
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
@@ -1,20 +1,38 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.annotation.excel.ExcelImporter;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.admin.request.JkCustomerImport;
import com.doumee.dao.admin.request.JkOrdersImport;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkSketchMapper;
import com.doumee.dao.business.model.JkSketch;
import com.doumee.service.business.JkSketchService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * äº¤æŽ§-线路优化记录信息表Service实现
@@ -26,6 +44,22 @@
    @Autowired
    private JkSketchMapper jkSketchMapper;
    @Autowired
    private JkSketchLineMapper jkSketchLineMapper;
    @Autowired
    private JkSketchCustomerMapper jkSketchCustomerMapper;
    @Autowired
    private JkCustomerMapper jkCustomerMapper;
    @Autowired
    private JkLineMapper jkLineMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private JkOrdersMapper jkOrdersMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Override
    public Integer create(JkSketch jkSketch) {
@@ -87,61 +121,62 @@
    @Override
    public PageData<JkSketch> findPage(PageWrap<JkSketch> pageWrap) {
        IPage<JkSketch> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkSketch> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<JkSketch> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        queryWrapper.selectAll(JkSketch.class )
                .selectAs(Category::getId,JkSketch::getCategoryId)
                .selectAs(Category::getName,JkSketch::getCategoryName)
                .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId );
        queryWrapper.eq( pageWrap.getModel().getCategoryId()!=null,JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkSketch::getId, pageWrap.getModel().getId());
            queryWrapper.eq(JkSketch::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkSketch::getCreator, pageWrap.getModel().getCreator());
            queryWrapper.eq(JkSketch::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkSketch::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkSketch::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
            queryWrapper.ge(JkSketch::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.le(JkSketch::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkSketch::getEditor, pageWrap.getModel().getEditor());
            queryWrapper.eq(JkSketch::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkSketch::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkSketch::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
            queryWrapper.ge(JkSketch::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.le(JkSketch::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkSketch::getIsdeleted, pageWrap.getModel().getIsdeleted());
            queryWrapper.eq(JkSketch::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkSketch::getInfo, pageWrap.getModel().getInfo());
            queryWrapper.eq(JkSketch::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getCategoryId() != null) {
            queryWrapper.lambda().eq(JkSketch::getCategoryId, pageWrap.getModel().getCategoryId());
            queryWrapper.eq(JkSketch::getCategoryId, pageWrap.getModel().getCategoryId());
        }
        if (pageWrap.getModel().getTotalNum() != null) {
            queryWrapper.lambda().eq(JkSketch::getTotalNum, pageWrap.getModel().getTotalNum());
            queryWrapper.eq(JkSketch::getTotalNum, pageWrap.getModel().getTotalNum());
        }
        if (pageWrap.getModel().getOrderNum() != null) {
            queryWrapper.lambda().eq(JkSketch::getOrderNum, pageWrap.getModel().getOrderNum());
            queryWrapper.eq(JkSketch::getOrderNum, pageWrap.getModel().getOrderNum());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkSketch::getStatus, pageWrap.getModel().getStatus());
            queryWrapper.eq(JkSketch::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getSortnum() != null) {
            queryWrapper.lambda().eq(JkSketch::getSortnum, pageWrap.getModel().getSortnum());
            queryWrapper.eq(JkSketch::getSortnum, pageWrap.getModel().getSortnum());
        }
        if (pageWrap.getModel().getDateInfo() != null) {
            queryWrapper.lambda().ge(JkSketch::getDateInfo, Utils.Date.getStart(pageWrap.getModel().getDateInfo()));
            queryWrapper.lambda().le(JkSketch::getDateInfo, Utils.Date.getEnd(pageWrap.getModel().getDateInfo()));
            queryWrapper.eq(JkSketch::getDateInfo,  pageWrap.getModel().getDateInfo());
        }
        if (pageWrap.getModel().getJobId() != null) {
            queryWrapper.lambda().eq(JkSketch::getJobId, pageWrap.getModel().getJobId());
            queryWrapper.eq(JkSketch::getJobId, pageWrap.getModel().getJobId());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkSketchMapper.selectPage(page, queryWrapper));
        queryWrapper.orderByDesc(JkSketch::getDateInfo);
        IPage<JkSketch> result = jkSketchMapper.selectJoinPage(page, JkSketch.class,queryWrapper);
        return PageData.from(result);
    }
    @Override
@@ -149,4 +184,309 @@
        QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch);
        return jkSketchMapper.selectCount(wrapper);
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public List<JkSketch> importBatch(MultipartFile file, String dateInfoStr, LoginUserInfo loginUser){
        if(StringUtils.isBlank(dateInfoStr)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请选择送货日期!");
        }
        Date dateInfo = DateUtil.getDateFromShortString(dateInfoStr);
        if(dateInfo == null){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请选择正确的送货日期!");
        }
        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_JKORDERS);
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKORDERS,true,30, TimeUnit.MINUTES);
        try {
            ExcelImporter ie = null;
            List<JkOrdersImport> dataList =null;
            try {
                ie = new ExcelImporter(file,1,0);
                dataList = ie.getDataList(JkOrdersImport.class,null);
            }  catch (Exception e) {
                e.printStackTrace();
            }
            if(dataList == null || dataList.size() ==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!");
            }
            List<JkCustomer> customerList =  jkCustomerMapper.selectJoinList(JkCustomer.class,new MPJLambdaWrapper<JkCustomer>()
                    .selectAll(JkCustomer.class)
                    .eq(JkCustomer::getIsdeleted,Constants.ZERO)
            );
            //当前所有线路
            List<JkLine> lineList =  jkLineMapper.selectJoinList(JkLine.class,new MPJLambdaWrapper<JkLine>()
                    .selectAll(JkLine.class)
                    .eq(JkLine::getIsdeleted,Constants.ZERO)
            );
            List<JkOrders> newOrderList = new ArrayList<>();
            for(int i=0;i<dataList.size();i++){
                JkOrdersImport model = dataList.get(i);
                if(StringUtils.isBlank(model.getName())
                        &&StringUtils.isBlank(model.getCode())
                        &&StringUtils.isBlank(model.getNum())
                        &&StringUtils.isBlank(model.getSortnum())
                        &&StringUtils.isBlank(model.getDateInfo())
                        &&StringUtils.isBlank(model.getLineName()) ){
                    continue;
                }
                checkModelParam(model, newOrderList, i,dateInfo,loginUser,customerList,lineList );
            }
            if( newOrderList.size()==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入有效数据为空!");
            }
            List<JkSketch> newList = initNewSketchList(newOrderList);//按照主线路分组
            if(  newList.size() ==0 ){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入有效数据为空!");
            }
            jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda()
                    .set(JkSketch::getIsdeleted,Constants.ONE)
                    .eq(JkSketch::getIsdeleted,Constants.ZERO)
                    .eq(JkSketch::getDateInfo,dateInfo));
            jkOrdersMapper.update(null,new UpdateWrapper<JkOrders>().lambda()
                    .set(JkOrders::getIsdeleted,Constants.ONE)
                    .eq(JkOrders::getIsdeleted,Constants.ZERO)
                    .eq(JkOrders::getDateInfo,dateInfo));
            if(newList.size()>0){
                jkSketchMapper.insert(newList);
            }
            if(newOrderList.size()>0){
                jkOrdersMapper.insert(newOrderList);
            }
            List<JkSketchLine> sketchLineList = initNewSketchLineList(newList,newOrderList);
            jkSketchLineMapper.update(null,new UpdateWrapper<JkSketchLine>().lambda()
                    .set(JkSketchLine::getIsdeleted,Constants.ONE)
                    .eq(JkSketchLine::getIsdeleted,Constants.ZERO)
                    .eq(JkSketchLine::getDateInfo,dateInfo));
            if(sketchLineList.size()>0){
                jkSketchLineMapper.insert(sketchLineList);
            }
            List<JkSketchCustomer> sketchCuustomerList = initNewSketchCustomerList(sketchLineList,newOrderList);//按照主线路分组
            jkSketchCustomerMapper.update(null,new UpdateWrapper<JkSketchCustomer>().lambda()
                    .set(JkSketchCustomer::getIsdeleted,Constants.ONE)
                    .eq(JkSketchCustomer::getIsdeleted,Constants.ZERO)
                    .eq(JkSketchCustomer::getDateInfo,dateInfo));
            if(sketchCuustomerList.size()>0){
                jkSketchCustomerMapper.insert(sketchCuustomerList);
            }
            return newList;
        }catch (BusinessException e){
            throw e;
        }catch (Exception e){
            e.printStackTrace();
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试");
        }finally {
            redisTemplate.delete(Constants.RedisKeys.IMPORTING_JKORDERS);
        }
    }
    private List<JkSketchCustomer> initNewSketchCustomerList(List<JkSketchLine> sketchLineList, List<JkOrders> newOrderList) {
        List<JkSketchCustomer> list =new ArrayList<>();
        for(JkOrders orders : newOrderList){
            JkSketchLine line = findModelFromListByLineId(orders.getLineId(),sketchLineList);
            if( line!=null){
                JkSketchCustomer tModel =  new JkSketchCustomer();
                tModel.setCreator(orders.getCreator());
                tModel.setOrderId(orders.getId());
                tModel.setCreateDate(orders.getCreateDate());
                tModel.setTotalNum(orders.getNum());
                tModel.setDateInfo(orders.getDateInfo());
                tModel.setSortnum(list.size()+1);
                tModel.setEditDate(tModel.getCreateDate());
                tModel.setEditor(tModel.getCreator());
                tModel.setIsdeleted(Constants.ZERO);
                tModel.setSketchId(line.getSketchId());
                tModel.setCustomerId(orders.getCustomerId());
                tModel.setSketchLineId(line.getId());
                list.add(tModel);
            }
        }
        return list;
    }
    private List<JkSketchLine> initNewSketchLineList(List<JkSketch> newList, List<JkOrders> newOrderList) {
        List<JkSketchLine> list =new ArrayList<>();
        for(JkOrders orders : newOrderList){
            JkSketchLine tModel = findModelFromListByLineId(orders.getLineId(),list);
            if(tModel!=null){
                tModel.setTotalNum(  tModel.getTotalNum().add(orders.getNum()));//订单量累计
                tModel.setOrderNum(tModel.getOrderNum()+1);//客户数加1
            }else{
                tModel = new JkSketchLine();
                tModel.setSketchId(getSKetchIdByyCategoryId(orders.getCategoryId(),newList));
                tModel.setCreator(orders.getCreator());
                tModel.setCreateDate(orders.getCreateDate());
                tModel.setLineId(orders.getLineId());
                tModel.setTotalNum(orders.getNum());
                tModel.setOrderNum(1);
                tModel.setDateInfo(orders.getDateInfo());
                tModel.setSortnum(list.size()+1);
                tModel.setEditDate(tModel.getCreateDate());
                tModel.setEditor(tModel.getCreator());
                tModel.setIsdeleted(Constants.ZERO);
                if(tModel.getSketchId()!=null){
                    list.add(tModel);
                }
            }
        }
        return list;
    }
    private Integer getSKetchIdByyCategoryId(Integer categoryId, List<JkSketch> newList) {
        for(JkSketch model:newList){
            if(Constants.equalsInteger(model.getCategoryId(),categoryId)){
                return model.getId();
            }
        }
        return null;
    }
    private JkSketchLine findModelFromListByLineId(Integer lineId, List<JkSketchLine> list) {
        if(list !=null){
            for(JkSketchLine model : list){
                if(Constants.equalsInteger(lineId,model.getLineId())){
                    return  model;
                }
            }
        }
        return null;
    }
    private   List<JkSketch>  initNewSketchList(List<JkOrders> newOrderList) {
        List<JkSketch> list =new ArrayList<>();
        for(JkOrders orders : newOrderList){
            JkSketch tModel = findModelFromListByCateId(orders.getCategoryId(),list);
            if(tModel!=null){
                tModel.setTotalNum(  tModel.getTotalNum().add(orders.getNum()));//订单量累计
                tModel.setOrderNum(tModel.getOrderNum()+1);//客户数加1
            }else{
                tModel = new JkSketch();
                tModel.setLineNum(getLineNumByOrders(orders.getCategoryId(),newOrderList));
                tModel.setCreator(orders.getCreator());
                tModel.setCreateDate(orders.getCreateDate());
                tModel.setCategoryId(orders.getCategoryId());
                tModel.setTotalNum(orders.getNum());
                tModel.setOrderNum(1);
                tModel.setDateInfo(orders.getDateInfo());
                tModel.setSortnum(list.size()+1);
                tModel.setEditDate(tModel.getCreateDate());
                tModel.setEditor(tModel.getCreator());
                tModel.setStatus(Constants.ZERO);
                tModel.setIsdeleted(Constants.ZERO);
                list.add(tModel);
            }
        }
        return list;
    }
    private Integer getLineNumByOrders(Integer cateId, List<JkOrders> newOrderList) {
        List<JkSketchLine> list =new ArrayList<>();
        for(JkOrders orders : newOrderList){
            if(!Constants.equalsInteger(orders.getCategoryId(),cateId)){
                continue;
            }
            JkSketchLine tModel = findModelFromListByLineId(orders.getLineId(),list);
            if(tModel ==null){
                tModel = new JkSketchLine();
                tModel.setLineId(orders.getLineId());
                list.add(tModel);
            }
        }
        return list.size();
    }
    private JkOrders checkModelParam(JkOrdersImport model
            , List<JkOrders> newOrderList
            ,int index
            ,Date dateInfo
            ,LoginUserInfo loginUserInfo
            ,List<JkCustomer> allList
            ,List<JkLine> lineList ) {
        if(StringUtils.isBlank(model.getName())
                ||StringUtils.isBlank(model.getCode())
                ||StringUtils.isBlank(model.getName())
                ||StringUtils.isBlank(model.getLineName()) ){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行客户信息不完整,请检查表格内容!");
        }
        for(JkOrders param: newOrderList){
            if(StringUtils.isNotBlank(model.getCode())&&StringUtils.isNotBlank(param.getCode())) {
                if (StringUtils.equals(model.getCode(), param.getCode())) {
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行客户简码【" + model.getName() + "】重复出现,请检查表格内容!");
                }
            }
        }
        JkCustomer customer = findModelFromList(model.getCode(),allList);
        if(customer == null){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行客户编码【" + model.getCode() + "】不存在,请检查表格内容!");
        }
        if(!StringUtils.equals(customer.getName(),model.getName())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行客户名称【" + model.getName() + "】和编码不匹配,请检查表格内容!");
        }
        JkLine line = findLineFromListByName(model.getLineName(),lineList);
        if(line == null){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行线路【" + model.getLineName() + "】不存在,请检查表格内容!");
        }
        JkOrders tModel =   new JkOrders();
        tModel.setCreator(loginUserInfo.getId());
        tModel.setCreateDate(new Date());
        tModel.setName(model.getName());
        tModel.setCode(model.getCode());
        tModel.setNum(getDecimalByVal(model.getNum()));
        tModel.setCustomerId(customer.getId());
        tModel.setDateInfo(dateInfo);
        tModel.setSortnum(model.getSortnum());
        tModel.setLineId(line.getId());
        tModel.setCategoryId(line.getCategoryId());
        tModel.setEditDate(new Date());
        tModel.setEditor(loginUserInfo.getId());
        tModel.setIsdeleted(Constants.ZERO);
        newOrderList.add(tModel);
        return tModel;
    }
    private BigDecimal getDecimalByVal(String val) {
        try {
            return new BigDecimal(val);
        }catch (Exception e){
        }
        return null;
    }
    private JkCustomer findModelFromList(String code, List<JkCustomer> list) {
        if(list !=null){
            for(JkCustomer model : list){
                if(StringUtils.equals(code,model.getCode())){
                    return  model;
                }
            }
        }
        return null;
    }
    private JkSketch findModelFromListByCateId(Integer cateId, List<JkSketch> list) {
        if(list !=null){
            for(JkSketch model : list){
                if(Constants.equalsInteger(cateId,model.getCategoryId())){
                    return  model;
                }
            }
        }
        return null;
    }
    private JkLine findLineFromListByName(String name, List<JkLine> list) {
        if(list !=null){
            for(JkLine model : list){
                if(StringUtils.equals(name,model.getName())){
                    return model;
                }
            }
        }
        return null;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -78,6 +78,7 @@
import java.math.BigDecimal;
import java.util.Date;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -2140,7 +2141,7 @@
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在员工导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_MEMBER,true);
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_MEMBER,true,30, TimeUnit.MINUTES);
        try {
            ExcelImporter ie = null;
            List<MemberImport> dataList =null;