feat(order): 新增订单财务管理功能

- 添加更新订单财务状态的API接口
- 创建订单财务页面,支持订单查询和筛选
- 实现订单财务状态的更新操作
- 添加订单导出功能
- 集成项目和订单详情抽屉组件
- 支持多种时间类型的筛选条件- 实现金额格式化显示过滤器
dev_1.0.0
chenhao 2025-11-17 10:26:34 +08:00
parent 87e199ab4b
commit 0e764c997b
2 changed files with 358 additions and 0 deletions

View File

@ -70,3 +70,16 @@ export function uploadContractFile(data) {
headers: { 'Content-Type': 'multipart/form-data' }
})
}
// 更新订单财务状态
export function updateFinanceStatus(id, status) {
const data = {
id,
financeStatus: status
}
return request({
url: '/project/order/finance/update',
method: 'post',
data: data
})
}

View File

@ -0,0 +1,345 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="项目编号" prop="projectCode">
<el-input
v-model="queryParams.projectCode"
placeholder="请输入项目编号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input
v-model="queryParams.projectName"
placeholder="请输入项目名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="合同编号" prop="orderCode">
<el-input
v-model="queryParams.orderCode"
placeholder="请输入合同编号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="最终客户" prop="customerName">
<el-input
v-model="queryParams.customerName"
placeholder="请输入最终客户"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>
<el-option
v-for="dict in dict.type.order_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="代表处" prop="agentName">
<el-input
v-model="queryParams.agentName"
placeholder="请输入代表处"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="汇智负责人" prop="dutyName">
<el-input
v-model="queryParams.dutyName"
placeholder="请输入汇智负责人"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="进货商" prop="partnerName">
<el-input
v-model="queryParams.partnerName"
placeholder="请输入进货商"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="完结状态" prop="financeStatus">
<el-select v-model="queryParams.financeStatus" placeholder="请选择完结状态" clearable>
<el-option label="未完结" value="0" />
<el-option label="已完结" value="1" />
</el-select>
</el-form-item>
<el-form-item label="时间选择" prop="timeType">
<el-select v-model="queryParams.timeType" @change="changeTimeType">
<el-option label="到货时间" value="0" />
<el-option label="下单时间" value="1" />
<el-option label="执行单截止时间" value="2" />
<el-option label="归档时间" value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker
v-model="dateRange"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['project:order:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="orderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="项目编号" prop="projectCode" width="120" />
<el-table-column label="项目名称" prop="projectName" width="300" :show-overflow-tooltip="true">
<template slot-scope="scope">
<a @click="handleViewProject(scope.row)" class="link-type">{{ scope.row.projectName }}</a>
</template>
</el-table-column>
<el-table-column label="合同编号" prop="orderCode" width="200" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span class="link-type" @click="handleViewOrder(scope.row)">{{ scope.row.orderCode }}</span>
</template>
</el-table-column>
<el-table-column label="最终客户" prop="customerName" width="200" :show-overflow-tooltip="true"/>
<el-table-column label="金额(¥)" prop="actualPurchaseAmount" width="120" sortable>
<template slot-scope="scope">
<span>{{ (scope.row.orderStatus == 1 || scope.row.orderStatus == 2) ? scope.row.actualPurchaseAmount : scope.row.shipmentAmount | formatAmount }}</span>
</template>
</el-table-column>
<el-table-column label="订单状态" prop="orderStatus" width="100">
<template slot-scope="scope">
<dict-tag :options="dict.type.order_status" :value="scope.row.orderStatus"/>
</template>
</el-table-column>
<el-table-column label="完结状态" prop="financeStatus" width="100">
<template slot-scope="scope">
<span>{{ scope.row.financeStatus == '1' ? '完结' : '未完结' }}</span>
</template>
</el-table-column>
<el-table-column label="代表处" prop="agentName" width="120" />
<el-table-column label="汇智负责人" prop="dutyName" width="120" />
<el-table-column label="物流状态" width="100" />
<el-table-column label="进货商" prop="partnerName" width="200" :show-overflow-tooltip="true"/>
<el-table-column label="到货时间" prop="deliveryTime" width="180" sortable/>
<el-table-column label="下单时间" prop="estimatedOrderTime" width="180" sortable/>
<el-table-column label="执行单截止时间" prop="orderEndTime" width="180" sortable/>
<el-table-column label="归档时间" prop="approveTime" width="180" sortable/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120" fixed="right">
<template slot-scope="scope">
<el-button
v-if="scope.row.financeStatus != '1'"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdateFinanceStatus(scope.row, '1')"
>完结</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 项目详情抽屉 -->
<project-detail-drawer :visible.sync="projectDrawerVisible" :project-id="currentProjectId" />
<!-- 订单详情抽屉 -->
<order-detail-drawer :visible.sync="orderDrawerVisible" :order-id="currentOrderId" title="订单详情" />
</div>
</template>
<script>
import { listOrder, updateFinanceStatus } from "@/api/project/order";
import ProjectDetailDrawer from '../info/ProjectDetailDrawer.vue';
import OrderDetailDrawer from './OrderDetailDrawer.vue';
export default {
name: "OrderFinance",
components: {
ProjectDetailDrawer,
OrderDetailDrawer
},
dicts: ['order_status'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
orderList: [],
//
dateRange: [],
// --- ---
projectDrawerVisible: false,
orderDrawerVisible: false,
currentProjectId: null,
currentOrderId: null,
//
queryParams: {
pageNum: 1,
pageSize: 10,
projectCode: null,
projectName: null,
orderCode: null,
customerName: null,
orderStatus: '2',
agentName: null,
dutyName: null,
partnerName: null,
financeStatus: '0',
timeType: '0',
deliveryTimeStart: null,
deliveryTimeEnd: null,
estimatedOrderTimeStart: null,
estimatedOrderTimeEnd: null,
orderEndTimeStart: null,
orderEndTimeEnd: null,
approveTimeStart: null,
approveTimeEnd: null,
}
};
},
created() {
this.getList();
},
methods: {
/** 查询订单管理列表 */
getList() {
this.loading = true;
this.addDateRange(this.queryParams, this.dateRange);
this.changeTimeType(); // Ensure correct date params are set
listOrder(this.queryParams).then(response => {
this.orderList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.queryParams.financeStatus = '0';
this.queryParams.timeType = '0';
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 完结按钮操作 */
handleUpdateFinanceStatus(row, status) {
this.$modal.confirm('确认要将此订单设置为"' + (status === '1' ? '完结' : '未完结') + '"状态吗?').then(function() {
return updateFinanceStatus(row.id, status);
}).then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.addDateRange(this.queryParams, this.dateRange);
this.changeTimeType();
this.download('/project/order/finance/export', {
...this.queryParams
}, `order_finance_${new Date().getTime()}.xlsx`)
},
/** 时间选择类型切换 */
changeTimeType() {
// Clear all date params first
this.queryParams.deliveryTimeStart = null;
this.queryParams.deliveryTimeEnd = null;
this.queryParams.estimatedOrderTimeStart = null;
this.queryParams.estimatedOrderTimeEnd = null;
this.queryParams.orderEndTimeStart = null;
this.queryParams.orderEndTimeEnd = null;
this.queryParams.approveTimeStart = null;
this.queryParams.approveTimeEnd = null;
if (this.dateRange && this.dateRange.length === 2) {
const [start, end] = this.dateRange;
const timeType = this.queryParams.timeType;
if (timeType == 0) {
this.queryParams.deliveryTimeStart = start;
this.queryParams.deliveryTimeEnd = end;
} else if (timeType == 1) {
this.queryParams.estimatedOrderTimeStart = start;
this.queryParams.estimatedOrderTimeEnd = end;
} else if (timeType == 2) {
this.queryParams.orderEndTimeStart = start;
this.queryParams.orderEndTimeEnd = end;
} else if (timeType == 3) {
this.queryParams.approveTimeStart = start;
this.queryParams.approveTimeEnd = end;
}
}
},
/** 查看项目详情 */
handleViewProject(row) {
this.currentProjectId = row.projectId;
this.projectDrawerVisible = true;
},
/** 查看订单详情 */
handleViewOrder(row) {
this.currentOrderId = row.id;
this.orderDrawerVisible = true;
}
},
filters: {
formatAmount(value) {
if (value === null || value === undefined) return '';
return parseFloat(value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
},
watch: {
dateRange() {
this.changeTimeType();
}
}
};
</script>