<template> <div class="app-container shipping-split-order"> <el-card> <div slot="header" class="card-title">{{$t('拆单申请')}}-{{orderData.orderNo||''}}</div> <div class="btn-header"> <span class="card-title">{{$t('原单信息')}}</span> </div> <el-descriptions :column="4"> <el-descriptions-item :label="$t('唛头')"> {{orderData.marks?orderData.marks:$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('已实装箱数/总箱数')"> <span>{{currRow.installNum||0}}/{{currRow.num||0}}</span> </el-descriptions-item> <el-descriptions-item :label="$t('订单状态')"> {{orderData.status==99? $t('异常'):$t('正常')}} </el-descriptions-item> <el-descriptions-item :label="$t('送货日期')"> {{orderData.deliveryDate}} </el-descriptions-item> </el-descriptions> <el-descriptions :column="4"> <el-descriptions-item :label="$t('运输方式')"> <dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="orderData.transportId" /> </el-descriptions-item> <el-descriptions-item :label="$t('始发地')"> {{orderData.logisticsInfoDto?$l(orderData.logisticsInfoDto, 'startTitle'):$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('目的地')"> {{orderData.logisticsInfoDto?$l(orderData.logisticsInfoDto, 'destTitle'):$t('无')}} </el-descriptions-item> </el-descriptions> <el-descriptions :column="4"> <el-descriptions-item :label="$t('发货人姓名')"> {{orderData.consignorVO?orderData.consignorVO.name||$t('无'):$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('发货公司')"> {{orderData.consignorVO?orderData.consignorVO.company||$t('无'):$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('发货电话')"> {{orderData.consignorVO?(orderData.consignorVO.phone?("+"+orderData.consignorVO.countryCode+orderData.consignorVO.phone):$t('无')):$t('无')}} </el-descriptions-item> </el-descriptions> <el-descriptions :column="4"> <el-descriptions-item :label="$t('收货人姓名')"> {{orderData.consigneeVO?orderData.consigneeVO.name||$t('无'):$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('收货公司')"> {{orderData.consigneeVO?orderData.consigneeVO.company||$t('无'):$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('收货电话')"> {{orderData.consigneeVO?orderData.consigneeVO.phone?"+"+orderData.consigneeVO.countryCode+orderData.consigneeVO.phone :$t('无'):$t('无')}} </el-descriptions-item> </el-descriptions> </el-card> <el-card class="card"> <!-- 列表 --> <div slot="header" class="card-title">{{$t('货物信息')}}</div> <el-table id='table' v-loading="loading" border :data="orderData.orderItemVOList" :summary-method="getSummaries" show-summary> <el-table-column :label="$t('序号')" align="center" prop="id" type="index" width="60"> <template slot-scope="scope"> <span>{{scope.$index + 1}}</span> </template> </el-table-column> <el-table-column :label="$t('品名')" align="center"> <template slot-scope="scope"> <el-row>{{scope.row.prodTitleZh}}</el-row> <el-row>{{scope.row.prodTitleEn}}</el-row> </template> </el-table-column> <el-table-column :label="$t('装柜货物属性')" align="center" width="600"> <template slot-scope="scope"> <el-row style="text-align:left;"> <el-row> <span>{{$t('规格')}}:{{scope.row.warehouseInInfoVO ? scope.row.warehouseInInfoVO.boxGauge : ''}}</span> </el-row> <el-row> <span>{{$t('品牌')}}: <template v-if="scope.row.brandName">{{scope.row.brandName}}</template> <dict-tag v-else :type="DICT_TYPE.ECW_IS_BRAND" :value="scope.row.brandType" /> </span> <span style="margin-left: 10px;">{{$t('箱数')}}:{{scope.row.warehouseInInfoVO ? scope.row.warehouseInInfoVO.cartonsNum : 0 }}</span> <span style="margin-left: 10px;">{{$t('体积')}}:{{scope.row.warehouseInInfoVO ? scope.row.warehouseInInfoVO.volume : 0 }}m³</span> <span style="margin-left: 10px;">{{$t('重量')}}:{{scope.row.warehouseInInfoVO ? scope.row.warehouseInInfoVO.weight : 0 }}kg</span> </el-row> <el-row> <span>{{$t('计划装柜')}}:{{planCabinet}}</span> </el-row> </el-row> </template> </el-table-column> <el-table-column :label="$t('最后操作时间')" align="center"> <template slot-scope="scope"> <span>{{parseTime(scope.row.updateTime)}}</span> </template> </el-table-column> <el-table-column :label="$t('状态')" align="center"> {{orderData.abnormalState!=0?$t('异常'):$t('正常')}} <!-- <template slot-scope="scope"> <dict-tag :type="DICT_TYPE.ORDER_STATUS" :value="scope.row.status" /> </template> --> </el-table-column> </el-table> </el-card> <el-card class="card" v-if="splitData.id"> <!-- 列表 --> <div slot="header" class="card-title">{{$t('拆单信息')}}</div> <div> <div class="btn-header"> <div> <p class="card-info"> <span class="card-title"> {{splitData.orderNo}} </span> <span>{{orderData.logisticsInfoDto?$l(orderData.logisticsInfoDto, 'startTitle'):$t('无')}}</span> <span>{{$t('发往')}}:{{splitData.dstWarehouseName}}</span> </p> </div> <div> <el-button type="primary" :disabled="isAudit" @click="addShop">{{$t('放入')}}</el-button> </div> </div> <el-table border :data="splitData.orderSplitItemBackVOList"> <el-table-column :label="$t('序号')" align="center" prop="id" type="index"> <template slot-scope="scope"> <span>{{scope.$index + 1}}</span> </template> </el-table-column> <el-table-column :label="$t('品名')" align="center"> <template slot-scope="scope"> <el-row>{{scope.row.prodTitleZh}}</el-row> <el-row>{{scope.row.prodTitleEn}}</el-row> </template> </el-table-column> <el-table-column :label="$t('品牌')" align="center"> <template slot-scope="scope"> <dict-tag :type="DICT_TYPE.ECW_IS_BRAND" :value="scope.row.brandType" /> </template> </el-table-column> <el-table-column :label="$t('入仓体积')" align="center" > <template slot-scope="scope"> {{scope.row.volume}}m³ <!--<el-input v-model="scope.row.volume" @change="updateField(scope.row, 'volume')" size="mini" disabled> <span slot="append">m³</span> </el-input>--> </template> </el-table-column> <el-table-column :label="$t('收费体积')" align="center" > <template slot-scope="scope"> {{scope.row.chargeVolume}}m³ <!--<el-input v-model="scope.row.chargeVolume" @change="updateField(scope.row, 'chargeVolume')" size="mini" disabled> <span slot="append">m³</span> </el-input>--> </template> </el-table-column> <el-table-column :label="$t('入仓重量')" align="center"> <template slot-scope="scope"> {{scope.row.weight}}kg <!--<el-input v-model="scope.row.weight" @change="updateField(scope.row, 'weight')" size="mini" disabled> <span slot="append">kg</span> </el-input>--> </template> </el-table-column> <el-table-column :label="$t('收费重量')" align="center"> <template slot-scope="scope"> {{scope.row.chargeWeight}}kg <!--<el-input v-model="scope.row.chargeWeight" @change="updateField(scope.row, 'chargeWeight')" size="mini" disabled> <span slot="append">kg</span> </el-input>--> </template> </el-table-column> <el-table-column :label="$t('货值')" align="center"> <template slot-scope="scope"> <el-input v-model="scope.row.worth" @change="updateField(scope.row, 'worth')" size="mini"> <span slot="append">{{ $t('元') }}</span> </el-input> </template> </el-table-column> <el-table-column :label="$t('箱数')" align="center"> <template slot-scope="scope"> <el-button type="text" @click="showWarehouse(scope.row)">{{scope.row.num}}</el-button> </template> </el-table-column> <el-table-column :label="$t('数量(个)')" align="center"> <template slot-scope="scope"> <span>{{scope.row.quantity}}</span> </template> </el-table-column> <el-table-column :label="$t('计划装柜')" align="center"> {{planCabinet}} </el-table-column> <el-table-column :label="$t('操作')" align="center"> <template slot-scope="scope"> <el-button size="mini" :disabled="isAudit" type="text" icon="el-icon-delete" @click="removeShop(scope.row.id)">{{$t('移出')}}</el-button> </template> </el-table-column> </el-table> </div> </el-card> <el-row style="marginTop:15px;"> <work-flow xmlkey="split_order" v-model="selectedUsers"></work-flow> </el-row> <div slot="footer" class="card footer_btn"> <el-button v-if="!isAudit" type="primary" @click="submitForm">{{$t('提交申请')}}</el-button> <el-button v-if="!isAudit" plain type="primary" @click="$emit('closeDialog2')">{{$t('取消')}}</el-button> <el-button v-if="isAudit" type="primary" @click="jumpReviewDetail">{{$t('审核中')}}</el-button> <el-button v-if="isAudit" plain type="primary" @click="cancelSplit">{{$t('取消审核')}}</el-button> <el-button v-if="isAudit" plain type="primary" @click="$emit('closeDialog2')">{{$t('返回')}}</el-button> </div> <!-- 对话框(添加 / 修改) --> <el-dialog :title="$t('放入品名')" :visible.sync="shopOpen" width="1500px" append-to-body> <el-form ref="shopForm" :model="shopForm" :rules="shopRules" label-width="150px" inline> <el-form-item :label="$t('中文品名')+':'" prop="orderItemId"> <el-select v-model="shopForm.orderItemId" :placeholder="$t('请选择中文品名')"> <el-option v-for="item in orderItems" :label="item.prodTitleZh" :value="item.orderItemId" :key="item.id"></el-option> </el-select> </el-form-item> <el-form-item :label="$t('英文品名')+':'" prop="orderItemId"> <el-select v-model="shopForm.orderItemId" :placeholder="$t('请选择英文品名')"> <el-option v-for="item in orderItems" :label="item.prodTitleEn" :value="item.orderItemId" :key="item.id"></el-option> </el-select> </el-form-item> <div class="page-title">{{$t('品名可拆数据')}}</div> <div class="pl-20"> <span class="mr-10">{{$t('箱数')}}:{{ Math.min(mainOrderItem.num, maxNum) || 0 }}</span> <span class="mr-10">{{ $t('入仓方数') }}:{{ mainOrderItem.volume || 0 }}m³</span> <span class="mr-10">{{ $t('收费方数') }}:{{ mainOrderItem.chargeVolume || 0 }}m³</span> <span class="mr-10">{{ $t('入仓重量') }}:{{ mainOrderItem.weight || 0 }}kg</span> <span class="mr-10">{{ $t('收费重量') }}:{{ mainOrderItem.chargeWeight || 0 }}kg</span> <span class="mr-10">{{ $t('数量(个)') }}:{{ mainOrderItem.quantity || 0 }}</span> <span class="mr-10">{{ $t('剩余可拆货值') }}:{{ leftWorth}}{{ $t('元') }}</span> </div> <div class="page-title">{{$t('可拆入仓记录')}}</div> <el-table :data="getOrderItemWarehouseIn(shopForm.orderItemId)" style="width: 100%"> <el-table-column :label="$t('箱数')"> <template v-slot="{row,$index}"> {{Math.min(getWarehouseLeftData(row, 'num'), leftSplitNum)}} <dict-tag :type="DICT_TYPE.WAREHOUSING_SPECIFICATION_TYPE" v-model="row.specificationType"></dict-tag> </template> </el-table-column> <el-table-column :label="$t('包装类型')"> <template v-slot="{row,$index}"> <dict-tag :type="DICT_TYPE.ECW_PACKAGING_TYPE" v-model="row.unit"></dict-tag> </template> </el-table-column> <el-table-column label="长(cm)"> <template v-slot="{row,$index}"> {{row.boxGauge1}} </template> </el-table-column> <el-table-column label="宽(cm)"> <template v-slot="{row,$index}"> {{ row.boxGauge2 }} </template> </el-table-column> <el-table-column label="高(cm)"> <template v-slot="{row,$index}"> {{ row.boxGauge3 }} </template> </el-table-column> <el-table-column label="入仓体积(m³)"> <template v-slot="{row,$index}"> {{getWarehouseLeftData(row, 'volume')}} </template> </el-table-column> <el-table-column label="入仓重量(Kg)" prop="weight"> <template v-slot="{row,$index}"> {{getWarehouseLeftData(row, 'weight')}} </template> </el-table-column> <el-table-column :label="$t('数量')" prop="quantity"> <template v-slot="{row,$index}"> {{getWarehouseLeftData(row, 'quantity')}} </template> </el-table-column> <el-table-column :label="$t('快递单号')" prop="expressNo"></el-table-column> <el-table-column :label="$t('储位')" prop="orderLocationBackVOList"> <template v-slot="{ row, column, $index }"> <warehouse-area-select v-model="row.orderLocationBackVOList" readonly :warehouse-id="currentWarehouseId" ></warehouse-area-select> </template> </el-table-column> <el-table-column :label="$t('操作')"> <template v-slot="{ row, column, $index}"> <el-tag v-if="getWarehouseInSplitData(row.id,'num') >= row.cartonsNum" disabled size="mini" type="primary" >{{$t('已拆完')}}</el-tag> <el-button v-else size="mini" type="primary" @click="putInRecord(row)" :disabled="leftSplitNum <= 0">{{$t('放入')}}</el-button> </template> </el-table-column> </el-table> <div class="flex-between mt-20 mb-10"> <div class="page-title" style="margin: 0"> {{$t('已放入入仓记录')}} </div> <el-button type="danger" size="mini" @click="clearAll">{{$t('清空放入数据')}}</el-button> </div> <el-table :data="shopForm.specsRecordVOList" style="width: 100%"> <el-table-column :label="$t('箱数')" width="200px"> <template v-slot="{row,$index}"> {{row.num}} <dict-tag :type="DICT_TYPE.WAREHOUSING_SPECIFICATION_TYPE" v-model="row.specificationType"></dict-tag> </template> </el-table-column> <el-table-column :label="$t('包装类型')" width="100px"> <template v-slot="{row,$index}"> <dict-tag :type="DICT_TYPE.ECW_PACKAGING_TYPE" v-model="row.unit"></dict-tag> </template> </el-table-column> <el-table-column label="长(cm)"> <template v-slot="{row,$index}"> {{row.boxGauge1}} </template> </el-table-column> <el-table-column label="宽(cm)"> <template v-slot="{row,$index}"> {{ row.boxGauge2 }} </template> </el-table-column> <el-table-column label="高(cm)"> <template v-slot="{row,$index}"> {{ row.boxGauge3 }} </template> </el-table-column> <el-table-column label="入仓体积(m³)"> <template v-slot="{row,$index}"> {{row.volume}} </template> </el-table-column> <!--<el-table-column label="收费体积(m³)" prop="chargeVolume"></el-table-column>--> <el-table-column label="入仓重量(Kg)" prop="weight"></el-table-column> <!--<el-table-column label="收费重量(Kg)" prop="chargeWeight"></el-table-column>--> <el-table-column :label="$t('数量')" width="130px" prop="quantity"></el-table-column> <el-table-column :label="$t('快递单号')" prop="expressNo"></el-table-column> <el-table-column :label="$t('储位')" prop="orderLocationBackVOList"> <template v-slot="{ row, column, $index }"> {{getLocationName(row.orderLocationList)}} </template> </el-table-column> <el-table-column :label="$t('操作')"> <template v-slot="{ row, column, $index}"> <el-button size="mini" type="primary" @click="deleteRow($index)">{{$t('删除')}}</el-button> </template> </el-table-column> </el-table> <div class="page-title">{{$t('放入数据')}}</div> <div class="pl-20 mb-10"> <span class="mr-10">{{$t('箱数')}}:{{ putin.num || 0 }},</span> <span class="mr-10">{{ $t('数量(个)') }}:{{ putin.quantity || 0 }},</span> <span class="mr-10">{{ $t('入仓方数') }}:{{ putin.volume || 0 }}m³, </span> <span class="mr-10">{{ $t('入仓重量') }}:{{ putin.weight || 0 }}kg</span> </div> <el-form-item :label="$t('收费方数')" prop="chargeVolume"> <el-input-number v-model="shopForm.chargeVolume" controls-position="right"></el-input-number>m³ </el-form-item> <el-form-item :label="$t('收费重量')" prop="chargeWeight"> <el-input-number v-model="shopForm.chargeWeight" controls-position="right"></el-input-number>kg </el-form-item> <el-form-item :label="$t('放入货值')"> <el-input-number v-model="shopForm.worth" controls-position="right" :min="0" :max="leftWorth"> <template slot="append">{{ $t('元') }}</template> </el-input-number> </el-form-item> <el-form-item :label="$t('备注信息')"> <el-input v-model="shopForm.remark"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="shopAdd">{{$t('确定')}}</el-button> <el-button @click="shopCancel">{{$t('取消')}}</el-button> </div> </el-dialog> <warehouse-record v-if="currentWarehouseRecord" :list="currentWarehouseRecord" append-to-body></warehouse-record> <put-in v-if="currentPutIn" :warehouse-record="currentPutIn" @close="currentPutIn=null" @submit="handlePutin" :warehouse-id="currentWarehouseId" :maxNum="leftSplitNum" append-to-body ></put-in> </div> </template> <script> import { getSplitList, // quantitycheck, createSplitItem, deleteSplitItem, splitItemWorthCheck, } from "@/api/ecw/orderHandle"; import {quantityRequired} from "@/api/ecw/warehouse"; import { getTradeCityList } from "@/api/ecw/region"; import WorkFlow from "@/components/WorkFlow"; import {getOrder, getOrderWarehouseIn, splitItemUpdate} from "@/api/ecw/order"; import { serviceMsg, toReviewDetail } from "../../utils"; import { createApproval, approvalCancel, splitList } from "@/api/ecw/boxSea"; import Decimal from "decimal.js"; import Warehouse from "@/views/ecw/order/warehousing/components/Warehouse"; import WarehouseRecord from "@/views/ecw/order/splitApply/components/WarehouseRecord"; import WarehouseAreaSelect from "@/components/WarehouseAreaSelect"; import PutIn from "@/views/ecw/order/splitApply/components/PutIn.vue"; export default { name: "splitOrder", inheritAttrs: false, components: { PutIn, WarehouseAreaSelect, WarehouseRecord, Warehouse, WorkFlow }, props: { currRow: Object, }, data() { return { orderData: {}, splitData: {}, detail: {}, loading: false, selectedUsers: [], tradeCityList: [], planCabinet: "", shopOpen: false, orderItems: [], shopForm: {}, // 表单校验 shopRules: { zhId: [ { required: true, message: this.$t("请选择中文品名"), trigger: "change", }, ], enId: [ { required: true, message: this.$t("请选择英文品名"), trigger: "change", }, ], }, queryParams: { orderId: 0, lang: 0, }, isQuantity: false, // 主单数据 mainOrder: {orderSplitItemBackVOList: {}}, // 当前查看的入仓记录 currentWarehouseRecord: null, // 订单入仓记录 warehouseInList: [], // 当前选择的入仓记录ID selectedWarehouseInId: null, // 当前正在放入的入仓记录 currentPutIn: null, /*// 订单剩余数据 orderLeftData: null*/ }; }, created() { const { shipmentObj } = this.$attrs; this.planCabinet = `${shipmentObj.selfNo}-${this.currRow.sectionName}`; getTradeCityList().then((res) => (this.tradeCityList = res.data)); this.queryParams.orderId = this.currRow.orderId; this.getOrderDetail(); this.getSplit(); // 获取入仓记录 getOrderWarehouseIn(this.queryParams.orderId).then(res => { this.warehouseInList = res.data }) this.$nextTick(() => { window.$vm = this }) }, watch: { //监听table这个对象 tableData: { // 立即监听 immediate: true, handler() { this.$nextTick(() => { const tds = document.querySelectorAll( "#table .el-table__footer-wrapper tr>td" ); // colSpan合并列 tds[1].colSpan = 5; tds[1].style.textAlign = "left"; tds[2].style.display = "none"; tds[3].style.display = "none"; tds[4].style.display = "none"; }); }, }, // 切换放入品名 'shopForm.orderItemId'(){ // 默认取以前放入的品名 this.shopForm.specsRecordVOList = [] const splitItem = this.splitData.orderSplitItemBackVOList.find(item => item.orderItemId == this.shopForm.orderItemId) let specsRecordVOList = splitItem?.specsRecordVOList || [] specsRecordVOList.forEach(item => { const [boxGauge1, boxGauge2, boxGauge3] = item.boxGauge.split('*') this.shopForm.specsRecordVOList.push({...item, boxGauge1, boxGauge2, boxGauge3}) }) // 显示原来默认的收费数据 this.$set(this.shopForm, 'chargeVolume', splitItem.chargeVolume) this.$set(this.shopForm, 'chargeWeight', splitItem.chargeWeight) this.$set(this.shopForm, 'worth', splitItem.worth) } }, computed: { isAudit() { const { shipmentObj } = this.$attrs; const { cabinetSplitInfo } = shipmentObj; if (cabinetSplitInfo) { /** * PROCESS(1, "处理中"), * APPROVE(2, "通过"), * REJECT(3, "不通过"), * CANCEL(4, "已取消"); */ const { approvalStatus } = cabinetSplitInfo; if (approvalStatus === 1) return true; } return false; }, // 订单项数据,默认要返回一个如下的空json结构体,避免报错 // 装柜拆单只能拆一个出来,所以直接用原单数据作为放入品名的最大值限制即可,跟订单操作中的拆单有所区别 mainOrderItem(){ if(!this.shopForm.orderItemId || !this.mainOrder.orderSplitItemBackVOList.length) return {} return this.mainOrder.orderSplitItemBackVOList.find(item => item.orderItemId == this.shopForm.orderItemId) || {} }, // 放入数据 putin(){ let data = { num: new Decimal(0), volume: new Decimal(0), chargeVolume: new Decimal(0), weight: new Decimal(0), chargeWeight: new Decimal(0), quantity: new Decimal(0) } this.shopForm.specsRecordVOList && this.shopForm.specsRecordVOList.forEach(item => { data.num = data.num.plus(new Decimal(item.num || 0)) data.volume = data.volume.plus(new Decimal(item.volume || 0)) data.chargeVolume = data.chargeVolume.plus(new Decimal(item.chargeVolume || 0)) data.weight = data.weight.plus(new Decimal(item.weight || 0)) data.chargeWeight = data.chargeWeight.plus(new Decimal(item.chargeWeight || 0)) data.quantity = data.quantity.plus(new Decimal(item.quantity || 0)) }) return { num: data.num.toNumber(), volume: data.volume.toNumber(), chargeVolume: data.chargeVolume.toNumber(), weight: data.weight.toNumber(), chargeWeight: data.chargeWeight.toNumber(), quantity: data.quantity.toNumber() } }, // 当前仓库ID currentWarehouseId(){ return this.orderData.adjustToDestWarehouseId || this.orderData.logisticsInfoDto.startWarehouseId }, // 当前选择的入仓记录 /*currentWarehouseItem(){ return this.getOrderItemWarehouseIn(this.shopForm.orderItemId).find(item => item.id === this.selectedWarehouseInId) },*/ // 根据orderItemId获取入仓记录 getOrderItemWarehouseIn() { return orderItemId => { const list = this.warehouseInList.find(item => item.orderItemId == orderItemId)?.orderWarehouseInBackItemDoList || [] return list.map(item => { let [boxGauge1, boxGauge2, boxGauge3] = item.boxGauge.split('*') item.boxGauge1 = boxGauge1 item.boxGauge2 = boxGauge2 item.boxGauge3 = boxGauge3 return item }) } }, // 根据入仓记录ID筛选出他的全部拆出记录(不含主单的) getWarehouseInspecsRecordVOList(){ return warehouseInId => { let specsRecordVOList = [] // 这里是正在操作放入,但是还没确定提交的 this.shopForm.specsRecordVOList.forEach(item => { if(item.warehouseInId == warehouseInId)specsRecordVOList.push(item) }) return specsRecordVOList } }, // 根据入仓ID获取拆出数据 getWarehouseInSplitData(){ return (warehouseInId, field) => { let total = new Decimal(0) this.getWarehouseInspecsRecordVOList(warehouseInId).forEach(item => { total = total.plus(new Decimal(item[field] || 0)) }) return total.toNumber() } }, // 获取入仓记录的剩余数据 getWarehouseLeftData(){ return (warehouseRecord, field) => { let warehouseField = field if(field === 'num'){ warehouseField = 'cartonsNum' } if(field === 'quantity'){ warehouseField = 'quantityAll' } let total = new Decimal(warehouseRecord[ warehouseField ] || 0) this.getWarehouseInspecsRecordVOList(warehouseRecord.id).forEach(item => { total = total.minus(new Decimal(item[field] || 0)) }) return total.toNumber() } }, // 最大可装箱数 原单箱数 - 已装箱数 maxNum(){ return this.currRow.num - this.currRow.installNum }, // 剩余可拆箱数 leftSplitNum(){ let num = this.maxNum - this.putin.num /*this.splitData.orderSplitItemBackVOList.forEach(item =>{ num -= item.num })*/ return num }, // 订单剩余可拆货值 leftWorth(){ if(!this.orderData?.costVO?.totalWorth)return 0; let worth = new Decimal(this.orderData.costVO.totalWorth) this.splitData.orderSplitItemBackVOList.forEach(item =>{ worth = worth.minus(item.worth || 0) }) // 包当前选择的品名之前填写的货值包含进去 if(this.shopForm.orderItemId){ let splitItem = this.splitData.orderSplitItemBackVOList.find(item => item.orderItemId == this.shopForm.orderItemId) if(splitItem){ worth = worth.plus(splitItem.worth || 0) } } return worth.toNumber() }, }, methods: { /*检查并提交字段(体积,重量)修改*/ updateField(row, field){ let val = parseFloat(row[field]) if(!val || val < 0){ this.$message.error(this.$t('数据无效')) return this.getList() } splitItemUpdate(row).then(() => { this.$message.success(this.$t('修改成功')) }).catch(() => { this.getList() }) }, /* 拆箱总数,默认计算箱数,传递quantity可计算个数 */ totalSplit(field = 'num') { let _total = 0; const { orderSplitItemBackVOList = [] } = this.splitData; orderSplitItemBackVOList.forEach((v) => { _total = Decimal.add(_total, Number(v[field])).toNumber(); }); return _total; }, /* 打开拆单 */ getSplit() { this.orderItems = this.currRow.goodsList ?? []; const { shipmentObj } = this.$attrs; splitList({ orderId: this.currRow.orderId, shipmentId: shipmentObj.id, }).then((res) => { const data = res.data; // 取拆单项 this.splitData = data.filter((item) => !item.isMaster)?.[0] ?? {}; // 取主单,用语判断放入品名的数据上限 this.mainOrder = data.find(item => item.isMaster) }); }, /*itemDisabled(data) { const { orderSplitItemBackVOList = [] } = this.splitData; const isExist = orderSplitItemBackVOList.find( (item) => item.orderItemId === data.orderItemId ); return isExist ? true : false; },*/ /* 查询拆单项 */ querySplitGoods() { getSplitList({ lang: 0, orderId: this.currRow.orderId, shipmentType: 1, }).then((res) => { const { orderSplitBackVOList } = res.data; // 取拆单项 const list = orderSplitBackVOList.filter((item) => !item.isMaster)?.[0] ?? {}; this.splitData.orderSplitItemBackVOList = list.orderSplitItemBackVOList ?? []; }); }, getOrderDetail() { this.loading = true; getOrder(this.queryParams.orderId).then((response) => { this.orderData = response.data; this.loading = false; }); }, getSummaries() { const sums = []; sums[0] = this.$t("小计"); if ( !this.orderData || !this.orderData.orderItemVOList || this.orderData.length == 0 ) { return sums; } let orderSum = 0; let orderV = 0; let orderW = 0; let leviteSum = 0; let leviteV = 0; let leviteW = 0; this.orderData.orderItemVOList.forEach((column, index) => { orderSum = Decimal.add(orderSum, column.num ?? 0).toNumber(); orderV = Decimal.add(orderV, column.volume ?? 0).toFixed(2); orderW = Decimal.add(orderW, column.weight ?? 0).toFixed(2); leviteSum = Decimal.add( leviteSum, column.warehouseInInfoVO?.cartonsNum ?? 0 ).toNumber(); leviteV = Decimal.add( leviteV, column.warehouseInInfoVO?.volume ?? 0 ).toFixed(2); leviteW = Decimal.add( leviteW, column.warehouseInInfoVO?.weight ?? 0 ).toFixed(2); }); sums[1] = this.$t( "下单统计:{orderSum} 箱 {orderV} m³ {orderW} kg 入仓统计:{leviteSum} 箱 {leviteV} m³ {leviteW} kg", { orderSum, orderV, orderW, leviteSum, leviteV, leviteW, } ); return sums; }, importCityName(id) { let arr = this.tradeCityList.filter((item) => item.id == id); return arr.length > 0 ? this.$l(arr[0], "title") : this.$t("无"); }, submitForm() { const { shipmentObj } = this.$attrs; // 创建拆单审核 createApproval({ applyReason: this.$t("拆单审核"), approvalStatus: 0, approvalType: 8, copyUserId: this.selectedUsers, orderId: this.currRow.orderId, shipmentId: shipmentObj.id, }).then((res) => { serviceMsg(res, this).then((res) => { this.$emit("getBoxInfo"); this.querySplitGoods(); }); }); }, addShop() { this.shopForm = {}; this.shopOpen = true; this.isQuantity = false; // 重置表单数据 this.shopForm = {specsRecordVOList:[]} }, shopAdd() { this.$refs["shopForm"].validate((valid) => { if (valid) { if (this.putin.num === 0) { this.$message.error(this.$t("放入箱数不能为0")); return; } if (this.putin.quantity === 0 && this.isQuantity) { this.$message.error(this.$t("放入数量(个)不能为0")); return; } this.shopForm.specsRecordVOList.forEach(item => { item.boxGauge = `${item.boxGauge1}*${item.boxGauge2}*${item.boxGauge3}` }) let params = { num: this.putin.num, // quantity: this.shopForm.quantity, orderItemId: this.shopForm.orderItemId, orderSplitId: this.splitData.id, remarks: this.shopForm.remarks, volume: this.putin.volume, weight: this.putin.weight, chargeWeight: this.shopForm.chargeWeight, chargeVolume: this.shopForm.chargeVolume, worth: this.shopForm.worth || 0, specsRecordVOList:this.shopForm.specsRecordVOList, shipmentSplit: true }; // 按数量计费的才需要传递数量 if(this.isQuantity){ params.quantity = this.putin.quantity } // 货值不能超过剩余货值 if(params.worth > this.leftWorth){ return this.$message.error(this.$t("货值不能超过剩余货值")); } createSplitItem(params).then((res) => { this.$message.success(this.$t("放入成功")); this.querySplitGoods(); this.$refs["shopForm"].resetFields(); this.shopOpen = false; }); } }); }, removeShop(id) { let that = this; that.$confirm(this.$t("是否移除货物吗?")).then(function () { deleteSplitItem(id).then((res) => { that.$message.success(that.$t("移除成功")); that.querySplitGoods(); }); }); }, cancelSplit() { const { shipmentObj } = this.$attrs; approvalCancel({ applyReason: this.$t("取消审核"), id: shipmentObj["cabinetSplitInfo"].id, shipmentId: shipmentObj.id, }).then((res) => { serviceMsg(res, this).then(() => { this.$emit("getBoxInfo"); this.querySplitGoods(); }); }); }, shopCancel() { this.$refs["shopForm"].resetFields(); this.shopOpen = false; this.shopForm = {}; }, jumpReviewDetail() { const { cabinetSplitInfo } = this.$attrs.shipmentObj; toReviewDetail.apply(this, [cabinetSplitInfo.bpmProcessId]); this.$emit("closeDialog2", "close"); }, // 添加一行 addRow(){ if(!this.shopForm.specsRecordVOList){ this.$set(this.shopForm,'specsRecordVOList',[]) } if(!this.currentWarehouseItem){ return this.$message.info(this.$t("请选择入仓记录")) } let { specificationType, boxGauge1, boxGauge2, boxGauge3, volume, weight } = this.currentWarehouseItem let num = this.currentWarehouseItem.cartonsNum // 根据入仓记录添加一行 this.shopForm.specsRecordVOList.push({ specificationType, boxGauge1, boxGauge2, boxGauge3, volume, weight,num, orderLocationList: this.currentWarehouseItem.orderLocationBackVOList }) }, // 删除一行,可选参数index表上行号,参数不是数字则删除最后一行 deleteRow(index){ const spliceIndex = typeof index !== 'number' ? this.shopForm.specsRecordVOList.length - 1 : index this.shopForm.specsRecordVOList.splice(spliceIndex, 1) this.calcDefaultData() }, // 计算体积 calcVolume(row){ let volume = Decimal(row.boxGauge1 || 0) .times(Decimal(row.boxGauge2 || 0)) .times(Decimal(row.boxGauge3 || 0)).div(1000000) // 如果是箱的单位要乘以箱数 if(row.specificationType === 1) { row.volume = volume.times(Decimal(row.num || 0)) } // 最低0.01 volume = Math.max(0.01, volume.toNumber().toFixed(2)) this.$set(row, 'volume', volume) this.$set(row, 'chargeVolume', volume) }, // 显示入库记录 showWarehouse(row){ if(!row.specsRecordVOList){ return this.$message.info(this.$t('暂无入仓记录')) } this.currentWarehouseRecord = row.specsRecordVOList }, // 获取储位名称 getLocationName(locationArr){ if(!locationArr || !locationArr.length) return '' let arr = [] locationArr.forEach(item => { arr.push(`${item.areaName || ''}${item.locationName || ''}`) }) return Array.from(new Set(arr)).join(",") }, // 根据入仓记录打开放入弹层 putInRecord(row){ this.currentPutIn = row // 此条入仓记录已拆出的入仓记录,这样在放入的时候可以确保不超过此入仓记录的数量 this.currentPutIn.specsRecordVOList = this.getWarehouseInspecsRecordVOList(row.id) }, // 放入回调 handlePutin(list){ if(!list.length){ return this.$message.error(this.$t("请至少放入一条数据")) } list.forEach(item => { this.shopForm.specsRecordVOList.push({...item}) }) this.currentPutIn = null this.calcDefaultData() }, // 清空放入记录 clearAll(){ this.$confirm(this.$t("确定要清空放入数据么?")).then(res => { this.shopForm.specsRecordVOList = [] this.calcDefaultData() }) }, // 计算默认的收费数据 calcDefaultData() { // 根据比例计算默认的收费方数和收费重量 const orderItem = this.orderData.orderItemVOList.find(item => item.orderItemId == this.shopForm.orderItemId) const rate = this.putin.num / orderItem.warehouseInInfoVO.cartonsNum /* * 1 普货 2 重货 3 泡货 * 普货 收费数据=入仓数据 * 泡货 收费方数=入仓方数 收费重量 = 品名收费重量*比例 * 重货 收费方数=品名收费方数*比例 收费重量 = 入仓重量 * */ const chargeVolume = orderItem.itemType === 2 ? (orderItem.chargeVolume*rate).toFixed(2) : this.putin.volume const chargeWeight = orderItem.itemType === 3 ? (orderItem.chargeWeight*rate).toFixed(2) : this.putin.weight this.$set(this.shopForm, 'chargeVolume', chargeVolume) this.$set(this.shopForm, 'chargeWeight', chargeWeight) // 货值按照主单的总货值*订单的箱数比例 let worth = (this.orderData.costVO.totalWorth * this.putin.num / this.orderData.sumNum).toFixed(2) this.$set(this.shopForm, 'worth', worth) }, // 查询订单剩余数据 /*getOrderLeftData(){ splitItemWorthCheck(this.orderData.orderId).then(res => { this.orderLeftData = res.data }) }*/ } }; </script> <style lang="scss"> .shipping-split-order { .card-title { font-size: 18px; font-weight: bold; margin-top: 10px; } .card-info { font-size: 16px; > span { margin-right: 10px; } } .card { margin-top: 20px; } .btn-header { width: 90%; display: flex; align-items: center; justify-content: space-between; margin: 20px 0; } .red { color: #ff3430; font-size: 15px; } .footer_btn { padding-bottom: 60px; } } </style>