Files
klp-oa/klp-ui/src/views/crm/order/index.vue
砂糖 54bea01416 refactor(contract): 统一合同编号字段名从contractNo改为contractCode
修改多个组件中合同编号字段名以保持一致性,移除未使用的props和清理冗余代码
2026-04-14 10:03:16 +08:00

401 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :span="5" style="border-right: 1px solid #e4e7ed;">
<div style="font-weight: 900;">订单列表</div>
<div style="display: flex; align-items: center; gap: 5px; margin-top: 10px;">
<!-- 主搜索和添加 -->
<el-input style="flex: 1;" prefix-icon="el-icon-search" placeholder="输入关键字搜索"
v-model="queryParams.keyword" @change="getList" clearable></el-input>
<el-button icon="el-icon-sort" @click="toggleQuery"></el-button>
<el-button type="primary" icon="el-icon-search" style="margin-left: 0;" size="mini" @click="getList"></el-button>
<el-button type="primary" icon="el-icon-plus" style="margin-left: 0;" @click="handleAdd"
v-hasPermi="['crm:order:add']"></el-button>
</div>
<div v-show="showQuery"
style="display: flex; align-items: center; gap: 5px; margin-top: 10px; flex-wrap: wrap;">
<!-- 查询区通过上方的查询按钮控制显示隐藏 -->
<!-- 客户行业和客户等级的下拉选 -->
<el-input style="width: 180px;" placeholder="订单编号"
v-model="queryParams.orderCode" @change="getList" clearable></el-input>
<el-select style="width: 100px;" v-model="queryParams.salesman" placeholder="销售员" clearable @change="getList">
<el-option v-for="item in dict.type.wip_pack_saleman" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
<el-select style="width: 100px;" v-model="queryParams.orderStatus" placeholder="订单状态" clearable @change="getList">
<el-option v-for="(value, key) in ORDER_STATUS" :key="value" :label="key" :value="value" />
</el-select>
</div>
<div>
<!-- 列表区域 -->
<KLPList :listData="orderList" listKey="orderId" :loading="orderLoading" field1="orderCode" field2="salesman"
field4="companyName" field5="contactPerson" @item-click="handleOrderClick">
<template slot="actions" slot-scope="{ item }">
<el-button type="danger" size="mini" @click="handleDelete(item)" icon="el-icon-delete"
v-hasPermi="['crm:order:add']"></el-button>
</template>
</KLPList>
</div>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
</el-col>
<el-col :span="19">
<el-empty description="选择订单查看更多信息" v-if="!form.orderId"></el-empty>
<el-tabs v-model="activeTab" type="border-card" v-else>
<el-tab-pane label="订单详情" name="detail">
<div class="order-detail" v-if="activeTab === 'detail'">
<!-- 订单详情内容 -->
<el-descriptions :column="2" :border="true" title="订单基本信息" style="margin-bottom: 20px;">
<el-descriptions-item label="订单编号">{{ form.orderCode }}</el-descriptions-item>
<el-descriptions-item label="销售员">{{ form.salesman }}</el-descriptions-item>
<el-descriptions-item label="交货日期">{{ form.deliveryDate }}</el-descriptions-item>
<el-descriptions-item label="合同号">{{ form.contractCode }}</el-descriptions-item>
<el-descriptions-item label="客户公司">{{ form.companyName }}</el-descriptions-item>
<el-descriptions-item label="联系人">{{ form.contactPerson }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ form.contactWay }}</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{ form.remark }}</el-descriptions-item>
<el-descriptions-item label="附件" :span="2">
<file-list :ossIds="form.annexFiles" />
</el-descriptions-item>
</el-descriptions>
<el-descriptions :border="true" title="订单明细" />
<OrderDetail :orderId="currentOrder.orderId" :editable="false" />
</div>
</el-tab-pane>
<el-tab-pane label="订单编辑" name="edit" v-hasPermi="['crm:order:edit']">
<div class="order-detail" v-if="activeTab === 'edit'">
<OrderEdit :initValue="currentOrder" :customerList="customerList" @save="handleOrderSave" />
<el-descriptions title="订单明细" />
<OrderDetail :orderId="currentOrder.orderId" />
</div>
</el-tab-pane>
<el-tab-pane label="财务状态" name="finance" v-hasPermi="['crm:order:finance']">
<div class="order-finance" v-if="activeTab === 'finance'">
<!-- 财务状态内容 -->
<ReceiveTable :order="currentOrder" />
</div>
</el-tab-pane>
<el-tab-pane label="订单异议" name="dispute" v-hasPermi="['crm:order:objection']">
<div class="order-dispute" v-if="activeTab === 'dispute'">
<!-- 订单异议内容 -->
<OrderObjection :order="currentOrder" />
</div>
</el-tab-pane>
<el-tab-pane label="发货配卷" name="coil">
<div class="order-record" v-if="activeTab === 'coil'">
<!-- 发货配卷内容 -->
<CoilTable :data="coilList" />
</div>
</el-tab-pane>
<el-tab-pane label="发货单据" name="delivery">
<div class="order-record" v-if="activeTab === 'delivery'">
<!-- 发货单内容 -->
<DeliveryTable :data="deliveryWaybillList" />
</div>
</el-tab-pane>
<el-tab-pane label="操作记录" name="record" v-hasPermi="['crm:order:record']">
<div class="order-record" v-if="activeTab === 'record'">
<!-- 操作记录内容 -->
<OrderRecord :orderId="currentOrder.orderId" />
</div>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
<!-- 添加或修改正式订单主对话框 -->
<el-dialog title="添加订单" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="订单编号" prop="orderCode">
<el-input v-model="form.orderCode" placeholder="请输入订单编号" />
</el-form-item>
<el-form-item label="合同号" prop="contractId">
<el-select style="width: 100%;" v-model="form.contractId" placeholder="请选择合同号" filterable clearable @change="handleContractChange">
<el-option v-for="item in contractList" :key="item.contractId" :label="item.contractCode"
:value="item.contractId" />
</el-select>
</el-form-item>
<el-form-item label="客户" prop="customerId">
<!-- <el-input v-model="form.customerId" placeholder="请输入客户" /> -->
<el-select style="width: 100%;" v-model="form.customerId" placeholder="请选择客户">
<el-option v-for="item in customerList" :key="item.customerId" :label="item.companyName"
:value="item.customerId" />
</el-select>
</el-form-item>
<el-form-item label="销售员" prop="salesman">
<el-select style="width: 100%;" v-model="form.salesman" placeholder="请选择销售员">
<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 label="订单总金额" prop="orderAmount">
<el-input v-model="form.orderAmount" placeholder="请输入订单总金额" />
</el-form-item>
<el-form-item label="交货日期" prop="deliveryDate">
<el-date-picker clearable v-model="form.deliveryDate" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择交货日期">
</el-date-picker>
</el-form-item>
<el-form-item label="附件" prop="annexFiles">
<file-upload v-model="form.annexFiles" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import KLPList from '@/components/KLPUI/KLPList/index.vue'
import { listOrder, delOrder, listOrderPackaging } from "@/api/crm/order";
import { listCustomer } from "@/api/crm/customer";
import { listDeliveryWaybill } from "@/api/wms/deliveryWaybill";
import { ORDER_STATUS, ORDER_TYPE } from '../js/enum'
import { ORDER_ACTIONS, actions } from '../js/actions'
import OrderDetail from '../components/OrderDetail.vue';
import OrderEdit from '../components/OrderEdit.vue';
import OrderObjection from '../components/OrderObjection.vue';
import ReceiveTable from '../components/ReceiveTable.vue';
import OrderRecord from '../components/OrderRecord.vue';
import FileList from '@/components/FileList';
import { listContract } from "@/api/crm/contract";
import CoilTable from "../components/CoilTable.vue";
import DeliveryTable from "../components/DeliveryTable.vue";
export default {
name: 'OrderPage',
components: {
KLPList,
OrderDetail,
OrderEdit,
OrderObjection,
ReceiveTable,
OrderRecord,
FileList,
CoilTable,
DeliveryTable
},
dicts: ['customer_level', 'customer_industry', 'wip_pack_saleman'],
props: {
contractId: {
type: String,
default: ''
},
customerId: {
type: String,
default: ''
}
},
data() {
return {
ORDER_STATUS,
ORDER_TYPE,
showQuery: false,
queryParams: {
orderCode: '',
customerId: this.customerId,
salesman: '',
orderStatus: '',
contractId: this.contractId,
orderType: ORDER_TYPE['正式订单'],
financeStatus: '',
pageNum: 1,
pageSize: 10,
},
total: 0,
activeTab: 'detail',
currentOrder: {},
buttonLoading: false,
orderList: [],
orderLoading: false,
// 表单参数
form: {},
// 表单校验
rules: {
},
open: false,
customerList: [],
contractList: [],
coilList: [],
deliveryWaybillList: [],
}
},
created() {
this.getList()
this.getCustomerList()
this.getContractList()
},
methods: {
toggleQuery() {
this.showQuery = !this.showQuery
},
/** 查询客户列表 */
getCustomerList() {
listCustomer({ pageNum: 1, pageSize: 1000 }).then(response => {
this.customerList = response.rows;
});
},
/** 查询合同列表 */
getContractList() {
listContract({ pageNum: 1, pageSize: 1000 }).then(response => {
this.contractList = response.rows || [];
});
},
/** 查询发货单列表 */
getDeliveryWaybillList() {
listDeliveryWaybill({ pageNum: 1, pageSize: 1000, orderId: this.currentOrder.orderId }).then(response => {
this.deliveryWaybillList = response.rows || [];
});
},
/** 查询发货配卷列表 */
getCoilList() {
listOrderPackaging(this.currentOrder.orderId).then(response => {
this.coilList = response.data || [];
});
},
/** 合同号改变事件 */
handleContractChange(contractId) {
const contract = this.contractList.find(item => item.contractId === contractId)
if (contract) {
console.log(contract)
this.form.contractCode = contract.contractNo
this.form.deliveryDate = contract.deliveryDate
this.form.customerId = contract.customerId
}
},
/** 订单列表项点击事件 */
handleOrderClick(order) {
this.currentOrder = order;
this.form = {
...order
}
this.activeTab = 'detail';
this.getCoilList()
this.getDeliveryWaybillList()
console.log('点击订单:', order)
},
/** 查询正式订单主列表 */
getList() {
this.orderLoading = true;
listOrder(this.queryParams).then(response => {
this.orderList = response.rows || [];
this.total = response.total;
this.orderLoading = false;
}).catch(error => {
console.error('获取正式订单主列表失败:', error)
this.$message.error('获取数据失败')
this.orderList = []
this.orderLoading = false
})
},
// 表单重置
reset() {
// 如果有合同号,重置合同号
let contractCode = ''
if (this.contractId) {
contractCode = this.contractList.find(item => item.contractId === this.contractId).contractNo
}
// 重置表单数据
this.form = {
orderId: undefined,
orderCode: undefined,
orderType: ORDER_TYPE['正式订单'],
customerId: this.customerId,
orderAmount: undefined,
salesman: undefined,
deliveryDate: undefined,
contractId: this.contractId,
contractCode: contractCode,
preOrderStatus: undefined,
auditUser: undefined,
auditTime: undefined,
orderStatus: undefined,
financeStatus: undefined,
unpaidAmount: undefined,
remark: undefined,
createBy: undefined,
createTime: undefined,
updateBy: undefined,
updateTime: undefined,
delFlag: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
},
/** 删除按钮操作 */
handleDelete(order) {
this.$confirm('确认删除订单吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delOrder(order.orderId).then(response => {
this.$modal.msgSuccess("删除成功");
this.getList();
});
});
},
handleOrderSave(form) {
this.form = form;
console.log('保存订单:', form, this)
const that = this;
that.submitForm()
},
/** 提交按钮 */
async submitForm() {
if (this.form.orderId) {
actions[ORDER_ACTIONS.updateOrder].handler(this.form).then(_ => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
return;
}
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
actions[ORDER_ACTIONS.createOrder].handler(this.form).then(_ => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
}
}
</script>