|  |  |  | 
|---|
|  |  |  | <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"> | 
|---|
|  |  |  | <template slot-scope="{row}"> | 
|---|
|  |  |  | {{row.totalNum ||0}} / {{row.maxOrder || 0}} | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  | </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}" v-if="dataList.length>1"> | 
|---|
|  |  |  | <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-circle-close"  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> | 
|---|
|  |  |  | 3.经过调整后的线路路程数请等待提交后查看;<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="resetData" type="danger" v-if="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' | 
|---|
|  |  |  | import { updateSketchLine } from '@/api/business/jkSketch' | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | name: 'OperaJkSketchLineWindow', | 
|---|
|  |  |  | extends: BaseOpera, | 
|---|
|  |  |  | // eslint-disable-next-line vue/no-unused-components | 
|---|
|  |  |  | components: { GlobalWindow }, | 
|---|
|  |  |  | data () { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | importing:false, | 
|---|
|  |  |  | fileName: '' | 
|---|
|  |  |  | // 表单数据 | 
|---|
|  |  |  | updating: false, | 
|---|
|  |  |  | edited: false, | 
|---|
|  |  |  | currentRow: null, | 
|---|
|  |  |  | model: { | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | buttonName: '', | 
|---|
|  |  |  | dataList: [], | 
|---|
|  |  |  | originDataList: [], | 
|---|
|  |  |  | 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 = '' | 
|---|
|  |  |  | this.visible = true | 
|---|
|  |  |  | resetData () { | 
|---|
|  |  |  | this.buttonName = '' | 
|---|
|  |  |  | this.cancelDo() | 
|---|
|  |  |  | this.loadList() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 导出模板 | 
|---|
|  |  |  | 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') | 
|---|
|  |  |  | confirmDo () { | 
|---|
|  |  |  | this.isWorking = true | 
|---|
|  |  |  | updateSketchLine({ | 
|---|
|  |  |  | id: this.model.id, | 
|---|
|  |  |  | sketchLineList: this.dataList | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .then(() => { | 
|---|
|  |  |  | this.visible = false | 
|---|
|  |  |  | this.$tip.apiSuccess('线路调整已完成!') | 
|---|
|  |  |  | this.$emit('success') | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(err => { | 
|---|
|  |  |  | // this.$message.error(err) | 
|---|
|  |  |  | this.fileName = '' | 
|---|
|  |  |  | .catch(e => { | 
|---|
|  |  |  | // this.$tip.apiFailed(e) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .finally(() => { | 
|---|
|  |  |  | this.$refs.fileExcel.value = null | 
|---|
|  |  |  | this.isWorking = false | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | 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() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | updateDo (row) { | 
|---|
|  |  |  | this.currentRow = row | 
|---|
|  |  |  | this.tableData = row.customerList || [] | 
|---|
|  |  |  | this.totalItems = this.tableData.length | 
|---|
|  |  |  | this.currentPage = 1 | 
|---|
|  |  |  | this.selectRows = [] | 
|---|
|  |  |  | this.updating = true | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | cancelDo () { | 
|---|
|  |  |  | this.selectRows = [] | 
|---|
|  |  |  | this.currentRow = null | 
|---|
|  |  |  | this.updating = false | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | 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.push(...this.selectRows) | 
|---|
|  |  |  | let ttNum = 0 | 
|---|
|  |  |  | rArray.forEach(item => { | 
|---|
|  |  |  | ttNum += (item.totalNum || 0) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | if (tarray.length >= (row.maxCustomer || 0)) { | 
|---|
|  |  |  | this.$message.error('对不起,加入的线路最大支持' + (row.maxCustomer || 0) + '客户!') | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (ttNum >= (row.maxOrder || 0)) { | 
|---|
|  |  |  | this.$message.error('对不起,加入的线路最大支持' + (row.maxOrder || 0) + '送货量,当前方案:' + ttNum) | 
|---|
|  |  |  | 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 = '保存调整开始优化' | 
|---|
|  |  |  |  | 
|---|
|  |  |  | console.log(this.dataList) | 
|---|
|  |  |  | console.log(this.originDataList) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | handleSelectionChange (rows) { | 
|---|
|  |  |  | this.selectRows = rows | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | loadCustomerList () { | 
|---|
|  |  |  | customerList({ sketchId: this.model.id }) | 
|---|
|  |  |  | .then(res => { | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | loadList () { | 
|---|
|  |  |  | this.api.allList({ | 
|---|
|  |  |  | sketchId: this.model.id, | 
|---|
|  |  |  | type: 1 | 
|---|
|  |  |  | }).then(res => { | 
|---|
|  |  |  | this.dataList = [...(res || [])] | 
|---|
|  |  |  | this.originDataList = JSON.parse(JSON.stringify(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> | 
|---|