Merge remote-tracking branch 'origin/0.8.X' into 0.8.X

This commit is contained in:
2026-07-07 15:24:19 +08:00
7 changed files with 182 additions and 116 deletions

View File

@@ -84,7 +84,10 @@
</el-form-item> </el-form-item>
<el-form-item label="业务员" prop="saleName" v-if="orderBy"> <el-form-item label="业务员" prop="saleName" v-if="orderBy">
<el-input v-model="queryParams.saleName" placeholder="请输入业务员" clearable size="small" /> <el-select v-model="queryParams.saleName" placeholder="请选择业务员" clearable size="small" filterable allow-create>
<el-option v-for="item in dict.type.wip_pack_saleman" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="合同号" prop="contractNo" v-if="orderBy"> <el-form-item label="合同号" prop="contractNo" v-if="orderBy">
@@ -303,7 +306,7 @@ export default {
DragResizePanel, DragResizePanel,
OrderDetail OrderDetail
}, },
dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status'], dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status', 'wip_pack_saleman'],
props: { props: {
// 非触发器模式下,外部控制显隐(触发器模式下无效) // 非触发器模式下,外部控制显隐(触发器模式下无效)
visible: { visible: {

View File

@@ -42,7 +42,7 @@
<el-table-column label="逻辑库位" align="center" prop="warehouseName" /> <el-table-column label="逻辑库位" align="center" prop="warehouseName" />
<el-table-column label="实际库区" align="center" prop="actualWarehouseName" /> <el-table-column label="实际库区" align="center" prop="actualWarehouseName" />
<el-table-column label="物料类型" align="center" prop="materialType" /> <el-table-column label="物料类型" align="center" prop="materialType" />
<el-table-column label="产品类型" align="center" width="180"> <el-table-column label="产品类型" align="center" width="140">
<template slot-scope="scope"> <template slot-scope="scope">
<ProductInfo v-if="scope.row.itemType == 'product'" :product="scope.row" /> <ProductInfo v-if="scope.row.itemType == 'product'" :product="scope.row" />
<RawMaterialInfo v-else-if="scope.row.itemType === 'raw_material'" :material="scope.row" /> <RawMaterialInfo v-else-if="scope.row.itemType === 'raw_material'" :material="scope.row" />

View File

@@ -1,23 +1,64 @@
<template> <template>
<div class="contract-tabs"> <div class="contract-tabs">
<div v-if="orderId" class="tabs-content"> <div v-if="orderId" class="tabs-content">
<el-tabs v-model="activeTab" type="border-card"> <!-- 自定义Tab头部 -->
<el-tab-pane label="财务状态" name="finance" v-hasPermi="['crm:order:finance']"> <div class="tab-header">
<div class="order-finance" v-if="activeTab === 'finance'"> <span
<!-- 财务状态内容 --> class="tab-item"
:class="{ active: activeTab === 'contract' }"
@click="activeTab = 'contract'"
>合同信息</span>
<span
class="tab-item"
:class="{ active: activeTab === 'finance' }"
@click="activeTab = 'finance'"
>财务状态</span>
<span
class="tab-item"
:class="{ active: activeTab === 'dispute' }"
@click="activeTab = 'dispute'"
>订单异议</span>
<span
class="tab-item"
:class="{ active: activeTab === 'product' }"
@click="activeTab = 'product'"
>生产成果</span>
<span
class="tab-item"
:class="{ active: activeTab === 'coil' }"
@click="activeTab = 'coil'"
>发货配卷</span>
<span
class="tab-item"
:class="{ active: activeTab === 'delivery' }"
@click="activeTab = 'delivery'"
>发货单据</span>
<span
class="tab-item"
:class="{ active: activeTab === 'attachment' }"
@click="activeTab = 'attachment'"
>合同附件</span>
</div>
<!-- Tab内容区域可滚动 -->
<div class="tab-body">
<!-- 合同信息 -->
<div v-show="activeTab === 'contract'">
<ContractPreview :contract="currentOrder" @updateStatus="$emit('updateStatus', $event)" />
</div>
<!-- 财务状态 -->
<div v-show="activeTab === 'finance'">
<ReceiveTable :order="currentOrder" /> <ReceiveTable :order="currentOrder" />
</div> </div>
</el-tab-pane>
<el-tab-pane label="订单异议" name="dispute" v-hasPermi="['crm:order:objection']"> <!-- 订单异议 -->
<div class="order-dispute" v-if="activeTab === 'dispute'"> <div v-show="activeTab === 'dispute'">
<!-- 订单异议内容 -->
<OrderObjection :order="currentOrder" /> <OrderObjection :order="currentOrder" />
</div> </div>
</el-tab-pane>
<el-tab-pane label="生产成果" name="product"> <!-- 生产成果 -->
<div class="order-record" v-if="activeTab === 'product'" v-loading="productCoilLoading"> <div v-show="activeTab === 'product'" v-loading="productCoilLoading">
<!-- 生产成果内容 -->
<CoilTable ref="productCoilTable" :data="productCoilList || []" :showSelection="true" <CoilTable ref="productCoilTable" :data="productCoilList || []" :showSelection="true"
:pagination="productPagination" :total-statistics="productTotalStatistics" :pagination="productPagination" :total-statistics="productTotalStatistics"
@selection-change="handleProductSelectionChange" @selection-change="handleProductSelectionChange"
@@ -30,22 +71,21 @@
</template> </template>
</CoilTable> </CoilTable>
</div> </div>
</el-tab-pane>
<el-tab-pane label="发货配卷" name="coil"> <!-- 发货配卷 -->
<div class="order-record" v-if="activeTab === 'coil'" v-loading="deliveryCoilLoading"> <div v-show="activeTab === 'coil'" v-loading="deliveryCoilLoading">
<!-- 发货配卷内容 -->
<CoilTable :data="deliveryCoilList || []" <CoilTable :data="deliveryCoilList || []"
:pagination="deliveryPagination" :total-statistics="deliveryTotalStatistics" :pagination="deliveryPagination" :total-statistics="deliveryTotalStatistics"
@page-change="handleDeliveryPageChange" /> @page-change="handleDeliveryPageChange" />
</div> </div>
</el-tab-pane>
<el-tab-pane label="发货单据" name="delivery"> <!-- 发货单据 -->
<div class="order-record" v-if="activeTab === 'delivery'"> <div v-show="activeTab === 'delivery'">
<!-- 发货单内容 -->
<DeliveryTable :data="deliveryWaybillList || []" /> <DeliveryTable :data="deliveryWaybillList || []" />
</div> </div>
</el-tab-pane>
<el-tab-pane label="合同附件" name="attachment" v-hasPermi="['crm:order:record']"> <!-- 合同附件 -->
<div v-show="activeTab === 'attachment'">
<div class="attachment-item"> <div class="attachment-item">
<h4>商务附件</h4> <h4>商务附件</h4>
<FileList :oss-ids="contractAttachment" /> <FileList :oss-ids="contractAttachment" />
@@ -62,8 +102,8 @@
<h4>其他附件</h4> <h4>其他附件</h4>
<FileList :oss-ids="form.annexFiles" /> <FileList :oss-ids="form.annexFiles" />
</div> </div>
</el-tab-pane> </div>
</el-tabs> </div>
<!-- 批量转单 - 选择目标合同弹窗 --> <!-- 批量转单 - 选择目标合同弹窗 -->
<el-dialog title="批量转单" :visible.sync="batchTransferDialogVisible" width="500px" append-to-body <el-dialog title="批量转单" :visible.sync="batchTransferDialogVisible" width="500px" append-to-body
@@ -79,7 +119,7 @@
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
<div v-else class="no-selection" style="display: flex; align-items: center; justify-content: center; height: 100%;"> <div v-else class="no-selection">
<el-empty description="请先选择合同" /> <el-empty description="请先选择合同" />
</div> </div>
</div> </div>
@@ -91,6 +131,7 @@ import ContractSelect from "@/components/KLPService/ContractSelect";
import { batchUpdateContractCoil } from "@/api/wms/coil"; import { batchUpdateContractCoil } from "@/api/wms/coil";
import FileList from "@/components/FileList"; import FileList from "@/components/FileList";
import DeliveryTable from "../../components/DeliveryTable.vue"; import DeliveryTable from "../../components/DeliveryTable.vue";
import ContractPreview from "./ContractPreview.vue";
// 导入可能需要的组件 // 导入可能需要的组件
import OrderDetail from "../../components/OrderDetail.vue"; import OrderDetail from "../../components/OrderDetail.vue";
@@ -108,6 +149,7 @@ export default {
ContractSelect, ContractSelect,
FileList, FileList,
DeliveryTable, DeliveryTable,
ContractPreview,
OrderDetail, OrderDetail,
OrderEdit, OrderEdit,
ReceiveTable, ReceiveTable,
@@ -153,7 +195,7 @@ export default {
data() { data() {
return { return {
// 活动tab // 活动tab
activeTab: "finance", activeTab: "contract",
selectedProductRows: [], selectedProductRows: [],
batchTransferDialogVisible: false, batchTransferDialogVisible: false,
batchTargetContractId: '', batchTargetContractId: '',
@@ -305,3 +347,56 @@ export default {
} }
}; };
</script> </script>
<style scoped>
.contract-tabs {
height: 100%;
display: flex;
flex-direction: column;
}
.tabs-content {
height: 100%;
display: flex;
flex-direction: column;
}
.tab-header {
flex-shrink: 0;
display: flex;
border-bottom: 2px solid #e4e7ed;
background: #fff;
}
.tab-item {
padding: 10px 20px;
cursor: pointer;
color: #606266;
font-size: 14px;
border-bottom: 2px solid transparent;
margin-bottom: -2px;
transition: color .3s, border-color .3s;
user-select: none;
}
.tab-item:hover {
color: #409eff;
}
.tab-item.active {
color: #409eff;
border-bottom-color: #409eff;
}
.tab-body {
flex: 1;
overflow-y: auto;
}
.no-selection {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
</style>

View File

@@ -11,24 +11,11 @@
<!-- 右侧内容区域 --> <!-- 右侧内容区域 -->
<div class="right-panel" v-if="form.orderId" style="flex: 1; display: flex; flex-direction: column;"> <div class="right-panel" v-if="form.orderId" style="flex: 1; display: flex; flex-direction: column;">
<!-- 右侧上方合同内容信息预览 --> <div class="tab-panel" style="flex: 1; overflow: hidden;">
<div class="preview-panel" ref="previewPanel"
style="flex: 1; overflow-y: auto; border-bottom: 1px solid #e4e7ed;">
<ContractPreview :contract="form" @updateStatus="handleStatusChange" />
</div>
<!-- 拖拽调整条 -->
<div class="resize-handle" ref="resizeHandle"
style="height: 8px; background-color: #f5f7fa; cursor: row-resize; display: flex; align-items: center; justify-content: center;"
@mousedown="startResize">
<div style="width: 40px; height: 2px; background-color: #dcdfe6;"></div>
</div>
<!-- 右侧下方Tab标签页 -->
<div class="tab-panel" ref="tabPanel" style="flex: 1; overflow-y: auto;">
<ContractTabs :orderId="form.orderId" :deliveryWaybillList="wmsDeliveryWaybills" <ContractTabs :orderId="form.orderId" :deliveryWaybillList="wmsDeliveryWaybills"
:contract-attachment="form.businessAnnex" :technical-agreement="form.techAnnex" :contract-attachment="form.businessAnnex" :technical-agreement="form.techAnnex"
:other-attachment="form.productionSchedule" :currentOrder="form" /> :other-attachment="form.productionSchedule" :currentOrder="form"
@updateStatus="handleStatusChange" />
</div> </div>
</div> </div>
<div v-else style="flex: 1; display: flex; flex-direction: column;"> <div v-else style="flex: 1; display: flex; flex-direction: column;">
@@ -234,7 +221,6 @@ import { addCustomer } from "@/api/crm/customer";
import { listDeliveryWaybill } from "@/api/wms/deliveryWaybill"; import { listDeliveryWaybill } from "@/api/wms/deliveryWaybill";
import dayjs from "dayjs"; import dayjs from "dayjs";
import ContractList from "./components/ContractList.vue"; import ContractList from "./components/ContractList.vue";
import ContractPreview from "./components/ContractPreview.vue";
import ContractTabs from "./components/ContractTabs.vue"; import ContractTabs from "./components/ContractTabs.vue";
import ContractExportDialog from "./components/ContractExportDialog.vue"; import ContractExportDialog from "./components/ContractExportDialog.vue";
import ProductContent from "./components/ProductContent.vue"; import ProductContent from "./components/ProductContent.vue";
@@ -246,7 +232,6 @@ export default {
name: "Contract", name: "Contract",
components: { components: {
ContractList, ContractList,
ContractPreview,
ContractTabs, ContractTabs,
ContractExportDialog, ContractExportDialog,
ProductContent, ProductContent,
@@ -706,34 +691,6 @@ export default {
this.customerOpen = false; this.customerOpen = false;
this.customerForm = {}; this.customerForm = {};
}, },
/** 开始拖拽调整 */
startResize(e) {
e.preventDefault();
const previewPanel = this.$refs.previewPanel;
const tabPanel = this.$refs.tabPanel;
const startY = e.clientY;
const startPreviewHeight = previewPanel.offsetHeight;
const parentHeight = previewPanel.parentElement.offsetHeight;
const handleMouseMove = (event) => {
const deltaY = event.clientY - startY;
const newPreviewHeight = startPreviewHeight + deltaY;
const newTabHeight = parentHeight - newPreviewHeight - 8; // 8是拖拽条的高度
if (newPreviewHeight > 100 && newTabHeight > 100) { // 最小高度限制
previewPanel.style.flex = `0 0 ${newPreviewHeight}px`;
tabPanel.style.flex = `0 0 ${newTabHeight}px`;
}
};
const handleMouseUp = () => {
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
};
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
}
} }
}; };
</script> </script>
@@ -756,11 +713,7 @@ export default {
overflow: hidden; overflow: hidden;
} }
.preview-panel {
overflow-y: auto;
}
.tab-panel { .tab-panel {
overflow-y: auto; overflow: hidden;
} }
</style> </style>

View File

@@ -83,7 +83,10 @@
</el-form-item> </el-form-item>
<el-form-item label="业务员" prop="saleName"> <el-form-item label="业务员" prop="saleName">
<el-input v-model="queryParams.saleName" placeholder="请输入业务员" clearable size="small" /> <el-select v-model="queryParams.saleName" placeholder="请选择业务员" clearable size="small" filterable allow-create>
<el-option v-for="item in dict.type.wip_pack_saleman" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="合同号" prop="contractNo"> <el-form-item label="合同号" prop="contractNo">
@@ -997,7 +1000,7 @@ export default {
ContractSelect, ContractSelect,
ExceptionManager, ExceptionManager,
}, },
dicts: ['product_coil_status', 'coil_material', 'coil_itemname', 'coil_manufacturer', 'coil_quality_status', 'wms_next_warehouse', 'coil_business_purpose'], dicts: ['product_coil_status', 'coil_material', 'coil_itemname', 'coil_manufacturer', 'coil_quality_status', 'wms_next_warehouse', 'coil_business_purpose', 'wip_pack_saleman'],
props: { props: {
qrcode: { qrcode: {
type: Boolean, type: Boolean,

View File

@@ -17,11 +17,11 @@
</WarehouseSelect> </WarehouseSelect>
</el-form-item> </el-form-item>
<el-form-item label="调拨单号"> <el-form-item label="调拨单号">
<el-select v-model="queryParams.transferNo" filterable remote clearable <el-select v-model="queryParams.transferId" filterable remote clearable
remote-method="remoteSearchTransferOrder" :remote-loading="transferOrderLoading" placeholder="请输入调拨单号搜索" remote-method="remoteSearchTransferOrder" :remote-loading="transferOrderLoading" placeholder="请输入调拨单号搜索"
@change="handleRegularSearch" style="width:220px"> @change="handleRegularSearch" style="width:220px">
<el-option v-for="item in transferOrderOptions" :key="item.orderId" :label="item.transferNo" <el-option v-for="item in transferOrderOptions" :key="item.orderId" :label="item.transferNo"
:value="item.transferNo" /> :value="item.orderId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="生效状态"> <el-form-item label="生效状态">
@@ -32,7 +32,7 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" plain @click="handleRegularSearch">查询</el-button> <el-button type="primary" icon="el-icon-search" plain @click="handleRegularSearch">查询</el-button>
<el-button type="success" icon="el-icon-check" plain @click="handleConfirmBatch">批量执行</el-button> <el-button type="success" icon="el-icon-check" plain :loading="batchConfirmLoading" @click="handleConfirmBatch">批量执行</el-button>
<el-button @click="handleReset">清空</el-button> <el-button @click="handleReset">清空</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -46,7 +46,7 @@
<!-- 调拨表格, 显示调拨记录, 常规筛选作用下生效 --> <!-- 调拨表格, 显示调拨记录, 常规筛选作用下生效 -->
<TransferItemTable :data="transferList" :canEdit="false" :canConfirm="true" v-loading="loading" <TransferItemTable :data="transferList" :canEdit="false" :canConfirm="true" v-loading="loading"
ref="transferItemTable" :refreshLabel="refreshLabel" :transferRemark="transferRemark" ref="transferItemTable" :refreshLabel="refreshLabel" :transferRemark="transferRemark"
@refreshData="handleRegularSearch"></TransferItemTable> @refreshData="handleBatchConfirmDone"></TransferItemTable>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="handleRegularSearch" /> @pagination="handleRegularSearch" />
@@ -103,7 +103,7 @@ export default {
currentCoilNo: '', currentCoilNo: '',
warehouseIdBefore: '', warehouseIdBefore: '',
warehouseIdAfter: '', warehouseIdAfter: '',
transferNo: '', transferId: '',
isTransferred: '0', isTransferred: '0',
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,
@@ -114,6 +114,7 @@ export default {
transferOrderOptions: [], transferOrderOptions: [],
transferOrderLoading: false, transferOrderLoading: false,
loading: false, loading: false,
batchConfirmLoading: false,
total: 0, total: 0,
dialogVisible: false, dialogVisible: false,
}; };
@@ -171,7 +172,7 @@ export default {
currentCoilNo: '', currentCoilNo: '',
warehouseIdBefore: '', warehouseIdBefore: '',
warehouseIdAfter: '', warehouseIdAfter: '',
transferNo: '', transferId: '',
isTransferred: '0', isTransferred: '0',
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,
@@ -192,7 +193,18 @@ export default {
} }
}, },
handleConfirmBatch() { handleConfirmBatch() {
this.$confirm('确定要批量执行调拨吗?', '确认操作', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.batchConfirmLoading = true;
this.$refs.transferItemTable.handleBatchConfirm(); this.$refs.transferItemTable.handleBatchConfirm();
}).catch(() => {});
},
handleBatchConfirmDone() {
this.batchConfirmLoading = false;
this.handleRegularSearch();
}, },
}, },
mounted() { mounted() {

View File

@@ -30,11 +30,11 @@
</WarehouseSelect> </WarehouseSelect>
</el-form-item> </el-form-item>
<el-form-item label="调拨单号"> <el-form-item label="调拨单号">
<el-select v-model="queryParams.transferNo" filterable remote clearable <el-select v-model="queryParams.transferId" filterable remote clearable
remote-method="remoteSearchTransferOrder" :remote-loading="transferOrderLoading" remote-method="remoteSearchTransferOrder" :remote-loading="transferOrderLoading"
placeholder="请输入调拨单号搜索" @change="handleRegularSearch" style="width:220px"> placeholder="请输入调拨单号搜索" @change="handleRegularSearch" style="width:220px">
<el-option v-for="item in transferOrderOptions" :key="item.orderId" <el-option v-for="item in transferOrderOptions" :key="item.orderId"
:label="item.transferNo" :value="item.transferNo" /> :label="item.transferNo" :value="item.orderId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="生效状态"> <el-form-item label="生效状态">
@@ -105,7 +105,7 @@ export default {
currentCoilNo: '', currentCoilNo: '',
warehouseIdBefore: '', warehouseIdBefore: '',
warehouseIdAfter: '', warehouseIdAfter: '',
transferNo: '', transferId: '',
isTransferred: '', isTransferred: '',
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,
@@ -173,7 +173,7 @@ export default {
currentCoilNo: '', currentCoilNo: '',
warehouseIdBefore: '', warehouseIdBefore: '',
warehouseIdAfter: '', warehouseIdAfter: '',
transferNo: '', transferId: '',
isTransferred: '', isTransferred: '',
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,