<template> <div class="supplementOrder"> <el-card> <!-- 内容区 --> <el-row class="content-area"> <!-- 左侧 --> <el-col :span="6" class="left-area"> <el-row> <el-button type="primary" @click="addPart">新增</el-button> <el-button type="danger" @click="deletePart">删除</el-button> </el-row> <el-scrollbar style="height:calc(100% - 40px)"> <el-row v-for="item in partList" :key="item.id" class="title-info" :class="item.id === partData.id ? 'selected' : ''"> <div @click="partClick(item)"> <p>{{item.title}}</p> </div> <el-collapse-transition> <div v-if="item.fold === false ? true : false"> <div v-for="(secGoog, index) in item.sectionOrderList" :key="index" class="part-secGoog"> <p>{{secGoog.orderNo}}</p> <p>{{secGoog.prodTitleZh}}</p> <div> <i class="el-icon-delete" @click="deleteOrder(secGoog)"></i> </div> </div> </div> </el-collapse-transition> <div class="part-secGoog"> <template> {{getTotlContent(item.secStatistics)}} </template> </div> </el-row> </el-scrollbar> </el-col> <!-- 右侧 --> <el-col :span="18" class="right-area"> <el-row class="right-title"> <div>货物筛选</div> <div>当前装柜:{{partData.title}}</div> <div>可预装方数:{{unloadStatistics.volume}}m³,重量:{{unloadStatistics.weight}}Kg</div> </el-row> <!-- 搜索工作栏 --> <el-row> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px"> <el-form-item label="始发地"> <p>{{importCityName(queryParams.startWarehouseId)}}</p> </el-form-item> <el-form-item label="目的地" prop="destination"> <el-select v-model="queryParams.destWarehouseIdList" placeholder="请选择目的地" multiple> <el-option v-for="item in importWarehouseList" :label="item.titleZh" :value="item.id" :key="item.id"></el-option> </el-select> </el-form-item> <el-form-item label="订单号" prop="orderNo"> <el-input v-model="queryParams.orderNo" placeholder="请输入订单号" clearable /> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" @click="queryAllData">搜索</el-button> </el-form-item> </el-form> </el-row> <!-- 表格 --> <el-scrollbar style="height:calc(100% - 124px)"> <el-row v-for="(item, index) in toBePreList" :key="index" class="toBePre-table"> <el-row class="table-title"> <div>{{item.orderNo}}</div> <div>发往:{{item.destWarehouseName}}</div> <div> <dict-tag :type="DICT_TYPE.ECW_CUSTOMS_TYPE" :value="item.customsType" /> </div> <div>入仓时间:{{formatDate(item.rucangTime)}}</div> <div> <el-button type="text" @click="handleGoods('all', item)">[全部预装]</el-button> <el-button type="text" @click="foldTable(index, item)">[{{item.fold ? '展开' : '收起'}}]</el-button> </div> </el-row> <el-collapse-transition> <div v-show="!item.fold"> <el-table v-loading="loading" :data="item.boxOrderItemList" border> <el-table-column label="序号" type="index" align="center" width="50" /> <el-table-column label="品名" align="center" prop="prodTitleZh" min-width="500" /> <el-table-column label="品牌" align="center" prop="brandType" width="120"> <template slot-scope="scope"> <dict-tag :type="DICT_TYPE.BOX_SHIPPING_BRAND_TYPE" :value="scope.row.brandType" /> </template> </el-table-column> <el-table-column label="箱数" align="center" prop="num" width="120" /> <el-table-column label="体积" align="center" prop="volume" width="120"> <template slot-scope="scope"> <p v-if="scope.row.volume">{{getTotlContent(scope.row,['volume'])}}</p> </template> </el-table-column> <el-table-column label="重量" align="center" prop="weight" width="120"> <template slot-scope="scope"> <p v-if="scope.row.weight">{{getTotlContent(scope.row,['weight'])}}</p> </template> </el-table-column> <!-- <el-table-column label="预装柜" align="center" prop="" width="120"> 无返回 </el-table-column> --> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100"> <template slot-scope="scope"> <el-button type="text" size="small" @click="handleGoods('singele',scope.row)">预装</el-button> </template> </el-table-column> </el-table> </div> </el-collapse-transition> </el-row> </el-scrollbar> <!-- 分页 --> <el-pagination background layout="prev, pager, next" :page-size="pageParam.pageSize" :total="total" @current-change="pageChange" v-show="total > 0"></el-pagination> </el-col> </el-row> </el-card> <el-row> <el-col :span="6" class="totle-info"> <div> <p>总计:</p> <p>{{sumStatistics(partList)}}</p> </div> <div> <p>容量:</p> <p>{{calcCapacity}}</p> </div> </el-col> </el-row> <el-row class="button-area"> <el-button type="primary" @click="handlerFinish">完成</el-button> </el-row> </div> </template> <script> import { loadSecGoodsList, preloadPage, createSection, deleteSection, createGoods, remove, } from "@/api/ecw/boxSea"; import { formatDate, getTotlContent, serviceMsg, getCapacity, sumStatistics, } from "../../utils"; /** * 补单 */ export default { name: "supplementOrder", inheritAttrs: false, data() { return { // 二维码/条码编号 cabinetNo: "", // 表格数据 listData: [], // 选中部分 partData: {}, // 部分列表 partList: [], // 部分统计 loadStatistics: {}, // 查询参数 queryParams: { startWarehouseId: this.$attrs.shipmentObj.startWarehouseId, }, pageParam: { pageNo: 1, pageSize: 10 }, // 待预装 toBePreList: [], total: 0, loading: false, unloadStatistics: {}, }; }, created() { this.queryAllData(); }, methods: { /* 查询已预装 */ getSecGoods() { loadSecGoodsList({ shipmentId: this.$attrs.shipmentObj.id }).then( (res) => { this.partList = res.data.map((item, index) => { item.fold = true; if ( Object.keys(this.partData).length && this.partData.id === item.id ) { item.fold = false; } return { ...item, title: `第${++index}部分`, }; }); if (this.partList.length && !Object.keys(this.partData).length) { this.partList[0].fold = false; this.partData = this.partList[0]; } } ); }, /* 查询待预装 */ getPreLoad() { this.loading = true; // 处理查询参数 let params = { ...this.queryParams, }; preloadPage({ ...params, ...this.pageParam }).then((res) => { const { data } = res; this.toBePreList = data.dataList?.list ?? []; this.total = data.dataList?.total ?? 0; this.unloadStatistics = data.unloadStatistics ?? {}; this.loading = false; }); }, /* 删除订单 */ deleteOrder(data) { let params = { secId: this.partData.id, shipmentId: this.$attrs.shipmentObj.id, orderId: data.orderId, }; remove(params).then((res) => { serviceMsg(res, this).then(() => { this.getSecGoods(); }); }); }, /** 预装 */ handleGoods(type, item) { let params = { secId: this.partData.id, shipmentId: this.$attrs.shipmentObj.id, orderId: item.orderId, }; if (type === "all") { params.orderItemIdList = item.boxOrderItemList.map( (data) => data.orderItemId ); } else { params.orderItemIdList = [item.orderItemId]; } createGoods(params).then((res) => { serviceMsg(res, this).then(() => { this.queryAllData(); }); }); }, /* 增加部分 */ addPart() { createSection({ shipmentId: this.$attrs.shipmentObj.id, isCover: 1, }).then((res) => { serviceMsg(res, this).then(() => { this.getSecGoods(); }); }); }, /* 删除部分 */ deletePart() { this.$confirm("确认删除该部分及其已预装订单?", "提示", { type: "warning", }) .then((_) => { deleteSection(this.partData.id).then((res) => { serviceMsg(res, this).then(() => { this.partData = {}; this.getSecGoods(); }); }); }) .catch((_) => {}); }, /* 部分点击 */ partClick(item) { item.fold = !item.fold; this.partData = item; let copyList = [...this.partList]; copyList = copyList.map((cItem) => { cItem.fold = true; if (item.id === cItem.id) { cItem.fold = false; return cItem; } }); this.$set(this.partList, copyList); }, /* 获取城市 */ importCityName(id) { var arr = this.$attrs.warehouseList.filter((item) => item.id == id); return arr.length > 0 ? arr[0].titleZh : "无"; }, /* 待预装订单分页 */ pageChange(page) { this.pageParam.pageNo = page; this.getPreLoad(); }, /* 折叠 */ foldTable(index, item) { item.fold = !item.fold; this.$set(this.toBePreList, index, item); }, /* 查询所有数据 */ queryAllData() { this.getSecGoods(); this.pageParam.pageNo = 1; this.getPreLoad(); }, /* 完成 */ handlerFinish() { this.$confirm("确定执行操作?", "提示", { type: "warning", }) .then((_) => { this.$emit("supplementFinish"); }) .catch((_) => {}); }, formatDate, getTotlContent, sumStatistics, }, computed: { /** 目的地 */ importWarehouseList() { return this.$attrs.warehouseList.filter( (item) => item.tradeType == "1" || item.type == "3" ); }, /* 容量 */ calcCapacity() { const { cabinetRespVO } = this.$attrs.shipmentObj; return getCapacity(cabinetRespVO); }, }, }; </script> <style lang="scss"> .supplementOrder { display: flex; flex-direction: column; p { margin: 0; } .el-card__body { height: 100%; } .content-area { display: flex; height: 100%; .left-area { border-right: 3px solid #e6ebf5; .el-scrollbar__view { padding-right: 10px; } .title-info { margin-top: 10px; height: auto; &.selected { > div:first-child { background-color: #4f9cdd; color: #fff; } } > div:first-child { font-size: 16px; background-color: #f2f2f2; line-height: 30px; text-align: center; cursor: pointer; } .part-secGoog { margin-top: 5px; display: flex; align-items: center; > p { margin-right: 10px; color: #4f9cdd; } > div { flex: 1; text-align: right; > i { cursor: pointer; color: red; } } } } } .right-area { padding-left: 10px; .right-title { display: flex; align-items: center; margin-bottom: 10px; font-size: 16px; > div:first-child { font-size: 18px; } > div:first-child + div { margin-left: 20px; } > div:last-child { flex: 1; text-align: right; font-size: 18px; color: red; } } .table-title { display: flex; align-items: center; line-height: 30px; background-color: #4f9cdd; color: #fff; > div { margin-left: 10px; } > div:last-child { flex: 1; display: flex; justify-content: flex-end; > .el-button--text { color: #fff; } > .el-button--text:last-child { margin-right: 10px; } } } .el-pagination { margin-top: 10px; padding: 0; text-align: right; } .toBePre-table { margin-bottom: 10px; } } } .totle-info { font-size: 20px; margin-top: 15px; > div { display: flex; margin-bottom: 5px; } } .button-area { text-align: center; } } </style>