<template> <div class="allocateBillEdit-wrap"> <div class="ant-spin-nested-loading"> <a-page-header :ghost="false" :backIcon="false" class="allocateBillEdit-back" > <!-- 自定义的二级文字标题 --> <template slot="subTitle"> <a id="allocateBillEdit-back-btn" href="javascript:;" @click="handleBack"><a-icon type="left" /> 返回列表</a> </template> <!-- 操作区,位于 title 行的行尾 --> <template slot="extra"> <a-button key="4" type="primary" class="button-info" v-if="$hasPermissions('B_transferOut_print')" id="allocateBillEdit-db-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('dbPrint')">调拨打印</a-button> <a-button key="3" type="default" class="button-info" v-if="$hasPermissions('B_transferOutType_print')" id="allocateBillEdit-dbfl-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('dbflPrint')">调拨分类打印</a-button> <a-divider type="vertical" /> <a-button key="2" type="primary" class="button-info" v-if="$hasPermissions('B_transferOut_detail_export')" id="allocateBillDetail-export-btn" :disabled="localDataSource.length==0" @click="handleExcel('ALLOCATE_BILL','调拨明细')">导出Excel</a-button> <a-button key="1" type="default" class="button-info" v-if="$hasPermissions('B_transferOutType_export')" id="allocateBillDetail-export-btn" :disabled="localDataSource.length==0" @click="handlePrint('dbflExport')">调拨分类导出</a-button> </template> </a-page-header> <a-card size="small" :bordered="false" v-if="basicInfoData" class="allocateBillEdit-cont"> <a-collapse :activeKey="['0']"> <a-collapse-panel key="0" header="基础信息"> <a-descriptions :column="3"> <a-descriptions-item label="调往对象">{{ (basicInfoData&&basicInfoData.targetName) || '--' }}</a-descriptions-item> <a-descriptions-item label="发货编号">{{ (basicInfoData&&basicInfoData.sendNo) || '--' }}</a-descriptions-item> <a-descriptions-item label="收货客户名称">{{ (basicInfoData&&basicInfoData.receiverName) || '--' }}</a-descriptions-item> <a-descriptions-item label="调拨单号">{{ (basicInfoData&&basicInfoData.allocateNo) || '--' }}</a-descriptions-item> <a-descriptions-item label="业务状态">{{ (basicInfoData&&basicInfoData.stateDictValue) || '--' }}</a-descriptions-item> <a-descriptions-item label="打印状态">{{ (basicInfoData&&basicInfoData.printStateDictValue) || '--' }}</a-descriptions-item> </a-descriptions> <a-divider>以下信息可修改,请点击<span style="color: dodgerblue;font-size: 14px;cursor: pointer;" @click="editRemark = true" ><a-icon type="form" title="编辑基础信息" />编辑</span></a-divider> <a-descriptions :column="3"> <a-descriptions-item label="费用类型"> {{ (basicInfoData&&basicInfoData.costTypeName) || '--' }} </a-descriptions-item> <a-descriptions-item label="调拨类型"> <div> <span v-if="basicInfoData.allocateSortName">{{ basicInfoData.allocateSortName || '--' }}</span> <span v-if="basicInfoData.allocateTypeName">/{{ basicInfoData.allocateTypeName || '--' }}</span> </div> </a-descriptions-item> <a-descriptions-item label="费用归属品牌"> {{ (basicInfoData&&basicInfoData.productBrandName) || '--' }} </a-descriptions-item> <a-descriptions-item label="费用归属品类"> <div> <span v-if="basicInfoData.productTypeName1">{{ basicInfoData.productTypeName1 || '--' }}</span> <span v-else>--</span> <span v-if="basicInfoData.productTypeName2">/{{ basicInfoData.productTypeName2 || '--' }}</span> <span v-if="basicInfoData.productTypeName3">/{{ basicInfoData.productTypeName3 || '--' }}</span> </div> </a-descriptions-item> <a-descriptions-item label="起止时间"> <span v-if="basicInfoData&&(basicInfoData.promoStartDate || basicInfoData.promoEndDate)">{{ (basicInfoData&&basicInfoData.promoStartDate) || '--' }} ~ {{ (basicInfoData&&basicInfoData.promoEndDate) || '--' }}</span> <span v-else>--</span> </a-descriptions-item> <a-descriptions-item label="备注"> {{ (basicInfoData&&basicInfoData.remark||'--') }} </a-descriptions-item> <a-descriptions-item label="附件" :span="4"> <div v-if="basicInfoData&&basicInfoData.allocateFilesList"> <a target="_blank" style="color: #00aaff;text-decoration: underline;margin-right: 15px;" :href="item.filePath" v-for="item in basicInfoData.allocateFilesList" :key="item.id"> {{ item.fileName }} </a> </div> <span v-else>--</span> </a-descriptions-item> </a-descriptions> </a-collapse-panel> </a-collapse> </a-card> <!-- 选择产品 --> <a-card size="small" :bordered="false" class="allocateBillEdit-cont"> <a-collapse :activeKey="['1']"> <a-collapse-panel key="1" :forceRender="true" header="选择产品"> <!-- 筛选条件 --> <div class="table-page-search-wrapper"> <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)"> <a-row :gutter="15"> <a-col :md="6" :sm="24"> <a-form-item label="产品编码" prop="productCode"> <a-input id="allocateBillEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear /> </a-form-item> </a-col> <a-col :md="6" :sm="24"> <a-form-item label="产品名称" prop="productName"> <a-input id="allocateBillEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear /> </a-form-item> </a-col> <a-col :md="6" :sm="24"> <a-form-item label="原厂编码" prop="productOrigCode"> <a-input id="allocateBillEdit-productOrigCode" v-model.trim="queryParam.productOrigCode" placeholder="请输入原厂编码" allowClear /> </a-form-item> </a-col> <a-col :md="6" :sm="24" style="margin-bottom: 10px;"> <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="storeTransferOutList-refresh">查询</a-button> <a-button style="margin-left: 8px" @click="resetSearchForm" :disabled="disabled" id="storeTransferOutList-reset">重置</a-button> </a-col> </a-row> </a-form> </div> <!-- 列表 --> <s-table class="sTable" ref="table" size="small" index="0" tableId="table1" :rowKey="(record) => record.stockSn" :columns="columns" :customRow="handleClickRow" :data="loadData" :scroll="{ y: 300 }" bordered> <!-- 调出数量 --> <template slot="qty" slot-scope="text, record"> <a-input-number size="small" v-model="record.qty" :precision="0" :min="1" :max="record.currentStockQty" placeholder="请输入" style="width: 100%;" /> </template> <!-- 操作 --> <template slot="action1" slot-scope="text, record"> <a-button size="small" type="link" class="button-primary" :loading="spinning" @click="handleAdd(record, false, 'noRefresh')" >添加</a-button> </template> </s-table> </a-collapse-panel> </a-collapse> </a-card> <!-- 已选产品 --> <a-card size="small" :bordered="false" class="allocateBillEdit-cont"> <a-collapse :activeKey="['2']"> <a-collapse-panel key="2" :forceRender="true" header="已选产品"> <!-- 总计 --> <a-alert type="info" style="margin-bottom:10px"> <div slot="message"> 总数量:<strong>{{ (productTotal&&(productTotal.totalQty || productTotal.totalQty==0)) ? productTotal.totalQty : '--' }}</strong> , <span v-if="$hasPermissions('B_isShowCost')">总成本(¥):<strong>{{ (productTotal&&(productTotal.totalCost || productTotal.totalCost==0)) ? productTotal.totalCost : '--' }}</strong> ,</span> <span v-if="$hasPermissions('B_isShowPrice')">总售价(¥):<strong>{{ (productTotal&&(productTotal.totalPrice || productTotal.totalPrice==0)) ? productTotal.totalPrice : '--' }}</strong></span> </div> </a-alert> <!-- 筛选条件 --> <a-row :gutter="15"> <a-col :span="16"> <div class="table-page-search-wrapper"> <a-form layout="inline" @keyup.enter.native="$refs.chooseTable.refresh(true)"> <a-row :gutter="15"> <a-col :md="9" :sm="24"> <a-form-item label="产品编码" prop="productCode"> <a-input id="allocateBillEdit-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear /> </a-form-item> </a-col> <a-col :md="9" :sm="24"> <a-form-item label="产品名称" prop="productName"> <a-input id="allocateBillEdit-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear /> </a-form-item> </a-col> <a-col :md="6" :sm="24" style="margin-bottom: 10px;"> <a-button type="primary" @click="$refs.chooseTable.refresh(true)" :disabled="chooseDisabled" id="storeTransferOutList-refresh">查询</a-button> <a-button style="margin-left: 8px" @click="chooseResetSearchForm" :disabled="chooseDisabled" id="storeTransferOutList-reset">重置</a-button> </a-col> </a-row> </a-form> </div> </a-col> <a-col :span="8" style="text-align: right;"> <span v-if="selNums">已选{{ selNums }}项</span> <a-button style="margin:0 15px;" size="small" id="salesEdit-plDel-btn" @click="openPlSet">批量设置费用归属</a-button> <a-button size="small" id="allocateBillEdit-import-btn" @click="openGuideModal=true">导入产品</a-button> <a-button size="small" type="danger" style="margin-left: 5px" @click.stop="handleDel('', 'all')" id="chainTransferOutEdit-del-all-btn">整单删除</a-button> </a-col> </a-row> <!-- 列表 --> <s-table class="sTable" ref="chooseTable" size="small" index="1" tableId="table2" :rowKey="(record) => record.id" :row-selection="{ columnWidth: 40 }" @rowSelection="rowSelectionFun" :columns="chooseColumns" :data="chooseLoadData" :scroll="{ y: 300 }" bordered> <!-- 售价 --> <template slot="price" slot-scope="text, record, index"> <!-- 调往对象为经销商时不可编辑售价,为员工或其他时可编辑售价 --> <div v-if="$route.params.dealerLevel == 'OTHER'"> <a-select size="small" id="allocateBillEdit-price" option-label-prop="label" v-model="record.price" placeholder="请选择" @change="e => priceChange(e, record)" @focus="e => priceFocus(record, index)" style="width: 100%;"> <a-select-option v-if="record.cost" :value="record.cost" :key="'cb-'+record.cost" :label="record.cost">成本 {{ record.cost }}</a-select-option> <a-select-option v-if="loadDataSource&&loadDataSource[index]&&loadDataSource[index].provincePrice" :value="loadDataSource[index].provincePrice" :key="'A-'+loadDataSource[index].productSn" :label="loadDataSource[index].provincePrice">A价 {{ loadDataSource[index].provincePrice }}</a-select-option> <a-select-option v-if="loadDataSource&&loadDataSource[index]&&loadDataSource[index].cityPrice" :value="loadDataSource[index].cityPrice" :key="'B-'+loadDataSource[index].productSn" :label="loadDataSource[index].cityPrice">B价 {{ loadDataSource[index].cityPrice }}</a-select-option> <a-select-option v-if="loadDataSource&&loadDataSource[index]&&loadDataSource[index].specialPrice" :value="loadDataSource[index].specialPrice" :key="'C-'+loadDataSource[index].productSn" :label="loadDataSource[index].specialPrice">C价 {{ loadDataSource[index].specialPrice }}</a-select-option> </a-select> </div> <span v-else>{{ record.price }}</span> </template> <!-- 调出数量 --> <template slot="qty" slot-scope="text, record"> <a-input-number size="small" id="allocateBillEdit-qty" v-model="record.qty" :precision="0" :min="1" :max="999999" placeholder="请输入" @blur="e => qtyBlur(e.target.value, record)" style="width: 100%;" /> </template> <!-- 费用归属部门 --> <template slot="department" slot-scope="text, record"> <a-select style="width:100%" placeholder="请选择部门" size="small" allowClear v-model="record.departmentSn" :showSearch="true" @change="e => handleChange(e, record)" option-filter-prop="children" :filter-option="filterOption"> <a-select-option v-for="item in departmentList" :key="item.departmentSn" :value="item.departmentSn">{{ item.name }}</a-select-option> </a-select> </template> <!-- 操作 --> <template slot="action" slot-scope="text, record"> <a-button size="small" type="link" class="button-error" :loading="spinning" @click="handleDel(record)" id="allocateBillEdit-del-btn">删除</a-button> </template> </s-table> </a-collapse-panel> </a-collapse> </a-card> </div> <div class="affix-cont" v-if="basicInfoData"> <a-button type="primary" id="allocateBillEdit-submit" size="large" :loading="spinning" class="button-primary" @click="handleOpen" style="padding: 0 60px;">提交</a-button> </div> <!-- 导入产品 --> <importGuideModal :openModal="openGuideModal" :params="{allocateSn: $route.params.sn}" @close="openGuideModal=false" @ok="handleGuideOk" /> <!-- 打印导出 --> <print-modal :openModal="openModal" :itemData="basicInfoData" :nowType="nowType" @export="exportFl" @ok="handleOk" @close="openModal=false" /> <!-- 提交调拨单 --> <dsModal ref="dsModal" :dealerLevel="$route.params.dealerLevel" :openModal="showDsModal" @close="showDsModal=false" @ok="handleSubmit" /> <!-- 编辑基础信息 --> <basic-info-modal :openModal="editRemark" :detailData="basicInfoData" @ok="getDetail" @close="editRemark=false" /> <!-- 批量设置部门 --> <commonModal modalTit="批量设置费用归属部门" :openModal="showPlModal" @cancel="closePlSet" @ok="setPlSetOk"> <div style="text-align: center;"> <div style="margin-bottom: 15px;font-size: 14px;"><strong>请选择费用归属部门</strong></div> <div style="line-height: 24px;"> <div> <a-select style="width:100%" placeholder="请选择部门" allowClear v-model="plSetVal" :showSearch="true" option-filter-prop="children" :filter-option="filterOption"> <a-select-option v-for="item in departmentList" :key="item.departmentSn" :value="item.departmentSn">{{ item.name }}</a-select-option> </a-select></div> </div> </div> </commonModal> </div> </template> <script> import { commonMixin } from '@/utils/mixin' import { STable, VSelect } from '@/components' import ImportGuideModal from './importGuideModal.vue' import basicInfoModal from './basicInfoModal.vue' import printModal from './printModal.vue' import dsModal from './dsModal.vue' import commonModal from '@/views/common/commonModal.vue' import { printFun, exportExcel } from '@/libs/JGPrint.js' import { queryStockProductPage } from '@/api/stock' import { productPriceInfo } from '@/api/product' import { departmentQueryList } from '@/api/expenseManagement' import { allocateBillDetailList, allocateBillDetailCount, allocateBillDetail, allocateBillDetailSave, allocateBillSubmit, allocateBillDetailDel, allocateBillDetailDelAll, allocateBillDetailPrint, allocateBillBatchInsert, allocateBillDetailExcel, updateBatchDepartment } from '@/api/allocateBill' export default { name: 'TransferOutEdit', mixins: [commonMixin], components: { STable, VSelect, ImportGuideModal, printModal, dsModal, basicInfoModal, commonModal }, data () { return { spinning: false, showDsModal: false, editRemark: false, showPlModal: false, queryParam: { productCode: '', productName: '', productOrigCode: '' }, chooseQueryParam: { productCode: '', productName: '' }, disabled: false, // 查询、重置按钮是否可操作 loading: false, chooseDisabled: false, // 查询、重置按钮是否可操作 advanced: false, // 高级搜索 展开/关闭 productBrandList: [], // 产品品牌 下拉数据 productTypeList: [], // 产品分类 下拉数据 productType: [], warehouseList: [], // 仓库 下拉数据 departmentList: [], // 部门列表 // 加载数据方法 必须为 Promise 对象 loadData: parameter => { this.disabled = true const dealerLevel = this.$route.params.dealerLevel == 'OTHER' ? undefined : this.$route.params.dealerLevel return queryStockProductPage(Object.assign(parameter, this.queryParam, { zeroQtyFlag: '0', dealerLevel: dealerLevel })).then(res => { const data = res.data const no = (data.pageNo - 1) * data.pageSize for (var i = 0; i < data.list.length; i++) { data.list[i].no = no + i + 1 data.list[i].qty = 1 } this.loadDataSource = data.list || [] this.disabled = false return data }) }, loadDataSource: [], localDataSource: [], // 加载数据方法 必须为 Promise 对象 chooseLoadData: parameter => { this.chooseDisabled = true const params = Object.assign(parameter, this.chooseQueryParam, { allocateSn: this.$route.params.sn }) return allocateBillDetailList(params).then(res => { const data = res.data const no = (data.pageNo - 1) * data.pageSize for (var i = 0; i < data.list.length; i++) { data.list[i].no = no + i + 1 data.list[i].qtyBackups = data.list[i].qty data.list[i].priceBackups = data.list[i].price data.list[i].departmentSn = data.list[i].departmentSn || undefined } this.localDataSource = data.list || [] this.chooseDisabled = false this.getDetailCount(params) return data }) }, productTotal: null, // 合计 basicInfoData: null, // 基本信息 openGuideModal: false, // 导入产品引导 openModal: false, nowType: null, rowSelectionInfo: null, plSetVal: undefined } }, computed: { selNums () { return this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length || 0 }, columns () { const arr = [ { title: '序号', dataIndex: 'no', width: '4%', align: 'center' }, { title: '产品编码', dataIndex: 'productCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } }, { title: '产品名称', dataIndex: 'productName', align: 'center', width: '26%', customRender: function (text) { return text || '--' }, ellipsis: true }, { title: '原厂编码', dataIndex: 'productOrigCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } }, // { title: '成本价', dataIndex: 'lastStockCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }, // { title: '售价', dataIndex: 'productPrice', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }, { title: '库存数量', dataIndex: 'currentStockQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }, { title: '调出数量', scopedSlots: { customRender: 'qty' }, width: '8%', align: 'center' }, { title: '单位', dataIndex: 'productUnit', width: '6%', align: 'center', customRender: function (text) { return text || '--' } }, { title: '操作', scopedSlots: { customRender: 'action1' }, width: '10%', align: 'center' } ] if (this.$hasPermissions('B_isShowCost')) { // 成本价权限 arr.splice(4, 0, { title: '成本价', dataIndex: 'lastStockCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }) } if (this.$hasPermissions('B_isShowPrice')) { // 售价权限 const ind = this.$hasPermissions('B_isShowCost') ? 5 : 4 arr.splice(ind, 0, { title: '售价', dataIndex: 'productPrice', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }) } return arr }, chooseColumns () { const arr = [ { title: '序号', dataIndex: 'no', width: '4%', align: 'center' }, { title: '产品编码', dataIndex: 'productEntity.code', width: '10%', align: 'center', customRender: function (text) { return text || '--' } }, { title: '产品名称', dataIndex: 'productEntity.name', width: '20%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true }, { title: '原厂编码', dataIndex: 'productEntity.origCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } }, // { title: '成本价', dataIndex: 'cost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }, // { title: '售价', scopedSlots: { customRender: 'price' }, width: '10%', align: 'center' }, { title: '库存数量', dataIndex: 'currentStockQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }, { title: '调出数量', scopedSlots: { customRender: 'qty' }, width: '10%', align: 'center' }, { title: '费用归属部门', scopedSlots: { customRender: 'department' }, width: '10%', align: 'center' }, { title: '单位', dataIndex: 'productEntity.unit', width: '6%', align: 'center', customRender: function (text) { return text || '--' } }, { title: '操作', scopedSlots: { customRender: 'action' }, width: '6%', align: 'center' } ] if (this.$hasPermissions('B_isShowCost')) { // 成本价权限 arr.splice(4, 0, { title: '成本价', dataIndex: 'cost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }) } if (this.$hasPermissions('B_isShowPrice')) { // 售价权限 const ind = this.$hasPermissions('B_isShowCost') ? 5 : 4 arr.splice(ind, 0, { title: '售价', scopedSlots: { customRender: 'price' }, width: '10%', align: 'center' }) } return arr } }, methods: { filterOption (input, option) { return ( option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0 ) }, // 获取部门数据 getDepartmentList () { departmentQueryList({}).then(res => { if (res.status == 200) { this.departmentList = res.data } else { this.departmentList = [] } }) }, // 表格选中项 rowSelectionFun (obj) { this.rowSelectionInfo = obj || null }, // 批量设置退货原因 openPlSet () { if (this.selNums) { this.showPlModal = true } else { this.$message.warning('请先选择产品!') } }, closePlSet () { this.showPlModal = false this.plSetVal = undefined }, setPlSetOk () { if (!this.plSetVal) { this.$message.warning('请选择费用归属部门!') } else { const snList = [] const arr = this.rowSelectionInfo && this.rowSelectionInfo.selectedRows || [] const department = this.departmentList.find(item => item.departmentSn == this.plSetVal) arr.map(item => { snList.push({ 'allocateDetailSn': item.allocateDetailSn, 'departmentSn': this.plSetVal, 'departmentName': department ? department.name : '' }) }) this.showPlModal = false this.$message.loading('正在设置...', 0) updateBatchDepartment(snList).then(res => { if (res.status == 200) { this.closePlSet() this.refashPage() } this.$message.destroy() }) } }, // 重置 resetSearchForm (flag) { this.queryParam.productCode = '' this.queryParam.productName = '' this.queryParam.productOrigCode = '' if (!flag) { this.$refs.table.refresh(true) } }, // 双击快速添加 handleClickRow (record) { return { on: { dblclick: (event) => { this.handleAdd(record, false, 'noRefresh') } } } }, // 导入产品 handleGuideOk (obj) { allocateBillBatchInsert(obj).then(res => { if (res.status == 200) { this.$refs.chooseTable.refresh(true) } }) }, // 已选产品 重置 chooseResetSearchForm (flag) { this.chooseQueryParam.productCode = '' this.chooseQueryParam.productName = '' if (!flag) { this.$refs.chooseTable.refresh(true) } }, // 添加/编辑 handleAdd (row, isEdit, isRefresh) { const params = { id: isEdit ? row.id : undefined, allocateSn: this.$route.params.sn, cost: isEdit ? row.cost : row.lastStockCost, price: isEdit ? row.price : row.productPrice, qty: row.qty, // 添加时调出数量默认为1 productSn: row.productSn, departmentSn: row.departmentSn, departmentName: row.departmentName } if (isEdit) { // 编辑 // 清空数量时,值应保持未清空前的值,因数量不可为空 if (!row.qty) { row.qty = row.qtyBackups return } if (!row.price) { row.price = row.priceBackups return } } else { if (!row.qty) { this.$message.info('请输入调出数量') return } } this.spinning = true allocateBillDetailSave(params).then(res => { if (res.status == 200) { this.$message.success(res.message) if (isRefresh != 'noRefresh') { this.$refs.table.refresh() } this.$refs.chooseTable.refresh() this.$refs.chooseTable.clearSelected() this.spinning = false } else { this.spinning = false } }) }, // 删除 handleDel (row, isAll) { const _this = this const content = isAll ? '删除后不可恢复,确定要进行整单删除吗?' : '删除后不可恢复,确定要进行删除吗?' this.$confirm({ title: '提示', content: content, centered: true, onOk () { if (isAll) { // 整单删除 _this.spinning = true allocateBillDetailDelAll({ sn: _this.$route.params.sn }).then(res => { if (res.status == 200) { _this.$message.success(res.message) _this.refashPage() } _this.spinning = false }) } else { // 单个删除 _this.spinning = true allocateBillDetailDel({ id: row.id }).then(res => { if (res.status == 200) { _this.$message.success(res.message) _this.refashPage() } _this.spinning = false }) } } }) }, // 提交 handleOpen () { if (this.localDataSource.length) { // 待提交 if (this.basicInfoData.state == 'WAIT_SUBMIT' && !this.basicInfoData.sendNo) { this.showDsModal = true } else { this.handleSubmit() } } else { this.$message.warning('请选择产品') } }, handleSubmit (params) { const _this = this const data = Object.assign({ allocateSn: this.$route.params.sn }, params || {}) _this.spinning = true _this.showDsModal = false allocateBillSubmit(data).then(res => { if (res.status == 200) { _this.$message.success(res.message) _this.handleBack() } else { _this.spinning = false } }) }, // 基本信息 getDetail () { this.spinning = true allocateBillDetail({ sn: this.$route.params.sn }).then(res => { if (res.status == 200) { this.basicInfoData = res.data } else { this.basicInfoData = null } this.spinning = false }) }, // 合计 getDetailCount (params) { allocateBillDetailCount({ allocateSn: this.$route.params.sn, ...params }).then(res => { if (res.status == 200) { this.productTotal = res.data } else { this.productTotal = null } }) }, // 返回列表 handleBack () { this.$router.push({ path: '/allocationManagement/transferOut/list', query: { closeLastOldTab: true } }) }, // 已选产品 调出数量 blur qtyBlur (val, record) { // 光标移出,值发生改变再调用编辑接口 if (val != record.qtyBackups) { this.handleAdd(record, 'edit', 'noRefresh') } }, // 已选产品 修改部门 handleChange (value, record) { if (value) { const department = this.departmentList.find(item => item.departmentSn == record.departmentSn) record.departmentName = department ? department.name : '' } else { record.departmentSn = '' record.departmentName = '' } this.handleAdd(record, 'edit', 'noRefresh') }, // 已选产品 售价 change priceChange (val, record) { // 光标移出,值发生改变再调用编辑接口 if (val != record.priceBackups) { this.handleAdd(record, 'edit', 'noRefresh') } }, // 获取价格 priceFocus (row, index) { if (row.productSn) { productPriceInfo({ sn: row.productSn }).then(res => { if (res.status == 200 && res.data) { this.loadDataSource[index].provincePrice = res.data.provincePrice || undefined this.loadDataSource[index].cityPrice = res.data.cityPrice || undefined this.loadDataSource[index].specialPrice = res.data.specialPrice || undefined } }) } }, // 导出 handleExcel (printType, filename, data) { const _this = this this.spinning = true const params = { allocateSn: this.outBizSn || this.$route.params.sn, printType: printType, ...data } params.showCostFlag = this.$hasPermissions('B_isShowCost') params.showAmountFlag = this.$hasPermissions('B_isShowPrice') exportExcel(allocateBillDetailExcel, params, filename, function () { _this.spinning = false }) }, exportFl (data) { this.handleExcel(data.printType, '调拨分类', data) }, // 打印预览/快捷打印 handlePrint (type) { this.nowType = type this.openModal = true }, handleOk (objs) { const _this = this const params = JSON.parse(JSON.stringify(objs)) delete params.type _this.spinning = true const taskName = this.nowType == 'dbPrint' ? '调拨' : '调拨分类' printFun( allocateBillDetailPrint, params, objs.isPreview ? 'preview' : 'print', taskName, (res) => { _this.$message.info(res.message) _this.spinning = false }, { billType: 'ALLOCATE', billSn: objs.allocateSn, billNo: objs.allocateNo, printType: taskName + '打印' }, !this.basicInfoData.printState || this.basicInfoData.printState == 'UNABLE_PRINT' || this.basicInfoData.printState == 'CANCEL_PRINT') }, // 刷新当前页面 refashPage () { // this.$refs.table.refresh() this.$refs.chooseTable.clearSelected() this.$refs.chooseTable.refresh() }, pageInit () { this.getDepartmentList() this.getDetail() // this.resetSearchForm(1) // this.chooseResetSearchForm(1) } }, mounted () { if (!this.$store.state.app.isNewTab) { // 页签刷新时调用 this.pageInit() } }, activated () { // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面 if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) { this.pageInit() } }, beforeRouteEnter (to, from, next) { next(vm => {}) } } </script> <style lang="less"> .allocateBillEdit-wrap{ position: relative; height: 100%; box-sizing: border-box; > .ant-spin-nested-loading { position: relative; height: 100%; overflow: auto; padding-bottom: 50px; } .allocateBillEdit-back{ margin-bottom: 10px; } .allocateBillEdit-cont{ margin-bottom: 10px; .sub-title{ font-size: 12px; color: #808695; margin-left: 10px; } .tag-txt{ font-size: 12px; color: #ed1c24; } .edit-circle-btn{ margin-left: 15px; i{ vertical-align: text-bottom; } } .import-btn{ margin-left: 15px; } } } </style>