<template> <div class="app-container"> <!-- 搜索工作栏 --> <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>{{orderData.sumNum||0}}/{{orderData.costVO?orderData.costVO.totalNum:0}}</span> </el-descriptions-item> <el-descriptions-item :label="$t('订单状态')"> <!-- <dict-tag :type="DICT_TYPE.ORDER_STATUS" :value="orderData.status" /> --> {{orderData.abnormalState!=0?$t('异常'):$t('正常')}} </el-descriptions-item> <el-descriptions-item :label="$t('送货日期')"> {{orderData.deliveryDate||$t('无')}} </el-descriptions-item> <el-descriptions-item :label="$t('运输方式')"> <dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="orderData.transportId" /> </el-descriptions-item> <el-descriptions-item :label="$t('始发地')" > <template v-if="orderData.logisticsInfoDto"> {{$l(orderData.logisticsInfoDto, 'startTitle')}} </template> <template v-else>{{$t('无')}}</template> </el-descriptions-item> <el-descriptions-item :label="$t('目的地')" :span="2"> <template v-if="orderData.logisticsInfoDto"> {{$l(orderData.logisticsInfoDto, 'destTitle')}} </template> <template v-else>{{$t('无')}}</template> </el-descriptions-item> <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?$t('无'):!orderData.consignorVO.phone?$t('无'):(checkCode(orderData.consignorVO.countryCode)+orderData.consignorVO.phone)}} </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?$t('无'):!orderData.consigneeVO.phone?$t('无'):(checkCode(orderData.consigneeVO.countryCode)+orderData.consigneeVO.phone)}} </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.prodTitleEn}}</el-row> <el-row>{{scope.row.prodTitleZh}}</el-row> </template> </el-table-column> <el-table-column :label="$t('填单货物属性')" align="center" width="200"> <template slot-scope="scope"> <el-row> <span>{{$t('品牌')}}: <dict-tag :type="DICT_TYPE.ECW_IS_BRAND" :value="scope.row.brandType" /> </span> </el-row> <el-row> <span>{{$t('箱数')}}:{{scope.row.num||$t('未填')}}</span> </el-row> <el-row> <span>{{$t('体积')}}:{{scope.row.volume||$t('未填')}}m³</span> </el-row> <el-row> <span>{{$t('重量')}}:{{scope.row.weight||$t('未填')}}kg</span> </el-row> </template> </el-table-column> <el-table-column :label="$t('入库货物属性')" align="center" width="400"> <template slot-scope="scope"> <el-row v-if="scope.row.warehouseInInfoVO"> <span>{{$t('规格')}}:{{scope.row.warehouseInInfoVO?scope.row.warehouseInInfoVO.boxGauge:0}}</span> </el-row> <el-row v-if="scope.row.warehouseInInfoVO"> <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.feeType" /> </span> <span style="margin-left: 10px;">{{$t('箱数')}}:{{!scope.row.warehouseInInfoVO?0:scope.row.warehouseInInfoVO.cartonsNum}}</span> <span style="margin-left: 10px;">{{$t('体积')}}:{{!scope.row.warehouseInInfoVO?0:scope.row.warehouseInInfoVO.volume}}m³</span> <span style="margin-left: 10px;">{{$t('重量')}}:{{!scope.row.warehouseInInfoVO?0:scope.row.warehouseInInfoVO.weight}}kg</span> <span style="margin-left: 10px;">{{$t('数量(个)')}}:{{!scope.row.warehouseInInfoVO?0:scope.row.warehouseInInfoVO.quantityAll}}</span> </el-row> <el-row v-if="!scope.row.warehouseInInfoVO"> <span>{{$t('暂时没有入仓信息')}}</span> </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"> <template slot-scope="scope"> <!-- {{orderData.abnormalState!=0?$t('异常'):$t('正常')}} --> <dict-tag :type="DICT_TYPE.ORDER_ITEM_STATUS" :value="scope.row.itemStatus" /> </template> </el-table-column> </el-table> </el-card> <el-card class="card"> <!-- 列表 --> <div slot="header" class="card-title flex"> <div style="flex: 1; display: flex; align-items: center">{{$t('拆单信息')}}</div> <div> <span v-if="orderData.abnormalState!=0" class="red">{{$t('异常无法拆单')}}</span> <el-button v-else type="primary" @click="addSplit" :disabled="orderData.inWarehouseState==207">{{$t('新建拆单')}} </el-button> </div> </div> <template v-if="splitData.length>0"> <div v-for="(item, index) in splitData" :key="index"> <div class="btn-header"> <div> <p class="card-info"> <span class="card-title"> {{item.orderNo}} </span> <dict-tag :type="DICT_TYPE.ECW_TRANSPORT_TYPE" :value="item.transportId" /> <span>{{$t('发往')}}:{{importCityName(item.dstWarehouseId)}}</span> </p> </div> <div> <el-button type="primary" @click="addShop(index)">{{$t('放入')}}</el-button> <el-button :disabled="index < splitData.length - 1" type="primary" plain @click="deleteSplit(item.id)">{{$t('删除')}}</el-button> </div> </div> <el-table v-if="item.orderSplitItemBackVOList" border :data="item.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" prop="prodTitleZh" /> <el-table-column :label="$t('英文名')" align="center" prop="prodTitleEn" /> <el-table-column :label="$t('品牌')" align="center"> <template slot-scope="scope"> <template v-if="scope.row.brandName">{{scope.row.brandName}}</template> <dict-tag v-else :type="DICT_TYPE.ECW_IS_BRAND" :value="scope.row.feeType" /> </template> </el-table-column> <el-table-column :label="$t('入仓体积')" align="center" > <template slot-scope="scope"> {{scope.row.volume}}m³ </template> </el-table-column> <el-table-column :label="$t('收费体积')" align="center" > <template slot-scope="scope"> <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 </template> </el-table-column> <el-table-column :label="$t('收费重量')" align="center"> <template slot-scope="scope"> <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" disabled> <span slot="append">{{ $t('元') }}</span> </el-input> </template> </el-table-column> <el-table-column :label="$t('箱数')" align="center" prop="num"> <template slot-scope="scope"> <el-button type="text" @click="currentWarehouseRecord=scope.row.specsRecordVOList"> {{ scope.row.num }} </el-button> </template> </el-table-column> <el-table-column :label="$t('数量(个)')" align="center" prop="quantity"></el-table-column> <el-table-column :label="$t('操作')" align="center"> <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-delete" @click="removeShop(scope.row.id)">{{$t('移出')}}</el-button> </template> </el-table-column> </el-table> </div> </template> <el-empty v-else></el-empty> </el-card> <work-flow xmlkey="split_order" v-model="selectedUsers"></work-flow> <div slot="footer" class="card footer_btn" v-if="orderData.abnormalState==0"> <template v-if="orderData.inWarehouseState!=207"> <el-button type="primary" @click="submitForm">{{$t('提交申请')}}</el-button> <el-button plain type="primary" @click="cancel">{{$t('取消')}}</el-button> <el-button type="primary" @click="reset">{{$t('重置')}}</el-button> </template> <template v-else> <el-button type="primary" @click="$router.push(`/bpm/process-instance/detail?id=`+orderApprovalBackVO.applyingFormId)">{{$t('审核中')}}</el-button> <el-button plain type="primary" @click="dialogVisible = true">{{$t('取消审核')}}</el-button> <el-button plain type="primary" @click="$store.dispatch('tagsView/delCurrentView')">{{$t('返回')}}</el-button> </template> </div> <!-- 对话框(添加 / 修改) --> <el-dialog :title="$t('新建拆单')" :visible.sync="open" width="400px" append-to-body> <el-form ref="formSplit" :model="form" :rules="rules" label-width="80px"> <el-form-item :label="$t('运输方式')"> <dict-selector :clearable="true" :type="DICT_TYPE.ECW_TRANSPORT_TYPE" @change="changeTransport" v-model="form.transportId" /> </el-form-item> <el-form-item :label="$t('出货渠道')" v-if="getDictData(DICT_TYPE.ECW_TRANSPORT_TYPE, form.transportId).cssClass == 'channel'"> <el-select v-model="form.channelId" :placeholder="$t('请选择出货渠道')" :clearable="true"> <el-option :disabled="getDictData(DICT_TYPE.ECW_TRANSPORT_TYPE, form.transportId).cssClass != 'channel'" v-for="item in channelData" :key="item.channelId" :label="$l(item, 'name')" :value="item.channelId"/> </el-select> </el-form-item> <el-form-item :label="$t('目的仓库')" > <el-select v-model="form.destWarehouseId" @change="changeDeatWarehouseId" :placeholder="$t('请选择目的仓库')" :clearable="true"> <el-option v-for="items in importCityList" :label="$l(items, 'title')" :value="items.id" :key="items.id" ></el-option> </el-select> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="haddleAdd">{{$t('确定')}}</el-button> <el-button @click="cancel">{{$t('取消')}}</el-button> </div> </el-dialog> <!-- 对话框(添加 / 修改) --> <el-dialog :title="$t('放入品名')" :visible.sync="shopOpen" width="1500px" append-to-body> <el-form ref="shopForm" :model="shopForm" :rules="shopRules" label-width="120px" inline> <el-form-item :label="$t('中文品名')"> <el-select v-model="shopForm.orderItemId" :placeholder="$t('请选择中文品名')"> <el-option v-for="item in orderData.orderItemVOList" :label="item.prodTitleZh" :value="item.orderItemId" :key="item.prodTitleZh" ></el-option> </el-select> </el-form-item> <el-form-item :label="$t('英文品名')"> <el-select v-model="shopForm.orderItemId" :placeholder="$t('请选择英文品名')"> <el-option v-for="item in orderData.orderItemVOList" :label="item.prodTitleEn" :value="item.orderItemId" :key="item.prodTitleEn" ></el-option> </el-select> </el-form-item> <el-card> <div slot="header" class="page-title">{{$t('品名可拆数据')}}</div> <div class="pl-20"> <span class="mr-10">{{$t('箱数')}}:{{ leftData.num || 0 }}</span> <span class="mr-10">{{ $t('入仓方数') }}:{{ leftData.volume || 0 }}m³</span> <span class="mr-10">{{ $t('收费方数') }}:{{ leftData.chargeVolume || 0 }}m³</span> <span class="mr-10">{{ $t('入仓重量') }}:{{ leftData.weight || 0 }}kg</span> <span class="mr-10">{{ $t('收费重量') }}:{{ leftData.chargeWeight || 0 }}kg</span> <span class="mr-10">{{ $t('数量(个)') }}:{{ leftData.quantity || 0 }}</span> <span class="mr-10">{{ $t('剩余货值') }}:{{ leftData.worth || 0 }}{{ $t('元') }}</span> </div> </el-card> <el-card class="mt-10"> <div slot="header" class="page-title">{{$t('可拆入仓记录')}}</div> <el-table :data="getOrderItemWarehouseIn(shopForm.orderItemId)" style="width: 100%"> <el-table-column :label="$t('箱数')"> <template v-slot="{row,$index}"> <!--{{row.cartonsNum}}--> {{getWarehouseLeftData(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('包装类型')"> <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 }"> {{getLocationName(row.orderLocationBackVOList)}} </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)">放入</el-button> </template> </el-table-column> </el-table> </el-card> <el-card class="mt-10"> <div slot="header" class="flex-between mt-20 mb-10"> <div class="page-title" style="margin: 0"> {{$t('已放入入仓记录')}} </div> <el-button type="danger" size="mini" @click="clearAll">清空放入数据</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)">删除</el-button> </template> </el-table-column> </el-table> </el-card> <el-card class="mt-10"> <div slot="header" class="page-title">放入数据</div> <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="mainOrderItem.worth"> <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> </div> </el-card> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="shopAdd" :disabled="!shopForm.specsRecordVOList || !shopForm.specsRecordVOList.length">{{$t('确定')}}</el-button> <el-button @click="shopCancel">{{$t('取消')}}</el-button> </div> </el-dialog> <el-dialog :title="$t('提示')" :visible.sync="dialogVisible" width="30%"> <span class="cancel_notice">{{$t('拆单申请正在审核中,你确定取消拆单申请吗?')}}</span> <div class="cancel_content"> <span>{{$t('取消原因:')}}</span> <el-input v-model="reason" :placeholder="$t('请输入取消原因')"></el-input> </div> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">{{$t('取消')}}</el-button> <el-button type="primary" @click="cancelSplit">{{$t('确定')}}</el-button> </span> </el-dialog> <el-dialog :title="$t('提示')" :visible.sync="dialogVisible" width="30%"> <span class="cancel_notice">{{$t('拆单申请正在审核中,你确定取消拆单申请吗?')}}</span> <div class="cancel_content"> <span>{{$t('取消原因:')}}</span> <el-input v-model="reason" :placeholder="$t('请输入取消原因')"></el-input> </div> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">{{$t('取消')}}</el-button> <el-button type="primary" @click="cancelSplit">{{$t('确定')}}</el-button> </span> </el-dialog> <warehouse-record v-if="currentWarehouseRecord" :list="currentWarehouseRecord" :warehouseId="currentWarehouseId" @close="currentWarehouseRecord=null"></warehouse-record> <put-in v-if="currentPutIn" :warehouse-record="currentPutIn" @close="currentPutIn=null" @submit="handlePutin" :warehouse-id="currentWarehouseId" :max-num="orderData.sumNum" ></put-in> </div> </template> <script> import {getDictData, getDictDatas,DICT_TYPE} from '@/utils/dict' import { getSplitList, splitApply, createSplit, cancelApply, createSplitItem, deleteSplitItem, deleteSplit, deleteAllSplit } from "@/api/ecw/orderHandle" import {getWarehouseList, quantityRequired} from '@/api/ecw/warehouse' import {getChannelList} from '@/api/ecw/channel' import WorkFlow from '@/components/WorkFlow' import {getOrder, getOrderWarehouseIn, splitItemUpdate} from '@/api/ecw/order' import Decimal from 'decimal.js' import WarehouseAreaSelect from "@/components/WarehouseAreaSelect"; import WarehouseDetail from "@/views/ecw/order/components/WarehouseDetail"; import WarehouseRecord from "@/views/ecw/order/splitApply/components/WarehouseRecord"; import PutIn from "@/views/ecw/order/splitApply/components/PutIn.vue"; import Template from "@/views/cms/template/index.vue"; export default { name: "SplitApply", components: { Template, WarehouseRecord, WarehouseDetail, WarehouseAreaSelect, WorkFlow, PutIn }, data() { return { checked:false, reason:'', dialogVisible:false, orderData:{}, splitData:[], orderApprovalBackVO:{}, splitIndex:0, channelData:[], tradeCityList:[], multipleSelection:[], loading:false, open:false, form:{ }, importCityList:[], selectedUsers:[], shopOpen:false, quantityshow:false, shopForm:{ specsRecordVOList: [] }, // 表单校验 rules: { transportId: [{ required: true, message: this.$t("请选择运输方式"), trigger: "change" }], warehouseIds: [{ required: true, message: this.$t("请选择目的仓库"), trigger: "change" }], channelId: [{ required: true, message: this.$t("请选择出货渠道"), trigger: "change" }], }, // 表单校验 shopRules: { chargeVolume: [{ required: true, message: this.$t("请填写收费方数"), trigger: "blur" }], chargeWeight: [{ required: true, message: this.$t("请填写收费重量"), trigger: "blur" }], }, queryParams:{ orderId: null, lang:0 }, query:{ page:1, rows:20 }, // splitItemIndex:0, quantitySum:0, // 当前查看的入仓记录 currentWarehouseRecord: null, // 订单入仓记录 warehouseInList: [], // 当前选择的入仓记录ID // selectedWarehouseInId: null, // 当前正在放入的入仓记录 currentPutIn: null }; }, async created() { this.getChannel() getWarehouseList().then(res => { this.tradeCityList = res.data this.importCityList = this.tradeCityList.filter(item => item.type == 1) }) if (this.$route.query.orderId) { this.queryParams.orderId = this.$route.query.orderId } Promise.all([this.getList(), this.getOrder()]).then(res => { console.log("拆单数据", this.splitData, this.splitData.length) if(this.orderData.inWarehouseState != 207 && this.splitData.length){ this.reset() } }) // 获取入仓记录 getOrderWarehouseIn(this.queryParams.orderId).then(res => { this.warehouseInList = res.data }) }, 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"; tds[5].style.display = "none"; }); }, }, // 关闭放入弹层的时候清理弹层表单内容 shopOpen(show){ if(!show){ this.shopForm = {} } }, // 切换品名需要重置已放入的记录 'shopForm.orderItemId'(){ // 默认取以前放入的品名 let split = this.splitData.find(item => item.id == this.splitData[this.splitIndex].id) this.shopForm.specsRecordVOList = [] if(split) { let specsRecordVOList = split.orderSplitItemBackVOList.find(item => item.orderItemId == this.shopForm.orderItemId)?.specsRecordVOList || [] specsRecordVOList.forEach(item => { const [boxGauge1, boxGauge2, boxGauge3] = item.boxGauge.split('*') this.shopForm.specsRecordVOList.push({...item, boxGauge1, boxGauge2, boxGauge3}) }) } } }, computed:{ getDictData(){ return (type, value) => getDictData(type, value) || {} }, getDictDatas(){ return getDictDatas }, // 放入品名试选择的商品项 orderItem(){ if(!this.orderData || !this.shopForm.orderItemId) return {} return this.orderData.orderItemVOList.find(item => item.orderItemId == this.shopForm.orderItemId) || {} }, // 主单数据,也就是拆分剩余的数据,可用来限制拆单放入的最大值 mainOrderItem(){ if(!this.shopForm.orderItemId) return {} return this.orderData.orderItemVOList.find(item => item.orderItemId === this.shopForm.orderItemId) }, // 剩余可拆数据,父订单的入仓数据 - 全部拆单的品名数据 leftData(){ if(!this.shopForm.orderItemId) return {} let data = { num: new Decimal(this.orderItem.warehouseInInfoVO?.cartonsNum || 0), volume: new Decimal(this.orderItem.warehouseInInfoVO?.volume || 0), weight: new Decimal(this.orderItem.warehouseInInfoVO?.weight || 0), quantity: new Decimal(this.orderItem.warehouseInInfoVO?.quantityAll || 0), chargeVolume: new Decimal(this.orderItem.chargeVolume || 0), chargeWeight: new Decimal(this.orderItem.chargeWeight || 0), worth: new Decimal(this.orderItem.worth || 0), } // 全部拆单的放入数据累减 this.splitData.forEach(split => { split.orderSplitItemBackVOList.forEach(splitItem => { // 正在拆的要排除,不然会重复计算 if(splitItem.orderItemId == this.shopForm.orderItemId && split.id == this.splitData[this.splitIndex].id){ return } // 每个品名的入仓记录挨个累减其他数据 if(splitItem.orderItemId == this.shopForm.orderItemId){ // 每个品名都要累减收费数据 data.chargeVolume = data.chargeVolume.minus(new Decimal(splitItem.chargeVolume || 0)) data.chargeWeight = data.chargeWeight.minus(new Decimal(splitItem.chargeWeight || 0)) data.worth = data.worth.minus(new Decimal(splitItem.worth || 0)) data.num = data.num.minus(new Decimal(splitItem.num || 0)) data.volume = data.volume.minus(new Decimal(splitItem.volume || 0)) data.weight = data.weight.minus(new Decimal(splitItem.weight || 0)) data.quantity = data.quantity.minus(new Decimal(splitItem.quantity || 0)) } }) }) return data }, // 放入数据 putin(){ let data = { num: new Decimal(0), volume: new Decimal(0), weight: 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.weight = data.weight.plus(new Decimal(item.weight || 0)) data.quantity = data.quantity.plus(new Decimal(item.quantity || 0)) }) return { num: data.num.toNumber(), volume: data.volume.toNumber(), weight: data.weight.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.splitData.forEach((split, splitIndex) => { split.orderSplitItemBackVOList.forEach(splitItem => { // 当前正在拆的品名不包含,因为后面shopForm.specsRecordVOList会包含 if(splitIndex == this.splitIndex && splitItem.orderItemId == this.shopForm.orderItemId){ return } splitItem.specsRecordVOList && splitItem.specsRecordVOList.forEach(specs => { if(specs.warehouseInId === warehouseInId){ specsRecordVOList.push(specs) } }) }) }) // 这里是全部正在操作放入,但是还没确定提交的 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() } } }, 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('修改成功')) }).finally(() => { this.getList() }) }, checkCode(data){ if(data.indexOf('+')==-1){ return '+'+data } return data }, changeTransport(e){ this.$set(this.form,'transportId',e) console.log(this.form.transportId) this.$forceUpdate() }, changeDeatWarehouseId(e){ this.$forceUpdate() this.$set(this.form,'destWarehouseId',e) console.log(this.form.destWarehouseId) }, getOrder(){ this.loading = true; return getOrder(this.queryParams.orderId).then(response => { this.orderData = response.data this.query.destWarehouseId = response.data.logisticsInfoDto.startWarehouseId this.loading = false }); }, /** 查询列表 */ getList() { this.loading = true; // 执行查询 return getSplitList(this.queryParams).then(response => { this.splitData = response.data.orderSplitBackVOList this.orderApprovalBackVO = response.data this.loading = false; }); }, getChannel(){ getChannelList().then(res=>this.channelData = res.data) }, changeDest(){ this.query.warehouseIds = this.form.destWarehouseId }, arraySpanMethod({ row, column, rowIndex, columnIndex }) { if (rowIndex==this.orderData.orderItemVOList.length) { if (columnIndex === 1) { return [2, 3]; } else if (columnIndex > 1) { return [0, 0]; } } }, getSummaries(){ const sums = []; sums[0] = this.$t('小计') if(!this.orderData || !this.orderData.orderItemVOList ||this.orderData.length==0){ return sums } var orderSum = 0 var orderV = 0 var orderW = 0 var leviteSum = 0 var leviteV = 0 var leviteW = 0 this.orderData.orderItemVOList.forEach((column, index) => { orderSum += column.num orderV += column.volume orderW += column.weight leviteSum += column.warehouseInInfoVO?column.warehouseInInfoVO.cartonsNum:0 leviteV += column.warehouseInInfoVO?column.warehouseInInfoVO.volume:0 leviteW += column.warehouseInInfoVO?column.warehouseInInfoVO.weight:0 }); sums[1] = this.$t('下单统计')+' '+ orderSum+' '+this.$t('箱')+' '+ orderV.toFixed(2) +' m³ ' + orderW + ' kg ' + ' '+this.$t('入仓统计:')+ leviteSum+' '+this.$t('箱')+' '+ leviteV.toFixed(2) +' m³ ' + leviteW + ' kg' return sums; }, importCityName(id){ var arr = this.tradeCityList.filter(item => item.id == id) return arr.length>0?arr[0].titleZh:this.$t('无') }, submitForm(){ if(this.splitData.length==0){ this.$modal.msgError(this.$t("请先新建拆单")) return } var params = { orderId:this.queryParams.orderId, copyUserId:this.selectedUsers } splitApply(params).then(res=>{ this.$modal.msgSuccess(this.$t("申请成功")); this.$store.dispatch('tagsView/delCurrentView') }) }, addShop(index){ this.splitIndex = index this.shopOpen = true // 重置表单数据 this.shopForm = {specsRecordVOList:[]} }, addSplit(){ this.form.transportId = this.orderData.transportId this.form.destWarehouseId = this.orderData.destWarehouseId if(this.orderData.logisticsInfoDto&&this.orderData.logisticsInfoDto.destTitleZh){ this.form.destWarehouseId = this.importCityList.find(item=>item.titleZh==this.orderData.logisticsInfoDto.destTitleZh).id if(this.orderData.logisticsInfoDto&&this.orderData.logisticsInfoDto.channelId){ this.form.channelId = this.orderData.logisticsInfoDto.channelId } } this.open = true }, // 查询数量是否必填 numcheck(){ quantityRequired(this.orderData.lineId).then(res=>{ this.quantityshow = res.data }) }, // 输入方数箱数后,按照平均值计算数量和体积重量数据 numChange(){ /*var sum = parseInt(this.quantitySum/this.shopForm.num) this.$set(this.shopForm,'quantity',sum)*/ let rate = this.shopForm.num/this.mainOrderItem.num this.$set(this.shopForm, 'quantity', Math.ceil(this.mainOrderItem.quantity * rate)) this.$set(this.shopForm, 'volume', (this.mainOrderItem.volume * rate).toFixed(2)) this.$set(this.shopForm, 'chargeVolume', (this.mainOrderItem.chargeVolume * rate).toFixed(2)) this.$set(this.shopForm, 'weight', (this.mainOrderItem.weight * rate).toFixed(2)) this.$set(this.shopForm, 'chargeWeight', (this.mainOrderItem.chargeWeight * rate).toFixed(2)) this.$set(this.shopForm, 'worth', (this.mainOrderItem.worth * rate).toFixed(2)) }, /*changeProdTitleEn(){ var list = [] list = this.splitData[0].orderSplitItemBackVOList.filter(item=>item.prodTitleEn == this.shopForm.prodTitleEn) this.shopForm.sum = list[0].num this.quantitySum = list[0].quantity this.shopForm.prodTitleZh = list[0].prodTitleZh },*/ haddleAdd(){ let that = this if(!that.form.transportId){ that.$message.error(this.$t("请选择运输方式")); return } if(!that.form.destWarehouseId){ that.$message.error(this.$t("请选择目的仓库")); return } // if(!this.form.channelId){ // this.$modal.msgError("请选择出货渠道"); // } var params = { dstWarehouseId: that.form.destWarehouseId, parentOrderId: that.orderData.orderId, parentOrderNo: that.orderData.orderNo, transportId: that.form.transportId, channelId:that.form.channelId } createSplit(params).then(res=>{ that.getList() }) that.open = false }, /*cancel(){ this.open = false this.form = {} },*/ shopAdd(){ this.$refs["shopForm"].validate(valid => { if (!valid) { return; } if(!this.shopForm.specsRecordVOList.length){ return this.$message.error(this.$t("请放入品名")); } // 放入数据不能大于可拆数据 if(this.putin.num > this.leftData.num){ return this.$message.error(this.$t("放入箱数不能大于可拆箱数")); } this.shopForm.specsRecordVOList.forEach(item => { item.boxGauge = `${item.boxGauge1}*${item.boxGauge2}*${item.boxGauge3}` }) var params = { num:this.putin.num, orderItemId:this.shopForm.orderItemId, orderSplitId:this.splitData[this.splitIndex].id, remark:this.shopForm.remark, volume: this.putin.volume, chargeVolume: this.shopForm.chargeVolume, weight: this.putin.weight, quantity: this.putin.quantity, chargeWeight: this.shopForm.chargeWeight, worth: this.shopForm.worth || 0, specsRecordVOList:this.shopForm.specsRecordVOList } // 体积重量不能为0 const fields = { 'volume': this.$t('体积'), 'weight': this.$t('重量'), 'chargeVolume': this.$t('收费体积'), 'chargeWeight': this.$t('收费重量'), } let errFields = [] Object.keys(fields).forEach(field => { if(params[field] < 0.01){ errFields.push(fields[field]) } }) if(errFields.length){ return this.$message.error(this.$t("{field}最少为0.01", {field: errFields.join(",")})) } /*if(this.quantityshow){ params.quantity = this.shopForm.quantity }*/ createSplitItem(params).then(async res=>{ this.$message.success(this.$t("放入成功")); await this.getList() this.shopForm = {} this.shopOpen = false }) }) }, removeShop(id){ let that = this that.$confirm(that.$t('是否移除货物吗?')).then(function () { deleteSplitItem(id).then(res=>{ that.$message.success(that.$t("移除成功")); that.getList() }) }) }, cancelSplit(){ let that = this if(!that.reason){ that.$message.error(that.$t("请输入取消原因")); return } cancelApply({orderId:that.queryParams.orderId,reason:that.reason}).then(res=>{ that.$message.success(that.$t("取消成功")); that.$store.dispatch('tagsView/delCurrentView') }) }, shopCancel(){ this.shopOpen = false this.shopForm = {} }, /** 删除按钮操作 */ deleteSplit(id) { let that = this that.$confirm(that.$t('是否确认删除新拆的订单吗?')).then(function () { deleteSplit(id).then(res=>{ that.$message.success(that.$t("删除成功")); that.getList() }) }) }, // 删除一行,可选参数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 // 此条入仓记录已拆出的入仓记录,这样在放入的时候可以确保不超过此入仓记录的数量 let specsRecordVOList = this.getWarehouseInspecsRecordVOList(row.id) this.currentPutIn.specsRecordVOList = specsRecordVOList }, // 放入回调 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) this.$set(this.shopForm, 'worth', (orderItem.worth*rate).toFixed(2)) }, // 重置 reset(){ return deleteAllSplit(this.queryParams.orderId).then(res => { this.getList() }) }, // 取消 async cancel(){ await this.reset() this.$store.dispatch('tagsView/delCurrentView') } } } </script> <style scoped> .page-title{ margin: 0; } .card-title{ font-size: 18px; font-weight: bold; margin-top: 10px; } .card-info{ font-size: 16px; } .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; } .cancel_notice{ font-size: 16px; font-weight: 600; } .cancel_content{ display: flex; align-items: center; padding-top: 20px; } .cancel_content span{ width: 100px; } ::v-deep .el-form-item--mini.is-error{ margin-bottom: 18px; } </style>