| | |
| | | <template> |
| | | <el-dialog |
| | | class="center-title" |
| | | <GlobalWindow |
| | | :title="title" |
| | | width="500px" |
| | | top="30vh" |
| | | width="100%" |
| | | :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 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 style="display: flex;margin-top: 30px"> |
| | | <div style="flex: 1">优化时间:{{model.planLineDate ||''}} - {{model.planLineEndDate ||''}}</div> |
| | | </div> |
| | | <div style="display: flex;margin-top: 20px" class="orange"> |
| | | <div style="flex: 1">优化结果:优化前总路程 <span class="red" style="font-weight: bold"> {{((model.originDistance ||0)/1000).toFixed(2)}}</span> 公里,优化后总路程<span class="green" style="font-weight: bold"> {{((model.distance ||0)/1000).toFixed(2)}} </span> 公里</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 :row-class-name="tableRowClassName"> |
| | | <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-column prop="distance" label="总路程(公里)" min-width="100px"> |
| | | <template slot-scope="{row}"> |
| | | {{((row.distance ||0)/1000).toFixed(2)}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="操作" |
| | | min-width="120" |
| | | align="left" |
| | | fixed="right" |
| | | > |
| | | <template slot-scope="{row}"> |
| | | <el-button type="text" @click="updateDo(row)" icon="el-icon-edit" style="color: #0d68ff" v-if="!updating" >微调</el-button> |
| | | <template v-else-if="updating && currentRow.id ===row.id" > |
| | | <el-button type="text" style="color: #13ce66" >本车</el-button> |
| | | <el-button type="text" @click="cancelDo(row)" icon="el-icon-delete" style="color: red" >取消</el-button> |
| | | </template> |
| | | <el-button type="text" @click="addDo(row)" icon="el-icon-plus" style="color: red" v-else-if="updating && currentRow.id !==row.id" >加入</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="display: block;margin-top: 30px;border: 1px solid #f2f2f2;padding: 10px" v-if="updating"> |
| | | <div style="display: block;font-size: 16px;font-weight: 600;margin-bottom: 10px;">{{currentRow.lineName}} - 客户明细</div> |
| | | <div> |
| | | <p class="tip-warn"><i class="el-icon-warning"></i>操作说明:<br> |
| | | 1.请选择若干客户信息,点击上述其他线路后的<span class="red">【加入】</span>按钮,将选中的客户移加到对应线路中;<br> |
| | | 2.点击本车线路后的<span class="red">【取消】</span>按钮,可撤销本车微调操作;<br> |
| | | </p> |
| | | <el-table :data="paginatedData" stripe @selection-change="handleSelectionChange">> |
| | | <el-table-column type="selection" width="55"></el-table-column> |
| | | <el-table-column prop="code" label="客户简码" min-width="130px"></el-table-column> |
| | | <el-table-column prop="name" label="客户名称" min-width="130px"> </el-table-column> |
| | | <el-table-column prop="totalNum" label="送货量(条)" min-width="130px"></el-table-column> |
| | | <el-table-column prop="location" label="客户地址" min-width="200px" show-tooltip-when-overflow></el-table-column> |
| | | <el-table-column prop="latitude" label="经纬度" min-width="200px"> |
| | | <template slot-scope="{row}"> |
| | | {{(row.longitude || 0).toFixed(6)}},{{(row.latitude || 0).toFixed(6)}} |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div class="table-pagination"> |
| | | <el-pagination |
| | | @current-change="handleCurrentChange" |
| | | :current-page="currentPage" |
| | | :page-size="pageSize" |
| | | layout="total, prev, pager, next, jumper" |
| | | :total="totalItems"> |
| | | </el-pagination> |
| | | </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" /> |
| | | </div> |
| | | </div> |
| | | <template v-slot:footer> |
| | | <el-button @click="confirmDo" type="primary" v-if="buttonName!==''">{{ buttonName||'确认' }}</el-button> |
| | | <el-button @click="visible=false">返回</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </GlobalWindow> |
| | | </template> |
| | | |
| | | <script> |
| | | import BaseOpera from '@/components/base/BaseOpera' |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { importExcel } from '@/api/business/jkLine' |
| | | import { allList as customerList } from '@/api/business/jkSketchCustomer' |
| | | export default { |
| | | name: 'OperaJkSketchLineWindow', |
| | | extends: BaseOpera, |
| | | // eslint-disable-next-line vue/no-unused-components |
| | | components: { GlobalWindow }, |
| | | data () { |
| | | return { |
| | | importing:false, |
| | | fileName: '' |
| | | // 表单数据 |
| | | updating: false, |
| | | currentRow: null, |
| | | model: { |
| | | }, |
| | | buttonName: '', |
| | | dataList: [], |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | totalItems: 0, // 总数据条目数 |
| | | allCustomerList: [], |
| | | tableData: [], // 所有数据 |
| | | selectRows: [] |
| | | } |
| | | }, |
| | | created () { |
| | | this.config({ |
| | | api: '/business/jkSketchLine', |
| | | 'field.id': 'id' |
| | | }) |
| | | }, |
| | | computed: { |
| | | paginatedData () { |
| | | const start = (this.currentPage - 1) * this.pageSize |
| | | const end = start + this.pageSize |
| | | return this.tableData.slice(start, end) |
| | | } |
| | | }, |
| | | methods: { |
| | | open (title) { |
| | | this.title = title |
| | | this.fileName = '' |
| | | confirmDo () { |
| | | |
| | | }, |
| | | open (title, target) { |
| | | this.title = title + target.categoryName |
| | | this.visible = true |
| | | this.model = target |
| | | this.updating = false |
| | | this.selectRows = [] |
| | | this.tableData = [] |
| | | this.allCustomerList = [] |
| | | this.currentRow = null |
| | | this.loadList() |
| | | }, |
| | | // 导出模板 |
| | | exportTemplate () { |
| | | // 投保申请 |
| | | window.open('/template/jkLineTemplate.xlsx') |
| | | updateDo (row) { |
| | | this.currentRow = row |
| | | this.tableData = row.customerList || [] |
| | | this.totalItems = this.tableData.length |
| | | this.currentPage = 1 |
| | | this.selectRows = [] |
| | | this.updating = true |
| | | }, |
| | | clickRef () { |
| | | this.$refs.fileExcel.click() |
| | | cancelDo (row) { |
| | | this.selectRows = [] |
| | | this.currentRow = null |
| | | this.updating = false |
| | | }, |
| | | result (e) { |
| | | const data = new FormData() |
| | | data.append('file', e.target.files[0]) |
| | | importExcel(data) |
| | | addDo (row) { |
| | | if (!this.selectRows || !this.selectRows.length) { |
| | | this.$message.error('对不起,请至少选择有一条客户记录加入该路线!') |
| | | return |
| | | } |
| | | const tarray = [] |
| | | let tNum = 0 |
| | | this.currentRow.customerList.forEach(item => { |
| | | let flag = false |
| | | this.selectRows.forEach(item1 => { |
| | | if (item.id === item1.id) { |
| | | flag = true |
| | | } |
| | | }) |
| | | if (!flag) { |
| | | tNum += (item.totalNum || 0) |
| | | tarray.push(item) |
| | | } |
| | | }) |
| | | if(tarray.length === 0){ |
| | | this.$message.error('对不起,本车线路至少留存一个客户信息,无法全部清空!') |
| | | return |
| | | } |
| | | var rArray = row.customerList || [] |
| | | rArray = rArray.push(...this.selectRows) |
| | | let ttNum = 0 |
| | | rArray.forEach(item => { |
| | | ttNum += (item.totalNum || 0) |
| | | }) |
| | | if(tarray.length >= (row.maxCustomer||0)){ |
| | | this.$message.error('对不起,加入的线路最大支持'+ (row.maxOrderNum||0) + '客户!') |
| | | return |
| | | } |
| | | if(ttNum >= (row.maxOrder||0)){ |
| | | this.$message.error('对不起,加入的线路最大支持'+ (row.maxOrder||0) + '送货量!') |
| | | return |
| | | } |
| | | this.currentRow.customerList = tarray |
| | | this.currentRow.orderNum = this.currentRow.customerList.length |
| | | this.currentRow.totalNum = tNum |
| | | row.customerList = rArray |
| | | row.orderNum = row.customerList.length |
| | | row.totalNum = ttNum |
| | | this.currentRow = null |
| | | this.updating = false |
| | | this.buttonName = '保存调整开始优化' |
| | | }, |
| | | handleSelectionChange (rows) { |
| | | this.selectRows = rows |
| | | }, |
| | | loadCustomerList () { |
| | | customerList({ sketchId: this.model.id }) |
| | | .then(res => { |
| | | this.$message.success('导入成功') |
| | | this.$emit('success') |
| | | this.visible = false |
| | | this.allCustomerList = res |
| | | if (this.allCustomerList && this.allCustomerList.length) { |
| | | this.dataList.forEach(item => { |
| | | var tarray = [] |
| | | this.allCustomerList.forEach(item1 => { |
| | | if (item.id === item1.sketchLineId) { |
| | | tarray.push(item1) |
| | | } |
| | | }) |
| | | item.customerList = tarray |
| | | }) |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | // this.$message.error(err) |
| | | this.fileName = '' |
| | | }) |
| | | .finally(() => { |
| | | this.$refs.fileExcel.value = null |
| | | }) |
| | | }, |
| | | loadList () { |
| | | this.api.allList({ |
| | | sketchId: this.model.id |
| | | }).then(res => { |
| | | this.dataList = res |
| | | this.loadCustomerList() |
| | | }) |
| | | }, |
| | | tableRowClassName ({ row, rowIndex }) { |
| | | if (this.currentRow && row.id === this.currentRow.id) { |
| | | return 'warning-row' |
| | | } else { |
| | | return 'success-row' |
| | | } |
| | | }, |
| | | handleCurrentChange (newPage) { |
| | | this.currentPage = newPage |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | |
| | | <style lang="scss"> |
| | | .el-table .warning-row { |
| | | background: rgba(161, 231, 20, 0.2) !important; |
| | | td{ |
| | | background: rgba(161, 231, 20, 0.2) !important; |
| | | } |
| | | } |
| | | .el-table .success-row { |
| | | background: #f0f9eb !important; |
| | | td{ |
| | | background: #f0f9eb !important; |
| | | } |
| | | } |
| | | </style> |